From: Kibum Kim Date: Fri, 6 Jan 2012 15:50:52 +0000 (+0900) Subject: Git init X-Git-Tag: 2.0_alpha~6 X-Git-Url: http://review.tizen.org/git/?p=framework%2Fmultimedia%2Fpulseaudio.git;a=commitdiff_plain;h=ca67d2027f3be6debcf27722d41989be216036c1 Git init --- diff --git a/ABOUT-NLS b/ABOUT-NLS new file mode 100644 index 0000000..83bc72e --- /dev/null +++ b/ABOUT-NLS @@ -0,0 +1,1068 @@ +1 Notes on the Free Translation Project +*************************************** + +Free software is going international! The Free Translation Project is +a way to get maintainers of free software, translators, and users all +together, so that free software will gradually become able to speak many +languages. A few packages already provide translations for their +messages. + + If you found this `ABOUT-NLS' file inside a distribution, you may +assume that the distributed package does use GNU `gettext' internally, +itself available at your nearest GNU archive site. But you do _not_ +need to install GNU `gettext' prior to configuring, installing or using +this package with messages translated. + + Installers will find here some useful hints. These notes also +explain how users should proceed for getting the programs to use the +available translations. They tell how people wanting to contribute and +work on translations can contact the appropriate team. + + When reporting bugs in the `intl/' directory or bugs which may be +related to internationalization, you should tell about the version of +`gettext' which is used. The information can be found in the +`intl/VERSION' file, in internationalized packages. + +1.1 Quick configuration advice +============================== + +If you want to exploit the full power of internationalization, you +should configure it using + + ./configure --with-included-gettext + +to force usage of internationalizing routines provided within this +package, despite the existence of internationalizing capabilities in the +operating system where this package is being installed. So far, only +the `gettext' implementation in the GNU C library version 2 provides as +many features (such as locale alias, message inheritance, automatic +charset conversion or plural form handling) as the implementation here. +It is also not possible to offer this additional functionality on top +of a `catgets' implementation. Future versions of GNU `gettext' will +very likely convey even more functionality. So it might be a good idea +to change to GNU `gettext' as soon as possible. + + So you need _not_ provide this option if you are using GNU libc 2 or +you have installed a recent copy of the GNU gettext package with the +included `libintl'. + +1.2 INSTALL Matters +=================== + +Some packages are "localizable" when properly installed; the programs +they contain can be made to speak your own native language. Most such +packages use GNU `gettext'. Other packages have their own ways to +internationalization, predating GNU `gettext'. + + By default, this package will be installed to allow translation of +messages. It will automatically detect whether the system already +provides the GNU `gettext' functions. If not, the included GNU +`gettext' library will be used. This library is wholly contained +within this package, usually in the `intl/' subdirectory, so prior +installation of the GNU `gettext' package is _not_ required. +Installers may use special options at configuration time for changing +the default behaviour. The commands: + + ./configure --with-included-gettext + ./configure --disable-nls + +will, respectively, bypass any pre-existing `gettext' to use the +internationalizing routines provided within this package, or else, +_totally_ disable translation of messages. + + When you already have GNU `gettext' installed on your system and run +configure without an option for your new package, `configure' will +probably detect the previously built and installed `libintl.a' file and +will decide to use this. This might not be desirable. You should use +the more recent version of the GNU `gettext' library. I.e. if the file +`intl/VERSION' shows that the library which comes with this package is +more recent, you should use + + ./configure --with-included-gettext + +to prevent auto-detection. + + The configuration process will not test for the `catgets' function +and therefore it will not be used. The reason is that even an +emulation of `gettext' on top of `catgets' could not provide all the +extensions of the GNU `gettext' library. + + Internationalized packages usually have many `po/LL.po' files, where +LL gives an ISO 639 two-letter code identifying the language. Unless +translations have been forbidden at `configure' time by using the +`--disable-nls' switch, all available translations are installed +together with the package. However, the environment variable `LINGUAS' +may be set, prior to configuration, to limit the installed set. +`LINGUAS' should then contain a space separated list of two-letter +codes, stating which languages are allowed. + +1.3 Using This Package +====================== + +As a user, if your language has been installed for this package, you +only have to set the `LANG' environment variable to the appropriate +`LL_CC' combination. If you happen to have the `LC_ALL' or some other +`LC_xxx' environment variables set, you should unset them before +setting `LANG', otherwise the setting of `LANG' will not have the +desired effect. Here `LL' is an ISO 639 two-letter language code, and +`CC' is an ISO 3166 two-letter country code. For example, let's +suppose that you speak German and live in Germany. At the shell +prompt, merely execute `setenv LANG de_DE' (in `csh'), +`export LANG; LANG=de_DE' (in `sh') or `export LANG=de_DE' (in `bash'). +This can be done from your `.login' or `.profile' file, once and for +all. + + You might think that the country code specification is redundant. +But in fact, some languages have dialects in different countries. For +example, `de_AT' is used for Austria, and `pt_BR' for Brazil. The +country code serves to distinguish the dialects. + + The locale naming convention of `LL_CC', with `LL' denoting the +language and `CC' denoting the country, is the one use on systems based +on GNU libc. On other systems, some variations of this scheme are +used, such as `LL' or `LL_CC.ENCODING'. You can get the list of +locales supported by your system for your language by running the +command `locale -a | grep '^LL''. + + Not all programs have translations for all languages. By default, an +English message is shown in place of a nonexistent translation. If you +understand other languages, you can set up a priority list of languages. +This is done through a different environment variable, called +`LANGUAGE'. GNU `gettext' gives preference to `LANGUAGE' over `LANG' +for the purpose of message handling, but you still need to have `LANG' +set to the primary language; this is required by other parts of the +system libraries. For example, some Swedish users who would rather +read translations in German than English for when Swedish is not +available, set `LANGUAGE' to `sv:de' while leaving `LANG' to `sv_SE'. + + Special advice for Norwegian users: The language code for Norwegian +bokma*l changed from `no' to `nb' recently (in 2003). During the +transition period, while some message catalogs for this language are +installed under `nb' and some older ones under `no', it's recommended +for Norwegian users to set `LANGUAGE' to `nb:no' so that both newer and +older translations are used. + + In the `LANGUAGE' environment variable, but not in the `LANG' +environment variable, `LL_CC' combinations can be abbreviated as `LL' +to denote the language's main dialect. For example, `de' is equivalent +to `de_DE' (German as spoken in Germany), and `pt' to `pt_PT' +(Portuguese as spoken in Portugal) in this context. + +1.4 Translating Teams +===================== + +For the Free Translation Project to be a success, we need interested +people who like their own language and write it well, and who are also +able to synergize with other translators speaking the same language. +Each translation team has its own mailing list. The up-to-date list of +teams can be found at the Free Translation Project's homepage, +`http://translationproject.org/', in the "Teams" area. + + If you'd like to volunteer to _work_ at translating messages, you +should become a member of the translating team for your own language. +The subscribing address is _not_ the same as the list itself, it has +`-request' appended. For example, speakers of Swedish can send a +message to `sv-request@li.org', having this message body: + + subscribe + + Keep in mind that team members are expected to participate +_actively_ in translations, or at solving translational difficulties, +rather than merely lurking around. If your team does not exist yet and +you want to start one, or if you are unsure about what to do or how to +get started, please write to `coordinator@translationproject.org' to +reach the coordinator for all translator teams. + + The English team is special. It works at improving and uniformizing +the terminology in use. Proven linguistic skills are praised more than +programming skills, here. + +1.5 Available Packages +====================== + +Languages are not equally supported in all packages. The following +matrix shows the current state of internationalization, as of November +2007. The matrix shows, in regard of each package, for which languages +PO files have been submitted to translation coordination, with a +translation percentage of at least 50%. + + Ready PO files af am ar az be bg bs ca cs cy da de el en en_GB eo + +----------------------------------------------------+ + Compendium | [] [] [] [] | + a2ps | [] [] [] [] [] | + aegis | () | + ant-phone | () | + anubis | [] | + ap-utils | | + aspell | [] [] [] [] [] | + bash | [] | + bfd | | + bibshelf | [] | + binutils | | + bison | [] [] | + bison-runtime | [] | + bluez-pin | [] [] [] [] [] | + cflow | [] | + clisp | [] [] [] | + console-tools | [] [] | + coreutils | [] [] [] [] | + cpio | | + cpplib | [] [] [] | + cryptonit | [] | + dialog | | + diffutils | [] [] [] [] [] [] | + doodle | [] | + e2fsprogs | [] [] | + enscript | [] [] [] [] | + fetchmail | [] [] () [] [] | + findutils | [] | + findutils_stable | [] [] [] | + flex | [] [] [] | + fslint | | + gas | | + gawk | [] [] [] | + gcal | [] | + gcc | [] | + gettext-examples | [] [] [] [] [] | + gettext-runtime | [] [] [] [] [] | + gettext-tools | [] [] | + gip | [] | + gliv | [] [] | + glunarclock | [] | + gmult | [] [] | + gnubiff | () | + gnucash | [] [] () () [] | + gnuedu | | + gnulib | [] | + gnunet | | + gnunet-gtk | | + gnutls | [] | + gpe-aerial | [] [] | + gpe-beam | [] [] | + gpe-calendar | | + gpe-clock | [] [] | + gpe-conf | [] [] | + gpe-contacts | | + gpe-edit | [] | + gpe-filemanager | | + gpe-go | [] | + gpe-login | [] [] | + gpe-ownerinfo | [] [] | + gpe-package | | + gpe-sketchbook | [] [] | + gpe-su | [] [] | + gpe-taskmanager | [] [] | + gpe-timesheet | [] | + gpe-today | [] [] | + gpe-todo | | + gphoto2 | [] [] [] [] | + gprof | [] [] | + gpsdrive | | + gramadoir | [] [] | + grep | [] [] | + gretl | () | + gsasl | | + gss | | + gst-plugins-bad | [] [] | + gst-plugins-base | [] [] | + gst-plugins-good | [] [] [] | + gst-plugins-ugly | [] [] | + gstreamer | [] [] [] [] [] [] [] | + gtick | () | + gtkam | [] [] [] [] | + gtkorphan | [] [] | + gtkspell | [] [] [] [] | + gutenprint | [] | + hello | [] [] [] [] [] | + herrie | [] | + hylafax | | + idutils | [] [] | + indent | [] [] [] [] | + iso_15924 | | + iso_3166 | [] [] [] [] [] [] [] [] [] [] [] | + iso_3166_2 | | + iso_4217 | [] [] [] | + iso_639 | [] [] [] [] | + jpilot | [] | + jtag | | + jwhois | | + kbd | [] [] [] [] | + keytouch | [] [] | + keytouch-editor | [] | + keytouch-keyboa... | [] | + latrine | () | + ld | [] | + leafpad | [] [] [] [] [] | + libc | [] [] [] [] | + libexif | [] | + libextractor | [] | + libgpewidget | [] [] [] | + libgpg-error | [] | + libgphoto2 | [] [] | + libgphoto2_port | [] [] | + libgsasl | | + libiconv | [] [] | + libidn | [] [] [] | + lifelines | [] () | + lilypond | [] | + lingoteach | | + lprng | | + lynx | [] [] [] [] | + m4 | [] [] [] [] | + mailfromd | | + mailutils | [] | + make | [] [] | + man-db | [] [] [] | + minicom | [] [] [] | + nano | [] [] [] | + opcodes | [] | + parted | [] [] | + pilot-qof | | + popt | [] [] [] | + psmisc | [] | + pwdutils | | + qof | | + radius | [] | + recode | [] [] [] [] [] [] | + rpm | [] | + screem | | + scrollkeeper | [] [] [] [] [] [] [] [] | + sed | [] [] [] | + shared-mime-info | [] [] [] [] () [] [] [] | + sharutils | [] [] [] [] [] [] | + shishi | | + skencil | [] () | + solfege | | + soundtracker | [] [] | + sp | [] | + system-tools-ba... | [] [] [] [] [] [] [] [] [] | + tar | [] [] | + texinfo | [] [] [] | + tin | () () | + tuxpaint | [] [] [] [] [] [] | + unicode-han-tra... | | + unicode-transla... | | + util-linux | [] [] [] [] | + util-linux-ng | [] [] [] [] | + vorbis-tools | [] | + wastesedge | () | + wdiff | [] [] [] [] | + wget | [] [] [] | + xchat | [] [] [] [] [] [] [] | + xkeyboard-config | [] | + xpad | [] [] [] | + +----------------------------------------------------+ + af am ar az be bg bs ca cs cy da de el en en_GB eo + 6 0 2 1 8 26 2 40 48 2 56 88 15 1 15 18 + + es et eu fa fi fr ga gl gu he hi hr hu id is it + +--------------------------------------------------+ + Compendium | [] [] [] [] [] | + a2ps | [] [] [] () | + aegis | | + ant-phone | [] | + anubis | [] | + ap-utils | [] [] | + aspell | [] [] [] | + bash | [] | + bfd | [] [] | + bibshelf | [] [] [] | + binutils | [] [] [] | + bison | [] [] [] [] [] [] | + bison-runtime | [] [] [] [] [] | + bluez-pin | [] [] [] [] [] | + cflow | [] | + clisp | [] [] | + console-tools | | + coreutils | [] [] [] [] [] [] | + cpio | [] [] [] | + cpplib | [] [] | + cryptonit | [] | + dialog | [] [] [] | + diffutils | [] [] [] [] [] [] [] [] [] | + doodle | [] [] | + e2fsprogs | [] [] [] | + enscript | [] [] [] | + fetchmail | [] | + findutils | [] [] [] | + findutils_stable | [] [] [] [] | + flex | [] [] [] | + fslint | | + gas | [] [] | + gawk | [] [] [] [] () | + gcal | [] [] | + gcc | [] | + gettext-examples | [] [] [] [] [] [] [] | + gettext-runtime | [] [] [] [] [] [] | + gettext-tools | [] [] [] [] | + gip | [] [] [] [] | + gliv | () | + glunarclock | [] [] [] | + gmult | [] [] [] | + gnubiff | () () | + gnucash | () () () | + gnuedu | [] | + gnulib | [] [] [] | + gnunet | | + gnunet-gtk | | + gnutls | | + gpe-aerial | [] [] | + gpe-beam | [] [] | + gpe-calendar | | + gpe-clock | [] [] [] [] | + gpe-conf | [] | + gpe-contacts | [] [] | + gpe-edit | [] [] [] [] | + gpe-filemanager | [] | + gpe-go | [] [] [] | + gpe-login | [] [] [] | + gpe-ownerinfo | [] [] [] [] [] | + gpe-package | [] | + gpe-sketchbook | [] [] | + gpe-su | [] [] [] [] | + gpe-taskmanager | [] [] [] | + gpe-timesheet | [] [] [] [] | + gpe-today | [] [] [] [] | + gpe-todo | [] | + gphoto2 | [] [] [] [] [] | + gprof | [] [] [] [] [] | + gpsdrive | [] | + gramadoir | [] [] | + grep | [] [] [] | + gretl | [] [] [] () | + gsasl | [] [] | + gss | [] [] | + gst-plugins-bad | [] [] [] [] | + gst-plugins-base | [] [] [] [] | + gst-plugins-good | [] [] [] [] [] | + gst-plugins-ugly | [] [] [] [] | + gstreamer | [] [] [] | + gtick | [] [] [] | + gtkam | [] [] [] [] | + gtkorphan | [] [] | + gtkspell | [] [] [] [] [] [] [] | + gutenprint | [] | + hello | [] [] [] [] [] [] [] [] [] [] [] [] [] | + herrie | [] | + hylafax | | + idutils | [] [] [] [] [] | + indent | [] [] [] [] [] [] [] [] [] [] | + iso_15924 | [] | + iso_3166 | [] [] [] [] [] [] [] [] [] [] [] [] [] | + iso_3166_2 | [] | + iso_4217 | [] [] [] [] [] [] | + iso_639 | [] [] [] [] [] [] | + jpilot | [] [] | + jtag | [] | + jwhois | [] [] [] [] [] | + kbd | [] [] | + keytouch | [] [] [] | + keytouch-editor | [] | + keytouch-keyboa... | [] [] | + latrine | [] [] | + ld | [] [] [] [] | + leafpad | [] [] [] [] [] [] | + libc | [] [] [] [] [] | + libexif | [] | + libextractor | [] | + libgpewidget | [] [] [] [] [] | + libgpg-error | [] | + libgphoto2 | [] [] [] | + libgphoto2_port | [] [] | + libgsasl | [] [] | + libiconv | [] [] [] | + libidn | [] [] | + lifelines | () | + lilypond | [] [] [] | + lingoteach | [] [] [] | + lprng | | + lynx | [] [] [] | + m4 | [] [] [] [] | + mailfromd | | + mailutils | [] [] | + make | [] [] [] [] [] [] [] [] | + man-db | [] | + minicom | [] [] [] [] | + nano | [] [] [] [] [] [] [] | + opcodes | [] [] [] [] | + parted | [] [] [] | + pilot-qof | | + popt | [] [] [] [] | + psmisc | [] [] | + pwdutils | | + qof | [] | + radius | [] [] | + recode | [] [] [] [] [] [] [] [] | + rpm | [] [] | + screem | | + scrollkeeper | [] [] [] | + sed | [] [] [] [] [] | + shared-mime-info | [] [] [] [] [] [] | + sharutils | [] [] [] [] [] [] [] [] | + shishi | [] | + skencil | [] [] | + solfege | [] | + soundtracker | [] [] [] | + sp | [] | + system-tools-ba... | [] [] [] [] [] [] [] [] [] | + tar | [] [] [] [] [] | + texinfo | [] [] [] | + tin | [] () | + tuxpaint | [] [] | + unicode-han-tra... | | + unicode-transla... | [] [] | + util-linux | [] [] [] [] [] [] [] | + util-linux-ng | [] [] [] [] [] [] [] | + vorbis-tools | | + wastesedge | () | + wdiff | [] [] [] [] [] [] [] [] | + wget | [] [] [] [] [] [] [] [] | + xchat | [] [] [] [] [] [] [] | + xkeyboard-config | [] [] [] [] | + xpad | [] [] [] | + +--------------------------------------------------+ + es et eu fa fi fr ga gl gu he hi hr hu id is it + 85 22 14 2 48 101 61 12 2 8 2 6 53 29 1 52 + + ja ka ko ku ky lg lt lv mk mn ms mt nb ne nl nn + +--------------------------------------------------+ + Compendium | [] | + a2ps | () [] [] | + aegis | () | + ant-phone | [] | + anubis | [] [] [] | + ap-utils | [] | + aspell | [] [] | + bash | [] | + bfd | | + bibshelf | [] | + binutils | | + bison | [] [] [] | + bison-runtime | [] [] [] | + bluez-pin | [] [] [] | + cflow | | + clisp | [] | + console-tools | | + coreutils | [] | + cpio | [] | + cpplib | [] | + cryptonit | [] | + dialog | [] [] | + diffutils | [] [] [] | + doodle | | + e2fsprogs | [] | + enscript | [] | + fetchmail | [] [] | + findutils | [] | + findutils_stable | [] | + flex | [] [] | + fslint | | + gas | | + gawk | [] [] | + gcal | | + gcc | | + gettext-examples | [] [] [] | + gettext-runtime | [] [] [] | + gettext-tools | [] [] | + gip | [] [] | + gliv | [] | + glunarclock | [] [] | + gmult | [] [] [] | + gnubiff | | + gnucash | () () () | + gnuedu | | + gnulib | [] [] | + gnunet | | + gnunet-gtk | | + gnutls | [] | + gpe-aerial | [] | + gpe-beam | [] | + gpe-calendar | [] | + gpe-clock | [] [] [] | + gpe-conf | [] [] [] | + gpe-contacts | [] | + gpe-edit | [] [] [] | + gpe-filemanager | [] [] | + gpe-go | [] [] [] | + gpe-login | [] [] [] | + gpe-ownerinfo | [] [] | + gpe-package | [] [] | + gpe-sketchbook | [] [] | + gpe-su | [] [] [] | + gpe-taskmanager | [] [] [] [] | + gpe-timesheet | [] | + gpe-today | [] [] | + gpe-todo | [] | + gphoto2 | [] [] | + gprof | [] | + gpsdrive | [] | + gramadoir | () | + grep | [] [] | + gretl | | + gsasl | [] | + gss | | + gst-plugins-bad | [] | + gst-plugins-base | [] | + gst-plugins-good | [] | + gst-plugins-ugly | [] | + gstreamer | [] | + gtick | [] | + gtkam | [] [] | + gtkorphan | [] | + gtkspell | [] [] | + gutenprint | [] | + hello | [] [] [] [] [] [] [] | + herrie | [] | + hylafax | | + idutils | [] | + indent | [] [] | + iso_15924 | [] | + iso_3166 | [] [] [] [] [] [] [] [] | + iso_3166_2 | [] | + iso_4217 | [] [] [] | + iso_639 | [] [] [] [] | + jpilot | () () | + jtag | | + jwhois | [] | + kbd | [] | + keytouch | [] | + keytouch-editor | [] | + keytouch-keyboa... | | + latrine | [] | + ld | | + leafpad | [] [] | + libc | [] [] [] | + libexif | | + libextractor | | + libgpewidget | [] | + libgpg-error | | + libgphoto2 | [] | + libgphoto2_port | [] | + libgsasl | [] | + libiconv | [] | + libidn | [] [] | + lifelines | [] | + lilypond | [] | + lingoteach | [] | + lprng | | + lynx | [] [] | + m4 | [] [] | + mailfromd | | + mailutils | | + make | [] [] [] | + man-db | | + minicom | [] | + nano | [] [] [] | + opcodes | [] | + parted | [] [] | + pilot-qof | | + popt | [] [] [] | + psmisc | [] [] [] | + pwdutils | | + qof | | + radius | | + recode | [] | + rpm | [] [] | + screem | [] | + scrollkeeper | [] [] [] [] | + sed | [] [] | + shared-mime-info | [] [] [] [] [] [] [] | + sharutils | [] [] | + shishi | | + skencil | | + solfege | () () | + soundtracker | | + sp | () | + system-tools-ba... | [] [] [] [] | + tar | [] [] [] | + texinfo | [] [] | + tin | | + tuxpaint | () [] [] | + unicode-han-tra... | | + unicode-transla... | | + util-linux | [] [] | + util-linux-ng | [] [] | + vorbis-tools | | + wastesedge | [] | + wdiff | [] [] | + wget | [] [] | + xchat | [] [] [] [] | + xkeyboard-config | [] [] [] | + xpad | [] [] [] | + +--------------------------------------------------+ + ja ka ko ku ky lg lt lv mk mn ms mt nb ne nl nn + 51 2 25 3 2 0 6 0 2 2 20 0 11 1 103 6 + + or pa pl pt pt_BR rm ro ru rw sk sl sq sr sv ta + +--------------------------------------------------+ + Compendium | [] [] [] [] [] | + a2ps | () [] [] [] [] [] [] | + aegis | () () | + ant-phone | [] [] | + anubis | [] [] [] | + ap-utils | () | + aspell | [] [] [] | + bash | [] [] | + bfd | | + bibshelf | [] | + binutils | [] [] | + bison | [] [] [] [] [] | + bison-runtime | [] [] [] [] [] | + bluez-pin | [] [] [] [] [] [] [] [] [] | + cflow | [] | + clisp | [] | + console-tools | [] | + coreutils | [] [] [] [] | + cpio | [] [] [] | + cpplib | [] | + cryptonit | [] [] | + dialog | [] | + diffutils | [] [] [] [] [] [] | + doodle | [] [] | + e2fsprogs | [] [] | + enscript | [] [] [] [] [] | + fetchmail | [] [] [] | + findutils | [] [] [] | + findutils_stable | [] [] [] [] [] [] | + flex | [] [] [] [] [] | + fslint | [] | + gas | | + gawk | [] [] [] [] | + gcal | [] | + gcc | [] [] | + gettext-examples | [] [] [] [] [] [] [] [] | + gettext-runtime | [] [] [] [] [] [] [] [] | + gettext-tools | [] [] [] [] [] [] [] | + gip | [] [] [] [] | + gliv | [] [] [] [] [] [] | + glunarclock | [] [] [] [] [] [] | + gmult | [] [] [] [] | + gnubiff | () [] | + gnucash | () [] | + gnuedu | | + gnulib | [] [] [] | + gnunet | | + gnunet-gtk | [] | + gnutls | [] [] | + gpe-aerial | [] [] [] [] [] [] [] | + gpe-beam | [] [] [] [] [] [] [] | + gpe-calendar | [] [] [] [] | + gpe-clock | [] [] [] [] [] [] [] [] | + gpe-conf | [] [] [] [] [] [] [] | + gpe-contacts | [] [] [] [] [] | + gpe-edit | [] [] [] [] [] [] [] [] [] | + gpe-filemanager | [] [] | + gpe-go | [] [] [] [] [] [] [] [] | + gpe-login | [] [] [] [] [] [] [] [] | + gpe-ownerinfo | [] [] [] [] [] [] [] [] | + gpe-package | [] [] | + gpe-sketchbook | [] [] [] [] [] [] [] [] | + gpe-su | [] [] [] [] [] [] [] [] | + gpe-taskmanager | [] [] [] [] [] [] [] [] | + gpe-timesheet | [] [] [] [] [] [] [] [] | + gpe-today | [] [] [] [] [] [] [] [] | + gpe-todo | [] [] [] [] | + gphoto2 | [] [] [] [] [] [] | + gprof | [] [] [] | + gpsdrive | [] [] | + gramadoir | [] [] | + grep | [] [] [] [] | + gretl | [] [] [] | + gsasl | [] [] [] | + gss | [] [] [] [] | + gst-plugins-bad | [] [] [] | + gst-plugins-base | [] [] | + gst-plugins-good | [] [] | + gst-plugins-ugly | [] [] [] | + gstreamer | [] [] [] [] | + gtick | [] | + gtkam | [] [] [] [] [] | + gtkorphan | [] | + gtkspell | [] [] [] [] [] [] [] [] | + gutenprint | [] | + hello | [] [] [] [] [] [] [] [] | + herrie | [] [] [] | + hylafax | | + idutils | [] [] [] [] [] | + indent | [] [] [] [] [] [] [] | + iso_15924 | | + iso_3166 | [] [] [] [] [] [] [] [] [] [] [] [] [] | + iso_3166_2 | | + iso_4217 | [] [] [] [] [] [] [] | + iso_639 | [] [] [] [] [] [] [] | + jpilot | | + jtag | [] | + jwhois | [] [] [] [] | + kbd | [] [] [] | + keytouch | [] | + keytouch-editor | [] | + keytouch-keyboa... | [] | + latrine | | + ld | [] | + leafpad | [] [] [] [] [] [] | + libc | [] [] [] [] | + libexif | [] [] | + libextractor | [] [] | + libgpewidget | [] [] [] [] [] [] [] [] | + libgpg-error | [] [] [] | + libgphoto2 | [] | + libgphoto2_port | [] [] [] | + libgsasl | [] [] [] [] | + libiconv | [] [] [] | + libidn | [] [] () | + lifelines | [] [] | + lilypond | | + lingoteach | [] | + lprng | [] | + lynx | [] [] [] | + m4 | [] [] [] [] [] | + mailfromd | [] | + mailutils | [] [] [] | + make | [] [] [] [] | + man-db | [] [] [] [] | + minicom | [] [] [] [] [] | + nano | [] [] [] [] | + opcodes | [] [] | + parted | [] | + pilot-qof | | + popt | [] [] [] [] | + psmisc | [] [] | + pwdutils | [] [] | + qof | [] [] | + radius | [] [] | + recode | [] [] [] [] [] [] [] | + rpm | [] [] [] [] | + screem | | + scrollkeeper | [] [] [] [] [] [] [] | + sed | [] [] [] [] [] [] [] [] [] | + shared-mime-info | [] [] [] [] [] [] | + sharutils | [] [] [] [] | + shishi | [] | + skencil | [] [] [] | + solfege | [] | + soundtracker | [] [] | + sp | | + system-tools-ba... | [] [] [] [] [] [] [] [] [] | + tar | [] [] [] [] | + texinfo | [] [] [] [] | + tin | () | + tuxpaint | [] [] [] [] [] [] | + unicode-han-tra... | | + unicode-transla... | | + util-linux | [] [] [] [] | + util-linux-ng | [] [] [] [] | + vorbis-tools | [] | + wastesedge | | + wdiff | [] [] [] [] [] [] [] | + wget | [] [] [] [] | + xchat | [] [] [] [] [] [] [] | + xkeyboard-config | [] [] [] | + xpad | [] [] [] | + +--------------------------------------------------+ + or pa pl pt pt_BR rm ro ru rw sk sl sq sr sv ta + 0 5 77 31 53 4 58 72 3 45 46 9 45 122 3 + + tg th tk tr uk ven vi wa xh zh_CN zh_HK zh_TW zu + +---------------------------------------------------+ + Compendium | [] [] [] [] | 19 + a2ps | [] [] [] | 19 + aegis | [] | 1 + ant-phone | [] [] | 6 + anubis | [] [] [] | 11 + ap-utils | () [] | 4 + aspell | [] [] [] | 16 + bash | [] | 6 + bfd | | 2 + bibshelf | [] | 7 + binutils | [] [] [] [] | 9 + bison | [] [] [] [] | 20 + bison-runtime | [] [] [] [] | 18 + bluez-pin | [] [] [] [] [] [] | 28 + cflow | [] [] | 5 + clisp | | 9 + console-tools | [] [] | 5 + coreutils | [] [] [] | 18 + cpio | [] [] [] [] | 11 + cpplib | [] [] [] [] [] | 12 + cryptonit | [] | 6 + dialog | [] [] [] | 9 + diffutils | [] [] [] [] [] | 29 + doodle | [] | 6 + e2fsprogs | [] [] | 10 + enscript | [] [] [] | 16 + fetchmail | [] [] | 12 + findutils | [] [] [] | 11 + findutils_stable | [] [] [] [] | 18 + flex | [] [] | 15 + fslint | [] | 2 + gas | [] | 3 + gawk | [] [] [] | 16 + gcal | [] | 5 + gcc | [] [] [] | 7 + gettext-examples | [] [] [] [] [] [] | 29 + gettext-runtime | [] [] [] [] [] [] | 28 + gettext-tools | [] [] [] [] [] | 20 + gip | [] [] | 13 + gliv | [] [] | 11 + glunarclock | [] [] [] | 15 + gmult | [] [] [] [] | 16 + gnubiff | [] | 2 + gnucash | () [] | 5 + gnuedu | [] | 2 + gnulib | [] | 10 + gnunet | | 0 + gnunet-gtk | [] [] | 3 + gnutls | | 4 + gpe-aerial | [] [] | 14 + gpe-beam | [] [] | 14 + gpe-calendar | [] [] | 7 + gpe-clock | [] [] [] [] | 21 + gpe-conf | [] [] [] | 16 + gpe-contacts | [] [] | 10 + gpe-edit | [] [] [] [] [] | 22 + gpe-filemanager | [] [] | 7 + gpe-go | [] [] [] [] | 19 + gpe-login | [] [] [] [] [] | 21 + gpe-ownerinfo | [] [] [] [] | 21 + gpe-package | [] | 6 + gpe-sketchbook | [] [] | 16 + gpe-su | [] [] [] [] | 21 + gpe-taskmanager | [] [] [] [] | 21 + gpe-timesheet | [] [] [] [] | 18 + gpe-today | [] [] [] [] [] | 21 + gpe-todo | [] [] | 8 + gphoto2 | [] [] [] [] | 21 + gprof | [] [] | 13 + gpsdrive | [] | 5 + gramadoir | [] | 7 + grep | [] | 12 + gretl | | 6 + gsasl | [] [] [] | 9 + gss | [] | 7 + gst-plugins-bad | [] [] [] | 13 + gst-plugins-base | [] [] | 11 + gst-plugins-good | [] [] [] [] [] | 16 + gst-plugins-ugly | [] [] [] | 13 + gstreamer | [] [] [] | 18 + gtick | [] [] | 7 + gtkam | [] | 16 + gtkorphan | [] | 7 + gtkspell | [] [] [] [] [] [] | 27 + gutenprint | | 4 + hello | [] [] [] [] [] | 38 + herrie | [] [] | 8 + hylafax | | 0 + idutils | [] [] | 15 + indent | [] [] [] [] [] | 28 + iso_15924 | [] [] | 4 + iso_3166 | [] [] [] [] [] [] [] [] [] | 54 + iso_3166_2 | [] [] | 4 + iso_4217 | [] [] [] [] [] | 24 + iso_639 | [] [] [] [] [] | 26 + jpilot | [] [] [] [] | 7 + jtag | [] | 3 + jwhois | [] [] [] | 13 + kbd | [] [] [] | 13 + keytouch | [] | 8 + keytouch-editor | [] | 5 + keytouch-keyboa... | [] | 5 + latrine | [] [] | 5 + ld | [] [] [] [] | 10 + leafpad | [] [] [] [] [] | 24 + libc | [] [] [] | 19 + libexif | [] | 5 + libextractor | [] | 5 + libgpewidget | [] [] [] | 20 + libgpg-error | [] | 6 + libgphoto2 | [] [] | 9 + libgphoto2_port | [] [] [] | 11 + libgsasl | [] | 8 + libiconv | [] [] | 11 + libidn | [] [] | 11 + lifelines | | 4 + lilypond | [] | 6 + lingoteach | [] | 6 + lprng | [] | 2 + lynx | [] [] [] | 15 + m4 | [] [] [] | 18 + mailfromd | [] [] | 3 + mailutils | [] [] | 8 + make | [] [] [] | 20 + man-db | [] | 9 + minicom | [] | 14 + nano | [] [] [] | 20 + opcodes | [] [] | 10 + parted | [] [] [] | 11 + pilot-qof | [] | 1 + popt | [] [] [] [] | 18 + psmisc | [] [] | 10 + pwdutils | [] | 3 + qof | [] | 4 + radius | [] [] | 7 + recode | [] [] [] | 25 + rpm | [] [] [] [] | 13 + screem | [] | 2 + scrollkeeper | [] [] [] [] | 26 + sed | [] [] [] [] | 23 + shared-mime-info | [] [] [] | 29 + sharutils | [] [] [] | 23 + shishi | [] | 3 + skencil | [] | 7 + solfege | [] | 3 + soundtracker | [] [] | 9 + sp | [] | 3 + system-tools-ba... | [] [] [] [] [] [] [] | 38 + tar | [] [] [] | 17 + texinfo | [] [] [] | 15 + tin | | 1 + tuxpaint | [] [] [] | 19 + unicode-han-tra... | | 0 + unicode-transla... | | 2 + util-linux | [] [] [] | 20 + util-linux-ng | [] [] [] | 20 + vorbis-tools | [] [] | 4 + wastesedge | | 1 + wdiff | [] [] | 23 + wget | [] [] [] | 20 + xchat | [] [] [] [] | 29 + xkeyboard-config | [] [] [] | 14 + xpad | [] [] [] | 15 + +---------------------------------------------------+ + 76 teams tg th tk tr uk ven vi wa xh zh_CN zh_HK zh_TW zu + 163 domains 0 3 1 74 51 0 143 21 1 57 7 45 0 2036 + + Some counters in the preceding matrix are higher than the number of +visible blocks let us expect. This is because a few extra PO files are +used for implementing regional variants of languages, or language +dialects. + + For a PO file in the matrix above to be effective, the package to +which it applies should also have been internationalized and +distributed as such by its maintainer. There might be an observable +lag between the mere existence a PO file and its wide availability in a +distribution. + + If November 2007 seems to be old, you may fetch a more recent copy +of this `ABOUT-NLS' file on most GNU archive sites. The most +up-to-date matrix with full percentage details can be found at +`http://translationproject.org/extra/matrix.html'. + +1.6 Using `gettext' in new packages +=================================== + +If you are writing a freely available program and want to +internationalize it you are welcome to use GNU `gettext' in your +package. Of course you have to respect the GNU Library General Public +License which covers the use of the GNU `gettext' library. This means +in particular that even non-free programs can use `libintl' as a shared +library, whereas only free software can use `libintl' as a static +library or use modified versions of `libintl'. + + Once the sources are changed appropriately and the setup can handle +the use of `gettext' the only thing missing are the translations. The +Free Translation Project is also available for packages which are not +developed inside the GNU project. Therefore the information given above +applies also for every other Free Software Project. Contact +`coordinator@translationproject.org' to make the `.pot' files available +to the translation teams. + diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 0000000..8169429 --- /dev/null +++ b/ChangeLog @@ -0,0 +1,7324 @@ +2010-02-10 gettextize + + * m4/gettext.m4: New file, from gettext-0.17. + * m4/po.m4: New file, from gettext-0.17. + * m4/progtest.m4: New file, from gettext-0.17. + + +2009-11-23 Lennart Poettering + 06327b1: bump soname + +2009-11-20 Lennart Poettering + 7ab8e83: alsa: fix minor sampling rate deviations before adjusting the buffer size + 366e3eb: alsa: fix log output when the audio device refuses to give us again the same period settings we had before + a281aad: pulse: ask for timing updates both *before* and *after* triggering a stream state change so that in the STARTED/UNDERFLOW callbacks we accurate transport latency information + c13bf3d: pulse: delay smoother update only when unpausing, not when pausing, since we don't want the timer to advance when we are supposedly already paused + d6a851c: pulse: try to fix inaccuracy with uncork timing for streams that are created in corked state + 5c90723: daemon: complain if user passes too many arguments + +2009-11-20 Colin Guthrie + 3014081: Merge branch '0.9.20-stable' into stable-queue + +2009-11-18 Lennart Poettering + 231417c: rygel: fix itemCount property for sources + +2009-11-16 Colin Guthrie + 9f41584: build-sys: Fix missing trailing slash in 14eaf2 + +2009-11-14 Sjoerd Simons + 8edf2f0: build-sys: Make sure all alsa path config files are installed + +2009-11-11 Colin Guthrie + 25537ff: device-manager: Update docs version -> 0.9.20 + +2009-11-09 Colin Guthrie + 725ab6c: device-manager: Update docs version -> 0.9.20 + +2009-10-19 Colin Guthrie + ff71cbf: device-manager: Fix compiler warning. + +2009-10-10 Colin Guthrie + 5382455: device-manager: Rather than flagging the device as available, just include the sink/source index with PA_INVALID_INDEX meaning unavailable + +2009-10-02 Colin Guthrie + af55f07: device-manager: Play nice with module-stream-restore. + 1b31d8a: device-manager: Make use of PA_IDXSET_FOREACH when applying entries. + ab3502f: device-manager: Keep track as to whether or not the user specifically renamed the device. + 654df0f: device-manager: No need to check the version after calling read_entry() + 324eb21: device-manager: Fix typo in module loading script. + +2009-10-01 Colin Guthrie + 3130403: device-manager: Add some scripts that are only run under KDE to load/initialise module-device-manager with routing turned on. + 996fc1f: device-manager: Misc fixes to co-exist with other stream management/routing modules. + 6e0dde1: device-manager: Misc fixes. + 763de9e: device-manager: Fix the writing of the database when priority doesn't change. + d5dc700: device-manager: Add extra debug messages + 8a5778d: device-manager: Change the prefer/defer options to a single 'reorder' command. + +2009-09-27 Colin Guthrie + 45a4d26: device-manager: Don't notify clients on every subscription (it happens all the time). + ff633cb: device-manager: Save icon and report current availability over protocol. + +2009-09-26 Colin Guthrie + 055ad89: device-manager: Expose the priority lists in the protocol extension. + +2009-09-21 Colin Guthrie + aa93410: device-manager: Add a function to dump the database which we do whenever we save it (and on startup) + +2009-09-20 Colin Guthrie + d9a3131: device-manager: Reroute streams when they change allowing the media.role to be updated mid-stream. + 3072f65: device-manager: Refactor the routing method to allow the routing of a single stream + 888a515: device-manager: More sensible names for internal functions + d81fa00: device-manager: Reroute the streams on startup and update our cache on enable. + df893f6: device-manager: Keep a cache of the highest priority devices for each role. + 009d087: device-manager: Fix the database write mode + 8863dbe: device-manager: Update exports + 6e67653: device-manager: Some efficiency and safety tweaks + 26f1ec7: device-manager: Allow the routing component to be turned on via a module argument as well as via protocol extn. + 8d3d0d3: device-manager: Remove unused variables + 5077fe1: device-manager: Set the most appropriate sink/source when new streams are created + 470b625: device-manager: Add routing functions that are triggered when sinks/soruces are added/removed. + 8c99667: device-manager: Add a function to get a list of the highest priority device indexes for each role. + d69eba3: device-manager: Remove unneeded logic for checking for and (un)loading module-stream-restore. We can co-exist + a0567fb: device-manager: Rough framework (slots etc.) for handling routing. + fd5a508: device-manager: debug and comments + 2b71480: device-manager: Fix the freeing of the datum on prefer/defer. + 0541028: device-manager: When a new device is encountered, initialise the priority list to an appropriate value + 5e3f1c2: device-manager: Let subscribed clients know when something changes. + 6d4afac: device-manager: Change the write function to a rename function. + +2009-09-19 Colin Guthrie + 4981268: device-manager: Provide a method for prefering/defering a device. + a9bd1ab: device-manager: Fix copy+paste code that looped over the tagstruct when not necessary + c1ece6c: device-manager: Provide a way for clients to enable/disable role-based device-priority routing. + 25f0545: device-manager: Update docs version -> 0.9.19 (predicted) + +2009-07-05 Colin Guthrie + bddebbf: device-manager: Fix copy+paste leftover + +2009-06-29 Colin Guthrie + 58bc037: device-manager: Only store and save details for non-monitor sources + +2009-06-28 Colin Guthrie + 276e953: device-restore: Fix the application of an entry to allow changing the name of devices. + b8b28ef: device-manager: Fix tagstruct description extraction (copy+paste blunder) + 89c1f57: device-manager: Link native protocol library. + 11f01de: device-manager: Export device-manager extension functions + +2009-06-27 Colin Guthrie + 97eb065: device-manager: Fix indentation + 0f6ace7: device-manager: Add an untested protocol extension. + 4c68fe7: device-manager: Add a new module to keep track of the names and descriptions of various sinks. + +2009-11-11 Lennart Poettering + a79585e: i18n: fix LINGUAS + 5471643: Merge remote branch 'origin/master-tx' into 0.9.19-stable + de2654c: daemon: add missing tty_fd definition + bff94c1: build-sys: bump soname + 2c12df9: core: make cpuid code compile cleanly with 32bit PIC + ed5af77: core: adjust volume only when there is actually a memory block + +2009-11-10 Wim Taymans + 9ad5671: protocol: use the right sample rate for sources + +2009-11-05 Lennart Poettering + 409a9d0: jack: never try to autoconnect to MIDI ports + 75f3b19: man: fix build with --disable-manpages + 3b25302: alsa: disable timer-based scheduling inside a VM + 5da0297: daemon: during startup say whether we run in a VM + 1460374: core-util: add call to detect if we are called from within a VM + b47a9e7: alsa: introduce more standard path names + +2009-11-04 Lennart Poettering + ab573f2: alsa: cover 'Analog Output' control + +2009-10-31 Lennart Poettering + 4323c9f: alsa: create a seperate mixer path for Speaker elements + 8a26fbf: alsa: leave other headphone control enabled if possible + 08d0654: alsa: lower priority for Headphone2 path + 18018b3: alsa: cover Input Source:AUX IN + d711caa: alsa: cover Headphone2 mixer element + 82d7b75: alsa: cover 'Digital Input Source' element + 6fad765: alsa: cover Mic Jack Mode element + 70da8d6: bluetooth: do not hand out access to devices that are not fully configured yet + +2009-10-30 David Yoder + bfb1735: daemon: realpath segfault fix + +2009-10-29 Wim Taymans + 973a4eb: sink: simplify silence checks + +2009-10-30 Lennart Poettering + 320d76f: daemon: don't crash if pa_realpath() fails + +2009-10-28 Lennart Poettering + 732b468: protocol-native: if a client set volume/mute/device store it since it is user input + 3dcdab6: libpulse: explain semantics of pa_stream_connect_playback() in more detail + 0c31723: protocol-native: declare that user configured volumes are always absolute + +2009-10-12 Lennart Poettering + 84e77cb: libpulse: add missing includes + +2009-10-07 Diego Elio 'Flameeyes' Pettenò + 8d612d5: Fix build when using -fweb, accept both register and memory constraints. + +2009-10-06 Lennart Poettering + 3201aec: position-event-sounds: never position test sounds in space + 833bf30: alsa: disable period event only with tsched=1 + +2009-10-02 Tor-Björn Claesson + c15bd97: loopback: Setting latency of module-loopback + +2009-10-04 Lennart Poettering + df49370: bluetooth: don't set auto_connect flag when discovering bt devices + +2009-11-09 vpv + ecaf971: Sending translation for Finnish + 05ccf10: Sending translation for Finnish + 7d5d76e: Sending translation for Finnish + +2009-10-30 kmilos + 151c746: Sending translation for Serbian (Latin) + 4392888: Sending translation for Serbian + +2009-10-29 Wim Taymans + cc1e90f: svolume: fix MMX error + +2009-10-26 thalia + e4259e7: Sending translation for Greek + +2009-10-23 igor + 99dcbc7: Sending translation for Brazilian Portuguese + +2009-10-22 igor + 6d8d0ff: Sending translation for Brazilian Portuguese + +2009-10-22 kami911 + 037df85: Sending translation for Hungarian + 80e43f6: Sending translation for Hungarian + +2009-10-18 perplex + 45409d5: Sending translation for Italian + +2009-10-17 pmkovar + 662986f: Sending translation for Czech + +2009-10-17 kami911 + 6e8c64f: Sending translation for Hungarian + 6614be9: Sending translation for Hungarian + 497b981: Sending translation for Hungarian + +2009-10-15 kami911 + 55ccda6: Sending translation for Hungarian + +2009-10-14 reinouts + a620a39: Sending translation for Dutch + +2009-10-09 kami911 + 72ac187: Sending translation for Hungarian + +2009-10-06 mvdz + 5331e60: Sending translation for Ukrainian + +2009-10-04 fgonz + 3aec580: Sending translation for Spanish + +2009-10-02 warrink + e8bab13: Sending translation for Dutch + +2009-10-01 kami911 + 8cfd01e: Sending translation for po/hu.po + +2009-09-30 pmkovar + 7e0bccf: Sending translation for Czech + +2009-09-30 raven + fc74fc1: Sending translation for Polish + +2009-09-30 warrink + f2f37b5: Sending translation for Dutch + +2009-09-30 Lennart Poettering + afd1b6d: build-sys: bump soname + c622f77: i18n: run make update-po + +2009-09-29 Lennart Poettering + 6a3b51a: i18n: ad more .c files to POTFILES.in + b8de3bd: polkit: drop left-over polkit policy file from git tree + +2009-09-26 Nix + eac5662: Don't refuse to start on systems using GNU stow, graft, STORE et al + +2009-09-29 Lennart Poettering + faf113d: i18n: run make update-po + 0c84757: Merge remote branch 'origin/master-tx' + +2009-09-28 Lennart Poettering + d06f2ea: reserve: downgrade reserve logic messages, so that reusing pa in two sessions does not create spew in syslog + +2009-09-28 jsimon + c992ad2: Sending translation for German + 966a259: Sending translation for German + +2009-09-27 raven + 31d59de: Sending translation for Polish + +2009-09-23 Wim Taymans + 5eecd8e: svolume: tweak constraints for 32 bits + +2009-09-22 ruigo + c04b75a: Sending translation for Portuguese + +2009-09-22 Colin Guthrie + 8f4940b: libpulse: Add *_NOFLAGS flags with value 0 for various enums + +2009-09-22 shanky + 183c9ab: Sending translation for Kannada + +2009-09-21 anipeter + c4b154b: Sending translation for Malayalam + +2009-09-21 sandeeps + f078e69: Sending translation for Marathi + +2009-09-21 kkrothap + 20a5b0e: Sending translation for Telugu + +2009-09-21 rajesh + e8692bc: Sending translation for Hindi + +2009-09-20 Colin Guthrie + c194db7: tunnel: fix parsing of source info from newer servers + cc6932c: stream-restore: Comment fix + +2009-09-20 Emil Renner Berthing + 592345f: tunnel: fix parsing of sink info from newer servers + +2009-09-20 Lennart Poettering + e7686a6: core: dump proplist when creating stream similar to how we already to it for sinks/sources + 88b7773: alsa: make build gcc clean on 32bit + +2009-09-19 Lennart Poettering + 33b45cd: Merge remote branch 'origin/master-tx' + 6c0317d: build-sys: bump soname for release + ab6ed06: vala: install .vapi file by default + 3fe9f8f: vala: numerous updates + +2009-09-18 ricardopinto + e141ddc: Sending translation for Portuguese + +2009-09-19 Lennart Poettering + 996051e: memtrap: properly add items to linked list + +2009-09-18 Lennart Poettering + 56e1290: gconf: run the wrapper script when running gconf-helper from build tree + 8ad8e39: namereg: choose default sink/source as soon as one becomes available + 1d19d6b: i18n: run make update-po + 3cb8e01: Merge remote branch 'origin/master-tx' + 9697c5d: memblock: don't try to reuse PA_MEMBLOCK_APPENDED memblocks since they usually are much bigger than we want them + f84d755: mainloop: fix detection of rt clocks + cd5d6e7: socket-client: modernizations + c010172: memblock: modernizations + d629151: mainloop: pass monotonic times back to user if he passed monotonic times to us + c024aea: timeval: make timeval conversion routines handle PA_USEC_INVALID special + a1da83b: timeval: add UNLIKELY annotation + 05f6236: timeval: make pa_timeval_sub saturating + fdec460: core-rtclock: introduce pa_timespec_store() akin pa_timeval_store() + f7d3896: timeval: introduce PA_USEC_MAX + 56f217f: macro: introduce PA_INT_TYPE_MIN, PA_INT_TYPE_MAX, PA_INT_TYPE_SIGNED macros + fb4a2a1: mainloop: sum up dispatched events in an unsigned to clarify range + 18d69c5: mainloop: use PA_LLIST_FOREACH macros where applicable + b32f599: mainloop: don't initialize fields we don't have to + a049909: mainloop: calculate in pa_usec_t everywhere + a43118b: mainloop: properly convert time to wallclock time when handing it to the user + a37e48a: alsa: fix Surround mixer element name + +2009-09-18 Colin Guthrie + 8f29968: conf: Fix typo in daemon.conf: rlimit-rtttime - too many t's + fd25e8f: alsa: Give all ports a human name to allow UI tools to present the choice to users. + 0323e48: rtp: Remove 'fix me' comment after it was actually fixed in [56b6e1] + 56b6e18: rtp: Factor out direct io writing and use ioline instead. + +2009-09-18 ifelix + 62b8780: Sending translation for Tamil + +2009-09-18 ricardopinto + 774b37e: Sending translation for Portuguese + +2009-09-16 Colin Guthrie + 94d20a5: raop: Use pa_module_unload_request_by_index as per module-zeroconf-discover + +2009-09-17 Lennart Poettering + 7b76ea3: core-util: unify how we determine the temporary directory + 2d9168c: Improve TMPDIR handling + 3de5c49: cli: properly destruct cli object + b4d4f2b: cli: don't accidentaly set O_NDELAY on stderr + 94f28b9: proplist: introduce PA_PROP_WINDOW_DESKTOP property + add4cbf: position-event-sounds: don't warn that loud about vpos/hpos out of range + cdbeac6: libpulse: as a special exception, don't require a non-NULL context in pa_context_errno + 231c17b: svolume_mmx: disable test accidentaly left on + 4e6dce5: Merge remote branch 'wtay/optimize' + 1a6974a: pacat: use fully automatic buffer sizes if possible + e2899f8: memblock: make it easy to disable mempool usage with $PULSE_MEMPOOL_DISABLE + 6b8fdc4: CANCELLED vs. CANCELED + +2009-09-17 Vladimir Kokarev + e63c867: alsa: correct assumptions about channels an element lacks + +2009-09-16 kmilos + 15da2f2: Sending translation for Serbian (Latin) + 0c8498a: Sending translation for Serbian + +2009-09-12 Wim Taymans + 3d5a572: svolume_mmx: optimize some more + d397a82: svolume_sse: fix comment + +2009-09-15 vpv + 3c89dc0: Sending translation for Finnish + +2009-09-15 Lennart Poettering + 12f2111: gccmacro: enable weakrefs only on ELF + +2009-09-14 fab + 19968fe: Sending translation for Swiss German + 7c80d2c: Sending translation for German + +2009-09-14 mvdz + 4382519: Sending translation for Ukrainian + +2009-09-12 xconde + e35101b: Sending translation for Catalan + +2009-09-12 raven + 6e76544: Sending translation for Polish + +2009-09-11 warrink + 66eb022: Sending translation for Dutch + +2009-09-11 beckerde + cc597d6: Sending translation for Spanish + +2009-09-11 swkothar + 030dfad: Sending translation for Gujarati + +2009-09-11 mgiri + 9267201: Sending translation for Oriya + +2009-09-11 jassy + e706a84: Sending translation for Punjabi + +2009-09-11 Lennart Poettering + 180ef1e: position-event-sounds: apply volume factor after, not before resampling + a015d56: core: add an additional volume factor that is applied after resampling took place + 6fa2445: position-event-sounds: honour window position if set, position both vertically and horizontally + 5919337: proplist: define properties for storing window position + 42b795b: doxygen: don't confuse doxygen with spurious .. + 4e3f7d5: doxygen: add rtclock.h to documentation + 297f318: doxygen: drop references to pacat.c and paplay.c as examples since tehy are not useful as such and in the case of paplay not even existant anymore + 7e43371: build-sys: increase library version + a7ab04f: i18n: run make update-po + 2f11884: i18n: add ja to LINGUAS + 67bed86: Merge remote branch 'origin/master-tx' + 80b4457: alsa: properly report suspension error codes + bb36bb4: alsa: properly convert sample buffer sizes + 5460967: libpulse: add new error code PA_ERR_BUSY + +2009-09-10 warrink + 64e8eb7: Sending translation for Dutch + +2009-09-10 hyuuga + 8bdec63: Sending translation for po/ja.po + +2009-09-10 kkrothap + 27b3a74: Sending translation for Telugu + +2009-09-10 runab + 5d264fd: Sending translation for Bengali (India) + +2009-09-10 rajesh + c67c46e: Sending translation for Hindi + +2009-09-10 ifelix + d0df346: Sending translation for Tamil + +2009-09-10 sandeeps + a81ee39: Sending translation for Marathi + +2009-09-10 swkothar + c49f3f9: Sending translation for Gujarati + +2009-09-10 anipeter + c471d4d: Sending translation for Malayalam + +2009-09-10 jassy + 3fd8e7d: Sending translation for Punjabi + +2009-09-10 amitakhya + 7f799d4: Sending translation for Assamese + +2009-09-10 Lennart Poettering + 12c7460: libpulse: don't support pa_context_get_card_info_list() on servers that cannot handle it + 807f2a9: native: send PA_COMMAND_PLAYBACK_BUFFER_ATTR_CHANGED messages only to clients that understand it + b043207: i18n: run make update-po + a41c510: Merge remote branch 'origin/master-tx' + f3879f8: i18n: run make update-po + b2de8d8: i18n: get rid of ko.po/ru.po since they contain exactly 0 translated strings + 9c65e5b: add ml to LINGUAS + 43c3164: Merge remote branch 'origin/master-tx' + +2009-09-09 Lennart Poettering + d5f43bd: alsa: disable tsched for software devices before we configure the buffer metrics so that we don't accidently set a buffer size that is suitable for tsched where we don't use tsched + 8364b95: alsa: when probing for profiles configure buffer/period sizes since some broken drivers apparently need that + 84ade21: alsa: pass SND_PCM_NONBLOCK when opening device during unsuspend, the same way we do it for initial opening + 557c429: alsa: rework buffer/period configuration + 71e066c: simd: be more precise which SIMD optimizations we activate + 1f0904b: sample-util: add pa_convert_size() call for converting sizes between two sample specs + c2f1994: udev: ratelimit device initializations + 12df686: ratelimit: allow non-static ratelimit structs + +2009-09-09 kmilos + 4f24a62: Sending translation for Serbian (Latin) + 8a9166f: Sending translation for Serbian + +2009-09-09 soko + 4dee032: Sending translation for Serbian (Latin) + 3984dd5: Sending translation for Serbian + +2009-09-09 mgiri + 399b0ad: Sending translation for Oriya + +2009-09-09 kkrothap + 4539250: Sending translation for Telugu + +2009-09-09 pmkovar + 3a47c80: Sending translation for Czech + +2009-09-08 Lennart Poettering + 7cc100d: padsp: properly return return values (llvm-clang-analyzer) + b51f5e5: pacat: don't convert stream name twice (llvm-clang-analyzer) + 49bc6bc: stripnul: initialize 'found' bool properly (llvm-clang-analyzer) + 31d1d90: protocol-native: log explicitly when someone asks us to quit + 31ae7de: core-util: properly fill in exception array for pa_reset_sigs() (llvm-clang-analyzer) + 1516b7c: conf-parser: properly initialize variable we free() later (llvm-clang-analyzer) + 3c9a09b: cli-command: don't necessarily ovveride failure code of files (llvm-clang-analyzer) + 5fd751f: cli-command: modernizations + 05506d7: utf8: minor simplification + f3be47f: rtsp: document that rtsp_exec() needs fixing (llvm-clang-analyzer) + 157ec79: hal: check properly for failure of libhal_find_device_by_capability() (llvm-clang-analyzer) + 1380f18: blueooth: actually honour 'room' variable (llvm-clang-analyzer) + 382eced: alsa-sink: init after_avail earlier (llvm-clang-analyzer) + f504675: llvm-clang-analyzer: drop a few unnecessary assignments and other trivial fixes + +2009-09-08 shanky + 98fcf4e: Sending translation for Kannada + +2009-09-08 mvdz + 6bdda4c: Sending translation for Ukrainian + +2009-09-07 Lennart Poettering + b2606cf: i18n: move \r out of translatable string + 508c462: Merge remote branch 'wtay/optimize' + 08a4d57: libpulse: allow invocation of pa_context_play_sample_with_proplist() with NULL proplist + f8f8cdc: vala: reindent + b705a9b: vector: don't try to build vector stuff on altivec + a02861e: vala: s/PropList/Proplist/g since the C version does not use an underscore there + 0b8f239: vala: add vala .vapi file for the PulseAudio APIs, but don't include them in the tarball for now + 41a0dc1: volume: if pa_cvolume_set_{balance d000dd6: volume: when passing NULL as channel map to pa_cvolume_scale_mask() handle this the same way as pa_cvolume_scale() + 9755bfa: volume: drop some redundant but expensive validity checks + cc6c4fe: volume: add a couple of validity checks for pa_volume_t arguments + 3bbc5e6: volume: fix definition of PA_VOLUME_MAX and introduce PA_VOLUME_INVALID and use it wherever applicable + +2009-09-07 shanky + 6c385eb: Sending translation for Kannada + +2009-09-07 jassy + b96de8e: Sending translation for Punjabi + +2009-09-07 Wim Taymans + 7234994: x86: also call see init for SSE2 + b5ac383: x86: only install some functions when SSE2 + +2009-09-07 warrink + 942bd46: Sending translation for Dutch + +2009-09-07 mgiri + f969ce6: Sending translation for Oriya + +2009-09-07 sandeeps + 35ffd1b: Sending translation for Marathi + +2009-09-07 ifelix + efebe09: Sending translation for Tamil + +2009-09-06 Lennart Poettering + 5cf0c1e: introspect: rearrange order of functions a bit + e6a666d: libpulse: introduce PA_BYTES_SNPRINT_MAX and make use of it wherever applicable + +2009-09-05 xconde + 646f666: Sending translation for Catalan + +2009-09-04 vpv + 14ec32f: Sending translation for Finnish + +2009-09-04 warrink + 124e3dc: Sending translation for Dutch + +2009-09-04 runab + d5fb6d3: Sending translation for Bengali (India) + 8d03381: Sending translation for Bengali (India) + +2009-09-04 anipeter + b6030d3: Sending translation for po/ml.po + +2009-09-04 rajesh + 2ad5e33: Sending translation for Hindi + +2009-09-04 Lennart Poettering + 812be32: daemon: disable CPU load limiter by default + 5daecea: always-sink: rename null sink created to 'dummy sink' and make it translatable + 0ad6a57: null: make name of null sink translatable + +2009-09-03 beckerde + ab1af38: Sending translation for Spanish + +2009-09-03 raven + 71dd5a0: Sending translation for Polish + +2009-09-03 swkothar + ef9138d: Sending translation for Gujarati + +2009-09-03 Lennart Poettering + 8cd635b: alsa: add more input sources to path set + 7ca81bd: i18n: run make update-po + 8539539: i18n: fix LINGUAS + 1213a7c: Merge commit 'origin/master-tx' + 6f396c8: remap: build sse code only on x86 + 14a9771: core: drop unnecessary variable initialization + d088c8f: daemon: make use of SIMD optional via config variable to ease debugging + 9f4f374: remap_sse: fix inner loop increment on SSE + 51423ca: remap_sse: reindent macro so that diff to MMX is nicer + +2009-09-02 Wim Taymans + 26164ff: sconv_sse: fix leftover counter + +2009-09-02 Lennart Poettering + 51fc176: Merge branch 'master' of ssh://rootserver/home/lennart/git/public/pulseaudio + 39e4652: daemon: drop polkit code from git repo we weren't using anymore + 297afad: core-util: don't leak memory in pa_unset_env_recorded() + 767c7c7: core-util: call dbus_connection_set_exit_on_disconnect() on shared busses to make sure dbus_shutdown() isn't fatal + 470e9a8: build-sys: drop LIBOIL_{FLAGS 1200a0b: sink: simplify pa_sink_render_full() by replacing it by a pa_sink_render() plus a couple of pa_sink_render_full() + a8c0f65: daemon: clean up environment when forking off children + 5f92996: core-util: add api for setting env vars and record them so that we can undo them n fork + +2009-09-01 Lennart Poettering + 45513a2: core: fill up memblock with pa_sink_render_into_full() in pa_sink_render_full() instead of doing our own loop + 17f609a: core: handle suspended state in pa_sink_render_full() similar to the other render functions + ce6dff4: core: add missing sink_unref() + b245b54: ladspa,remap: make description of sink follow moves + 46b9ca7: alsa: by default increase watermarks only on real underruns, don't try to be smart + 6b6d146: alsa: distuingish real underruns from left_to_play=0 + dfe3f90: daemon: don't override path env vars if they are already set + +2009-09-01 sandeeps + 350b8ac: Sending translation for Marathi + +2009-09-01 ifelix + 605fa59: Sending translation for Tamil + +2009-08-29 Wim Taymans + dc221f2: remap: fix counters for mmx and sse remap + +2009-08-31 Lennart Poettering + dee2aa3: pactl: drop unnecessary newlines from pa_log() invocations + 5b61a19: pactl: implement pactl commands for changing volumes/mute stati + e20d906: cli: make sure 'dump' uses pa_cvolume_max() to deduce a single-channel volume from a multi-channel volume + 7c6a0ec: cli: apply single-channel volume changes equally to all channels + 2970c11: core: always allow volume setting with single-channel pa_cvolume + +2009-08-31 perplex + 9efc2af: Sending translation for Italian + +2009-08-30 vpv + b143a8f: Sending translation for Finnish + 8774166: Sending translation for Finnish + +2009-08-29 raven + 844399d: Sending translation for po/LINGUAS + +2009-08-29 Lennart Poettering + e1ce365: native: make sure clients cannot trigger an assert by sending us invalid volume info + 8bf2e3f: core: initialize sink/source priorities automatically based on their proplists + 18b13a8: namereg: select default sink by priority + a7b3125: protocol-native: replace use of pa_namereg_is_valid_name() by pa_namereg_is_valid_name_or_wildcard() where applicable to allow use of @@ wildcards + 85a683f: namereg: add new pa_namereg_is_valid_name_or_wildcard() call + +2009-08-28 pmkovar + 5111101: Sending translation for Czech + +2009-08-28 Lennart Poettering + 3b54849: core: add priority field to pa_sink/pa_source + ca2c0f2: sconv: quieten gcc a bit + f029041: suspend-on-idle: don't resume devices for corked streams + 84eb661: core: move 'flags' field into 'pa_sink_input_new_data' structure so that hooks can access it + 9011c4e: build-sys: make proximity helper properly suid + 63f3dc0: bluetooth: remove left-over debug line + +2009-08-28 Andy Shevchenko + 300384c: Fix checking for NULL after usage + ae38353: core-util: Fix logic of pa_make_path_absolute() + 4e8562c: raop: Fix memory leak + +2009-08-27 Lennart Poettering + db835de: Merge commit 'vudentz/master' + +2009-08-27 Luiz Augusto von Dentz + 8169a6a: Handle DisconnectRequested in bluetooth module. + +2009-08-26 Wim Taymans + beb180b: convert: add sse/sse2 s16 to float32ne conversions + 27bfb76: macro: add macro to align variables + 5907089: remap: cleanup assembler a little + +2009-08-25 Wim Taymans + 9d25467: sample-util: avoid stack overrun + 509d9f0: remap: add sse optimized mono to stereo + +2009-08-24 Wim Taymans + 26bd090: sconv: fix indentation + +2009-08-27 Lennart Poettering + 35fcb27: proplist: allow setting of zero-length data properties + 5df842d: sink-input: extend comments on rewinding logic a bit + c372b52: protocol-native: print more volume change debug messages to easy tracking down of feedback loops + cab48d4: protocol-native: compare uint64_t variable with (uint64_t) -1 instead of (size_t) -1 for compat with 32bit archs + +2009-08-26 Lennart Poettering + 44b7982: pdispatch: various modernizations + 34829eb: pdispatch: add missing commands to command table + 4e1298d: llist: add PA_LLIST_FOREACH_SAFE macro for iteration that allows deleting + 368c3e3: loopback: quieten gcc on 32bit + 4614412: loopback: update description and icons when moving loopback streams + d909f59: loopback: make sure a monitor can't be looped back to its sink + 99d3e6b: combine: store adjust time in usec + ea4b65b: loopback: add loopback module for direct connections of sinks and sources + 827ae07: macro: add PA_CLIP_SUB() for saturated subtraction + +2009-08-25 mvdz + 4544873: Sending translation for Ukrainian + +2009-08-25 giallu + 956ff24: Sending translation for Italian + +2009-08-25 ypoyarko + cdf7e02: Sending translation for po/ru.po + +2009-08-25 Finn Thain + 457b973: Solaris: debug my latest enbugging, take 2 + +2009-08-24 igor + 7a2d1d3: Sending translation for Brazilian Portuguese + +2009-08-24 Lennart Poettering + 57e1f84: Merge commit 'jprvita2/master' + 57fb771: remap: fix build for non-x86 builds + 419b071: detect: recommend module-udev-detect instead of module-hal-detect + ba17ff4: build-sys: add missing header files to tarball + +2009-07-24 João Paulo Rechi Vita + 2772521: bluetooth: add discover of bluetooth sources + +2009-07-30 João Paulo Rechi Vita + 65c3e65: bluetooth: handle bluetooth source + +2009-08-24 Lennart Poettering + be46eaa: i18n: run make update-po + 60a3502: Merge commit 'origin/master-tx' + 050a3a9: alsa: automatically decrease watermark after a time of stability + +2009-08-23 Lennart Poettering + 80c6937: alsa: increase interval between smoother updates exponentially for alsa sources, following the scheme for sinks + a0f01dd: port a few things over to use xmalloc and friends instead of low-level libc malloc/free directly + ab5ac06: Merge commit 'wtay/optimize' + +2009-08-23 beckerde + 57117d4: Sending translation for Spanish + +2009-08-22 Lennart Poettering + d6fb8d1: udev: check busy status of alsa cards before loading alsa modules and hence initiating profile probing + 560da5b: udev: process all inotify events queued up, not just the first one in the queue + 1a05d67: core: relex validity checks when destructing half-set up source outputs/sink inputs + 5b0683d: ladspa/remap: handle failing stream moves properly + 2595b9d: add usergroup-test to .gitignore + aa54298: daemon: don't free script_commands twice + +2009-08-22 raven + 857e055: Sending translation for Polish + +2009-08-21 Ted Percival + 17dc410: core: Remove wrong doc on how to free returned data + 15eb03a: core: Add thread-safe group info functions with dynamic buffers + +2009-08-21 Finn Thain + 601fb63: Solaris: fixed latency (resent) + 87d2dde: Solaris: use smoother (resent) + 44c7aa5: Solaris: build fixes (resent) + b96390f: Solaris: bootstrap portability + +2009-08-22 Lennart Poettering + 9d1cc13: i18n: run make update-po + aaf0d5a: Merge commit 'origin/master-tx' + +2009-08-21 Scott Reeves + de19bdd: daemon: fix leak of script_commands + +2009-08-21 Lennart Poettering + 066e160: udev: tell inotify to actually inform us about ACL changes + 2d01204: udev: watch for both ACL changes and processes closing devices + 4ec701a: udev: don't access string after free() + d06680a: udev: always verify access before loading modules + 14c27c7: gconf: use correct path for gconf-helper tool when running from build tree + 9abc010: object: speed up type verification by not relying on strcmp() + 5317e35: udev: when a device appears that we cannot access right-away try again later on inotify + fe9a577: alsa: leave headphone jack enabled in normal mixer paths + ac05619: combine: quieten gcc a bit + 8a2a6b2: adjust various data/library paths automatically if we are run from a build tree + a562978: ladspa: forward volume changes from ladspa sink to stream and hence via flat volume logic to master sink + 9f97b7c: sink-input: add callbacks that are called whenever the mute/volume changes + +2009-08-21 igor + c5d7860: Sending translation for Brazilian Portuguese + +2009-08-20 Wim Taymans + 6076cef: remap: make the MMX code pretier + 6e5dbed: remap: add MMX mono to stereo + e961efc: remap: init the do_remap function to NULL + 28baa53: remap: allow specialisations to install NULL + ac1f2e0: remap: move remapping code in separate file + a3f4a4f: resamples; refactor the channel remapping bits + 05fef5f: sconv: allow for setting custom functions + c1b6a87: alsa-sink: reduce the amount of smoother updates + f8ffe0d: svolume: cleanups + f09b511: whitespace fixes + +2009-08-19 Wim Taymans + 3cc1278: resampler: avoid some multiplies when we can + aeae567: svolume: add comment + 8aa86f5: arm: implement ARM cpu detection + 078bde1: x86: keep the cpu flags local + 370016c: svolume: fix compilation in 32bits + d2389ef: sample: manually inline table lookups + 548b735: resampler: fix identity check + d04a6e9: resample: fix counters + b4e9942: resample: refactor the channel remapping a little + bd49d43: svolume: add CPU guards around code + 951bf1b: svolume: add ARM optimized volume scaling + a98fa95: svolume: remove unneeded compare + +2009-08-17 Wim Taymans + 601e5f1: resampler: cache integer channel_map + +2009-08-14 Wim Taymans + 25724cd: Get rid of liboil + 591baac: volume: remove ref functions + f24c24c: volume: improved comments + a123544: volume: make the benchmark more meaningfull + dcae9a3: svolume: add some comments + +2009-08-13 Wim Taymans + e396fe6: cpu-x86: guard header with ifdef + 563cb2d: main: hook up cpu detection code + a83f552: cpu-x86: add cpu detection code and helpers + 5998cf9: svolume: improve SSE and MMX code + +2009-08-12 Wim Taymans + 7086784: volume_sse: add sse optimisations + 08f3e16: volume_mmx: fix mmx code a bit + 3a0b012: volume: add first mmx optimized function + 2d73f13: samples-util: add padding to volume array + +2009-08-11 Wim Taymans + 3d00896: sample-util: move volume code to separate file + e71e644: sample-util: move some functions around + 5b8b654: sample-utils: coding style cleanup + 26839c4: sample-utils: split out functions from case + +2009-06-30 Xabier Rodriguez Calvar + 52e5d4b: Modification of the thread-mainloop doc to ensure that nobody frees the api as it is owned by the loop. + 65f86ef: Modification of the mainloop doc to ensure that nobody frees the api as it is owned by the loop. + 30ba903: Modification of the glib-mainloop doc to ensure that nobody frees the api as it is owned by the loop. + +2009-08-20 Lennart Poettering + c5bd725: core: check return value of getgrnam_r() instead of errno + +2009-08-19 raven + d2f50ea: Sending translation for Polish + +2009-08-19 beckerde + 9b6add3: Sending translation for Spanish + +2009-08-19 Lennart Poettering + f4f16ab: i18n: run make update-po + 8f29090: i18n: add ko to LINGUAS + b2cb8ef: Merge commit 'origin/master-tx' + 7af3833: lirc: replace manual code by pa_cvolume_{inc 2f54798: mmkbd: replace manual code by pa_cvolume_{inc 8c31974: sink: volume handling rework, new flat volume logic + 5207e19: match: document how broken the module-match logic is + cfef930: volume: introduce pa_cvolume_{inc 1421eff: volume: use PA_VOLUME_MAX instead of (pa_volume_t) -1 + d6f598a: udev: allow passing of ignore_dB= parameter to alsa modules + 24e5828: source: rework volume handling + 2838b78: macro: extend comments a bit + a69b729: voltest: extend test to verify correctness of _multiply() and _divide() + 2223a9f: dbus: never return DBUS_HANDLER_RESULT_HANDLED in filter callbacks, since other callbacks might stell want to have the messages + ef01baf: volume: round properly when showing human readable volume percentages + 96f01b8: volume: simplify volume multiplifactions, do them in integer only + d634555: volume: introduce pa_cvolume_min() and pa_cvolume_min_mask() + +2009-08-17 Lennart Poettering + 8f928b2: macro: simplify page/word alignment macros a bit + fe3a21f: macro: add PA_ROUND_UP/PA_ROUND_DOWN macros + 319d187: bluetooth: fix match syntax + 90a0743: bluetooth: make NameOwnerChanged filter matches more focussed + ffeb1b8: volume: document when arguments of certain functions may overlap + caa7928: libpulse: some minor optimizations when checking equality + 50de2d8: channelmap: minor doxygen fix + 6dd580d: channelmap: document where the WAVEX channelmap is documented + 32a1ef3: channelmap: adjust RFC3551 channel maps to follow spec more closely + c579cb5: reserver: update from upstream git + 8208214: volume: add pa_cvolume_merge() call + +2009-08-17 pmkovar + 91e06c1: Sending translation for Czech + +2009-08-16 Lennart Poettering + 01e4b61: aupdate: implicitly call _write_swap() if it wasn't called explicitly + 8dd0d87: core: add to FIXMEs + 4c29ba9: modules: add various checks to avoid selecting objects that are not linked or in another unclear state + 2a39663: bluetooth: move installation of mq's earlier to avoid context asserts to be triggered + +2009-08-15 Lennart Poettering + de4968c: bluetooth: ask first for Headset and AudioSink properties, followed by Audio + fa52a91: bluetooth: recognize only those BT devices that implement both the Audio and either AudioSink or Headset interfaces + 5c90cf2: bluetooth: drop PA_BT_AUDIO_STATE_LAST since it is unused and we normally call that _MAX anyway + 011add1: thread-mq: do final q flush only when we aren't dispatching anyway + 0c20e74: asyncmsgq: introduce pa_asyncmsgq_dispatching() + e5b08a8: ladspa/remap: sync latency flags from master sink when moving between sinks + 0c08dbd: core: introduce pa_{sink +2009-07-20 Marc-André Lureau + d8a90a3: pulse: even in case of record stream, let's initialize req_bytes to 0 + 3ecb80e: bluetooth: fix typo with service_{read,write}_type + +2009-07-06 Marc-André Lureau + fd32fee: bluetooth: don't call pa_sink_render with 0 bytes request + +2009-08-12 Juho Hämäläinen + ea5cdcb: database: simple hashmap based database implementation + +2009-08-15 Maarten Bosmans + 61105df: combine: determine sample parameters of combined sink from underlying sinks + +2009-08-15 Lennart Poettering + 1eeddd8: combine: warn when the latency of a stream gets too high + e1f3f5e: combine: big rework + 8947d65: combine: drop adjust_timestamp variable because it is unused + a5b2dee: ladspa: name sink after human readable plugin name, not the id string + 7638662: module-ladspa: allow moving of sink, forward fixed latency + 1b3848e: module-remap: allow moving of sink, forward fixed latency + c44f518: ladspa: move LADSPA_Data size check to compile time + fb5205d: remap: unify argument order with other modules + d9e4605: hook-list: make use of PA_LLIST_FOREACH + d7d86e3: native-protocol: downgrade volume change log messages + 3c271ae: core: document difference between IO and main thread view on requested latency + c6080d8: core: don't update latency range if not changed + 3f9c67a: core: call pa_sink_get_latency_within_thread() instead of going directly via process_msg() + 350a2bc: core: make fixed latency dynamically changeable + 4eb59fb: core: move rtpoll to thread_info sub structure + 58d441f: log: place more rate limit invocations + fd1266c: rescure-stream: handle failed moves as well as dying sinks/sources + e4db56b: core: split of FAIL_ON_SUSPEND into KILL_ON_SUSPEND and NO_CREATE_ON_SUSPEND + e53d2fc: native: handle moving() callback with NULL destination properly + 0989be1: core: introduce pa_{sink_input +2009-08-14 Lennart Poettering + 7891f96: module-stream-restore: don't fiddle with sinks/sources/streams that are not fully set up yet + 0f2a4ed: volume: guarantee dB/linear conversion is reversible + 72d2540: protocol-native: log explicitly each time a client triggers a volume change + a1598c7: daemon: reset gids too, not just uids + fecd0dc: resampler: round up when estimating input/output sizes + 9e21182: thread-mq: never drop queued messages for the main loop + 446fb2c: asyncmsgq: add pa_asyncmsgq_flush() call + a42c597: memblockq: add pa_memblockq_get_maxrewind() API + b0cabfe: shm: bump shm size limit to 1GB + aae7054: pacmd: handle multi word commands in argv[] properly + +2009-08-13 eukim + 82b7e72: Sending translation for po/ko.po + +2009-08-13 Lennart Poettering + 5ee4069: core: add functions to query max_rewind/max_request values from streams + 9a95fe4: core: add assert macros for verifying calling context + +2009-08-12 Lennart Poettering + 17d5741: start-child: clean up child environment a bit better + 5fcb8a3: pacmd: port pacmd from select() to poll() so that we notice writer side hangups + 286ab2f: memblock: rate limit 'Pool full' message + 5921324: context: document why we only do minimal cleanups before the autospawn exec() + 27b8cd7: daemon: reset scheduling priority on startup, too + ef176ec: core-util: move personality resetting into core-util + 9f53aa5: daemon: unconditionally clean up priviliges + facae1f: conf: invert all negative boolean configuration option + 8998cba: conf: add pa_config_parse_not_bool() for parsing inverse boolean configuration options + eb40da2: daemon: install D-Bus system policy file for PA system instances + e834034: alsa: enable ext. amplifier by default + 462cdf4: alsa: adjust priority bonus of mappings that match the configured default channel map + +2009-08-11 Lennart Poettering + d27e26d: volume-restore: forward module load return value of stream-restore back to caller + c117feb: hal: replace subdevs= parameter by subdevices= parameter + c1039c9: udev: drop definition of LIBUDEV_I_KNOW_THE_API_IS_SUBJECT_TO_CHANGE + c904f97: hal: add stub module that loads module-udev-detect instead of module-hal-detect + +2009-08-10 Lennart Poettering + ebe3596: Revert "build-sys: drop libcap checks, since we don't use caps anymore" + a99e3b5: Merge commit 'origin/master-tx' + d8d2697: Merge commit 'flameeyes/master' + +2009-08-09 Maxim Levitsky + 23a294c: Correctly deal with events in the past in calc_next_timeout + +2009-08-10 logan + 0f77afe: Sending translation for Spanish + +2009-08-08 igor + de68d36: Sending translation for Brazilian Portuguese + +2009-08-08 Lennart Poettering + 9bd3398: mix-test: fix test for s24-32 samples + 9ade136: build-sys: drop libcap checks, since we don't use caps anymore + +2009-08-08 Diego Elio 'Flameeyes' Pettenò + 10e4171: Update the end-of-configuration summary for OSS output/wrapper split. + 4c15115: Split OSS support in output and wrapper. + +2009-08-07 Lennart Poettering + 7d49163: ladspa/remap: make sure we process all requested rewinds unconditionally + 51b3899: core: save volume/mute changes coming from the hardware automatically + +2009-08-05 Lennart Poettering + aa7408b: run make update-po + 42f92a8: Merge commit 'origin/master-tx' + 8483de4: simple: bump libpulse-simple library revision + ff52588: smoother: readd #ifdef protection + +2009-08-05 ruigo + 19f2ffb: Sending translation for Portuguese + 40b2dde: Sending translation for Portuguese + +2009-08-04 ruigo + 20d62e2: Sending translation for Portuguese + +2009-08-05 Lennart Poettering + 2cab6a2: simple: check for == RUNNING instead of != DONE when waiting for operations + 5bbeb51: simple: split data/length validity checks into two + 53fcf3a: simple: call pa_context_disconnect() just to be sure + a73c615: simple: always loop around pa_threaded_mainloop_wait() to handle spurious wakeups properly + b553e72: simple: use pa_xnew0 instead of manual reset to 0 + a4bc41a: simple: use PA_xxx_IS_GOOD for state checks + +2009-08-04 Luke Yelavich + 5e61111: POTFILES - Remove references to more non-existant files in the source tree + +2009-08-04 Lennart Poettering + 9b2534b: alsa: properly treat ESTRPIPE as system suspend + +2009-08-03 Lennart Poettering + 3e2ab9b: client: extend documentation on pa_operation_cancel() a bit + a44cb64: build-sys: take preset CFLAGS into account + +2009-08-02 Lubomir Rintel + 34f31f6: Recover stream when it's suspended upon rewind + +2009-08-01 Lennart Poettering + 2778220: autospawn: if creating the lock file fails, pass error code cleanly back to main process + 49fd8ee: core-util: replace remaining fixed size destination string functions by _malloc() versions + c6ea9fe: core-util: rework pa_strlcpy() to not rely on strncpy() + e5c2256: pipe: replace PIPE_BUF macro pa pa_pipe_buf call + +2009-07-31 Lennart Poettering + 0113e72: hal: add option to initialize all subdevices of an OSS device + 478f325: client: documented that pa_stream_drain() may only have a single operation active at a time + 2952f28: client: fix documentation for threaded mainloop + +2009-07-01 Alam Arias + 66db0c8: update pulse-daemon.conf.5.xml.in about realtime-scheduling + 6d0c5a1: update pulse-daemon.conf.5.xml.in about exit-idle-time + +2009-07-31 Lennart Poettering + 39aa1cf: alsa: revert to first set number of periods, then set buffer size + c14f6c1: tunnel: don't assert on misaligned reads, closes #597 and rhbz #496310 + +2009-07-30 Lennart Poettering + 4f5e2b7: threaded-mainloop: loop around pa_cond_wait() invocation in pa_threaded_mainloop_signal() + +2009-07-28 igor + 7463edd: Sending translation for Brazilian Portuguese + +2009-07-28 raven + 1cc375c: Sending translation for Polish + +2009-07-28 Lennart Poettering + f8873ab: build-sys: bump binary version + 115d853: i18n: run make-update-po + 09e57c2: Merge branch 'master' into master-tx + +2009-07-25 Lennart Poettering + 8343360: client: minor modernizations + 6ce7d20: client: if a child we created was already reaped, assume that it was successful + +2009-07-24 Lennart Poettering + 59659e1: interpol-test: allow configuration of latency + 211d0f3: client: limit block size for zero-copy operations to mempool block size + e7ca058: client: make volume struct const + 5efb072: alsa: throw timing data away after device resume + f676391: autospawn: refuse autospawning if process disabled waitpid() + 5e24b6d: memblock: try to hit an assert earlier when ref counting doesn't work + 2bbdf63: udev: explain what happened when inotify_add_watch() returned ENOSPC, rhbz #513571 + 18433c1: alsa: handle correctly if alsa returns us 0 or EAGAIN on snd_pcm_mmap_begin if we didn't call snd_pcm_avail immediately before + +2009-07-23 logan + 835a2ae: Sending translation for Spanish + +2009-07-23 Lennart Poettering + a81244a: pacat: use zero-copy write calls when playing audio file + e02e025: client: include zerocopy write calls in map file + c325b93: alsa: don't reset volume/mute when selecting path + 5a0ef5f: daemon: replace colons by dash in per-machine directory names for compat with weird filesystems + ac38c4d: build-sys: add a couple of stub Makefiles + 1160cad: alsa: control 'Speaker' element as well + efe5b65: po: run make update-po + 638f9a5: Merge branch 'master-tx' + 88d5749: Merge branch 'master' of ssh://rootserver/home/lennart/git/public/pulseaudio + 3d6278b: Merge commit 'flameeyes/osx' + +2009-07-23 raven + 097c0cb: Sending translation for Polish + +2009-07-23 Wim Taymans + 3b01d3a: protocol-native: use the right samplerate + +2009-07-22 Lennart Poettering + 41ad33d: Merge branch 'master' of ssh://rootserver/home/lennart/git/public/pulseaudio + e3b0ce5: udev: don't fail if /dev/snd is not available right-away + 2f54b5d: daemon: reset personality, to make the autospawn env cleaup complete + 7e2afff: alsa: deal properly with IO functions asking us to write 0 bytes + +2009-07-20 Lennart Poettering + 0225ef6: memtrap: clarify that we are not interested in the return value of write() + 23039af: client: allow zero-copy writing to the stream + a2b207e: daemon: before exec'ing ourselves, make sure nobody plays games with /proc/self/exe + +2009-07-18 xconde + 0aca5ad: Sending translation for Catalan + +2009-07-17 Diego Elio 'Flameeyes' Pettenò + d18eb61: Again make sure that the wait() definition is not shadowed. + 542607f: Make the rtstutter tests mostly pointless without CLOCK_REALTIME. + 8c85c99: Further simplify on Daniel's patch for bootstrap.sh. + 0a5257b: Also request Darwin extensions, as they are needed for stuff like NSIG. + a6d6718: Request explicitly POSIX.1-2001 for clock_gettime. + 673112b: Check for support of -z nodelete LD flag, don't use it unconditionally. + +2009-07-17 Daniel Mack + 191c57e: make bootstrap.sh aware of Darwin environment + +2009-07-16 Colin Guthrie + 7e4509f: Merge commit 'flameeyes/master' + +2009-07-07 Diego Elio 'Flameeyes' Pettenò + 84200b4: Remove exploitable LD_BIND_NOW hack (CVE-2009-1894). + +2009-07-12 Colin Guthrie + 61fefd6: introspect: Fix two memory issues in port handling code. + +2009-07-07 pmkovar + cea1b8c: Sending translation for Czech + +2009-07-04 Diego Elio 'Flameeyes' Pettenò + ff252cb: Check for the library containing the backtrace() function. + +2009-07-01 Lennart Poettering + 6fdd584: stream-restore: mark volume changes from instant apply as saved ones + +2009-06-29 Marc-André Lureau + 95d3faa: bluetooth: don't connect on unconnected profile + +2009-07-01 Marc-André Lureau + e93c6c3: bluetooth: warn on EAGAIN after POLLOUT + +2009-07-01 Lennart Poettering + 7dabe05: memtrap: properly lock access to memtrap changer + 28e4625: memblock: rearrange locking order + efdd3d0: reserve: update from upstream git repo + 5d4769b: alsa: fix a few comments + 5bb1883: build-sys: add missing dependency to libcli + b174a51: libpulse: minor cleanups + a10b7cd: native: don't hit assert when user uploads zero-sized sample + cd70d7f: bluetooth: don't busy loop when device is not writable but we want to write + c3958aa: bluetooth: handle absence of bluez D-Bus service properly + +2009-06-30 Lennart Poettering + 1104141: reserve: fix build without D-Bus + +2009-06-28 Colin Guthrie + 00c392d: bootstrap: Ship git-version-gen with the tarball. + 59376b0: introspect: Fix a bug in sink/source info protocol handling related to ports. + +2009-06-27 Colin Guthrie + a007d47: combine: Do not set (and update) description if the user passed one in during load. + 7ee1b47: udev: Don't install the udev rules if we're not compiling udev support + +2009-06-25 Diego Elio 'Flameeyes' Pettenò + 1ca7603: Add missing headers includes for FreeBSD. + bce211e: Rename the flock variable to f_lock. + 6f44792: Only declare saved_errno when it's going to be used (on Linux). + 9a2ac32: Rename the wait parameter to wait_op, to avoid shadowing wait(). + 2266a39: Remove the call for pa_rtpoll_install() in the Solaris module. + 24564af: Fix the moved rtclock.h header in the Solaris module. + +2009-06-24 Diego Elio 'Flameeyes' Pettenò + de40e41: Also alias MAP_ANONYMOUS to MAP_ANON in shm.c, for FreeBSD. + 2f7bce9: Add a missing sys/stat.h include for FreeBSD to declare umask(). + fc649ad: Don't try to compile the rtkit sources when dbus is not enabled. + ad4e025: Implement mix-test for s24le and s24be sample formats. + 595f80f: Use static constants to keep the generated sample blocks. + 080f630: Ignore IPv6 tests, if IPv6 was built in but the system doesn't have it. + cd375da: Use the new CC_CHECK_CFLAGS_APPEND macro instead of a manual for. + e7c3a12: Properly link module-zeroconf-publish against libnative-protocol. + a4703ce: Check for and use flags to reject undefined symbols in libraries. + e61795c: Update attributes.m4 file from xine-lib. + +2009-06-13 Diego Elio 'Flameeyes' Pettenò + e832383: Make it more clear that PulseAudio needs libtool 2.2. + +2009-06-23 Lennart Poettering + 2654eb7: sndfile: fix build on BE archs + 0b52bf4: build-sys: don't make pulseaudio binary suid on install anymore + 390c275: build-sys: properly drop '-' from major/minor/micro strings + b4b1f03: build-sys: teacch git versioning script to not kill - in version strings + 5651c03: build-sys: drop compat with old git versions so that tarballs for -test1 style evrsions are properly created + 5b78752: intended-roles: drop quite a few unnecessary includes + ef85558: modules: pass properly initialized userdata pointers to various hooks + b6d0b0e: intended-roles: properly initialize split state + d965000: rtclock: make use of constants when converting between nsec and usec + b627d68: intended-roles: fix symdef header inclusion + bcae796: build-sys: use pax tar format to allow longer file names + da6b156: builds-sys: work around automake 1.11 borkage + 38e3d83: build-sys: bump udev revision to pull in new rules files + 882cdfc: rtclock: fix type of PA_TIMEVAL_RTCLOCK + 9217b47: timeval: don't create the wrong illusion that nsecs should be stored in pa_usec_t + f3bbbd0: rtclock: document that we fallback to wallclock time if monotonic time is not supported + +2009-06-22 Lennart Poettering + f753ef2: rtclock: enable rtclock for our own mainloop implementations + 3ee2900: rtclock: fix build after merge + fc33f7e: Merge most of elmarco/rtclock2 + 048e576: build-sys: dropo shave support, depend on automake's new silent build support instead + de5219a: daemon: enable module-intended-roles by default + 374efbd: Merge branch 'master' of ssh://rootserver/home/lennart/git/public/pulseaudio + aa2570c: rescue: make sure module-rescue-streams is used only as last fallback + 60d36c7: module-stream-restore: recheck stream database on hotplug/unplug and potentially move streams + 27af460: modules: add module-intended-roles that automatically puts streams marked with a role on devices that are intended for that role + c4d90ea: restore: change 'save' flag behaviour to reflect whether an entry shall and/or is in the on-disk databases + +2009-06-20 Marc-André Lureau + e4d914c: rtclock: fix issues found by Lennart + +2009-04-05 Marc-André Lureau + 0955e3d: Base mainloop on pa_rtclock_now() + +2009-04-04 Marc-André Lureau + 125c528: pulse: move pa_rtclock_now in pulsecommon + +2009-06-19 Lennart Poettering + 32e2cd6: core: get rid of rt sig/timer handling since modern Linux' ppooll() is finally fixed for granularity + a62db27: daemon: enable real-time by default + 06ec5fd: mergo + +2009-04-04 Marc-André Lureau + 5dcdd5e: perl -p -i -e 's/pa_rtclock_usec/pa_rtclock_now/g' `find . -name '*.[ch]'` + +2009-06-19 Lennart Poettering + 9c438bc: daemon: strip all special suid/caps log from our startup code, we'll now rely on RealtimeKit for all high-priority/RT scheduling policy issues + bacc5ca: core: use rtkit to acquire high-priority scheduling + 8474fd7: core: ask RealtimeKit for RT scheduling + 6ad3855: alsa: synthesize volume values more sensibly for channels that are not controllable in hw + b1ea7c0: alsa: document alsa mixer path/profile sets a bit more + b70b5ed: alsa: add copyright blobs and comments to all mixer paths/profile sets + +2009-06-19 logan + f21457e: Sending translation for Spanish + +2009-06-19 barney + 8f81555: Sending translation for German + +2009-06-18 Lennart Poettering + 11d2a7e: alsa: move udev rules file behind the other sound related rules + 131f76a: alsa: move mixer config files to subdir in /usr/share + 0fd17c6: alsa: document default profile set a bit better + 8a5f8f4: alsa: add profile set for Native Instruments 4 DJ + 348dcd6: alsa: unify alsa log handling and snd_config_update_free_global() handling in one place + 25e5197: alsa: merge mic boost into volume slider + 8fe50b0: alsa,core: include mapping name in description strings + ca560cc: alsa: add profile set for Native Instruments Audio 8 DJ sound card + 60df970: alsa: properly count mappings of manually defined profiles + b5cea8d: alsa: fix duplicate mapping detection + 34b4888: alsa: when creating alsa sinks/sources include mapping name in device name to allow profiles mit multiple sinks or multiple sources + 8d3362c: device-restore: properly check save_muted flag when storing muted state + 39b37a2: core: be a bit more verbose when registering a sink/source fails + 4951e08: card,stream-restore: minor cleanups + 0e4ac56: device-restore: save last used port in database + 59bd793: card-restore: we don't need to save card data that came from the database + d773638: stream-restore: e don't need to save stream data that came from the database + +2009-06-18 raven + 4dccbe3: Sending translation for Polish + +2009-06-17 Lennart Poettering + 53b8703: Merge commit 'origin/master' into master-tx + a9f82f1: i18n: update i18n + f1ef2f6: Merge commit 'origin/master-tx' + 75256fb: pactl: show list of supported ports + 46b8ca2: native-protocol: allow enumerating ports + c65ebee: raop: move all raop files to subdir + 6b2ca09: pactl: implement pactl set-{sink 914ef89: libpulse: implement client side for sink/source port selection commands + 6d7cf14: native: implement command to change sink/source port + bd8e043: bluetooth: return sensible error code in set_profile() + 334325e: alsa: allow placing device id in alsa device strings at arbitrary positions + 31575f7: alsa: rework mixer logic + e9c70ac: pdispatch: fix s/recieve/receive/ typos + 1ec33f3: pstream: fix s/recieve/receive/ typos + dddb4b0: gdbm: set default block size to 1K + 279e0d6: card: get rid of description field which is unused + 4f44fe8: card: make sure to always hand failure code back in some calls + 325c01b: card: some modernizations + dda0f5a: rtp: fix s/recieve/receive/ typo + 0fa1ddf: core-util: implement pa_maybe_prefix_path() + 7fa05be: core-util: implement pa_split_spaces_strv() + c5dbf75: core-util: implement pa_xstrfreev() + 7de7b01: conf-parse: implement .include directive + 083b17b: volume,channelmap: reimplement a couple of calls based on channel masks + 77901e5: channelmap: define a couple of standard channel masks + 697b8de: malloc: implement pa_xrenew() + 4f36cc7: channelmap: make sure a mask is generated is 64 bit int + 26d5f28: version: fix prefix in PA_CHECK_VERSION macro + d993969: channelmap: implement pa_channel_position_from_string() + 64b0f38: volume: implement functions for multiplicating a cvolume with a scalar + c6830bd: hashmap: implement pa_hashmap_last() + a1d84e3: hashmap: implement api to iterate a hashmap backwards + 277e8c5: idxset: implement pa_idxset_copy() + 0b479ff: daemon: write a warning blurb to syslog when folks use --system mode + +2009-06-13 ruigo + 550b619: Sending translation for Portuguese + +2009-06-12 xconde + f0f30fb: Sending translation for Catalan + +2009-06-12 dennistobar + 88730fd: Sending translation for Spanish + +2009-06-10 Lennart Poettering + 1e8a374: alsa: fix bad memory access for devices that lack a mixer + +2009-06-08 raven + a87f8a2: Sending translation for Polish + +2009-06-08 Lennart Poettering + 89e3adf: sample: fix build on BE archs + 3c4c1f4: udev: reshuffle the properties we read from udev a bit + f13bbd5: prop: introduce new PA_PROP_DEVICE_INTENDED_ROLES property + 12d5382: i18n: update po data + 983aa5d: Merge commit 'origin/master-tx' + e7a6d53: core: replace tabs by spaces + 587fc2a: core: make sure soft mute status stays in sync with hw mute status + +2009-06-08 rajesh + cc9354f: Sending translation for po/hi.po + +2009-06-07 Lennart Poettering + ab5adce: rtstutter: increase log level by default + +2009-06-07 ruigo + 00cc168: Sending translation for Portuguese + +2009-05-14 Jyri Sarha + 8eaea3a: optimization: Optimized pa_sink_render_full. + +2009-06-07 Lennart Poettering + 8adf1d5: man: document that tsched doesn't use fragment settings + 3aefc45: man: document 24bit sample types in man page + 5be1cc5: man: document log related daemon.conf options + 78bccde: conf: remove obsolete module-idle-time directive from default config file/man page + a9b38b3: daemon: optionally call mlockall() on startup + 71ce195: udev: properly initialize userdata to 0 + +2009-06-06 Lennart Poettering + 3a118f2: build-sys: bump libsndfile dependency + bab4b94: udev: try to unsuspend devices whenever they are closed by other processes + d1646f7: core: monitor sources need to inherit the suspend cause from their sinks + 69eab1e: core: suppress suspending/resume when we are already in the right state + 496be21: hashmap: introduce PA_HASHMAP_FOREACH macro + e84644a: hal,udev: deprecate HAL support in favour of udev + 8080ab1: udev: add module-udev-detect for discovering and configuring devices + +2009-06-06 aalam + 86f3961: Sending translation for Punjabi + +2009-06-05 Lennart Poettering + e5dd9df: rtp: remove gcc warning + f398407: augment: try to deduce the media role from the menu category + 561c0af: alsa: monitor device reservation status and resume automatically when device becomes unused + 00797b8: core: add a suspend cause flags field + 3af5f8c: reserve: wrap device reservation monitor reference implementation + 1748fd2: reserve: update reserve.[ch] from upstream git + +2009-06-04 Lennart Poettering + 3e10f3f: tdb: include signal.h before tdb.h for compat reasons + 4d87475: utils: use pa_path_get_filename() where applicable + +2009-05-28 Lennart Poettering + 8bada74: Merge branch 'master' of ssh://rootserver/home/lennart/git/public/pulseaudio + c224aac: modules: introduce PA_MODULE_DEPRECATED() macro for marking modules deprecated + 1c4393a: modules: add {sink +2009-05-27 Lennart Poettering + 6044aab: Merge commit 'flameeyes/master' + 2088626: null: introduce sink_properties= argument + 6601e09: simple: set ADJUST_LATENCY by default + 19d7ced: modargs: introduce pa_modargs_get_proplist() + +2009-05-27 jassy + 8c6c8e5: Sending translation for Punjabi + +2009-05-26 Lennart Poettering + 699bd54: libpulse: introduce PA_CHECK_VERSION macro + e8f7eb6: oss: don't deadlock when we try to resume an OSS device that lacks a mixer + d2198c9: alsa: fix wording, we are speaking of card profiles, not output profiles + 5c10b84: sndfile: big rework of libsndfile interfacing code + +2009-05-26 jassy + ed105ef: Sending translation for Punjabi + +2009-05-25 Lennart Poettering + 759a9d0: core-util: introduce pa_disable_sigpipe() + ebce318: cli: allow easy repeating of commands with '/' + 8b180b6: volume: implement pa_cvolume_{scale 5f2d848: map-file: add missing channel map/cvolume position functions + 8f23a2e: proplist: add two new generic properties, media.copyright and media.software + 01fa34b: channelmap: introduce pa_channel_map_mask() and pa_channel_position_mask_t + 261a483: sample: introduce pa_proplist_setp() + 346a708: sample: introduce pa_sample_format_is_{le,be,ne,re}() + 3533599: upnp: s/org.Rygel./org.gnome.UPnP/ following the newest version of the spec + +2009-05-24 ruigo + 911f890: Sending translation for Portuguese + +2009-05-24 Lennart Poettering + f809284: channelmap: document how apple's/microsoft's channel names map to ours + +2009-05-22 Lennart Poettering + e2aba15: core-util: fall back to sysconf(_SC_OPEN_MAX) to find maximum file descriptor + ce3fbb5: tests: show dB in volume-ui.py + 000bdb8: volume: change pa_volume_t mapping to cubic + +2009-05-21 ruigo + 4b9aac2: Sending translation for Portuguese + +2009-05-20 ruigo + 0ba756b: Sending translation for po/LINGUAS + 0e23210: Sending translation for po/pt.po + +2009-05-19 Lennart Poettering + e7bca90: upnp: s/url/URL/ in GetAll() D-Bus call + +2009-05-17 Diego Elio 'Flameeyes' Pettenò + ce6643e: Use the _ONCE variation of AC_CHECKs where applicable. + +2009-05-15 Diego Elio 'Flameeyes' Pettenò + ff5b7fb: Add missing headers' include to build on FreeBSD 7.1. + 99f2541: Add missing include directory path for OSS modules. + d45c909: When MAP_ANONYMOUS is missing, fallback to MAP_ANON. + 0de6877: Don't use == for comparison in tests. Fix build with non-bash shells. + +2009-05-15 Lennart Poettering + 862a05f: upnp: update to newest spec + +2009-05-14 Lennart Poettering + 0921b1b: shm: rework alignment when punching memory + 763954c: upnp: convert all property names to CamelCase to follow D-Bus spec + 1a39acc: rescue: make we don't end up in an endless loop when we can't move a sink input + 234c61b: upnp: implement item-count/container-count properties + 0cb3837: alsa: be a bit more verbose when a hwparam call fails + b7e2223: database: port restore modules to new database API + 003e03d: macro: include string.h because we need it for memset + 6df14e0: database: add tdb backend + 46bceed: database: add gdbm backend + c69ed91: database: add abstracted database API + +2009-05-13 Lennart Poettering + 905c800: volume: introduce pa_cvolume_{get 28069ef: core: automatically add icons for headsets/headphones/speakers for devices + +2009-05-12 Lennart Poettering + dfd6b61: alsa: include mixer name in sink/source properties + 21ab720: http: fix segfault on connection termination + +2009-05-12 Marc-André Lureau + 86caf45: context: don't fail if session bus is not there + 4c3aef3: suspend-on-idle: add per-device timeout property + +2009-05-11 Lennart Poettering + a7a7358: git: activate default commit hook + 37c3620: upnp: rework property handling + 35b7ce5: upnp: use new rygel @HOSTNAME@ wildcard for server name + dc5dce5: upnp: properly issue method not found exception when we don't now it + 98a6454: upnp: update to newest spec, generate 'Updated' signal + 6c4c61d: upnp: fix URL of MediaServer spec + eb20564: mime: drop additional whitespace from mime types + +2009-05-07 Jyri Sarha + 35faedb: core: Take samples from silence cache rather than write zeros + d7b8947: core: optimize pa_sink_render_full() + +2009-05-08 Lennart Poettering + a714861: channelmap: add pa_channel_map_has_position() + 7f767e5: core: liberalize 99a6a4 a bit + 8d9c26e: core: cache requested latency only when we are running, not while we are still constructing + 99a6a47: core: make sure we fix up flags/monitor flags already in pa_sink_new() instead of pa_sink_put() + 3766850: core: introduce pa_{sink,source}_set_fixed_latency() + +2009-05-08 Jyri Sarha + 44e566a: bluetooth-device: Add safe guard against BT streaming irregularities. + +2009-05-07 Lennart Poettering + 92a6141: macro: add macros for initializing memory + +2009-05-05 troubi51 + 9dd1af6: Sending translation for French + dd1cd9e: Sending translation for French + +2009-05-03 pmkovar + 4caa33b: Sending translation for Czech + +2009-05-01 Lennart Poettering + e0f0821: sconv: fix a few minor conversion issues + 5caf09d: resampler-test: add tests for 24bit sample formats + 76caa27: resampler-test: use global PA_FLOAT32_SWAP implementation + 4bffc78: alsa: initialize buffer size before number of periods to improve compat with some backends + d2b5ae5: sample-util: fix iteration loop when adjusting volume of s24 samples + 3a7b287: sample-util: properly allocate silence block for s24-32 formats + 076830a: endian: fix LE/BE order for 24 bit accessor functions + 947bf5d: zeroconf: properly unref native protocol object + d4b10d8: sample: correctly pass s24-32 formats + 4129f51: alsa: don't hit an assert when invalid module arguments are passed + +2009-04-30 Lennart Poettering + 5a2898d: zeroconf: use pa_get_{user 3522b7d: zeroconf: copy more sink/source properties into DNS-SD TXT data + 407a810: zeroconf: computer native protocol port automatically + d696416: headers: minor cleanups + 5326f5f: rygel: get rid of forgotten debug trap + 93db3cb: rygel: instead of always handing out wildcard address find out the actual address we are listening on + 8dfdfd4: http: export information about currently active server strings + 23a798c: strlist: add new calls pa_strlist_{next 9208b86: parseaddr: add new call pa_is_ip_address() + +2009-04-29 Lennart Poettering + d5f9057: rygel: make server name configurable + c95cc9e: rygel: add module that interfaces with Rygel UPnP + 390fe02: http: split out mime type handling calls + 84a92f2: protocol-http: allow listening into sinks/sources via HTTP + c215011: ioline: add new calls pa_ioline_detach_iochannel() and pa_ioline_is_drained() + a64097a: ioline: add callback that can be called when the ioline object is fully drained + 4cb6ea2: simple-protocol: don't hit an assert when we call connection_unlink() early + 0b2d96d: protocol-http: substantial modernizations + d871071: alsa: allow configuration of fallback device strings in profiles + ad5a1f3: protocol-native,proplist-util: port to pa_get_{user a8f0d7e: core-util: introduce pa_get_host_name_malloc() and pa_get_user_name_malloc() + 4abd5fa: memtrap: implicitly page align memory areas + bd0e4ce: macro: make pa_page_align roung up instead of down + 68f3ca9: macro: add new macro pa_align_ptr() + 8247e45: shm: minor modernizations + 595c22a: shm: page align shm size when mmap()ing it + 9745483: strbuf: add new call pa_strbuf_putc() + 5d39b8d: idxset: add enumeration macro PA_IDXSET_FOREACH + +2009-04-28 Lennart Poettering + 0368d6e: build-system: move x11 and jack modules into subdirectories + +2009-04-24 Lennart Poettering + 908b0e6: build-system: hide .version from git + af8f058: build-system: run make update-shave + +2009-04-23 Marc-André Lureau + 35382d6: build: there is no such thing as SHAVE_OUTPUT anymore + ebe22ad: build: generate git tarball using git describe + +2009-04-22 Lennart Poettering + edba78c: start-pulseaudio-x11: don't start a local sound server if a remote sound server is configured + ad12d7d: memtrap,aupdate: split atomic update from memtrap into seperate aupdate framework + +2009-04-21 Lennart Poettering + bb07c16: i18n: run make update-po + 79c8826: i18n: add missing file to LINGUAS ... again + 6919424: Merge commit 'origin/master-tx' + 26383c6: memtrap: add a bit of documentation for memtrap + 67efc76: memtrap: fix parameter type + 684b4c1: memtrap: hook up core to memtrap system + 928adf4: memtrap: make installation of SIGBUS handler explicit to ease integration into libraries + 7b00861: memtrap: when we fail to handle sigbus say so + 6224fac: memtrap: add new logic to trap and handle SIGBUS + fbbcfae: semaphore: introduce static semaphores + 391d50c: mutex: add initializer for static mutexes + b304a98: mutex: when we fail to fill in mutex into static mutex ptr free it again + 12065f3: llist: add PA_LLIST_FOREACH + +2009-04-20 marionline + 3c36836: Sending translation for Italian + +2009-04-19 mvdz + ed10a15: Sending translation for po/uk.po + +2009-04-19 Lennart Poettering + 8fbf626: object: revert to old unref() behaviour + eb04d0f: object: fix ref counting of objects on destruction + ad2a0ab: alsa: remove debug code + 98a25c5: alsa: properly convert return values of snd_strerror() to utf8 + 39a26d8: log: use pa_logl() instead of pa_log_level() + b9f1af4: log: print file name only when we have it + 6773d00: util: if NULL is passed to pa_path_get_filename() just hand it through + +2009-04-15 Erich Boleyn + b03a650: reserve-device: allow building without D-Bus + +2009-04-17 Finn Thain + 1c0667d: solaris: 0.9.15 solaris module build failure + +2009-04-18 Lennart Poettering + 12c5afe: object: keep refcount at 1 while destructing objects + ad447d1: core-util: handle EINTR already inside of pa_read/pa_write + +2009-04-18 beckerde + 4ec5375: Sending translation for Spanish + +2009-04-18 fab + 0093379: Sending translation for po/LINGUAS + ae3caa6: Sending translation for po/de_CH.po + 8a1938c: Sending translation for German + +2009-04-04 Marc-André Lureau + 099b328: bluetoth-device: be less strict on CONNECTED state to switch profile + +2009-04-17 Marc-André Lureau + 344eea4: pulse/context: when NOFAIL, don't try_next_connection() if c->client + +2009-04-17 Lennart Poettering + d775cf6: rescue-streams: when one stream move fails try to continue with the remaining ones + +2009-04-15 warrink + 83e7186: Sending translation for Dutch + +2009-04-14 warrink + 0846b68: Sending translation for Dutch + +2009-04-14 raven + 5faacd8: Sending translation for Polish + +2009-04-14 Lennart Poettering + ca9cd14: add a few missing initializations + 40d71e1: explcitly ignore return values of some functions marked with gcc's warn_unused_result attribute + 845b312: bump version for final 0.9.15 release + a4cea4e: core: when applying delay memblockq take monitored sink latency into account + 2d94c93: pacat: add missing newline + 4ee4a55: core: use pa_{source +2009-04-13 Lennart Poettering + 16324fc: sort LINGUAS + a654155: run make update-po + c96f6f3: update LINGUAS + 0948dca: Merge commit 'origin/master-tx' + fe8b10c: core: introduce new 'reference' volume for sinks + 49dcf09: alsa: include the alsa mixer control that is used in the property list + 6fd8fd1: alsa: store mixer controls to use in profile data + 89f74cb: alsa: when passing emptry mixer control name, force sw volume + 237a9e1: volume: increase dB range to -90dB + 0ac038e: client-conf-x11: unbreak autospawn due to stale X11 properties + 0aed5ea: client-conf: when is set, disable autospawn setting + 4cc4cbd: client-conf: make setting a default server independant from the autospawn setting + 20aba71: proplist-util: use pa_session_id() instead of accessing 7b816367b01393ed3e3e650047d78f6e-1239640487.203609-1061245823 directly + 43650de: client-conf: modernize a few things + a36197c: print session id when starting up + 1d8da03: core-util: filter utf8 in pa_machine_id() + 1b4e5f1: core-util: add pa_session_id() + 17f1784: cork-music-on-phone: make sure that we don't check the refcnt of pa_core when the daemon goes down + 62db10c: lirc: fix logic behind mute buttons + 66d2184: mmkbd: get rid of support for ancient kernels + f1d3dfb: mmkbd,lirc: make use of pa_assert_not_reached() + 270a698: lirc, mmkbd: extend controllable volume range to PA_VOLUME_MAX + 6d218e9: api: introduce PA_VOLUME_MAX + e9dd7a5: lirc: drop lirc_in_use, it's made redundant by PA_MODULE_LOAD_ONCE + d8de5d3: make sure we never overflow when calculating sleep time + +2009-04-13 warrink + 2ba882c: Sending translation for po/nl.po + +2009-04-11 ifelix + 362ec7b: Sending translation for Tamil + +2009-04-10 Lennart Poettering + 6eaeaea: Downgrade default log level to NOTICE to follow documentation + a26c945: add missing languages to LINGUAS + 3e29fd7: prepare another snapshot + 991cb06: set fixed latencies at more places where appropriate + +2009-04-06 Finn Thain + 80e18c8: make dbus optional during build + +2009-04-10 Lennart Poettering + e011230: run make update-po + d6f019e: Merge commit 'origin/master-tx' + 5388b44: alsa: when printing warning about bogus data from alsa include snd_pcm_dump() + ee6657a: bluetooth: when starting up HSP stream, send 2 packets first, only afterwards enter one-read-one-write logic + d77b28c: bluetooth: rework timing logic, properly implement latency callbacks + e9a4dec: bluetooth: be a bit more verbose if we exit due to bad poll() revents flag + 48cff5b: bluetooth: rename sco to hsp also for the user + f7c229d: core: add a seperate fixed_latency field for sinks/sources with fixed latency + 9ae8ca2: core: memory leak, fix ref counting when moving streams + dcd4a73: dbus: memory leak, actually free dbus wrapper + d827ecd: dbus: drop pa_ prefix from static symbol + f8ebe85: protocol-native: downgrade message if we receive pcm block for dead stream + 5b87196: protocol-native: print underrun message only once for each underrun + 3507d1e: socket-server: memory leak, free machine id after use + 669703d: dbus: memory leak, free pending calls + 9ba9883: dbus: memory leak, free server id after use + 9ee6a41: bluetooth: memory leak, actually free discovery struct itself + f65b276: interpol-test: make it easier to test corking only optionally + +2009-04-09 elsupergomez + dac687d: Sending translation for Spanish + +2009-04-09 mgiri + d1cf6eb: Sending translation for Oriya + 6c5bbd3: Sending translation for Oriya + +2009-04-08 mgiri + 8e1a9b7: Sending translation for Oriya + +2009-04-08 kkrothap + 27784c4: Sending translation for Telugu + +2009-04-08 ifelix + 0474762: Sending translation for po/ta.po + +2009-04-08 runab + bb7beeb: Sending translation for Bengali (India) + +2009-04-08 amitakhya + 89f5da8: Sending translation for Assamese + b445f79: Sending translation for po/as.po + +2009-04-08 Lennart Poettering + 6c04a1c: bluetooth: make sure to set max_request + c32c6c8: introduce relative_volume field in sink_input and make use of it on sink flat volume change + 14e89d4: when calculating volume from dB use ceil() + 4ff41ec: print smallest attenuation/sample + +2009-04-07 kkrothap + 091a0f2: Sending translation for po/te.po + +2009-04-07 kmilos + f5eca5d: Sending translation for po/sr@latin.po + 7202d52: Sending translation for Serbian + +2009-04-07 mgiri + 5b0d1bf: Sending translation for Oriya + 54c895c: Sending translation for po/or.po + +2009-04-07 runab + 7154f06: Sending translation for po/bn_IN.po + +2009-04-07 Lennart Poettering + aacb11b: update documentation regarding stream timing a bit + c523b16: after propagating a sink volume change to the sink inputs recalculate their soft volumes + 93e14d3: we need to make our multiplications with linear values + 02686cc: reduce number of conversions to/from linear volumes + d612fbb: compare with doubles, not integer + e356a03: If the sink volume is lowered to 0 and then increased again, make sure all stream volumes follow instead of staying at 0 + 2c2713a: make use of SO_TIMESTAMP timestamp for accuracy and leave smoother paused until we have data + f204c0f: mark null sink as support dynamic latency + 298bd0b: adjust max_rewind/max_request whenever the latency changes + e976034: send the source latency based on the MTU size + 61b0776: add suspend_within_thread() callbacks to pa_sink_input/pa_source_output + 35a4a0b: enable debugging output based on if DEBUG_DATA macro is set + +2009-04-07 swkothar + ff2dc1b: Sending translation for Gujarati + +2009-04-07 shanky + 682c101: Sending translation for po/kn.po + +2009-04-06 Lennart Poettering + 886ddc3: make sure we don't apply sampling rate fixes that bring the sampling freq > PA_RATE_MAX + e61728e: Make sure we don't get stuck when prebuf is too high + ff8d66d: extend documentation for pa_stream_cork() a bit + 7fc2382: properly handle interpolation when queried x is left of last data position + daa945a: don't fail device reservation if the D-Bus connection is dead + 4b521e5: be a bit more verbose about the busses we are connected to + 90f4fdb: make sure we keep a reference of the bus connection during the whole runtime if we manage to acquire the bus name + +2009-04-06 swkothar + f598776: Sending translation for Gujarati + b9b470e: Sending translation for Gujarati + 4c0a2e0: Sending translation for po/gu.po + +2009-04-06 sandeeps + a55c236: Sending translation for po/mr.po + +2009-04-06 leahliu + f709f2b: Sending translation for Chinese (Simplified) + +2009-04-05 soko + 6c0ce4d: Sending translation for po/sr@latin.po + c66e3fd: Sending translation for Serbian + +2009-04-05 raven + 015d66e: Sending translation for Polish + +2009-04-05 vpv + 4053e35: Sending translation for Finnish + d5e8488: Sending translation for Finnish + f5ec110: Sending translation for Finnish + +2009-04-05 Lennart Poettering + ecba42b: run make po-update + 9416cdf: Merge commit 'origin/master-tx' + 6ba3333: Merge branch 'master' of ssh://rootserver/home/lennart/git/public/pulseaudio + 923c5bc: make it easy to disable interpolation in the interpolation test tool + 14e11e4: Fix a couple of races in native protocol + 7dafa87: don't try to outsmart the transport + ce73e71: introduce pa_{sink d035f4a: Modify smoothing code to make cubic interpolation optional and allow 'quick fixups' on resuming + +2009-04-04 vpv + 82d1301: Sending translation for Finnish + +2009-04-04 Lennart Poettering + ca39fa2: initialize sound cards only after the 'control' object appeared + 9bea250: increase log buffer further + 77a1e38: refuse to initialize on modem devices + f708328: add missing files to POTFILES.in + 99f45a6: run make update-po + f446f0e: Merge commit 'origin/master-tx' + +2009-04-01 Maarten Bosmans + 8bcb9c6: various spelling fixes + +2009-04-01 Luke Yelavich + ccaf765: POTFILES.IN: Refer to src/pulsecore/dbus-util.c + +2009-04-03 soko + a12f4e6: Sending translation for po/sr@latin.po + 310d47a: Sending translation for Serbian + 398e381: Sending translation for po/sr@latin.po + a0e46c2: Sending translation for Serbian + +2009-04-03 Lennart Poettering + 6152c52: Merge branch 'master' of ssh://rootserver/home/lennart/git/public/pulseaudio + 143e1ba: downgrade a few messages + +2009-04-02 soko + 089a081: Sending translation for Serbian + +2009-04-02 leahliu + cb40e85: Sending translation for Chinese (Simplified) + +2009-04-01 Lennart Poettering + 1c26d7e: plot the difference between system and sound card time + 373b5ef: properly account for seeks in the requested_bytes counter + 380e97a: use machine id instead of hostname to identify local connections + dcb24f5: load bt discover module only when installed + 707acab: prepare test7 + 75a8d18: pass destination source/sink when moving streams so that we can access them + c2f6d09: don't access i->sink if it is not set + d9b19f8: prepare test6 + 5348cc1: increase timing update interval exponentially + aa1ad0d: in verbose mode log buffer attr changes + 0aa99c4: add buffer_attr callback stuff to exported symbol list + +2009-04-01 tombo + 1fa761a: Sending translation for Italian + +2009-03-31 Lennart Poettering + 4e8ceae: fix buffer defaults + 76c44d1: be a bit more verbose about max_request changes + cebaa98: Log underruns + 917e8cd: handle buffer_attr changed messages properly + 5cbd4b7: update command name table + ef5af55: fix an error where a signal was accidently freed when it is tried to register it twice + 2a32de1: Merge commit 'origin/master-tx' + +2009-03-31 beckerde + c29e9cf: Sending translation for Spanish + 2cd93ab: Sending translation for Spanish + 1e99255: Sending translation for Spanish + +2009-03-07 Finn Thain + 5e11972: revive solaris module + +2009-03-30 Kyle Cronan + 92ae5f1: Specifying ALSA mixer control + +2009-03-29 Maarten Bosmans + facc46d: fix some typos in doxygen comments + +2009-03-30 Maarten Bosmans + 4a40aed: handle failure to parse proplist in cli-command gracefully + +2009-03-31 Lennart Poettering + cab1e54: explain ff7033c11d9248fe837204b03c8397231dc511fe + ff7033c: Revert "make sure we always read in all properties" + +2009-03-30 Lennart Poettering + 29a282a: allow nofail mode only when no server string was specified + b6135b3: minor cleanups + 3df9eef: take org.pulseaudio.Server instead of org.pulseaudio to match the interface name already used in the HAL module + 857a1f4: fix compiler warning + 90fbc03: make sure we never access an invalid pa_bluetooth_device object + 1c8f968: make sure we always read in all properties + 66b80e9: get rid of old 'Connected' property parsing and make sure we don't execute two case branches + 91355a1: introduce typedef for pa_bt_audio_state and use it everywhere + 1390564: Merge commit 'elmarco/bluetooth-fixes' + d33be12: Merge commit 'elmarco/dbus' + 649c982: Use pa_source_set_max_rewind_within_thread() for updating the monitor source's max_rewind + +2009-03-27 Marc-André Lureau + 8491b47: gtk-test: updated to use PA_CONTEXT_NOAUTOSPAWN +2009-03-20 Marc-André Lureau + 1dad83b: pulse: client connect to dbus + b4ef64d: daemon: take org.pulseaudio + +2009-03-19 Marc-André Lureau + eb93e25: dbus: split dbus-util into dbus-shared + +2009-03-30 Lennart Poettering + 1743322: Merge commit 'coling/master' + 061344f: Merge commit 'origin/master' + aa68036: rework tunneling code + 65b787d: notify clients about tlength changes + 491aafd: typo fix + b349dae: add pa_memblockq_apply_attr()/pa_memblockq_get_attr() + 7c37c37: document more often the context certain functions are called in + 7f5481e: simplify latency config functions a bit and make them callable in more contexts + d04f3e1: Trigger move callback a little bit earlier so that no IO thread is running + e3f1510: don't enabled tsched on software ALSA devices + +2009-03-27 Marc-André Lureau + 87fcb3d: bluetooth: use new audio State properties + 38825d7: bluetooth: GetProperties after profile UUID show up + 20bd1c6: bluetooth: remove racy GetProperties to check profile + +2009-03-26 Marc-André Lureau + 9e8c2d3: bluetooth: don't access outside array range + +2009-03-24 Marc-André Lureau + 61cd6d4: bluetooth: fail when switching on non-connected profile + 62a4e36: bluetooth: connected can be -1, check > 0 + +2009-03-27 Lennart Poettering + 87d63b1: Small fix for MacOSX compat + db714bf: fix typo + +2009-03-26 Luiz Augusto von Dentz + 13f1c44: Do not reconfigure capabilities. + +2009-03-24 Luiz Augusto von Dentz + 168c741: Query and make use of the current configuration. + +2009-03-25 Luiz Augusto von Dentz + 071b3e7: Update ipc to match new message headers introduced on BlueZ 4.34. + +2009-03-23 Luiz Augusto von Dentz + b03c545: Fix misuse of 'frame.joint' when estimating the frame length. + f80a1f6: Maintain the original code style for sbc. + +2009-03-25 Colin Guthrie + 205cbe8: raop: Add call to pa_sink_set_max_request() + +2009-03-25 Lennart Poettering + 3813034: add missing initialization + cbbd986: make sure the discovery module is only loaded once + 39576ec: on monitor source be fine with any latency range set by the sink + 6defb1a: add missing whitespace + 2c1eaa7: copy latency flags from sink to monitor source + 4edb109: use u->use_tsched everywhere + 8282efc: fix value of DYNAMIC_LATENCY + c367a88: fix misplace _ref() calls that should have been _assert_ref() + f6a6d01: optionally skip initial frames in backtrace + 8460fac: don't show full so path in backtrace + e41ec51: add simple ref counting debugging framework + 577259b: trivial simplification + 119698a: beef up esd sink properties a bit + fdbe054: initialize max_request to SO_SNDBUF + 98a5f4a: don't fiddle with latency range in sources with static latency + d0bd3d9: initialize max_request + bcfe51f: again, don't fiddle with latency range in sinks with static latency + 59b7e53: Don't initialize userdata twice + b815a1c: don't fiddle with latency range because we cannot adjust it dynamically + 0316dba: set latency range only in tsched mode + 171c88f: link jack modules's max_request to the jack buffer size + 892a839: simplify things and make sure timing setters can be called in most contexts + 44ca897: introduce new flag that marks sinks/sources which can adjust the latency dynamically + 9bca59e: make pa_source_set_max_rewind() work similar to pa_sink_set_max_rewind() + 9151107: get rid of 'default' min/max latencies, simplify things by just having absolute boundaries + +2009-03-24 Marc-André Lureau + a7246bd: bluetooth: fix #NOKIA, correctly unlink sink/src + +2009-03-24 Lennart Poettering + 5b523d0: fix bad memory access when destroying m-b-d + c64d8cb: Allow calling pa_{sink 50695d9: minimal reordering + 2f9a784: set request/rewind sizes only via accessor functions + aa92ff4: simplify latency range by not allowing stored 'wildcard' ranges anymore + e6be948: only decrease timer slack, never increase + +2009-03-23 Lennart Poettering + bcbfd5b: don't fail when no session bus is available + 52dcb95: add pa_assert_cc() for compile time assertions + +2009-03-16 Marc-André Lureau + a467bec: pulse: check context (do not user pstream when NULL) + +2009-03-23 Lennart Poettering + 0815455: only store card profile if flagged for that + 124de50: enable bluetooth default by support + 906fd57: Merge commit 'origin/master-tx' + +2009-03-21 kmilos + 4c381cd: Sending translation for po/sr@latin.po + 29d1db6: Sending translation for po/sr.po + +2009-03-21 Lennart Poettering + c14da67: readd volume control logic + b3675c2: add functions that modules can call whenever they now the volume changed + 8d5b375: at a couple of #ifdef NOKIAs for now + 3aa3972: rework device discovery to share a single device list among all modules + 20488fb: add pa_hook_is_firing + +2009-03-20 Lennart Poettering + f5c8990: make sure we dispatch messages in order + 77a1db1: fix a misplaced assert + 888e44f: rework bluetooth IO loops + d2bee57: fix prototypes of remaining sbc.[ch] API regarding size_t/const + 99dae9b: don't try to unref reserve stuff if we don't use it + 0251078: fix channel mapping for a52 devices. Closes #508 + 33a8f53: simply bluetooth nrec handling a bit + dfb3d2e: always remap relative volume properly + a998038: introduce pa_sink_input_get_relative_volume() + bd3154a: introduce pa_assert_fp() for fast path assertions + +2009-03-19 Xavier Conde + 5cc7d00: Update catalan po + +2009-03-19 Lennart Poettering + fe3709c: fix a comment + dd40006: document things that need to be fixed with FIXME + 3762299: unfuck i18n + 86439a4: Merge commit 'origin/master-tx' + 0a1af8e: Merge branch 'master' of ssh://rootserver/home/lennart/git/public/pulseaudio + 4a98312: Merge commit 'elmarco/bluetooth-fixes' + 291d21c: fix prototypes of sbc functions a bit + 794775b: document todo items discussed at bt meeting + 303cd90: get rid of setsockopt() calls since they have never been implemented upstream + +2009-03-19 Marc-André Lureau + e836217: bluetooth: rework the info_valid logic to be more tolerant + f1daa28: bluetooth: mark info_valid when receive Connected + +2009-03-06 Marc-André Lureau + af9f92b: bluetooth: update SCO over PCM with latest changes + +2009-03-19 Marc-André Lureau + df3f4ee: bluetooth: load bluetooth device with connected profile + +2009-03-19 Lennart Poettering + 9744595: Merge commit '2d903bae9a2e57f997a3d3f335379c3880f95c77' + 4ebdee5: deduce a proper icon for TV sets + 3e8c7ac: Ignore HAL NoSuchProperty errors when looking for capabilities field. Closes rhbz #489394 + +2009-03-12 Lennart Poettering + 2928b44: Merge commit 'elmarco/bluetooth-fixes' + +2009-03-12 A S Alam + 000f0b8: Adding Punjabi Language + +2009-03-05 Marc-André Lureau + 9e93b9c: bluetooth: stream also when source is suspended + 018cadd: bluetooth: restart timer when write begin + 362d196: bluetooth: accept temporarily unavailable error + 2d903ba: bluetooth: s/handled/not_yet_handled for signals + 12ea570: bluetooth: reset read/write index when starting to stream + +2009-03-05 Piotr Drąg + 5d00693: Updated Polish translation + +2009-03-05 Lennart Poettering + 47bc3b7: prepare test5 + c589da7: prepare release 0.9.15-test4 + c6ed0e8: run make update-po + 57baff5: Merge commit 'origin/master-tx' + 420ee3f: Merge commit 'elmarco/bluetooth-fixes' + 81323b5: Merge branch 'master' of ssh://rootserver/home/lennart/git/public/pulseaudio + 3122008: try to detect when stupid clients forks and refuse all service from then on + 9d29b96: make interpol test more interesting by corking/uncorking multiple times + +2009-03-05 Diego Elio 'Flameeyes' Pettenò + 21547d7: Properly check for versioning flags. + cad3dd2: Make sure to set 'no' on the variable cached. + +2009-03-04 Lennart Poettering + dcee888: Merge branch 'master' of ssh://rootserver/home/lennart/git/public/pulseaudio + 3dd8800: fix typo in FOREIGN_CFLAGS + 6427c70: try more things to get a proper icon for sinks/sources + +2009-03-04 Marc-André Lureau + 7a8be7f: bluetooth: don't init profile when off + +2009-02-27 Marc-André Lureau + 683548e: bluetooth: service_fd could be 0 + +2009-02-25 Marc-André Lureau + fa73688: bluetooth: hsp case, check l for appropriate error message + +2009-03-04 Lennart Poettering + 656fc66: never try to suspend monitor sources, suspend the sinks they belong to instead + ec1c923: print error code when suspend/resume fails + 0dd8a33: handle negative error codes + 341f44f: fix handling of _suspend_all(), return first failure error code + ecbc320: make suspend state of monitor source follow the suspend state of the sink it belongs to + bffa8be: Don't allow suspending of monitor sources. + d09287d: Fix a NULL pointer access when sutting down esound/simple connections + 8693417: various smaller cleanups + c8abe64: pa_xnew cannot fail -- that's what the x is in the name + 946d072: document more closely from which context certain functions may be called + +2009-03-03 Lennart Poettering + f3de61e: fix device reservation for system mode + +2009-02-26 Finn Thain + 0329edd: revive solaris module + +2009-03-03 Lennart Poettering + ff38eaf: Merge commit 'coling/lgpl21' + 297515a: pass profile priority value to clients + +2009-03-03 Colin Guthrie + 86dee05: Use LGPL 2.1 on all files previously using LGPL 2 + +2009-03-02 Lennart Poettering + f8a085f: properly handle directed card info requests + 7794108: Merge commit 'coling/master' + 45ae4ab: run make update-ffmpeg + 505df22: run make update-sbc + e435241: run update-reserve + 4e86a4c: run make update-shave + ea1d429: add update-shave target + 77514c1: Merge commit 'coling/master' + 5c514aa: make dependency on udev versioned + +2009-03-02 Colin Guthrie + c083177: Use pa_assert_se() when the containing code has side effects. + +2009-03-01 Colin Guthrie + 8a00c00: raop: Handle the reponse header memory allocation more sensibly. + b75a4b4: raop: Log teardown explicitly + d293f08: raop: Allow for nice sink descriptions to be set (interpolated from avahi) + +2009-03-01 Lennart Poettering + ba4765a: For now don't list icon property (in favour of icon name property) since icon negotiation is probably much more complex (i.e. sizes...) than just putting icon data somewhere. + 671b927: add logic for initializing a useful icon name + 784ac5b: get additional device data from udev + cc8d51a: rename PA_PROP_DEVICE_CONNECTOR to PA_PROP_DEVICE_BUS + cce56ab: revise form factor list a bit, simplify and use singular everywhere + e008333: introduce seperate vendor/product id fields + abdffe9: make example code a bit more robust/change-proof + +2009-02-28 Colin Guthrie + 8fc9b19: Don't assume that device reservation is enabled. + +2009-02-27 Xavier Conde + 34cefed: Updated catalan po + +2009-02-27 Lennart Poettering + 116b38c: Merge commit 'coling/master' + 798e39a: when alsa tweaks our sample_spec make sure we adjust the watermark accordingly + 1c86267: when an underrun happens, increase watermark by 10ms instead of doubling it + 0d8f67b: revise list of form factors a little + +2009-02-26 Colin Guthrie + 07f9842: bluetooth: Fix under linked module-bluetooth-device + dd3c96d: Fix a very strange 'file not found' error in module-alsa-card. + +2009-02-25 Lennart Poettering + 620bf84: try to vacuum a little when nothing is going on + +2009-02-24 Piotr Drąg + 90ffe2d: Updated Polish translation + +2009-02-24 Lennart Poettering + e8d7c50: forgot to bump the revision + 3d04300: hide shave in gitignore + 00839dd: make sure we check the sink status for PA_SINK_INPUT_FAIL_ON_SUSPEND only after module-suspend-on-idle had the chance to resume the device + 7f5fff9: Merge commit 'elmarco/shave' + 7126392: ignore tags file + 07a45c7: run make update-po + 364786e: Merge commit 'origin/master-tx' + 8314858: set reserve interface application device name + 03ac71b: don't put both the card and the pcm name in the description of a device if one contains the other + ba3c766: update reserve.c from upstream git + c341010: implement device reservation scheme + 3c73025: in case alsa lies to use don't spin forever + ec9f8f1: if ALSA gives us nonsensical data at least try to fix it up a little + +2009-02-23 Marc-André Lureau + 16bb658: build: shave it! + +2009-02-24 Lennart Poettering + 9eb5070: introduce new well-known role 'a11y' + fb49399: Merge commit 'coling/master' + c73887d: update gitignore + +2009-02-21 Kelemen Gábor + 9372733: Make .desktop and .policy file in src/daemon translatable + 1ddf64a: Make pulseaudio.desktop and org.pulseaudio.policy translatable. + +2009-02-23 Lennart Poettering + 998aa40: fix handling of stereo + e0b5507: it's probably more appropriate to return the configured latency instead of the actual latency + 385a560: complete esd suspend/resume implementation + 2e9479b: implement esd sample panning. closes #428 + 73c763c: set esound.byte_order property + 5fa3f0c: allow scache entries to have arbitrary names + 023ba89: use pa_alsa_safe_delay() where appropriate + 33601af: print driver name when we encounter driver bugs + 557a90c: add new wrapper pa_alsa_safe_delay() around snd_pcm_delay() + 5cc9d97: add new function pa_alsa_get_driver_name_by_pcm() + +2009-02-23 Francesco Tombolini + b063e53: Updated linguas file for it lang + 0be0fc0: Italian language by ubuntu team + +2009-02-22 Colin Guthrie + 2a0d252: Add the module dir to the libpulse pkgconfig file (needed for paprefs) + 4ebc6cf: Remove references to trademarked terms. + +2009-02-22 Lennart Poettering + 3bc60ca: a couple of boring updates + 3bccb70: Allow passing a NULL proplist to pa_xxxx_update_proplist() to just fire a notification + e335b3d: prepare test for tracking down ens1371 issue + 2d9ae49: rework suspending/resuming + 504384a: initialize selem index + +2009-02-21 Lennart Poettering + 194d899: make sure we don't choke on overly long lines in .desktop files + edfa39a: make sure we don't choke on PULSE_PROP_OVERRIDE + 77779ea: rework logging to make it more modular + 9b74afc: make string translatable (fixes #483) + fa5e10f: fix wording, closes #484 + 1a45569: prefer profiles that match the default channel map + 14ee8d4: print warnings about driver bugs at most once + 4505bc9: introduce default channel map in addition to the default sample spec + 27bfa60: add new property PA_PROP_APPLICATION_PROCESS_SESSION_ID and initialize it by default + 2d0c68a: check for ENABLE_LEGACY_RUNTIME_DIR with #ifdef, not #if + e4e6e28: split off foreign code into a convenience library to make gcc warnings go away + 4c3648a: tell gcc to ignore invalid gtk header files + +2009-02-20 Piotr Drąg + a305770: Updated Polish translation + +2009-02-20 Lennart Poettering + ed67b07: simplify some code + +2009-02-17 Marc-André Lureau + 9f89907: bluetooth: fix suspend on a2dp (to do on HSP non SCO over PCM) + +2009-02-20 Lennart Poettering + 6aa110a: run make update-po + 3da3ea2: Merge commit 'origin/master-tx' + 7bc1847: Merge branch 'master' of ssh://rootserver/home/lennart/git/public/pulseaudio + 26a270a: big alsa module rework to make things more robust to broken sound drivers and make it easier to debug them + adc9c2d: fix comment + fa2e07a: add test tool for debugging broken timing in sound drivers + 9f813dd: Make sure we actually call _() for translating profile names + ef189d5: make it easier to debug timing related problems + fdca6ed: make profile names translatable + d69bd03: don't try to use weakref stuff on older compilers that don't really support it + +2009-02-19 Fabian Affolter + aae5b15: Updated German translation + +2009-02-19 Lennart Poettering + 2e250aa: Merge commit '38ded3bb31bc49664641965f856a35f432a8a956' + b0c0106: Merge commit 'elmarco/legacy-dir' + +2009-02-18 Marc-André Lureau + 7c78c3f: alsa-util: check if mixer_poll_descriptors_count() < 0 + 800489e: pulsecore: don't leak p when make_random_dir_and_link() + f1dcbe0: pulsecore: don't leak d in case of error + 4722fec: rtp: remove unused variable a + 88fc458: protocol-native: don't leak a proplist + 0684b23: stream-resotre: don't leak a name + c0cf22d: protocol-esound: don't accept a request of PROTOCOL_MAX + 2c6abb8: daemon-conf: make sure c->log_level < LEVEL_MAX + 4f1380b: pulsecore: use r returned from fgets() + 204083c: pulsecore: unused variable e in hashmap_put() + +2009-02-17 Marc-André Lureau + 60d53c6: tests/ipacl-test: check inet_pton() + bb52a67: padsp: don't use si if it's NULL + d1306e3: pulsecore: fix check for cb (m is already checked before) + 67b0bae: pacat: remove unused variable + 4512a2c: rtp-recv: remove unused variable assignment + 927e501: pulsecore: remove unused variable from cli_command_load() + a252b61: main: remove unused lf variable + c3eb908: pactl: return in case of error reading file (avoid using freed d) + 25bbea6: tests/thread-mainloop-test: check if threaded_mainloop_start() succeed + 5ea7dac: tests/interpol-test: check if mainloop_start() succeed + a836927: tests/sync-playback: check if pa_context_connect succeed + 93ed27d: pactl: check if pa_context_connect succeed + 2aeab75: paplay: check if pa_context_connect() succeed + 6c8d851: protocol-native: fix get_info() for cards + +2009-02-19 Marc-André Lureau + 01f81d6: card-restore: it's not useful to check an array, let's check the length + +2009-02-17 Marc-André Lureau + ee0b5f7: log: don't leak bt + 83cdcf2: alsa-util: make sure we check an initialized cn variable + 7737b10: hal-detect: make sure r is initialized, so we don't take random path + 7d16dcb: dbus-util: avoid double free + +2009-02-19 Lennart Poettering + 205b0ba: split out mixer setup into seperate functions to make things more readable + e1608d5: modernize pa_msleep() a bit + 9cbdd3a: add pa_timespec_load + 45218aa: make interpol-test useful for recording as well + 5f5396b: additional validity check + 928920c: additional validity check + 7f8ccf9: handle both positive and negative errno's + +2009-02-18 Lennart Poettering + 6db3073: export card information for sinks/sources and number of sinks/sources a profile would create to clients + 7b8bed3: introduce pa_realpath() + d85ef71: export pa_match() + be81a68: if we fail to import a memblock fill in silence to guarantee stability of timing + 1737a19: allow importing of more memory blocks than exporting + 07333f8: refer folks to the ALSA devs, not us + dc1ad08: minor optimizations + ff58fa8: simplify pa_alsa_init_proplist_pcm() a bit and include resolution bits in alsa device props + c9c63c2: allow pa to be run in a chroot() environment tht lacks /proc + c1892f2: bump required alsa version + +2009-02-18 Marc-André Lureau + 05b7440: pulse/context: add --enable-legacy-runtime-dir + +2009-02-13 Marc-André Lureau + 38ded3b: bluetooth: print SBC encoder implementation info + b4c391e: bluetooth: don't crash on pa_thread_mq_done() if pa_init() fail + +2009-02-18 Marc-André Lureau + b51e613: bluetooth: update SBC from upstream + +2009-02-13 Lennart Poettering + 0b8a6c6: bluetooth: fix message queue/rtpoll + +2009-02-15 Lennart Poettering + a571565: don't open the alsa devices in hw:xxx mode + +2009-02-14 Lennart Poettering + 6790c03: unify ALSA mixer initialization + +2009-02-13 Lennart Poettering + 023998e: add doxygen comment for PA_GCC_WEAKREF + d447a8d: document all currently known properties + 9334d90: show whether gtk+ support is enabled after configure + fffe0ba: ignore gtk-test + e954a89: properly read icon/application name/display from gtk/glib/gdk + f863756: make PULSE_PROP env vars non-overriding but introduce PULSE_PROP_OVERRIDE for allowing overriding + 689e6f8: add definition for GCC style weak references + 44bca66: make PA_GCC_PACKED and PA_GCC_MALLOC actually work + c0fb91d: drop check for PA_PROP_APPLICATION_NAME since often enough we can deduce this better from g_get_application_name() + 15e9b96: we reinit proplist since the server will copy from client proplist anyway + 62818b8: fix aiff channel mapping for 6 channels + 433751f: add a module that forwards cork/uncork requests to X11 as fake pause/resume key events + +2009-02-13 Iain Hibbert + dc590c7: Optionally disable IPv6 + +2009-02-13 Xavier Conde + 555527d: Updated catalan po + +2009-02-13 Timo Jyrinki + b82fccc: Updated Finnish translation against current trunk. + +2009-02-12 Lennart Poettering + 4fab9bf: add full set of argument description + 6bb3dc8: don't try to recycle rtpoll objects + 87e1342: don't claim that profile changes are always successful + 52bfd47: use the same service fd shutdown logic when destructing module and changing profile + b18c875: minor service IO fixes + d9e3aba: the service fd is a stream socket, so handle things accordingly + 923dc1b: run make update-po + cc526a0: prepare test2 + e82b2fd: handle errors from BT service properly + c3b0d84: make module-hal-detect pick up all cards even when they have no device 0 + 84666db: properly free modargs object when init fails; don't abbreviate modargs in struct + a371306: tabs are evil + a7b992f: some minor fixups + 6ada8d1: instead of reparsing the rate module argument when changing profile, simply restore the originally requested sample_spec, this also makes sure the channel count is properly reset + 752f815: addendum to f56da9893: don't crash when s->sink is NULL + 1837a96: call _kill functions instead of _unlink since the latter should only be called be the stream implementor + f0cc23d: Merge commit 'elmarco/bt-wip' + 5d15425: minor reformatting + 60c50bb: declare 'animation' stream role for Flash and suchlike + 12db1a5: make gcc 4.4 shut up + a729786: implement a module that corks music/video streams automatically when a phone call is active + 823431e: allow sending meta/policy events to clients + +2009-02-11 Marc-André Lureau + 86bec09: pulsecore: add PA_CORE_HOOK_*_MOVE_FAIL + f56da98: suspend-on-idle: don't crash when so->source is NULL + +2009-02-10 Marc-André Lureau + cce4359: bluetooth: reinitialize the sample spec when switching profile + +2009-02-03 Marc-André Lureau + cac0f9e: bluetooth: export nrec + 452e2b9: bluetooth: suspend SCO state when over PCM + c8a240c: bluetooth: SCO over PCM + +2009-02-09 Marc-André Lureau + b35ae7f: bluetooth: reconnect to audio service when switching profile + +2009-02-06 Lennart Poettering + 4bd9737: Merge branch 'master-tx' + 6bb2c49: add #defines for all enums that lacked it + 04c3c67: A few MacOS X portability fixes + +2009-02-06 Erich Boleyn + 64926ff: RTP segfault/uninitialized resampler + +2009-02-05 Piotr Drąg + 108e08c: Updated Polish translation + +2009-02-05 Lennart Poettering + 9f39a44: add new module-augment-properties module for augmenting properties from .desktop files + d6201cf: parse ini-style sections properly + ee5abc3: make native protocol use pa_{sink_input 524d78f: add missing hook + 291589e: allow overwriting of process properties with environment variables + f42afc4: make return value of pa_{sink_input a67406d: add pa_client_update_proplist() call + 63e2343: handle default volume initialization properly + f6ffd2d: make module-position-event-sounds use volume factor + de86c6e: add a 'volume factor' that is implicitly multiplied into the volume of a sink input without being visible to the outside + +2009-02-04 Lennart Poettering + 3fc1233: add a .mailmap file for git shortlog + 12c29e1: store the identification key in the module-stream-restore.id property + 9e2a2f8: run make update-po + 9a4e03c: bump version and soname + ae06517: make pacmd work in a pipe + 3d33172: rate limit underrun messages + 0933f1a: Merge commit 'flameeyes/flameeyes' + d4618c8: Merge commit 'vudentz/master' + 9a93157: Merge commit 'coling/master' + d802a76: remove soft volume from pa_sink_input_new_info since it should be handled internally and automatically by the sink input + b2c923e: properly handle failing stream creation + 786398d: fix a validity check + 1db6478: version all entries in the database + 4cf82c7: merge in properties earlier to make identification of streams from hooks easier + f6ec971: clarify things a bit + 12b7359: add a few additional validity checks + 83ddc09: add new calls pa_replace() and pa_unescape() + a625ca7: make gcc shut up + 078a8d5: rearrange a few things + d6dd907: simplify code a bit by using pa_sample_size_of_format() + a6fe991: beef up proplist test a bit + 9a27b8f: in addition to per-property env vars PULSE_PROP_xxx look for for a stringified PULSE_PROP env var + b445741: fix up parser in pa_proplist_from_string() to handle escapes correctly; make pa_proplist_to_string() escape quotes properly + 0fc59e4: add new API pa_ascii_valid(), pa_ascii_filter() + ce76216: add pa_sample_size_of_format() + +2009-02-02 Luiz Augusto von Dentz + 004b38f: Prevent changing volume on wrong device. + +2009-02-03 Colin Guthrie + 871389a: A couple of dependancy ordering fixes. + d1957b8: Trivial typo in a comment + +2009-01-28 Colin Guthrie + e28903e: Clean up volume/mute settings a bit. As the APEX device only has one channel of volume (e.g. it's always matched) we emulate any variation in channel volumes in software. Remove the unnecessary callback defininitions. + +2009-02-03 Lennart Poettering + 32e5e64: add a lot of validity checking + b51ed38: add a bit of missing i18n + 543115a: add new API pa_cvolume_compatible_with_channel_map() + +2009-02-02 Marc-André Lureau + 539abc3: bluetooth: typo + +2008-10-19 Sjoerd Simons + 921882d: Load module gconf earlier + +2009-02-03 Lennart Poettering + fc31d21: when moving a sink between sinks make volume relative + 554c818: before applying balance/fade check it actually makes sense + f9696c0: add a macro definition for each error code + 2739261: Merge commit 'origin/master-tx' + 08800c3: make a couple of functions return proper error codes + 162e43b: make a few functions return void where the retval isn't used/never != 0 + 50bfa77: add new error code PA_ERR_NOTIMPLEMENTED + e47d03d: implement PA_STREAM_FAIL_ON_SUSPEND logic + c61ad2a: make iterating with pa_idxset_next() robust in regards to idxset modifications + f8190be: make update-sbc should also update other BT related sources + 59f3001: pull in new SBC/BT files + +2009-02-02 Lennart Poettering + fea6757: don't use PA_STREAM_NOT_MONOTONOUS anymore + 390133f: big module-bluetooth-device.c rework + 62f1f3e: make rtp.h ANSI C compliant + e412f1c: whitespace cleanup + 121a8b9: handle EAGAIN properly + 2854afb: fix soft_mute handling + a41d72b: update sbc stuff + 537424a: reset rewind_requested when we enter suspend mode + a9e9ab3: shortcut pa_sink_process_rewind() when no rewind is happenning and none was requested + 5fc11a0: Fix a few sink/source calls when they are called in suspended state. + d6fdd71: add new functions pa_bluetooth_cleanup_name() and pa_bluetooth_get_form_factor() + 16e3694: set PA_PROP_WINDOW_X11_DISPLAY from :0.0 and initialize PA_PROP_APPLICATION_PROCESS_MACHINE_ID properly + 8ccc9aa: try to use glib's g_get_application_name() to set PA_PROP_APPLICATION_NAME + 8fbce6e: when determining the minimum volume of all sink inputs make sure to handle the case when there are no sink inputs correctly + 55e6331: store the module index shifted by 1 to map PA_INVALID_INDEX to NULL + 69a9ed9: drop -pedantic + 04acc23: download everything from gitweb twice to make sure we don't get a 'Generating...' message + e0d6b75: add a few new form factors + 2c97c15: introduce PA_PROP_APPLICATION_PROCESS_MACHINE_ID + e0fd99b: work around dlsym() return value mistyping as suggested in POSIX + b092f2e: use uintpr_t when casting between pointers and integers + 55f643d: check for NULL before accessing the name + e7007fc: allow passing of channel map on command line and hide unused sliders + 2c7f2c5: look for libpulse in multiple different places + +2009-02-01 Xavier Conde + db2a425: Updated catalan po + +2009-01-31 Diego Elio 'Flameeyes' Pettenò + e9ca8b1: Disable portability warnings from automake. + +2009-01-31 甘露(Gan Lu) + 9d65392: Add zh_CN entry for Chinese Simplified translation. + +2009-01-31 Lennart Poettering + b979ab3: implement pa_channel_map_can_fade + f725b06: drop -Wpacked + +2009-01-30 Lennart Poettering + 6b80321: Merge branch 'master' into lennartsbtfixes + dbb8951: dump properties when we create a new sink or source + 2557017: suppress lines made up only of whitespace + e6f4586: include ALSA driver in properties for cards/sink + 4bd6545: add new function pa_alsa_get_driver_name() + 3442d58: Merge branch 'master' into lennartsbtfixes + 1c94cfe: Add a little Gtk test tool to show how balance/fade/value and the channel volumes play together + 1b53f82: implement pa_cvolume_{get 9314db7: fix a bogus assert + 634afed: properly deal with the case when l/r is silent when adjust balance + +2009-01-29 Lennart Poettering + 4a75002: add missing files + a71fa02: temporary commit of lennarts new bt changes + 47a9b96: add some helpers for dealing with DBusPendingCall based on Mrc-Andre's work in module-bluetooth-discover + 746dc2a: get rid of nonsensical late initialization of namereg/scache and things + 4a06af6: make use of new functions pa_dbus_add_matches/pa_dbus_remove_matches + 509535d: add new functions pa_dbus_add_matches()/pa_dbus_remove_matches() + +2009-01-28 Lennart Poettering + daf0612: make things compile again + 86e83d5: Run make update-po + f7c3ca7: Merge commit 'origin/master-tx' + b56e038: Merge commit '12db687acf3befe485bfff3700111999c95247fa' + a5401a5: store the default sink/source in proper pa_sink*/pa_source* pointers instead of a string + fc3ff11: fix two typos + 98821c7: print the right software volume + +2009-01-19 Marc-André Lureau + 12db687: bluetooth: cold hsp/a2dp device detection + a6a1b42: bluetooth: hsp volume control + +2009-01-28 Lennart Poettering + 611154c: Merge commit 'coling/master' + 3affa7e: make m-v-r a stub that simply load m-s-r + 63157a6: add missing usage strings + +2009-01-27 Colin Guthrie + 6e31178: Fix the message processing for PA_SINK_MESSAGE_GET_LATENCY by returning rather than breaking and falling through. + +2009-01-27 Lennart Poettering + 514661e: don't make m-e-s hit an assert when the latency is queried + 0f664b7: instead of making the volume relative our own, let' pa_sink_input_new() do it for us + e439c18: make m-p-e-s use pa_cvolume_set_balance() + d1b754d: only store volume/device information that has been flagged for saving, and store both relative and absolute volumes + 64b0543: when changing volume, store whether it is worth remembering or no + ee17772: add missing 'const' + 0ca16ca: add new paramter ignore_dB= to alsa modules + d5f46e8: move flat volume logic into the core. while doing so add n_volume_steps field to sinks/sources + 4bfa5d7: fix size calculation + eca3223: get rid of module-flat-volumes since we are moving this into the core + 1be39e4: allow samples to be played with 'default' (i.e. unspecified) volume. + 5449d79: swap argument order of pa_cvolume_get_balance() to be a bit more systematic + df8ad5d: add a few missing doxygen comments + 6058530: import version.h in all header files to make sure that version-based feature testing works + 1249cf6: always define PA_MAJOR/PA_MINOR/PA_MICRO to ease feature checking in client applications + 948be36: invert an ill-placed assert + 0658d9a: show pretty channel map name if possible + 07db64b: remove redundant cast + 9ba4084: store requested resampling method in a seperate field and use it when create a new resampler after a move + ccd21f3: make a few comments appear in doxygen + 3bcbe1d: check for availability of RLIMIT_NOFILE and RLIMIT_AS before we make use of it + 4e31e00: implement pa_cvolume_scale() + e52c5ea: implement new API functions pa_channel_map_can_balance(), pa_channel_map_to_name() and pa_channel_map_to_pretty_name() + 24b3a74: add a bitset implementation + +2009-01-24 Wang Zeguo + 085ca5f: Updated Chinese(zh_CN) translation. + +2009-01-24 Lennart Poettering + afd817a: rate limit a warning + a365c82: include a few HAL properties in our card/sink/source properties for ALSA devices + 54dad91: use pa_log_ratelimit() at a few places + +2009-01-23 Lennart Poettering + 77c4ccf: add pa_log_rate_limit() + 3dfe70c: add generic rate limiting implementation + e960125: add support for static mutexes + db27c63: make module-alsa-card move streams between the old and new sink/source, allowing 'hot' switching between profiles + 640d317: add functions to move all inputs of a sink away/similar for source outputs + 29cb778: move sink input/source output move functions into two parts so that we can start the move, delete the original sink, create a new sink, finish the move; similar for source outputs + cf24b57: in most cases we can use i->core instead of i->sink->core and o->coure instead of o->source->core + d5e088d: include list of sinks/source in card dump + 967c17a: teach module-rescue-streams and module-always-sink to not do anything if we are shutting down anyway + a3162a3: maintain a pa_core state variable + 88c9f9f: allow sample spec/channel map to be queried for pa_resampler objects + 7bdbcd0: drop --ltdl from the libtoolize invocation, since we don't ship ltdl anymore + f6fcbed: Merge commit 'flameeyes/flameeyes' + 5cb29f3: add a simple abstraction for SIMD operations + 2a238b2: don't overflow when we do digital amplification of 16 bit samples + +2009-01-23 daniel cabrera + 5487bc6: Updated Spanich translation + +2009-01-22 Diego E. 'Flameeyes' Pettenò + 3e5d9fd: Use #ifdef to avoid warning about undefined macro. + a257448: Improve the ltdl discovery code by checking for libtool 2.x functions. + 3293251: Move the safety check about pkg-config in bootstrap.sh. + 1b20d28: Fix logic thinko. + c65d3a9: Remove support for internal distributing and bundling of libltdl. + +2009-01-22 Lennart Poettering + ddbe612: use pthread_setaffinity_np() only when it is available + cef5f48: make rtstutter use pa_ncpus() + 4dc1916: add API pa_ncpus() + bb23932: When resuming an OSS device ask for the very same fragment settings as we did the first time + 3be4c31: rework module-hal-detect and make it use module-alsa-card instead of module-alsa-sink/-source + b2ef19a: include PA_SINK_INVALID_STATE in all switch/case statements to make gcc shut up + 4b2a682: fix minor memleak in prober + b606c09: rework logic how alsa sinks/sources/cards are named + 7c11554: make gcc shut up + 1c84251: fix segfault when in record-only mode + 8519f54: only reread volume if we actually have a good mixer. Closes #466 + 40f2e21: make gcc shut up a bit more + a5c9546: fix copy'n'paste error + 251f720: add new function pa_strna + 36362f6: add new function pa_card_suspend() + bdfec1f: mark a few more ALSA dB values as 'valid' for valgrind + 0f7954a: don't include full path in driver name. + bf7217b: require autoconf 2.63 + +2009-01-22 Jared D. McNeill + 7c7133e: NetBSD sometimes doesn't know SNDCTL_DSP_GETODELAY + c0e4e5a: NetBSD doesn't know getgrnam_r()/getpwnam_r() + 61075a7: NetBSD doesn't know ENOLINK + ca6b791: It is more portable to assume that SO_RCVBUF/SO_SNDBUF takes and int instead of a size_t + 8d89ccd: NetBSD specific atomic operation implementation + cc425ed: NetBSD doesn't know RLIMIT_AS + 75eeea6: NetBSD needs to include sys/uio.h for some socket functions + +2009-01-21 Lennart Poettering + 601293d: implement pactl set-card-profile + 996bba7: implement PA_COMMAND_SET_CARD_PROFILE + 1375a9a: enable module-card-restore by default + 13315a7: add a card profile restore module + c512ebf: minor cleanups + 10e5c70: don't restore mute/volume when already set + 9661cd0: make pa_card_new_data::active_profile a string + e8f93b1: make implementation of module-alsa-card complete + 7ca0e00: fill in dev_id properly + 28f05e0: remove leftover define + cba4c6b: when changing profiles do the actual assignment in the generic implementation + 1d0bd6e: remove bogus pa_core_check_idle() call + dc2a4bd: add set-card-profile CLI command + 9a0dbda: allow cards be referenced by their index + b6b0e07: fix copy/paste error + 16d200e: add an API to create arbitrary alsa sinks/sources dynamically without having to load/unload modules + +2009-01-20 Lennart Poettering + b88b89a: add new call pa_alsa_open_by_device_id_profile() + 04e9214: export pa_channel_map_superset() + 7368a6e: add priority logic to find best default profile + b3a043f: always add 'disabled' profile + e0f8c13: remove unused variable + 86f3fb8: show active profile + a65c2c7: add client API for querying card information + 85bc5eb: dump active profile + 7aa7a7b: fix destruction when no profiles are defined + 9368623: don't divide by zero if no left resp. no right channels are defined + 67fcc76: fix profile names to include input/output specifier + b23efc0: add missing eof checks + 47a2f9e: Merge commit 'flameeyes/buildfixes-2' + d5e895d: document that I am a retard + 8839d86: remove misplaced whitespace + +2009-01-20 Diego E. 'Flameeyes' Pettenò + bc41fdb: Include the alsa/ subdirectory for modules in the search path. + bd70e80: Allow to opt-out from building tests. + +2009-01-19 Lennart Poettering + 8c4e2be: include sink/source state in pactl output + 8886e66: Document explicitly that the internal sink/source states are not considered part of the ABI/API + +2009-01-16 Marc-André Lureau + 310f433: pulse: share private enum values with client side + +2009-01-15 Marc-André Lureau + a3762a2: cli: fix broken array access with signed state enums + 6374f8e: sink: trigger subscribe event on sink state change + 9c4f8e6: pulse: introspect sink state + +2009-01-19 Lennart Poettering + f83111d: Merge commit 'vudentz/master' + 96f01bf: Merge commit '7104d54bbce8f9bd2553e16f45f3a0f69ac75b8b' + 5f6641c: Beef pactl output up a bit + ed65081: show dB and balance for cached samples + 033791c: fix up balance format string a bit + 23cd942: fix doxygen version references + b987e5e: fix bad free() + b43a45d: allow setting properties for modules, too + fe70301: show balance value in CLI listings + 723d71a: add api for manipulating volume balances + +2009-01-19 Diego E. 'Flameeyes' Pettenò + 7104d54: Add proper -I directives for out-of-tree builds. + 348c2ca: Create only the directory the current target should be created into. + +2009-01-19 Luiz Augusto von Dentz + 4460a5d: Fix hsp rate and channels. + +2009-01-17 Lennart Poettering + 606cf8a: get rid of pa_module_get_info because it is not used + 76ca5b8: beautify cli output a bit + f8ba3a9: dump profiles when listing cards + c06e43d: actually create pa_card object in module-alsa-card + c560aea: Don't enumerate invalid profile + f03a7e4: Split up pa_alsa_init_proplist into two seperate functions for the card and snd_pcm_t specific parts + a45f971: add pa_proplist_to_string_sep() + 4a66837: add pa_strbuf_isempty + +2009-01-16 Lennart Poettering + b4d8046: add card profile prober + b2b2eb1: remvoe a bit of duplicate code + 5793f93: make use of PR_SET_TIMERSLACK + 4a13763: Add support for 24bit samples encoded in the LSB of 32 bit words + 6dc76d1: add support for 24bit packed samples + 9955398: fix version info in protocol history + +2009-01-15 Lennart Poettering + 4d4956e: Add SPDIF/HDMI ALSA devices and device descriptions to device search table + 33c22b0: rename card config to card profile + d4bda31: include libcli.la in libprotocol-cli's dependencies + 4210119: add stub makefiles for oss and alsa subdirs + c7fff97: move alsa and oss modules into their own subdirectories + bae221c: rework module usage counter stuff to be pull based + edf88a5: don't show autoload flag anymore since it is obsolete + 47a2b17: make proplist inheritance scheme automatic and implicit + e68e4a5: make things compile again + 395523a: we don't support glib1.2 anymore + 29c7a28: kill autoload stuff as planned + +2008-11-10 Marc-André Lureau + 43762ed: flat-volume: use pa_sink_get_volume(s, TRUE) to work with slaved sink + +2009-01-15 Lennart Poettering + a861ffa: Merge commit 'e0f8ffe41f99789fafac575e944acf02e940bbf7' + d2757c9: redirect folks to the ALSA developers not me when their sound drivers are broken + 615e055: add functionality to dump list of cards + 344c934: maintain a list of sink inputs/source outputs as part of the pa_client object + b6deb0c: add new pa_card object as a way to logically combine multiple sinks and sources + aeb0707: fix bad memory access + 0b0b3d8: make PA_CONTEXT_IS_GOOD/PA_STREAM_IS_GOOD a macro so that we can easily check for its availability + a3695dd: port missing modules to new pa_client_new() API + 5abda63: convert pa_client instantiation to use a pa_client_new_data struct and add hooks for manipulating it + 75119e9: add new dont_rewind_render flag to allow quick starts of newly created streams + 06de639: don't rely on PA_SINK_RUNNING vs. PA_SINK_IDLE for optimizations since it might not be fully up to date + d1cf0e7: fix a potential format string vulnerability + fd3f5db: document that PA_API_VERSION is only for incompatible API changes + +2008-11-17 Marc-André Lureau + e0f8ffe: match: add "key" argument to match different properties + e97ed21: match: can now change properties also + +2008-11-10 Marc-André Lureau + 6ec0162: sink: add a virtual_volume to sink + +2009-01-14 Lennart Poettering + 20edd84: make pa_asyncq_push() fail under no circumstances. + 587a08b: Fix a typo I know owe Marc-Andre a beer for. + +2009-01-13 Colin Guthrie + df56404: Fix a potentially non-returning function in base64 code. + +2009-01-14 Lennart Poettering + f310113: Merge commit 'elmarco/master' + ab97364: remove calc_sine() since we don't need it anymore + cd45cd9: include new proplist functions in export list + 407b4fe: fix calculation of avail_min + 1872526: add pa_proplist_size() and pa_proplist_isempty() + ef5a2b5: Fix version info + +2009-01-13 Marc-André Lureau + 09641cc: build: fix few warnings + 49ae383: cli: add missing update-*-proplist + 2204bbe: core: add source, si, so proplist_update + +2008-11-10 Marc-André Lureau + 3d631df: build: print more informations about preopen + +2008-10-31 Marc-André Lureau + 9d6e9f5: cli: update-sink-proplist + +2008-10-27 Marc-André Lureau + 01f71ac: libpulse: add proplist_from_string + +2008-12-04 Marc-André Lureau + 9e978c9: core: report remaining shared objects when cleanup + +2008-10-31 Marc-André Lureau + ebb903a: core: add pa_source_update_proplist + 9444347: core: add pa_sink_update_proplist + +2009-01-12 Lennart Poettering + f6ac7b4: bump version/soname + 2ecf4c3: Merge commit 'origin/master-tx' + f67066b: Port sine modules to pa_memchunk_sine() + b8e6aae: add new API function pa_memchunk_sine() + 949de81: Extend command name lookup tables to cover complete protocol + aff7243: Fix suspending of all sinks/sources + d94d39d: read base volume only in proto 15 + b9e96e0: for record streams fill in the latency as the fragsize + 947a828: fix version check + +2009-01-10 Lennart Poettering + b6804ee: Make sure we don't drop any data on the client side + 8a3dc57: make module-sine-source actually work + 4e8ada5: show maximum usable slot size + c850aa0: Add new pa_reduce() and pa_gcd() functions + +2009-01-09 Piotr Drąg + cf3abcd: Updated Polish translation + +2009-01-08 Lennart Poettering + 98049fb: make things compile again + 7b52840: add a few missing parens + 5daf141: drop a few warning options, add a few new ones + c2002dc: Merge branch 'master' of ssh://rootserver/home/lennart/git/public/pulseaudio + 9fc726c: Add new test source module-sine-source + e5c0938: A few minor cleanups and updates + aff7768: Add new debuuging API pa_memchunk_dump_to_file() + 7ca0f38: run "make update-po" + 6b9056c: Merge commit 'origin/master-tx' + +2009-01-08 Marc-André Lureau + a1a1119: build: fix missing x11 modules dependencies + 7e6309c: bluetooth: Update sbc from git upstream. + d096ad7: bluetooth: add update-sbc and friends + 8e200ed: build: run some tests during make check (and distcheck) + de57edd: build: Use proper -disable-static instead of removing .a + c8b3d8b: build: add atomic.h and refcnt.h to libpulsecommon + db193f1: build: introduce $SKIP_GIT for make dist (off-line or behind a proxy). + a206ac0: build: Don't include builddir, but only srcdir. + e92b0ae: build: compile libltdl directory first + +2009-01-07 Marc-André Lureau + dd9ca70: build: use pkg-config for X11 + +2009-01-08 Lennart Poettering + c245050: Prefer mixer controls with volumes over switches + e67bc1d: -Wconvert is pain, let's drop it again + +2009-01-07 Sean McNamara + 81cd219: --check: Updated manpage slightly and pulseaudio --help slightly. + +2009-01-07 Lennart Poettering + 2f681a3: Merge commit 'vudentz/master' + +2008-11-27 chocolateboy + 78e636e: Fix typo in log message: s/Recevied/Received/ + +2009-01-06 Luiz Augusto von Dentz + e7e6f86: Fix sending wrong codec capability length. + 1a96c9b: Fix send and recv message sizes. + +2009-01-05 Luiz Augusto von Dentz + be49c92: Send packets with proper size. + +2008-12-20 Tom Bamford + fe2b8c3: Multicast SDP packets sent with same IP TTL as RTP packets + +2008-12-30 Piotr Drąg + 17ae579: Updated Polish translation + +2008-12-24 A S Alam + cb5af19: Add Punjabi Translation for Module + +2008-12-24 Lennart Poettering + 2ff20ce: Rework handling of the PA_SINK_LATENCY/PA_SOURCE_LATENCY flags + fb4c111: Implement base_volume for ALSA sinks/sources + 6130c5c: Add "base volume" field to sinks/sources + 3e3c103: Add APIs to pass pa_volume_t fields in a tagstruct + 6342053: Add new API functions pa_volume_snprint() and pa_sw_volume_snprint_dB() + +2008-12-23 Lennart Poettering + f24e4c1: Merge commit 'vudentz/master' + c2bd8dc: fix a gcc warning + 22c3373: If we cannot open an ALSA device with SND_PCM_NO_AUTO_FORMAT retry without + +2008-12-17 Luiz Augusto von Dentz + 7323e1a: Update module-bluetooth-device to the new ipc. + 5db081a: Disable warnings for bluetooth-device-module. + +2008-12-21 Lennart Poettering + 03aa91d: make sure we don't hit an assert when we issue two rewind requests in a single iteration + 606c9ca: Implement PA_SOURCE_MESSAGE_GET_LATENCY + 10cc4ba: Use FIONREAD instead of TIOCINQ + +2008-12-18 Lennart Poettering + 63fc26e: Allow access("/dev/dsp", W_OK) succeed + 1d2e5cb: Make sure we drop CAP_NICE if RT is not allowed + +2008-12-17 Lennart Poettering + d71d79c: downgrade a few warnings + 906d06b: it's better to always use the index of a module instead of the pa_module* + f5d40fa: unload tunnel modules from a new stack frame + b95539b: actually unload the modules from a new stack frame + 86c6fd8: Don't store pointer to pa_module + c5b8eb7: introduce new function pa_module_unload_request_by_index + +2008-12-05 Luiz Augusto von Dentz + dcd498c: Fix bug walking on module list. + +2008-12-17 Lennart Poettering + 82f09b6: Don't hit an assert when checking for idleness + cb6a919: Load module-volume-restore and module-device-restore before all other modules + 3f20a15: Pass GDBM_NOLOCK to gdbm + 209a8d7: Don't mix front-center into rear channels + +2008-12-16 Lennart Poettering + b8fe1b6: fix implementation of bind now ltdl loader for libtool 2.2 + e4aa5f2: Fix return value of --dump-resample-methods + 8977b2e: libtool 2.2 updates + 7013849: Check if environ is actually set before we use it + 2ee9276: Merge commit 'flameeyes/libtool-2.2' + +2008-12-01 Timo Jyrinki + 55d846f: Argh, send pulseaudio Finnish translation (instead of paprefs) by Timo Jyrinki. + fe5c651: Add fi (Finnish) to LINGUAS. + ba64071: Add Finnish (fi) translation by Timo Jyrinki. + +2008-11-23 sainrysec + e9ca860: Only creat zh_CN.po + +2008-11-21 Henrique Junior + 7f9a6ae: Updated brazilian portuguese translation + +2008-11-11 Piotr Drąg + 946b34b: Updated Polish translation + +2008-11-07 Xavier Conde + 7582bf5: Added catalan locale + 69aaaf1: Added catalan translation + +2008-11-01 Lennart Poettering + f826ded: make shm marker architecture independant, patch from michich, closes #401 + 84cd233: Make sure libpulse never gets unloaded + 58b53bb: a bit of pa_bool_t'ization + +2008-10-26 Lennart Poettering + adc2973: Implement new flags DONT_INHIBIT_AUTO_SUSPEND and START_UNMUTED + +2008-10-25 Lennart Poettering + c180cb5: bump micro version + 1d978ce: Merge branch 'new-world-order' + +2008-10-24 Lennart Poettering + b712e7b: make sure to use 64bit rounding even on 32bit machines when converting to pa_usec_t + +2008-10-22 Lennart Poettering + 3294c89: warn if ALSA wakes us up and there is actually nothing to do + 6ff9c1f: don't set the volume of pacat unless it is explicitly set + a2b3d25: update map file + +2008-10-21 Lennart Poettering + 1cd25f1: reorder setting of AM_CFLAGS a bit + +2008-10-22 Lennart Poettering + ef0cc74: a lot more build system updates + 695d300: make new build logic actually work + b978d84: update map file + +2008-10-21 Fabian Affolter + 8dce771: Updated German translation + +2008-10-21 Lennart Poettering + df6e38b: temporary commit to allow flameeyes a look + 260fc50: reorder setting of AM_CFLAGS a bit + c4b3462: make the debug trap macro a proper macro in macro.h + ef9f3f6: Try to catch certain driver errors + 1647191: make log meta, time, backtrace configurable using command line + 496499c: Make log meta, time, backtrace configurable using config file + 651a451: support changing logging parameters during runtime using the CLI + f4320d8: Support showing a backtrace on log messages + f92a814: include log.h near the end so that macro.h can be included in log.h and defines pa_bool_t properly + d4c6342: add pa_config_parse_unsigned() + c7ed771: fix arguments to format string + 7fecb23: convert argument to boolean int in PA_UNLIKELY, too + 519bb55: fix return value of pa_frame_aligned() + 4ee5e06: implement may_move_to for ladspa/remap sinks + 358824b: add new virtual function may_move_to to sink inputs/source outputs to allow modules to forbid certain connections + 309bc71: fix invalid validity check + +2008-10-21 Micha Pietsch + 737beea: German translation done. + +2008-10-20 Lennart Poettering + b709e1d: Make missing git-changelog.perl non-fatal + +2008-10-19 Petr Kovář + e88a115: Updated Czech translation. + +2008-10-19 Lennart Poettering + d675058: Fix spelling of privilige + d395792: always check for libtool prefix binary name to avoid confusion when using both installed and run-from-build-tree versions of PA in parallel + +2008-10-18 PabloMartin-Gomez + 38b08a2: Last strings translated to French + +2008-10-17 Piotr Drąg + 304526b: Updated LINGUAS + +2008-10-14 Piotr Drąg + a34b8ab: Updated Polish translation + +2008-10-13 Lennart Poettering + 60c2a82: Merge commit 'vudentz/master' + +2008-10-11 Colin Guthrie + d8465f2: Fix two typos that broke tunnels + +2008-10-13 Lennart Poettering + 5a5d288: properly remove dbus matches an filters when unloading m-b-d + 65ea1a2: correctly load module-flat-volume instead of module-flat-volumes + +2008-10-12 Petr Kovář + 0ad8e7e: LINGUAS: Added cs. + dda7ab1: Added Czech translation. + +2008-10-12 Domingo Becker + a78cf07: updated spanish translation + +2008-10-09 Luiz Augusto von Dentz + 931cbd1: Fix possible invalid read while attempting to load module-bluetooth-device. + +2008-10-08 Lennart Poettering + 8e3e88d: Merge commit 'coling/airtunes-0.9.13' + +2008-10-08 Colin Guthrie + 91b64bc: Fix a potential C++/C99 ism, add a log message on error condition + +2008-08-22 Colin Guthrie + 59eb649: Follow master change r34dd4a and fix shutdown when --disallow-module-loading=1 is passed + +2008-08-03 Colin Guthrie + 8715121: Modularise the RAOP stuff that requires OpenSSL and make it optional at compile time + c3d8bb5: Remove $Id$ lines left over from SVN + 19d2831: Make module-raop-sink/discover work with 0.9.11 API + +2008-07-03 Colin Guthrie + ded09d1: Implement hardware volume control. This allows near instant change of volume when controlling the hardware but the stream volume still suffers from a sizable delay. + e543e04: Implement a set volume function to expose this capability to higher layers + +2008-06-24 Colin Guthrie + 36f2aad: Use the new pa_namereg_make_valid_name() function. + +2008-06-11 Colin Guthrie + 0ff75ae: Add Lennart back in to Copyright as I copied these files from his originals and was a bit overzealous in changing things ;) + 729bbaf: Automatic discovery of airtunes devices via Bonjour/Avahi. + d997420: Minor correction of help text + 15e8420: Still send silence when we are not doing anything else, but also flush the buffers correctly upon recovery from suspension. + +2008-06-10 Colin Guthrie + c49be78: Add some new public API functions to connect and flush. + d86fc75: Change the API of the RTSP client a bit. + +2008-06-09 Colin Guthrie + 19dcb52: Remove unneeded headers accidentially added in r2500. + 5f527dc: Add seq and rtptime params to record/flush with a view to using these for timing and device suspension + 651da7d: Minor update to copywrite (I still plan to replace this completely but in the mean time....) + +2008-06-03 Colin Guthrie + 7f0cf0c: Fix up a couple of values related to encoding overhead. + +2008-05-26 Colin Guthrie + 13bc075: A few related changes: + b93e9e8: Keep track of the memblock pointer internally and do not rely on subsequent calls to pass it back in for unref'ing + 8108121: Set forgotten keyword property + 6dc5e07: Set the send buffer size to prevent rendering silence in amongst our good data (this should be more sophisticated but that can wait for a glitch-free port) + 6c1dd6e: Move the encoding loop around a bit such that it does not grab the data and keep it for the next loop iteration. + +2008-05-11 Colin Guthrie + 3767cdb: Do tidy up on disconnection. + 9216684: Do not prefix internal function rtsp_exec. + eca94fe: Don't try to free stack variables. + be73d37: unref the raw data memblock before requesting more data. + cb8c5a9: Some misc fixes. consts, base64 optimisation (not that it will be with us long anyway), and c comments + 4b7b7b1: Fix up IPv6 address format to enclose it in [] + d195d06: Change suggested by Lennart. Do not return a memchunk, instead pass in the pointer. + e00127f: Various changes suggested by Lennart. + ec9a618: Listen to the on_close callback. This still causes asserts in the mainloop, so this is not a complete solution + 899492c: Add a new callback structure to propigate when the RTSP connection dies + 5eecfa2: Move the ownership of the encoded data memchunk into the raop_client. + 4dd3185: Do not assert on NULL values of s. This means the connection was closed. This change somehow kills the mainloop with an assert, so I need to sort that out. + d51f594: A very rough first version of the sink. + 264a1c2: Add more libraries to librtp now that it's doing a lot more. + f97c5de: Properly duplicate the hostname passed in on connect. + +2008-05-10 Colin Guthrie + 1fb0465: Combine pa_raop_client_new and pa_raop_client_connect (no point in having them separate) + +2008-05-07 Colin Guthrie + 41e31ab: Rename rtsp.{c,h} to rtsp_client.{c,h}. + e596f42: Wrap the io_callback to ensure that all data is written before asking for more. + 6510d97: Use a more stateful response parser. + +2008-05-06 Colin Guthrie + 22e299a: Add a pa_iochannel callback for when the RAOP connection connects. + 8fb58e3: Add a function for packing bits into a byte buffer. This will be needed when encoding the audio data in ALAC format. + 66cf1d1: Some minor tidyup to remove code now in raop client. Still nowhere near functional. + 20478a4: Add a skeleton raop client which builds on the rtsp client. + d423605: Move closer to an asynchronous structure (still some parsing code to be converted). + a0d3582: Trivial change to allocate memory using pulse methods. + +2008-05-04 Colin Guthrie + a08d733: Fix svn properties and some minor indentation + 27ed970: Convert the return values to fit with the rest of pulse 0 == success, < 0 == failure + 405cf72: Convert to using pa_socket_client rather than using blocking IO. + +2008-05-02 Colin Guthrie + ce9a41e: Use _free rather than _destroy so as not to mix naming conventions. + 91edf9e: Use pa_sprintf_malloc to do simple concatenation rather than using the higher overhead of pa_strbuf + +2008-05-01 Colin Guthrie + 6570620: Start the raop sink. It's based on pipe sink and isn't anywhere near finished. It does however compile. + fef102e: Add a simple base64 library that will be used by the sink + 4847706: Add a RTSP client impelmentation. + 8c1c565: Add a small lib to interpret and produce headers as used in http style requests. + +2008-10-08 Lennart Poettering + 068afb3: define 0dB in PA as maximum amplification + a8dc2aa: enable flat volumes by default + 2dfc265: Merge branch 'flatvol' + 37b8c45: query the sink volume outside of the loop because it might be quite expensive + 34f6a51: use pa_sink_set_volume() for changing the volume + b048ae9: check the maximum volume of all sink inputs instead of the average volume to avoid digital amplification in favour of attenuation + 404cf74: some minor reformatting + 8bc58cc: ignore sinks that do not carry decibel information + 776c8de: remove $Id$ + b6ccea3: add a comment that pa_sink_input_set_volume and module-flat-volume.c are related + 9f4033d: if a stream comes with now sensible properties attached, use common fallback db entry. + +2008-10-07 Lennart Poettering + 68cc299: after calling PA_CORE_HOOK_SINK_SET_VOLUME hook, check again whether the volume changed + 46f73fb: additional validity checks + e053fa0: if the channel map was modified due to PA_SINK_INPUT_FIX_CHANNELS, remap the specified volume properly + e1dbc75: use pa_channel_map_init_extend() instead of pa_channel_map_init_auto() as channel map for sink inputs/source outputs in case no map is specified + ae83483: modernize a few checks + 72024cd: when the volume is changed make sure we send out a subscription event + 624f220: instead of resetting virtual_volume unconditionally on initialization, do so only when no volume was set before + 5925d44: Merge commit 'origin/master-tx' into master-tx + +2008-10-06 Luiz Augusto von Dentz + 3d7b76d: Unload module-bluetooth-device if the remote device disconnects. + +2008-10-07 Lennart Poettering + c8a963a: Initialize exit_idle_time to -1 instead of 0 when in system mode. + 1e513c3: Initialize exit_idle_time to -1 instead of 0 when in system mode. + +2008-10-07 Marc-Andre Lureau + 80a79b1: flat-volume thingy + 4541274: volume hooks + +2008-10-06 Lennart Poettering + fa93cb7: make distcheck pass + e26ffc9: Merge branch 'master' of ssh://rootserver/home/lennart/git/public/pulseaudio + be667af: Merge branch 'master' of ssh://rootserver/home/lennart/git/public/pulseaudio + 0274651: bump version and sonames + f64d6af: Merge commit 'vudentz/master' + aa43739: make sure we send a started messages when we are uncorking + +2008-10-05 Lennart Poettering + 5996f59: update module-tunnel for recent protocol changes + f728e9c: disable valgrind macro usage for now since valgrind generates a lot of spurious warnings as it seems + 6d52a41: add missing include + +2008-10-04 Lennart Poettering + a9c1bb3: substract the unused record buffer size from the overall size before calculating the space still left for recording + 83b1d7a: get rid of pa_alsa_volume_divide() since we have pa_sw_volume_divide() now + da4ad5e: implement pa_sw_volume_divide() and pa_sw_cvolume_divide() + 87c8132: increase suspend timeout to 5s so that it is always longer then the default tsched buffer size of 2s + 530b95f: don't call snd_pcm_drain() when we suspend because that might take awfully long with our long buffer sizes these days + 88130eb: add missing inclusion + 82c46f2: do not cleanup staticly allocated memory unless we are in valgrind mode + 3c19352: show valgrind status on startup + 9b00664: instead of checking for directly use new function pa_in_valgrind() + 8222f12: add new API function pa_in_valgrind() to check for + +2008-10-03 Luiz Augusto von Dentz + fef63d7: Fix loading module-bluetooth-device with an invalid parameter. + 0c998b0: Replace handlers of deprecated Connected signals with new PropertyChanged. + +2008-10-01 Luiz Augusto von Dentz + b205fcc: Cleanup module-bluetooth-discover. + 20f68bc: Fix Connected signal handler. + 04677cb: Fix match rule problems. + 0be845f: Remove PropertyChanged signal handler. + 3b427b7: Add signal handlers for Connected signals. + 443ea47: Add match rules for org.bluez.Headset and org.bluez.AudioSink. + +2008-10-03 Lennart Poettering + 7a1a147: rename pa_cvolume_snprint_dB to pa_sw_cvolume_snprint_dB since it is useful only for software volumes + c0815de: allow - in sample names + 28af994: increase PA_CVOLUME_SNPRINT_MAX to a proper value and document that it is not considered part of the ABI + bde142c: when checking the validity of a cvolume check whether all values are not -1 + c0a9e8b: add missing calls to map file + ebb2ecb: add new API call pa_cvolume_compatible() + 619ed8a: add new API call pa_cvolume_snprint_dB() + be77bcd: add new API call pa_cvolume_init() + db975c7: extend documentation for pa_channel_map_init() + 2367212: make a few casts explicit to remove compiler warnings + 7c2cb77: a bit of late pa_bool_t'ization + d56f375: treat a channel map only then as compatible with a sample spec if it is valid + 8919898: add new API function pa_sample_spec_init() + 8a50105: if a volume or channel map is invalid show so when printing it + 33b186e: user lrint() and friends in inner loops instead of normal C casts to speed up a few things + 1bb5e58: use PA_FLOAT32_SWAP where useful + 7d442e3: optimize mixing routines a bit by pulling the multiplication with the global volume out of the inner loop by applying it first to the per-stream volumes + +2008-10-02 Lennart Poettering + a0f4ffd: make sure we call pa_sink_process_rewind() if a rewind was requested under all circumstances + ea82dec: when we mix into a 16bit accumulator make sure we clamp before we scale with a volume to avoid range faults when multiplying + 08cf9db: properly parse response to pa_stream_set_buffer_attr() calls. closes #370 + 54afcf2: inform dsp_empty_socket() *after* we emptied the dsp socket, that it is now empty + 9f5d052: make simple protocol not crash when allocating a memory block + +2008-10-01 Lennart Poettering + cf3f80e: when killing gconf helper, loop over EINTR + ea15ca9: PA_WARN_REFERENCE works only for ELF targets + 3853070: don't hit an assert if a kernel driver reports invalid dB information, instead just warn the user + 5d18b62: remove useless log message + 4b67ea1: remove useless log message, re #367 + 99acad7: fix support for ALSA devices which lack dB information + c4bdc2f: it's --daemonize, not --daemon + 9e79c87: Merge commit 'coling/master' + 644f39d: a few FreeBSD fixes, from alexis + f04cfcd: replace module-volume-restore by module-stream-restore in system mode, too + 6d74504: it might be a bit too early to initialize bluetooth by default for now, since it's still very rough around the edges + 0c3eb9f: fix typo in default.conf, closes bug #354 + 00b70a8: follow PropertyChanged signals from BlueZ + d299ac5: Some man page updates, add missing documentation, other fixes. + 79ad4e6: Make the shared memory segment size configurable + +2008-09-26 Nix + a84b72b: esound auth-ip-acl fix + +2008-09-23 Stelian Ionescu + 564ef2b: have make_random_dir respect $TMPDIR + +2008-09-29 Lennart Poettering + f5c301d: make module-bluetooth-discover actually load modules and smaller other fixes + 3f4bc03: all kinds of minor type, memory leak, initializatio fixes + a35f84a: instead of failing when the requested sampling rate is not available find the next one that is higher + aa1974b: Use the same module parameter names for module-bluetooth-device as for most other modules + 7923731: use TRUE for pa_bool_t arguments + 60e9744: remove a few compiler warnings in BlueZ code + +2008-09-29 Fabian Affolter + 8c2a7c8: Some strings done in German translation + +2008-09-27 Lennart Poettering + 87971c8: fix compilation errors in priority queue code + +2008-09-26 Lennart Poettering + 9adf7c5: ignore bt proximity helper + 3ad8c04: add a generic priority queue implementation + 3e16d2f: make pa_idxset_trivial_compare_func() do a full compare instea of just equakity check + 183f2e0: some minor fixes and cleanups in the bt code + +2008-09-24 Igor Pires Soares + 4b45985: pt_BR added to LINGUAS + +2008-09-21 Herli Joaquim de Menezes + 7f8d4bc: Transmitted-via: Transifex (translate.fedoraproject.org) + 5108b3d: Transmitted-via: Transifex (translate.fedoraproject.org) + 62b4b58: Strings do PulseAudio traduzidas para o português do Brasil. + +2008-09-12 Lennart Poettering + 6188737: make sure ~/.pulse exists before we create the runtime dir link beneath it + +2008-09-11 Fabian Affolter + 18d8999: Some strings done in German translation + +2008-09-11 Lennart Poettering + d68c2c9: replace Makefile stub copies by symlinks + 8257214: enable bluetooth by default + c0a1706: downgrade a D-Bus log message to debug + db955e8: add trivial redirecting makefile to bt dir + +2008-08-31 João Paulo Rechi Vita + 4ae124b: Move bluetooth proximity module to src/modules/bluetooth/ + +2008-08-30 João Paulo Rechi Vita + 8b02c2f: Change all int vars that doesn't allow negative values to uint + +2008-08-29 João Paulo Rechi Vita + 78a3c72: Move bluetooth discover and device modules to src/modules/bluetooth + 76bae38: Cleanup some code + 6093e32: Remove some warnings + 02a9273: Free mempool + +2008-08-28 Russ Dill + 447e027: Fix "file not found" error on load of module-bt-device for Ubuntu Intrepid Ibex + +2008-08-26 João Paulo Rechi Vita + 8769bf4: Merge A2DP and SCO thread functions + +2008-08-25 João Paulo Rechi Vita + 199bdf2: Add some more device properties to the sink properties list + e2f3a86: Remove check for SIOCOUTQ and add proper includes + dc4f796: Use union instead of different pointer types to the same memory area to make the code C99 compliant + +2008-08-21 João Paulo Rechi Vita + d1cc632: Move render and write to the fd to a separate function + 88a21e9: Change MIN/MAX to PA_MIN/PA_MAX + 27bc1ea: Remove unnecessary initialization of getcaps_req->flags + 027940b: Remove u->channels and u->rates, since it's redundant info + 0e81757: Fix some memory leaking + e752cac: Change sbc_initialized to pa_bool_t + +2008-08-20 João Paulo Rechi Vita + 708905c: pa__done for module-bt-device + +2008-08-19 João Paulo Rechi Vita + 61013fb: Fix some debug messages and other cosmetic changes + e570767: Refactor a2dp thread execution flow and improve time estimation + +2008-08-17 João Paulo Rechi Vita + 2f455bf: A2DP poorly working + c89301d: Fix sample size + e545479: Fix block_size calculation + +2008-08-16 João Paulo Rechi Vita + b5c4d2e: Configure bt connection for a2dp + 85a931f: Get rid of hw_constraint function. It's code now lives inside bt_setconf(). + 77138dd: Change default sink name to bluetooth_sink + +2008-08-15 João Paulo Rechi Vita + 6c10b10: Try to improve time estimation + 123ba4f: Fix handling of PA_SINK_MESSAGE_GET_LATENCY + 0d37b91: Remove PA_SINK_NETWORK flag and move the passage of streamfd to the rt thread just before the thread creation + +2008-08-14 João Paulo Rechi Vita + 435eb07: Change pa_sink_render to pa_sink_render_into_full and remove some unnecessary checks on the rt thread + 2e51b93: Make stream socket non-blocking + 71f1d68: Fix block size for SCO + fcd7dc1: Add include for core-util.h + eb1e308: Initialize rtpoll_item + +2008-08-13 João Paulo Rechi Vita + 0519e5d: Add include for sample.h + d48961f: Change close() to pa_close() + b4ded21: Change strerror() to pa_cstrerror() + 16d5aab: Get rid of SINK_MESSAGE_PASS_SOCKET, since we don't really need it + aa310a4: Changes for pa_modargs_get_value_u32 for integer arguments and correct some error messages + 0396a60: Copy arguments values instead of just getting a pointer for them + +2008-08-11 João Paulo Rechi Vita + f992296: Hand the stream socket to the rt thread + 255f9b0: Initial code for rt thread + b8b761a: Fix PA_USEC_PER_SEC missing + a3f0756: BlueZ connection configuration done + e7b0839: Adds SBC Codec to pa tree + +2008-07-31 João Paulo Rechi Vita + c62c2ff: Add module-bt-device and dependencies to automake + ee68292: Initial file for module-bt-device + d8a0ec5: Add code from bluez/audio/ipc.[ch] + ffe76a2: Add sender=org.bluez to dbus add match + +2008-07-24 João Paulo Rechi Vita + fe8bd53: Remove modargs, since module-bt-discover doesn't have any argument + +2008-07-23 João Paulo Rechi Vita + 1e03c32: Refactor all linked lists to use pulsecore/llist.h + +2008-07-22 João Paulo Rechi Vita + d893a1f: Remove block delimiters from single line if blocks + cadc666: Remove some unused vars and labels + a69c020: Change booleans to pa_bool_t + d90bb18: We don't need call_dbus_method anymore + 9907b46: Don't need to explicity check if hcid is running anymore + 2b68562: Improve dbus communication + +2008-07-21 João Paulo Rechi Vita + e5d25e0: Changing all private functions to static + 3909d9b: Remove VERBOSE definition + c9f5659: Adding dynamic bluetooth audio devices detection + +2008-07-18 João Paulo Rechi Vita + 314dade: Fix the symdef include + +2008-07-17 João Paulo Rechi Vita + 6fccd58: Fix comparison of strings of different case + 9d18b90: Adding module-bt-discover to Makefile.am + 8b511f5: Adding module-bt-discover + +2008-09-10 Omair Majid + 2ab4bb7: fix pa_stream_set_name + +2008-09-10 Piotr Drąg + 64a81d9: Added Polish translation to LINGUAS + 42fdcb7: Initial Polish translation + +2008-09-09 Arthur Taylor + f6670a1: stream_started_callback userdata bug + +2008-09-10 Lennart Poettering + 636b520: fix S32 validity check + +2008-09-09 Lennart Poettering + 5538c18: add src/pulsecore/lock-autospawn.c to POTFILES.in + 8f604bf: bump revisions + 17436b2: make sure peaks resampler also works for very short input buffers + 0deb6a4: minor improvements in debug handling + 4050447: unbreak pa_idxset_rrobin + 3a46bbe: When returning from a suspend, pass exactly the same flags as originally when we opened the device. + 25b200c: fix minor typo + f4c2f00: Work around presumable ALSA bug that treats the dir argument to snd_pcm_hw_params_set_periods_near() actually as > or < instead of >= and <=. + +2008-09-08 Lennart Poettering + c7a7765: Merge branch 'master' into master-tx + 821dc17: move autospawn lock to pulsecore/ since we don't need it in the client anymore + +2008-09-06 Colin Guthrie + cd704f8: Linking fix for rtclock on libpulsedsp + +2008-09-06 Robert-André Mauchin + 6b034f5: Updated LINGUAS: el, fr, sv added. + a571242: Added French translation. + +2008-09-05 Daniel Nylander + 77f57f3: Added Swedish translation. + +2008-09-05 Lennart Poettering + f216402: Add new option to disable remixing from/to LFE and set it to on by default + 33d349d: include build and runtime host information in debug output + fb837f0: rework autospawning to allow to multiple parallel autospawning contexts + 994ff98: connect to localhost via IP address instead of host name, to avoid needless NSS lookup + 89ed507: if we are exiting due to cpu overload, say so via syslog, too + f52fb64: if we are exiting due to idleness, say so + a609e4a: check for errors returned by pa_context_connect() + 3f6f13f: use pa_channel_map_compatible() where applicable + b56f344: a few minor clean-ups + 3429072: introduce upper channel map definition limit PA_CHANNEL_MAP_DEF_MAX + ece297f: update map file + cb0c97d: add new API function pa_channel_map_compatible() + 5a9a602: update map-file script to ignore gcc malloc attributes + 4562849: update documentation and help texts for s32le/s32be sample types + 12c5c62: Downgrade hrtimer warning to notice level + +2008-09-03 Lennart Poettering + 11cc072: Merge commit 'origin/master-tx' + bf403fe: introduce macros for all flags so that clients can check for them with #ifdef + cbd8e60: use PA_STREAM_EARLY_REQUESTS for OSS streams + +2008-09-01 Marc-André Lureau + 79009d2: command_get_info() segv in some conditions + +2008-09-03 Lennart Poettering + c402de7: reindent comments a bit + 40b66a0: Implement "early requests" mode. + 99d5ec6: Rework pa_machine_id() a bit + 5f93113: fix misuse of return value + +2008-09-01 Lennart Poettering + 2c2b271: use gcc malloc attribute macros for internal functions, too + 5467cc3: drop -Winline from build cflags + 4348faf: don't include leagacy definition PA_STREAM_NOT_MONOTONOUS in docs + f6e187f: prefix internally used inline function with _ + 70b820d: add gcc malloc related function attributes where appropriate + e015879: add malloc related gcc attribute macros + 82ea8dd: avoid rounding errors on requested buffering metrics + 002e7a7: output relative timestamps in addition to absolute timestamps when logging + a1c857a: include more build info in debug output + +2008-08-31 Lennart Poettering + 1c4ad4b: rework device opening code: work around broken SND_PCM_NO_AUTO_xxx support in ALSA <= 1.0.17a + +2008-08-31 Fabian Affolter + 1d319b0: Some string in German translation done + +2008-08-30 Lennart Poettering + 34bcba6: remove a few more gcc warnings + +2008-08-29 Lennart Poettering + 13018d6: fix a few compiler warnings on older gcc + 506eacc: reword amd64 message + 1acf394: change default log level for the library to PA_LOG_ERROR to avoid spamming to stderr more often + 086fa95: downgrade a few messages + a45440d: the native atomic ops implementation for amd64 seems to work fine + ca38446: Change return value of cmpxchg atomic op to pa_bool_t + bdcb3a4: optionally add timestampts to every line logged + 54da71e: reduce needlessly large gdbm cache a bit + 450fe17: fix up latency before calling into stream code, to make sure we don't ask for too much data to early + 63505be: add missing config.h inclusion + 6723699: rework pa_ulog2 and base it on __builtin_clz if available, make pa_make_power_of_two based on it + +2008-08-29 Marc-André Lureau + d10e5e5: Add CFLAGS information on start-up + +2008-08-29 Fabian Affolter + f2c790d: Initial German translation + +2008-08-28 Lennart Poettering + bb8263b: add byte-to-usec and usec-to-byte converters that round up, not down + f79c665: document in which direction we round + +2008-08-27 Dimitris Glezos + 6685a14: Started Greek translation + +2008-08-26 Ed Catmur + 3d07cc8: alsa_error_handler should note source of errors + +2008-08-26 Lennart Poettering + 8df5b2d: increase pa_xmalloc() limit to 96 MB, closes #344 + fd3c6b0: fix typo + f9713d1: Fix error code in pa_stream_get_timing_info() + 0a1f654: call close() in a loop to catch EINTR + +2008-08-22 Colin Guthrie + 2a78f86: Fix more linking issues in x11-publish and stream-restore + 4282b72: Merge branch 'master' of git://git.0pointer.de/pulseaudio + +2008-08-20 Lennart Poettering + dc9b8dc: add a few missing casts + a3e57da: add doxygen documentation for ext-stream-restore.h + +2008-08-19 Lennart Poettering + 6baec25: use final glibc eventfd() instead of our homegrown syscall invocations + 8e71787: rework cpu limit logic to use monotonic instead of wall clock time + 961aa18: simplify pa_start_child_for_read by using pa_close_all()/pa_reset_sigs()/pa_unblock_sigs() + b7026bf: add a few more gcc warning flags and fix quite a few problems found by doing so + 047eb52: run autoupdate + 2ca0533: update gitignore + 70f4a85: require ac 2.62 in bootstrap.sh + +2008-08-18 Lennart Poettering + 3d2d6ca: Merge commit 'flameeyes/autoconf-2.62' + 46f0f9e: a few modernizations + e65c514: don't unref pa_native_options object twice + 5cc2187: add some code to make invalid valgrind warnings go away + c6b1888: bump release + b8ba2de: restore volume/device for streams only when it wasn't set before + ec62596: allow clients to not specify the volume for their streams + c35d1bb: rework validity checking of sink/source/... names + d315dcf: save a bit of memory + 67858c6: fix type error + +2008-08-17 Russ Dill + 74719c2: Fix up overzealous HAVE_LT_DLMUTEX_REGISTER block + +2008-08-15 Lennart Poettering + 8d596a9: Make Multicast TTL for RTP configurable, patch from 'dfort' + f84536b: apply newly configured rules properly + 63402b3: apply volumes properly more than once in a row + 512c24c: apply the correct rules to sink inputs + f68a6e5: don't restore devices for direct-on-input streams + 5a0e014: disable hotplug sounds by default + +2008-08-13 Lennart Poettering + 916899a: pass force_refresh=FALSE to all volume/mute read invocations + abd85af: drop 0db reset functions since they are not necessary anymore + 8a10eba: extend hardware dB scale in software to full range if necessary, instead of reverting back to software-only volume control + 3ec4a5d: rework volume/mute APIs: split out pa_xx_set_soft_volume() and add force_refresh argument to read functions + 29daef7: add new function pa_alsa_volume_divide() + 8ab85fd: reword some log messages + e4adcf7: add new API function pa_cvolume_max() + a176f68: reset lock_fd_mutex after destruction + 3c88af7: fix protocol destruction + +2008-08-11 Lennart Poettering + 7c5a959: initialize IP ACLs properly + 8ca254c: fix two uninitialized memory accesses + c4dff4d: otpimize mixing code a bit by moving a few checks out of the inner loops + 5b2a837: optimize volume changing a bit by only using a single counter for the inner loops instead of two + b604290: adhere to struct gcc aliasing rules + +2008-08-09 Lennart Poettering + b218404: fix bad memory access + 72f520f: make gcc shut up + afbfd5d: adhere to C strict aliasing rules + 432b4e5: don't use PA_GCC_UNUSED anymore + 9996213: free regex_t after use + 15cebba: rework autospawning code to survive multiple pa_contexts in a single process + b4a5669: print reason when we fail to kill a running daemon + ee4c350: set errno properly in all functions from pid.c + d8119af: set errno properly in all functions from core-util.c + 9cf1a4e: add locale support to pa_parse_boolean() + c4d32ec: set errno properly in all cases + +2008-08-08 Lennart Poettering + 6df029a: make sure we don't crash if pa_thread_join() is called more than once on the same pa_thread object + +2008-08-08 Diego 'Flameeyes' Pettenò + 016fcd9: Reduce rules for man pages generation to pattern rules. + 89f492a: Replace some manual build tests with AC_CACHE_CHECK and AC_COMPILE_IFELSE. + daf3e8b: Create a new macro for checking compiler support for TLS. + 81969a7: Replace the CFLAGS-checking code with a common macro from xine-lib. + a6e4507: Use AC_PROG_CC_C99 to discover C99-compliant compiler. + f46ae10: Create an m4 directory for common macros and use it. + 66512f3: Remove gettext macros from configure.ac, intltool is used. + +2008-08-07 Diego 'Flameeyes' Pettenò + 07395ce: Bump autoconf requirement to 2.62 (latest released version). + +2008-08-08 Diego 'Flameeyes' Pettenò + 29fca62: Fix man pages generation when building out of tree. + 8a3d666: Fix building again libtool/ltdl 2.2.4. + f8197cf: Update code to use libtool 2.2. Use convenience recursive libltdl. + 2da79d5: Create an m4 directory for common macros and use it. + f4e9b7d: Remove gettext macros from configure.ac, intltool is used. + +2008-08-07 Diego 'Flameeyes' Pettenò + 4a51e1c: Bump autoconf requirement to 2.62 (latest released version). + +2008-08-07 Lennart Poettering + 40ff5fa: add compatibility with older PA socket paths + 75b28e9: remove some leftover debug string + ecb2bc4: Modify pa_state_path() to take an additional argument for prepending the machine id to the file name. + bd05b36: Rework state/runtime directory logic + 4e6fb67: don't spam to stderr in API functions + 0075649: print machine id during startup + 73e2577: add new function pa_machine_id() + b84f738: translate error strings + +2008-08-06 Lennart Poettering + b983c0b: include host name in default sink/default source file + bb7f80d: fix a few things in the translations + 4a44084: add basic german translation + 31bfd6a: fix channel position string + ff6bb7a: add a few configuration sanity checks for system mode + a4762ab: add disallow-exit to default configuration file + 756fac8: add new switch --disallow-exit + f1d2bf8: add i18n support + c4a953d: remove authkey-prop from tree + b4e8cac: don't include authkey-prop.h anymore + 9fde00e: fix a few potential bad memory accesses + +2008-08-05 Lennart Poettering + 34dd4a2: fix shutdown when --disallow-module-loading=1 is passed + ca12753: add a function to dump the stream database for debugging purposes + 8a156d1: don't enforce valid callbacks for extension module APIs + 98b8163: allow extension messages to actually carry information + e0dd72a: fix error path (spotted by Coling Guthrie) + f57b915: fix a few more copy/paste errors + +2008-08-04 Lennart Poettering + 78236af: fix copy/paste error + 163f107: fix documentation to follow what actually happens + 64a2367: inherit proplist on sample playback from client + 03cd37e: remove port definitions from header file since they are not actually used yet + 7de3ab5: add missing C++ checks in header + 9f5c1c6: pa_bool_t is not exported + dd07276: ignore PA_GCC_DEPRECATED and PA_GCC_PRINTF_ATTR when generating map file + 51d181c: update list of exported symbols + +2008-08-03 Colin Guthrie + 580c434: Fix linking + +2008-08-04 Lennart Poettering + 0cc674d: wrap protocol extension of module-stream-restore + 88c3db6: add protocol extension to module-stream-restore + 6cc3a61: store channel map in database and remap volumes if necessary + eec623a: add hooks for connection creation/deletion, for that export pa_native_connection + c01f0bc: split out save trigger function + 32cf9db: store channel map in database and remap volumes if ncessary + 5880516: add new API function pa_cvolume_remap() + cd5afb8: don't hit an assert if when process_rewind() is called with nbytes=0 + +2008-08-03 Colin Guthrie + bf17dbb: Merge branch 'master' of git://git.0pointer.de/pulseaudio + ec78981: Fix linking + 5744237: Merge branch 'master' of git://git.0pointer.de/pulseaudio + +2008-08-03 Lennart Poettering + 5f69b5d: load module-device-restore and module-stream-restore by default, don't load module-volume-restore anymore + ad76ca0: add new module module-stream-restore + ec19f2b: a bit of refactoring + d7b138d: fix uninitialized memory access + a6c11be: define CANONICAL_HOST as macro for the GNU canonical host + 04ffac5: add extension system for native protocol + 9bfd67f: store load_once flag for module + 114f290: add a new error code PA_ERR_NOEXTENSION + 23bde22: start idle timer even when no module is ever loaded + f417bb4: some pa_bool_t'ization + 065e764: make all protocol objects global singletons + aaaafb0: use pa_channel_map_init_extend() instead of pa_channel_map_init_auto() to make things more robust + 1ae1dfc: simplify a bit + 0a2fced: add new api function pa_cli_get_module() + 5042284: introduce pa_cli_eof_cb_t + 084f429: rename pa_hook_free() to pa_hook_done() since the hook struct is allocated on the stack not via malloc + 34c4354: use @ as seperator between shared name variable and instance + 5916b5b: make sure we don't leak userdata struct + 32f63f2: allow running of PA with a valgring that doesn't know cap_set_caps + 06712c2: add new auth cookie singleton + +2008-08-03 Sjoerd Simons + 98fbd24: fix iteration over random devices + +2008-08-01 Lennart Poettering + d36c5c9: rename props.[ch] to shared.[ch] + edc56a7: rename pa_property_xxx to pa_shared_xxx to avoid confusion with property lists + a5a7b79: fix build without ALSA + +2008-07-31 Lennart Poettering + d757dc7: Merge branch 'master' of ssh://rootserver/home/lennart/git/public/pulseaudio + 5150738: a bit of pa_bool_t'ization + 4f3193d: allow global tsched setting for all modules loaded by module-hal + 4ccbc4d: reword comment on dbus a bit + 026a6bd: Work around D-Bus bug that involves dbus_shutdown() to call exit() when it shouldn't. Patch from Coling Guthrie + +2008-07-31 Stanley Cai + 80428d8: A fix on src/Makefile.am + +2008-07-30 Colin Guthrie + b30a5d6: Merge branch 'master' of git://git.0pointer.de/pulseaudio + +2008-07-30 Lennart Poettering + 0b428e7: don't allow --start in system mode + 656d243: use the right LIBICONV macro, spotted by woglinde, closes #324 + c39a0bf: bump needed automake version + 881046b: install a default system.pa + +2008-07-26 Petteri Räty + 90569d3: Make the alsa error message give out the needed version. + +2008-07-30 Lennart Poettering + 3c6da6e: don't pass rediculously high values to umask() + b7b4b5e: remove debug message + +2008-07-29 Lennart Poettering + bb00934: hide doxygen docs from git + 68ae1d4: fix two thinkos in signal reset/close_all code + +2008-07-24 Lennart Poettering + e3fb086: make module-hal and module-ck live together in peace + 49f09d6: fix destruction of dbus modules: make sure we don't leave filter function registered after unreffing the dbus connection + 23a3c55: hide start-pulseaudio-x11 + 888256b: reset dbus error struct before retrying parsing messages + +2008-07-23 Lennart Poettering + e7b9da3: add missing pieces for new startup logic + c95d0d7: bump api verson + 32e93d5: follow consolekit's recent D-Bus API change, original patch from William Jon McCan + c415479: allow module-x11-xsmp to be loaded more than once + 1f10ca4: don't break if we fail to resume access to an audio device + 7140bdd: bump alsa dep to 1.0.17 + 1401d36: make missing gdbm fatal (spotted by Betelgeuse) + +2008-07-22 Lennart Poettering + 5edbb57: don't drop caps if we are started as normal root user + 3888bfc: enable exit-on-idle by default + +2008-07-21 Lennart Poettering + c1f9f95: prepare doxygen docs for 0.9.11 + d0530b0: fix gconf autoconf check + +2008-07-21 Colin Guthrie + 0e1936f: Merge branch 'master' of git://git.0pointer.de/pulseaudio + +2008-07-16 Lennart Poettering + 46a35c6: forward process_msg calls to the generic source handler, not the generic sink handler + ff3f435: try to bypass alsa softvol, since it is broken when used with snd_pcm_rewind() + +2008-07-03 Colin Guthrie + 0786de2: Fix documentation of constant: PA_VOLUME_MUTED (not PA_VOLUME_MUTE) + +2008-07-04 Lennart Poettering + 297267b: Merge branches 'master' and 'master' of ssh://rootserver/home/lennart/git/public/pulseaudio + +2008-06-28 Lennart Poettering + 1568fcc: get rid of our internal copy of the speex resampler. Instead, link against a system-installes libspeexdsp + 98c26b1: add proper update_max_request handler to native protocol streams + e6ffec5: make sure we call pa_sink_process_rewind() under all circumstances if a rewind was requested before we call pa_sink_render() + +2008-06-27 Lennart Poettering + c7ebe2b: ignore ~ files + c0e3c25: add additional file when updating speex resampler + 32fce4d: update speex resampler + 2490f69: update ffmpeg resampler from upstream SVN + 0fb402c: simplify handling of rewrite requests + 89620d3: handle rewind requests + f0e5cd1: handle rewind requests + 913bbd4: save a bit of memory + 36021b1: modernize idxset a bit, reduce memory consumption, get rid of pa_idxset_foreach() + 113c62b: halve memory consumption of mempool flist, since we know we cannot have more than n_blocks entries in it + c26be0d: modernize hashmap implementation a bit, reduce memory consumption a bit + 6dca92b: rework the flist implementation to halve memory consumption by merging the state field and the pointer in the flist cells + a087014: some modernizations + 232c955: rename pa_queu_is_empty() to pa_queue_isempty() to follow idxset/hashmap nomenclatura + 3db7dcb: save some memory by increasing the dynamic array at a slower rate + c0f97aa: some modernizations + 12278f4: fix typo in man page, closes rhbz #447355 + 0540032: fix underrun detection for prebuf=0 streams + 7755f75: use (uint32_t) -1 to signify default buffer_attr values instead of 0, to allow prebuf=0 + 2b764d4: fix crash when using sync'ed streams + 06ab488: cork/uncork before we ask for the rewrite, to make sure the rewrite actually gets trhough + +2008-06-26 Lennart Poettering + 9f0afb3: always forward rewind requests to the sink, and don't abort on nbytes=0 + d08cac0: some svn->git updates in the Makefile + ee79b05: rework logic to request automatic timing updates a bit + 4b8c4ef: reorder a few things to get rid of an uneeded comparison + 97084e8: add a FIXME + 7d3d3fc: move initialization order of validity bools around a bit + 36d6c71: unify smoother pause/resume handling in a single function check_smoother_status() + dcbb7f2: convert to double only once, and make sure we can deal with negative results of -y + eab1cb8: make sure to call process_rewind() under all circumstances before we do the next loop iteration + 1e36b57: use the newer name for monotonic/monotonous + 2c5a33d: remove redundant check + 85b83e8: properly initialize pa_stream::corked based on the flags + 1514d13: split pa_memblockq_flush() into two flush commands, one which fixes up the read ptr, and one which fixes up the write ptr + 5fccac9: comment two functions in memblockq.c + ec10f5f: use the bight lighter _silence() instead of _flush() when destructing our little q + dd8b909: fix up if the smoother shall be resumed 'before' it was actually paused + b4302ca: fix up monotonicity of input to _get() instead of hitting an assert + 63b68f4: call the enum PA_STREAM_NOT_MONOTONIC and make PA_STREAM_NOT_MONOTONOUS an alias for that + df2650e: fix return value of pa_namereg_make_valid_name() + +2008-06-25 Lennart Poettering + c5cbeb5: choose more sensible default buffer sizes for old clients + +2008-06-25 Colin Guthrie + 517727e: Add xmltoman to the distribution. This saves pulling in an external dependancy + +2008-06-24 Colin Guthrie + 5099ab7: Export the cleanup_name() function and rename it to pa_namereg_make_valid_name(). This will allow it to be used by modules to create valid sink names. + +2008-06-24 Lennart Poettering + ac03254: Merge branch 'master' of git://git.debian.org/git/pkg-pulseaudio/pulseaudio-upstream + 398514f: call update_source_requested_latency callback for source outputs only when it is set to non-NULL + +2008-06-23 Lennart Poettering + c22d8b9: don't refer to nonexisting pa_stream_read() function + 57aee6d: include proplist.h in pulseaudio.h + +2008-06-23 CJ van den Berg + 1562671: Merge dead branch 'glitch-free' + 126e4cf: Merge dead branch 'lennart' + 0be9bc2: Merge dead branch 'lockfree' + 63c1eb1: Merge dead branch 'ossman' + a87ba42: Merge dead branch 'liboil-test' + 1a3984c: Merge dead branch 'prepare-0.9.10' + +2008-06-22 Lennart Poettering + 8885ddf: support file-based capabilities instead of SUID root for giving PA rights to acquire RT/HP scheduling: setcap cap_sys_nice=ep /usr/bin/pulseaudio + +2008-06-21 Lennart Poettering + ab93f2a: fix deadlock when resuming oss sinks + 2199b8e: Properly check for home directory + d0e26a5: Don't fail when we cannot determine the lock file path + d1362b5: call the right function in the right context + d9f8b6a: since the sink is unlinked before the sink input we need to make sure we don't call any function for unlinked sinks from any sink input callback + 947d8b4: execute detach callback before we change the state to UNLINKED + 37bc240: allow sinks to be created with max_request initialized to 0, so that the data can be filled in later when attaching to some piggybacked sink + +2008-06-20 Lennart Poettering + d3c1c92: Request a rewrite immediately after we have been linked, so that playback starts immediately + add6c03: Rework module-combine to work with glitch-free core; add new max_request field to pa_sink + 1420e1d: fix interpretation of remix parameter + 6c980c2: add new abstract device class + 2b112fe: add new function pa_smoother_reset() + +2008-06-19 Lennart Poettering + 11e55fe: add new remix= parameter to remap sink + +2008-06-18 Lennart Poettering + fd5a1b1: remove trailing spaces + c2fa11e: make user of pa_channel_map_init_extend() wherever it makes sense + 132e73b: add new API pa_channel_map_init_extend() to synthesize a channel map if noone is known + b95cf52: ignore tarballs + 822366a: remove remaining $ + 8ae83d6: get rid of svn $ keywords + 6c4edd1: add missing gitignore files + b5a0802: add another .gitignore file, this time for pulse/ + 3bf61ba: Add a .gitignore file for the src/ directory. + 63daee5: Add a small README with the new git URLs and stuff + +2008-06-17 Lennart Poettering + 9020543: if building a man page fails remove the output to make sure that calling make repeatedly will actually work + ac58f8d: fix man page xml + ba64de8: reset prebuf if it is too large + 038a033: limit the prebuf value by tlength + b28c6e9: bring module-tunnel back to life + 8ba8265: server side of new shm negotiation scheme; fix a bad memory access + 0d0911f: rework shm usage negotiation; merge a few pa_bool_t in a single bit field to save a bit of memory; drop redundant implementation of pa_init_proplist() + 36c5259: minor modernizations + 53987e6: make use of the pa_init_proplist() version in proplist-util.[ch] + 0e32db2: move pa_init_proplist() to proplist-util.[ch] + +2008-06-16 Lennart Poettering + ce001aa: add missing const to a few functions + fa53443: add pa_memblockq_get_base() + 7dffccd: add Nokia copyright + 71aca29: check for packet size on server info data + 1fe2f2c: use new pa_sink_set_latency_range() in null sink + f2efe93: a few modernizations + f4e2750: add new function pa_iochannel_socket_is_local() + 3b691c2: make use of the new pa_socket_address_is_local() function + 30a8800: add new functions pa_socket_is_local() and pa_socket_address_is_local() + 2af2433: add missing inclusion + +2008-06-14 Lennart Poettering + 4cf508e: minor modernizations, increase unload timeout to 60s + ce53497: avoid division by zero when informing user about unloaded lazy samples in the sample cache + +2008-06-13 Lennart Poettering + bf51a4a: update todo + b27cc1d: fix a bad memory access pulsecore/client.c + 7bae1ba: rearrange things + e9c13e2: consider passing the same argument twice to a module an error, also consider a variable name without following = an error + 8dd59a6: sometimes a simple memset() is much faster + 5c149e2: fix a minor memory leak when unloading m-c-k + +2008-06-12 Lennart Poettering + d39d6c9: drop hal inclusion from module-console-kit.c + +2008-06-12 Colin Guthrie + 39f59cd: Trivial typo fix in debug log message. + +2008-06-11 Lennart Poettering + 92e4fb3: merge Colin Guthrie's module-always-sink module, and add priorization to the hook subsystem while doing so. + 1337afd: enable auto-spawning by default + b3444d6: enable ConsoleKit support and positioned event sounds by default + ac0f527: add new switch --start to the PA binary which allows starting PA if it is not running yet. In contrast to normal startup an already running PA will not be considered an error. Also, take the autospawn lock so we can guarantee that after this call returns PA is ralive and running + c33db3c: don't exit when the XSM signals us a session exit. instead just unload all X11 modules + a180edd: move pa_core_check_quit() a bit later + 46d17f0: reformat things + f7ff9e2: install auto unload time event only when we have at least one auto unload module + 2cc95df: add new module-console-kit which tracks ck sessions to avoid termination when there is still some session using the PA instance + 62dde3f: add new module module-position-event-sounds for positioning event sounds in space + 67fde59: replace pa_atof() by pa_atod() because floats are lame + ca36968: update well-known property list + +2008-06-09 Colin Guthrie + 71fefa7: Do not invalidate the cookie if no file was specified. Only invalidate it when a cookie-file is specified and it is not loaded/parsed correctly. This fixes a bug introduced in r2494 + +2008-06-03 Colin Guthrie + 3e4afae: Rejig r2495 slightly and directly compile the necessary source files as libpulsecore.so is not available when libpulsedsp.so is built + 3166ce8: Also link libpulsecore.la to some libraries (needed for logging). Discovered while compiling with --as-needed + 78ae612: Perfer client.conf over X11 property variables. To explain: X11 properties are always set on the root window if pulseaudio is started during X11 login (which is the most likey time to start it). This means that any settings specified in client.conf will almost never be used. As the default client.conf is empty it makes more sense to listen to it if a user cares to bother altering it. + +2008-06-03 Lennart Poettering + 9a501ef: fix a compiler warning on ARM due to missing cast, patch from Jyri Sarha + +2008-05-29 Lennart Poettering + c98516b: update props + 8431fb1: allow on-the-fly deleting of hashmap entries wile we iterate through them + +2008-05-27 Lennart Poettering + c4f60d5: never hand out more data from a sink input than requested. Otherwise the resampler might run for too long and we get a heavy delay/underrun + 7297bd9: always expect name field in upload datagram + 307645e: fix esound proto to not crash + 21dedcb: readd name field to upload datagram + d332439: fix a minor memory leak + +2008-05-21 Lennart Poettering + 28405e3: big mumbo jumo of interleaved patches. * Use seperate "state" and "config" paths * Pass the fact that we are in system mode via an env var $PULSE_SYSTEM instead of as var in pa_core * Properly check proc name when checking PID files. Don't check exename, because we cannot read that for other uids + 6be0c75: move device volume file to state dir + 9f86d0f: move default device from runtime to state dir + 32c53f3: move volume restore table from runtime to state dir, fix another compiler warning + 2ed84ed: define PA_SYSTEM_CONFIG_PATH and PA_SYSTEM_STATE_PATH for C + 29c7ded: deal with failing pa_runtime_path() + dd662d5: properly handle if pa_runtime_path() fails + 341042b: make state and config path for system instance configurable + 8125a75: fix a compiler warning + 9303cdd: add O_NOCTTY + a9c80b4: add new functions pa_state_path()/pa_get_state_dir(), change return value of pa_startswith()/pa_endswith() pa_bool, add pa_in_system_mode() and pa_streq(); alow pa_unlock_lockfile() without file name spec + +2008-05-18 Lennart Poettering + d65b901: fix daemon shutdown with active monitor streams + 174d830: ignore close-test binary + b467791: add a small test program for pa_close_all() + ef4c6bf: remove a misplaced assert + 7df3c4f: make sure we don't hit an assert when autospawning + 3c7a795: fix pa_close_all() to make it actually work as advertised + 0a2b6dd: fix a misplaced assert + +2008-05-17 Lennart Poettering + 940f898: fix return value of noop pa_limit_caps() + 3bbc376: add another assert to catch sleep time miscalculations easier + 7d0b595: use pa_source_set_latency_range()/pa_sink_set_latency_range() in the ALSA drivers; fix sleep time calculation + de8a386: use pa_source_set_latency_range()/pa_sink_set_latency_range() in the ALSA drivers; fix sleep time calculation + 58487ee: use pa_sink_set_latency_range() where applicable + 7e5e015: link latency of monitor source to sink + 9b44665: add new function pa_source_set_latency_range(), fix type of requested_latency + 2e71f4d: only unref memblock if there is one + 971342d: dump latency metrics for recording streams, too + 6285a46: fix peak detection pseudo resampler + e35bae8: fix pa_stream flag checking + 856a2f9: type fixes for constants + b2f8aec: type fixes for constants + b709ab5: fix a minor compiler warning + 85d9abe: declare the explicit type for our PA_xSEC_PER_ySEC constants + +2008-05-15 Lennart Poettering + b8849f5: bump so revisions + a1639e1: also update PROTOCOL + 045c1d6: merge glitch-free branch back into trunk + 3aadad1: update protocol spec + 43dfc2a: follow recent alsa sink changes in the alsa source + 734f071: decrease default tsched buffer to 2s to reduce overall memory consumption + 813d40c: fix up requested latency when we move a record stream + e3c5a77: fix moving of record streams + 99a4516: don't access stream before it is valid + 74f8a67: fix suspend for alsa sink + f021538: export a couple of more functions from libpulse + e0dc1e4: Print message when stream started playback, use terminal sequence to clear line when printing that message + 86ea73a: reduce malloc() usage when logging, to minimize the hit of logging in RT threads. Not complete yet, i18n still uses malloc + b57c520: add pa_vsnprintf() + 1a2e5a8: add adaptive resampler to the RTP receiver, other modernizations + cfc4842: export a few more properties for RTP streams + f96a8ad: increase default mempool size, make mempool_slot an abstract struct because the only fields it defined where actually unused + 70c5967: increase shm size limit, modernizations + 2bc77ff: reduce number of allocated memblocks when receiving RTP data by reusing blocks + d10ee7d: more pa_bool_t'ization + c801d08: use pa_bool_t + 076ffa3: add 'stream' as media role + 1b7157a: add PA_REFCNT_INIT_ZERO + 6895280: add pa_ulog2() + 103ceaa: add pa_memblockq_get_nblocks() + +2008-05-14 Lennart Poettering + df73688: modernizations + 37813d9: modernizations + 787b869: initialize volume properly, set more properties, modernizations + 2eca8c9: don't spam us with wakeup msgs in non-tsched mode + 9c48ed1: update pipe source for glitch-free, too + 8baa1a4: fix pipe sink for glitch-free + dd29f67: fix braindead mistake + 94c269e: some fixes to make the esound protocol work on glitch-free again + 8df6529: some fixes to make the simple protocol work on glitch-free again + c5faeb1: store peer name in native-protocol.peer property + aae8beb: if zero is passed to pa_memblock_new() allocate largest memory block possible from mempool + +2008-05-09 Lennart Poettering + f124445: fix module-sine for glitch-free + df92b23: - Fix moving of sink inputs between sinks - Don't write more than a single buffer size in the ALSA driver at a time, to give the clients time to fill up the memblockq again - Add API for querying the requested latency of a sink input/source output - Drop get_letancy() from vtable of sinks/sources + 580d563: modify test to generate data events out-of-order + 0ea0e06: make sure the smoother code can deal with incoming data that is out-of-order; start smoothing only when we have at least a configurable number of entries in our history + e97a347: bah, english sucks + +2008-05-08 Lennart Poettering + 1f196e7: fix some comments + +2008-05-07 Lennart Poettering + 7b5c6a3: fix recording + 21fa1cf: double default asyncq size + 876d5b4: fix a race condition when tearing down the ladspa/remap sink + 6f4d44b: apparently alsa expects us to free the memory for card names + d21f458: fix a memory leak + 9354da4: make memchunk/memblockq streams work with glitch-free + dafcf20: beefup proplist handling for sound events + 8afbdc3: update to new rewinding logic + 9d7fde5: rework the rewinding logic once again, fixing + 6c28f1d: decrease verbosity a bit + 44241ac: define callback function types; allow pa_signal_done() to be called even without prior pa_signal_init() + +2008-05-06 Lennart Poettering + 91fbb69: explain why changing rlimits at this time is safe + dee3555: rename 'routing' to 'filter' + 4fa6cb4: add a few more asserts, don't allow pa_limit_caps() to fail + +2008-05-03 Lennart Poettering + 71d14d4: fix remapping sink for glitch-free + a1c10b5: update LADSPA module for glitch-free moed + 59835d9: explain why a rewind was requested + 82caf5a: when rewinding after the end of an underrun, make sure to rewind as much as we can, so that we deal properly with changed latencies of the sink + 3167e0f: follow _unlink() changes from sink-input + d2da344: send PA_SINK_MESSAGE_REMOVE_INPUT only when an asyncmsgq is available, reset resampler only when we really need to + d2be471: make sure to call sink->update_requested_latency() always when we change latency, same for source + 59a7467: don't require a module name when resolving a dl symbol + +2008-05-02 Tanu Kaskinen + ff09fa3: Fix typo: "now"->"not". + 43a30a2: Fix setrlimit() return value comparsion. + +2008-05-02 Lennart Poettering + bb4f83b: only send PA_SINK_MESSAGE_SET_STATE if there's still an asyncmsqg around to do so + bfb2691: a few modernizations + 06b9140: reorderer a few things + 792ef5c: fix a compiler warning + 775bc6c: some modernizations + 7d6269e: add multiarch paths to default LADSPA search path + 49b1b15: don't enable prebuffering if we just call is_readable() + +2008-05-01 Lennart Poettering + 52e3628: Yes, yet another evil all-in-one commit of intervowen changes. I suck. * Drop "state" directory, fold that into "runtime directory" * No longer automatically rewind when a new stream connects * Rework sound file stream, to cause a rewind on initialisation, shorten _pop() code a bit * Fix reference counting of pa_socket_server in the protocol implementations * Rework daemon initialization code to be compatible with non-SUID-root setups where RLIMIT_RTPRIO is non-zero * Print warning if RT/HP is enabled in the config, but due to missing caps, rlimits, policy we cannot enable it. * Fix potential memory leak in pa_open_config_file() * Add pa_find_config_file() which works much like pa_open_config_file() but doesn't actually open the config file in question. Just searches for it. * Add portable pa_is_path_absolute() * Add pa_close_all() and use it on daemon startup to close leaking file descriptors (inspired from what I did for libdaemon) * Add pa_unblock_sigs() and use it on daemon startup to unblock all signals (inspired from libdaemon, too) * Add pa_reset_sigs() and use it on daemon startup to reset all signal handlers (inspired from libdaemon as well) * Implement pa_set_env() * Define RLIMIT_RTTIME and friends if not defined by glibc * Add pa_strempty() * rename state testing macros to include _IS_, to make clearer that they are no states, but testing macros * Implement pa_source_output_set_requested_latency_within_thread() to be able to forward latency info to sources from within the IO thread * Similar for sink inputs * generelize since_underrun counter in sink inputs to "playing_for" and "underrun_for". Use only this for ignore potential rewind requests over underruns * Add new native protocol message PLAYBACK_STREAM_MESSAGE_STARTED for notification about the end of an underrun * Port native protocol to use underrun_for/playing_for which is maintained by the sink input anyway * Pass underrun_for/playing_for in timing info to client * Drop pa_sink_skip() since it breaks underrun detection code * Move PID file and unix sockets to the runtime dir (i.e. ~/.pulse). This fixes a potention DoS attack from other users stealing dirs in /tmp from us so that we cannot take them anymore) * Allow setting of more resource limits from the config file. Set RTTIME by default * Streamline daemon startup code * Rework algorithm to find default configuration files * If run in system mode use "system.pa" instead of "default.pa" as default script file * Change ladspa sink to use pa_clamp_samples() for clamping samples * Teach module-null-sink how to deal with rewinding * Try to support ALSA devices with no implicit channel map. Synthesize one by padding with PA_CHANNEL_POSITION_AUX channels. This is not tested since I lack hardware with these problems. * Make use of time smoother in the client libraries. * Add new pa_stream_is_corked() and pa_stream_set_started_callback() functions to public API * Since our native socket moved, add some code for finding sockets created by old versions of PA. This should ease upgrades + f94fae3: move unlinking code to operation_unlink() + f3cc178: some minor updates + 11559a6: parse boolean parameters as boolean instead of int wherever applicable. add new function pa_cli_command_execute_file_stream() + 414f1d9: install gccmacro.h properly, drop unused core-def.h file + d7cc1f5: change pa_rtpoll_set_timer_absolute() to take a pa_usec_t instead of struct timeval + 5816871: save and restore errno in log functions + b93ea18: minor reformat + 4f99c43: check for $PULSE_INTERNAL before enabling padsp + 18ad6f8: don't allow overwriting of callback pointers when we're already dead + b70edf7: port pa_sample_clamp() to liboil + 9dd8f6c: add new function pa_sample_clamp() + 264385a: strip CRLF line breaks from read CLI commands. This should fix the cli interface for people accessing it via telnet. + f49df7a: * Increase history set to 64 to simplify reduction of indexes * Decrease memory consumption a bit by using bitfields for some bools * Rework reduction code * Drop an unnessacary counter * Before adding a new entry to the history, try to figure out if we already have an existing entry with the same x value and replace that. This fixes a division by zero * Fix up input x for all functions, according to the time offset + 563f4b6: make check for $DISPLAY=="" more readable, pa_bool_tization + 06a05bc: a bit of pa_bool_t'ization + b12b8ee: save errno before calling free() + +2008-04-23 Lennart Poettering + caf742a: define minimal and maximal wakeup/sleep times; check for underrun condition only once during buffer fillup + 5353cf4: fix size of requested_latency + 067a68a: fix build for auxiliary modules + c8fc223: add stripnul to build + 76031df: Big pile of interdependant changes: * Fix a deadlock when an asyncq overflows and an RT thread needed to wait until space became available again while the main thread was waiting for a operation to complete and thus didn't free any new items. Now, if the asyncq overflows, queue those items temporarily, and return immediately. Then, when the queue becomes writable again, flush it. * Modify pa_thread_mq_init() to also set up pa_rtpoll events properly for the MQ * Some more pa_bool_t'ization * Unify more common code between alsa-sink and alsa-source * The upper limit for the tsched watermark is max_use minus one frame * make module-alsa-source work * make the alsa modules use pa_alsa_build_pollfd() now * fix detection of dB scale for alsa-source + a197644: add new tool 'stripnul' which can be used to drop leading zeros from a file which is useful to do byte-by-byte comparison of what goes in and comes out of PA + f2dffb7: pa_bool_t'ization + 0b183fb: respect the resampler's maximum block size to avoid that we get kicked out of the memory pool due to resampling. actually drop data from the delay queue after we used it + 998ed8e: add missing header definitions for last commit + 3f57d3a: add new function pa_alsa_build_pollfd() to alsa-util to unify a bit more common code from the sink and the source + ed0af46: unify code that fixes up buffering metrics + af03dd4: drop a misplaced newline + 3c8e83f: do not fix automatic buffer attrs anymore, the new protocol version doesn't need this anymore and it creates more problems than it solves. Also drop the initial timing info query. Correct programs shouldn't depend on it anyway + +2008-04-22 Lennart Poettering + 5e6aacd: * don't increase tsched_watermark on underrun without limits * fix the watermark when we change the latency * fix latency measurement * move rewinding code into its own function * make use of new function pa_alsa_recover_from_poll() were applicable + 6b4b95b: show configure latency metrics + 1adbe82: some beautification updates, show msec instead of usec everywhere + cdb077b: if no timer was armed, we don't need to disarm it + 4a1971a: if no latency was configure for a sink/source, fill in the max latency automatically + 69f6bdf: add new function pa_alsa_recover_from_poll() to merge common core from module-alsa-sink and module-alsa-source + 9a486ef: implement --process-time + 0d01c43: make sure the client buffer has space for 2*minreq+tlength. Explain why + e16a198: - Change meaning of special values of latency request: 0 -> "minimal latency, please"; (pa_usec_t)-1 -> "don't care" - Remove "source" word from monitor source description - Increase default tsched watermark to 20ms again - For the first iteration after snd_pcm_start() halve the sleep time as workaround for USB devices with quick starts + 88227c4: properly initialize memblock->is_silence for imported memory blocks; make is_silence and read_only a bit field + +2008-04-20 Lennart Poettering + 5e7e827: improve dB volume calculation + ba6c0e1: fix C++ compat + 8181db1: initialize properties for ALSA sinks/sources more elaborately, re #277 + c2c833c: use the sink description instead of the name to choose the description for the monitor source + 64e048c: drop a redundant pa_init_proplist(), properly set MEDIA_NAME property on stream, not on context + 5971345: rename sink_input->rewind to process_rewind() and set_max_rewind to update_max_rewind() + 62e7bc1: Big pile of dependant changes: * Change pa_memblockq to carry silence memchunk instead of memblock and adapt all users * Add new call pa_sink_input_get_silence() to get the suitable silence block for a sink input * Implement monitoring sources properly by adding a delay queue to even out rewinds * Remove pa_{sink 7556ef5: maintain a global silence memblock cache + a0671aa: fix for new location of gccmacro.h + d1d7a07: we have not periodic timers anymore + 33a35b6: update to recent changes of proplist api + 33cb589: split user supplied data in multiple memory blocks if necessary to fit in one mempool tile. If the caller supplied a free_cb and we use shm it's better to copy the data immediately to the shm region instead of keeping it around as user memblock + ed36f31: increase the default pool size to 16MB because we now need to keep a lot more memory around due to glitch-free. + 03df088: add lower boundary for artifical latencies + af25697: follow pa_pstream_use_shm->pa_pstream_enable_shm rename + 687aa29: add new pa_pstream_get_shm() API, rename pa_pstream_use_shm() to pa_pstream_enable_shm(); pa_bool_t-ization + bee409a: remove debug messages + 1ddb95a: add new silence memblock caching subsystem + 4b1d684: add new API function pa_memchunk_memcpy() + 144b237: print a message on xrun + +2008-04-17 Lennart Poettering + 22ceb15: add new rtstutter tool which can be used generate artifical scheduling latencies in the OS to trigger buffer underrun events in your software. it's an awesome debug tool for glitch-free; also move test programs from automake's check_ back to noinst_ to make sure it is built everytime Lennart presses F9 in his emacs + c9d0159: define PA_xxxSEC_PER_yyySEC for usec, too + +2008-04-14 Lennart Poettering + 1f0a52d: the pointer to rewind() may actually be NULL + 68e4a93: properly ask the sink to rewind on new sink inputs and when they disappear + 6946d2a: make sure to clear all queued RT signals before arm a new timer + 04178d4: add _cb suffix to _max_rewind function like with all other functions, too + +2008-04-13 Sjoerd Simons + 91f092e: Let bootstrap.sh require version 1.10 of the various autofoo bits. Otherwise things will break during compilation + +2008-04-11 Lennart Poettering + 14fd32e: add missing 'break's in switch + 55f273e: s/pulsecore\/gccmacro.h/pulse\/gccmacro.h/ + 07f5c1d: register sink/source name as first step when creating a new sink/source so that we can hand the valid name string to the hook functions; se tup props for monitor sources correctly; fix implicit flag setting logic + aad9d39: dump all info we know about sinks/sources/... in pactl + dbe3633: properly initialize ->memblockq + cdb273d: add new pa_get_state_dir() function, move pa_strnull() here + dcf7173: fix help string for volume commands + fe3c42d: fix packet formatting for a few commands + 2c6176f: mark shm marker struct as packed, to guarantee identical sizes between archs + 29cbd88: add new PA_GCC_PACKED macro + 096e7f0: make shm magic marker compat with multiarch systems where 64bit and 32bit processes might share SHM areas + c9db6d2: don't fail if a signalled writability of STDOUT is no longer true when we try it because some other thread already wrote something + 413656b: update list-xxx commands a bit + 28ab2a0: don't print 'signal' each time a rtpoll poll() call is canceled + 50d585e: fix linker warning macro code, move pa_strnull() to core-util.h, move PA_LIKELY definitions here from gccmacro.h + d0ebb71: don't use fqdn if we don't have to + 78368db: redirect alsa errors to normal PA log system; export buffer settings in device props + 1c5f665: make use of new alsa SND_PCM_NO_AUTO_xxx flags; redirect alsa errors to normal PA log system + 0f28de6: mark autoload functions as deprecated + d7e260b: remove misplaced PA_GCC_PURE + e832b0c: add C++ safety to header file + 7dad635: fix bit depth guarantee for pa_usec_t + 919bd98: add new API function pa_timeval_add() + 566322a: remove gcc macros from cdecl.h because we have them in gccmacro.h now + 007f82d: fix bad memory access when initializing client proplist + d491adf: add gccmacro.h to doxygen docs + e084e4b: add new module module-device-restore + c61c3b6: increase version of required ALSA to 1.0.16. check for gdbm + 6cddf61: add new API pa_rtclock_from_wallclock() + e1c1a78: fix proplist serialization + bb9792a: move gccmacro from pulsecore/ to pulse/ + +2008-04-09 Lennart Poettering + 5d7128a: add new describe-module CLI command + 39afb14: add new pa_proplist_setf() API function + d69aeeb: implement server side of new sink/source reconfiguration commands + fc9d827: remove doxygen \since tag for API changes older than 0.9; properly implement new latency query APIs + cc1e265: init min/max latency properly; fix avail_min updating + f3109be: show configured latency and its ranges + da37a7e: export both min and max latency that is configured for a sink; add API for querying the requested latency of a sink/source from the main thread + ad18107: add new latency argument + 0f9e977: bump protocol version + 3138928: include proplist.h in doxygen docs + +2008-04-07 Lennart Poettering + b3b8a63: call snd_pcm_hwsync() expclicitly before we access any of the status fields, since this seems to be necessary. try to find the right mixer device via the card index + c84a64c: fix bug where we silently dropped data that didn't fit into one mempool tile + 98b0152: add utility functions to dump alsa PCM state + +2008-04-04 Lennart Poettering + b9c10f2: propery calculate min_avail in frames instead of bytes. don't use device_id= parameter in alsa modules if parameter wasn't specified + 064aa12: drop support for periodic timers, cleanup code a bit + 122861f: mark libpulse-browse as obsolete + +2008-04-03 Lennart Poettering + cdfcf66: - deprecate autoload stuff - allow setting of the requested latency of a sink input/source output before _put() is called - allow sinks/sources to have a "minimal" latency which applies to all requested latencies by sink inputs/source outputs - add new client library flags PA_STREAM_ADJUST_LATENCY, PA_STREAM_START_MUTED - allow client library to fill in 0 to buffer_attr fields - update module-alsa-source following module-alsa-sink - other cleanups and fixes + +2008-03-31 Lennart Poettering + ecf6439: catch up with trunk HEAD (i.e. 2118:2213) + 0e983e5: fix caps stuff for crazy people who disable caps + 316e39d: update copyright year + fa0b9b0: merge r2136 from prepare-0.9.10 + a9971d2: merge r2195 from prepare-0.9.10 + b39da92: merge r2194 from prepare-0.9.10 + 1af0d94: merge r2193 from prepare-0.9.10 + 9f71611: merge r2192 from prepare-0.9.10 + 70a459b: merge r2191 from prepare-0.9.10 + 690807e: merge r2189 from prepare-0.9.10 + 5181f79: merge r2190 from prepare-0.9.10 + a826937: merge r2187 from prepare-0.9.10 + 79938c9: merge r2186 from prepare-0.9.10 + 6734fba: merge r2185 from prepare-0.9.10 + 78bdb97: merge r2184 from prepare-0.9.10 + e382f22: merge r2183 from prepare-0.9.10 + 1be481f: merge r2182 from prepare-0.9.10 + +2008-03-31 Diego Petteno + 25f9507: fix the help for --disable-per-user-esound-socket so that it actually refers to the --disable action. + +2008-03-30 Lennart Poettering + 3e314b7: fix buildsystem to provide pa_log() in all binaries + cf37df4: rework pa_assert_se() to make sure it never gets optmized away, even if NDEBUG is defined + 68b131d: make pa_drop_caps() abort on failure + dbf9037: avoid name clash with libc's remove() function + +2008-03-29 Lennart Poettering + 829197d: fix compiler warning + ed5528f: require autoconf 2.60 since we use AC_PROG_MKDIR_P + 1c82694: bump soname + a3b8311: merge r2187 from trunk + +2008-03-28 Lennart Poettering + 0a108ec: don't fail on init if the default device does not exist and .nofail is active + fad6b41: don't segfault when module-tunnel is used without a sink_name/source_name parameter. Closes #197 + 13b9951: if we are run as root, always use 'root' as username, regardless of any env vars + 8e60b01: actually set lennart to the user name, not the group name. Set lennart too. + 2599213: Fix ioctl() definition for solaris compat. Patch from yippi. Closes #253 + b0dc80d: work around yet another solaris braindamage + +2008-03-27 Lennart Poettering + bc5e3f1: properly notify clients about suspended state when moving source output streams. Closes #244. Patch from slicer + 8298b6b: merge r2179 from prepare-0.9.10 + 4ddc327: initialize gconf module before we publish our X11 credentials -- because gconf might cause network support enabled in the first place + e21a69e: merge r2146 from trunk + 2b593d2: merge r2134 from trunk + e5e9ed6: merge r2133 from trunk + ac82029: merge r2132 from trunk + 95422a8: merge r2131 from trunk + edd1a50: merge r2130 from trunk + 02840a3: merge r2129 from trunk + a1ec3d7: merge r2128 from trunk + 46cd225: merge r2127 from trunk + daaf70b: merge r2117 from trunk + 28b7ddc: merge r2116 from trunk + cca3f49: merge r2113,r2214,r2115 from trunk + 184dda8: merge r2112 from trunk + 1eb7239: merge r2111 from trunk + 5045d26: merge r2110 from trunk + 39de4dd: merge r2109 from trunk + bc58240: merge r2108 from trunk + ec39786: merge r2107 from trunk + e704fd3: merge r2106 from trunk + b79c6b6: merge r2105 from trunk + b0a2049: merge r2104 from trunk + a451de1: merge r2098 from trunk + 2735309: merge r2097 from trunk + 640033a: merge r2096 from trunk + 9dfbfce: merge r2095 from trunk + cc59e76: merge r2092,r2093,r2094,r2152 from trunk + 1908e82: remove a redundant if check + db208e3: merge r2091 from trunk + 9f0045a: merge r2090 from trunk + f10b531: merge r2084 from trunk + 66d9e87: merge r2145 from trunk + d055127: merge r2083 from trunk + 6c106c9: copy originial l2ping license from bluez into bt helper + 14ed19c: Enable per-user esound sockets by default. Esound CVS already enables this by default, and all sane distributions ship a patched esd anyway. And those which do not should get a life and start patching esd + cefa0eb: merge r2081 from trunk + 0e23606: merge r2079 from trunk + a86a48c: merge r2077 from trunk + 5e13249: merge r2076 from trunk + aceb800: merge r2075 from trunk + e721ecd: merge r2073 from trunk + 8d5ee50: merge r2074 from trunk + c59a90c: merge r2078 from trunk + 05a7f5d: bump revision + e6bb276: create branch for 0.9.10 + 5addad2: make loading of a few more modules non-fatal + dcdf419: Double maximum sample size for some overly huge samples some distros ship + a25a459: Attempt to resolve the multilib conflicts by getting all the config files look equally for all plattforms. This includes getting rid go pathnames with libdir; let's make ps search for files with relative paths there. + 7ad0b64: modernize polkit code a bit, use new functions from pk 0.7 instead of our home-grown ones + 8a14304: rename polkit policy file to org.pulseaudio.policy to follow upstream guidelines + be9b32e: add vendor data to pk policy file + c5f78bf: Abort instead of cleanly exiting, so we can obtain a core dump and find out what was wrong. (rhbz #438594, Patch from Lubomir Kundrak) + +2008-03-26 Lennart Poettering + 7262e2f: add proper arm atomic ops support, patch from Jyri Sarha + +2008-03-15 Lennart Poettering + 106ddb9: remaining bits and pieces + b5c5064: commit glitch-free work + d6bd152: commit glitch-free work + ebecf3d: commit glitch-free work + 12c01e9: commit glitch-free work + 347cfc3: commit glitch-free work + 8d9bdac: really create glitch-free branch + dd81a90: create glitch-free branch + +2008-03-14 Lennart Poettering + 6ad7621: work around solaris printf %s and NULL string brain damage + 70d0083: change policy file to not show polkit auth dlg by default + +2008-03-09 Diego Petteno + 666b952: And one more. + 30e2a77: Test for _struct_ lt_user_dlloader, otherwise it won't be found. + +2008-03-08 Diego Petteno + 9ad7bb6: Build and run using libltdl from libtool 2.2. The user module loader support has changed drastically. + +2008-02-15 Tanu Kaskinen + 46d804d: Clarify the explanation of the in_action field in pa_autoload_entry. + +2008-02-15 Lennart Poettering + dc3682d: only call pa_ltdl_done() if we called pa_ltdl_init() before + 2b8bc5c: allow compilation on systems that lack POSIX shared memory. Patch from matthijs, closes #200 + 5552139: explicitly recommend the usage of -- in the pasuspender command line, Closes #203 + a1b2a83: look for timer_create in librt, Closes #210, patch supplied by matthijs + 0a807b3: print pa version id each time we start up, so that it is easier to identify the version people are reporting bugs again + 75e1ebd: Improve compatibility with applications which like to pass invalid strings to the libc functions we overwrite, by handing directly to the original function. Patch by Colin Guthrie and Gustavo De Nardin, Closes #227 + +2008-02-13 Lennart Poettering + 86b9ef8: deal with a possibly failing pa_channel_map_init_auto() correctly + +2008-01-24 Diego Petteno + a3e820f: Mark long_options constant. + c8a9c9b: Use check_PROGRAMS rather than noinst_PROGRAMS for test programs. + be4c0f2: Apply the fix for CVE-2008-0008 from 0.9.9 release on trunk. + +2008-01-24 Lennart Poettering + 90a7f3b: bump revision + 4d4dafb: fix CVE-2008-0008.patch + 9423e67: prepare 0.9.9 + +2008-01-06 Lennart Poettering + d36a1b8: use __BYTE_ORDER macro for detecting byte order, as suggested on http://unixpapa.com/incnote/byteorder.html + +2008-01-04 Sjoerd Simons + c5678ae: Don't send opcodes introduced in protocol versions 12 to clients using protocol version 11. (fixes #183) + 02f49a2: Implement opcodes in the tunnel modules that were added in version 12 of the protocol. Based on a patch by coling. (fixes #193) + 9774cc7: Add forgotted #ifdef __linux__ and only use SIGRTMIN if it is defined. Fixes compilation on non-linux platforms like GNU/kFreeBSD. Thanks to Aurelien Jarno for the patch + +2008-01-03 Tanu Kaskinen + 1e74aa9: Add a missing pa_xfree. + 4e77176: The previous commit introduced a new bug: giving too many values in the "control" argument wasn't detected any more. Fixed. + 39ba68b: Fix the parsing of trailing default values in the "control" module argument. + +2008-01-02 Tanu Kaskinen + dccf411: Downgraded the priority of a message, because it's really quite uninteresting. + +2007-12-29 Lennart Poettering + 9d00b9d: convert argument to boolean value before passing it on to __builtin_expect in PA_LIKELY + 2cb1b2c: add new function pa_proplist_contains() + +2007-12-23 Lennart Poettering + 2a44213: add API for resetting allocated resamplers + 7f65e79: wrap speex_resampler_reset_mem() + 81e85ce: hide proplist-test + 63c616e: add new property list implementation + +2007-12-14 Tanu Kaskinen + 8ed2a8c: Increase the maximum line length of default.pa from 256 to 1024. Load commands of modules that need multiple channel maps may grow rather long. + +2007-12-06 Diego Petteno + b94a6bc: Add a configure switch to enable the per-user ESounD socket path, but default to vanilla ESounD's path. This way distributions and users can configure PulseAudio according to their ESounD library. + +2007-11-24 Lennart Poettering + 95a98fe: Add new subsystem for applying envelopes (such as volume ramps) to audio signals + 2d34bca: rearrange #includes + 0312890: add new pa_mutex_try_lock() API + 7a42425: add new endianess macros for FLOAT32 + ca0c5af: make sure to create ~/.pulse before using any configuration file from it + +2007-11-23 Diego Petteno + 04d7a7e: Check for mkdir -p or equivalent, and use that rather than simple mkdir to create the modules, modules/gconf and modules/rtp directories. + 19ee3b6: Enable D-Bus if Bluez or HAL are enabled; use DBUS_LIBS/DBUS_CFLAGS when building libdbus-util.la. + ec91380: Fix detection of polkit_context_is_caller_authorized() function, also reported by Nix. Also fix detection of policydir for prefixes different from /usr.~ + +2007-11-22 Lennart Poettering + 9d2255d: fix uploading of samples into PA. Problem discovered by Colin Guthrie + 3e4f820: update speex resampler with newer snapshot from Speex SVN + +2007-11-21 Lennart Poettering + d41744a: Tagging release 0.9.8 + 23e3d7c: bump version and soname + 6b932f0: update man pages a bit + 40db06d: when speaking to a client with a version < 12, hide S32 sample specs, and make them appaear as FLOAT32 + 0f5fa47: increment api and protocol version + 14a9b80: - Check process name when dealing with PID files - Add new PA_STREAM_FIX_CHANNELS, FIX_RATE, FIX_FORMAT, DONT_MOVE, VARIABLE_RATES to pa_sream_flags_t adn implement it - Expose those flags in pacat - Add notifications about device suspend/resume to the protocol and expose them in libpulse - Allow changing of buffer_attr during playback - allow disabling for remixing globally - hookup polkit support + 4ac6b53: minor typo fix + 5a4959e: add short version history of the PA protocol + 63fa021: add a couple of new opcodes, and document the versions the opcodes where added + d1d0778: add API to allow runtime reconfiguration of memblockqs + +2007-11-16 Lennart Poettering + 07832d0: detect whether PolicyKit support is available + cf0d43e: build PolicyKit support + 8bdad29: add interface to PolicyKit + +2007-11-14 Lennart Poettering + 413a8f8: use a prio inheriting mutex for the threaded mainloop, to ease writing of RT clients + 461e369: use a free list for allocation pa_operation objects + 1765b13: use a free list for allocating reply_info structs + 9b75b9d: add missing pa_boolization + +2007-11-13 Lennart Poettering + 7462ab1: Rework ALSA mixer channel detection code. This time we actually care about the channel names the ALSA mixer exports for us + 4c47617: add array size to increase chance of detecting missing updates + 4a39c2e: don't fail if the bt-proximity-helper is not built + 15f56de: don't touch RLIMIT:MEMBLOCK by default. This should improve out-of-the-box comaptibility with JACK + 7b321ed: increase the pacmd timeout a bit + d17bb53: Completely rework ALSA device selection code: choose the device to open depending on the requested number of channels and channel map. In most cases it will now suffice to set default-channels=6 to enable 5.1 sound for all devices that support it + f752882: fix loading of load-once modules if no other modules was loaded before + +2007-11-11 Lennart Poettering + 5054f36: add new fun module that automatically mutes your audio devices when you leave with your bluetooth phone, and unmutes when you come back + e8092be: Port module-gconf to make use of the new API pa_start_child_for_read() + daf3a3e: pull code for starting helper processes out of module-gconf, clean it up, and stick into a new API pa_start_child_for_read() + e043eaa: add new function pa_strnull() to simplify passing null strings to non-linux printf() + f873a2a: add a simple fully-automatic fully-linearupmixer/downmixer and enable it by default + +2007-11-09 Lennart Poettering + e313fe1: tag modules that may only be loaded once at most especially, and enforce that in the module loader + d8e0c1c: minor typo + b0a68fd: optimize mixing code a bit. Add mixers for S32LE, S32BE, ULAW, ALAW and FLOAT32BE. Add volume adjusters for FLOAT32BE, ALAW, ULAW. + c1985c2: replace a few CLAMPs by PA_CLAMP_UNLIKELY + 0149031: remove PA_CLAMP_LIKELY macro because it doesn't really make sense. + 7bd3c03: .la files for modules can probably be removed safely on all archs now + 7e0f547: add support for 32bit integer samples + 3c17c7d: fix CLAMP_LIKELY/UNLIKELY definition + ecf349d: add missing #include + 42ef051: add a few missing macro definitions + cb66762: add PA_CLAMP_LIKELY and PA_CLAMP_UNLIKELY macros + c8cdb06: add support for likely()/unlikely() type macros + +2007-11-08 Lennart Poettering + 14b974a: parse the pasuspend argument like any other boolean in PulseAudio + a2121d5: strip most comments from the default configuration files, since the man page is now more elaborate and we don't want to maintain those docs redundantly at two places + 4459912: add remaing man pages + +2007-11-07 Lennart Poettering + 1ef4baf: warn if the sound server is not local + 1821f1f: add man pages for padsp, pabrowse, pasuspender + +2007-11-06 Lennart Poettering + 5dbab0b: complete pactl man page + +2007-11-05 Lennart Poettering + 0eb011b: minor cleanups of --help texts + 7fdc1ee: add a couple of more man pages + bff4ca4: add a man page for the pulseaudio binary. More will follow. + +2007-11-04 Lennart Poettering + 961ce33: fix two alignment issues found by the debian buildd gcc on sparc + faf1fd7: pa_boolization + 0184d70: add eventfd syscall nr for arm; patch from Sjoerd Simons; Closes #150 + 9ac9328: Properly terminate pa_readlink() strings. Patch from Sjoerd Simons. Closes #149 + 95af1e6: Add linker version script to hide non-ABI stable symbols in the client libraries. While this helps defining a more streamlined ABI, this also requires linking a lot of additional symbols into some PA client utilities which until now made use of the non-ABI stable symbols in libpulse. To minimize the effect on there size a bit, strip unused symbols by linking with -ffunction-sections -fdata-sections -Wl,--gc-sections + +2007-11-01 Lennart Poettering + bc161b4: comment the library versions a bit + cb0d7ff: add missing pthread libs + 81233c1: make disallow-module-loading config option work again (original patch from Diego Petteno) + 7bfd1b2: make rtprio and nice level actually configurable + 641d1fa: drop rt scheduling before we start our helper process + 41ea3b2: add new option --realtime + 005ed41: save and restore errno in sig handler + 44d7c9a: add nice and rtprio resource limit support; make rtprio and nice level to use configurable; some minor updates + e706f7b: pa_boolize the client config + 65a6bff: more pa_boolization + b343497: make the bool config parser actually parse bools + cecd8d4: fix comment + 38a1525: add new function pa_yes_no() + +2007-10-30 Lennart Poettering + 5058a1e: save and restore errno in the sig handler + 111b759: bump sonames + 0f0e729: make sjoerd happy: include ChangeLog built from svn logs in tarball + 099e690: make make distcheck pass + b03b574: rename 'length' parameters in the API to 'bytes', to make their unit clear + b84489d: handle tcp4: prefix for server specs correctly. (Closes #136) + 72817f9: rename stream names too, when the sink name changes + 201dff7: ignore updates not relevant to us + 1e0454e: rework the tunnel naming scheme, and make it follow the description changes of the underlying devices; never check for tagstruct eof, to ease later extensions + bb2e1af: initialize userdata struct with 0 + 0991a1b: remove libltdl from SVN + 2d265a9: deal properly with signals interrupting us when we wait for data from gconf helper + +2007-10-29 Lennart Poettering + f1be931: keep track of configured tunnels and make sure to unload them when they disappear from zeroconf again + e406bba: don't announce monitor sources + 5ef242c: don't try to send pause request before our stream is properly set up + 33c238b: ignore network sinks/sources + 625a872: make gcc shut up a bit more + 1dae2e6: we don't want to include assert.h anymore + 43b5c65: reverse server order for PULSE_SERVER x11 property, to follow order in which modules are loaded + cc88385: add new API pa_strlist_reverse() + 87be856: add new module module-zeroconf-discover + 9f44659: publish dns-sd subtypes to allow distinction of virtual, hardware and monitor sinks/source + 9ca7ed1: export pa_namereg_is_valid_name() + 0ce32bd: fail on name clash + ac83631: bring back module-tunnel, yay! + 9ccbd86: downgrade a few log messages + 6e1f7bd: properly deal with time pausing + a46804a: use real path of binary instead of /proc/self/exe to execute ourselves + 27d6b7b: make use of new pa_readlink() where applicable + ca98c54: add new pa_readlink() API + 1c06907: make speex-float-3 the default resampler + +2007-10-28 Lennart Poettering + c6a7f06: add missing dependency on socket-util + a67c21f: merge 'lennart' branch back into trunk. + 575541d: Merge r1502 from trunk: Move pthreads detection as it gets confused by things in LIBS. + f096ca4: Merge r1504 from trunk: Solaris hides inet_ntop in nsl + c6071b0: Merge r1505 from trunk: Make sure we link to the core to get all symbols. + 9eb840c: Merge r1503 from trunk: Make -no-undefined actually work (and fix up error found by it). + d8976a2: Merge r1473 from trunk (mixer ioctls on /dev/dsp) + b718d18: fix error handling + daa2863: don't use errno on EOF + +2007-10-27 Lennart Poettering + 94cf167: port module-esound-sink to new core + 66dc0b4: don't use SIGRTMAX, for compatibility with valgrind which apparently uses this signal + 98d363c: minor cleanup + 87faa54: minor fix to make gcc shut up + 56804de: minor fixups, to make the test more deterministic + 581e7f1: add ability to "pause" the input time temporarily. don't accidently overwrite variables we still need. + 55e4a3e: modernize pa_iochannel a bit, add pa_iochannel_get_send_fd() + c4d9a2b: add missing pa_smoother destructor + b4bb747: add pa_rtclock_usec() API + ca744a4: add pa_timeval_load() API + +2007-10-26 Lennart Poettering + ce5250e: hide smoother test + +2007-10-25 Tanu Kaskinen + 7ccf40e: Add "support" for plugins that have control output ports, i.e. don't crash on them anymore (the plugins correctly assume that every port is connected to a buffer, so we connect them to a dummy buffer that isn't used anywhere). + 81ed6e6: A couple of comment typo fixes. + +2007-10-24 Lennart Poettering + 0d84e4c: fix alsa mmap initialization bogosity, discovered by Jyri Sarha + +2007-10-23 Lennart Poettering + dc987e9: add better time interpolator: use linear regression to determine gradient from measurements, predict a short distance ahead, and smoothen estimation function with 3rd degree spline interpolation. + 9464b9b: add definition of PA_USEC_PER_MSEC + 65b570c: properly copy error string + +2007-10-22 Lennart Poettering + 498a156: also port over JACK source to new core + 02adb5f: enable jack sink in Makefile + 468c13e: Port JACK sink module over from old core + 4029504: minor fixup + 925eadd: add interleaving/deinterleaving APIs + +2007-10-17 Lennart Poettering + 1900817: Properly handle if ALSA sends us an POLLERR event, this should allow us to survive a system suspend cycle better + +2007-10-15 Lennart Poettering + 2385efe: fix url + +2007-10-07 Lennart Poettering + b0bce20: add missing poll.h inclusion + 215cac8: add missing poll.h inclusion + a687c31: add missing poll.h inclusion + 3736246: s/timespec/timeval + 2198c2e: fix build + efc81a8: add new API function pa_timeval_store() + d74fa66: Fix build; change return value of pa_rtclock_hrtimer() to pa_bool + +2007-10-04 Lennart Poettering + 87cc073: fix poll.h check, bad boy ossman broke + +2007-10-03 Pierre Ossman + cb40087: Don't call pa_rtsig_configure() when we lack the necessary defines. + 60a935b: module_ladspa used libltdl so make sure it links against it. + 586ef22: Platform dependent semaphore implementation for Windows. + cef6563: Assorted minor Windows compatibility fixes for recent code updates. + ce74146: Add stubs when RT signals aren't available. + 8dcc1fa: Adapt rtpoll and friends to Windows by replacing timespec with timeval and add a fallback when clock_gettime() isn't available. + ef8812e: Replace all references to sys/poll.h with poll.h as that's what POSIX defines. + +2007-10-01 Lennart Poettering + 7c1768d: update native protocol to make use of pa_memblockq_pop_missing + 2e780e8: Move request size handling into pa_memblockq, function pa_memblockq_pop_missing() + d6a2203: Fix race condition between IO thread creation and pa_sink_put(). Move activation of rtpoll fds when we change the state INIT->IDLE. + 9d34a1e: fix trivial typo + abd692e: fix silence initializer for alaw and ulaw + +2007-09-30 Tanu Kaskinen + dbcd086: Fixed PA_GCC_CONST definition. + +2007-09-28 Pierre Ossman + bdf9746: Update module-solaris to new structure. + 6d8aea7: Incorrectly used str2sig() instead of sig2str(). + +2007-09-28 Lennart Poettering + 67b899a: treat timer_enabled like a real, grown-up boolean variable + 33f2f49: rework module-combine once again. We now run the data generation always in a seperate thread. This should help use to avoid all the awful race conditions we had in previously + 229afb5: Move the poll() call outside the #ifdef checking for ppoll, since we want the poll in all cases. Prior to this change the check for negative return values of poll/ppoll was never actually executed when ppoll() was available + f8c1786: use the full range of RTSIGS for our stuff + 3cdff5f: Allocate rtsigs from back to front, to avoid clashes with other libraries makeing use of rtsigs + df33b4c: only do IO if we are RUNNING or IDLE, but not when we are in INIT + 584ca61: don't free silence memblocks that don't exist + 107f12a: speed up semaphore allocation with an flist + +2007-09-26 Lennart Poettering + 008c709: Use Linux eventfd() if kernel supports it + e99bc33: fix build with compilers that lack __thread + +2007-09-25 Lennart Poettering + a9e667b: make sure when can shutdown PA cleanly without segfault + 5fe1589: work around newest open() magic in fedora glibc + 1687226: fix make dist + +2007-09-24 Lennart Poettering + 86ec421: fix suspending in module-combine.c + 609ad12: * decouple suspending of monitor sources and their sinks * implement resume-on-uncork + 0e3e9e2: only post data into the monitor source when it is not suspended + f0f9df9: * add new state changed hook for streams * update sink->n_corked properly when moving streams + ac86fa1: fix IDLE vs. RUNNING state handling of sinks/sources when changing cork status for streams + 3c75d35: rework zeroconf service publishing, to use synchronous hooks instead of asynchronous subscription events. Don't push autoload entries anymore. + e37fa01: add hooks for name/description changes of sinks/source and streams + ef020c6: fix stream corking: ignore pa_sink_input() when we are in corked state + 55651ec: don't count streams using the monitor source in pa_sink_used_by(), because this would disallow suspending a sink ehn an rtp stream is connected + ba322a4: drop the PA_SOURCE_CAN_SUSPEND and PA_SINK_CAN_SUSPEND flags, since they were a bad idea in the first place. All sinks/sources are now *required* to handle suspending in one way or another. Luckily all current sink/source implementations handle it fine anyway. + +2007-09-23 Lennart Poettering + 77ed60c: instead of using the mixer ioctl()s on the dsp fd, open a seperate fd for the mixer. This allows us the keep the mixer fd open while closing the dsp device while suspending. + fc00eaf: use O_NOFOLLOW when creating lock files, too + 2860685: use O_NOFOLLOW when creating PID file, to avoid symlink vulnerability + +2007-09-23 Tanu Kaskinen + de079ac: Added an assertion for the case when the sink programmer hasn't installed the thread_mq properly. + 7bcbf16: Comment typo fix. + +2007-09-22 Tanu Kaskinen + ecad937: Fix the assignment of control values by using the right variable for indexing. + 1c44be2: Correct the parameter positions with the pa_cvolume_set() call. + +2007-09-22 Lennart Poettering + e04a857: minor optimization + 6cfb096: include the name of the master sink in the name for piggy-backed virtual sinks + c6b43bf: prefix by order macros with PA_ + 6683400: rework a couple of sample type converters, to actually work + 78a9ad3: - rework volume adjustment code to not require fp - don't hit an assert when we cannot do a volume adjustment, instead, print a warning and go on + d7a0876: fix selection of working format + 9db4267: make use of byte swap builtins of gcc if they are available + f26de80: add test program for the resampler + +2007-09-21 Lennart Poettering + c34a263: allow _unlink() functions to be called as many times as people want, even before _put() was called + 1fc168b: clamp sample data to -1 .. 1, before passing it to the plugin; if a control port data specification is left empty, initialize with the default value of the plugin + 29d25ec: add CLAMP macro + +2007-09-20 Lennart Poettering + e205bb2: don't segfault when the master changes + 3b2835d: properly detach/attach when moving sink inputs + f3f44da: rework module-combine again + c40c168: maintain the attach status in a boolean variable 'attach' accessible from the IO thread for sink_inputs/source_outputs + +2007-09-19 Lennart Poettering + 75647bc: render new data always in the master sink's thread, fixing missing locking + a8a9ee4: make sure we initialize thread private data before we move our ghost sink to the rt thread, not after + 42b71ff: fix trivial typo + d716e3c: fix check for lrintf, make resample2.c again identical to upstream ffmpeg + 75f799a: make O_CLOEXEC, O_NONBLOCK and socket low latency fd ops more uniform: always return void, name them similarly, only pass a single fd + 0fcad97: copy free_cb into a temporary variable first, to avoid compiler warning + +2007-09-18 Lennart Poettering + ac66b6a: fall back to plughw:, if hw: doesn't work, in the alsa source, too + 781cf49: properly release memblock always abd as soon as possible + 1fd9afd: make use of pa_bool_t on a few places where applicable; really start work_cb + b3093d8: lower SO_PRIORITY priority to 6, since this is the best we get without being root + ef8df41: make rtp send socket low delay + f44ddd1: add new pa_socket_udp_low_delay() API + 6b2fd23: add two missing header file inclusions + eb23601: bug fixes for module-rtp-recv + 8fdf054: make sure we don't call pa_source_post() for a monitor source after it was unlinked + ca71764: If PTHREAD_PRIO_INHERIT mutexes are not available fall back to normal mutexes + a558e93: port module-rtp-send.c to lock-free core + 08d4b23: actually close the alsa device before we try to reopen it as plughw + +2007-09-18 Pierre Ossman + 4ed41f3: strtof() is a rather recent addition to C. Fall back to strtod() if it isn't available. + aff22cf: NSIG seems to be more common than _NSIG. + 03d9863: Emulate lrintf with simple truncation if it isn't available. + 31dfb31: Make sure the header file is only included on linux (as this is a linux-only feature). + df1d347: NSIG is not defined by neither C99 nor POSIX so we can't rely on it. + +2007-09-17 Lennart Poettering + 4cde507: add LADSPA sink than can be piggy-backed ontop of another sink + 7b4f981: print a message when we fall back on plughw + 8ff7d56: add a locale-independant pa_atof() implementation + 4cdf2ce: hide sig2str-test + 1ae473b: fall back to plughw: if hw: doesn't work + 26a1ae7: Rename pa_strsignal() to pa_sig2str(), since we return the symbolical signal name, not a human readable string. This follows the Solaris API of sig2str() a bit. Also, add all remaining signals to the list of signal names. + d3b8985: drop a couple of WARNING prefixes in log messages, since we have pa_log_warn anyway for marking warnings especially + 19eb7eb: once.c is no longer POSIX specific. Since it is now considerably more advanced than it used to be, use it on windows, too + 7f9fea7: on Linu disable lazy binding altogether + a1526f1: add missing initialization + 061e806: Add a special ltdl .so loader that avoids lazy frelocations during runtime + 2741685: use priority inheritance on mutexes where applicable + +2007-09-16 Lennart Poettering + 61b90a0: add proper boolean type pa_bool_t + 116ddaa: use gcc const and pure function attributes wherever applicable + 35483ee: add a new module module-remap-sink which can be used to remap the channel maps of an already existant sink. one use case is to create a virtual sink that redirects stereo data to the rear speakers of a surround card. + 1d1eda6: add a "length" argument to the seek functions, as an optimization to request a certain block size if any data needs to be generated. this is merely a hint. + 5df7a85: split memblocks into multiples of the mempool tile size + ac1ee4e: add new API pa_mempool_block_size_max() to query the maximum tile size + fce8507: * add a new resampler "copy" which is does not change sample rates but copies data unmodified from input to output. * add a new API pa_resampler_max_block_size() which can be used to determine the maximum input buffer size for the resampler so that the bounce buffers don't grow larger then the mempool tile size + d079b48: properly define MAX/MIN macros + 87795b0: add missing header file changes for frame alignment apis + e17fbf0: be a little bit more elaborate on the reason why we drop to software volume control if hw is not featureful enough for us + 0469c84: add frame alignment APIs; don't require memory to be writable when silencing it (required of the mmap modes drivers where the hw data needs to be silenced, although it is not writable to others) + +2007-09-15 Lennart Poettering + 298d239: trivial typo + 8389264: count corked streams per sink/source and make pa_sink_used_by() return only the number of streams that are not corked. Introduce pa_sink_linked_by() returning the number of streams connected at all. This will allow suspending of sinks/sources when all streams connected to a sink are corked. + +2007-09-14 Lennart Poettering + 5ae4eed: Move attaching/detaching from a pa_rtpoll into pa_sink proper, remove it from module-combine + 3396b65: simplify rt loops a bit by moving more code into pa_rtpoll. It is now possible to attach "work" functions to a pa_rtpoll_item, which will be called in each loop iteration. This allows us to hide the message processing in the RT loops and to drop the seperate sink_input->process hooks. Basically, only the driver-specific code remains in the RT loops. + f0b9dce: explicitly destory TLS data before destroying TLS + bf274cb: add two new macros PA_ONCE_BEGIN and PA_ONCE_END which allow usage of pa_once without declaring a function to be called + 04ed0f9: call dbus_shutdown() before exiting, to make valgrind output more useful + 8775309: fix two typos in reference count handling + 9be0d70: make newer gcc shut up + +2007-09-12 Lennart Poettering + ef83a19: extend rtpoll API to allow registration of arbitray functions to be executed in the event loop. Add priority system for specifying the order of these functions. + cf3e9da: add missing config.h inclusion + 03f311a: reindent, and s/assert/pa_assert/g + 4137865: change pa_modargs_get_channel_map() to take an extra argument for specifying the name of the modargs attribute to parse + d9c4c95: add new pa_pipe_close() API to close two fds at the same time + 7f92542: consolidate close() calls to pa_close(), and make sure on every occasion that we handle failures of close() sensibly + +2007-09-11 Lennart Poettering + 54506ab: on systems where we know that POSIX shm is mapped to /dev/shm, add the ability to cleanup stale SHM segments. (Right now only Linux) + d5bedbc: remaining s/assert/pa_assert/ and refcnt.h modernizations + 2988c3d: Rework core-error.c on top of PA_STATIC_TLS_DECLARE, the windows specific parts need to be moved to thread-win32.c + abb18d9: explcitly initialize tls memory to NULL + 9c523e0: more modernizations, s/assert/pa_assert/g + 27f13b3: finish modernizations in pulse/, s/assert/pa_assert/g + 038e560: More s/assert/pa_assert/ modernizations + 391d09c: add 'wait' parameter to pa_rtpoll_run(), if zero pa_rtpoll_runn will only update the struct pollfd but not wait for an event + 597a1c4: port client libs to refcnt.h + 55d9fcb: add globally defined PA_PATH_SEP macro, replacing private per-file macros + 6ac66e4: add missing config.h includes + e2e2ce7: Instead of including config.h from header files, check whether PACKAGE is defined and if not, fail (thus using PACKAGE as a check for inclusion of config.h) + 848a4d7: more s/assert/pa_assert/ modernizations + +2007-09-10 Lennart Poettering + 9b0ab39: unify static TLS support, make use of gcc __thread attribute if available + 3d122d0: s/assert/pa_assert/ modernizations + de21b54: add new API pa_threaded_mainloop_in_thread(), update test case for it + a6f8b81: simple modernizations: s/assert/pa_assert + 6629886: make sure we send each memblock only once when recording, not twice + d5caa02: minor cleanup + a77158e: make the memchunk writeable before silencing it + 841fcb4: beef up comment + 98f9bd6: make sure that the device volume is properly read before we call pa_sink_put() and thus make the pa_sink available + 69ece66: add pulseaudio logo with text + 44e514c: update todo file a little + 6c1682c: hide a couple of files + 27c3bd4: document that the native amd64 atomic ops implementation is incomplete + 06db921: don't call pa_source_process_msg() for PA_SOURCE_MESSAGE_GET_LATENCY, since it makes querying the latency always fail + +2007-09-10 Pierre Ossman + d9b3c0e: posix_madvise and posix_fadvise aren't present on all systems. + 9630e8d: Remove mkdir_p again... + 028632f: TIOCINQ isn't present on all systems. + e176601: Monotonic clock is optional so treat is as such. + 717b164: POSIX realtime clock functions are in time.h so make sure to include it. + +2007-09-09 Tanu Kaskinen + dfdf1d7: Changed PA_SAMPLE_S16_NE to PA_SAMPLE_S16NE in the example code in the Simple API Doxygen documentation. + +2007-09-06 Lennart Poettering + b41dbfd: fix an assert when runnig module-oss in record only-mode. optimize allocation of memblocks on playback + d60940d: install libpulsecore again, since libtool otherwise links it statically into every single module + e4eefb8: fix copynpaste error + 45ba711: downgrade realtime group membership warning to 'info' at be a little bit more elaborate + 3b2cf1a: update default config: - check for existance of modules before loading them - disable all event sounds except hotplug by default + b1fd53b: explicitly test for the availability of dbus_watch_get_unix_fd() before using it. The previous version-based check didn't work anyway since the constants checked for weren't set. + +2007-09-04 Lennart Poettering + a0d19c0: update libltdl copy + a4757a1: add native amd64 atomic int implementation + 984ef82: detect whether gcc atomic builtins are available + 4c31ff9: fix a couple of compiler warnings + 2dbe137: if available, use native gcc atomicity builtins + 31c04a9: create config.rpath to fix build on fedora + ac5f978: add a few missing files for make dist + 738f7d7: drop initial libtool_lock() call since this is a debian-specific borkage + d1927c7: initialize libltdl for multi-thread support + 65ac0ea: When in PA_STREAM_AUTO_TIMING_UPDATE mode, delay completion of initialization until we have the first timing data + +2007-09-03 Lennart Poettering + c029038: actually add source code of module-default-device-restore + 11bf380: add a new module module-default-device-restore which automatically saves and restores the selected default device. Enable it by default. + 1d3e70c: header file cleanup + 104feb0: only list supported resampling methods when --dump-resample-methods is executed + c9a0df3: add new API function pa_resample_method_supported() which tests whether a resampling method is supported. Fix building with libsamplerate enabled + 5bc1221: actually define HAVE_LIBSAMPLERATE with AC_DEFINE + +2007-09-02 Lennart Poettering + b2c4779: make libpulse-core a noinst lib, because it does not have yet a stable API and won't get one anytime. Also, don't install its header files + b6bfaa9: add missing configure.ac part of the libsamplerate patch from r1753, re #125 + 2e8244b: Allow compilation without libsamplerate; based on patch from Marc-Andre Lureau; re #125 + cc8c499: fix dbus version check for dbus_watch_get_unix_fd() + 011dfa5: make argument to pa_memchunk_will_need() const + 68981e5: fix build for dbus < 1.1.1, re #126, patch from Marc-Andre Lureau + ca059ab: Don't set RLIMIT_MEMBLOCK to 0 on startup. Retain 4 pages + 3e188b1: make use of pa_memchunk_will_need() before handing sample cache audio to the RT threads + 7dbabc4: add new pa_memchunk_will_need() API, similar to pa_memblock_will_need() + f36ca79: add new API pa_memblock_will_need() and make use of PA_PAGE_SIZE macro + 2f7b6fe: add new pa_will_need() API for paging in memory + 8cf822a: make use of new PA_PAGE_SIZE macro + b54e71a: make use of new memory page alignment macros, reindent + fe1f55b: add a couple of macros for memory page alignment + +2007-08-31 Lennart Poettering + 1df817c: add pa_channel_position_to_pretty_string() to header + 718b1d2: add pa_channel_position_to_pretty_string() for usage in pavucontrol/pavumeter + 02811bf: make sure that we make include paths absolute before calling chdir() + a132226: minor reformatting + 6eb2f88: add two new functions pa_make_path_absolute()/pa_getcwd() + c627871: replace a pa_assert() by an pa_assert_se() + f59dd18: - fix suspend handling - set sink description properly - honour resample_method setting + +2007-08-30 Lennart Poettering + 241ad04: port module-combine to new core + 4d623f0: Lots of assorted minor cleanups and fixes: * s/disconnect/unlink/ at many places where it makes sense * make "start_corked" a normal pa_sink_input/pa_source_output flag instead of a seperate boolean variable * add generic process() function to pa_sink_input/pa_source_output vtable that can be used by streams to do some arbitrary processing in each rt loop iteration even the sink/source is suspended * add detach()/attach() functions to pa_sink_input/pa_source_output vtable that are called when ever the rtpoll object of the event thread changes * add suspend() functions to pa_sink_input/pa_source_output vtable which are called whenever the sink/source they are attached to suspends/resumes * add PA_SINK_INIT/PA_SOURCE_INIT/PA_SINK_INPUT_INIT/PA_SINK_OUTPUT_INIT states to state machines which is active between _new() and _put() * seperate _put() from _new() for pa_sink/pa_source * add PA_SOURCE_OUTPUT_DONT_MOVE/PA_SINK_INPUT_DONT_MOVE flags * make the pa_rtpoll object a property of pa_sink/pa_source to allow streams attached to them make use of it * fix skipping over move_silence * update module-pipe-source to make use of pa_rtpoll * add pa_sink_skip() as optimization in cases where the actualy data returned by pa_sink_render() doesn't matter + b552541: reorder initialization of pa_core variables + ca72adf: modernize and make use of a static flist for allocating idxset entries + 821eb8e: move queue processing code into pa_thread_mq + 687f1f1: add new function pa_memblock_ref_is_one() + c2e4328: fix pa_memchunk_make_writable(), make memchunk functions return the memchunk they modify + bfe69ce: add an assert() + 6817987: add pa_timespec_reset() + 747b01b: make passing a code pointer to pa_asyncmsgq_get() optional + ee97c42: add new PA_SINK_CAN_SUSPEND/PA_SOURCE_CAN_SUSPEND flag + +2007-08-26 Lennart Poettering + d88514c: drop check for gid < 500, since this isn't really a security improvement, re: #111 + +2007-08-25 Lennart Poettering + 0362350: Add option --dump-resample-methods to list available resampler implementations + 782d5a5: make floating point speex resampler the default + 89fcd51: enable -ffast-math for gcc + f82067f: lower suspend timeout to 1s + f4e2d23: include ffmpeg resampler in build + 9439e81: make ffmpeg resampler actually work + +2007-08-24 Tanu Kaskinen + 6687dd0: Corrected a bogus comment. + +2007-08-24 Lennart Poettering + f0dbbe9: add makefiles to speex/ and ffmpeg/ to easy compilation from emacs + 640ae04: Copy resampler from ffmpeg into our sources + +2007-08-23 Lennart Poettering + f754a24: make speex resampler the default + ed4dc16: big resampler rework: support integer-only resampling, support speex resampler + 4eb9bb0: fix a bad memory access when destructing pa_memimports + c1cdcfd: a couple of modernizations; parse RE sample types properly + c72d4c6: add a small speex wrapper so that we can include both the fp and the fixed-point resampler in the same binary + fdead57: build speex resampler tiwce, once for fixed point, one for floating point + 5ff891c: add a copy of the speex resampler to our sources + +2007-08-22 Lennart Poettering + b3b382d: fix minor typo + 9d38159: port remaining sinks to pa_rtpoll + 1bfa180: minor cleanups + 0ff2afd: support absolute, relative and periodic timers in pa_rtpoll + 53b872c: port alsa driver to make use of new pa_rtpoll object + 79d3ddd: reverse hrtimer check, add missing #include + b937009: add convenience functions to hook up pa_fdsem and pa_asyncmsgq to an pa_rtpoll; add pa_rtpoll_item_get_userdata(), on EINTR/EAGAIN, reset revents; automatically destory left over items + 7490977: add missing include + 0449966: make pa_make_power_of_two() and pa_is_power_of_two() inline functions + 190648a: add missing #include + 0da65cf: add message about hrtimers, and initialize pa_core::high_priority + 0af0fb8: hide rtpoll-test from svn + 7fca890: check pa_core::high_priority before becoming rt thread + b302946: add new option to pa_core stating whether we are running as high prio process + 3546198: add check for ppoll() + 8568f70: add rtpoll, rtclock, rtsig to Makefile + dc9d803: add test program for pa_rtpoll + 78c362c: add new realtime event loop abstraction which precise time keeping by using hrtimers on Linux, if they are available + 8972d06: add facility for managing realtime signals + ef2bc41: add monotonic clock abstraction pa_rtclock + 6bfeef1: rename a few things in a macro to make name collisions less likely + 531cc3c: make use of new public function pa_is_power_of_two() + b7b119a: add pa_is_power_of_two() and pa_make_power_of_two() functions + a0ad42a: add macro for creating static TLS objects + b0b06b0: add more PA_PTR_TO_XXX macros + fa7fc31: modernizations + +2007-08-20 Tanu Kaskinen + eaafb79: Modified the JACK sink heavily: * Made the sink realtime-safe. * To achieve the previous item, internal buffering was be added. New module argument: buffersize. * Removed the user's need to set the JACK transport to playing state before he could hear anything from PulseAudio. * In process of achieving the previous item, latency calculation got more inaccurate: the reported latency is now always a multiple of the JACK processing block size, and constant. * The JACK ports now have a running numbering in their names. + +2007-08-16 Lennart Poettering + 2d292be: use realtime scheduling for ALSA and OSS driver threads + 876e682: never stay root after startup, even if we don't have capabilites + 5e93816: seperately get high nice level and acquire realtime sched + d5cbf4f: Keep CAP_SYS_NICE not only in PERMITTED but also in EFFECTIVE capset + 843dcce: only suspend device when server is local + 39d1e65: truncate service names if necessary, include user name in service string + 03b0b1d: add pa_truncate_utf8() function for truncating a string and guaranteeing it stays valid UTF8 afterwards + +2007-08-15 Lennart Poettering + 81cdb37: add fedora-snapshot target + c0d6684: fix an awful race condition when handling data requests + 1ff4786: don't fail if no pa is srunning + a96c5f8: add new tool pasuspender which temporarily suspends all sinks and resumes them later again + 33c6f9d: set CLOEXEC on more fds + 5679de5: add new commands suspend-source, suspend-sink + d2d0978: add protocol support for muting sink inputs and suspending sinks/sources + 0640615: bump protocol revision and soname of libpulse + b20d204: use pa_source_suspend_all/pa_sink_suspend_all for suspending all sinks/sources + a74e804: fix muting for sink inputs + 3d92990: actually mute sinks when asked for i, add new function pa_sink_suspend_all + 6f714d9: actually mute sinks when asked for i, add new function pa_sink_suspend_all + +2007-08-13 Lennart Poettering + 44f91cf: load module-x11-xsmp from a /etc/xdg/autostart file, to make sure it is loaded when we have XSMP + 80f5abf: add load-module and unload-module commands to pactl + 8a663d4: a couple of build fixes + +2007-08-12 Lennart Poettering + 1d5e9f0: deactivate module-x11-xsmp by default, due to a deadlock when pa is being started from gnome-session + e381dd9: 64 bit fixes and minor gcc shut ups + 5e96d5d: yet another new glibc build fix + 3cbcb98: build fix for newer glibc + e6714e1: make make distcheck pass + db7fdf6: make make dist work + 55f3d34: ship full libltdl tree in SVN to make sure we can build this crack on fedora + b16d8e2: bump soname and stuff for fedora pre-release + +2007-08-11 Lennart Poettering + 1cecd46: Resurrect ability to move streams between sinks + 79a586d: add comments describing the context these functions are called from + 3d81dde: modernize pa_play_memblockq() and add a new function pa_memblockq_sink_input_new() which allows creation of memblockq streams without activating them immediately + 14d93fc: minor cleanup + 45e4954: fix latency reporting for oss and alsa modules + 06f2799: minor modernizations + 57734ec: hook into move operations for resuming/suspending devices appropriately + 44b82a1: Add 'via DMA' to sink/source description if device is accessed with mmap() + e71a347: restore the ability move record streams between sources + 50e014e: use single array for storing pa_core hook lists, add sink state changed hook, drop NO_HOOKS flags for sink inputs/source outputs, listen for resume events in module-suspend-on-idle.c + a3cd800: port oss driver to make use of the default fragment sizes as defined in pa_core: store in the sink/source description whether mmap is used; if mmap() fails, fall back to UNIX read/write mode instead of bailing out immediately + b71dde0: make sure that the device access event sound is only generated once + 447c4a5: deal with messages properly which are recieved after destruction of a stream + 107b23d: fix module-hal when no api= argument is specified + c1c59b4: add proper refcounting to pa_asyncmsgq objects, to allow destruction from the dispatched callbacks + f7b707b: allow destruction of pa_fdsem object that are still in 'poll' state + e1100b5: modify alsa drivers to make use of new global fragment setting variables + 793f750: fix default device naming and fix api selection code + a7a5f43: modernization + e2a10de: allow setting the default sample and fragment settings from the config file + b44ce9e: add default fragment settings variables to pa_core + 59c9ed5: move pstream item allocation to pa_flist + +2007-08-10 Lennart Poettering + d2fed9d: make revoke/release thread safe in the native protocol + ff4814c: add callbacks for the revoke/release stuff, so that we can make this thing thread-safe + 4e145b6: if no thread-mq is attached to the current thread, return an error, don't hit an assert + 3eae903: make use of pa_thread_mq everywhere + b3f1a13: minor update + f7171e8: Wrap two pa_asyncmsq in a new pa_thread_mq object for bidirectional, lock-free communication between a main loop and a thread + aff77c1: update thread test to use pa_once instead of pa_once_t + 27f75a5: Rename pa_once_t to pa_once + d4cb042: move pa_queue to an implementation based on pa_flist + ac49cc2: do not acces playback pa_messagq from main thread + 72840ab: minor cleanliness fixes + 357c0e4: fix closing of fds in gconf module + ffa1708: * drop redundant pa_core argument from module initialization functions * make pa__done() implementations optional * a couple of modernizations * wrap lt_dlsym() at a single place * allow passing of an "api" argument to the HAL module, to choose whether OSS devices or ALSA devices should be picked up * optimize fd closing a little on linux in the forked gconf helper * save a little memory in the xsmp module + e621071: fix minor memory leakage + 10b135a: avoid duplicate loading of modules + 1e5ca51: handle ACLAdded messages for previously unknown devices identically to a really new device + 3b078b2: Avoid a race condition when one PA instance gets HAL's ACLAdded message before the previous owner instance has given up access to the device, and thus the device is blocked + +2007-08-09 Lennart Poettering + d9e44c5: Add X11 XSMP module for hooking into the X11 session manager, for being notified about X11 disconnects before they actually happen, so that we are not killed by the bloody xlibs + 5831677: modernize + 3dfdb21: don't assume that sink/source is already unregistered from namereg when disconnect hook is called + 1c7b842: play ACL event sound only when gained access, not when losing it + b751f3a: s/login.wav/startup3.wav + 02bf2f2: update default configuration + 0f15574: protect memimpors with a recursive mutex to avoid deadlock when shutting down + e76efa9: forgot to actually add the new suspend-on-idle module source code + bb46da3: add new module-suspend-on-idle module which suspends sinks/sources which are idle for more than 5s (or any other configurable time). Power saving, here we come\! + 9c89f37: if we get access to a device we don't know yet, add it to our tree instead of ignoring it + 30ccf9a: add a couple of additional hooks for modules to use + ed01e1a: don't hit an assert when we cannot resume a device + eaddc01: by default, store esd socket in /tmp/.esd-`id -u`/socket, instead of /tmp/.esd/socket, to allow multiple simultaneous esd instances. this is only compatible with a patched esd, which however ubuntu and fedora ship now. other distros need to patch their esd as well, or may pass socket=/tmp/.esd/socket to module-protocol-esound-unix + 33cd5e2: listen for HAL ACL events; play an event sound on hw coldplug, hotplug and ACL access + 0c29a2f: add new function pa_scache_play_item_by_name + 23ba125: fix bug in handling of defer events + +2007-08-08 Lennart Poettering + a69f470: modernize module-hal-detect.c and check for ALSA pcm_class != modem + 26a0246: modernize dbus-util.c + e4e9a06: be more verbose when device does not support sampling parameters + fedca91: Remove warning when client is too slow to handle our data + df9522c: properly reinitialize pollfd array after resume + 54b9f55: properly reinitialize pollfd array after resume + 981d5fa: don't print error on socket read/write failure + +2007-08-07 Lennart Poettering + 366d1d3: reinitialize sw params after resume + 0a6f9af: add global suspend command to cli + +2007-08-06 Lennart Poettering + 1f9ce59: port esound protocol to new lock-free core + 243f2fc: minor fixes and cleanups + 74b3b6d: fix playback status querying + 455ff8d: fix a memory leak + 62790cc: fix playback over native protocol + c306b83: initialize 'length' properly + +2007-08-05 Lennart Poettering + 6775386: make sure to handle disconnecting our own connection properly + 41d67c4: minor optimization for cacheing in of samples by using posix_fadvise + 872951c: use posix_fadvise to avoid page faults when reading audio files from disk + 9d1eb1b: play memchunks completely + bd0782e: initialize method pointers properly + 241a9e1: follow rename of pstream_close() to pstream_unlink() + 55e0866: typesafe casts + 23d01bb: Modernize pstream.[ch], reintroduce defer event to make things actually work + 36dd781: modernize play-memchunk and port it to the new core + 34e4165: minor cleanups + +2007-08-04 Lennart Poettering + 81760ad: merge compat changes from trunk + 5ecaf31: compat with automake 1.10 + 7455571: jack driver build fix which became apparent on fedora + +2007-08-03 Lennart Poettering + 95fab18: Don't stop hardware on buffer underruns. Instead continue playing to guarantee that our time function stays as linear as possible. + a6c44c0: Remove unnecessary snd_pcm_hwsync() + 9a4e84a: On recommendation of Takashi Iwai prefer Master volume control over PCM and don't control Mic control + +2007-07-31 Lennart Poettering + d3eca28: rename pa_source_output_new_data::corked to start_corked to match pa_sink_input_new_data::start_corked + 0defdfb: A lot of updates, all necessary to get the native protocol ported: + +2007-07-28 Lennart Poettering + a82505e: port module-alsa-source to new lock-free core + 13a4327: minor cleanups + 6afbbba: fix suspending logic + 81aa8ea: drop data from inputs only when in running state + 1615450: It is now allowed to call pa_sink_get_volume() from thread context + 8aee345: Fix suspending/resuming + 5fbb8e1: add PA_SINK_OPENED/PA_SOURCE_OPENED macros for easier checking for _IDLE or _RUNNING states + 10cb048: restore proper mixer volume control + 9dac60c: reload OSS volume after unsuspend + dd40020: bring back alsa fd list managemet, since we need it for proper mixer change notification + 787f935: port module-alsa-sink to new lock-free core. also add mmmap'ing support while doing so. + c7df4ba: minor modernizations + +2007-07-26 Lennart Poettering + 8e4660a: Disable memory mapping if we open the device in O_WRONLY. Unfortunately we cannot do mmap() in Linux without opening the device for reading as well. + c936e53: Fix channel remapping in resample; other modernizations + 4cc0d0a: remove some log messages + 86abfbf: remove debug messages; don't queue request messages like nothing when send file is finished + bbb347f: properly free memblocks when skipping over them + 042cb09: make valgrind shut up regarding non-freed ident strings. other modernizations + bc17b8e: reverse order flist destruction and mempool allocation warning + 222a6d2: Increase ref counter of sink input as long as it is included in the sink idxset + d80fd10: properly deref sink_input/source_output objects when removing them from a sink/source + 58af737: Add fdsem to makefile + 8cdde28: reverse order of printf and push to make output more readable + bc36932: port asyncq to make use of new fdsem object + 6ad165c: add abstracted file descriptor based semaphore object that is lock-free in the best cases + +2007-07-25 Lennart Poettering + 8836396: Store strings directly in strlst elements, other modernizations + 98d36ef: fix some alignment issues and modernize file a little bit + 929526d: Convert most snprintf() calls to pa_snprintf() + 8e83838: Modernize things a little bith more + 2a43bbf: Modernize things a little + 2380ad9: add our own implementation for pa_snprintf() because NUL termination is apparently not guaranteed on windows and a couple of other libcs + 9e9dc0b: Simplify implementation of pa_assert_se() + 068f5d5: drop chunk argument from various drop() functions, since it doesn't make any sense if we want to guarantee always monotonously increasing read pointers; a couple of other fixes + 9cc20b4: update static free list usage in asyncmsgq + e339d4b: update static free list usage in hashmap + f42e443: destruct freelists properly, by using gcc destructors. we do this only to make valgrind shut up, not because it would have any real value during runtime + 279b1b3: wrap destructor gcc attribute in macro + a094923: change order of munmap and freeing of memblocks + +2007-07-14 Lennart Poettering + c76d035: Fix a couple of typos in the resampler code + +2007-07-13 Lennart Poettering + 2a19c46: Fix typo in pa_memblock_release() call; s/assert/pa_assert/ + 65d54d6: s/assert/pa_assert/g; make use of static flist for memblock allocation where applicable; properly initialize length value in pa_memexport_put() + 0e84f04: Minor clarification + f2c98d7: Make use of static flist for hashmap entry alllocation + 69bfa35: Actually make the static flist static + 3b912ac: Port module-sine to the new lock-free core + 8442926: Reenable a couple of more modules + 59faa5d: Remove a superfluous pa_memblock_release(); properly handle buf4 allocation + 63c231e: Fix concurrency bug when turning memblock into a local memblock + 481b425: Fix off-by-one in mixing code + ca5874d: Replace a couple of assert()s by pa_assert()s + ac1387d: Remove module-oss-mmap, since it is now merged into module-oss + a42c19e: Merge module-oss-mmap into module-oss and make suspending working properly + 295e1c8: Make pa_sink_render_* and pa_source_post work only when in RUNNING state, to fix handling of monitor sources when their sink is suspended + +2007-07-12 Lennart Poettering + 0a095f6: Properly initialize all revents on EINTR + 1a84664: Make sure pollfd[POLLFD_ASYNCQ].revents is properly initialized on signal + 683fc4c: fix segfault when recording with module-oss.c + +2007-07-10 Pierre Ossman + b0f692c: Make sure we link to the core to get all symbols. + a228a51: Solaris hides inet_ntop in nsl. + 689fd70: Make -no-undefined actually work (and fix up error found by it). + 405d675: Move pthreads detection as it gets confused by things in LIBS. + +2007-06-25 Lennart Poettering + eec2fbe: Port module-oss to the new lock-free core + 6312938: remove pa_memblockq_is_writable() (because it is stupid and not used anywhere anyway, and replace all assert()s with pa_assert()s + a482b9f: make sure we don't free the same connection twice + +2007-06-24 Lennart Poettering + 6776678: Limit silence buffer size for pa_sink_render() + de02c74: Track the 'missing' variable safely between the threads + d873731: rework the logic of pa_asyncq + 77ebe70: Make sure the returned pa_msgobject object has a valid refcnt before returning it + 099f3f2: Include assert.h, since we use assert() for our pa_assert() macro + a9fcd59: Fix length calculation in pa_silence_memblock_new() and make use of pa_assert() everywhere instead of assert() + fdd3ac9: Make use of dbus_watch_get_unix_fd() instead of dbus_watch_get_fd() because of deprecation of the latter + +2007-06-23 Lennart Poettering + bb3ad9d: Update OSS driver for new lock-free core + 013a55a: remove underrun condition in pa_sinks. Instead return silence in pa_sink_render() when necessary. This is required to guarantee that the time functions in connected sink inputs stays linear + 780f736: don't handle underrun special + f061636: drop silence generation from sink drivers + fff9081: fix a typo and some minor optimizations + 1c9bd20: minor cleanups and optimizations + e24c8de: Fix minor typo + +2007-06-14 Lennart Poettering + deb523e: Port module-pipe-source to the new threaded design + 94f6ab5: Fix another ugly typo, which made source outputs unusable + e279778: use pa_memblockq_push_align() instead of pa_memblockq_push() to deal with unaligned data coming from clients + 1d7096b: Show memchunk length in debug output + 1c62ce6: Fix a nasty typo in pa_asyncq_pop + 572c77f: Remove anotify.[ch], since it is now entirely replaced by pa_asyncmsgq + 5e72ac3: rework sink input/source output state machine + 260dd1e: Make debug message more useful + 1b99fd2: Move a few things between the threads + 111dcd5: trivial cleanups + +2007-06-13 Lennart Poettering + be4a882: A lot of more work to get the lock-free stuff in place + +2007-06-13 Pierre Ossman + 0694d2a: Make sure mixer ioctls work on /dev/dsp aswell. + +2007-06-11 Lennart Poettering + 6911568: make untabify + 590ae20: Add new untabify makefile target + a4fed0f: make eolspace + 00da37f: Merge HUGE set of changes temporarily into a branch, to allow me to move them from one machine to another (lock-free and stuff) + 6aeec56: add a new private branch + +2007-06-11 Pierre Ossman + 14cbbe1: Support stat() and friends as some programs (audacity) likes to check if the device node is there first. + +2007-06-04 Pierre Ossman + 13a4c52: Add support for the poorly documented SNDCTL_DSP_GETTRIGGER. + +2007-05-29 Lennart Poettering + 1e12e0e: Kill spaces on EOL + e4d63d0: add target "eolspace" to makefil to remove trailing newlines from all source files + +2007-05-29 Pierre Ossman + 5530d32: We now use gid unconditionally, so make sure it's defined. + +2007-05-28 Lennart Poettering + 67cb775: build fix for systems lacking capability suppoort. (Problem identified and original patch supplied by Diego Petteno + +2007-05-27 Lennart Poettering + 707def1: Bump revision of libs and package + 918cacb: Replace AO_xxx usage with pa_atomic_xxx and friends wherever it makes sense + 6a2dffd: unfortunately we cannot detect if a foreign thread is still running. Thus sucks. But what can we do? U. Drepper thinks our use case is invalid. + 872018e: Minor optimization: read log level character code from array + +2007-05-26 Lennart Poettering + d949983: Add a new meta command ".ifexists" to the CLI language, to execute commands only if a specified file exists. Original patch from cjvdb. Closes #36 + +2007-05-25 Lennart Poettering + 4d88fcd: when called with the setid bit change euid to uid sooner to make sure that we can access our own files even when we dropped most capabilities. (Closes #21) + 65e8761: fix suid Makefile target + +2007-05-23 Lennart Poettering + 0032642: only browse for ipv4 pa servers for now. Needs better fixing which however is not trivial and probably breaks the API + 79c94db: Fix another DoS vulnerability that has been identified by Luigi Auriemma. (Finally closes #67) + 30c52e5: add a missing initialization that causes a crash when parsing invalid volume restoration tables (Problem identified by Luigi Auriemma, re #67) + 33304ba: Fix a DoS with allocating overly large silence buffers. (Identified by Luigi Auriemma (re #67) + 4a05bc9: don't allow excessively high sample rates + cf925b1: Fix yet another DoS vulnerability, also identified Luigi Auriemma (re #67) + c3b5de7: fix minor typo + f903395: Fix another DoS vulnerability, also identified Luigi Auriemma (closes #67) + 407a1b6: fix a DoS vulnerability (re #67), originally identified by Luigi Auriemma + 8e738ed: fix a few obvious copynpaste errors when handling volumes + 0e53f93: Treat empty :0.0 identically to unset :0.0 when trying to find a PA server. (Closes #87) + 312c326: Fix module-oss for devices that return EAGAIN when we don't expect it. (Closes #66) + +2007-05-22 Lennart Poettering + 01ddb54: show socket directory when we fail to create it. (Closes #85) + 960b5cb: Fix build and only load OSS xor ALSA modules if both are available + e41b91e: drop unused variable + 16dd5f7: fix comment + +2007-03-07 Pierre Ossman + 9ee3981: Add support for SNDCTL_DSP_SETTRIGGER. (closes #56) + +2007-03-06 Pierre Ossman + f6023cb: Fix some instances where we printed a string without first checking that the pointer was valid. + e042a90: Pulsecore should be linked into all modules. + 0b14c02: Don't fail if hal doesn't currently contain any devices. (closes #55) + +2007-03-02 Pierre Ossman + 2b82336: Handle suspended alsa devices. Based on patch by ranma. (closes #26) + +2007-03-01 Pierre Ossman + 19b17ff: Revert stuff from commit 1431 that wasn't supposed to be there. + bb81243: Handle when ALSA tweaks our sample spec so much that the frame size changes. (closes #57). + 6ba21d4: Add some debugging output from sample cache subsystem. + +2007-02-14 Pierre Ossman + df47c7b: Add a wrapper around close() to work around Windows' ass backwards way of handling sockets. + 8bf7943: Allow a formatted string in the validation warning. + 3016c75: Prefix log lines with a character indicating level. + +2007-02-13 Pierre Ossman + 06211b7: Add copyright notices to all relevant files. (based on svn log) + +2007-02-12 Pierre Ossman + 1d0e8e4: Make sure we get proper host identifiers. + de7a883: Allow specification of device number. + +2007-02-05 Pierre Ossman + f65ab1b: Don't abort config loading when the user specific cannot be loaded. + +2007-01-19 Pierre Ossman + 4171f25: Make sure we report success for SNDCTL_DSP_SETDUPLEX. + +2007-01-04 Pierre Ossman + 4c0a481: Report IO error on ioctl() when we're in a fatal error state. + c992ed9: Free stream objects when they've been invalidated. + 19bd914: Fix error messages for failure connecting streams. + 521daf6: Huge trailing whitespace cleanup. Let's keep the tree pure from here on, mmmkay? + +2006-12-04 Pierre Ossman + 1a460ee: Fix silly copy-and-paste error. (closes #45) + +2006-11-24 Pierre Ossman + 68bcbd2: Fix incorrect assert. + +2006-11-10 Pierre Ossman + 7933cba: Add atomic.h as a dependency at relevant places. + 86f4c21: Make sure we package version.h.in. + +2006-11-09 Pierre Ossman + 0a37ec2: Yet again try to fix the creation of necessary directories when srcdir != builddir. + +2006-11-08 Pierre Ossman + 0ef2d7e: Support reversed endian floats. (closes #28) (closes #35) + 55c25c6: Check correct variable for return value. Closes #37. + +2006-11-06 Pierre Ossman + d4ca81f: Fix some missing line breaks. + 8dc6214: Revert r1404 and keep it on a development branch until it is fully tested. + d664492: Create branch for lock free memblock implementation. + 6ca8193: The OSS spec is unclear what should happen when a reset is requested. Let's have a nicer attitude and keep as much settings as possible. + 9776596: Handle when threaded mainloop is freed before it is started. + +2006-09-26 Lennart Poettering + d210ebb: rework memory block management to be thread-safe and mostly lock-free. + 5ad143b: upgrade refcnt.h to make use of our new pa_atomic_xxx() API + 736de36: add asynchronous inter-thread notification API + +2006-09-20 Lennart Poettering + f1021b9: enable module-hal-detect in the default configuration file only if HAL support is enabled (closes #30) + bf83a96: rename default realtime group from "realtime" to "pulse-rt", since it is pulseaudio specific. you may still pass --with-realtime-group=realtime to configure to get the old behaviour + +2006-09-19 Pierre Ossman + 71a6ceb: Revert r1398 as it broke the srcdir != builddir patch. New fix that doesn't use the $(mkdir_p) define as it isn't present on many systems. + 534eeb1: No need to create these dirs as they're part of the source tree. + +2006-09-14 Pierre Ossman + 29ab939: Stop using x86-isms and use ISO C (oversized shifts are undefined). + 5f828c2: Fix debug output for SNDCTL_DSP_SETFRAGMENT. + +2006-09-11 Pierre Ossman + 7726459: Fix up build structure for platform dependent modules. Also add implementation on Win32 for pa_once(). + a85b3e2: Use platform independent sleep. + 7c6088d: Fix typo. + +2006-09-09 Lennart Poettering + fc08db2: ignore flist-test in the correct dir + 6b1794d: ignore flist-test + 9358d28: update Makefile + 0e96d8b: make pa_mutex_new() and pa_cond_new() succeed in all cases. Similar behaviour to pa_xmalloc(). + 3ae98db: add pa_once testing code + d0dcde0: rework pa_once once again, because the once function needs to have terminated before pa_once returns, regardless whether the local call executes it or another thread does. + 6d53202: update for newer APIs: replace direct usage of libatomic_ops by usage of our own atomic.h; remove pa_once implementation; always use our pa_once implementation instead of the POSIX version + 3426a39: implement trival pa_once API based on atomic operations + c89cb6a: add static initializer PA_ATOMIC_INIT() + b93fedd: add a test program for the free list + ee40a34: implement a simple lock-free free list + +2006-09-08 Lennart Poettering + bfaa358: add a tiny wrapper around libatomic_ops: pa_atomic_int_t and pa_atomit_ptr_t. + +2006-09-07 Lennart Poettering + 791bbd8: don't maintain a list of allocated mempool slots, we don't use it anyway + 1728e3a: make pa_stream thread-safe: use new refcounting system, protect access using mutexes + 0669c99: add missing channel names (fixes a segfault when parsing invalid channel maps) + 40f18d9: fix alsa-sink example + +2006-09-06 Lennart Poettering + 40ecf86: don't hit an assert in the client if posix shm is not available + ead67cd: fix indentation + 66ec460: fix a bogus debug line + 6569199: implement a few more ioctl()s, including a subset of SNDCTL_DSP_GETOPTR. Just enough to make JavaSound work. + +2006-09-04 Lennart Poettering + e00ba02: remove yet another occurence of pthread_yield() by pa_thread_yield() + 6bbfb43: add accessor functions for the userdata attached to a pa_thread object + 3be920d: fix pa_thread_is_running() for foreign threads; fix a memory leak for foreign threads + 813e95f: port the threaded mainloop to our new abstract mutex/thread API + 8e7c2a3: make pa_thread_self() return a sensible pointer on foreign threads + +2006-09-02 Lennart Poettering + 6db6c83: add missing g_type_init() + 2536ba9: rework handling of srcdir != builddir (patch from Flameeyes) + e504e80: include PTRHEAD_LIBS in pkg-config file (patch from Flameeyes) + b01fabf: update acx_pthread.m4 + 6528b6b: allow building when srcdir != builddir (patch from Flameeyes) + a00c3cb: fix a few autoconf warnings (patch by Flameeyes) + 11b6c45: fix esdcompat for non-gnu systems + 161c2c0: make esdcompat executable + 5fa9cdb: Merge FreeBSD compatibility patch (from Flameeyes) + +2006-09-01 Pierre Ossman + 647ef18: Fix call to pa_mutex_new(). + f84c65e: Add pthread_once() equivalent support. + 3571bf1: Thread implementation for Win32. + +2006-09-01 Lennart Poettering + 97202d1: fix a race condition with stream connection vs. latency measuremtn (found by theBear) + +2006-08-31 Pierre Ossman + 6e3de3d: Make sure libatomic_ops.a isn't included in win32 builds as libtool doesn't like static libs in dlls. Everything is in the headers anyway, so we do not need it. + 6e9706b: Also wrap yield functionality so that it can be platform independent. + +2006-08-31 Lennart Poettering + 0f6098b: work around bug in firefox which apparently misuses access() as NULL pointer test. Original patch by "alon". (Closes #27) + aee4a37: define AO_REQUIRE_CAS in the Makefile instead of each source file, effectively reversing r1348 + 7ce39d3: update todo + +2006-08-30 Lennart Poettering + 2f6cc4f: fix handling of "running" variable + +2006-08-30 Pierre Ossman + ad0535b: Add AO_REQUIRE_CAS as we do. + a6b99d5: Make sure the libatomic_ops lib is included. + c4e47c6: Remove check for libatomic_ops library as some systems have no (zero, nada) symbols in it. + 078420a: We need to have a callback when changing volume or we might deadlock. + +2006-08-29 Lennart Poettering + b2c341f: add a threading primitive API + 5264d23: make pa_mempool_stat thread-safe/lock-free + 327e0cd: modify memory block reference counting to use the new reference counting API + 9948cb0: add lock-free reference counting macros, based on libatomic-ops + 91d8025: add libatomic-ops to hard dependencies + +2006-08-28 Lennart Poettering + a633944: fix an misdesigned assert() + +2006-08-28 Pierre Ossman + 5ecbd9e: Add PulseAudio logo to tree. + cd47673: update todo + +2006-08-27 Lennart Poettering + 1ed3347: increase operation timeout + +2006-08-26 Lennart Poettering + bc87a58: bump version and sonames + b8ea488: fix module-combine when used on top of a tunnel sink + +2006-08-25 Lennart Poettering + 93e005a: update module-tunnel to latest protocol + 8ead68f: activate HAL in the default config + +2006-08-24 Pierre Ossman + aec3888: Add missing header. + +2006-08-23 Lennart Poettering + 8f5b86b: fix handling of "mtu" module argument (patch by "theBear") + +2006-08-23 Pierre Ossman + 2575b44: fix typo + 79c4a68: Make the recording a bit more chunky so that we can fit in the pool and have efficient blocks. + +2006-08-22 Pierre Ossman + b27ffbe: Remove silence generation in solaris module. + d194604: Remove silence generation in waveout module. + 095f357: Proceed with connect even when no cookie is loaded. Allows you to connect to server which do not require a cookie under all circumstances. + 306aea7: Fix memory leak in waveout module. + 0249651: Log when there is a problem opening the waveOut/waveIn device. + 7bf2540: Fall back to creating a "normal" memory pool if unable to get a shared one. + 26bfce6: Improve error messages a bit. + cf7b401: Fix up portability of memory pool handling a bit. + 10bbc4b: Fix detection of shared memory support and proper fallback. + 568c8ea: Fix typo. + eeabf63: Add missing header. + b5ef414: Fix call to pa_memblock_new(). + d964459: Fix detection of page size for non-POSIX systems. + 7bc7110: Fix missing header for timeval helpers. + 1c320fe: Fix calls to pa_memblock_new(). + 6e3d8af: Add header for pa_cstrerror(). + 8a16c73: Fix call to pa_pstream_send_tagstruct(). + 25c0640: Add an ifdef for when we do not have creds. + +2006-08-22 Lennart Poettering + fef4a20: update todo + 22d8e0e: fix typo + +2006-08-21 Lennart Poettering + 26201b2: fix pactl output (sink drivers and names where switched) + +2006-08-19 Lennart Poettering + 3d32b96: update todo + 3dbc4ae: restore the sink/source for a client in addition to the playback volume. This changes the file format of the table file. To avoid parse errors ~/.pulse/volume.table has been renamed to ~/.pulse/volume-restore.table + bffde5d: If a client leaves the sink/source for a stream unspecified by passing NULL as sink/source name sink/source we should pass NULL to pa_sink_input_new()/pa_source_output_new() as too. This allows hooks to change the sink/source device only if it is left unspecified by the client + bf62e77: fix a bad memory access + ce11b1f: update todo + c0b3e8b: when transferring large memory chunks of a pa_pstream, split them up + 79b2628: update todo + 84d1d3e: update todo + b642325: check for posix_memalign and friends + 3e0f00f: if MAP_ANONYMOUS is not supported use posix_memalign if possible to allocate the memory pool + d50c56a: update todo + c6ca9a8: print per-type memory block statistics on "stat" + 57f0b08: generate per-type memory block statistics + 16ff83f: update todo + af87c7d: rework the resample to allocate temporary memory with pa_memblock_new() instead of pa_xrealloc() + 521d15b: fix a memory leak + 1b7fff3: update todo + 47c7a14: add --disable-shm command line option to the daemon + a8519d5: add "disable-shm=" to default daemon configuration file + dbc658d: add new "disable-shm" server config option + c9b6d55: add default "disable-shm" option to client.conf + d785b8f: add new "disable-shm" option to client.conf + 206ac6f: allow importing of external shm data blocks unconditionally, even when local SHM support is disabled + 046bdd9: deal properly with pa_mempool_new() failing + 8c9bdb8: fix allocation of anonymous memory + c2db5f8: fix a memory leak + +2006-08-18 Lennart Poettering + c979b87: update todo + 40875d6: enable SHM support on the client side only if both the client and the server run as the same user and the server supports it + e33abc3: activate SHM support on the server side only when new client supports it and when client and server have the same UID. + c313b23: one s/0/NULL/ + 7ac7909: remove export/import objects when SHM is disable for a pa_pstream object + fd3fe96: add new function pa_mempool_is_shared() to test whether a memory pool is suitable for SHM data transfers + 7e01b1c: hide memblock-test + e385d93: remove all occurences of + 1bc62d5: rework logging subsystem, to implicitly include __FILE__ in pa_log() calls. In addition we now record the line numbers and function names of pa_log calls. However, those are only shown If $PULSE_LOG_META is set. + 666eca3: update todo + 8ebef4d: look for shm_open in -lrt + 35caf0c: add new test memblock-test for testing SHM import/export + c3fc2ea: update tests for new memory manager + 0e436a6: Rework memory management to allow shared memory data transfer. The central idea is to allocate all audio memory blocks from a per-process memory pool which is available as read-only SHM segment to other local processes. Then, instead of writing the actual audio data to the socket just write references to this shared memory pool. + ff48681: add abstracted shared memory API + 20d0823: fix a bad type cast + dfa17b9: cleanup hashmap.[ch] a little: use hash/compare func prototypes defined in idxset.h, add pa_hashmpa_{get,steal}_first + 8be0cf6: cleanup idxset.[ch] a little: define proper types for the hash/compare funcs, do ptr->int/int->ptr conversions with clean macros + +2006-08-17 Lennart Poettering + c3df1ce: fix a PA_LLIST_HEAD_INIT invocation + a847f74: add missing #include + d890660: modify pa_bytes_snprint() to return the string we just wrote to. This should be binary compat with older versions which returned void + 99db067: make PA_LLIST_HEAD_INIT thread safe + +2006-08-15 Lennart Poettering + 1c3bfc4: use the description field of sinks/sources to name the zeroconf services, instead of the logical name + +2006-08-14 Pierre Ossman + 6c39af7: update todo + +2006-08-13 Lennart Poettering + 5d8d916: update todo + 2bf4653: extend module-rescue-streams to move also source outputs when a source dies + 3334814: fix a segfault when registering a service with avahi fails + cdb173f: create rtp source output on correct source + d182a0b: minor optimization + a75e1ed: implement hook_source_ouput_new. For this I modified the pa_source_output_new constructor to take a struct similar to what I already did for pa_sink_input_new() + e0f7e86: split a validity check into two + 79cb80c: implement hook_source_disconnect + 8f91b1f: define new hooks: hook_source_output_new, hook_source_disconnect + a09a49e: update todo + a7b9a7d: Load module-rescue-streams by default + dd87061: implement new module "module-rescue-streams" which moves sink inputs away when their sink is removed. + 8180832: properly implement a pa_sink_disconnect() hook + 87e64d5: Clean up module description a little + abbabd8: ignore if we recieved a memory block for an invalid stream, since this might happen unwillingly due to the asychnronous nature of the protocol + 72cf211: remove pa_sink_input::variable_rate field since it has been folded into pa_sink_input::flags + 3beef50: hide hook-list-test + b37ad1f: modify module-volume-restore to change the initial volume of a sink input from a hook instead of an asyncronous subscription event. + a621d90: allow hooking into the process of creating playback streams. To implement this I modified the pa_sink_input_new() signature to take a pa_sink_input_new_data structure instead of direct arguments. + b5cbea9: fix bad printf() + db3f561: rework hook list stuff once again: change the callback prototype to recieve three data pointers: one to the data for the hook, once for the slot and once for the call + 281125c: rework hook list stuff again, and replace macros with real functins. We loose type safety but things are much cleaner now + +2006-08-12 Lennart Poettering + 2622b0c: update hook list test + 82a913d: reall add type safe hook list + 80d73dd: implement typeafe hook chain + 7f70ca3: extend maximum sink/source name length, because HAL UDIs can get ridiculously long + 17964dd: update todo + 02e083c: test if sink->monitor_source is set before making use of it + dbe6bdd: make use of pa_sink_used_by()/pa_source_used_by() wherever applicable + b5207fc: add pa_sink_used_by()/pa_source_used_by() + b45c392: categorize todo file + 28f86ea: name the sink/source after the device file, just like we already do for the non-mmaped driver + bf79e97: generate default sink/source names from the device files they belong to + 0050176: update todo + 4c9c426: handle hot-remeving of OSS devices properly + 3cfed30: print the device capabilities after opening the device + fbeeb8b: when the requested sample format is not available for OSS devices, print a nice warning and take what we can get instead + 0547b0f: there's no need to queue subscription events if noone is listening, hence don't do it! + c86890d: * only load an OSS driver for the first device of a sound card, similar to what is done for ALSA. * fix a mem leak + 7fa0744: fix a segfault in module-oss + 2d70271: fix pa_gettimeofday() return value testing + adfa76c: update todo + 365ceec: update todo + 3aba099: clean up event generation a little: suppress unnecessary events and generate new ones on owner change + 47d009a: rework subscription code: try to drop redundant queued events + f8e5f47: fix a compiler warning + e9d9356: add new macro PA_LLIST_INSERT_AFTER + 1e12c75: update todo + 8da9b94: allow setting the null sink description by a module parameter + +2006-08-12 Shahms E. King + bb96156: increase module argument buffer size to prevent truncating names + +2006-08-11 Lennart Poettering + bfa6604: don't set the sink/source descriptions manually, use the new functions pa_{sink,source}_set_description() instead + af1b031: comment which values in pa_{sink,source,sink_input,source_output} structures may be NULL + c90dd53: * introduce new functions pa_sink_set_description() and pa_source_set_description() for changing the description of a sink/source * allow sinks without monitor sources attached + 0aebc03: update todo + bfff23d: shorten sink/source device descriptions a little + 1d7b8e1: use the HAL UDI for naming input/output devices + 539612a: do not export name validity checking routes and apply them only to sink/source names, not sample names + e1316f5: fix bad memory access and a leak when detructing ALSA fd lists + 576c4dd: rework name register a litle to only allow "valid" names. + bf854c4: Build HAL support only when either OSS or ALSA is available + dcd3acc: remove OSS specific code from module-hal-detect if HAVE_OSS is not set. Same for ALSA + 7a4e1c9: ALSA: handle write()/read() errors properly by unloading the driver module. This should fix problems when removing USB audio device while pulseaudio is running. + b0b968d: change order of the ALSA event dispatch code to make sure that the code survives if the event dispatcher frees the ALSA client + 59f1a67: use the copied udi string as hash key for the device table, because the temporary one is freed when the function exits + +2006-08-08 Shahms E. King + 7ee7a23: add HAL support for OSS devices and capability changes + +2006-08-07 Shahms E. King + b382df5: clean up hal patch to use pa_xnew and timeval compatibility wrappers + +2006-08-07 Lennart Poettering + 5d8ccfd: try to reduce volume updates in the ALSA sinks/sources: only touch the shadowed hw volme if necessary + +2006-08-06 Lennart Poettering + d953870: * add SVN $Id$ tags * add a const + 050b739: merge HAL support from Shams E. King + +2006-08-03 Lennart Poettering + f74e5ef: update todo + ad95c96: implement "pactl move-source-output" + e52436b: implement pa_context_move_source_output_by_{name,index}() + 5fdc39d: wrap pa_source_output_move_to() in the native protocol + 1c45061: add new CLI command move-source-output as wrapper around pa_source_output_move_to() + 2d00de5: Implement pa_source_input_move_to() for moving record streams between sources + ddc69fc: - don't call pa_sink_notify in pa_sink_input_new() because the virtual methods are not yet initialized at this time - some minor cleanups + +2006-08-01 Lennart Poettering + 7f93d08: bump API and protocol version. Return PA_ERR_NOTSUPPORTED if pa_context_move_sink_input_by_*()is called for servers that don't support it + +2006-07-31 Lennart Poettering + bc30e2d: add new "move-sink-input" command to pactl + bb9b087: wrap PA_COMMAND_MOVE_SINK_INPUT for libpulse + 785477b: add new native protocol function for moving sink inputs between sinks + 304fcbb: add new commands opcode for moving sink inputs and source outputs + ccf67d2: deal properly with recursive module unloading + e2e94ca: fix bad memory access if a non-existing entry shall be removed from a pa_idxset by index + +2006-07-29 Lennart Poettering + d7ee1bc: fix module-gconf initialization + 646deea: don't hit an assetr if there are operations outstanding when the pa_context is destroyed + a7cf5e0: fix two typos (pierre, have you been sleeping? next time please the comments wrong but the code right, not the other way round! ;-)) + a1e8b09: add new CLI function "move-sink-input" as wrapper around pa_sink_input_move_to() + 5e92950: * implement "hot" moving of playback streams between sinks (pa_sink_input_move_to()). * optimize the adjusting of the volume in pa_sink_input_peek() a little + 4dd3b31: free the memblockq if we decide not to play it + f15b4c7: if the memblockq is empty, return -1 in all cases + 9310a2e: fix calculation of pa_usec_to_bytes, to make sure that it never returns fractions of a frame size + b325e07: handle EOF correctly if it is read before the stream was created + +2006-07-28 Lennart Poettering + d1db037: for the playing field of pa_timing_info use pa_sink_input::state == PA_SINK_INPUT_RUNNING. This means that this variable will now refer to the current state and not to the expected future state, which is probably more what clients expect. + f1c4611: fold the seperate variable pa_sink_input::playing into pa_sink_input::state as state PA_SINK_INPUT_DRAINED. The following mappings hold: + 12aa842: introduce pa_play_memblockq() which creates a playback stream and passes the data from the memblockq to it. after that is done, frees the memblockq + +2006-07-27 Lennart Poettering + ecd4655: update todo + c21f88c: load module-gconf in default install + 0dea223: introduce three virtual sink/source names: @DEFAULT_SINK@, @DEFAULT_SOURCE@, @DEFAULT_MONITOR@. Especially the latter is useful for connecting to the monitor source of the default sink. + fec7e9b: if possible do not unload already loaded modules when the gconf settings change. instead try to reuse already loaded modules as much as possible + 87d4f0b: because gconf doesn't provide real transactions we emulate our own with a "locked" gconf key + 6afb61e: remove superfluous code + +2006-07-26 Lennart Poettering + 358e577: remove two superfluous lines + 0d7be31: mainloop fixes: when disabling time events when dispatching them, make sure to adjust the cache time event and enabled time event counters + b2ad9a9: add some protection that the gconf helper process will be killed when the daemon process dies. make sure the gconf helper process doesn't keep open file descriptors belonging to the daemon; if gconf helper path + f5d29ac: add missing configure.ac checks for module-gconf + cc1d821: add new module "module-gconf" which reads configuration information from gconf. this will be used in my upcoming paconf module + +2006-07-25 Lennart Poettering + 61ce8bb: add new command line option --no-cpu-limit. This is useful when running PulseAudio in valgrind's massif or callgrind tools + 563fab9: Results of profiling PulseAudio with valgrind's callgrind module: rework the default event loop implementation to use PA_LLIST_xxx instead of pa_idxset; don't generate weakeup events if we aren't in STATE_POLLING; minimize dispatching of io events; cache next time event instead of traversing the list of time events on every event loop iteration; other optimizations + 216bdd4: split a few asserts + 32444f0: split a few assert()s + c41d749: add a few more g_assert()s and change all assert()s to g_assert()s + +2006-07-24 Lennart Poettering + 675bf2f: add autogen.sh for jhbuild (for you, elmarco!) + 0f8f5bc: bump version and sonames + +2006-07-23 Lennart Poettering + 3aac893: add massif target to Makefile + c85351b: as a result of memory profiling with valgrind/massif: decrease default hash table size from 1024 to 127. the hashtables are sparsely filled most of the time, so there is no point in allocating to much memory by default. + 95eee87: update todo + +2006-07-22 Lennart Poettering + 07a1c45: fix horribly broken glib timeout event handling + +2006-07-21 Pierre Ossman + b345af2: Use proper @libdir@ in pc.in files to handle x86_64 machines. + +2006-07-21 Lennart Poettering + a84a2f9: raise the default value for RLIMIT_NOFILE to 200 since 25 is apparently too small if every single GNOME apps thinks it needs to create its own server connection! + +2006-07-20 Pierre Ossman + 09e01af: Get ACL:s to work on Win32. + 4a59581: Fix incorrect call to nonexistant pa_log_warning(). + 0762af2: Only warn when running as root and not --system. + f3d4924: Centralise check if we're running as root. + 57d8a31: Move check for SUID into the caps functions. + 8d2dc9c: Handle user switch in a more platform independent manner. + b12f29d: Make sure parse_rlimit is only used when rlimits are supported. + 246e30a: Add missing header. + a3e7595: Make -1 mean "current group/user" so that some platform dependent calls can be centralised. + 7ba93eb: Protect platform dependent headers with ifdefs. + 2ad6938: Remove unneeded headers. + +2006-07-20 Lennart Poettering + 40b4089: remove access group setting from default client.conf + 55e97b8: fix a few @@ replacments + 6ad1f33: even more FreeBSD portability (thanks Flameeyes, again!) + 90b521d: add missing #ifdef HAVE_CREDS (thanks, Flameeyes) + 2683f25: some more FreeBSD compat from Flameeyes + b3d3d16: bump release and sonames + da1ec27: remove configurable client access group, since can never work on Linux anway, since SCM_CREDENTAILS doesn't allow sending supplementary GIDs + dd5fd8d: update todo + 44beeaa: implement "auth-ip-acl=" in the native and esound protocols + db75f68: actually ship src/pulsecore/creds.h in the tarballs + 30ada90: add IP address ACL subsystem + 2409f1a: add support to set resource limits for the daemon and set some of them to some sane values + 0ff247d: undo r1111 in some way: include sys/socket.h and sys/un.h but wrap it in #ifdef HAVE_xxx_H. This should be safe because config.h should be the first included header in all .c files and creds.h is never included by any external tools + +2006-07-19 Lennart Poettering + 703bb49: add a few comments + a382492: * add new function pa_check_in_group() * abstract credential APis a little bit by introducing HAVE_CREDS and a structure pa_creds * rework credential authentication * fix module-volume-restore and friends for usage in system-wide instance * remove loopback= argument from moulde-*-protocol-tcp since it is a superset of listen= and usually a bad idea anyway since the user shouldn't load the TCP module at all if he doesn't want remote access * rename a few variables in the jack modules to make sure they don't conflict with symbols defined in the system headers * add server address for system-wide daemons to the default server list for the the client libs * update todo + 340803b: use access group dedclared in ~/.pulse/client.conf instead of PA_ACCESS_GROUP + 2b31a90: update @@ tokens according to recent Makefile.am change + 45a9a8b: fix sed scripts according to #define renames + 9c87a65: * add new --system command line parameter to the daemon for running PulseAudio as system-wide instance * add PA_ prefixes to all global #defines * modify auth-by-creds: define a new group "pulse-access" which is used for authentication * add proper privilige dropping when running in --system mode * create runtime directory once on startup and not by each module seperately + +2006-07-18 Lennart Poettering + 9db7068: remove glib 1.2 adapter. It started to bitrot and wasn't used by anything anyway. + d7cdaf2: add two more \since + f4ec7d4: fix module-detect on FreeBSD (patch from Diego "Flameeyes" Pettenó) + 2c2abbb: turn the glib adapter into a single GSource instead of creating a bunch of seperate GSources for each event + ddd5acf: define proper typdefs for callback prototypes + +2006-07-17 Lennart Poettering + 64d87ac: change licensing blurb form "Library GPL" to "Lesser GPL" on request of Loic Minier. Effectively this means using the same license blurb like in all other source files. + +2006-07-17 Pierre Ossman + f5afb7b: Forgot to protect one access to with_creds with an ifdef. + 4b352e5: Restore SIGPIPE warning when the platform doesn't have MSG_NOSIGNAL. + +2006-07-16 Lennart Poettering + ba31adc: make pulseaudio compile again on FreeBSD (patch from Diego "Flameeyes" Petteno) + e45b1dc: todo + 9ced7f6: show summary after "configure" has run (closes: #22) + 3b2843d: show value of PA_SINK_HARDWARE/PA_SOURCE_HARDWARE in pactl + b91dd23: set is_hardware flag for a few hw plugins + 494fa68: add new PA_SOURCE_HARDWARE/PA_SINK_HARDWARE flag + 6e38949: add a new boolean variable is_hardware to pa_sink/pa_source to denote wether the specific device is a hardware device or virtual/software + +2006-07-15 Lennart Poettering + a537b01: update todo + +2006-07-14 Lennart Poettering + 55a8db8: improve latency calculation of NULL sink + d43bcb3: update todo + b8f9ae0: remove checking for SIGPIPE blocking from client code. Because we use send(,,MSG_NOSIGNAL) for most socket writes now the reason for SIGPIPE blocking is no longer give. We keep this check for the server side however, because pipes create SIGPIPE too but cannot be used with MSG_NOSIGNAL. Some modules use pipes for internal and external communication. + fc544a6: don't send SCM_CREDENTIALS on every sendmsg(), instead do it only on handshake + 3eeecdc: don't set MSG_NOSIGNAL for recvmsg(), since it doesn't make sense there + 860be2e: try to use send(,,MSG_NOSIGNAL) instead of write() wherever possible (which will allow us to drop the SIGPIPE check). Cache the results of the last write()/send() to make sure that we do not issue more than necessary system calls. + 350a253: remove vi'ism + dfd864a: update todo + 883ce83: add new test get-binary-name-test for testing pa_get_binary_name() + a87c43d: Don't call pa_path_get_filename() anymore since it is implicitly called by pa_get_binary_name() anyway + 881d4dd: * fall back to prctl(PR_GET_NAME) in pa_get_binary_name() if readlink() fails * call pa_path_get_filename() in all cases before returning in pa_get_binary_name(). We already did so on Win32, but didn't on Linux. + +2006-07-14 Pierre Ossman + 82e680c: Make sure the win32 default conf gets shipped. + +2006-07-13 Lennart Poettering + 5529604: support time events with NULL timevals which are OK in avahi, but not in PA. This makes padevchooser actually work on top of the new avahi browsing stuff + 7484b62: update todo + ceb1b6f: remove avahi/howl item from todo list + 3f0f4f5: remove howl-wrap.[ch] + 6f24a9d: remove HOWL snippet from configure script + 1fd18d6: * add proper error handling to pabrowse.c * properly destroy pa_browser object on exit + d989c69: add browser.h to doxygen docs + 76f93a0: * port libpulse-browse to use the native avahi API instead of the HOWL cruft * add new function pa_browser_set_error_callback() * add doxygen docs to browser.h + 3a81620: update module-zeroconf-publish to make use of the native AVAHI API, instead of HOWL + 10f7a64: make sure gccmacro.h and cdecl.h may be included at the same time as those headers from the avahi project + 8162164: check for avahi in configure.ac + +2006-07-10 Lennart Poettering + 3428f03: mark HAL for shams king + +2006-07-08 Lennart Poettering + 9c96bdc: * remove doc/ directory * move doc/todo to root dir + f87f3c8: unhide a few files + +2006-07-08 Pierre Ossman + e12ead7: Remove some unused m4 files. + eb4abb2: Fix typo. + +2006-07-07 Lennart Poettering + e16cdb5: remove all docs from tarball since they are now available on pulseaudio.org + 9a778bd: s/avahi/pulseuaiod/ + 7fe5e5f: replace remaining ML refs to polyp + 81eb4a2: fix mailman URL + 9e45991: update readme for 0.9.2 + +2006-06-30 Pierre Ossman + 8b0d134: Make sure we print the file name we actually use. + +2006-06-21 Lennart Poettering + 18b8b84: increase the maxium number of concurrent esd and native connections + 045b05c: include config.h in browser.c (closes #20) + 1710041: only interpolate when the last timing info told us the stream is indeed playing + +2006-06-20 Lennart Poettering + 74e958c: bump version number + 84907e6: fix segfault when module-alsa-source fails to load + +2006-06-20 Pierre Ossman + 320bedb: Fix handling of the io flags in duplex mode. + 1040b69: Warn when applications use SNDCTL_DSP_GET[IO]PTR even when they shouldn't. + 07edf59: Make fix_metrics() exit early so that it doesn't spam the output needlessly. + 1342999: Make sure we do not use pthread_yield() on platforms that do not have them. + 3b28358: Check for pthread_yield() as not all platforms have that. + 6ca46f4: Make interpol-test build on Win32 and non-pthread systems. + 3ff68bd: Fix the final few occurences of polyp. + +2006-06-19 Lennart Poettering + 230f97a: s/POLYP/PULSE/g + 6654e98: update docs + 3cf1621: * more s/pulseaudio/PulseAudio/ replacements * name the per-user dir ~/.pulse (instead of .pulseaudio), just like /etc/pulse/ + fe1dadb: update references to the pkg-config files in the docs + 0d97ac6: name the pkg-config files after the library names + 10b5e99: replace a few remaining uppercase "Polypaudio" occurences with "PulseAudio" + 955e33d: hide pulseadudio binary from SVN + 25f7969: rename polypaudio.h to pulseaudio.h + f44ba09: big s/polyp/pulse/g + dd21f11: unhide padsp + f6d1154: hide interpol-test + 40494c3: * rework latency interpolation to make it smoother * increase latency update interval to 100ms + 6eabab6: minor cleanups + 9f59b4e: add new test "interpol-test" + +2006-06-19 Pierre Ossman + c6d4cc0: Handle clients that just want to set fragment size (and not count). + +2006-06-18 Lennart Poettering + bd432f0: * add new argument 'exit_on_eof' to module-cli and make use of it if "-C" is passed to the daemon + +2006-06-17 Lennart Poettering + 5e1127a: * implement volume adjusting and mixing for S16RE * some optimizations + e26bd47: * make hw param settings easier to debug by splitting up long if * actually set the sample rate * disable resampling done by ALSA + +2006-06-16 Pierre Ossman + 8485a47: /dev/dsp should default to U8, not mulaw. + e66b0e6: Creating a stream might take some time, so check that it's in the right state before transferring data. + 6684264: Record support. + +2006-06-16 Lennart Poettering + a529b28: if S16NE is not supported, fall back to S16RE. If FLOAT32NE is not supported, fall back to FLOAT32NE. If still nothing is supported, try everything else in order + +2006-06-15 Lennart Poettering + 8e37d68: update todo + +2006-06-15 Pierre Ossman + 3fa491d: Make debug output in padsp a bit less verbose. Specifying -d twice will give original output. + +2006-06-13 Pierre Ossman + dd0f80e: Make a copy of the va_list as vsnprintf() is free to change it. + 0f13c43: Catch the access() system call as some applications do this to test if they can open /dev/dsp. + b5a8815: Make sure our inet_ntop() implementation gets linked into the new users. + 9288479: Tweak the printing of client connections a bit so that it's more apparent what and who it is that's connecting. + 7582f74: Handle pretty printing of IPv6 socket names. + +2006-06-12 Pierre Ossman + 519aa9b: Use AM_ICONV to determine what needs to be done for iconv support. (closes #19) + c32176b: Fix AC_CHECK_DEFINE so that we can look in different files for the same define. + 7c770e2: Also look in winsock2.h for INADDR_NONE. (solves #18) + 15a0b28: Properly escape the m4 macros and make the code a bit more readable. + +2006-06-11 Pierre Ossman + 75ac45b: Add all the preopen libs to the polypaudio binary's dependency list as they aren't automatically detected. (Closes #17) + +2006-06-03 Lennart Poettering + d8dafa0: rework ioline EOF handling to actually work properly + 2fa08ba: fix pa_xstrndup() implementation to not access potentially uninitialized memory + +2006-06-02 Lennart Poettering + 16a275a: actually build cpulimit support if SIGXCPU is available + 441362a: fix ugly access-after-free bug when doing asyncronous NS lookups + 8b0e6f6: update docs for 0.9.1 + e092336: bump version and soname + 7b961bd: Add new configure options to disable/enable specific modules at configure time. Original patch by ed@catmur.co.uk. (Closes #16) + +2006-06-01 Pierre Ossman + 02bfa3c: update todo + 7a52eab: Try the ltdl mangled name ourselves so that .la files for modules are optional. + +2006-05-31 Lennart Poettering + 8ca9568: remove superfluous prefixes from service names + ac7213d: update TODO + 79b6c31: decrease maximum allowed sample frequency for ALSA devices to 5%, since 48000 would otherwise match with 44100 + +2006-05-30 Lennart Poettering + 9f2026d: downgrade a log message + 64fa5b8: * alsa-sink: if "PCM" is not found as mixer track name, fallback to "Master" * alsa-source: if "Capture" is not found as mixer track name, fallback to "Mic" + bb820db: * if an ALSA device doesn't support the channel count requested, use what ALSA suggests instead * if an ALSA device doesn't support the sampling freq requested, use what ALSA suggests and resample if this deviates more than 10% from what we requested * fix segfault freeing an unitialized mixer_fdl field + 821a49b: update todo + 73eedcb: load alsa modules with device string hw:0 instead of hw:0,0 + 6140619: fix amd64 portability issues + +2006-05-29 Lennart Poettering + 21cb51b: merge patch from Igor Zubkov, fixing linking of the HOWL modules + ce04f0b: update svn:ignore to reflect the esdcompat name change + 632f5b4: drop the .sh suffix from esdcompat + +2006-05-26 Lennart Poettering + 3a868be: update README for 0.9.0 + f5a8885: disable padsp for the polypaudio daemon itself by defining the __padsp_disabled__ symbol + +2006-05-26 Pierre Ossman + c8e9fa3: update todo + 12dc4c2: Fix the fix_metrics() function so that we don't get a tiny buffer by default. + 7d90e3a: Fix typos. + 6aeaaf9: Returned buffer attr is const. + d142408: Explicitly check version number when determining which fields are in a stream create response. + +2006-05-25 Lennart Poettering + 099304a: update todo + 7d97534: * add new API function pa_stream_get_buffer_attr(). * modify pacat.c to make use of that new API * extend protocol to allow transfer of the necessary information * update protocol version accordingly + f3b7259: really fix a superfluous warning when building padsp.c + 4413b89: * split pa_cstrerror() into its own file polypcore/core-error.[ch] * fix building of padsp * remove a warning when compiling padsp.c + f8aa55c: move modules to ${libdir}/polypaudio-${PA_MAJORMINOR}/modules/ + fc8a2c4: add item about moving pa_cstrerror() to TODO + e07b262: update todo + ae80ab3: read stream and client name from $PADSP_STREAM_NAME resp. $PADSP_CLIENT_NAME, if available + 2bbd7ba: add support to disable emulation of /dev/dsp,/dev/mixer,/dev/sndstat selectively by either passing an environment variable or by defining a symbol __padsp_disable__ in the process + 2bb05ea: fix evil, evil typo that cause all gtk2 based apps to crash + 59d00e2: * issue volume updates syncrhonously * correct channel order of OSS volumes (swap left,right) + 0fb63e7: update TODO + +2006-05-25 Pierre Ossman + b754d50: Wrong prefix used in the padsp script. + d39740f: We only need the so for libpolypdsp. + ea7995b: Fix padsp script so that it accepts parameters, setting relevant environment variables as needed. + 0387b30: Use only the basename of libpolypdsp.so so that it will work on multi-arch systems. + 1799b7a: Move libpolypdsp in the makefile to avoid the libtool bug where it must come after any things it depends on. + +2006-05-24 Pierre Ossman + 6a7172e: padsp needs dlsym & co so make sure we get that lib included. + 3fa19ab: Fix warnings. + 2843b1a: Remove the exceedingly anal warnings. It's impossible to write a non-trivial C program and not trigger these. + c4328cd: Fix stray \ + +2006-05-24 Lennart Poettering + ca08e57: implement a /dev/mixer interface + 440b901: fix playback of small sound files + +2006-05-23 Lennart Poettering + 46fee46: implement emulation of /dev/sndstat + 23b123d: - use pthread_atfork() to disable open sound streams in the child after a fork. Obviusly sound won't work in child process but at least we don't leak fds from the parent. Now any operation on the device fd in the child will result in an EBADF error, which seems somewhat clean to me. + e99afda: pass the binary name as client name to polypaudio + 1031549: add new padsp utility: a $LD_PRELOAD wrapper for using the OSS API with polypaudio + 8f111b0: change return type of pa_cstrerror() to "const char*" + +2006-05-23 Pierre Ossman + 7906985: Cast size_t to long to be more compatible with 64-bit systems. + 1b72d02: Fix some warnings. + +2006-05-22 Pierre Ossman + d71dc9b: Fix TLS on Win32 to something a bit more safe and portable (compiler-wise). + 4e3dc7c: Wrap strerror() in a function that makes it thread safe and converts the output to UTF-8. + bf09399: update todo + +2006-05-22 Lennart Poettering + 97ec77c: add missing #include + +2006-05-21 Lennart Poettering + cc84fc9: add missing #include + 651e575: add new function pa_usec_to_bytes() as inverse of pa_bytes_to_usec() + +2006-05-20 Lennart Poettering + bc87137: doc update + 13329d3: fix long-standing buf that could cause polypaudio to eat 100% CPU: fix handling of event bits for pa_iochannel + cc61b57: rename pa_simple_get_playback_latency() to pa_simple_get_latency() and allow its usage on capture streams + +2006-05-19 Lennart Poettering + acc6552: generate PA_MAJORMINOR properly - only from major and minor, not from micro + +2006-05-19 Pierre Ossman + a3fe39a: Fix some missing headers. + a034b61: Fix which headers get installed for libpolyp. + c811351: Sort source files. + +2006-05-18 Pierre Ossman + 1dfe8f8: update todo + 1379831: Convert log text to current locale before passing it on to stderr or syslog. + 8359188: Make paplay convert names to UTF-8 before sending to the server. + 4981092: And functions for convertion to and from current locale and UTF-8. + 40d9f5d: Missing include of util.h. + 24a7819: Don't include util.h from core-util.h as it is not needed by many users. + 3ee2051: PATH_MAX needs limits.h. + 9ec9d28: update todo + 0796ead: Move timeval calculation functions into their own file. + +2006-05-17 Lennart Poettering + 5f458db: update README for 0.9.0 + 38cb138: modify lirc module to use pa_sink_mute() for muting and unmuting + 53a285e: fix include line for "core-util.h" + 40feedb: add C++ macros to utf8.h + ee4d6b0: add C++ macros to xmalloc.h + dc9151d: * add doxygen docs to header file * add C++ macros to header file + 6766a3b: add util.h to doxygen + 813868e: include util.h in polypaudio.h + c47e937: split polypcore/util.[ch] into polypcore/core-util.[ch] and polyp/util.[ch] + fbdb063: replace memory allocation function calls with pa_xXXXX() + 43813dc: include more files in polypaudio.h + 41baddd: add doxygen docs for utf8.h + 56d8e56: * make pa_xfree() a real function * update doxygen docs for xmalloc.h + 6e9f2d7: add utf8.h and xmalloc.h to doxygen docs + ee35a06: add new channel map argument to pa_simple_new() + 5f6d8c9: fix svn tag + cdd3588: more sensible default.pa file + 1cfb01a: add proper locking when accessing the file match.table + e0bf4a3: add proper locking when accessing the file volume.table + 1267285: add documentation for module-volume-restore + 6d281a5: update todo + db242e1: update todo + fa53ed7: * support native ULAW/ALAW file streams * fix shutdown of file streams + b47b257: support loading ULAW/ALAW files into ULAW/ALAW memchunks + e669553: * use S16NE for SF_FORMAT_PCM_S8 formats, too + 31a9d4f: when playing an ULAW or ALAW audio file, do not convert to S16NE unconditionally, instead use sf_read_raw() to read raw audio data + 106fb20: increase PA_CHANNELS_MAX to 32 + 270a409: use PA_CHANNEL_MAP_OSS in module-oss, module-oss-mmap + ed3606c: add new channel mapping standard PA_CHANNEL_MAP_OSS + +2006-05-17 Pierre Ossman + 7ca25e5: Move utf8 to the public part (libpolyp). + d9cc2cf: Move xmalloc to the public side (libpolyp). + e767fda: update todo + 6ab4213: Update documentation to contain the UTF-8 requirement. + d4d1e5e: Documentation for the threaded main loop API. + 71f681a: Set default channel map system for waveout module. + c752e11: Add Microsoft's WAVEFORMWATEEXTENSIBLE channel mapping. + 05c1468: Use default channel map for Solaris module. There doesn't seem to be a standard for > 2 channels, so we'll have to rely on the user. + +2006-05-16 Lennart Poettering + 4b6ab29: * modify pa_channel_map_init_auto() to take an extra argument specifying the standard to use (ALSA, AIFF, ...) * add some more validity checks to pa_source_new(),pa_sink_new(),pa_sink_input_new(),pa_source_output_new() + c63cc7b: change version number from "0.9" to "0.9.0" to make version comparisons easier + c2c8539: bump version number to 0.9 + 5521559: * add new configure option --with-module-dir= * drop version suffix from soname of libpolyp and friends * add version suffix by default to $(modlibexecdir) + 9298990: update todo + c12206b: * remove .a files from the modules directory after installation * rename $(modlibdir) to $(modlibexecdir) in accordance with secion 11.2 of the automake docs ("The two parts of install") + f272e59: tell svn to ignore the utf8-test binary + 56b685a: instead of kicking clients with invalid UTF8 stream names, filter invalid characters and use that instead + 5359593: add new test programme utf8-test.c + bf58753: add svn:keywords property + 78b23cc: add double include protection + e8cc63d: * remove "const" from return type of pa_utf8_filter() since it desn't make any sense * fix pa_utf8_filter() to not skip the next character too if it found an invalid one + 23e7454: use the new latency update callback to be notified when latency data becomes available again after PA_ERR_NODATA is returned by pa_stream_get_latency() + 724cd9d: downgrade a log message + 713637c: * fix segfault in pa_utf8_validate() * remove some compiler warnings * use our own pa_xmalloc() implementation instead of libc's malloc() + +2006-05-15 Lennart Poettering + 19167a1: add notification callback which is called when new latency data becomes available + 7a92f36: undo r868 + 147da3e: remove regex.h from include, since it is actually not used + +2006-05-15 Pierre Ossman + 9c8661c: Add function to filter a string of any invalid UTF-8 sequences. User must free() the result. + e91740f: Clean up the UTF-8 validation code. + 9c38744: module-volume-restore uses regexp() so make sure it's only built on systems that have it. + f468308: Include utf8.h for the validation function. + +2006-05-14 Lennart Poettering + 3f42878: update TODO + 45bbb34: add utf8 validity checking to esound protocol + d419d87: remove superfluous log line + cfb082a: take the filename specified on the command line as default stream name + a414cc2: check for valid utf8 strings + bf52fb9: add utf8 validity checking API + b10f2dc: update todo + b3e1655: add new module module-volume-restore which saves and restores volume of playback streams + be05b18: * add new parameter to pa_open_config_file() to specify open mode * modify pa_sink_input_new() to take initial volume settings as argument * call pa_sink_input_set_volume() when changing stream volume in protocol-esound.c to make sure that subscribe events are issued properly + e46f8f8: modify argument order of pa_client_new() to actually match how it is usually called + +2006-05-13 Lennart Poettering + 682dfd7: fix esound sample cache names + 0f22d63: * set default fragment metrics depending on the sample specs of the device in OSS and ALSA * fix fragment size calculation in module-alsa-sink + 0231e6e: first set buffer size, and afterwards period size + c3b9c3d: don't hit an assert when trying to resample data for 6channel audio + 7abf17e: fix fragment size calculation for module-alsa-source + b681202: use default alsa channel map for alsa devices + afdec05: remove superfluous log message + +2006-05-11 Lennart Poettering + 11782f0: fix hangup detection for recording streams + eecc04c: fix iochannel for hangup signals + f931486: update doxygen docs + 68b98f7: don't signal the accept_cond automatically when waiting for a signal event + e929aab: split of signal releasing into its own function and name it pa_threaded_mainloop_accept() + dbf62d4: add thread-mainloop.h to doxygen docs + +2006-05-11 Pierre Ossman + af54f9f: Windows support for the threaded API. + 3890f03: Remove some debug code that wasn't supposed to be committed. + 5328afe: pa_write() should use a const pointer. + 48d66cd: Handle pipes on platforms where they are non-existant of broken. We do this by creating a TCP socket pair instead of a normal pipe. Since Windows isn't UNIX-y enough to support read()/write() on sockets, we also need a wrapper to handle read() vs recv() and write() vs send(). + 12d4b5d: Include log header to get rid of warnings. + 18c5340: ANSI codes aren't supported on Windows terminals. + 6d2a936: Do WSAStartup() in the DLL entry routine instead of at context creation. + +2006-05-09 Lennart Poettering + 2687017: fix handling of timing status requests + 9efc206: update todo + +2006-05-09 Pierre Ossman + 4e71f20: Add stubs for the threaded main loop so that we can compile it on non-supported platforms (still can't run it though). + 06e1867: Use pa_msleep() to get platform independence. + +2006-05-06 Lennart Poettering + df3306c: rework the simple API to make use of the new threaded mainloop implementation + 4b4c8fd: * optionally, make pa_threaded_mainloop_signal() wait until the main thread took over control * more header file comments + 5f9bbf0: add support for reading audio data from a file instead of plain STDIN in pacat-simple.c + bb6c45d: remove bogus check that disallowed latency interpolation and stuff for record streams + 3f92e3e: allow signalling from event loop thread + +2006-05-03 Pierre Ossman + 4cff5d3: update todo + +2006-05-02 Pierre Ossman + c2c9f25: Fix control flow in pa_oss_open(). Also fall back to half duplex when device doesn't support full. + 27cee2e: We need to read the cookie in binary mode for things to work correctly. + 1438bd4: Windows doesn't have POSIX thread. ifdef out things for now. + +2006-04-30 Lennart Poettering + 9e60bad: add new threaded main loop implementation (with test/example) + f2fbceb: * make sure the wakeup fd is polled on wven when no other fd is registered for polling * initialize mainloop return value to -1 * some optimizations + +2006-04-28 Lennart Poettering + 19c9dbf: fix date + +2006-04-28 Pierre Ossman + 6060bff: When a control is removed, all bits are set so we need to test for that first. + 53930f4: Zero the fd list since we do a memcmp on it later. + +2006-04-27 Lennart Poettering + cd93661: ouch! + +2006-04-27 Pierre Ossman + 22c679e: Clarify how the automatic channel map is generated. + 99612dd: Channel map argument support for solaris. + 0b95438: Channel map argument support for waveout. + 2c08180: update todo + +2006-04-26 Lennart Poettering + c29b3f1: doc update for 0.8.1 + dff0822: bump version number + 9564cef: fail if the channel map doesn't match the sample specs + c27b140: allow the user to specify an alternative channel map in paplay too + d78e466: fix volume range printed on --help + 7b83904: if a sample is not yet loaded, don't print rubbish about its channel map + d4bad65: it was a bad idea to require that a channel map doesn't contain the same position twice + c3cc141: allow specifying the channel map to use on the command line + c478b0f: * make a validity check of parsed channel maps before rteurning theme * don't overwrite the return buffer unless the parsed channel map is known to be valid + 185a57c: support new channel_map argument in sink/source modules + fbb0d14: add support for parsing channel maps as module arguments + 292b237: don't allow channel positions to be specified twice in the same channelmap + 5f7cc0c: add new test 'channelmap-test' + 195e969: * add new function pa_channel_map_parse() * increase PA_CHANNEL_MAP_SNPRINT_MAX * add "top" channel positions + +2006-04-26 Pierre Ossman + 31ad62f: update todo + +2006-04-25 Pierre Ossman + 129853f: update todo + 69096f2: Fall back to software volume if hardware mixer cannot control all channels. + f426b58: glibc <= 2.2 has a broken unistd.h, lacking setresuid(). + +2006-04-24 Lennart Poettering + 820c118: * rework reference counting in the client libraries: now refcounting goes strictly "one-way" - the "bigger" object refcounts the "smaller" one, never the other way round. + +2006-04-24 Pierre Ossman + d266213: chown() and chmod() aren't available on Windows. + fade8b0: Undo invalid automake version requirement. + +2006-04-23 Lennart Poettering + b92344f: fix a segfault when uploading samples with esound + 3590ee7: * add validity checking for sample_spec, channel_map and cvolume structures * return PA_ERR_TOOLARGE when the user tries to upload a over-sized sample * notify the user if uploading a simple faield due to some reason + 286310a: small optimization + 9b52ac4: fix sample uploading + e1ac42d: enforce maximum sample size in sample cache + cdba052: * fix ref counting of pa_stream: strictly refcount from context to stream and never vice versa to make sure that we never loose memory * don't hit an assert() in case of a timeout events + 193fb12: introduce a new error PA_ERR_TOOLARGE + 335e234: * when playing back a sample from the sample cache, just take a pa_volume_t and not a pa_cvolume_t as argument for the volume. Usually it is not known to the player of theses samples how many channels it has, hence it doesn't make any sense to allow him to pass a by-channel volume structure here. * fix volume calculation when playing samples from the sample cache + 4e61ebb: fix multiplication of software pa_cvolumes + b4ac6d0: allow recieving of invalid channel maps, volumes and sample specs. This makes handling of uninitialized data better, e.g. when sending info about lazy-load sample chache entries, where the channel mapping and sample spec is still unknown. + 8345063: * Merge build system patch from Igor Zubkov * Build libparseaddr.so before libsocket-client.so + +2006-04-22 Lennart Poettering + 2bb8283: remove superfluous "set -ex" line + 985da9b: require automake 1.9 in configure.ac + f6fc410: modify x11 modules to not cache the Display variable since pa_x11wrap_get_display() is now used as notification that the x11 output buffer needs flushing + ec65ca6: when loading sound files, initialize channel map data properly + 5e50f84: fix x11 handling + 55e19cb: fix sample cache + 0e02e84: * for unix sockets: remove the right parent directory on shutdown * other cleanups + a4fedcf: add new function pa_parent_dir() + 513df3b: first unlink the socket, the close it + b0059c6: try to remove the directory where the PID file resides in after removing the PID file + 0cc2e04: chown() and chmod() /tmp/.esd/ before checking if everything is ok with it + +2006-04-20 Lennart Poettering + a7c5ed1: replace copy by symlink when installing homepage + 5f804cb: minor improvements to the LICENSE text + 9c06f5a: ship GPL and LGPL files with the tarball + 81381c4: add new explaining LICENSE file + 2decb6a: * rename "LICENSE" to "LGPL" * add GPL text * update LGPL text in regards to FSF addresses + +2006-04-20 Pierre Ossman + 1b46097: update todo + +2006-04-19 Pierre Ossman + e4b53b2: Tweaks for the solaris module. The sound system requires complete frames to be written. Also, the sample counter can magically go backwards sometimes, causing havoc with our buffer handling. + 989fa58: Sun's documentation about SIGPOLL on EOF:s is wrong, so use a timer based solution instead. + 1d51247: Minor fixes for the way Windows handles sockets. + e1513ce: WaveOut needs to have rather large chunks. This is about as low as we can go without getting underflows. + 5342f3a: Win32 needs to have the socket subsystem initialised. + 6ae8511: Having constant deferred events isn't allowed and causes problems. Use timers instead. + 4bb5822: Reverse order of IPv6/IPv4 binding to handle systems without IPV6_V6ONLY. + +2006-04-18 Lennart Poettering + 494f602: make proper use of the muting facility of sinks in module-mmkbd-evdev + 746adcf: fix a couple of issues I found when compiling polypaudio with gcc 2.95 + 60008cb: fix CFLAGS for jack modules + 9ad753e: fix "make distccheck" properly + 65fd9b3: fix make distcheck + e454bb1: Documentation updates + c35052a: add JACK module documentation + a5100be: fix connecting of jack source in jack daemon + a809129: build jack source + 768a6f2: fix code for pre-C99 + f8dbc2f: * fix pa_random_seet() function prototype * drop pa_ prefix from pa_random_proper(), because it is a static function + abea726: add a jack source module + cf85794: * allow the user to set the jack client name * take the number of channels for the sink from the number of physical ports in the jack server * name the polypaudio ports in the jack server after their channel position in polypaudio + +2006-04-18 Pierre Ossman + c22a0c1: Make the probe for RNG sources at runtime since the configure script isn't compatible with cross-compiling. + e4b2a47: Clarify that JACK libs are optional. + 074b7c1: More fixes caused by Sun's complete inability to follow any standard whatsoever. + 18055e4: update todo + 2d6ab01: We need to emulate sendmsg/recvmsg to support rtp on Windows. Will do this some time in the future. + c3087d0: Avoid including non-portable header sys/poll.h. + 8b99a06: C99 requires explicit marking of integer literals' size. + +2006-04-17 Lennart Poettering + 4482e68: add new JACK sink + +2006-04-16 Lennart Poettering + 40f171f: * add pa_mainloop_wakeup() calls for deferred events * place pa_mainloop_wakeup() calls a little bit more carfully, to minimize needless wakeups. + 76296ca: add new API to replace the poll() function used by the main loop implementation + a8bb073: properly initialize session counter + 7871f41: add documentation for the new RTP modules + 2f3fa42: limit number of concurrent RTP streams + 08397d9: fix typo in module description + e1887b5: change default mcast address once again, to make sure our traffic doesn't leave the network by default + 68a6d61: ignore symdef file of module-rtp-send + b04a4e6: rename module-rtp-monitor to module-rtp-send + 3b803e7: * make sure RTP ports are chosen to be even + c999fe4: * deal properly with underruns, overflows and packet losses * change default mcast address * detect RTP loops + 67b105b: * increase default MTU * change default mcast address to 224.0.1.3 * randomize RTP ports by default + 998affc: replace homegrown endswith() with pa_endswith() from util.h + 0990d8c: initialize random seed globaly from $RANDOM_DEVICE + d50255a: * add new check for $RANDOM_DEVICE * move AC_SYS_LARGEFILE to avoid autoconf warning + a176d77: todo update + f1ddf05: * add RTP/SAP/SDP reciever module * use server cookie as RTP SSRC * enable SVN keywords * add new option "loop" for RTP sender module + +2006-04-16 Pierre Ossman + e75cc68: Fix ALSA fd handling to be compatible with blocking deferred events. + e8d9a5d: Clarify behaviour of deferred events. + +2006-04-15 Lennart Poettering + 1fec416: * change default multicast address * fix timestamp calculation + 71227de: correct some types + +2006-04-14 Lennart Poettering + e0e2b8f: * ignore some more files * make necessary changes to Makefile to compile RTP module + 9522b44: add an RTP sender module + 86ad601: minor beautification + +2006-04-13 Lennart Poettering + 9539dc4: minor doc updates + c383a4c: * add a link to Cendio to the README + d981ace: remove yet another item from the todo list! This means we are now read for 0.8! + 7e8d46e: unbreak module-tunnel + d153fda: remove yet another item from the todo list + 010c049: include in-flux resampled chunk in latency calculations of playback streams + c25c549: fix latency calculations of module-combine + 9854cfc: hmm, nothing important + fe64b89: add code to allow polypaudio dump preloaded modules using "--dump-modules" + d4b22f3: make --enable-force-preopen the default for SVN builds + 1f7a008: add new configure option to enable preloading even on architectures that support dlopen(). Useful for debugging + df108af: update documentation for release 0.8 + 5639b7e: doc updates + 20f4ae6: more documentation updates + ceb09d8: Documentation updates + +2006-04-12 Lennart Poettering + b33ae79: remove yet another item from the todo + 7fa8323: include local record memblockq in latency calculations + 06bd27b: when storing recording data in file, create file with proper access rights + 4a8d318: yet anotrher fix for slow links + 0af582a: small fix to deal properly with slow links + bf88854: * dispatch defer events in pa_mainloop_dispatch() and not already in pa_mainloop_prepare() * fix the "timeout" parameter of pa_mainloop_prepare() * remove pa_mainloop_deferred_pending() and update the simple API accordingly + 853caf1: * fix latency calculation where a full playback buffer was erroneously taken as empty buffer and vice versa. + 0fa56f9: remove a bunch of log messages + d427942: beefup pacat a little: * when -v is passed, show current playback time and latency * modify SIGUSR1 behaviour to show only playback time and latency + 49b3150: * rename "latency correction" to "write index correction" * add read index invalidation code * rename "ipol_event" stuff to "auto_timing_update" * remove buffer_usec field from pa_timing_info, since it can be easily calculated from write_index and read_index anyway * add read_index_corrupt field to "pa_timing_info", similar to the already existing write_index_corrupt field * restart automatic timing update event every time a query is issued, not just when the last event elapsed * proper invalidation code for pa_stream_flush() * do tarsnport/sink/source latency correction for playback time only when device is not corked + 77c2a1f: protocol change: don't send stream buffer size in latency update. This data is redundant, since it can be calculated from write_index - read_index anyway + b5d177d: proper validity checking for pa_context_is_pending() + a0c7ca0: when flushin a memblockq, set the write index to the read index + 64d0d9b: todo update + +2006-04-10 Lennart Poettering + 268c857: unbreak fresh SVN builds + b2668ca: return the error code and not just -1 when pa_context_is_pending() fails + a81209f: validity checks for pa_context_is_pending() + 09589a7: update todo + 021744d: * Beef up latency calculation in module-oss-mmap * Add recording latency code for module-oss-mmap * other cleanups + 8f2d9ae: minor cleanups for OSS module + 9332708: when using record mode, allow file to save data to to be passed on the command line + 6a3b8ae: todo update + 137f0a7: * implement PA_STREAM_AUTO_TIMING_UPDATE * accept PA_STREAM_NOT_MONOTONOUS properly + 190a869: add new PA_STREAM_AUTO_TIMING_UPDATE + 4496954: Lennart is blind + 35ea8ac: update TODO + f4119ad: unbreak last commit from ossman + +2006-04-09 Pierre Ossman + 0d200ee: Use the modern Ki/Mi/Gi prefixes to clarify that 1024 is the base. + a6ce5c4: Big documentation update. Describe the client API in a more tutorial like manner. + +2006-04-08 Lennart Poettering + a742536: clip volume at PA_VOLUME_NORM for alsa devices + 025228f: add proper volume clipping support for OSS devices + b4a5474: when doing software volume adjustments, don't use the volume value as linear factor, but pass it through pa_sw_volume_to_linear() first. + +2006-04-07 Lennart Poettering + 107525c: remove another item from the todo list + a546c76: * show flags value when dumping sink/source info in pactl. * show volume for sources, too * show value of "mute" field for sinks/sources + f6d95b7: add new introspection data field for sinks/sources: a flags field which specifies whether the sink/source supports hw volume control and latency querying + 272ab20: todo update + 4af16e4: minor cleanups + 7261494: remove item from TODO list, since it requires the SNDCTL_DSP_GETERROR ioctl() which isn't supported by the Linux kernel + 2f918f0: todo update + fdb48b4: * enable write_index correction and timing interpolation only for playback (and record) streams + 22558b5: fix pkg-config files + e5a5b56: remove yet another item from the todo list + a9f4896: hdie some more + b8a729a: * update docs for reworked latency API * rename pa_latency_info to pa_timing_info, since that describes better what it is. Most people will only use pa_stream_get_time() anyway + c0592bb: update simple API for new latency API + 53a0056: update pacat.c for new latency API + 920f045: rework latency querying API (this needs more testing) + cc302f2: remove queue length field from latency request (server side) + +2006-04-07 Pierre Ossman + add110b: Some memcpy arithmetic that wasn't removed when doing the redesign to update the data pointer instead. + +2006-04-06 Lennart Poettering + dd9605b: * really pass the ipv6 socket server to protocol_new in case of ipv6. * create the pa_modargs object properly when using TCP * other cleanups + 1be0017: change pa_gettimeofday() to return a pointer to the struct timeval*, instead of an int + e872c75: s/index/idx/, to avoid gcc warning + 73035a8: * set IPV6_V6ONLY for IPv6 sockets, to avoid warning when both ipv6 and the ipv4 sockets try to bind to the same port * enable SO_REUSEADDR only on platforms that support it + ac3d11f: remove some GCC warnings introduced by improperly casting to (char*) instead of (const char*) + +2006-03-31 Pierre Ossman + acb96c9: Fix some warnings caused by size_t having varying size. + 3285403: Large file support. Polypaudio probably doesn't need it, but it causes warnings when linking libpolyp with applications that do. So this is just to make life easier for other applications. + +2006-03-17 Pierre Ossman + 8d4af80: update todo + +2006-03-11 Pierre Ossman + dc5b2c5: We no longer guarantee that an operation object is returned. Need to tweak some parts to handle this. + da90b05: Remember to store the struct with module info. + +2006-03-08 Pierre Ossman + 3ef4970: We filled the volume with the wrong channel count (we used the input, not the output) causing static. Also swapped the comments since they were misplaced. + +2006-03-07 Pierre Ossman + 528d150: The extra stream ref actually did some good. Re-add it, but with some more symmetry, assertions and comments. + b67963c: We've already set an initial reference count of 1 so don't count it up again. + 6457137: Trying to listen on an IPv6 socket by default and only do IPv4 if that fails (which it doesn't most of the time) is terribly confusing. What the user most likely wants is for it to listen to both IPv4 and IPv6 and gracefully continue if only of them succeed. + +2006-03-05 Pierre Ossman + 90d6a91: update todo + 53c266f: Fetch sound card name into sink/source description. + 06eaebf: update todo + 7387342: Volume support in tunnel module. + 4e56725: It's safer to set buffer size than to try setting number of periods. + f22d8ab: Return the proper error code so that we get a correct error message. + 7b6a9c3: Tried to get the volume information even upon init failure. + +2006-03-04 Pierre Ossman + dcd202f: Update module-tunnel to the new protocol. + 45baa69: Fix warning caused by missing return in main(). + ad7640b: update todo + 4e52294: Alignment safe protocol handling in esound module. + +2006-03-02 Pierre Ossman + bc97b29: Negotiate protocol version between server and client. Will allow smoother protocol modifications in the future. + fbaaf5a: The tag argument is no longer unused. + 50268e0: Fix warnings on 64-bit systems. + 6cc11fb: Handle the new latency protocol. This is just a quick fix and does not handle the new memblockq system. + 7f04568: typo fix + +2006-03-02 Lennart Poettering + 8cf9b97: protocol changes for new latency API (partial!) + +2006-02-27 Pierre Ossman + 76f56ab: update todo + 5b9849e: update todo + 4756d18: We have both sink and source in this module. + e8b3819: Catch volume update events. + 1bb14c3: 64-bit fixes. + f59bc1f: Fix some signed/unsigned warnings. + e37f008: Function prototype didn't match actual definition. + +2006-02-26 Pierre Ossman + 0c65922: update todo + 1e68539: Get notifications about mixer changes from ALSA. + ae07d5a: Handle ALSA file descriptors more correctly. This means a bit more overhead, but following their API properly should avoid problems in the future. + c119996: Fix correct default device. + b125e1c: Hardware volume support in ALSA modules. + +2006-02-24 Lennart Poettering + c5ec39d: move scatter/gather todo item to post-0.8, since it's impact on perfomance might not even be worth the effort. + 0d8da54: todo update + 4358977: * Add new "auth-group=" parameter to protocol-native-unix * Rename "public=" argument of protocol-{esound,native} to "auth-anonymous" + 3f264b2: add support for authentication using SCM_CREDENTIALS + b967aeb: todo update + 903b8c0: todo update + c2304d6: add a few more validity checks to protocol-esound + +2006-02-24 Pierre Ossman + 25bcc10: Do an explicit cast to shut up gcc. + c3a2670: This wasn't supposed to be checked in. + b418809: Wrong variable used for port. + 9f1b793: Tweak the handling of missing credential support so that we minimise non-POSIX headers in our headers. + a1f5573: Call correct function. + c205ea6: Make local function static. + 9366ab9: Hardware sink mute support. + 3374df5: IGAIN is a better choice than IMIX for source volume. + +2006-02-23 Pierre Ossman + 65736a2: Some new additions were mislabeled as '\since 0.9'. + 04c8926: Mute switch for sinks and sources. This is independent of the volume setting (similar to ALSA). + bd4ae44: update todo + 607b279: update todo + 79e8009: Hardware source volume support. + 4e8faa6: inet_pton expects in[6]_addr structures, nothing else. + adad7dc: Add inet_pton emulation for platforms that lack it. Only support IPv4 at this point. + 7050dbf: Update hardware volume to a correct initial value. + f8aca21: Wrong function name. + 12e35c5: Make sure hardware volume gets a correct initial value. + ce9b035: Hardware source volume support in OSS. + +2006-02-23 Lennart Poettering + c2290c5: update todo + a4ab652: really ignore pabrowse + 2756117: ignore pabrowse + 4a64b0d: change pa_log() and friends to not require a trailing \n on all logged strings + cb59817: simplify tagstruct creation + 5771335: fix source volume adjustment: copy memchunk before changing the volume of it + +2006-02-22 Lennart Poettering + 708c650: enforce maximum memblockq length for clients + bad8fd7: update todo + ecd346f: add listen= parameter to tcp protocol modules + 8df72bc: todo update + 5c7ab77: pkg-config update + 7f68c91: revive howl support + 361f167: unbreak Makefile.am + 63165d8: todo test + a99e46d: rework parameter validity checking in protocol-native server side + f62b66a: todo update + bf013f8: todo update - outline what i consider pre-0.8 and post-0.8 issues + +2006-02-22 Pierre Ossman + 71fd26f: Wrong userdata used to init operation. + cc2178e: Support for setting volume on sources. + 6cd2250: Remove polyplib-error and polyplib-mainloop for requirements. + +2006-02-21 Lennart Poettering + 8d88264: add hw info to description for oss-mmap, too + 5014db9: include hw description gathered from /dev/sndstat in sink/source description string + 6169bd8: add new utility function pa_endswith() + 13b4213: remove left-over log line in protocol-esound.c + 9d3dcef: todo update + a10257d: fix pacat + 36c8861: todo update + 8c80dd6: * Don't build seperate ipv4/ipv6 versions of the protocol plugins * Instead try IPv6 and if that fails fall back to IPv4 + c07928a: todo update + 4f511bb: * Get rid of libpolyp-mainloop * Remove pkg-config file of polyplib-error + f1a0ee7: todo update + 893204f: add hw volume control for module-oss-mmap + +2006-02-21 Pierre Ossman + 48b2e1a: update todo + 7e51237: Hardware volume support on Windows. + +2006-02-20 Lennart Poettering + 86124ab: todo update + cae2d80: disable SIGPIPE before calling pa_core_new(), this way the warning message is not printed + 1506c15: build defer() function in src/polyp/mainloop-signal.c only on win32 + 9bcb413: fix snd_pcm_hw_params_set_rate_near() usage + 56ce62a: build dllmain.c only on win32 (makes gcc shut up a little more) + f5e8953: todo update + d48912b: improve error checking in simple API + 2bdc07e: add validity check for the "server" parameter of pa_context_connect() + 0858ef9: fix yet another pa_context_connect() occurance with regards to the flags parameter + a8e85ba: remove a superfluous log line + 31a027b: change calls of pa_context_connect() to pass flags arugment correctly + b008941: fix moddir + 71b3bff: * modify pa_context_exit_daemon() to return a pa_operation object * add callback prototypes to all introspection functions in client lib * add proper validity checking and error handling to all functions in the client lib * other minor cleanups * todo update + 98cb6aa: * a lot of doxygen updates * s/pa_operation_callback/pa_operation_callback_t/g * add more typedefs for function prototypes * add API to query the channel map used by a pa_stream + 71e063a: todo update + ddd51e2: add doxygen docs for channel map + 3bc0902: minor doxygen fixes + 6d09602: replace "spawn" parameter of pa_context_new() with a proper flags parameter + e078f08: explcitily cast strings to make gcc shut up + 4566d56: * Make typdefs for the pa_context callback prototypes * s/pa_context_notify_cb/pa_context_notify_cb_t/g + b36ed4d: remove cdecl.h from doxygen docs + 081fb74: update TODO + 16285f9: make doxygen ignore PA_CDECL_BEGIN/PA_CDECL_END + 3044490: 1) Add flexible seeking support (including absolute) for memory block queues and playback streams 2) Add support to synchronize multiple playback streams 3) add two tests for 1) and 2) 4) s/PA_ERROR/PA_ERR/ 5) s/PA_ERROR_OK/PA_OK/ 6) update simple API to deal properly with new peek/drop recording API 7) add beginnings of proper validity checking on API calls in client libs (needs to be extended) 8) report playback buffer overflows/underflows to the client 9) move client side recording mcalign stuff into the memblockq 10) create typedefs for a bunch of API callback prototypes 11) simplify handling of HUP poll() events + +2006-02-20 Pierre Ossman + 7905e81: Add aligment fix in esound to todo. + 5d253cd: Fix some warnings by making sure we have the right signedness on things. + 502d3f5: Hardware volume support for Solaris. + f2292ae: Fixes for the Solaris detection. + 5cc0d0e: Add mute switch to todo. + 6c2d414: Detect support for Windows' waveout. + d1bc972: Detect support for Solaris (/dev/audio). + 0eed96d: Remove a debug fprintf that was left in. + e9658bb: util.c uses some socket functions so we need winsock on Windows. + +2006-02-18 Lennart Poettering + 0876b1b: update todo + +2006-02-17 Pierre Ossman + b26df7e: Properly clear members during init. + d142c12: That's a delta parameter, not a size parameter. + 45700da: Have a memblock queue on the client side during recording. This makes the record callback optional in stead of mandatory. + 6f9a367: Ignore generated win32 binaries. + 162a95d: Module needs stuff in libpolypcore. + 2686857: Fix path to poll.h. + c4cf7ad: Fix typo in #ifndef. + da665d5: Integrate error routines into libpolyp. Not much point in having this as a separate library. + 1eae42f: Make sure that all polypcore headers are installed. + 5eda18b: Cleaned up the includes after the restructuring. Indicate which headers are public and which are internal through <> vs "". + c278bc6: Move the util libs to the modules section since they're in that directory. + +2006-02-17 Lennart Poettering + b951308: fix doxygen + +2006-02-16 Lennart Poettering + 2e0dcc4: include header files in simple.h with <> instead of "" + 5ccf414: * rename polypcore/subscribe.[ch] to polypcore/core-subscribe.[ch] to avoid confusion with polyp/subscribe.[ch] * same for scache.[ch] + b4cb249: shorten include list of utils a little + 19b5b71: * drop polylib prefix from #define * include error.h from polypaudio.h + 45b1eee: fix compilation of simple API + 22c8ceb: drop polyplib- prefix from client library files + f49b09d: make channel naming somewhat RFC2551 compliant + 4ad2926: add a bunch of simple Makefile in the subdirs, just to make compilation with emacs easier + c75972f: move alsa-util.[ch], oss-util.[ch] and howl-wrap.[ch] to the modules directory since they are just helper source used exclusively by the modules + b56b9e5: * svn:ignore some files * move configuration files to the directories they belong to * built esd-compat.sh in the src/ dir + 5b881e6: add simple hardware auto detection module + 6ad876e: Add HAVE_ALSA and HAVE_OSS defines + 61fbafc: allow polypaudio to startup without any enabled module + a9950d4: print ALSA error messages on failure + cc3fe43: fix warning text + +2006-02-16 Pierre Ossman + e205b25: Reorganised the source tree. We now have src/ with a couple of subdirs: + +2006-02-15 Lennart Poettering + 22e1f40: todo update + +2006-02-14 Pierre Ossman + 0f0fc32: Fix api. Setting volume is done through a pa_cvolume struct, not a pa_volume_t scalar. + +2006-02-13 Pierre Ossman + f77d5e1: Add function to "wake up", i.e. interrupt, a running poll(). This is needed when having the poll() in a separate thread. + bbaf154: Split mainloop_iterate() into three, distinct parts. Allows for more flexible use, like having the poll() run in a separate thread. + +2006-02-10 Pierre Ossman + 4ab432a: Fix some new alignment bugs in the tagstruct handling. + 8d91ffe: Install the new headers for channels and volume. + +2006-02-03 Pierre Ossman + d9bfd5b: Let's have just one endian conversion macro suite. + 5c01c10: Fix endian conversion macros and reformat them to be a bit more readable. + d431e00: Use defines and not hard coded values for volume levels. Caused incorrect volume levels for all esound clients that changed the volume. + bbc6dd6: Volume adjustment must be done _after_ dropping the chunk since drop will reject a modified chunk. + c34f35a: Reverting an incorrect checkin. + +2006-01-30 Pierre Ossman + dd7b380: Fixes for the new infrastructure so that the waveout module compiles. + 7da06d3: Fixes for the new infrastructure so that the solaris module compiles. + 22db575: Breaks missing from conversion to a switch statement. + f8808a2: Print an error message before aborting. + +2006-01-28 Lennart Poettering + db6dc13: * add variadic function pa_tagstruct_get() and pa_tagstruct_put() for parsing/constructing tagstruct records * convert some of the tagstruct uses to this new API + +2006-01-27 Lennart Poettering + 8580967: add support more for up to 16 auxiliary channel positions + dd10c98: Mega patch: + +2006-01-27 Pierre Ossman + 759721c: Remove the version number from the module directory. Makes life easier for any external projects that need to use that directory. + +2006-01-25 Pierre Ossman + 917d876: We get the -lcap through LIBS, so no need for CAP_LIBS. + 104797b: Use AC_SEARCH_LIBS instead of AC_CHECK_LIBS since it is a lot smarter and doesn't add unnecessary libs. + +2006-01-20 Pierre Ossman + 30bb5ce: Fix so that peer name can be determined on Windows. We do not support console on Windows at this time so we do not have to worry about that right now. + +2006-01-19 Pierre Ossman + 60dbf8b: Open the device in non-blocking mode. + 0ca9a0e: Ugly hack to get around Solaris particularly brain dead sound system. The system has a buffer size of 0.5 MB which cannot be changed. We emulate a smaller buffer through some SIGPOLL trickery. + +2006-01-16 Pierre Ossman + 719c377: We need a logical, not an arithmetic shift here. So use unsigned types when doing the shifting. + +2006-01-12 Pierre Ossman + 262c60f: Under win32 we freed the wrong pointer causing a segmentation fault. + cb2a7ed: Some crappy hardware generate noise on the output when reading input. To avoid triggering this needlesly we tweak the algorithm a bit to avoid reading when nothing is connected to the source. + 289c914: Some drivers (via82xx) doesn't start recording until we read something. This is ugly, but unfortunately required. + fc93e4b: Used 0 as an invalid fd. Changed to -1. + f61be8b: If the card couldn't do duplex when required we would incorrectly return success from this function with a closed fd. + +2006-01-11 Pierre Ossman + 72316cc: Many (FSF and Sun at least) have interpreted the C99 standard in a way that int64_t and similar types are only defined on 64 bit platforms. Using -std=gnu99 lifts this rather silly restriction. + 2623edc: Remove the old compiler flag test now that we have a new shiny one. + 70ac72e: Our makefiles work just fine on older automakes (1.7 tested). Let's keep this out until we run into something that doesn't work. + +2006-01-11 Lennart Poettering + 1f09613: * remove a lot of compiler warnings introduced by using some new GCC flags * add typedefs for public structs and enums and drop the struct/enum prefixs from all uses where it makes sense + +2006-01-10 Lennart Poettering + 6c512fb: build system updates, including support for some newer GCC options + f7a99e9: Merge Pierre's changes + +2006-01-10 Pierre Ossman + 34e81ff: Handle Windows paths when normalizing authkey path. + 29118f5: Make sure the caps header check can also be disabled. + 1015ea4: Store previous reported time in order to assure a monotonic clock. + d429222: Accidental use of a swapped int. + 11c6cac: buf is needed on Windows aswell. + abdf9b1: Add needed error code. + 0a9abdd: Unfortunately Windows has two different values for EBADF depending on if it's a file or a socket. We'll have to deal with these as they show up. + ba06340: Add some required headers. + 357ab88: Make sure socklen_t is defined. + 5e5808a: Static libs bork the creation of dlls and AC_CHECK_LIB isn't very bright, so we have to do a test first to see if getopt_long() is included in the system libs. + ff4cc62: Move library checks to a separate section and make sure it's before function checks. It could miss functions because they are hidden in extra libs otherwise. + f5a2cf1: getopt_long resides in libiberty on many platforms. + +2006-01-09 Pierre Ossman + 76bc56c: Put inet_ntop() emulation in a seperate file. + d3cb144: Update comment for pa_lock_fd() to reflect that locks are mandatory on Windows. + 160d886: Merge with trunk. + 8258146: Generalise lstat fallback. + 5fcbf04: Condense winsock includes and defines into one header. + 9818d67: Make the tagstruct handling safe on machines with alignment restrictions. + 8a32357: Make sure the data gets endianness conversion. + +2006-01-09 Lennart Poettering + 80ae72c: improve sync clock change + 794033a: fix synchronized clock change + +2006-01-05 Pierre Ossman + 067c00f: Reversing incorrect commit. + 72795fc: Use autoconf detected define for getgroups() type. + d5ce3ec: Ignore windows exe:s. + 1b472f7: Solaris support. + 6781628: The Windows sound interface module. + 19d9fcb: Port to Windows. This is mostly glue layers for the poor POSIX support on Windows. A few notes + 2f74bb9: Protect pthread.h with an ifdef. + bdc02f7: Protect sys/resource.h with an ifdef. + 67833c2: Protect sched.h with ifdef. + 57dccd2: Replace paths with defines. + 2c4d42e: ctime_r() is not available everywhere. + e72bbdb: c was used before it was assigned. + 010476f: Protect getuid() with an ifdef. + 5ac2cb9: No regexp funtions are used in this file. + ecaf8d8: PATH_MAX is defined in limits.h. + 983fdb3: Stub uses socket defines so include the header. + 7aba34b: config.h should always be included so that necessary fixes can take effect. + 2cf165d: ifdef-protect setpgid and setsid. + 08bbfd2: Make it possible to disable caps support since it breaks fully static builds. + be2ba90: Add option to select which modules get linked in during static builds. + 9550c8e: No need for conditional generation of symdef files. + 971e370: Add possibility for linking semi-static executables (libtools definition of static). + e2495c7: We need explicit actions here. + 268aebb: Protect sys/wait.h with an ifdef. + 8f3c364: Make sure all socket headers are protected by ifdefs. + e28ce8c: Use pa_get_path_filename() instead of duplicating code. + 29a5b85: Emulate poll() through select() where needed. + d3bc7b2: Fix test for mkfifo(). HAVE_MKFIFO is only generated as a config.h define by default. + 5cd8703: Remove ftruncate test since we're not doing anything with the result. + a24102c: Fix indentation. + e9be6fa: Handle platforms that do not support the UNIX user/group database. + 59aa6ca: There was a race condition here that caused latency calculation to fail miserably under some conditions. + ec87cb1: Fall back to signal() when sigaction isn't supported. + 3ed983c: SIGQUIT is an optional signal. + b8859b4: Compiler warning about uninitialized variable. + 3728854: Make sure the array is never too small. + b69d881: Fix printf string. + 7192238: Old kernel headers didn't define the input_id structure. Therefore we cannot rely on it. + c5bee95: Fix correct type. + 4deeaef: Don't include sys/socket.h in the header when we do not need to. + 14474ae: Esound latency should not include buffer length. This added an extra second to esound already horrible latency calculations. + f0e8c65: Two variables with the same name causing corrupt strings. + 4384d31: Fix warning. + ff49e63: inet_ntop can't be found on all platforms. Do a stupid emulation when not found. + 456e256: Fix some compiler warnings about unused variables. + cd3691d: PIPE_BUF has nothing to do with the esound buffers. + 13496bb: Handle when the platform doesn't have UNIX sockets. + 3a3b4af: AF_UNIX and PF_UNIX is more portable than the _LOCAL equivalent. + dbad54a: Remove any warnings about incorrect type to setsockopt() (char* vs void*). + 7dcf4e4: The standard declares some signals as optional. Make sure we handle this gracefully. + eacffc3: To access the new pa_gettimeofday() we need to include util.h. + 8c5a75d: Syslog is not present on all platforms. + 3996c5f: SIXCPU isn't present on all platforms. Replace cpulimit with dummy functions on those systems. + 2ce05b2: Glob is not present on all systems. + 70223ba: Fallbacks for systems that do not have getaddrinfo(). Does not handle IPv6 though. + 3f2ac7e: We have a generic function for extracting the filename, let's use it. + f6b0f87: Remove unnecessary dependency on timeval definition. + 687e2d7: Abstract the gettimeofday call into a utility function to ease porting. + 70710e1: Check for OSS by looking for its header. Win32 isn't the only platform where OSS isn't supported. + 11a4c67: Remove unused automake conditional. + e8c71ed: Since README is generated conditionally we must make sure there are no dependencies on it when it's not built. + 1f11ee3: Big cleanup of the build structure. + 22f6694: Creating branch for patches from Pierre Ossman + +2005-09-16 Lennart Poettering + 656cf87: fix alsa memory leak + 9177ef4: chance ALSA sink to use "default" as default alsa device + 3a61b36: initialize running_as_daemon + d50bfd8: increase number of allowed connections + e4395c2: add new field running_as_daemon to pa_core + 48b2a87: add pa_sound_file_too_big_to_cache() + 668f3cd: handle float values in sound files sensibly + 652e000: print a nice message when libltdl is missing + e0d0f1b: git-svn-id: file:///home/lennart/svn/public/pulseaudio/trunk@352 fefdeb5f-60dc-0310-8127-8f9354f1896f + 6d9dffe: build fix + c57cad9: bail out if no sink is defined + +2005-09-15 Lennart Poettering + b993e33: alter alsa periods number + db4b25d: handle EOF in ioline.c + fda09b9: remove esound protocol directory on unload of module-protocol-esound + f1da8ad: fix start_timeout() + b5f5707: add libsamplerate/libsndfile CFLAGS + e1f008f: commit liboil porting changes + 0c9873e: create a copy for liboil porting + +2005-01-12 Lennart Poettering + 4daa0c1: * fix LIRC configuration + f586ce0: * extend HTTP module + 4590f09: * make pa_sample_spec_snprint return point to written string * first try of a http module + +2005-01-11 Lennart Poettering + 32bf3a1: * new environment variable $POLYP_LOG * fix connection establishing algorithm * add timeout for establishing connections * add fqdn to the server directive to connect to in browse API * quieten ESOUND protocol + +2005-01-09 Lennart Poettering + 5ab3064: * add new module module-mmkbd-evdev * fix stupid error message in main.c + +2005-01-08 Lennart Poettering + 474b568: * todo update * lirc warning fix * c++ compat + 6911d7e: * increase timeout in pacmd + c29c95d: * make lirc program name configurable + fb4cba4: * add new module for LIRC volume control + 1e78a1d: change doxygen build stuff for better compat with moderm automakes + 9a59d01: update todo list + 9b0ec37: * add support for asynchronous name resolution * remove directories listing from doxygen + +2005-01-06 Lennart Poettering + fb11e45: minor fixes + +2004-12-18 Lennart Poettering + 8199925: fix conditional X11 compilation + +2004-12-16 Lennart Poettering + 47ab6bd: gcc 2.95 compat + +2004-12-15 Lennart Poettering + b1369d2: * fix error message when starting polypaudio while it is already running + 400dacd: cleanup zeroconf service names + 99e0779: * Publish server info in mDNS in addition to sinks/sources * Split off address parser * Add port= argument to module-zeroconf-publish + +2004-12-14 Lennart Poettering + bc5b917: do mor daemonizing work + a370e6e: * fix daemonizing + fa48de8: * prepare polyplib-browse for installation + +2004-12-12 Lennart Poettering + e02be6c: * fix include file names in installed header files * add browsing API * add new tool pabrowse * add typeid subsystem * bump API version * split off random.c * add an identification cookie + 9a01cf4: * complete zeroconf publisher * make cli.c shut up unless run with -v + +2004-12-11 Lennart Poettering + 2d97e75: * fix alsa initialisation * add some missing zeroconf files * make module-match shut up a bit + 73eabec: * add first part of zeroconf publisher * bump version to 0.7.1. * improve logging subsystem (introducing log levels) * remove verbose flag on cli * add new API pa_sample_format_to_string() * replace strtol() by usages of pa_atou() and pa_atoi() + +2004-11-27 Lennart Poettering + 5be9641: * really fix integer only resampler + 7f3c92b: * fix autospawn lock file creation + +2004-11-26 Lennart Poettering + 9a9309f: * use setresuid() instead of setruid() if available * if fix for the non-fp resampler + +2004-11-23 Lennart Poettering + 7586478: * install fix * use syslog as standard log target when run from esdcompat.sh + 29ec9d3: * some fixes for MacOS X by Conrad Parker * Minor build fixes + +2004-11-21 Lennart Poettering + c827fca: prepare for release + 9f23c8f: Documentation updates + 4763ca1: Comment some more files + 2fb83d1: * make --help fit in 80 columns terminal + 82a3626: * update todo + d45abba: calculate buffer sizes from sample spec + 4583c22: * create parec as link to pacat + 28d9744: * new tool pacmd * fix pacat/paplay/pactl for new API version * fix memory leak in pa_ioline + c90409e: bump version number + b03f390: * add some missing "static"s * include libltdl in distribution + 966c78c: fixes for bugs found when compiling with gcc 2.95 + 92f73a7: * fix the trivial resampler + f2b11db: * PID and lock file fixes + fa751e5: some commenting + 6985eda: * some minor pid file fixes + +2004-11-20 Lennart Poettering + 3c77c6e: * remove autospawn lock file usage * fix some compiler warnings * implement PID file support + acc8b78: option to use ALSA default fragment number and size + 5f647c8: * add µlaw/alaw support * abstracted resampler API * add integer-only resampler ("trivial") * show used resampler wherever useful * add mixing/volume adjusting for float32ne and u8 + +2004-11-18 Lennart Poettering + 8641af3: * some iochannel fixes * introduce reference counting in ioline * fix memory leak in socket-client.c * fix double-free error in protocol-esound.c + eef235d: limit the number of concurrent connections for all four protocols kick a client if it doesn't authenticate within 5s on ESD and native protocol + +2004-11-17 Lennart Poettering + c57d5de: minor fixes for latency interpolation + cd3a98a: todo update + a58f248: fix module-tunnel.c + ddf9970: update todo list + 5ea2783: * fix a long standing bug in ioline.c (large prints failed) * fix a bug regarding ipv6 binding + 0a2bbc5: * some commenting work * add new field "read_only" to memory blocks * add new API function pa_context_get_server() * filter capture data through mcalign on client * make module-tunnel use pa_socket_client_new_string() instead of using pa_resolve_server() directly. * remove pa_resolve_server() * remove debug.h and replace it by a macro definition on the gcc command line * some strbuf cleanups * small fixes in pa_stream for cleanup when server dies * new CLI command "load-sample-dir-lazy" * send FQDN as part of server info * rework mcalign, this time with memory block merging * fix iochannel cleanup when connection dies * check getaddrinfo() results + +2004-11-14 Lennart Poettering + f5f6605: todo update + fa499da: Make the whole stuff LGPL only + be6a1c2: * implement module-esound-sink + d7d8529: * remove as superfluous assert() in polyplib-stream which broke the gstreamer plugin * fix module-tunnel meta info + +2004-11-12 Lennart Poettering + 6de0cda: remove a debug message + +2004-11-11 Lennart Poettering + c005bd4: add username to runtime directory name in /tmp/ rework autospawning code and x11 credential publishing add support for IPv6 reenable LOWDELAY for tcp sockets + +2004-11-09 Lennart Poettering + dbaa83c: split out x11prop.[ch] add client support for auth daemon info in X display + 3fcd7a4: use fqdn in module-x11-publish as well + 3916a66: export FQDN instead of hostname + +2004-11-08 Lennart Poettering + 89e39f1: build pax11publish only when X11 is available + 4bb1483: implemented pax11publish.c + +2004-11-07 Lennart Poettering + b55923a: * Look for M4 in configure.ac * Share auth cookies in module-tunnel.c, module-x11-publish.c and native-protocol.c * disable TCP_NODELAY * publish auth cookie in module-x11-publish + +2004-11-04 Lennart Poettering + 5844a33: some commenting change alogrithm for checking for configuration files + 2aad9e3: compilation fix + 344ced4: add some more comments + 1f6a90c: fix client libaryr in case no latency interpolation is required + +2004-11-01 Lennart Poettering + cd3ba7d: Apply Joe Marcus Clarke's FreeBSD patches + +2004-10-30 Lennart Poettering + 899788b: some updates for pa_hashmap add property infrastructure add module module-x11-publish allow ldpreloading of all modules abstract x11wrap from module-x11-bell + +2004-10-29 Lennart Poettering + 4e5c44d: use setreuid() instead of setuid()/seteuid() when dropping root chdir to / on daemon startup (both are suggestions by alan cox) + +2004-10-28 Lennart Poettering + e34c65d: require newer libsndfile update todo file + +2004-10-27 Lennart Poettering + c82105d: prepare next release 0.6 + 1bcec3e: make autoload list use idxset + f252edb: minor updates + 929104a: update todo + 19f2acb: add null sink + 49e16ff: latency calculation fix + ee452b0: two latency interpolation fixes + 148202d: support for latency interpolation + +2004-10-24 Lennart Poettering + da45617: add user volume API + +2004-10-12 Lennart Poettering + a6471e2: gcc 2.95 fix default.pa fix + +2004-10-11 Lennart Poettering + 6ede161: enlarge default buffers + +2004-10-01 Lennart Poettering + fde3d13: todo update + +2004-09-29 Lennart Poettering + 68d50dc: add sample spec parameters to pacat + 66999e5: Add support for libwrap + d092401: really fix API version API + 6dfab4e: renamed module-tunnel to module-tunnel-sink new module module-tunnel-source fix recording + +2004-09-28 Lennart Poettering + d8f700e: fix module-tunnel for to aborting when connection fails + 33c85ae: add latency measurement support to tunnel module + 6f59ae1: Add module-tunnel add proper locking when autospawning a daemon + +2004-09-27 Lennart Poettering + 450ad85: try to use file sample type for cache entries and play-file playback allow paplay to use STDIN add new module: module-match + f014d46: really fix cpu usage when using esddsp with polypaudio + 35148d8: add POSIX locking to authkey.c fix esound protocol cpu consumption when finishing a stream + +2004-09-26 Lennart Poettering + 949014e: add new tool paplay + 5bac3c3: bum version number add new macro PA_API_VERSION for preprocessor level conditional compiling add new native APIs: - counter - cork & flush for record streams - add flags parameters to pa_stream_connect_xx() - new prebuf command - time api, and total latency calculator - return sample spec ability to cork source output streams dump server status on SIGHUP to syslog show sink input/source outputs status in cli-text.c don't flush esound output buffer when client disconnects move version api to polyplib-version.h + +2004-09-23 Lennart Poettering + 405fac5: bump version number and update documentation + ed36241: allow high priority scheduling only for users in group "realtime" + 8176b3a: ignore default.in + 6d20544: place full binary path in default.pa's shebang line + dfcd161: Fix a bug in the build system reported by Iain Fothergill + 9e3890a: OSX protability patches from Conrad Parker + 03ee5e2: add support for capabilities + +2004-09-21 Lennart Poettering + 370ff1d: improve esound module + 12949d0: support for esd arguments: -spawnpid and -spawnfd + 3e1bdac: add noop implementation of standby/resume ESOUND commands + df953a1: show which command is unknown in esound protocol fix esdcompat.sh + +2004-09-20 Lennart Poettering + 7668418: add link to mailing list + 4d9af54: build updates + 2d87bd2: documentation update + bb31eda: fix xmms spawn bug + 42bba49: update module descriptions + +2004-09-19 Lennart Poettering + b118982: remove obnoxious assert from module-combine tagstruct: add support for NULL strings improve pactl correct pa_bytes_snprint() pa_sample_spec_snprint(): don't fail on invalid sample spec rename PA_SAMPLE_SNPRINT_MAX_LENGTH to PA_SAMPLE_SPEC_SNPRINT_MAX + 70a3053: add new function pa_mainloop_deferred_pending() + +2004-09-18 Lennart Poettering + 29653ab: add pacat command line parsing + 73125ad: work around gcc 2.95 limitation + 4e31feb: work around gcc 2.95 limitation + +2004-09-17 Lennart Poettering + 9ad4aa3: minor stuff + 0b9bc03: change sysconf path + 61ec86c: add resample_method option module-combine + 0895356: add --resample-method argument + 95612b6: rename some more + f077958: rename some stuff + 24f3781: make daemon.conf/client.conf autogenerated + 63b35d0: new configuration subsystem + +2004-09-16 Lennart Poettering + 07d563d: update according to autoscan + 078f2aa: gcc 2.95 compatibility, take 2 + 19294e4: fix two gcc 2.95 incompatibilities + daf3938: add support for subscribing to autoload table changes fix module-combine so that the sample rate of at least one streams is not changed from the original + f9e2058: add input latency measurement add GETOSPACE support to module-oss + +2004-09-15 Lennart Poettering + f5d47a2: work around C99/GCC incompatibility native protocol: add "local" field to pa_context add volume paramter to pa_stream_connect_playback add support for renaming streams/clients support lazy samples add functions to kill clients/source inputs/sink outputs add functions for loading/unloading modules add autoload management API + 9ca72dc: remove auto-load-sample stuff introduce "lazy samples" + 8c110d9: correct autospawning + +2004-09-14 Lennart Poettering + 935826f: make module-combine autoloadable clean up cli language introduce lazy sample cache + 6e01979: add refernce counting for sinks, sources, sink-inputs and source-outputs + 8c6593d: add module-combine remove option "stay-root" clean up pa_conf + +2004-09-13 Lennart Poettering + 829656c: new configuration subsystem + fbefe67: correct latency calculation + 1231598: fix parsing of POLYP_SERVER environment variable + +2004-09-12 Lennart Poettering + b1ab686: fix public= on native and esound protocol + b681622: build system update + b772564: update simple API + f05a4ac: extend pa_usec_t to 64 bit + +2004-09-11 Lennart Poettering + a9ca9c4: add modinfo support + 11f0aae: add version number to library names + +2004-09-10 Lennart Poettering + 2512346: add support for module search path as command line argument protocol-native: move first data request into ack of stream creation improve mainloop API: return the number of dispatched sources on iterate() fix a resampling bug introduce network latency measurement + +2004-09-08 Lennart Poettering + 0c99fb3: add FAQ to homepage + +2004-09-07 Lennart Poettering + 5fc0cf2: date fix + 13248fd: documentation update + 7000717: implemented new CLI command: dump add prefork() and postfork() arguments to pa_context_connect_spawn() + 93c8fe6: change the way the default sink/source is selected + +2004-09-06 Lennart Poettering + 0fa499d: add support for setting/getting default sink/source via native protocol + 3536be4: correct a recording bug in native protocol + 566e469: add module-pipe-source + +2004-09-05 Lennart Poettering + 6c4fd62: implement proper logging + +2004-09-04 Lennart Poettering + 57e473b: add support for automatic termination of the daemon after the last client quit remove all gcc warnings add boolean types for tagstruct and modargs + +2004-09-03 Lennart Poettering + fb962b6: add option to disallow module loading after startup + 4a9239f: add CPU load limiter + +2004-09-01 Lennart Poettering + c73a298: add total sample cache size to statistics add size to sample cache entry info + 5f52999: make use F_CLOEXEC wherever useful + 3487387: daemon auto spawn + ee91cb6: add esd compatible startup script add default configuration script + dfd440b: add sound file streaming + 50f592b: introduce sink input and source output limits + 0205fc5: add PA_MININFTY + 63c76bd: cleanup comment + 9939fba: add \since to dB functions + 9c4fd2a: add support for dB volumes + fa19d6a: implement missing scache_get_id_by_name add some more consts to idxset add module-sine, a sine generating sink_input module + 36550f4: remove most -W compiler warnings + 34fe8bd: add support for SCHED_FIFO + +2004-08-27 Lennart Poettering + 9618aea: fix module path + 8c887ab: fix homepage script + 5020326: minor fixes + b014340: readme update (licensing) + 4efa9d1: add LGPL/GPL to dist package + 41d8c13: relicense client library to LGPL + 8cb1cab: document every polyplib function + 761a895: minor cleanups + 92bf0a3: latency work major main loop bugfix + +2004-08-23 Lennart Poettering + b6b428e: minor documentation update + +2004-08-22 Lennart Poettering + 41295bb: new features: future cancellation corking flushing for playback streams in native protocol + +2004-08-20 Lennart Poettering + ea4805a: add pkg config file glib12-mainloop + 5e8bb14: add support for glib12 + 669452e: documentation update + 8c756d5: documentation update + 9b5ba2b: doxygen fix + 0b9f91d: readme update + 8f90450: Doxygen stuff + 6bc5340: build fixes + +2004-08-19 Lennart Poettering + f9b58fb: move sample cache to namereg documentation + e0fe68a: minor stuff + +2004-08-18 Lennart Poettering + befd734: add version routines to polyplib + +2004-08-17 Lennart Poettering + ac59518: add missing copyright headers + e75b657: remove global memblock statistic variables in favor of memblock_stat objects + 81822a7: fix x11 build disable prebuf on drain + 2d6d3e5: todo update + 711de8d: autoconf beefup build fixes + ca2265f: Documentation work add pkg-config support for GLIB main loop + f693aa4: remove native-common-internal + bee750b: create native-common-internal.h + aff43dd: update todo file + a0d54dd: make clitext to cli-text renaming complete + e4be616: rename clitext to cli-text + +2004-08-16 Lennart Poettering + 126fede: fix sink iunput and source output stuff + 369a908: add sink input/source output support to the native protocol + +2004-08-15 Lennart Poettering + efc3491: add support for volume manipulation + c175451: proper ref counting for more objects some documentation update + +2004-08-14 Lennart Poettering + 22cb23e: implement proper refcounting in polyplib split polyplib to multiple modules add some prelimenary documentation add doxygen support + +2004-08-13 Lennart Poettering + 1c2ec47: rename polyplib-sample to polyplib-scache + 50b9fc2: add polyplib-sample.c + 56bcba9: add polyplib-sample + 821afd6: add internal header file for polyplib + 79a4e75: split polyplib.h + 7b52d5d: some preliminary cleanup + +2004-08-12 Lennart Poettering + cd5809c: todo fix + 886041a: add more subscription events add support for clients/modules in native protocol + +2004-08-11 Lennart Poettering + cbfaf40: info and subscription work + b297d0b: todo update + 3d374e9: add subscription subsystem + +2004-08-10 Lennart Poettering + fc618e9: compile fix + 37d930a: glib mainloop fix implement server status command support for sink_list/source_list in polyplib + +2004-08-07 Lennart Poettering + e9bed20: better mainloop test build system + 209c9dd: rename mainloop testing tool + 6f0936f: cleanup priority management in main loop + +2004-08-06 Lennart Poettering + 68eb5dd: add mainloop test utility fix glib mainloop support + +2004-08-05 Lennart Poettering + 964bdfd: add initial glib mainloop adapter clean up mainloop API + +2004-08-04 Lennart Poettering + 839f99f: forgot some files + 46091a9: introduce pa_xmalloc() and friends implement module auto loading + +2004-08-03 Lennart Poettering + 24291af: sample cache work + +2004-08-02 Lennart Poettering + e10b918: add support for querying sample ist with esound protocol + 8705af7: add new module "module-x11-bell" fix scache memory leak + +2004-07-20 Lennart Poettering + 5a694fd: add a todo item + bb0b105: sample cache work + +2004-07-18 Lennart Poettering + 527faf0: minor fixes + +2004-07-17 Lennart Poettering + 8540718: readme update + 765d2f7: two simple fixes + d6d50b0: some makefile fixes + 78a799e: make distcheck clean + 141ab85: make polypaudio run when installed update docs + 6601d95: fix Makefile.am and configure.ac to match directory renaming + 41f6aea: rename src to polyp + 563201e: rename configuration file make sure the todo file is packaged + 86f5b30: move todo file + 539eb02: ignore README + 7b8c329: add documentation + +2004-07-16 Lennart Poettering + 3e379ca: add pkgconfig stuff + cf965cb: add missing liecenses + e0d510d: include copyright and svn tag in *.[ch] + b5384e0: include config.h in every file + dc812da: fix distcheck + 005cb3e: adjust file references due to renaming + 2a6ee77: rename a bunch of files + 00b53f3: make a symbol in module-ptorocol-stub static + 554b01b: make oss sample spec configurable + 74bbf31: implement alsa source split off alsa-util.c + f2e08d5: split PA_SAMPLE_FLOAT32 into PA_SAMPLE_FLOAT{LE,BE} add more configuration arguments to alsa sink + b8eb0c0: add alsa sink + +2004-07-15 Lennart Poettering + b240564: optimize esound latency for xmms + 710233b: implement get_latency native command + d8f1300: add pactl tool + c36dadd: remove global exported variables: pa_memblock statistics pa_default_sample_spec + 1a6fea2: implement daemonizing + ed9bd5f: fix modargs memory leak + 1416fef: implement client side TCP support + +2004-07-14 Lennart Poettering + e83b710: update todo fix polypaudio.run + e61e924: complete implementation of the command line + +2004-07-12 Lennart Poettering + b69178b: add preliminary command line parsing + +2004-07-11 Lennart Poettering + d4e0d51: make module-oss-* use modargs + 216591d: make the protocol plugins make use of modargs + a96ed34: rename hashset to hashmap add module arguments parse in modargs.c make module-pipe-sink use it + ccfd554: add dependency script fix some dependencies split off socket-util.c and clitext.c + +2004-07-10 Lennart Poettering + c7bd759: add description field for sinks/sources add owner field to all entities add client file to source outputs and sink inputs + 0253896: make memblockq merge chunks + 5ee3a59: forgot to add parec-simple + 5ea96e3: implement parec-simple and matching simple recording API add support for killing source outputs in native protocol fix channel management in client library + 70bb816: implement recording in native API fix a memory leak in memblock.c + +2004-07-09 Lennart Poettering + cffc776: fix recording for simpel and esound protocols + +2004-07-07 Lennart Poettering + 863fb90: add output stream draining + e8d1185: draining ind native protocol fixes in callback code on object destruction simple protocol + +2004-07-06 Lennart Poettering + f8cbde5: auth support in esound and native AUTH and SET_NAME operatins in native simple library + +2004-07-04 Lennart Poettering + 722c2c8: add kill_* and default_* commands to CLI make module-cli unload itself on EOF clean up stdio usage add sink pointer to monitor sources + +2004-07-03 Lennart Poettering + e61c2dd: add pa_ prefix to all identifiers. fix downsampling/resampling add support for U8 samples + a8a5ab1: fix minor typo + 3ac2437: add libsamplerate dependency + 253c540: forgot to add memchunk.[ch] + 741aa44: add resampling + +2004-07-02 Lennart Poettering + 13b35a2: add resampler + +2004-06-30 Lennart Poettering + 961fb44: latency esound volume changing + +2004-06-29 Lennart Poettering + d571be6: volume work + e31bac0: extended esound protocol + ef422fa: esound protocol + +2004-06-27 Lennart Poettering + a74cd2a: add name registrar + 0103786: make native playback work + 57dc427: many fixes + +2004-06-24 Lennart Poettering + 1ad4ff1: some fixes + +2004-06-23 Lennart Poettering + a1b59db: make rename of oss.[ch] to oss-util.[ch] complete + c050d72: rename oss.[ch] to oss-util.[ch] + b9e0fa8: minor compile work + 3b50a7c: ignore some more stuff + acb25b3: main part of the native protocol + +2004-06-20 Lennart Poettering + eecf602: partial implementation of native protocol + +2004-06-19 Lennart Poettering + a84f38e: mofiy keyword expansion + 81447ed: cli protocol + 6eddcc2: rename module-simple-protocol to module-protocol-stub + 787bf6c: minor work + b4e3f5c: add simple ptorocol with unix + 56f8c95: some more work on the cli + +2004-06-18 Lennart Poettering + 382e7ae: some more work + 993d1bc: basic cli interface + +2004-06-16 Lennart Poettering + eb946db: configure fix + 4b86ff0: got mmap oss output working + +2004-06-15 Lennart Poettering + a8f7881: fix mixing + b24546b: cleanup + 78f386a: more work + 98f41f1: minor work + 1a50607: oss output works + +2004-06-14 Lennart Poettering + bfcde99: rename some more + f78e9b6: commit some work and rename + 0575fc6: remove oss.c + 5ce2048: more cleanups + c8cf0c1: a bunch of fixes + +2004-06-11 Lennart Poettering + edfad83: remove moddep files (since they are obsolete) + 7dfeb1f: make the whole stuff run and clean it self up again + aae40dc: module dependencie foo + 8584356: ignore fix + 9e3ad23: autoconf + +2004-06-10 Lennart Poettering + a5daff7: make it compile diff --git a/GPL b/GPL new file mode 100644 index 0000000..b7b5f53 --- /dev/null +++ b/GPL @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + 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 St, Fifth Floor, Boston, MA 02110-1301 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/LGPL b/LGPL new file mode 100644 index 0000000..2d2d780 --- /dev/null +++ b/LGPL @@ -0,0 +1,510 @@ + + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations +below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it +becomes a de-facto standard. To achieve this, non-free programs must +be allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control +compilation and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at least + three years, to give the same user the materials specified in + Subsection 6a, above, for a charge no more than the cost of + performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply, and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License +may add an explicit geographical distribution limitation excluding those +countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms +of the ordinary General Public License). + + To apply these terms, attach the following notices to the library. +It is safest to attach them to the start of each source file to most +effectively convey the exclusion of warranty; and each file should +have at least the "copyright" line and a pointer to where the full +notice is found. + + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or +your school, if any, to sign a "copyright disclaimer" for the library, +if necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James + Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..f8fdb7a --- /dev/null +++ b/LICENSE @@ -0,0 +1,18 @@ +All PulseAudio source files are licensed under the GNU Lesser General Public +License. (see file LGPL for details) + +However, the server side links to the GPL-only library 'libsamplerate' which +practically downgrades the license of the server part to GPL (see file GPL for +details), exercising section 3 of the LGPL. + +Hence you should treat the client library ('libpulse') of PulseAudio as being +LGPL licensed and the server part ('libpulsecore') as being GPL licensed. Since +the PulseAudio daemon and the modules link to 'libpulsecore' they are of course +also GPL licensed. + +-- Lennart Poettering, April 20th, 2006. + +GPL CODE (see file GPL for details) : + src/modules/bluetooth/proximity-helper.c + +-- August 23rd, 2011. diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 0000000..40ef390 --- /dev/null +++ b/Makefile.am @@ -0,0 +1,94 @@ +# This file is part of PulseAudio. +# +# PulseAudio is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA. + +ACLOCAL_AMFLAGS = -I m4 + +EXTRA_DIST = \ + bootstrap.sh \ + git-version-gen \ + LICENSE \ + GPL \ + LGPL \ + doxygen/Makefile.am \ + doxygen/Makefile.in \ + doxygen/doxygen.conf.in \ + README \ + todo \ + vala/libpulse.vapi + +SUBDIRS = libltdl src doxygen man po + +MAINTAINERCLEANFILES = +noinst_DATA = + +vapidir = $(datadir)/vala/vapi +vapi_DATA = vala/libpulse.vapi + +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = libpulse.pc libpulse-simple.pc + +filterdir = /opt/etc/pulse +filter_DATA = filter/filter_44100_48000.dat \ + filter/filter_44100_8000.dat \ + filter/filter_48000_44100.dat \ + filter/filter_8000_44100.dat + +if HAVE_AVAHI +pkgconfig_DATA += \ + libpulse-browse.pc +endif + +if HAVE_GLIB20 +pkgconfig_DATA += \ + libpulse-mainloop-glib.pc +endif + +homepage: all dist doxygen + test -d $$HOME/homepage/private + mkdir -p $$HOME/homepage/private/projects/pulseaudio $$HOME/homepage/private/projects/pulseaudio/doxygen + cp pulseaudio-@PACKAGE_VERSION@.tar.gz $$HOME/homepage/private/projects/pulseaudio + cp -a doxygen/html/* $$HOME/homepage/private/projects/pulseaudio/doxygen + +doxygen: + $(MAKE) -C doxygen doxygen + +eolspace: + find \( -name '*.c' -o -name '*.h' -o -name 'Makefile.am' \) -exec perl -i -pe 's/\s+\n$$/\1\n/;' \{\} \; + +untabify: + find \( -name '*.c' -o -name '*.h' \) -exec perl -i -pe 's/\t/ /g;' \{\} \; + +fedora-snapshot: dist + cp $(distdir).tar.gz $$HOME/cvs.fedora/pulseaudio/devel/$(distdir).tar.gz + +dist-hook: + if test -d .git ; then \ + test -z $$SKIP_GIT && git pull ; \ + chmod u+w ${distdir}/ChangeLog || true ; \ + ( git-changelog.perl || echo "git-changelog.perl failed." ) > ${distdir}/ChangeLog 2>&1 ; \ + fi + echo $(VERSION) > $(distdir)/.tarball-version + +.PHONY: homepage distcleancheck doxygen + +# see git-version-gen +BUILT_SOURCES = $(top_srcdir)/.version +$(top_srcdir)/.version: + echo $(VERSION) > $@-t && mv $@-t $@ + +DISTCLEANFILES = \ + po/.intltool-merge-cache diff --git a/README b/README new file mode 100644 index 0000000..43cd265 --- /dev/null +++ b/README @@ -0,0 +1,37 @@ +PULSEAUDIO SOUND SERVER + +WEB SITE: + http://pulseaudio.org/ + +GIT: + git://git.0pointer.de/pulseaudio.git + +GITWEB: + http://git.0pointer.de/?p=pulseaudio.git;a=summary + +MAILING LIST: + https://tango.0pointer.de/mailman/listinfo/pulseaudio-discuss + +GIT COMMITS MAILING LIST: + https://tango.0pointer.de/mailman/listinfo/pulseaudio-commits + +TRAC TICKET CHANGES MAILING LIST: + https://tango.0pointer.de/mailman/listinfo/pulseaudio-tickets + +IRC: + #pulseaudio on irc.freenode.org + +CIA: + http://cia.navi.cx/stats/project/polypaudio + +FRESHMEAT: + http://freshmeat.net/projects/pulseaudio/ + +OHLOH: + http://www.ohloh.net/projects/4038 + +AUTHORS: + Several + +GPL CODE (see file GPL for details) : + src/modules/bluetooth/proximity-helper.c diff --git a/autogen.sh b/autogen.sh new file mode 100755 index 0000000..45f7073 --- /dev/null +++ b/autogen.sh @@ -0,0 +1,5 @@ +aclocal -I m4 +autoheader +autoconf +libtoolize --force --copy +automake -a -c --foreign diff --git a/bootstrap.sh b/bootstrap.sh new file mode 100755 index 0000000..c7c8582 --- /dev/null +++ b/bootstrap.sh @@ -0,0 +1,100 @@ +#!/bin/bash + +# This file is part of PulseAudio. +# +# PulseAudio is free software; you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, write to the Free Software Foundation, +# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +VERSION=1.11 + +run_versioned() { + local P + local V + + V=$(echo "$2" | sed -e 's,\.,,g') + + if [ -e "`which $1$V 2> /dev/null`" ] ; then + P="$1$V" + else + if [ -e "`which $1-$2 2> /dev/null`" ] ; then + P="$1-$2" + else + P="$1" + fi + fi + + shift 2 + "$P" "$@" +} + +set -ex + +case $(uname) in + *Darwin*) + LIBTOOLIZE="glibtoolize" + ;; +esac + +if [ -f .git/hooks/pre-commit.sample -a ! -f .git/hooks/pre-commit ] ; then + cp -p .git/hooks/pre-commit.sample .git/hooks/pre-commit && \ + chmod +x .git/hooks/pre-commit && \ + echo "Activated pre-commit hook." +fi + +if [ -f .tarball-version ]; then + echo "Marking tarball version as modified." + echo -n `cat .tarball-version | sed 's/-rebootstrapped$//'`-rebootstrapped >.tarball-version +fi + +# We check for this here, because if pkg-config is not found in the +# system, it's likely that the pkg.m4 macro file is also not present, +# which will make PKG_PROG_PKG_CONFIG be undefined and the generated +# configure file faulty. +if ! pkg-config --version &>/dev/null; then + echo "pkg-config is required to bootstrap this program" &>/dev/null + exit 1 +fi + +if type -p colorgcc > /dev/null ; then + export CC=colorgcc +fi + +if [ "x$1" = "xam" ] ; then + run_versioned automake "$VERSION" -a -c --foreign + ./config.status +else + rm -rf autom4te.cache + rm -f config.cache + + rm -f Makefile.am~ configure.ac~ + # Evil, evil, evil, evil hack + sed 's/read dummy/\#/' `which gettextize` | bash -s -- --copy --force + test -f Makefile.am~ && mv Makefile.am~ Makefile.am + test -f configure.ac~ && mv configure.ac~ configure.ac + + touch config.rpath + test "x$LIBTOOLIZE" = "x" && LIBTOOLIZE=libtoolize + + intltoolize --copy --force --automake + "$LIBTOOLIZE" -c --force + run_versioned aclocal "$VERSION" -I m4 + run_versioned autoconf 2.63 -Wall + run_versioned autoheader 2.63 + run_versioned automake "$VERSION" --copy --foreign --add-missing + + if test "x$NOCONFIGURE" = "x"; then + CFLAGS="$CFLAGS -g -O0" ./configure --sysconfdir=/etc --localstatedir=/var --enable-force-preopen "$@" + make clean + fi +fi diff --git a/build/orc.mak b/build/orc.mak new file mode 100644 index 0000000..90d403a --- /dev/null +++ b/build/orc.mak @@ -0,0 +1,72 @@ +# +# This is a makefile.am fragment to build Orc code. +# +# Define ORC_SOURCE and then include this file, such as: +# +# ORC_SOURCE=gstadderorc +# include $(top_srcdir)/common/orc.mak +# +# This fragment will create tmp-orc.c and gstadderorc.h from +# gstadderorc.orc. +# +# When 'make dist' is run at the top level, or 'make orc-update' +# in a directory including this fragment, the generated source +# files will be copied to $(ORC_SOURCE)-dist.[ch]. These files +# should be checked in to git, since they are used if Orc is +# disabled. +# +# Note that this file defines BUILT_SOURCES, so any later usage +# of BUILT_SOURCES in the Makefile.am that includes this file +# must use '+='. +# + + +EXTRA_DIST += $(ORC_SOURCE).orc + +ORC_NODIST_SOURCES = tmp-orc.c $(ORC_SOURCE).h +BUILT_SOURCES += tmp-orc.c $(ORC_SOURCE).h + + +orc-update: tmp-orc.c $(ORC_SOURCE).h + cp tmp-orc.c $(srcdir)/$(ORC_SOURCE)-dist.c + cp $(ORC_SOURCE).h $(srcdir)/$(ORC_SOURCE)-dist.h + +orcc_v_gen = $(orcc_v_gen_$(V)) +orcc_v_gen_ = $(orcc_v_gen_$(AM_DEFAULT_VERBOSITY)) +orcc_v_gen_0 = @echo " ORCC $@"; + +cp_v_gen = $(cp_v_gen_$(V)) +cp_v_gen_ = $(cp_v_gen_$(AM_DEFAULT_VERBOSITY)) +cp_v_gen_0 = @echo " CP $@"; + +if HAVE_ORC +tmp-orc.c: $(srcdir)/$(ORC_SOURCE).orc + $(orcc_v_gen)$(ORCC) --implementation -o $(builddir)/tmp-orc.c $(srcdir)/$(ORC_SOURCE).orc + +$(ORC_SOURCE).h: $(srcdir)/$(ORC_SOURCE).orc + mkdir -p $$(dirname $(builddir)/$(ORC_SOURCE).h) + $(orcc_v_gen)$(ORCC) --header -o $(builddir)/$(ORC_SOURCE).h $(srcdir)/$(ORC_SOURCE).orc +else +tmp-orc.c: $(srcdir)/$(ORC_SOURCE).orc + $(cp_v_gen)cp $(srcdir)/$(ORC_SOURCE)-dist.c tmp-orc.c + +$(ORC_SOURCE).h: $(srcdir)/$(ORC_SOURCE).orc + $(cp_v_gen)cp $(srcdir)/$(ORC_SOURCE)-dist.h $(ORC_SOURCE).h +endif + +clean-local: clean-orc +.PHONY: clean-orc +clean-orc: + rm -f tmp-orc.c $(ORC_SOURCE).h + +dist-hook: dist-hook-orc +.PHONY: dist-hook-orc +dist-hook-orc: tmp-orc.c $(ORC_SOURCE).h + rm -f tmp-orc.c~ + cmp -s tmp-orc.c $(srcdir)/$(ORC_SOURCE)-dist.c || \ + cp tmp-orc.c $(srcdir)/$(ORC_SOURCE)-dist.c + cmp -s $(ORC_SOURCE).h $(srcdir)/$(ORC_SOURCE)-dist.h || \ + cp $(ORC_SOURCE).h $(srcdir)/$(ORC_SOURCE)-dist.h + mkdir -p $$(dirname $(ORC_SOURCE)) + cp -p $(srcdir)/$(ORC_SOURCE)-dist.c $(distdir)/$$(dirname $(ORC_SOURCE)) + cp -p $(srcdir)/$(ORC_SOURCE)-dist.h $(distdir)/$$(dirname $(ORC_SOURCE)) diff --git a/config.rpath b/config.rpath new file mode 100755 index 0000000..c547c68 --- /dev/null +++ b/config.rpath @@ -0,0 +1,666 @@ +#! /bin/sh +# Output a system dependent set of variables, describing how to set the +# run time search path of shared libraries in an executable. +# +# Copyright 1996-2007 Free Software Foundation, Inc. +# Taken from GNU libtool, 2001 +# Originally by Gordon Matzigkeit , 1996 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. +# +# The first argument passed to this file is the canonical host specification, +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld +# should be set by the caller. +# +# The set of defined variables is at the end of this script. + +# Known limitations: +# - On IRIX 6.5 with CC="cc", the run time search patch must not be longer +# than 256 bytes, otherwise the compiler driver will dump core. The only +# known workaround is to choose shorter directory names for the build +# directory and/or the installation directory. + +# All known linkers require a `.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a +shrext=.so + +host="$1" +host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` + +# Code taken from libtool.m4's _LT_CC_BASENAME. + +for cc_temp in $CC""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`echo "$cc_temp" | sed -e 's%^.*/%%'` + +# Code taken from libtool.m4's AC_LIBTOOL_PROG_COMPILER_PIC. + +wl= +if test "$GCC" = yes; then + wl='-Wl,' +else + case "$host_os" in + aix*) + wl='-Wl,' + ;; + darwin*) + case $cc_basename in + xlc*) + wl='-Wl,' + ;; + esac + ;; + mingw* | cygwin* | pw32* | os2*) + ;; + hpux9* | hpux10* | hpux11*) + wl='-Wl,' + ;; + irix5* | irix6* | nonstopux*) + wl='-Wl,' + ;; + newsos6) + ;; + linux* | k*bsd*-gnu) + case $cc_basename in + icc* | ecc*) + wl='-Wl,' + ;; + pgcc | pgf77 | pgf90) + wl='-Wl,' + ;; + ccc*) + wl='-Wl,' + ;; + como) + wl='-lopt=' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + wl='-Wl,' + ;; + esac + ;; + esac + ;; + osf3* | osf4* | osf5*) + wl='-Wl,' + ;; + rdos*) + ;; + solaris*) + wl='-Wl,' + ;; + sunos4*) + wl='-Qoption ld ' + ;; + sysv4 | sysv4.2uw2* | sysv4.3*) + wl='-Wl,' + ;; + sysv4*MP*) + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + wl='-Wl,' + ;; + unicos*) + wl='-Wl,' + ;; + uts4*) + ;; + esac +fi + +# Code taken from libtool.m4's AC_LIBTOOL_PROG_LD_SHLIBS. + +hardcode_libdir_flag_spec= +hardcode_libdir_separator= +hardcode_direct=no +hardcode_minus_L=no + +case "$host_os" in + cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; +esac + +ld_shlibs=yes +if test "$with_gnu_ld" = yes; then + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + # Unlike libtool, we use -rpath here, not --rpath, since the documented + # option of GNU ld is called -rpath, not --rpath. + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + case "$host_os" in + aix3* | aix4* | aix5*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + ld_shlibs=no + fi + ;; + amigaos*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we cannot use + # them. + ld_shlibs=no + ;; + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + cygwin* | mingw* | pw32*) + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + interix[3-9]*) + hardcode_direct=no + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + ;; + gnu* | linux* | k*bsd*-gnu) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + netbsd*) + ;; + solaris*) + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs=no + ;; + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' + else + ld_shlibs=no + fi + ;; + esac + ;; + sunos4*) + hardcode_direct=yes + ;; + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + esac + if test "$ld_shlibs" = no; then + hardcode_libdir_flag_spec= + fi +else + case "$host_os" in + aix3*) + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test "$GCC" = yes; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + else + aix_use_runtimelinking=no + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix5*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + ;; + esac + fi + hardcode_direct=yes + hardcode_libdir_separator=':' + if test "$GCC" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct=unsupported + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + ;; + esac + fi + # Begin _LT_AC_SYS_LIBPATH_AIX. + echo 'int main () { return 0; }' > conftest.c + ${CC} ${LDFLAGS} conftest.c -o conftest + aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` + if test -z "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` + fi + if test -z "$aix_libpath"; then + aix_libpath="/usr/lib:/lib" + fi + rm -f conftest.c conftest + # End _LT_AC_SYS_LIBPATH_AIX. + if test "$aix_use_runtimelinking" = yes; then + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' + else + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + fi + fi + ;; + amigaos*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + # see comment about different semantics on the GNU ld section + ld_shlibs=no + ;; + bsdi[45]*) + ;; + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec=' ' + libext=lib + ;; + darwin* | rhapsody*) + hardcode_direct=no + if test "$GCC" = yes ; then + : + else + case $cc_basename in + xlc*) + ;; + *) + ld_shlibs=no + ;; + esac + fi + ;; + dgux*) + hardcode_libdir_flag_spec='-L$libdir' + ;; + freebsd1*) + ld_shlibs=no + ;; + freebsd2.2*) + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + ;; + freebsd2*) + hardcode_direct=yes + hardcode_minus_L=yes + ;; + freebsd* | dragonfly*) + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + ;; + hpux9*) + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + hpux10*) + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + fi + ;; + hpux11*) + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct=no + ;; + *) + hardcode_direct=yes + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + esac + fi + ;; + irix5* | irix6* | nonstopux*) + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + netbsd*) + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + ;; + newsos6) + hardcode_direct=yes + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + openbsd*) + if test -f /usr/libexec/ld.so; then + hardcode_direct=yes + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + else + case "$host_os" in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + hardcode_libdir_flag_spec='-R$libdir' + ;; + *) + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + ;; + esac + fi + else + ld_shlibs=no + fi + ;; + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + osf3*) + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + osf4* | osf5*) + if test "$GCC" = yes; then + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + else + # Both cc and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + hardcode_libdir_separator=: + ;; + solaris*) + hardcode_libdir_flag_spec='-R$libdir' + ;; + sunos4*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + ;; + sysv4) + case $host_vendor in + sni) + hardcode_direct=yes # is this really true??? + ;; + siemens) + hardcode_direct=no + ;; + motorola) + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + esac + ;; + sysv4.3*) + ;; + sysv4*MP*) + if test -d /usr/nec; then + ld_shlibs=yes + fi + ;; + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + ;; + sysv5* | sco3.2v5* | sco5v6*) + hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' + hardcode_libdir_separator=':' + ;; + uts4*) + hardcode_libdir_flag_spec='-L$libdir' + ;; + *) + ld_shlibs=no + ;; + esac +fi + +# Check dynamic linker characteristics +# Code taken from libtool.m4's AC_LIBTOOL_SYS_DYNAMIC_LINKER. +# Unlike libtool.m4, here we don't care about _all_ names of the library, but +# only about the one the linker finds when passed -lNAME. This is the last +# element of library_names_spec in libtool.m4, or possibly two of them if the +# linker has special search rules. +library_names_spec= # the last element of library_names_spec in libtool.m4 +libname_spec='lib$name' +case "$host_os" in + aix3*) + library_names_spec='$libname.a' + ;; + aix4* | aix5*) + library_names_spec='$libname$shrext' + ;; + amigaos*) + library_names_spec='$libname.a' + ;; + beos*) + library_names_spec='$libname$shrext' + ;; + bsdi[45]*) + library_names_spec='$libname$shrext' + ;; + cygwin* | mingw* | pw32*) + shrext=.dll + library_names_spec='$libname.dll.a $libname.lib' + ;; + darwin* | rhapsody*) + shrext=.dylib + library_names_spec='$libname$shrext' + ;; + dgux*) + library_names_spec='$libname$shrext' + ;; + freebsd1*) + ;; + freebsd* | dragonfly*) + case "$host_os" in + freebsd[123]*) + library_names_spec='$libname$shrext$versuffix' ;; + *) + library_names_spec='$libname$shrext' ;; + esac + ;; + gnu*) + library_names_spec='$libname$shrext' + ;; + hpux9* | hpux10* | hpux11*) + case $host_cpu in + ia64*) + shrext=.so + ;; + hppa*64*) + shrext=.sl + ;; + *) + shrext=.sl + ;; + esac + library_names_spec='$libname$shrext' + ;; + interix[3-9]*) + library_names_spec='$libname$shrext' + ;; + irix5* | irix6* | nonstopux*) + library_names_spec='$libname$shrext' + case "$host_os" in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= ;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 ;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 ;; + *) libsuff= shlibsuff= ;; + esac + ;; + esac + ;; + linux*oldld* | linux*aout* | linux*coff*) + ;; + linux* | k*bsd*-gnu) + library_names_spec='$libname$shrext' + ;; + knetbsd*-gnu) + library_names_spec='$libname$shrext' + ;; + netbsd*) + library_names_spec='$libname$shrext' + ;; + newsos6) + library_names_spec='$libname$shrext' + ;; + nto-qnx*) + library_names_spec='$libname$shrext' + ;; + openbsd*) + library_names_spec='$libname$shrext$versuffix' + ;; + os2*) + libname_spec='$name' + shrext=.dll + library_names_spec='$libname.a' + ;; + osf3* | osf4* | osf5*) + library_names_spec='$libname$shrext' + ;; + rdos*) + ;; + solaris*) + library_names_spec='$libname$shrext' + ;; + sunos4*) + library_names_spec='$libname$shrext$versuffix' + ;; + sysv4 | sysv4.3*) + library_names_spec='$libname$shrext' + ;; + sysv4*MP*) + library_names_spec='$libname$shrext' + ;; + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + library_names_spec='$libname$shrext' + ;; + uts4*) + library_names_spec='$libname$shrext' + ;; +esac + +sed_quote_subst='s/\(["`$\\]\)/\\\1/g' +escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"` +shlibext=`echo "$shrext" | sed -e 's,^\.,,'` +escaped_libname_spec=`echo "X$libname_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` +escaped_library_names_spec=`echo "X$library_names_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` +escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` + +LC_ALL=C sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' < for Cendio AB +# +# PulseAudio is free software; you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, write to the Free Software Foundation, +# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +AC_PREREQ(2.63) + +#AC_INIT([pulseaudio], m4_esyscmd([./git-version-gen .tarball-version]), # [mzchyfrnhqvb (at) 0pointer (dot) net]) + +AC_INIT([pulseaudio],[0.9.21-rebootstrapped],[]) + + +AC_CONFIG_SRCDIR([src/daemon/main.c]) +AC_CONFIG_MACRO_DIR([m4]) +AC_CONFIG_HEADERS([config.h]) +AM_INIT_AUTOMAKE([foreign 1.11 -Wall -Wno-portability silent-rules tar-pax]) + +m4_define(pa_major, `echo $VERSION | cut -d. -f1 | cut -d- -f1`) +m4_define(pa_minor, `echo $VERSION | cut -d. -f2 | cut -d- -f1`) +m4_define(pa_micro, `echo $VERSION | cut -d. -f3 | cut -d- -f1`) + +AC_SUBST(PA_MAJOR, pa_major) +AC_SUBST(PA_MINOR, pa_minor) +AC_SUBST(PA_MICRO, pa_micro) +AC_SUBST(PA_MAJORMINOR, pa_major.pa_minor) +AC_SUBST(PA_MAJORMINORMICRO, pa_major.pa_minor.pa_micro) +AC_SUBST(PACKAGE_URL, [http://pulseaudio.org/]) + +AC_SUBST(PA_API_VERSION, 12) +AC_SUBST(PA_PROTOCOL_VERSION, 16) + +# The stable ABI for client applications, for the version info x:y:z +# always will hold y=z +AC_SUBST(LIBPULSE_VERSION_INFO, [12:2:12]) + +# A simplified, synchronous, ABI-stable interface for client +# applications, for the version info x:y:z always will hold y=z +AC_SUBST(LIBPULSE_SIMPLE_VERSION_INFO, [0:3:0]) + +# The ABI-stable network browsing interface for client applications, +# for the version info x:y:z always will hold y=z +AC_SUBST(LIBPULSE_BROWSE_VERSION_INFO, [1:1:1]) + +# The ABI-stable GLib adapter for client applications, for the version +# info x:y:z always will hold y=z +AC_SUBST(LIBPULSE_MAINLOOP_GLIB_VERSION_INFO, [0:4:0]) + +AC_CANONICAL_HOST +AC_DEFINE_UNQUOTED([CANONICAL_HOST], "$host", [Canonical host string.]) + +if type -p stow > /dev/null && test -d /usr/local/stow ; then + AC_MSG_NOTICE([*** Found /usr/local/stow: default install prefix set to /usr/local/stow/${PACKAGE_NAME}-${PACKAGE_VERSION} ***]) + ac_default_prefix="/usr/local/stow/${PACKAGE_NAME}-${PACKAGE_VERSION}" +fi + +#### Platform hacks #### + +case $host in + *-*-solaris* ) + AC_DEFINE(_XOPEN_SOURCE, 600, Needed to get declarations for msg_control and msg_controllen on Solaris) + AC_DEFINE(__EXTENSIONS__, 1, Needed to get declarations for msg_control and msg_controllen on Solaris) + ;; + *-*-darwin* ) + AC_DEFINE([_POSIX_C_SOURCE], [200112L], [Needed to get clock_gettime on Mac OS X]) + AC_DEFINE([_DARWIN_C_SOURCE], [200112L], [Needed to get NSIG on Mac OS X]) + ;; +esac + +AM_SILENT_RULES([yes]) + +#### Checks for programs. #### + +# mkdir -p + +AC_PROG_MKDIR_P + +# CC + +AC_PROG_CC +AC_PROG_CC_C99 +AM_PROG_CC_C_O +AC_PROG_GCC_TRADITIONAL +AC_USE_SYSTEM_EXTENSIONS + +# M4 + +AC_CHECK_PROGS([M4], gm4 m4, no) +if test "x$M4" = xno ; then + AC_MSG_ERROR([m4 missing]) +fi + +dnl Compiler flags +CC_CHECK_CFLAGS_APPEND([-Wall -W -Wextra -pipe -Wno-long-long -Winline -Wvla -Wno-overlength-strings -Wunsafe-loop-optimizations -Wundef -Wformat=2 -Wlogical-op -Wsign-compare -Wformat-security -Wmissing-include-dirs -Wformat-nonliteral -Wold-style-definition -Wpointer-arith -Winit-self -Wdeclaration-after-statement -Wfloat-equal -Wmissing-prototypes -Wstrict-prototypes -Wredundant-decls -Wmissing-declarations -Wmissing-noreturn -Wshadow -Wendif-labels -Wcast-align -Wstrict-aliasing=2 -Wwrite-strings -Wno-unused-parameter -ffast-math -Wp,-D_FORTIFY_SOURCE=2 -fno-common -fdiagnostics-show-option]) + +dnl Linker flags. +dnl Check whether the linker supports the -version-script option. + +dnl This variable is used to make sure ${srcdir} is expanded and not +dnl passed to the CC_CHECK_LDFLAGS macro as a name. +tmp_ldflag="-Wl,-version-script=${srcdir}/src/map-file" + +CC_CHECK_LDFLAGS([${tmp_ldflag}], + [VERSIONING_LDFLAGS='-Wl,-version-script=$(srcdir)/map-file']) +AC_SUBST([VERSIONING_LDFLAGS]) + +dnl Use immediate (now) bindings; avoids the funky re-call in itself +dnl the -z now syntax is lifted from Sun's linker and works with GNU's too +dnl other linkes might be added later +CC_CHECK_LDFLAGS([-Wl,-z,now], [IMMEDIATE_LDFLAGS="-Wl,-z,now"]) +AC_SUBST([IMMEDIATE_LDFLAGS]) + +dnl On ELF systems we don't want the libraries to be unloaded since we +dnl don't clean them up properly, so we request the nodelete flag to be +dnl enabled. +dnl +dnl On other systems, we don't really know how to do that, but it's +dnl welcome if somebody can tell. +CC_CHECK_LDFLAGS([-Wl,-z,nodelete], [NODELETE_LDFLAGS="-Wl,-z,nodelete"]) +AC_SUBST([NODELETE_LDFLAGS]) + +dnl Check for the proper way to build libraries that have no undefined +dnl symbols; on some hosts this needs to be avoided but the macro +dnl takes care of it. +CC_NOUNDEFINED + +dnl Check whether to build tests by default (as compile-test) or not +AC_ARG_ENABLE([default-build-tests], + AS_HELP_STRING([--disable-default-build-tests], [Build test programs only during make check])) + +AM_CONDITIONAL([BUILD_TESTS_DEFAULT], [test "x$enable_default_build_tests" != "xno"]) + +# Native atomic operation support +AC_ARG_ENABLE([atomic-arm-linux-helpers], + AS_HELP_STRING([--disable-atomic-arm-linux-helpers],[use inline asm or libatomic_ops instead]), + [ + case "${enableval}" in + yes) atomic_arm_linux_helpers=yes ;; + no) atomic_arm_linux_helpers=no ;; + *) AC_MSG_ERROR(bad value ${enableval} for --disable-atomic-arm-linux-helpers) ;; + esac + ], + [atomic_arm_linux_helpers=auto]) + +AC_ARG_ENABLE([atomic-arm-memory-barrier], + AS_HELP_STRING([--enable-atomic-arm-memory-barrier],[only really needed in SMP arm systems]), + [ + case "${enableval}" in + yes) AC_DEFINE_UNQUOTED(ATOMIC_ARM_MEMORY_BARRIER_ENABLED, 1, [Enable memory barriers]) ;; + no) ;; + *) AC_MSG_ERROR(bad value ${enableval} for --disable-atomic-arm-linux-helpers) ;; + esac + ],) + +AC_ARG_ENABLE([netbsd-atomic-ops], + AS_HELP_STRING([--enable-netbsd-atomic-ops],[Use the native NetBSD atomic_ops implementation]), + [ + case "${enableval}" in + yes) atomic_netbsd_helpers=yes ;; + no) atomic_netbsd_helpers=no ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-netbsd-atomic-ops) ;; + esac + ], + [atomic_netbsd_helpers=auto]) + +AC_MSG_CHECKING([target operating system]) +case $host in + *-*-linux*) + AC_MSG_RESULT([linux]) + pulse_target_os=linux + ;; + *-*-netbsd*) + AC_MSG_RESULT([netbsd]) + pulse_target_os=netbsd + ;; + *) + AC_MSG_RESULT([unknown]) + pulse_target_os=unknown + ;; +esac + +# If everything else fails use libatomic_ops +need_libatomic_ops=yes + +AC_CACHE_CHECK([whether $CC knows __sync_bool_compare_and_swap()], + pulseaudio_cv_sync_bool_compare_and_swap, + [AC_LINK_IFELSE( + AC_LANG_PROGRAM([], [[int a = 4; __sync_bool_compare_and_swap(&a, 4, 5);]]), + [pulseaudio_cv_sync_bool_compare_and_swap=yes], + [pulseaudio_cv_sync_bool_compare_and_swap=no]) + ]) + +if test "$pulseaudio_cv_sync_bool_compare_and_swap" = "yes" ; then + AC_DEFINE([HAVE_ATOMIC_BUILTINS], 1, [Have __sync_bool_compare_and_swap() and friends.]) + need_libatomic_ops=no +else + # HW specific atomic ops stuff + AC_MSG_CHECKING([architecture for native atomic operations]) + case $host_cpu in + arm*) + AC_MSG_RESULT([arm]) + AC_MSG_CHECKING([whether we can use Linux kernel helpers]) + # The Linux kernel helper functions have been there since 2.6.16. However + # compile time checking for kernel version in cross compile environment + # (which is usually the case for arm cpu) is tricky (or impossible). + if test "x$pulse_target_os" = "xlinux" && test "x$atomic_arm_linux_helpers" != "xno"; then + AC_MSG_RESULT([yes]) + AC_DEFINE_UNQUOTED(ATOMIC_ARM_LINUX_HELPERS, 1, [special arm linux implementation]) + need_libatomic_ops=no + else + AC_MSG_RESULT([no]) + AC_CACHE_CHECK([compiler support for arm inline asm atomic operations], + pulseaudio_cv_support_arm_atomic_ops, + [AC_COMPILE_IFELSE( + AC_LANG_PROGRAM([], + [[volatile int a=0; + int o=0, n=1, r; + asm volatile ("ldrex %0, [%1]\n" + "subs %0, %0, %2\n" + "strexeq %0, %3, [%1]\n" + : "=&r" (r) + : "r" (&a), "Ir" (o), "r" (n) + : "cc"); + return (a==1 ? 0 : -1); + ]]), + [pulseaudio_cv_support_arm_atomic_ops=yes], + [pulseaudio_cv_support_arm_atomic_ops=no]) + ]) + AS_IF([test "$pulseaudio_cv_support_arm_atomic_ops" = "yes"], [ + AC_DEFINE([ATOMIC_ARM_INLINE_ASM], 1, [Have ARMv6 instructions.]) + need_libatomic_ops=no + ]) + fi + ;; + *) + if test "x$pulse_target_os" = "xnetbsd" && test "x$atomic_netbsd_helpers" = "xyes"; then + AC_MSG_RESULT([yes]) + AC_DEFINE_UNQUOTED(NETBSD_ATOMIC_OPS, 1, [netbsd implementation]) + need_libatomic_ops=no + else + AC_MSG_RESULT([unknown]) + fi + ;; + esac +fi + +CC_CHECK_TLS + +AC_CACHE_CHECK([whether $CC knows _Bool], + pulseaudio_cv__Bool, + [AC_COMPILE_IFELSE( + AC_LANG_PROGRAM([], [[_Bool b;]]), + [pulseaudio_cv__Bool=yes], + [pulseaudio_cv__Bool=no]) + ]) + +AS_IF([test "$pulseaudio_cv__Bool" = "yes"], [ + AC_DEFINE([HAVE_STD_BOOL], 1, [Have _Bool.]) + ]) + +#### libtool stuff #### +LT_PREREQ(2.2) +LT_CONFIG_LTDL_DIR([libltdl]) +LT_INIT([dlopen win32-dll disable-static]) +LTDL_INIT([convenience]) + +dnl Unfortunately, even up to libtool 2.2.6a there is no way to know +dnl exactly which version of libltdl is present in the system, so we +dnl just assume that it's a working version as long as we have the +dnl library and the header files. +dnl +dnl As an extra safety device, check for lt_dladvise_init() which is +dnl only implemented in libtool 2.x, and refine as we go if we have +dnl refined requirements. +dnl +dnl Check the header files first since the system may have a +dnl libltdl.so for runtime, but no headers, and we want to bail out as +dnl soon as possible. +dnl +dnl We don't need any special variable for this though, since the user +dnl can give the proper place to find libltdl through the standard +dnl variables like LDFLAGS and CPPFLAGS. + +#AC_CHECK_HEADER([ltdl.h], +# [AC_CHECK_LIB([ltdl], [lt_dladvise_init], [LIBLTDL=-lltdl], [LIBLTDL=])], +# [LIBLTDL=], libltdl) + +#AS_IF([test "x$LIBLTDL" = "x"], +# [AC_MSG_ERROR([Unable to find libltdl version 2. Makes sure you have libtool 2.2 or later installed.])]) +AC_SUBST([LIBLTDL]) + +#### Determine build environment #### + +os_is_win32=0 + +case "$host_os" in + mingw*) + AC_DEFINE([OS_IS_WIN32], 1, [Build target is Windows.]) + os_is_win32=1 + ;; + esac + +AM_CONDITIONAL(OS_IS_WIN32, test "x$os_is_win32" = "x1") + +################################### +# Basic environment checks # +################################### + +#### Checks for header files. #### + +# ISO +AC_HEADER_STDC + +# POSIX +AC_CHECK_HEADERS_ONCE([arpa/inet.h glob.h grp.h netdb.h netinet/in.h \ + netinet/in_systm.h netinet/tcp.h poll.h pwd.h sched.h \ + sys/mman.h sys/resource.h sys/select.h sys/socket.h sys/wait.h \ + sys/uio.h syslog.h sys/dl.h dlfcn.h linux/sockios.h]) +AC_CHECK_HEADERS([netinet/ip.h], [], [], + [#include + #if HAVE_NETINET_IN_H + # include + #endif + #if HAVE_NETINET_IN_SYSTM_H + # include + #endif + ]) +AC_CHECK_HEADERS([regex.h], [HAVE_REGEX=1], [HAVE_REGEX=0]) +AC_CHECK_HEADERS([sys/un.h], [HAVE_AF_UNIX=1], [HAVE_AF_UNIX=0]) + +AM_CONDITIONAL(HAVE_REGEX, test "x$HAVE_REGEX" = "x1") +AM_CONDITIONAL(HAVE_AF_UNIX, test "x$HAVE_AF_UNIX" = "x1") + +# Linux +AC_CHECK_HEADERS([linux/input.h], [HAVE_EVDEV=1], [HAVE_EVDEV=0]) + +AM_CONDITIONAL([HAVE_EVDEV], [test "x$HAVE_EVDEV" = "x1"]) + +AC_CHECK_HEADERS_ONCE([sys/prctl.h]) + +# Solaris +AC_CHECK_HEADERS_ONCE([sys/filio.h]) + +# Windows +AC_CHECK_HEADERS_ONCE([windows.h winsock2.h ws2tcpip.h]) + +# NetBSD +AC_CHECK_HEADERS_ONCE([sys/atomic.h]) + +# Other +AC_CHECK_HEADERS_ONCE([sys/ioctl.h]) +AC_CHECK_HEADERS_ONCE([byteswap.h]) +AC_CHECK_HEADERS_ONCE([sys/syscall.h]) +AC_CHECK_HEADERS_ONCE([sys/eventfd.h]) +AC_CHECK_HEADERS_ONCE([execinfo.h]) + +#### Typdefs, structures, etc. #### + +AC_C_CONST +AC_C_BIGENDIAN +AC_TYPE_PID_T +AC_TYPE_SIZE_T +AC_CHECK_TYPES(ssize_t, , [AC_DEFINE([ssize_t], [signed long], + [Define ssize_t if it is not done by the standard libs.])]) +AC_TYPE_OFF_T + +AC_TYPE_UID_T +AC_CHECK_DECLS(environ) + +AC_CHECK_DEFINE([SIGXCPU], [signal.h], [ +HAVE_SIGXCPU=1 +AC_DEFINE([HAVE_SIGXCPU], 1, [Have SIGXCPU?]) +], [HAVE_SIGXCPU=0]) +AM_CONDITIONAL(HAVE_SIGXCPU, test "x$HAVE_SIGXCPU" = "x1") + +# Solaris lacks this +AC_CHECK_DEFINE([INADDR_NONE], [netinet/in.h], [], + [AC_CHECK_DEFINE([INADDR_NONE], [winsock2.h], [], + [AC_DEFINE([INADDR_NONE], [0xffffffff], [Define INADDR_NONE if not found in ])])]) + +#### POSIX threads #### + +ACX_PTHREAD + +#### Check for libs #### + +# ISO +AC_SEARCH_LIBS([pow], [m]) + +# POSIX +AC_SEARCH_LIBS([sched_setscheduler], [rt]) +AC_SEARCH_LIBS([dlopen], [dl]) +AC_SEARCH_LIBS([shm_open], [rt]) +AC_SEARCH_LIBS([inet_ntop], [nsl]) +AC_SEARCH_LIBS([timer_create], [rt]) + +# BSD +AC_SEARCH_LIBS([connect], [socket]) +AC_SEARCH_LIBS([backtrace], [execinfo]) + +# Non-standard + +# This magic is needed so we do not needlessly add static libs to the win32 +# build, disabling its ability to make dlls. +AC_CHECK_FUNCS([getopt_long], [], [AC_CHECK_LIB([iberty], [getopt_long])]) + +#### Check for functions #### + +# ISO +AC_CHECK_FUNCS_ONCE([lrintf strtof]) + +# POSIX +AC_FUNC_FORK +AC_FUNC_GETGROUPS +AC_FUNC_SELECT_ARGTYPES +AC_CHECK_FUNCS_ONCE([chmod chown clock_gettime getaddrinfo getgrgid_r getgrnam_r \ + getpwnam_r getpwuid_r gettimeofday getuid inet_ntop inet_pton mlock nanosleep \ + pipe posix_fadvise posix_madvise posix_memalign setpgid setsid shm_open \ + sigaction sleep sysconf pthread_setaffinity_np]) +AC_CHECK_FUNCS([mkfifo], [HAVE_MKFIFO=1], [HAVE_MKFIFO=0]) + +AM_CONDITIONAL(HAVE_MKFIFO, test "x$HAVE_MKFIFO" = "x1") + +# X/OPEN +AC_CHECK_FUNCS_ONCE([readlink]) + +# SUSv2 +AC_CHECK_FUNCS_ONCE([ctime_r usleep]) + +# SUSv3 +AC_CHECK_FUNCS_ONCE([strerror_r]) + +# BSD +AC_CHECK_FUNCS_ONCE([lstat]) + +# Non-standard + +AC_CHECK_FUNCS_ONCE([setresuid setresgid setreuid setregid seteuid setegid ppoll strsignal sig2str strtof_l]) + +AC_FUNC_ALLOCA + +AC_CACHE_CHECK([for PTHREAD_PRIO_INHERIT], + pulseaudio_cv_PTHREAD_PRIO_INHERIT, + [save_CC=$CC; CC=$PTHREAD_CC + save_CFLAGS=$CFLAGS; CFLAGS=$PTHREAD_CFLAGS + save_LIBS=$LIBS; LIBS=$PTHREAD_LIBS + AC_LINK_IFELSE( + AC_LANG_PROGRAM( + [[ + #include + ]], + [[int i = PTHREAD_PRIO_INHERIT;]]), + [pulseaudio_cv_PTHREAD_PRIO_INHERIT=yes], + [pulseaudio_cv_PTHREAD_PRIO_INHERIT=no]) + CC=$save_CC + CFLAGS=$save_CFLAGS + LIBS=$save_LIBS + ]) + +AS_IF([test "$pulseaudio_cv_PTHREAD_PRIO_INHERIT" = "yes"], [ + AC_DEFINE([HAVE_PTHREAD_PRIO_INHERIT], 1, [Have PTHREAD_PRIO_INHERIT.]) + ]) + +AC_DEFINE_UNQUOTED(PA_CFLAGS,"$CFLAGS", [The CFLAGS used during compilation]) + +#### Large File-Support (LFS) #### + +AC_SYS_LARGEFILE + +# Check for open64 to know if the current system does have open64() and similar functions +AC_CHECK_FUNCS_ONCE([open64]) + +#### [lib]iconv #### + +AM_ICONV + +IT_PROG_INTLTOOL([0.35.0]) +GETTEXT_PACKAGE=pulseaudio +AC_SUBST([GETTEXT_PACKAGE]) +AC_DEFINE_UNQUOTED([GETTEXT_PACKAGE],["$GETTEXT_PACKAGE"],[Gettext package]) +AM_GLIB_GNU_GETTEXT + +pulselocaledir='${prefix}/${DATADIRNAME}/locale' +AC_SUBST(pulselocaledir) + +################################### +# External libraries # +################################### + +#### pkg-config #### + +PKG_PROG_PKG_CONFIG + +#### X11 (optional) #### + +AC_ARG_ENABLE([x11], + AS_HELP_STRING([--disable-x11],[Disable optional X11 support]), + [ + case "${enableval}" in + yes) x11=yes ;; + no) x11=no ;; + *) AC_MSG_ERROR(bad value ${enableval} for --disable-x11) ;; + esac + ], + [x11=auto]) + +if test "x${x11}" != xno ; then + PKG_CHECK_MODULES(X11, [ x11 ice sm xtst ], + HAVE_X11=1, + [ + HAVE_X11=0 + if test "x$x11" = xyes ; then + AC_MSG_ERROR([*** X11 not found]) + fi + ]) +else + HAVE_X11=0 +fi + +if test "x${HAVE_X11}" = x1 ; then + AC_DEFINE([HAVE_X11], 1, [Have X11?]) +fi + +AC_SUBST(X11_CFLAGS) +AC_SUBST(X11_LIBS) +AC_SUBST(HAVE_X11) +AM_CONDITIONAL([HAVE_X11], [test "x$HAVE_X11" = x1]) + +#### Capabilities (optional) #### + +CAP_LIBS='' + +AC_ARG_WITH( + [caps], + AS_HELP_STRING([--without-caps],[Omit support for POSIX capabilities.])) + +if test "x${with_caps}" != "xno"; then + AC_SEARCH_LIBS([cap_init], [cap], [], [ + if test "x${with_caps}" = "xyes" ; then + AC_MSG_ERROR([*** POSIX caps libraries not found]) + fi]) + AC_CHECK_HEADERS([sys/capability.h], [], [ + if test "x${with_caps}" = "xyes" ; then + AC_MSG_ERROR([*** POSIX caps headers not found]) + fi]) +fi + +#### Valgrind (optional) #### + +AC_CHECK_HEADERS_ONCE([valgrind/memcheck.h]) + +#### Sound file #### + +PKG_CHECK_MODULES(LIBSNDFILE, [ sndfile >= 1.0.20 ]) +AC_SUBST(LIBSNDFILE_CFLAGS) +AC_SUBST(LIBSNDFILE_LIBS) + +PKG_CHECK_MODULES(LIBSPEEX, [ speexdsp >= 1.2 ]) +AC_SUBST(LIBSPEEX_CFLAGS) +AC_SUBST(LIBSPEEX_LIBS) + +PKG_CHECK_MODULES(PMAPI, pmapi) +AC_SUBST(PMAPI_CFLAGS) +AC_SUBST(PMAPI_LIBS) + +PKG_CHECK_MODULES(VCONF, vconf) +AC_SUBST(VCONF_CFLAGS) +AC_SUBST(VCONF_LIBS) + +dnl use dlog -------------------------------------------------------------------------- +AC_ARG_ENABLE(dlog, AC_HELP_STRING([--enable-dlog], [using dlog]), +[ + case "${enableval}" in + yes) USE_DLOG=yes ;; + no) USE_DLOG=no ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-dlog) ;; + esac + ],[USE_DLOG=no]) + +if test "x$USE_DLOG" = "xyes"; then + PKG_CHECK_MODULES(DLOG, dlog) + AC_SUBST(DLOG_CFLAGS) + AC_SUBST(DLOG_LIBS) +fi +AM_CONDITIONAL(USE_DLOG, test "x$USE_DLOG" = "xyes") +dnl end -------------------------------------------------------------------- + +#### atomic-ops ### + +AC_MSG_CHECKING([whether we need libatomic_ops]) +if test "x$need_libatomic_ops" = "xyes"; then + AC_MSG_RESULT([yes]) + AC_CHECK_HEADERS([atomic_ops.h], [], [ + AC_MSG_ERROR([*** libatomic-ops headers not found]) + ]) + + # Win32 does not need the lib and breaks horribly if we try to include it + if test "x$os_is_win32" != "x1" ; then + LIBS="$LIBS -latomic_ops" + fi +else + AC_MSG_RESULT([no]) +fi + +#### Libsamplerate support (optional) #### + +AC_ARG_ENABLE([samplerate], + AS_HELP_STRING([--disable-samplerate],[Disable optional libsamplerate support]), + [ + case "${enableval}" in + yes) samplerate=yes ;; + no) samplerate=no ;; + *) AC_MSG_ERROR(bad value ${enableval} for --disable-samplerate) ;; + esac + ], + [samplerate=auto]) + +if test "x${samplerate}" != xno ; then + PKG_CHECK_MODULES(LIBSAMPLERATE, [ samplerate >= 0.1.0 ], + HAVE_LIBSAMPLERATE=1, + [ + HAVE_LIBSAMPLERATE=0 + if test "x$samplerate" = xyes ; then + AC_MSG_ERROR([*** Libsamplerate not found]) + fi + ]) +else + HAVE_LIBSAMPLERATE=0 +fi + +if test "x${HAVE_LIBSAMPLERATE}" = x1 ; then + AC_DEFINE([HAVE_LIBSAMPLERATE], 1, [Have libsamplerate?]) +fi + +AC_SUBST(LIBSAMPLERATE_CFLAGS) +AC_SUBST(LIBSAMPLERATE_LIBS) +AC_SUBST(HAVE_LIBSAMPLERATE) +AM_CONDITIONAL([HAVE_LIBSAMPLERATE], [test "x$HAVE_LIBSAMPLERATE" = x1]) + +#### Database support #### + +HAVE_TDB=0 +HAVE_GDBM=0 +HAVE_SIMPLEDB=0 + +AC_ARG_WITH( + [database], + AS_HELP_STRING([--with-database=auto|tdb|gdbm|simple],[Choose database backend.]),[],[with_database=auto]) + +if test "x${with_database}" = "xauto" -o "x${with_database}" = "xtdb" ; then + PKG_CHECK_MODULES(TDB, [ tdb ], + [ + HAVE_TDB=1 + with_database=tdb + ], [ + if test "x${with_database}" = "xtdb" ; then + AC_MSG_ERROR([*** tdb not found]) + fi + ]) +fi + +if test "x${with_database}" = "xauto" -o "x${with_database}" = "xgdbm" ; then + have_gdbm=yes + + AC_CHECK_LIB(gdbm, gdbm_open, [], [have_gdbm=no]) + AC_CHECK_HEADERS(gdbm.h, [], [have_gdbm=no]) + + if test "x${have_gdbm}" = "xyes" ; then + HAVE_GDBM=1 + GDBM_CFLAGS= + GDBM_LIBS=-lgdbm + with_database=gdbm + elif test "x${with_database}" = "xgdbm"; then + AC_MSG_ERROR([*** gdbm not found]) + fi +fi + +if test "x${with_database}" = "xauto" -o "x${with_database}" = "xsimple" ; then + HAVE_SIMPLEDB=1 + with_database=simple +fi + +if test "x${HAVE_TDB}" != x1 -a "x${HAVE_GDBM}" != x1 -a "x${HAVE_SIMPLEDB}" != x1; then + AC_MSG_ERROR([*** missing database backend]) +fi + +if test "x${HAVE_TDB}" = x1 ; then + AC_DEFINE([HAVE_TDB], 1, [Have tdb?]) +fi + +if test "x${HAVE_GDBM}" = x1 ; then + AC_DEFINE([HAVE_GDBM], 1, [Have gdbm?]) +fi + +if test "x${HAVE_SIMPLEDB}" = x1 ; then + AC_DEFINE([HAVE_SIMPLEDB], 1, [Have simple?]) +fi + +AC_SUBST(TDB_CFLAGS) +AC_SUBST(TDB_LIBS) +AC_SUBST(HAVE_TDB) +AM_CONDITIONAL([HAVE_TDB], [test "x$HAVE_TDB" = x1]) + +AC_SUBST(GDBM_CFLAGS) +AC_SUBST(GDBM_LIBS) +AC_SUBST(HAVE_GDBM) +AM_CONDITIONAL([HAVE_GDBM], [test "x$HAVE_GDBM" = x1]) + +AC_SUBST(HAVE_SIMPLEDB) +AM_CONDITIONAL([HAVE_SIMPLEDB], [test "x$HAVE_SIMPLEDB" = x1]) + +#### OSS support (optional) #### + +AC_ARG_ENABLE([oss-output], + AS_HELP_STRING([--disable-oss-output],[Disable optional OSS output support]), + [ + case "${enableval}" in + yes) oss_output=yes ;; + no) oss_output=no ;; + *) AC_MSG_ERROR(bad value ${enableval} for --disable-oss-output) ;; + esac + ], + [oss_output=auto]) + +AC_ARG_ENABLE([oss-wrapper], + AS_HELP_STRING([--disable-oss-wrapper],[Disable optional OSS wrapper support]), + [ + case "${enableval}" in + yes) oss_wrapper=yes ;; + no) oss_wrapper=no ;; + *) AC_MSG_ERROR(bad value ${enableval} for --disable-oss-wrapper) ;; + esac + ], + [oss_wrapper=auto]) + +if test "x${oss_output}" != xno || test "x${oss_wrapper}" != "xno"; then + AC_CHECK_HEADERS([sys/soundcard.h], + [ + if test "x${oss_output}" != "xno"; then + AC_DEFINE([HAVE_OSS_OUTPUT], 1, [Have OSS output?]) + fi + if test "x${oss_wrapper}" != "xno"; then + AC_DEFINE([HAVE_OSS_WRAPPER], 1, [Have OSS wrapper (padsp)?]) + fi + HAVE_OSS=1 + ], + [ + HAVE_OSS=0 + if test "x$oss_output" = xyes || test "x$oss_wrapper" = "xyes"; then + AC_MSG_ERROR([*** OSS support not found]) + fi + ]) +else + HAVE_OSS=0 +fi + +AC_SUBST(HAVE_OSS) +AM_CONDITIONAL([HAVE_OSS_OUTPUT], [test "x$HAVE_OSS" = x1 && test "x${oss_output}" != "xno"]) +AM_CONDITIONAL([HAVE_OSS_WRAPPER], [test "x$HAVE_OSS" = x1 && test "x${oss_wrapper}" != "xno"]) + +#### ALSA support (optional) #### + +AC_ARG_ENABLE([alsa], + AS_HELP_STRING([--disable-alsa],[Disable optional ALSA support]), + [ + case "${enableval}" in + yes) alsa=yes ;; + no) alsa=no ;; + *) AC_MSG_ERROR(bad value ${enableval} for --disable-alsa) ;; + esac + ], + [alsa=auto]) + +if test "x${alsa}" != xno ; then + PKG_CHECK_MODULES(ASOUNDLIB, [ alsa >= 1.0.19 ], + [ + HAVE_ALSA=1 + AC_DEFINE([HAVE_ALSA], 1, [Have ALSA?]) + ], + [ + HAVE_ALSA=0 + if test "x$alsa" = xyes ; then + AC_MSG_ERROR([*** Needed alsa >= 1.0.19 support not found]) + fi + ]) +else + HAVE_ALSA=0 +fi + +AC_SUBST(ASOUNDLIB_CFLAGS) +AC_SUBST(ASOUNDLIB_LIBS) +AC_SUBST(HAVE_ALSA) +AM_CONDITIONAL([HAVE_ALSA], [test "x$HAVE_ALSA" = x1]) + +#### Solaris audio support (optional) #### + +AC_ARG_ENABLE([solaris], + AS_HELP_STRING([--disable-solaris],[Disable optional Solaris audio support]), + [ + case "${enableval}" in + yes) solaris=yes ;; + no) solaris=no ;; + *) AC_MSG_ERROR(bad value ${enableval} for --disable-solaris) ;; + esac + ], + [solaris=auto]) + +if test "x${solaris}" != xno ; then + AC_CHECK_HEADERS([sys/audio.h], + [ + HAVE_SOLARIS=1 + AC_DEFINE([HAVE_SOLARIS], 1, [Have Solaris audio?]) + ], + [ + HAVE_SOLARIS=0 + if test "x$solaris" = xyes ; then + AC_MSG_ERROR([*** Solaris audio support not found]) + fi + ]) +else + HAVE_SOLARIS=0 +fi + +AC_SUBST(HAVE_SOLARIS) +AM_CONDITIONAL([HAVE_SOLARIS], [test "x$HAVE_SOLARIS" = x1]) + +#### GLib 2 support (optional) #### + +AC_ARG_ENABLE([glib2], + AS_HELP_STRING([--disable-glib2],[Disable optional GLib 2 support]), + [ + case "${enableval}" in + yes) glib2=yes ;; + no) glib2=no ;; + *) AC_MSG_ERROR(bad value ${enableval} for --disable-glib2) ;; + esac + ], + [glib2=auto]) + +if test "x${glib2}" != xno ; then + PKG_CHECK_MODULES(GLIB20, [ glib-2.0 >= 2.4.0 ], + HAVE_GLIB20=1, + [ + HAVE_GLIB20=0 + if test "x$glib2" = xyes ; then + AC_MSG_ERROR([*** GLib 2 support not found]) + fi + ]) +else + HAVE_GLIB20=0 +fi + +AC_SUBST(GLIB20_CFLAGS) +AC_SUBST(GLIB20_LIBS) +AC_SUBST(HAVE_GLIB20) +AM_CONDITIONAL([HAVE_GLIB20], [test "x$HAVE_GLIB20" = x1]) + +if test "x$HAVE_GLIB20" = x1 ; then + AC_DEFINE([HAVE_GLIB], 1, [Have GLIB?]) +fi + +#### GTK2 support (optional) #### + +AC_ARG_ENABLE([gtk2], + AS_HELP_STRING([--disable-gtk2],[Disable optional Gtk+ 2 support]), + [ + case "${enableval}" in + yes) gtk2=yes ;; + no) gtk2=no ;; + *) AC_MSG_ERROR(bad value ${enableval} for --disable-gtk2) ;; + esac + ], + [gtk2=auto]) + +if test "x${gtk2}" != xno ; then + PKG_CHECK_MODULES(GTK20, [ gtk+-2.0 >= 2.4.0 ], + HAVE_GTK20=1, + [ + HAVE_GTK20=0 + if test "x$gtk2" = xyes ; then + AC_MSG_ERROR([*** Gtk+ 2 support not found]) + fi + ]) +else + HAVE_GTK20=0 +fi + +AC_SUBST(GTK20_CFLAGS) +AC_SUBST(GTK20_LIBS) +AC_SUBST(HAVE_GTK20) +AM_CONDITIONAL([HAVE_GTK20], [test "x$HAVE_GTK20" = x1]) + +if test "x$HAVE_GTK20" = x1 ; then + AC_DEFINE([HAVE_GTK], 1, [Have GTK?]) +fi + +#### GConf support (optional) #### + +AC_ARG_ENABLE([gconf], + AS_HELP_STRING([--disable-gconf],[Disable optional GConf support]), + [ + case "${enableval}" in + yes) gconf=yes ;; + no) gconf=no ;; + *) AC_MSG_ERROR(bad value ${enableval} for --disable-gconf) ;; + esac + ], + [gconf=auto]) + +if test "x${gconf}" != xno ; then + PKG_CHECK_MODULES(GCONF, [ gconf-2.0 >= 2.4.0 ], + HAVE_GCONF=1, + [ + HAVE_GCONF=0 + if test "x$gconf" = xyes ; then + AC_MSG_ERROR([*** GConf support not found]) + fi + ]) +else + HAVE_GCONF=0 +fi + +AC_SUBST(GCONF_CFLAGS) +AC_SUBST(GCONF_LIBS) +AC_SUBST(HAVE_GCONF) +AM_CONDITIONAL([HAVE_GCONF], [test "x$HAVE_GCONF" = x1]) + +#### Avahi support (optional) #### + +AC_ARG_ENABLE([avahi], + AS_HELP_STRING([--disable-avahi],[Disable optional Avahi support]), + [ + case "${enableval}" in + yes) avahi=yes ;; + no) avahi=no ;; + *) AC_MSG_ERROR(bad value ${enableval} for --disable-avahi) ;; + esac + ], + [avahi=auto]) + +if test "x${avahi}" != xno ; then + PKG_CHECK_MODULES(AVAHI, [ avahi-client >= 0.6.0 ], + HAVE_AVAHI=1, + [ + HAVE_AVAHI=0 + if test "x$avahi" = xyes ; then + AC_MSG_ERROR([*** Avahi support not found]) + fi + ]) +else + HAVE_AVAHI=0 +fi + +AC_SUBST(AVAHI_CFLAGS) +AC_SUBST(AVAHI_LIBS) +AC_SUBST(HAVE_AVAHI) +AM_CONDITIONAL([HAVE_AVAHI], [test "x$HAVE_AVAHI" = x1]) + +### JACK (optional) #### + +AC_ARG_ENABLE([jack], + AS_HELP_STRING([--disable-jack],[Disable optional JACK support]), + [ + case "${enableval}" in + yes) jack=yes ;; + no) jack=no ;; + *) AC_MSG_ERROR(bad value ${enableval} for --disable-jack) ;; + esac + ], + [jack=auto]) + +if test "x${jack}" != xno ; then + PKG_CHECK_MODULES(JACK, [ jack >= 0.100 ], + HAVE_JACK=1, + [ + HAVE_JACK=0 + if test "x$jack" = xyes ; then + AC_MSG_ERROR([*** JACK support not found]) + fi + ]) +else + HAVE_JACK=0 +fi + +AC_SUBST(JACK_CFLAGS) +AC_SUBST(JACK_LIBS) +AC_SUBST(HAVE_JACK) +AM_CONDITIONAL([HAVE_JACK], [test "x$HAVE_JACK" = x1]) + +#### Async DNS support (optional) #### + +AC_ARG_ENABLE([asyncns], + AS_HELP_STRING([--disable-asyncns],[Disable optional Async DNS support]), + [ + case "${enableval}" in + yes) asyncns=yes ;; + no) asyncns=no ;; + *) AC_MSG_ERROR(bad value ${enableval} for --disable-asyncns) ;; + esac + ], + [asyncns=auto]) + +if test "x${asyncns}" != xno ; then + PKG_CHECK_MODULES(LIBASYNCNS, [ libasyncns >= 0.1 ], + HAVE_LIBASYNCNS=1, + [ + HAVE_LIBASYNCNS=0 + if test "x$asyncns" = xyes ; then + AC_MSG_ERROR([*** Async DNS support not found]) + fi + ]) +else + HAVE_LIBASYNCNS=0 +fi + +AC_SUBST(LIBASYNCNS_CFLAGS) +AC_SUBST(LIBASYNCNS_LIBS) +AC_SUBST(HAVE_LIBASYNCNS) +AM_CONDITIONAL([HAVE_LIBASYNCNS], [test "x$HAVE_LIBASYNCNS" = x1]) + +if test "x$HAVE_LIBASYNCNS" != "x0" ; then + AC_DEFINE([HAVE_LIBASYNCNS], 1, [Have libasyncns?]) +fi + +#### TCP wrappers (optional) #### + +AC_ARG_ENABLE([tcpwrap], + AS_HELP_STRING([--disable-tcpwrap],[Disable optional TCP wrappers support]), + [ + case "${enableval}" in + yes) tcpwrap=yes ;; + no) tcpwrap=no ;; + *) AC_MSG_ERROR(bad value ${enableval} for --disable-tcpwrap) ;; + esac + ], + [tcpwrap=auto]) + +if test "x${tcpwrap}" != xno ; then + ACX_LIBWRAP + if test "x${LIBWRAP_LIBS}" = x && test "x$tcpwrap" = xyes ; then + AC_MSG_ERROR([*** TCP wrappers support not found]) + fi +else + LIBWRAP_LIBS= +fi + +AC_SUBST(LIBWRAP_LIBS) + +#### LIRC support (optional) #### + +AC_ARG_ENABLE([lirc], + AS_HELP_STRING([--disable-lirc],[Disable optional LIRC support]), + [ + case "${enableval}" in + yes) lirc=yes ;; + no) lirc=no ;; + *) AC_MSG_ERROR(bad value ${enableval} for --disable-lirc) ;; + esac + ], + [lirc=auto]) + +if test "x${lirc}" != xno ; then + ACX_LIRC + if test "x${HAVE_LIRC}" = x0 && test "x$lirc" = xyes ; then + AC_MSG_ERROR([*** LIRC support not found]) + fi +else + HAVE_LIRC=0 +fi + +AC_SUBST(LIRC_CFLAGS) +AC_SUBST(LIRC_LIBS) +AM_CONDITIONAL([HAVE_LIRC], [test "x$HAVE_LIRC" = x1]) + +#### HAL support (optional) #### + +AC_ARG_ENABLE([hal], + AS_HELP_STRING([--disable-hal],[Disable optional HAL support]), + [ + case "${enableval}" in + yes) hal=yes ;; + no) hal=no ;; + *) AC_MSG_ERROR(bad value ${enableval} for --disable-hal) ;; + esac + ], + [hal=auto]) +if test "x${hal}" != xno -a \( "x$HAVE_OSS" = "x1" -o "x$HAVE_ALSA" = "x1" \) ; then + PKG_CHECK_MODULES(HAL, [ hal >= 0.5.11 ], + [ + HAVE_HAL=1 + AC_DEFINE([HAVE_HAL], 1, [Have HAL.]) + ], + [ + HAVE_HAL=0 + if test "x$hal" = xyes ; then + AC_MSG_ERROR([*** HAL support not found]) + fi + ]) +else + HAVE_HAL=0 +fi + +AC_SUBST(HAL_CFLAGS) +AC_SUBST(HAL_LIBS) +AC_SUBST(HAVE_HAL) +AM_CONDITIONAL([HAVE_HAL], [test "x$HAVE_HAL" = x1]) + +#### UDEV support (optional) #### + +AC_ARG_ENABLE([udev], + AS_HELP_STRING([--disable-udev],[Disable optional UDEV support]), + [ + case "${enableval}" in + yes) udev=yes ;; + no) udev=no ;; + *) AC_MSG_ERROR(bad value ${enableval} for --disable-udev) ;; + esac + ], + [udev=auto]) +if test "x${udev}" != xno -a \( "x$HAVE_OSS" = "x1" -o "x$HAVE_ALSA" = "x1" \) ; then + PKG_CHECK_MODULES(UDEV, [ libudev >= 143 ], + [ + HAVE_UDEV=1 + AC_DEFINE([HAVE_UDEV], 1, [Have UDEV.]) + ], + [ + HAVE_UDEV=0 + if test "x$udev" = xyes ; then + AC_MSG_ERROR([*** UDEV support not found]) + fi + ]) +else + HAVE_UDEV=0 +fi + +AC_SUBST(UDEV_CFLAGS) +AC_SUBST(UDEV_LIBS) +AC_SUBST(HAVE_UDEV) +AM_CONDITIONAL([HAVE_UDEV], [test "x$HAVE_UDEV" = x1]) + +#### HAL compat support (optional) #### + +AC_ARG_ENABLE([hal-compat], + AS_HELP_STRING([--disable-hal-compat],[Disable optional HAL->udev transition compatibility support]), + [ + case "${enableval}" in + yes) halcompat=yes ;; + no) halcompat=no ;; + *) AC_MSG_ERROR(bad value ${enableval} for --disable-hal-compat) ;; + esac + ], + [halcompat=auto]) +if test "x${halcompat}" != xno -a "x$HAVE_HAL" = "x0" -a "x$HAVE_UDEV" = "x1" ; then + HAVE_HAL_COMPAT=1 + AC_DEFINE([HAVE_HAL_COMPAT], 1, [Have HAL compatibility.]) +else + HAVE_HAL_COMPAT=0 +fi + +AC_SUBST(HAVE_HAL_COMPAT) +AM_CONDITIONAL([HAVE_HAL_COMPAT], [test "x$HAVE_HAL_COMPAT" = x1]) + +#### BlueZ support (optional) #### + +AC_ARG_ENABLE([bluez], + AS_HELP_STRING([--disable-bluez],[Disable optional BlueZ support]), + [ + case "${enableval}" in + yes) bluez=yes ;; + no) bluez=no ;; + *) AC_MSG_ERROR(bad value ${enableval} for --disable-bluez) ;; + esac + ], + [bluez=auto]) +if test "x${bluez}" != xno ; then + PKG_CHECK_MODULES(BLUEZ, [ bluez >= 3.0 ], + HAVE_BLUEZ=1, + [ + HAVE_BLUEZ=0 + if test "x$bluez" = xyes ; then + AC_MSG_ERROR([*** BLUEZ support not found]) + fi + ]) +else + HAVE_BLUEZ=0 +fi + +AC_SUBST(BLUEZ_CFLAGS) +AC_SUBST(BLUEZ_LIBS) +AC_SUBST(HAVE_BLUEZ) +AM_CONDITIONAL([HAVE_BLUEZ], [test "x$HAVE_BLUEZ" = x1]) + +#### Bluetooth A2DP aptx codec support(optional) #### +AC_ARG_ENABLE([bt_a2dp_aptx], + AS_HELP_STRING([--enable-bt-a2dp-aptx],[Enable optional Bluetooth A2DP aptx codec support(arm only)]), + [ + case "${enableval}" in + yes) bt_a2dp_aptx=yes ;; + no) bt_a2dp_aptx=no ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-bt-a2dp-aptx) ;; + esac + ], + [bt_a2dp_aptx=false]) +if test "x${bt_a2dp_aptx}" == xyes ; then + HAVE_BT_A2DP_APTX=1 +else + HAVE_BT_A2DP_APTX=0 +fi + +AC_SUBST(HAVE_BT_A2DP_APTX) +AM_CONDITIONAL([HAVE_BT_A2DP_APTX], [test "x$HAVE_BT_A2DP_APTX" = x1]) + +#### D-Bus support (optional) #### + +AC_ARG_ENABLE([dbus], + AS_HELP_STRING([--disable-dbus],[Disable optional D-Bus support]), + [ + case "${enableval}" in + yes) dbus=yes ;; + no) dbus=no ;; + *) AC_MSG_ERROR(bad value ${enableval} for --disable-dbus) ;; + esac + ], + [dbus=auto]) + +if test "x$HAVE_HAL" = x1 ; then + dbus=yes +fi + +if test "x${dbus}" != xno || test "x${bluez}" != xno || test "x${hal}" != xno ; then + + PKG_CHECK_MODULES(DBUS, [ dbus-1 >= 1.0.0 ], + [ + HAVE_DBUS=1 + saved_LIBS="$LIBS" + LIBS="$LIBS $DBUS_LIBS" + AC_CHECK_FUNCS(dbus_watch_get_unix_fd) + LIBS="$saved_LIBS" + AC_DEFINE([HAVE_DBUS], 1, [Have D-Bus.]) + ], + [ + HAVE_DBUS=0 + if test "x$dbus" = xyes ; then + AC_MSG_ERROR([*** D-Bus support not found]) + fi + ]) +else + HAVE_DBUS=0 +fi + +AC_SUBST(DBUS_CFLAGS) +AC_SUBST(DBUS_LIBS) +AC_SUBST(HAVE_DBUS) +AM_CONDITIONAL([HAVE_DBUS], [test "x$HAVE_DBUS" = x1]) + +### IPv6 connection support (optional) ### + +AC_ARG_ENABLE([ipv6], + AS_HELP_STRING([--disable-ipv6],[Disable optional IPv6 support]), + [ + case "${enableval}" in + yes) ipv6=yes ;; + no) ipv6=no ;; + *) AC_MSG_ERROR(bad value ${enableval} for --disable-ipv6) ;; + esac + ], + [ipv6=auto]) + +if test "x${ipv6}" != xno ; then + AC_DEFINE([HAVE_IPV6], [1], [Define this to enable IPv6 connection support]) + HAVE_IPV6=1 +else + HAVE_IPV6=0 +fi + +#### OpenSSL support (optional) #### + +AC_ARG_ENABLE([openssl], + AS_HELP_STRING([--disable-openssl],[Disable OpenSSL support (used for Airtunes/RAOP)]), + [ + case "${enableval}" in + yes) openssl=yes ;; + no) openssl=no ;; + *) AC_MSG_ERROR(bad value ${enableval} for --disable-openssl) ;; + esac + ], + [openssl=auto]) + +if test "x${openssl}" != xno ; then + + PKG_CHECK_MODULES(OPENSSL, [ openssl > 0.9 ], + [ + HAVE_OPENSSL=1 + AC_DEFINE([HAVE_OPENSSL], 1, [Have OpenSSL]) + ], + [ + HAVE_OPENSSL=0 + if test "x$openssl" = xyes ; then + AC_MSG_ERROR([*** OpenSSL support not found]) + fi + ]) +else + HAVE_OPENSSL=0 +fi + +AC_SUBST(OPENSSL_CFLAGS) +AC_SUBST(OPENSSL_LIBS) +AC_SUBST(HAVE_OPENSSL) +AM_CONDITIONAL([HAVE_OPENSSL], [test "x$HAVE_OPENSSL" = x1]) + +### ORC (optional) ### +ORC_CHECK([0.4.9]) + +### Build and Install man pages ### +AC_ARG_ENABLE(manpages, + AS_HELP_STRING([--disable-manpages],[Disable building and installation of man pages]), +[case "${enableval}" in + yes) manpages=yes ;; + no) manpages=no ;; + *) AC_MSG_ERROR([bad value ${enableval} for --disable-manpages]) ;; +esac],[manpages=yes]) + +AM_CONDITIONAL([BUILD_MANPAGES], [test "x$manpages" = xyes]) + +#### PulseAudio system group & user ##### + +AC_ARG_WITH(system_user, AS_HELP_STRING([--with-system-user=],[User for running the PulseAudio daemon as a system-wide instance (pulse)])) +if test -z "$with_system_user" ; then + PA_SYSTEM_USER=pulse +else + PA_SYSTEM_USER=$with_system_user +fi +AC_SUBST(PA_SYSTEM_USER) +AC_DEFINE_UNQUOTED(PA_SYSTEM_USER,"$PA_SYSTEM_USER", [User for running the PulseAudio system daemon]) + +AC_ARG_WITH(system_group,AS_HELP_STRING([--with-system-group=],[Group for running the PulseAudio daemon as a system-wide instance (pulse)])) +if test -z "$with_system_group" ; then + PA_SYSTEM_GROUP=pulse +else + PA_SYSTEM_GROUP=$with_system_group +fi +AC_SUBST(PA_SYSTEM_GROUP) +AC_DEFINE_UNQUOTED(PA_SYSTEM_GROUP,"$PA_SYSTEM_GROUP", [Group for the PulseAudio system daemon]) + +AC_ARG_WITH(access_group,AS_HELP_STRING([--with-access-group=],[Group which is allowed access to a system-wide PulseAudio daemon (pulse-access)])) +if test -z "$with_access_group" ; then + PA_ACCESS_GROUP=pulse-access +else + PA_ACCESS_GROUP=$with_access_group +fi +AC_SUBST(PA_ACCESS_GROUP) +AC_DEFINE_UNQUOTED(PA_ACCESS_GROUP,"$PA_ACCESS_GROUP", [Access group]) + +AC_ARG_ENABLE( + per_user_esound_socket, + AS_HELP_STRING([--disable-per-user-esound-socket], [Use global esound socket directory /tmp/.esd/socket.]), + [ + case "${enableval}" in + yes) per_user_esound_socket=1 ;; + no) per_user_esound_socket=0 ;; + *) AC_MSG_ERROR(bad value ${enableval} for --disable-per-user-esound-socket) ;; + esac + ], + [per_user_esound_socket=1]) + +if test "x$per_user_esound_socket" = "x1"; then + AC_DEFINE([USE_PER_USER_ESOUND_SOCKET], [1], [Define this if you want per-user esound socket directories]) +fi + +#### PulseAudio system runtime dir #### +PA_SYSTEM_RUNTIME_PATH="${localstatedir}/run/pulse" +AC_SUBST(PA_SYSTEM_RUNTIME_PATH) +PA_SYSTEM_CONFIG_PATH="${localstatedir}/lib/pulse" +AC_SUBST(PA_SYSTEM_CONFIG_PATH) +PA_SYSTEM_STATE_PATH="${localstatedir}/lib/pulse" +AC_SUBST(PA_SYSTEM_STATE_PATH) + +################################### +# Output # +################################### + +AC_ARG_ENABLE([legacy-runtime-dir], + AS_HELP_STRING([--disable-legacy-runtime-dir], [Try to connect on legacy (< 0.9.12) socket paths.])) +if test "x$enable_legacy_runtime_dir" != "xno" ; then + AC_DEFINE(ENABLE_LEGACY_RUNTIME_DIR, [1], [Legacy runtime dir]) +fi + +AC_ARG_ENABLE( + [static-bins], + AS_HELP_STRING([--enable-static-bins],[Statically link executables.]), + [STATIC_BINS=1], [STATIC_BINS=0]) +AM_CONDITIONAL([STATIC_BINS], [test "x$STATIC_BINS" = "x1"]) + +AC_ARG_WITH( + [preopen-mods], + AS_HELP_STRING([--with-preopen-mods],[Modules to preopen in daemon (default: all).]), + [PREOPEN_MODS=$withval], [PREOPEN_MODS="all"]) +AM_CONDITIONAL([PREOPEN_MODS], [test "x$PREOPEN_MODS" != "xall"]) +if test "x$PREOPEN_MODS" != "xall" ; then + tmpLIBS="" + for mod in $PREOPEN_MODS; do + tmpLIBS="$tmpLIBS module-$mod.la" + done + PREOPEN_MODS="$tmpLIBS" + AC_SUBST(PREOPEN_MODS) +fi + +AC_ARG_WITH( + [module-dir], + AS_HELP_STRING([--with-module-dir],[Directory where to install the modules to (defaults to ${libdir}/pulse-${PA_MAJORMINORMICRO}/modules]), + [modlibexecdir=$withval], [modlibexecdir="${libdir}/pulse-${PA_MAJORMINORMICRO}/modules"]) + +AC_SUBST(modlibexecdir) + +AC_ARG_ENABLE( + [force-preopen], + AS_HELP_STRING([--enable-force-preopen],[Preopen modules, even when dlopen() is supported.]), + [FORCE_PREOPEN=$enableval], [FORCE_PREOPEN=no]) +AM_CONDITIONAL([FORCE_PREOPEN], [test "x$FORCE_PREOPEN" = "xyes"]) + +AC_CONFIG_FILES([ +Makefile +src/Makefile +man/Makefile +libpulse.pc +libpulse-simple.pc +libpulse-browse.pc +libpulse-mainloop-glib.pc +doxygen/Makefile +doxygen/doxygen.conf +src/pulse/version.h +po/Makefile.in +]) + +AC_OUTPUT + +# ========================================================================== +ENABLE_X11=no +if test "x$HAVE_X11" = "x1" ; then + ENABLE_X11=yes +fi + +ENABLE_OSS_OUTPUT=no +ENABLE_OSS_WRAPPER=no +if test "x$HAVE_OSS" = "x1" ; then + if test "x$enable_oss_output" != "xno"; then + ENABLE_OSS_OUTPUT=yes + fi + if test "x$enable_oss_wrapper" != "xno"; then + ENABLE_OSS_WRAPPER=yes + fi +fi + +ENABLE_ALSA=no +if test "x$HAVE_ALSA" = "x1" ; then + ENABLE_ALSA=yes +fi + +ENABLE_SOLARIS=no +if test "x$HAVE_SOLARIS" = "x1" ; then + ENABLE_SOLARIS=yes +fi + +ENABLE_GTK20=no +if test "x$HAVE_GTK20" = "x1" ; then + ENABLE_GTK20=yes +fi + +ENABLE_GLIB20=no +if test "x$HAVE_GLIB20" = "x1" ; then + ENABLE_GLIB20=yes +fi + +ENABLE_GCONF=no +if test "x$HAVE_GCONF" = "x1" ; then + ENABLE_GCONF=yes +fi + +ENABLE_AVAHI=no +if test "x$HAVE_AVAHI" = "x1" ; then + ENABLE_AVAHI=yes +fi + +ENABLE_JACK=no +if test "x$HAVE_JACK" = "x1" ; then + ENABLE_JACK=yes +fi + +ENABLE_LIBASYNCNS=no +if test "x$HAVE_LIBASYNCNS" = "x1" ; then + ENABLE_LIBASYNCNS=yes +fi + +ENABLE_LIRC=no +if test "x$HAVE_LIRC" = "x1" ; then + ENABLE_LIRC=yes +fi + +ENABLE_HAL=no +if test "x$HAVE_HAL" = "x1" ; then + ENABLE_HAL=yes +fi + +ENABLE_UDEV=no +if test "x$HAVE_UDEV" = "x1" ; then + ENABLE_UDEV=yes +fi + +ENABLE_HAL_COMPAT=no +if test "x$HAVE_HAL_COMPAT" = "x1" ; then + ENABLE_HAL_COMPAT=yes +fi + +ENABLE_TCPWRAP=no +if test "x${LIBWRAP_LIBS}" != x ; then + ENABLE_TCPWRAP=yes +fi + +ENABLE_LIBSAMPLERATE=no +if test "x${HAVE_LIBSAMPLERATE}" = "x1" ; then + ENABLE_LIBSAMPLERATE=yes +fi + +ENABLE_BLUEZ=no +if test "x${HAVE_BLUEZ}" = "x1" ; then + ENABLE_BLUEZ=yes +fi + +ENABLE_BT_A2DP_APTX=no +if test "x${HAVE_BT_A2DP_APTX}" = "x1" ; then + ENABLE_BT_A2DP_APTX=yes +fi + + +ENABLE_GDBM=no +if test "x${HAVE_GDBM}" = "x1" ; then + ENABLE_GDBM=yes +fi + +ENABLE_TDB=no +if test "x${HAVE_TDB}" = "x1" ; then + ENABLE_TDB=yes +fi + +ENABLE_SIMPLEDB=no +if test "x${HAVE_SIMPLEDB}" = "x1" ; then + ENABLE_SIMPLEDB=yes +fi + +ENABLE_OPENSSL=no +if test "x${HAVE_OPENSSL}" = "x1" ; then + ENABLE_OPENSSL=yes +fi + +ENABLE_IPV6=no +if test "x${HAVE_IPV6}" = "x1" ; then + ENABLE_IPV6=yes +fi + +ENABLE_PER_USER_ESOUND_SOCKET=no +if test "x$per_user_esound_socket" = "x1" ; then + ENABLE_PER_USER_ESOUND_SOCKET=yes +fi + +echo " + ---{ $PACKAGE_NAME $VERSION }--- + + prefix: ${prefix} + sysconfdir: ${sysconfdir} + localstatedir: ${localstatedir} + System Runtime Path: ${PA_SYSTEM_RUNTIME_PATH} + System State Path: ${PA_SYSTEM_STATE_PATH} + System Config Path: ${PA_SYSTEM_CONFIG_PATH} + Compiler: ${CC} + CFLAGS: ${CFLAGS} + + Have X11: ${ENABLE_X11} + Enable OSS Output: ${ENABLE_OSS_OUTPUT} + Enable OSS Wrapper: ${ENABLE_OSS_WRAPPER} + Enable Alsa: ${ENABLE_ALSA} + Enable Solaris: ${ENABLE_SOLARIS} + Enable GLib 2.0: ${ENABLE_GLIB20} + Enable Gtk+ 2.0: ${ENABLE_GTK20} + Enable GConf: ${ENABLE_GCONF} + Enable Avahi: ${ENABLE_AVAHI} + Enable Jack: ${ENABLE_JACK} + Enable Async DNS: ${ENABLE_LIBASYNCNS} + Enable LIRC: ${ENABLE_LIRC} + Enable HAL: ${ENABLE_HAL} + Enable udev: ${ENABLE_UDEV} + Enable HAL->udev compat: ${ENABLE_HAL_COMPAT} + Enable BlueZ: ${ENABLE_BLUEZ} + Enable TCP Wrappers: ${ENABLE_TCPWRAP} + Enable libsamplerate: ${ENABLE_LIBSAMPLERATE} + Enable IPv6: ${ENABLE_IPV6} + Enable OpenSSL (for Airtunes): ${ENABLE_OPENSSL} + Enable tdb: ${ENABLE_TDB} + Enable gdbm: ${ENABLE_GDBM} + Enable simple database: ${ENABLE_SIMPLEDB} + Enable orc: ${ENABLE_ORC} + + System User: ${PA_SYSTEM_USER} + System Group: ${PA_SYSTEM_GROUP} + Access Group: ${PA_ACCESS_GROUP} + Enable per-user EsounD socket: ${ENABLE_PER_USER_ESOUND_SOCKET} + Force preopen: ${FORCE_PREOPEN} + Preopened modules: ${PREOPEN_MODS} +" diff --git a/debian/README.Debian b/debian/README.Debian new file mode 100644 index 0000000..1572405 --- /dev/null +++ b/debian/README.Debian @@ -0,0 +1,20 @@ +pulseaudio for Debian +--------------------- + +The pulseaudio executable is installed suid root. This is the recommended +configuration as it allows pulseaudio to run with realtime priority. After +grabbing the realtime capability, pulseaudio drops all other root +priviledges. Only users in the pulse-rt group are granted realtime +priviledges in this way. It is highly recommended that all users that will +be running pulseaudio should be add to the pulse-rt group to prevent +skipping and dropouts in audio output. You should also enable the +high-priority option in /etc/pulse/daemon.conf to ensure that pulseaudio is +started with realtime priority. + +PLEASE NOTE: PulseAudio's default configuration uses high quality sample +rate conversion that may be overly CPU intensive. If PulseAudio's CPU usage +is unacceptable on your hardware, please change the resample-method option +in /etc/pulse/daemon.conf to either src-linear or trivial. See daemon.conf +for more details. + + -- CJ van den Berg , Mon, 28 Aug 2006 00:31:10 +0200 diff --git a/debian/changelog b/debian/changelog new file mode 100644 index 0000000..7a4f83b --- /dev/null +++ b/debian/changelog @@ -0,0 +1,7 @@ +pulseaudio (0.9.21-7slp2+10) unstable; urgency=low + + * Initial release + * Git: pkgs/p/pulseaudio + * Tag: pulseaudio_0.9.21-7slp2+10 + + -- Seungbae Shin Wed, 07 Dec 2011 12:10:02 +0900 diff --git a/debian/compat b/debian/compat new file mode 100644 index 0000000..7ed6ff8 --- /dev/null +++ b/debian/compat @@ -0,0 +1 @@ +5 diff --git a/debian/control b/debian/control new file mode 100644 index 0000000..231cd8b --- /dev/null +++ b/debian/control @@ -0,0 +1,167 @@ +Source: pulseaudio +Section: sound +Priority: optional +Maintainer: Pulseaudio maintenance team +Uploaders: Seungbae Shin , YoungHwan Ahn +Build-Depends: debhelper (>= 5), cdbs, quilt, m4, + libsndfile1-dev (>= 1.0.20), + libasound2-dev (>= 1.0.19) [!kfreebsd-i386 !kfreebsd-amd64 !hurd-i386], + libbluetooth-dev (>= 4.40) [!kfreebsd-i386 !kfreebsd-amd64 !hurd-i386], + intltool, libdbus-1-dev, libspeexdsp-dev, + libssl-dev, + libslp-pm-dev, dlog-dev, libglib2.0-dev, libslp-setting-dev, + autoconf (>= 2.63), automake +Standards-Version: 3.8.1 +Vcs-Git: git://git.debian.org/git/pkg-pulseaudio/pulseaudio.git +Vcs-Browser: http://git.debian.org/?p=pkg-pulseaudio/pulseaudio.git +Homepage: http://www.pulseaudio.org + +Package: pulseaudio +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends}, + lsb-base (>= 3.2-13), libslp-pm-0, libdlog-0, libslp-setting-0 +Conflicts: libltdl3 (<< 1.5.24-1) +Recommends: pulseaudio-module-x11, + libasound2-plugins, gstreamer0.10-pulseaudio, + pulseaudio-esound-compat +Suggests: pulseaudio-utils, pavumeter, pavucontrol, paman, paprefs +Description: PulseAudio sound server + PulseAudio, previously known as Polypaudio, is a sound server for POSIX and + WIN32 systems. It is a drop in replacement for the ESD sound server with + much better latency, mixing/re-sampling quality and overall architecture. + . + These are some of PulseAudio's features: + . + * High quality software mixing of multiple audio streams with support for + more than one sink/source. May be used to combine multiple sound cards + into one (with sample rate adjustment). + . + * Wide range of supported client libraries. ESD, ALSA, oss, libao and + GStreamer client applications are supported as-is. Native PulseAudio + plug-ins are also available for xmms and mplayer. + . + * Good low latency behaviour and very accurate latency measurement for + playback and recording. Ability to fully synchronize multiple playback + streams. + . + * Network transparency, allowing an application to play back or record + audio on a different machine than the one it is running on. + . + * Extensible plug-in architecture with plug-ins for jackd, multicast-rtp + lirc and avahi, just to name a few. + . + This package contains the daemon and basic module set. + +Package: pulseaudio-dbg +Architecture: any +Priority: extra +Section: debug +Depends: ${misc:Depends}, pulseaudio (= ${binary:Version}) +Description: PulseAudio sound server detached debugging symbols + PulseAudio, previously known as Polypaudio, is a sound server for POSIX and + WIN32 systems. It is a drop in replacement for the ESD sound server with + much better latency, mixing/re-sampling quality and overall architecture. + . + This package contains the detached debugging symbols for the daemon and + basic module set. + +Package: pulseaudio-utils +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends} +Description: Command line tools for the PulseAudio sound server + PulseAudio, previously known as Polypaudio, is a sound server for POSIX and + WIN32 systems. It is a drop in replacement for the ESD sound server with + much better latency, mixing/re-sampling quality and overall architecture. + . + These tools provide command line access to various features of the + PulseAudio sound server. Included tools are: + . + pabrowse - Browse available PulseAudio servers on the local network. + paplay - Playback a WAV file via a PulseAudio sink. + pacat - Cat raw audio data to a PulseAudio sink. + parec - Cat raw audio data from a PulseAudio source. + pacmd - Connect to PulseAudio's built-in command line control interface. + pactl - Send a control command to a PulseAudio server. + padsp - /dev/dsp wrapper to transparently support OSS applications. + pax11publish - Store/retrieve PulseAudio default server/sink/source + settings in the X11 root window. + +Package: pulseaudio-utils-dbg +Architecture: any +Priority: extra +Section: debug +Depends: ${misc:Depends}, pulseaudio-utils (= ${binary:Version}) +Description: PulseAudio command line tools detached debugging symbols + PulseAudio, previously known as Polypaudio, is a sound server for POSIX and + WIN32 systems. It is a drop in replacement for the ESD sound server with + much better latency, mixing/re-sampling quality and overall architecture. + . + This package contains detached debugging symbols for the command line tools. + +Package: pulseaudio-module-bluetooth +Architecture: alpha amd64 arm armel hppa i386 ia64 mips mipsel powerpc s390 sparc +Priority: extra +Depends: ${shlibs:Depends}, ${misc:Depends}, bluez (>= 4.40) +Conflicts: pulseaudio (<< 0.9.14-2) +Description: Bluetooth module for PulseAudio sound server + PulseAudio, previously known as Polypaudio, is a sound server for POSIX and + WIN32 systems. It is a drop in replacement for the ESD sound server with + much better latency, mixing/re-sampling quality and overall architecture. + . + This module enables PulseAudio to work with bluetooth devices, like headset + or audio gateway. + . + The module is called module-bluetooth + +Package: pulseaudio-module-bluetooth-dbg +Architecture: alpha amd64 arm armel hppa i386 ia64 mips mipsel powerpc s390 sparc +Priority: extra +Section: debug +Depends: ${misc:Depends}, pulseaudio-module-bluetooth (= ${binary:Version}) +Description: Bluetooth module for PulseAudio sound server + PulseAudio, previously known as Polypaudio, is a sound server for POSIX and + WIN32 systems. It is a drop in replacement for the ESD sound server with + much better latency, mixing/re-sampling quality and overall architecture. + . + This package contains debugging symbols for the PulseAudio bluetooth module. + +Package: libpulse0 +Section: libs +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends} +Breaks: pavucontrol (<< 0.9.8) +Suggests: pulseaudio +Description: PulseAudio client libraries + PulseAudio, previously known as Polypaudio, is a sound server for POSIX and + WIN32 systems. It is a drop in replacement for the ESD sound server with + much better latency, mixing/re-sampling quality and overall architecture. + . + Client libraries used by applications that access a PulseAudio sound server + via PulseAudio's native interface. + +Package: libpulse0-dbg +Section: debug +Architecture: any +Priority: extra +Depends: ${misc:Depends}, libpulse0 (= ${binary:Version}) +Description: PulseAudio client libraries detached debugging symbols + PulseAudio, previously known as Polypaudio, is a sound server for POSIX and + WIN32 systems. It is a drop in replacement for the ESD sound server with + much better latency, mixing/re-sampling quality and overall architecture. + . + This package contains detached debugging symbols for the PulseAudio native + interface client libraries. + +Package: libpulse-dev +Section: libdevel +Architecture: any +Depends: ${misc:Depends}, + libpulse0 (= ${binary:Version}), + libglib2.0-dev,dlog-dev, libslp-setting-dev +Description: PulseAudio client development headers and libraries + PulseAudio, previously known as Polypaudio, is a sound server for POSIX and + WIN32 systems. It is a drop in replacement for the ESD sound server with + much better latency, mixing/re-sampling quality and overall architecture. + . + Headers and libraries for developing applications that access a PulseAudio + sound server via PulseAudio's native interface. diff --git a/debian/copyright b/debian/copyright new file mode 100644 index 0000000..ed05c03 --- /dev/null +++ b/debian/copyright @@ -0,0 +1,498 @@ +This package was debianized by CJ van den Berg on +Thu, 10 Aug 2006 15:59:43 +0200. + +It was downloaded from . + + Upstream Authors + ================ + + Lennart Poettering + Pierre Ossman , + through his employer Cendio + +Files: * +Copyright: + Copyright (C) 2004-2009 Lennart Poettering + Copyright (C) 2006-2007 Pierre Ossman for Cendio AB +License: LGPL-2.1+ + The upstream license clarifies pretty well that the sources of pulseaudio are + LGPL (please see LGPL license grant below), but that some parts will be + effectively GPL since they rely on GPL libraries, quoting the upstream + LICENSE: + + """All PulseAudio source files are licensed under the GNU Lesser General + Public License. (see file LGPL for details) + + However, the server side links to the GPL-only library 'libsamplerate' + which practically downgrades the license of the server part to GPL (see + file GPL for details), exercising section 3 of the LGPL. + + Hence you should treat the client library ('libpulse') of PulseAudio as + being LGPL licensed and the server part ('libpulsecore') as being GPL + licensed. Since the PulseAudio daemon and the modules link to + 'libpulsecore' they are of course also GPL licensed. + + -- Lennart Poettering, April 20th, 2006.""" + + On Debian systems, the complete text of the LGPL-2.1 can be found in + /usr/share/common-licenses/LGPL-2.1. + +File: src/pulsecore/g711.c +Copyright: + Copyright (C) Sun Microsystems, Inc +License: + This source code is a product of Sun Microsystems, Inc. and is provided + for unrestricted use. Users may copy or modify this source code without + charge. + + SUN SOURCE CODE IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING + THE WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR + PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. + + Sun source code is provided with no support and without any obligation on + the part of Sun Microsystems, Inc. to assist in its use, correction, + modification or enhancement. + + SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE + INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY THIS SOFTWARE + OR ANY PART THEREOF. + + In no event will Sun Microsystems, Inc. be liable for any lost revenue + or profits or other special, indirect and consequential damages, even if + Sun has been advised of the possibility of such damages. + +Files: src/pulsecore/g711.h +Copyright: + Copyright (C) 2001 Chris Bagwell +Licence: + Permission to use, copy, modify, and distribute this software and its + documentation for any purpose and without fee is hereby granted, provided + that the above copyright notice appear in all copies and that both that + copyright notice and this permission notice appear in supporting + documentation. This software is provided "as is" without express or + implied warranty. + +Files: src/pulsecore/poll.* +Copyright: + Copyright 2006 Pierre Ossman for Cendio AB + Copyright (C)1994,96,97,98,99,2000,2001,2004 Free Software Foundation, Inc. +License: LGPL-2.1+ + On Debian systems, the complete text of the LGPL-2 can be found in + /usr/share/common-licenses/LGPL-2.1. + +Files: src/pulse/utf8.c +Copyright: + Copyright (C) 1999 Tom Tromey + Copyright (C) 2000 Red Hat, Inc. +License: LGPL-2.1+ + On Debian systems, the complete text of the LGPL-2.1 can be found in + /usr/share/common-licenses/LGPL-2.1. + +Files: src/modules/bluetooth/ipc.*, src/modules/bluetooth/rtp.* +Copyright: + Copyright (C) 2004-2009 Marcel Holtmann +License: LGPL-2.1+ + On Debian systems, the complete text of the LGPL-2.1 can be found in + /usr/share/common-licenses/LGPL-2.1. + +Files: src/modules/bluetooth/module-bluetooth-{device,discover}.c, + src/modules/bluetooth/bluetooth-util.* +Copyright: + Copyright (C) 2008-2009 Joao Paulo Rechi Vita +License: LGPL-2.1+ + On Debian systems, the complete text of the LGPL-2 can be found in + /usr/share/common-licenses/LGPL-2. + +File: src/modules/bluetooth/proximity-helper.c +Copyright: + Copyright (C) 2000-2001 Qualcomm Incorporated + Copyright (C) 2002-2003 Maxim Krasnyansky + Copyright (C) 2002-2007 Marcel Holtmann +License: GPL-2+ + On Debian systems, the complete text of the GPL-2 can be found in + /usr/share/common-licenses/GPL-2. + +Files: src/modules/bluetooth/sbc* +Copyright: + Copyright (C) 2004-2009 Marcel Holtmann + Copyright (C) 2004-2005 Henryk Ploetz + Copyright (C) 2005-2006 Brad Midgley +License: LGPL-2.1+ + On Debian systems, the complete text of the LGPL-2.1 can be found in + /usr/share/common-licenses/LGPL-2.1. + +Files: src/modules/module-device-manager.* +Copyright: + Copyright 2006-2008 Lennart Poettering + Copyright (C) 2009 Colin Guthrie +License: LGPL-2.1+ + On Debian systems, the complete text of the LGPL-2 can be found in + /usr/share/common-licenses/LGPL-2.1. + +Files: src/pulsecore/dbus-*.*, src/modules/module-hal-detect.c +Copyright: + Copyright 2006 Lennart Poettering + Copyright 2006 Shams E. King +License: LGPL-2.1+ + On Debian systems, the complete text of the LGPL-2 can be found in + /usr/share/common-licenses/LGPL-2.1. + +File: src/modules/ladspa.h +Copyright: + Copyright (C) 2000-2002 Richard W.E. Furse, Paul Barton-Davis, Stefan + Westerfeld. +License: LGPL-2.1+ + On Debian systems, the complete text of the LGPL-2.1 can be found in + /usr/share/common-licenses/LGPL-2.1. + +Files: src/modules/module-always-sink.c, src/modules/rtp/rtsp_client.* +Copyright: + Copyright (C) 2008 Colin Guthrie +License: LGPL-2.1+ + On Debian systems, the complete text of the LGPL-2 can be found in + /usr/share/common-licenses/LGPL-2.1. + +Files: src/modules/module-detect.c +Copyright: + Copyright 2006 Lennart Poettering + Copyright 2006 Pierre Ossman for Cendio AB + Copyright 2006 Diego Petteno +License: LGPL-2.1+ + On Debian systems, the complete text of the LGPL-2 can be found in + /usr/share/common-licenses/LGPL-2.1. + +Files: src/modules/roap/*roap*, src/modules/rtp/headerlist.* +Copyright: + Copyright 2005-2007 Lennart Poettering + Copyright (C) 2008 Colin Guthrie +License: LGPL-2.1+ + On Debian systems, the complete text of the LGPL-2 can be found in + /usr/share/common-licenses/LGPL-2.1. + +Files: src/modules/roap/base64.* +Copyright: + Copyright (C) 2008 Colin Guthrie + Copyright (C) Kungliga Tekniska Hogskolan +License: LGPL-2.1+ + On Debian systems, the complete text of the LGPL-2 can be found in + /usr/share/common-licenses/LGPL-2.1. + +Files: src/modules/module-solaris.c +Copyright: + Copyright 2006 Lennart Poettering + Copyright 2006-2007 Pierre Ossman for Cendio AB + Copyright 2009 Finn Thain +License: LGPL-2.1+ + On Debian systems, the complete text of the LGPL-2 can be found in + /usr/share/common-licenses/LGPL-2.1. + +Files: src/modules/reserve.* +Copyright: + Copyright 2009 (C) Lennart Poettering +License: + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation files + (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, + publish, distribute, sublicense, and/or sell copies of the Software, + and to permit persons to whom the Software is furnished to do so, + subject to the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. + +Files: src/pulsecore/atomic.h +Copyright: + Copyright (C) 2006-2008 Lennart Poettering + Copyright (C) 2008 Nokia Corporation +License: LGPL-2.1+ + On Debian systems, the complete text of the LGPL-2 can be found in + /usr/share/common-licenses/LGPL-2.1. + +File: src/pulsecore/core-util.c +Copyright: + Copyright (C) 2004-2006 Lennart Poettering + Copyright (C) 2004 Joe Marcus Clarke + Copyright (C) 2006-2007 Pierre Ossman for Cendio AB +License: LGPL-2.1+ + On Debian systems, the complete text of the LGPL-2.1 can be found in + /usr/share/common-licenses/LGPL-2.1. + +Files: src/pulse/ext-device-manager.* +Copyright: + Copyright (C) 2008 Lennart Poettering + Copyright (C) 2009 Colin Guthrie +License: LGPL-2.1+ + On Debian systems, the complete text of the LGPL-2 can be found in + /usr/share/common-licenses/LGPL-2.1. + +File: src/pulsecore/ffmpeg/avcodec.h +Copyright: + Copyright (c) 2001 Fabrice Bellard +License: LGPL-2.1+ + On Debian systems, the complete text of the LGPL-2.1 can be found in + /usr/share/common-licenses/LGPL-2.1. + +File: src/pulsecore/ffmpeg/resample2.c +Copyright: + Copyright (c) 2004 Michael Niedermayer +License: LGPL-2.1+ + On Debian systems, the complete text of the LGPL-2.1 can be found in + /usr/share/common-licenses/LGPL-2.1. + +File: src/pulsecore/socket-util.c +Copyright: + Copyright (C) 2004-2006 Lennart Poettering + Copyright (C) 2004 Joe Marcus Clarke + Copyright (C) 2006-2007 Pierre Ossman for Cendio AB +License: LGPL-2.1+ + On Debian systems, the complete text of the LGPL-2 can be found in + /usr/share/common-licenses/LGPL-2.1. + +File: man/xmltoman +Copyright: + Copyright (C) 2000-2002 Oliver Kurth + Copyright (C) 2003 Lennart Poettering +License: LGPL-2+ + On Debian systems, the complete text of the LGPL-2 can be found in + /usr/share/common-licenses/LGPL-2. + +File: po/ca.po +Copyright: + Copyright (C) 2008 Xavier Conde Rueda + Copyright (C) 2009 Agustí Grau , 2009. + Copyright (C) Judith Pintó Subirada + Copyright (C) 2009 Josep Torné Llavall + +License: LGPL-2.1+ + On Debian systems, the complete text of the LGPL-2.1 can be found in + /usr/share/common-licenses/LGPL-2.1. + +File: po/cs.po +Copyright: + Copyright (C) 2008,2009 Petr Kovar +License: LGPL-2.1+ + On Debian systems, the complete text of the LGPL-2.1 can be found in + /usr/share/common-licenses/LGPL-2.1. + +File: po/de.po +Copyright: + Copyright (C) 2008,2009 Fabian Affolter + Copyright (C) 2008,2009 Micha Pietsch +License: LGPL-2.1+ + On Debian systems, the complete text of the LGPL-2.1 can be found in + /usr/share/common-licenses/LGPL-2.1. + +File: po/de_CH.po +Copyright: + Copyright (C) 2008, 2009 Fabian Affolter + Copyright (C) 2008, 2009 Micha Pietsch +License: LGPL-2.1+ + On Debian systems, the complete text of the LGPL-2.1 can be found in + /usr/share/common-licenses/LGPL-2.1. + +File: po/el.po +Copyright: + Copyright (C) 2008 Dimitris Glezos + Copyright (C) 2009 Thalia Papoutsaki +License: LGPL-2.1+ + On Debian systems, the complete text of the LGPL-2.1 can be found in + /usr/share/common-licenses/LGPL-2.1. + +File: po/es.po +Copyright: + Copyright (C) 2009 Domingo Becker + Copyright (C) 2008 Hector Daniel Cabrera + Copyright (C) 2009 Fernando Gonzalez Blanco +License: LGPL-2.1+ + On Debian systems, the complete text of the LGPL-2.1 can be found in + /usr/share/common-licenses/LGPL-2.1. + +File: po/fi.po +Copyright: + Copyright (C) 2009 Timo Jyrinki + Copyright (C) 2009 Ville-Pekka Vainio +License: LGPL-2.1+ + On Debian systems, the complete text of the LGPL-2.1 can be found in + /usr/share/common-licenses/LGPL-2.1. + +File: po/fr.po +Copyright: + Copyright (C) 2008 Robert-Andre Mauchin + Copyright (C) 2008 Michael Ughetto + Copyright (C) 2008 Pablo Martin-Gomez + Copyright (C) 2009 Corentin Perard +License: LGPL-2.1+ + On Debian systems, the complete text of the LGPL-2.1 can be found in + /usr/share/common-licenses/LGPL-2.1. + +File: po/gu.po +Copyright: + Copyright (C) 2009 Sweta Kothari +License: LGPL-2.1+ + On Debian systems, the complete text of the LGPL-2.1 can be found in + /usr/share/common-licenses/LGPL-2.1. + +File: po/hi.po +Copyright: + Copyright (C) 2009 Rajesh Ranjan +License: LGPL-2.1+ + On Debian systems, the complete text of the LGPL-2.1 can be found in + /usr/share/common-licenses/LGPL-2.1. + +File: po/it.po +Copyright: + Copyright (C) 2008,2009 Luca Ferretti + Copyright (C) 2009 Milo Casagrande + Copyright (C) 2009 ario_santagiuliana + Copyright (C) 2009 Milo Casagrande + +License: LGPL-2.1+ + On Debian systems, the complete text of the LGPL-2.1 can be found in + /usr/share/common-licenses/LGPL-2.1. + +File: po/ja.po +Copyright: + Copyright (C) 2009 Hyu_gabaru Ryu_ichi +License: LGPL-2.1+ + On Debian systems, the complete text of the LGPL-2.1 can be found in + /usr/share/common-licenses/LGPL-2.1. + +File: po/kn.po +Copyright: + Copyright (C) 2009 Shankar Prasad +License: LGPL-2.1+ + On Debian systems, the complete text of the LGPL-2.1 can be found in + /usr/share/common-licenses/LGPL-2.1. + +File: po/mr.po +Copyright: + Copyright (C) 2009 Sandeep Shedmake + Copyright (C) 2009 Sandeep Shedmake +License: LGPL-2.1+ + On Debian systems, the complete text of the LGPL-2.1 can be found in + /usr/share/common-licenses/LGPL-2.1. + +File: po/nl.po +Copyright: + Copyright (C) 2009 Geert Warrink + Copyright (C) 2009 Reinout van Schouwen +License: LGPL-2.1+ + On Debian systems, the complete text of the LGPL-2.1 can be found in + /usr/share/common-licenses/LGPL-2.1. + +File: po/or.po +Copyright: + Copyright (C) 2009 Manoj Kumar Giri +License: LGPL-2.1+ + On Debian systems, the complete text of the LGPL-2.1 can be found in + /usr/share/common-licenses/LGPL-2.1. + +File: po/pa.po +Copyright: + Copyright (C) 2009 Amanpreet Singh Alam + Copyright (C) 2009 Jaswinder Singh + Copyright (C) 2009 A S Alam +License: LGPL-2.1+ + On Debian systems, the complete text of the LGPL-2.1 can be found in + /usr/share/common-licenses/LGPL-2.1. + +File: po/pl.po +Copyright: + Copyright (C) 2008 Piotr Drag +License: LGPL-2.1+ + On Debian systems, the complete text of the LGPL-2.1 can be found in + /usr/share/common-licenses/LGPL-2.1. + +File: po/pt_BR.po +Copyright: + Copyright (C) 2008 Fabian Affolter +License: LGPL-2.1+ + On Debian systems, the complete text of the LGPL-2.1 can be found in + /usr/share/common-licenses/LGPL-2.1. + +File: po/sr.po, po/sr@latin.po +Copyright: + Copyright (C) 2009 Igor Miletic (Игор Милетић) , 2009. + Copyright (C) 2009 Miloš Komarčević , 2009. +License: LGPL-2.1+ + On Debian systems, the complete text of the LGPL-2.1 can be found in + /usr/share/common-licenses/LGPL-2.1. + +File: po/sv.po +Copyright: + Copyright (C) 2008 Daniel Nylander +License: LGPL-2.1+ + On Debian systems, the complete text of the LGPL-2.1 can be found in + /usr/share/common-licenses/LGPL-2.1. + +File: po/ta.po +Copyright: + Copyright (C) 2009 I. Felix +License: LGPL-2.1+ + On Debian systems, the complete text of the LGPL-2.1 can be found in + /usr/share/common-licenses/LGPL-2.1. + +File: po/te.po +Copyright: + Copyright (C) 2009 Krishna Babu K +License: LGPL-2.1+ + On Debian systems, the complete text of the LGPL-2.1 can be found in + /usr/share/common-licenses/LGPL-2.1. + +File: po/uk.po +Copyright: + Copyright (C) 2009 Yuri Chornoivan +License: LGPL-2.1+ + On Debian systems, the complete text of the LGPL-2.1 can be found in + /usr/share/common-licenses/LGPL-2.1. + +File: po/zh_CN.po +Copyright: + Copyright (C) 2008 闫丰刚 (sainry) +License: LGPL-2.1+ + On Debian systems, the complete text of the LGPL-2.1 can be found in + /usr/share/common-licenses/LGPL-2.1. + +Files: debian/* +Copyright: + Copyright 2006-2009 Sjoerd Simons + Copyright 2006-2008 CJ van den Berg +License: GPL-2+ + On Debian systems, the complete text of the GPL-2 can be found in + /usr/share/common-licenses/GPL-2. + +Files: src/pulsecore/cpu-*, src/pulsecore/remap*, + src/pulsecore/svolume_{arm,mmx,sse}.c +Copyright: + Copyright 2004-2006 Lennart Poettering + Copyright 2009 Wim Taymans +License: LGPL-2.1+ + On Debian systems, the complete text of the LGPL-2.1 can be found in + /usr/share/common-licenses/LGPL-2.1. + + +Files: src/pulsecore/sconv_sse.c +Copyright: + Copyright 2004-2006 Lennart Poettering + Copyright 2006 Pierre Ossman for Cendio AB +License: LGPL-2.1+ + On Debian systems, the complete text of the LGPL-2.1 can be found in + /usr/share/common-licenses/LGPL-2.1. + + +Files: src/pulsecore/usergroup.* +Copyright: + Copyright 2009 Ted Percival +License: LGPL-2.1+ + On Debian systems, the complete text of the LGPL-2.1 can be found in + /usr/share/common-licenses/LGPL-2.1. diff --git a/debian/libpulse-browse0.install b/debian/libpulse-browse0.install new file mode 100644 index 0000000..7794b74 --- /dev/null +++ b/debian/libpulse-browse0.install @@ -0,0 +1 @@ +usr/lib/libpulse-browse.so.* diff --git a/debian/libpulse-browse0.shlibs b/debian/libpulse-browse0.shlibs new file mode 100644 index 0000000..a6b6ad8 --- /dev/null +++ b/debian/libpulse-browse0.shlibs @@ -0,0 +1 @@ +libpulse-browse 0 libpulse-browse0 (>= 0.9.8) diff --git a/debian/libpulse-dev.install b/debian/libpulse-dev.install new file mode 100644 index 0000000..e7c0f14 --- /dev/null +++ b/debian/libpulse-dev.install @@ -0,0 +1,5 @@ +usr/lib/libpulse.so +usr/lib/libpulse-simple.so +usr/lib/pkgconfig/libpulse-simple.pc +usr/lib/pkgconfig/libpulse.pc +usr/include/pulse/* diff --git a/debian/libpulse-mainloop-glib0.install b/debian/libpulse-mainloop-glib0.install new file mode 100644 index 0000000..f1847a9 --- /dev/null +++ b/debian/libpulse-mainloop-glib0.install @@ -0,0 +1 @@ +usr/lib/libpulse-mainloop-glib.so.* diff --git a/debian/libpulse0.install b/debian/libpulse0.install new file mode 100644 index 0000000..c0a2c68 --- /dev/null +++ b/debian/libpulse0.install @@ -0,0 +1,4 @@ +etc/pulse/client.conf +usr/lib/libpulse.so.* +usr/lib/libpulse-simple.so.* +usr/lib/libpulsecommon-*.so diff --git a/debian/libpulse0.shlibs b/debian/libpulse0.shlibs new file mode 100644 index 0000000..6cbd415 --- /dev/null +++ b/debian/libpulse0.shlibs @@ -0,0 +1,3 @@ +libpulse 0 libpulse0 (>= 0.9.21) +libpulse-simple 0 libpulse0 +libpulsecommon 0.9.21 libpulse0 diff --git a/debian/manpages/esdcompat.1 b/debian/manpages/esdcompat.1 new file mode 100644 index 0000000..29947ff --- /dev/null +++ b/debian/manpages/esdcompat.1 @@ -0,0 +1,55 @@ +.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.36. +.TH PULSEAUDIO "1" "August 2006" "pulseaudio esd wrapper 0.9.5" "User Commands" +.SH NAME +pulseaudio \- manual page for pulseaudio esd wrapper 0.9.5 +.SH SYNOPSIS +.B esdcompat +[\fIoptions\fR] +.SH DESCRIPTION +pulseaudio esd wrapper 0.9.5 +.TP +\fB\-v\fR \fB\-\-version\fR +print version information +.TP +\fB\-h\fR \fB\-\-help\fR +show this help +.PP +Ignored directives: +.TP +\fB\-tcp\fR +use tcp/ip sockets in addition to unix domain +.TP +\fB\-promiscuous\fR +don't require authentication +.TP +\fB\-d\fR DEVICE +force esd to use sound device DEVICE +.TP +\fB\-b\fR +run server in 8 bit sound mode +.TP +\fB\-r\fR RATE +run server at sample rate of RATE +.TP +\fB\-as\fR SECS +free audio device after SECS of inactivity +.TP +\fB\-unix\fR +use unix domain sockets instead of tcp/ip +.TP +\fB\-public\fR +make tcp/ip access public (other than localhost) +.TP +\fB\-terminate\fR +terminate esd daemone after last client exits +.TP +\fB\-nobeeps\fR +disable startup beeps +.TP +\fB\-trust\fR +start esd even if use of /tmp/.esd can be insecure +.TP +\fB\-port\fR PORT +listen for connections at PORT (only for tcp/ip) +.HP +\fB\-bind\fR ADDRESS binds to ADDRESS (only for tcp/ip) diff --git a/debian/manpages/pulseaudio.1 b/debian/manpages/pulseaudio.1 new file mode 100644 index 0000000..df4c7b6 --- /dev/null +++ b/debian/manpages/pulseaudio.1 @@ -0,0 +1,97 @@ +.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.36. +.TH PULSEAUDIO "1" "August 2006" "pulseaudio 0.9.5" "User Commands" +.SH NAME +pulseaudio \- manual page for pulseaudio 0.9.5 +.SH DESCRIPTION +pulseaudio [options] +.SS "COMMANDS:" +.TP +\fB\-h\fR, \fB\-\-help\fR +Show this help +.TP +\fB\-\-version\fR +Show version +.TP +\fB\-\-dump\-conf\fR +Dump default configuration +.TP +\fB\-\-dump\-modules\fR +Dump list of available modules +.TP +\fB\-k\fR \fB\-\-kill\fR +Kill a running daemon +.TP +\fB\-\-check\fR +Check for a running daemon +.SS "OPTIONS:" +.TP +\fB\-\-system\fR[=\fIBOOL\fR] +Run as system\-wide instance +.TP +\fB\-D\fR, \fB\-\-daemonize\fR[=\fIBOOL\fR] +Daemonize after startup +.TP +\fB\-\-fail\fR[=\fIBOOL\fR] +Quit when startup fails +.TP +\fB\-\-high\-priority\fR[=\fIBOOL\fR] +Try to set high process priority +(only available as root) +.TP +\fB\-\-disallow\-module\-loading\fR[=\fIBOOL\fR] +Disallow module loading after startup +.TP +\fB\-\-exit\-idle\-time\fR=\fISECS\fR +Terminate the daemon when idle and this +time passed +.TP +\fB\-\-module\-idle\-time\fR=\fISECS\fR +Unload autoloaded modules when idle and +this time passed +.TP +\fB\-\-scache\-idle\-time\fR=\fISECS\fR +Unload autoloaded samples when idle and +this time passed +.TP +\fB\-\-log\-level\fR[=\fILEVEL\fR] +Increase or set verbosity level +.TP +\fB\-v\fR +Increase the verbosity level +.HP +\fB\-\-log\-target=\fR{auto,syslog,stderr} Specify the log target +.TP +\fB\-p\fR, \fB\-\-dl\-search\-path\fR=\fIPATH\fR +Set the search path for dynamic shared +objects (plugins) +.TP +\fB\-\-resample\-method\fR=\fI[METHOD]\fR +Use the specified resampling method +(one of src\-sinc\-medium\-quality, +src\-sinc\-best\-quality,src\-sinc\-fastest +src\-zero\-order\-hold,src\-linear,trivial) +.TP +\fB\-\-use\-pid\-file\fR[=\fIBOOL\fR] +Create a PID file +.TP +\fB\-\-no\-cpu\-limit\fR[=\fIBOOL\fR] +Do not install CPU load limiter on +platforms that support it. +.TP +\fB\-\-disable\-shm\fR[=\fIBOOL\fR] +Disable shared memory support. +.SS "STARTUP SCRIPT:" +.TP +\fB\-L\fR, \fB\-\-load=\fR"MODULE ARGUMENTS" +Load the specified plugin module with +the specified argument +.TP +\fB\-F\fR, \fB\-\-file\fR=\fIFILENAME\fR +Run the specified script +.TP +\fB\-C\fR +Open a command line on the running TTY +after startup +.TP +\fB\-n\fR +Don't load default script file diff --git a/debian/overrides/pulseaudio b/debian/overrides/pulseaudio new file mode 100644 index 0000000..132bce3 --- /dev/null +++ b/debian/overrides/pulseaudio @@ -0,0 +1,2 @@ +pulseaudio: script-not-executable ./etc/pulse/default.pa +pulseaudio: description-starts-with-package-name diff --git a/debian/overrides/pulseaudio-module-x11 b/debian/overrides/pulseaudio-module-x11 new file mode 100644 index 0000000..eec9359 --- /dev/null +++ b/debian/overrides/pulseaudio-module-x11 @@ -0,0 +1 @@ +pulseaudio-module-x11: desktop-entry-lacks-main-category /etc/xdg/autostart/pulseaudio-module-xsmp.desktop diff --git a/debian/overrides/pulseaudio-utils b/debian/overrides/pulseaudio-utils new file mode 100644 index 0000000..bd0596e --- /dev/null +++ b/debian/overrides/pulseaudio-utils @@ -0,0 +1,3 @@ +pulseaudio-utils: no-shlibs-control-file usr/lib/libpulsedsp.so +pulseaudio-utils: postinst-must-call-ldconfig usr/lib/libpulsedsp.so +pulseaudio-utils: package-name-doesnt-match-sonames libpulsedsp diff --git a/debian/patches/0001-Work-around-some-platforms-not-having-O_CLOEXEC.patch b/debian/patches/0001-Work-around-some-platforms-not-having-O_CLOEXEC.patch new file mode 100644 index 0000000..bc193d9 --- /dev/null +++ b/debian/patches/0001-Work-around-some-platforms-not-having-O_CLOEXEC.patch @@ -0,0 +1,26 @@ +From 041bcda2518671a4375e77659c80d1be43625904 Mon Sep 17 00:00:00 2001 +From: Clint Adams +Date: Sun, 25 Oct 2009 12:35:14 +0000 +Subject: [PATCH] Work around some platforms not having O_CLOEXEC + +--- + src/modules/module-cli.c | 5 +++++ + 1 files changed, 5 insertions(+), 0 deletions(-) + +diff --git a/src/modules/module-cli.c b/src/modules/module-cli.c +index 6bd0f4f..b1adb52 100644 +--- a/src/modules/module-cli.c ++++ b/src/modules/module-cli.c +@@ -105,7 +105,12 @@ int pa__init(pa_module*m) { + * of log messages, particularly because if stdout and stderr are + * dup'ed they share the same O_NDELAY, too. */ + ++#ifdef O_CLOEXEC + if ((fd = open("/dev/tty", O_RDWR|O_CLOEXEC|O_NONBLOCK)) >= 0) { ++#else ++ if ((fd = open("/dev/tty", O_RDWR|O_NONBLOCK)) >= 0) { ++ pa_make_fd_cloexec(fd); ++#endif + io = pa_iochannel_new(m->core->mainloop, fd, fd); + pa_log_debug("Managed to open /dev/tty."); + } else { diff --git a/debian/patches/series b/debian/patches/series new file mode 100644 index 0000000..9d0a131 --- /dev/null +++ b/debian/patches/series @@ -0,0 +1 @@ +0001-Work-around-some-platforms-not-having-O_CLOEXEC.patch diff --git a/debian/pulseaudio-dev.install b/debian/pulseaudio-dev.install new file mode 100644 index 0000000..d3bc5d5 --- /dev/null +++ b/debian/pulseaudio-dev.install @@ -0,0 +1,2 @@ +usr/lib/libpulsecore.so +usr/include/pulsecore/* diff --git a/debian/pulseaudio-esound-compat.install b/debian/pulseaudio-esound-compat.install new file mode 100644 index 0000000..1c626e1 --- /dev/null +++ b/debian/pulseaudio-esound-compat.install @@ -0,0 +1,6 @@ +usr/bin/esdcompat +usr/lib/pulse-*/modules/libprotocol-esound.so +usr/lib/pulse-*/modules/module-esound-compat-spawnfd.so +usr/lib/pulse-*/modules/module-esound-compat-spawnpid.so +usr/lib/pulse-*/modules/module-esound-protocol-tcp.so +usr/lib/pulse-*/modules/module-esound-protocol-unix.so diff --git a/debian/pulseaudio-esound-compat.links b/debian/pulseaudio-esound-compat.links new file mode 100644 index 0000000..d4739a0 --- /dev/null +++ b/debian/pulseaudio-esound-compat.links @@ -0,0 +1 @@ +usr/bin/esdcompat usr/bin/esd diff --git a/debian/pulseaudio-esound-compat.manpages b/debian/pulseaudio-esound-compat.manpages new file mode 100644 index 0000000..e2867de --- /dev/null +++ b/debian/pulseaudio-esound-compat.manpages @@ -0,0 +1 @@ +debian/manpages/esdcompat.1 diff --git a/debian/pulseaudio-module-bluetooth.install b/debian/pulseaudio-module-bluetooth.install new file mode 100644 index 0000000..3914ab0 --- /dev/null +++ b/debian/pulseaudio-module-bluetooth.install @@ -0,0 +1,7 @@ +usr/lib/pulse-*/modules/module-bluetooth-proximity.so +usr/lib/pulse-*/modules/module-bluetooth-device.so +usr/lib/pulse-*/modules/module-bluetooth-discover.so +usr/lib/pulse-*/modules/libbluetooth-ipc.so +usr/lib/pulse-*/modules/libbluetooth-sbc.so +usr/lib/pulse-*/modules/libbluetooth-util.so +usr/lib/pulseaudio/pulse/proximity-helper diff --git a/debian/pulseaudio-module-gconf.install b/debian/pulseaudio-module-gconf.install new file mode 100644 index 0000000..d3f6edf --- /dev/null +++ b/debian/pulseaudio-module-gconf.install @@ -0,0 +1,2 @@ +usr/lib/pulseaudio/pulse/gconf-helper +usr/lib/pulse-*/modules/module-gconf.so diff --git a/debian/pulseaudio-module-hal.install b/debian/pulseaudio-module-hal.install new file mode 100644 index 0000000..13a15b3 --- /dev/null +++ b/debian/pulseaudio-module-hal.install @@ -0,0 +1 @@ +usr/lib/pulse-*/modules/module-hal-detect.so diff --git a/debian/pulseaudio-module-jack.install b/debian/pulseaudio-module-jack.install new file mode 100644 index 0000000..e968c4e --- /dev/null +++ b/debian/pulseaudio-module-jack.install @@ -0,0 +1,2 @@ +usr/lib/pulse-*/modules/module-jack-sink.so +usr/lib/pulse-*/modules/module-jack-source.so diff --git a/debian/pulseaudio-module-lirc.install b/debian/pulseaudio-module-lirc.install new file mode 100644 index 0000000..4af4597 --- /dev/null +++ b/debian/pulseaudio-module-lirc.install @@ -0,0 +1 @@ +usr/lib/pulse-*/modules/module-lirc.so diff --git a/debian/pulseaudio-module-raop.install b/debian/pulseaudio-module-raop.install new file mode 100644 index 0000000..e19f847 --- /dev/null +++ b/debian/pulseaudio-module-raop.install @@ -0,0 +1 @@ +usr/lib/pulse-*/modules/*raop* diff --git a/debian/pulseaudio-module-x11.install b/debian/pulseaudio-module-x11.install new file mode 100644 index 0000000..1199345 --- /dev/null +++ b/debian/pulseaudio-module-x11.install @@ -0,0 +1,2 @@ +usr/lib/pulse-*/modules/module-x11*.so +usr/share/lintian/overrides/pulseaudio-module-x11 diff --git a/debian/pulseaudio-module-zeroconf.install b/debian/pulseaudio-module-zeroconf.install new file mode 100644 index 0000000..5758767 --- /dev/null +++ b/debian/pulseaudio-module-zeroconf.install @@ -0,0 +1,3 @@ +usr/lib/pulse-*/modules/libavahi-wrap.so +usr/lib/pulse-*/modules/module-zeroconf-discover.so +usr/lib/pulse-*/modules/module-zeroconf-publish.so diff --git a/debian/pulseaudio-utils.install b/debian/pulseaudio-utils.install new file mode 100644 index 0000000..fe35946 --- /dev/null +++ b/debian/pulseaudio-utils.install @@ -0,0 +1,9 @@ +usr/bin/pacat +usr/bin/pacmd +usr/bin/pactl +usr/bin/paplay +usr/bin/pamon +usr/bin/parec +usr/bin/parecord +usr/bin/pasuspender +usr/share/lintian/overrides/pulseaudio-utils diff --git a/debian/pulseaudio-utils.manpages b/debian/pulseaudio-utils.manpages new file mode 100644 index 0000000..25e1655 --- /dev/null +++ b/debian/pulseaudio-utils.manpages @@ -0,0 +1,8 @@ +debian/tmp/usr/share/man/man1/pabrowse.1 +debian/tmp/usr/share/man/man1/pacat.1 +debian/tmp/usr/share/man/man1/pacmd.1 +debian/tmp/usr/share/man/man1/pactl.1 +debian/tmp/usr/share/man/man1/padsp.1 +debian/tmp/usr/share/man/man1/paplay.1 +debian/tmp/usr/share/man/man1/pasuspender.1 +debian/tmp/usr/share/man/man1/pax11publish.1 diff --git a/debian/pulseaudio.install b/debian/pulseaudio.install new file mode 100644 index 0000000..6dd5763 --- /dev/null +++ b/debian/pulseaudio.install @@ -0,0 +1,68 @@ +etc/rc.d/* +etc/pulse/default.pa +etc/pulse/system.pa +etc/pulse/daemon.conf +etc/dbus-1/system.d/pulseaudio-system.conf +usr/bin/pulseaudio +usr/bin/start-pulseaudio-x11 +usr/lib/pulse-*/modules/libalsa-util.so +usr/lib/pulse-*/modules/libcli.so +usr/lib/pulse-*/modules/libprotocol-cli.so +usr/lib/pulse-*/modules/libprotocol-http.so +usr/lib/pulse-*/modules/libprotocol-native.so +usr/lib/pulse-*/modules/libprotocol-simple.so +usr/lib/pulse-*/modules/librtp.so +usr/lib/pulse-*/modules/module-alsa-sink.so +usr/lib/pulse-*/modules/module-alsa-source.so +usr/lib/pulse-*/modules/module-always-sink.so +usr/lib/pulse-*/modules/module-console-kit.so +usr/lib/pulse-*/modules/module-device-restore.so +usr/lib/pulse-*/modules/module-stream-restore.so +usr/lib/pulse-*/modules/module-cli-protocol-tcp.so +usr/lib/pulse-*/modules/module-cli-protocol-unix.so +usr/lib/pulse-*/modules/module-cli.so +usr/lib/pulse-*/modules/module-combine.so +usr/lib/pulse-*/modules/module-default-device-restore.so +usr/lib/pulse-*/modules/module-detect.so +usr/lib/pulse-*/modules/module-esound-sink.so +usr/lib/pulse-*/modules/module-http-protocol-tcp.so +usr/lib/pulse-*/modules/module-http-protocol-unix.so +usr/lib/pulse-*/modules/module-intended-roles.so +usr/lib/pulse-*/modules/module-ladspa-sink.so +usr/lib/pulse-*/modules/module-match.so +usr/lib/pulse-*/modules/module-mmkbd-evdev.so +usr/lib/pulse-*/modules/module-native-protocol-fd.so +usr/lib/pulse-*/modules/module-native-protocol-tcp.so +usr/lib/pulse-*/modules/module-native-protocol-unix.so +usr/lib/pulse-*/modules/module-null-sink.so +usr/lib/pulse-*/modules/module-pipe-sink.so +usr/lib/pulse-*/modules/module-pipe-source.so +usr/lib/pulse-*/modules/module-position-event-sounds.so +usr/lib/pulse-*/modules/module-remap-sink.so +usr/lib/pulse-*/modules/module-rescue-streams.so +usr/lib/pulse-*/modules/module-rtp-recv.so +usr/lib/pulse-*/modules/module-rtp-send.so +usr/lib/pulse-*/modules/module-simple-protocol-tcp.so +usr/lib/pulse-*/modules/module-simple-protocol-unix.so +usr/lib/pulse-*/modules/module-sine.so +usr/lib/pulse-*/modules/module-tunnel-sink.so +usr/lib/pulse-*/modules/module-tunnel-source.so +usr/lib/pulse-*/modules/module-suspend-on-idle.so +usr/lib/pulse-*/modules/module-volume-restore.so +usr/lib/pulse-*/modules/module-alsa-card.so +usr/lib/pulse-*/modules/module-augment-properties.so +usr/lib/pulse-*/modules/module-card-restore.so +usr/lib/pulse-*/modules/module-cork-music-on-phone.so +usr/lib/pulse-*/modules/module-sine-source.so +usr/lib/pulse-*/modules/module-loopback.so +usr/lib/pulse-*/modules/module-rygel-media-server.so +usr/lib/pulse-*/modules/module-policy.so +usr/lib/pulse-*/modules/module-echo-cancel.so +usr/lib/pulse-*/modules/module-virtual-sink.so +usr/lib/pulse-*/modules/module-virtual-source.so +usr/share/man/man5/default.pa.5 +usr/share/locale +usr/share/pulseaudio +usr/lib/libpulsecore-*.so +usr/share/lintian/overrides/pulseaudio +opt/etc/pulse/*.dat diff --git a/debian/pulseaudio.manpages b/debian/pulseaudio.manpages new file mode 100644 index 0000000..c96c6b1 --- /dev/null +++ b/debian/pulseaudio.manpages @@ -0,0 +1,3 @@ +debian/manpages/pulseaudio.1 +debian/tmp/usr/share/man/man5/pulse-client.conf.5 +debian/tmp/usr/share/man/man5/pulse-daemon.conf.5 diff --git a/debian/pulseaudio.postinst b/debian/pulseaudio.postinst new file mode 100644 index 0000000..2ac3096 --- /dev/null +++ b/debian/pulseaudio.postinst @@ -0,0 +1,9 @@ +#!/bin/sh + +ln -sf /opt/etc/pulse/filter_8000_44100.dat /opt/etc/pulse/filter_11025_44100.dat +ln -sf /opt/etc/pulse/filter_8000_44100.dat /opt/etc/pulse/filter_12000_44100.dat +ln -sf /opt/etc/pulse/filter_8000_44100.dat /opt/etc/pulse/filter_16000_44100.dat +ln -sf /opt/etc/pulse/filter_8000_44100.dat /opt/etc/pulse/filter_22050_44100.dat +ln -sf /opt/etc/pulse/filter_8000_44100.dat /opt/etc/pulse/filter_24000_44100.dat +ln -sf /opt/etc/pulse/filter_8000_44100.dat /opt/etc/pulse/filter_32000_44100.dat + diff --git a/debian/pulseaudio.shlibs b/debian/pulseaudio.shlibs new file mode 100644 index 0000000..13de9dd --- /dev/null +++ b/debian/pulseaudio.shlibs @@ -0,0 +1 @@ +libpulsecore 0.9.21 pulseaudio diff --git a/debian/rules b/debian/rules new file mode 100755 index 0000000..b188b0a --- /dev/null +++ b/debian/rules @@ -0,0 +1,78 @@ +#!/usr/bin/make -f + +include /usr/share/cdbs/1/rules/debhelper.mk +include /usr/share/cdbs/1/class/autotools.mk +include /usr/share/cdbs/1/rules/utils.mk +#include /usr/share/cdbs/1/rules/patchsys-quilt.mk + +makebuilddir/pulseaudio:: + ./autogen.sh + (cd libltdl && autoheader && aclocal && libtoolize && automake --add-missing && autoconf && ./configure) + touch $(CURDIR)/configure + +common-build-arch:: + grep -v -e alsa -e evdev -e udev debian/pulseaudio.install > \ + debian/pulseaudio.install.kfreebsd-i386 + grep -v -e alsa -e evdev -e udev debian/pulseaudio.install > \ + debian/pulseaudio.install.kfreebsd-amd64 + cp debian/pulseaudio-module-bluetooth.install \ + debian/pulseaudio-module-bluetooth.install.armel +# Before aptx applied, block this section +# echo "usr/lib/pulse-*/modules/libbtaptx-armv6L.so" >> \ +# debian/pulseaudio-module-bluetooth.install.armel + +common-install-arch:: + find $(DEB_DESTDIR) -name "*.la" -exec rm '{}' \; + mkdir -p $(CURDIR)/debian/tmp/usr/share/lintian + cp -a $(CURDIR)/debian/overrides $(CURDIR)/debian/tmp/usr/share/lintian + mkdir -p $(CURDIR)/debian/tmp/etc/rc.d/init.d/ + cp $(CURDIR)/pulseaudio.sh.in $(CURDIR)/debian/tmp/etc/rc.d/init.d/pulseaudio + mkdir -p $(CURDIR)/debian/tmp/etc/rc.d/rc3.d/ + ln -s ../init.d/pulseaudio $(CURDIR)/debian/tmp/etc/rc.d/rc3.d/S35pulseaudio + mkdir -p $(CURDIR)/debian/tmp/etc/rc.d/rc4.d/ + ln -s ../init.d/pulseaudio $(CURDIR)/debian/tmp/etc/rc.d/rc4.d/S35pulseaudio + +common-configure-arch:: +ifneq (,$(findstring $(DEB_HOST_ARCH), "arm armel")) + make -C src libpulsecore_0.9.21_la-svolume_arm.lo CFLAGS+=-march=armv6 +endif + +pulseaudio-install-arch:: + dh_installman --language=C debian/tmp/usr/share/man/man5/default.pa.5 + +common-binary-post-install-arch:: list-missing + +clean:: + rm -f debian/pulseaudio.install.kfreebsd-i386 + rm -f debian/pulseaudio.install.kfreebsd-amd64 + rm -f debian/pulseaudio-module-bluetooth.install.armel + +#update-patch-series: +# mkdir -p $(CURDIR)/debian/patches +# rm -f $(CURDIR)/debian/patches/*.patch +# git format-patch -o $(CURDIR)/debian/patches patches ^upstream | \ +# xargs -n 1 basename > $(CURDIR)/debian/patches/series +# for patch in $$(ls $(CURDIR)/debian/patches/*.patch) ; \ +# do \ +# lines=$$(cat $$patch | wc -l) ; \ +# head -n $$(($$lines - 3)) $$patch > $${patch}.chomped ; \ +# mv $${patch}.chomped $$patch ; \ +# done + +ifneq (,$(findstring $(DEB_HOST_ARCH_OS), "linux")) + DEB_CONFIGURE_EXTRA_FLAGS = --enable-hal-compat --disable-hal +endif + +#Before aptx applied, block this section +#ifneq (,$(findstring $(DEB_HOST_ARCH), "arm armel")) +# DEB_CONFIGURE_EXTRA_FLAGS += --enable-bt-a2dp-aptx +#endif + +#DEB_CONFIGURE_EXTRA_FLAGS += --enable-alsa --with-system-user=root --with-system-group=root --with-access-group=root --disable-ipv6 --disable-oss-output --disable-oss-wrapper --disable-largefile +#DEB_CONFIGURE_EXTRA_FLAGS += --prefix=/usr --with-system-user=root --with-system-group=root --with-access-group=root --enable-alsa --disable-ipv6 --disable-oss-output --disable-oss-wrapper +DEB_CONFIGURE_EXTRA_FLAGS += --prefix=/usr --enable-alsa --disable-ipv6 --disable-oss-output --disable-oss-wrapper --enable-dlog +DEB_DH_MAKESHLIBS_ARGS_ALL = --exclude=usr/lib/pulse-0.9.21/modules +DEB_DH_SHLIBDEPS_ARGS_libpulse0 = -u -L/dev/null +DEB_DH_SHLIBDEPS_ARGS_pulseaudio = -u -Ldebian/shlibs_pulseaudio.local +DEB_DH_INSTALL_ARGS = --sourcedir=$(CURDIR)/debian/tmp +DEB_UPDATE_RCD_PARAMS = start 25 2 3 4 5 . stop 15 1 . diff --git a/debian/shlibs.local b/debian/shlibs.local new file mode 100644 index 0000000..fa5838e --- /dev/null +++ b/debian/shlibs.local @@ -0,0 +1,5 @@ +libpulse-browse 0 libpulse-browse0 (>= 0.9.8) +libpulse 0 libpulse0 (= ${binary:Version}) +libpulse-simple 0 libpulse0 (= ${binary:Version}) +libpulsecommon 0.9.17 libpulse0 (= ${binary:Version}) +libpulsecore 0.9.17 pulseaudio (= ${binary:Version}) diff --git a/debian/shlibs_pulseaudio.local b/debian/shlibs_pulseaudio.local new file mode 100644 index 0000000..93afe65 --- /dev/null +++ b/debian/shlibs_pulseaudio.local @@ -0,0 +1,4 @@ +libpulse 0 libpulse0 (= ${binary:Version}) +libpulse-simple 0 libpulse0 (= ${binary:Version}) +libpulsecommon 0.9.16 libpulse0 (= ${binary:Version}) +libpulse-browse 0 libpulse-browse0 (>= 0.9.8) diff --git a/debian/stamp-patch-debian=patches=0001-Work-around-some-platforms-not-having-O_CLOEXEC.patch b/debian/stamp-patch-debian=patches=0001-Work-around-some-platforms-not-having-O_CLOEXEC.patch new file mode 100644 index 0000000..e69de29 diff --git a/debian/stamp-patched b/debian/stamp-patched new file mode 100644 index 0000000..e69de29 diff --git a/debian/watch b/debian/watch new file mode 100644 index 0000000..e862bae --- /dev/null +++ b/debian/watch @@ -0,0 +1,8 @@ +# Control file for uscan +# Run the "uscan" command to check for upstream updates and more. +# See uscan(1) for format + +# Compulsory line, this is a version 3 file +version=3 + +http://0pointer.de/lennart/projects/pulseaudio/ pulseaudio-(.*)\.tar\.gz diff --git a/doxygen/Makefile.am b/doxygen/Makefile.am new file mode 100644 index 0000000..60b0060 --- /dev/null +++ b/doxygen/Makefile.am @@ -0,0 +1,24 @@ +# This file is part of PulseAudio. +# +# PulseAudio is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA. + +doxygen: doxygen.conf + doxygen $< + +clean-local: + -rm -rf html + +.PHONY: all doxygen diff --git a/doxygen/doxygen.conf.in b/doxygen/doxygen.conf.in new file mode 100644 index 0000000..7dc0f8b --- /dev/null +++ b/doxygen/doxygen.conf.in @@ -0,0 +1,1155 @@ +# Doxyfile 1.3.8 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project +# +# All text after a hash (#) is considered a comment and will be ignored +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" ") + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded +# by quotes) that should identify the project. + +PROJECT_NAME = PulseAudio + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = @PACKAGE_VERSION@ + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of source +# files, where putting all generated files in the same directory would otherwise +# cause performance problems for the file system. + +CREATE_SUBDIRS = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, +# Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese, +# Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian, +# Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, +# Swedish, and Ukrainian. + +OUTPUT_LANGUAGE = English + +# This tag can be used to specify the encoding used in the generated output. +# The encoding is not always determined by the language that is chosen, +# but also whether or not the output is meant for Windows or non-Windows users. +# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES +# forces the Windows encoding (this is the default for the Windows binary), +# whereas setting the tag to NO uses a Unix-style encoding (the default for +# all platforms other than Windows). + +USE_WINDOWS_ENCODING = NO + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is used +# as the annotated text. Otherwise, the brief description is used as-is. If left +# blank, the following values are used ("$name" is automatically replaced with the +# name of the entity): "The $name class" "The $name widget" "The $name file" +# "is" "provides" "specifies" "contains" "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited +# members of a class in the documentation of that class as if those members were +# ordinary class members. Constructors, destructors and assignment operators of +# the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = NO + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful is your file systems +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like the Qt-style comments (thus requiring an +# explicit @brief command for a brief description. + +JAVADOC_AUTOBRIEF = YES + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the DETAILS_AT_TOP tag is set to YES then Doxygen +# will output the detailed description near the top, like JavaDoc. +# If set to NO, the detailed description appears after the member +# documentation. + +DETAILS_AT_TOP = NO + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 4 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = YES + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources +# only. Doxygen will then generate output that is more tailored for Java. +# For instance, namespaces will be presented as packages, qualified scopes +# will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = NO + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = NO + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = NO + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = NO + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= NO + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or define consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and defines in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = YES + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = ../src/pulse/context.h ../src/pulse/stream.h ../src/pulse/pulseaudio.h ../src/pulse/sample.h ../src/pulse/def.h ../src/pulse/subscribe.h ../src/pulse/introspect.h ../src/pulse/scache.h ../src/pulse/mainloop-api.h ../src/pulse/glib-mainloop.h ../src/pulse/mainloop.h ../src/pulse/mainloop-signal.h ../src/pulse/error.h ../src/pulse/operation.h ../src/pulse/simple.h ../src/pulse/version.h ../src/pulse/volume.h ../src/pulse/channelmap.h ../src/pulse/thread-mainloop.h ../src/pulse/xmalloc.h ../src/pulse/utf8.h ../src/pulse/util.h ../src/pulse/timeval.h ../src/pulse/proplist.h ../src/pulse/gccmacro.h ../src/pulse/ext-stream-restore.h ../src/pulse/rtclock.h + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp +# *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm + +FILE_PATTERNS = + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = NO + +# The EXCLUDE tag can be used to specify files and/or directories that should +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories +# that are symbolic links (a Unix filesystem feature) are excluded from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. + +EXCLUDE_PATTERNS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = ../src/utils ../src/tests + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. If FILTER_PATTERNS is specified, this tag will be +# ignored. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER +# is applied to all files. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = NO + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES (the default) +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = YES + +# If the REFERENCES_RELATION tag is set to YES (the default) +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = YES + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = YES + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = pa_ PA_ + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# stylesheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to +# NO a bullet list will be used. + +HTML_ALIGN_MEMBERS = YES + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index at +# top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. + +DISABLE_INDEX = NO + +# This tag can be used to set the number of enum values (range [1..20]) +# that doxygen will group on one line in the generated HTML documentation. + +ENUM_VALUES_PER_LINE = 1 + +# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be +# generated containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, +# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are +# probably better off using the HTML help feature. + +GENERATE_TREEVIEW = YES + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = NO + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, a4wide, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4wide + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = NO + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = NO + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. This is useful +# if you want to understand what is going on. On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = YES + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_PREDEFINED tags. + +EXPAND_ONLY_PREDEF = YES + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# in the INCLUDE_PATH (see below) will be search if a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. + +PREDEFINED = PA_C_DECL_BEGIN= PA_C_DECL_END= + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition. + +#EXPAND_AS_DEFINED = PA_C_DECL_BEGIN, PA_C_DECL_END + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all function-like macros that are alone +# on a line, have an all uppercase name, and do not end with a semicolon. Such +# function macros are typically used for boiler-plate code, and will confuse the +# parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. +# Optionally an initial location of the external documentation +# can be added for each tagfile. The format of a tag file without +# this location is as follows: +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths or +# URLs. If a location is present for each tag, the installdox tool +# does not have to be run to correct the links. +# Note that each tag file must have a unique name +# (where the name does NOT include the path) +# If a tag file is not located in the directory in which doxygen +# is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base or +# super classes. Setting the tag to NO turns the diagrams off. Note that this +# option is superseded by the HAVE_DOT option below. This is only a fallback. It is +# recommended to install and use dot, since it yields more powerful graphs. + +CLASS_DIAGRAMS = YES + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = NO + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# the CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will +# generate a call dependency graph for every global function or class method. +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable call graphs for selected +# functions only using the \callgraph command. + +CALL_GRAPH = NO + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are png, jpg, or gif +# If left blank png will be used. + +DOT_IMAGE_FORMAT = png + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found on the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. + +MAX_DOT_GRAPH_WIDTH = 1024 + +# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. + +MAX_DOT_GRAPH_HEIGHT = 1024 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes that +# lay further from the root node will be omitted. Note that setting this option to +# 1 or 2 may greatly reduce the computation time needed for large code bases. Also +# note that a graph may be further truncated if the graph's image dimensions are +# not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH and MAX_DOT_GRAPH_HEIGHT). +# If 0 is used for the depth value (the default), the graph is not depth-constrained. + +MAX_DOT_GRAPH_DEPTH = 0 + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to the search engine +#--------------------------------------------------------------------------- + +# The SEARCHENGINE tag specifies whether or not a search engine should be +# used. If set to NO the values of all tags below this one will be ignored. + +SEARCHENGINE = NO + +SHOW_DIRECTORIES=NO diff --git a/filter/filter_44100_48000.dat b/filter/filter_44100_48000.dat new file mode 100644 index 0000000..29de3e9 Binary files /dev/null and b/filter/filter_44100_48000.dat differ diff --git a/filter/filter_44100_8000.dat b/filter/filter_44100_8000.dat new file mode 100644 index 0000000..afd88b8 Binary files /dev/null and b/filter/filter_44100_8000.dat differ diff --git a/filter/filter_48000_44100.dat b/filter/filter_48000_44100.dat new file mode 100644 index 0000000..d814cb0 Binary files /dev/null and b/filter/filter_48000_44100.dat differ diff --git a/filter/filter_8000_44100.dat b/filter/filter_8000_44100.dat new file mode 100644 index 0000000..59872bc Binary files /dev/null and b/filter/filter_8000_44100.dat differ diff --git a/git-version-gen b/git-version-gen new file mode 100755 index 0000000..ae3988e --- /dev/null +++ b/git-version-gen @@ -0,0 +1,153 @@ +#!/bin/sh +# Print a version string. +scriptversion=2008-04-08.07 + +# Copyright (C) 2007-2008 Free Software Foundation +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3, 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. + +# This script is derived from GIT-VERSION-GEN from GIT: http://git.or.cz/. +# It may be run two ways: +# - from a git repository in which the "git describe" command below +# produces useful output (thus requiring at least one signed tag) +# - from a non-git-repo directory containing a .tarball-version file, which +# presumes this script is invoked like "./git-version-gen .tarball-version". + +# In order to use intra-version strings in your project, you will need two +# separate generated version string files: +# +# .tarball-version - present only in a distribution tarball, and not in +# a checked-out repository. Created with contents that were learned at +# the last time autoconf was run, and used by git-version-gen. Must not +# be present in either $(srcdir) or $(builddir) for git-version-gen to +# give accurate answers during normal development with a checked out tree, +# but must be present in a tarball when there is no version control system. +# Therefore, it cannot be used in any dependencies. GNUmakefile has +# hooks to force a reconfigure at distribution time to get the value +# correct, without penalizing normal development with extra reconfigures. +# +# .version - present in a checked-out repository and in a distribution +# tarball. Usable in dependencies, particularly for files that don't +# want to depend on config.h but do want to track version changes. +# Delete this file prior to any autoconf run where you want to rebuild +# files to pick up a version string change; and leave it stale to +# minimize rebuild time after unrelated changes to configure sources. +# +# It is probably wise to add these two files to .gitignore, so that you +# don't accidentally commit either generated file. +# +# Use the following line in your configure.ac, so that $(VERSION) will +# automatically be up-to-date each time configure is run (and note that +# since configure.ac no longer includes a version string, Makefile rules +# should not depend on configure.ac for version updates). +# +# AC_INIT([GNU project], +# m4_esyscmd([build-aux/git-version-gen .tarball-version]), +# [bug-project@example]) +# +# Then use the following lines in your Makefile.am, so that .version +# will be present for dependencies, and so that .tarball-version will +# exist in distribution tarballs. +# +# BUILT_SOURCES = $(top_srcdir)/.version +# $(top_srcdir)/.version: +# echo $(VERSION) > $@-t && mv $@-t $@ +# dist-hook: +# echo $(VERSION) > $(distdir)/.tarball-version + +case $# in + 1) ;; + *) echo 1>&2 "Usage: $0 \$srcdir/.tarball-version"; exit 1;; +esac + +tarball_version_file=$1 +nl=' +' + +# First see if there is a tarball-only version file. +# then try "git describe", then default. +if test -f $tarball_version_file +then + v=`cat $tarball_version_file` || exit 1 + case $v in + *$nl*) v= ;; # reject multi-line output + [0-9]*) ;; + *) v= ;; + esac + test -z "$v" \ + && echo "$0: WARNING: $tarball_version_file seems to be damaged" 1>&2 +fi + +if test -n "$v" +then + : # use $v +elif test -d .git \ + && v=`git describe --abbrev=4 --match='v*' HEAD 2>/dev/null \ + || git describe --abbrev=4 HEAD 2>/dev/null` \ + && case $v in + v[0-9]*) ;; + *) (exit 1) ;; + esac +then + # Is this a new git that lists number of commits since the last + # tag or the previous older version that did not? + # Newer: v6.10-77-g0f8faeb + # Older: v6.10-g0f8faeb +# case $v in +# *-*-*) : git describe is okay three part flavor ;; +# *-*) +# : git describe is older two part flavor +# # Recreate the number of commits and rewrite such that the +# # result is the same as if we were using the newer version +# # of git describe. +# vtag=`echo "$v" | sed 's/-.*//'` +# numcommits=`git rev-list "$vtag"..HEAD | wc -l` +# v=`echo "$v" | sed "s/\(.*\)-\(.*\)/\1-$numcommits-\2/"`; +# ;; +# esac + + # Change the first '-' to a '.', so version-comparing tools work properly. + # Remove the "g" in git describe's output string, to save a byte. +# v=`echo "$v" | sed 's/-/./;s/\(.*\)-g/\1-/'`; + : +else + v=UNKNOWN +fi + +v=`echo "$v" |sed 's/^v//'` + +# Don't declare a version "dirty" merely because a time stamp has changed. +git status > /dev/null 2>&1 + +dirty=`sh -c 'git diff-index --name-only HEAD' 2>/dev/null` || dirty= +case "$dirty" in + '') ;; + *) # Append the suffix only if there isn't one already. + case $v in + *-dirty) ;; + *) v="$v-dirty" ;; + esac ;; +esac + +# Omit the trailing newline, so that m4_esyscmd can use the result directly. +echo "$v" | tr -d '\012' + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-end: "$" +# End: diff --git a/libpulse-browse.pc.in b/libpulse-browse.pc.in new file mode 100644 index 0000000..54705b3 --- /dev/null +++ b/libpulse-browse.pc.in @@ -0,0 +1,12 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: libpulse-browse +Description: PulseAudio Network Browsing Interface +Version: @PACKAGE_VERSION@ +Libs: -L${libdir} -lpulse-browse @PTHREAD_LIBS@ +Libs.private: -lpulsecommon-@PA_MAJORMINORMICRO@ +Cflags: -I${includedir} -D_REENTRANT +Requires: libpulse diff --git a/libpulse-mainloop-glib.pc.in b/libpulse-mainloop-glib.pc.in new file mode 100644 index 0000000..45ae47c --- /dev/null +++ b/libpulse-mainloop-glib.pc.in @@ -0,0 +1,12 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: libpulse-mainloop-glib +Description: PulseAudio GLib 2.0 Main Loop Wrapper +Version: @PACKAGE_VERSION@ +Libs: -L${libdir} -lpulse-mainloop-glib @PTHREAD_LIBS@ +Libs.private: -lpulsecommon-@PA_MAJORMINORMICRO@ +Cflags: -I${includedir} -D_REENTRANT +Requires: libpulse glib-2.0 diff --git a/libpulse-simple.pc.in b/libpulse-simple.pc.in new file mode 100644 index 0000000..443be28 --- /dev/null +++ b/libpulse-simple.pc.in @@ -0,0 +1,12 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: libpulse-simple +Description: PulseAudio Simplified Synchronous Client Interface +Version: @PACKAGE_VERSION@ +Libs: -L${libdir} -lpulse-simple @PTHREAD_LIBS@ +Libs.private: -lpulsecommon-@PA_MAJORMINORMICRO@ +Cflags: -I${includedir} -D_REENTRANT +Requires: libpulse diff --git a/libpulse.pc.in b/libpulse.pc.in new file mode 100644 index 0000000..c78b123 --- /dev/null +++ b/libpulse.pc.in @@ -0,0 +1,12 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ +modlibexecdir=@modlibexecdir@ + +Name: libpulse +Description: PulseAudio Client Interface +Version: @PACKAGE_VERSION@ +Libs: -L${libdir} -lpulse @PTHREAD_LIBS@ +Libs.private: -lpulsecommon-@PA_MAJORMINORMICRO@ +Cflags: -I${includedir} -D_REENTRANT diff --git a/m4/acx_libwrap.m4 b/m4/acx_libwrap.m4 new file mode 100644 index 0000000..e160214 --- /dev/null +++ b/m4/acx_libwrap.m4 @@ -0,0 +1,19 @@ +AC_DEFUN([ACX_LIBWRAP], [ +LIBWRAP_LIBS= +saved_LIBS="$LIBS" +LIBS="$LIBS -lwrap" +AC_MSG_CHECKING([for tcpwrap library and headers]) +AC_LINK_IFELSE( +AC_LANG_PROGRAM( +[#include +#include +int allow_severity = LOG_INFO; +int deny_severity = LOG_WARNING;], +[struct request_info *req; +return hosts_access (req);]), +[AC_DEFINE(HAVE_LIBWRAP, [], [Have tcpwrap?]) +LIBWRAP_LIBS="-lwrap" +AC_MSG_RESULT(yes)], +[AC_MSG_RESULT(no)]) +LIBS="$saved_LIBS" +]) diff --git a/m4/acx_lirc.m4 b/m4/acx_lirc.m4 new file mode 100644 index 0000000..d3f8ea7 --- /dev/null +++ b/m4/acx_lirc.m4 @@ -0,0 +1,6 @@ +AC_DEFUN([ACX_LIRC], [ +LIRC_CFLAGS= +LIRC_LIBS= +AC_CHECK_HEADER(lirc/lirc_client.h,[AC_CHECK_LIB(lirc_client,lirc_init,[HAVE_LIRC=1 +LIRC_LIBS=-llirc_client],HAVE_LIRC=0)],HAVE_LIRC=0) +]) diff --git a/m4/acx_pthread.m4 b/m4/acx_pthread.m4 new file mode 100644 index 0000000..cbd6bfa --- /dev/null +++ b/m4/acx_pthread.m4 @@ -0,0 +1,348 @@ +dnl @synopsis ACX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) +dnl +dnl @summary figure out how to build C programs using POSIX threads +dnl +dnl This macro figures out how to build C programs using POSIX threads. +dnl It sets the PTHREAD_LIBS output variable to the threads library and +dnl linker flags, and the PTHREAD_CFLAGS output variable to any special +dnl C compiler flags that are needed. (The user can also force certain +dnl compiler flags/libs to be tested by setting these environment +dnl variables.) +dnl +dnl Also sets PTHREAD_CC to any special C compiler that is needed for +dnl multi-threaded programs (defaults to the value of CC otherwise). +dnl (This is necessary on AIX to use the special cc_r compiler alias.) +dnl +dnl NOTE: You are assumed to not only compile your program with these +dnl flags, but also link it with them as well. e.g. you should link +dnl with $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS +dnl $LIBS +dnl +dnl If you are only building threads programs, you may wish to use +dnl these variables in your default LIBS, CFLAGS, and CC: +dnl +dnl LIBS="$PTHREAD_LIBS $LIBS" +dnl CFLAGS="$CFLAGS $PTHREAD_CFLAGS" +dnl CC="$PTHREAD_CC" +dnl +dnl In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute +dnl constant has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to +dnl that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX). +dnl +dnl ACTION-IF-FOUND is a list of shell commands to run if a threads +dnl library is found, and ACTION-IF-NOT-FOUND is a list of commands to +dnl run it if it is not found. If ACTION-IF-FOUND is not specified, the +dnl default action will define HAVE_PTHREAD. +dnl +dnl Please let the authors know if this macro fails on any platform, or +dnl if you have any other suggestions or comments. This macro was based +dnl on work by SGJ on autoconf scripts for FFTW (www.fftw.org) (with +dnl help from M. Frigo), as well as ac_pthread and hb_pthread macros +dnl posted by Alejandro Forero Cuervo to the autoconf macro repository. +dnl We are also grateful for the helpful feedback of numerous users. +dnl +dnl @category InstalledPackages +dnl @author Steven G. Johnson +dnl @version 2006-05-29 +dnl @license GPLWithACException +dnl +dnl Checks for GCC shared/pthread inconsistency based on work by +dnl Marcin Owsiany + + +AC_DEFUN([ACX_PTHREAD], [ +AC_REQUIRE([AC_CANONICAL_HOST]) +AC_LANG_SAVE +AC_LANG_C +acx_pthread_ok=no + +# We used to check for pthread.h first, but this fails if pthread.h +# requires special compiler flags (e.g. on True64 or Sequent). +# It gets checked for in the link test anyway. + +# First of all, check if the user has set any of the PTHREAD_LIBS, +# etcetera environment variables, and if threads linking works using +# them: +if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + save_LIBS="$LIBS" + LIBS="$PTHREAD_LIBS $LIBS" + AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS]) + AC_TRY_LINK_FUNC(pthread_join, acx_pthread_ok=yes) + AC_MSG_RESULT($acx_pthread_ok) + if test x"$acx_pthread_ok" = xno; then + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" + fi + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" +fi + +# We must check for the threads library under a number of different +# names; the ordering is very important because some systems +# (e.g. DEC) have both -lpthread and -lpthreads, where one of the +# libraries is broken (non-POSIX). + +# Create a list of thread flags to try. Items starting with a "-" are +# C compiler flags, and other items are library names, except for "none" +# which indicates that we try without any flags at all, and "pthread-config" +# which is a program returning the flags for the Pth emulation library. + +acx_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" + +# The ordering *is* (sometimes) important. Some notes on the +# individual items follow: + +# pthreads: AIX (must check this before -lpthread) +# none: in case threads are in libc; should be tried before -Kthread and +# other compiler flags to prevent continual compiler warnings +# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) +# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) +# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) +# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads) +# -pthreads: Solaris/gcc +# -mthreads: Mingw32/gcc, Lynx/gcc +# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it +# doesn't hurt to check since this sometimes defines pthreads too; +# also defines -D_REENTRANT) +# ... -mt is also the pthreads flag for HP/aCC +# pthread: Linux, etcetera +# --thread-safe: KAI C++ +# pthread-config: use pthread-config program (for GNU Pth library) + +case "${host_cpu}-${host_os}" in + *solaris*) + + # On Solaris (at least, for some versions), libc contains stubbed + # (non-functional) versions of the pthreads routines, so link-based + # tests will erroneously succeed. (We need to link with -pthreads/-mt/ + # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather + # a function called by this macro, so we could check for that, but + # who knows whether they'll stub that too in a future libc.) So, + # we'll just look for -pthreads and -lpthread first: + + acx_pthread_flags="-pthreads pthread -mt -pthread $acx_pthread_flags" + ;; +esac + +if test x"$acx_pthread_ok" = xno; then +for flag in $acx_pthread_flags; do + + case $flag in + none) + AC_MSG_CHECKING([whether pthreads work without any flags]) + ;; + + -*) + AC_MSG_CHECKING([whether pthreads work with $flag]) + PTHREAD_CFLAGS="$flag" + ;; + + pthread-config) + AC_CHECK_PROG(acx_pthread_config, pthread-config, yes, no) + if test x"$acx_pthread_config" = xno; then continue; fi + PTHREAD_CFLAGS="`pthread-config --cflags`" + PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" + ;; + + *) + AC_MSG_CHECKING([for the pthreads library -l$flag]) + PTHREAD_LIBS="-l$flag" + ;; + esac + + save_LIBS="$LIBS" + save_CFLAGS="$CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + + # Check for various functions. We must include pthread.h, + # since some functions may be macros. (On the Sequent, we + # need a special flag -Kthread to make this header compile.) + # We check for pthread_join because it is in -lpthread on IRIX + # while pthread_create is in libc. We check for pthread_attr_init + # due to DEC craziness with -lpthreads. We check for + # pthread_cleanup_push because it is one of the few pthread + # functions on Solaris that doesn't have a non-functional libc stub. + # We try pthread_create on general principles. + AC_TRY_LINK([#include ], + [pthread_t th; pthread_join(th, 0); + pthread_attr_init(0); pthread_cleanup_push(0, 0); + pthread_create(0,0,0,0); pthread_cleanup_pop(0); ], + [acx_pthread_ok=yes]) + + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" + + AC_MSG_RESULT($acx_pthread_ok) + if test "x$acx_pthread_ok" = xyes; then + break; + fi + + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" +done +fi + +# Various other checks: +if test "x$acx_pthread_ok" = xyes; then + save_LIBS="$LIBS" + LIBS="$PTHREAD_LIBS $LIBS" + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + + # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. + AC_MSG_CHECKING([for joinable pthread attribute]) + attr_name=unknown + for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do + AC_TRY_LINK([#include ], [int attr=$attr; return attr;], + [attr_name=$attr; break]) + done + AC_MSG_RESULT($attr_name) + if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then + AC_DEFINE_UNQUOTED(PTHREAD_CREATE_JOINABLE, $attr_name, + [Define to necessary symbol if this constant + uses a non-standard name on your system.]) + fi + + AC_MSG_CHECKING([if more special flags are required for pthreads]) + flag=no + case "${host_cpu}-${host_os}" in + *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";; + *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";; + esac + AC_MSG_RESULT(${flag}) + if test "x$flag" != xno; then + PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" + fi + + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" + # More AIX lossage: must compile with xlc_r or cc_r + if test x"$GCC" != xyes; then + AC_CHECK_PROGS(PTHREAD_CC, xlc_r cc_r, ${CC}) + else + PTHREAD_CC=$CC + fi + + # The next part tries to detect GCC inconsistency with -shared on some + # architectures and systems. The problem is that in certain + # configurations, when -shared is specified, GCC "forgets" to + # internally use various flags which are still necessary. + + AC_MSG_CHECKING([whether to check for GCC pthread/shared inconsistencies]) + check_inconsistencies=yes + case "${host_cpu}-${host_os}" in + *-darwin*) check_inconsistencies=no ;; + esac + if test x"$GCC" != xyes -o "x$check_inconsistencies" != xyes ; then + AC_MSG_RESULT([no]) + else + AC_MSG_RESULT([yes]) + + # In order not to create several levels of indentation, we test + # the value of "$ok" until we find out the cure or run out of + # ideas. + ok="no" + + # + # Prepare the flags + # + save_CFLAGS="$CFLAGS" + save_LIBS="$LIBS" + save_CC="$CC" + # Try with the flags determined by the earlier checks. + # + # -Wl,-z,defs forces link-time symbol resolution, so that the + # linking checks with -shared actually have any value + # + # FIXME: -fPIC is required for -shared on many architectures, + # so we specify it here, but the right way would probably be to + # properly detect whether it is actually required. + CFLAGS="-shared -fPIC -Wl,-z,defs $CFLAGS $PTHREAD_CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + CC="$PTHREAD_CC" + + AC_MSG_CHECKING([whether -pthread is sufficient with -shared]) + AC_TRY_LINK([#include ], + [pthread_t th; pthread_join(th, 0); + pthread_attr_init(0); pthread_cleanup_push(0, 0); + pthread_create(0,0,0,0); pthread_cleanup_pop(0); ], + [ok=yes]) + + if test "x$ok" = xyes; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + fi + + # + # Linux gcc on some architectures such as mips/mipsel forgets + # about -lpthread + # + if test x"$ok" = xno; then + AC_MSG_CHECKING([whether -lpthread fixes that]) + LIBS="-lpthread $PTHREAD_LIBS $save_LIBS" + AC_TRY_LINK([#include ], + [pthread_t th; pthread_join(th, 0); + pthread_attr_init(0); pthread_cleanup_push(0, 0); + pthread_create(0,0,0,0); pthread_cleanup_pop(0); ], + [ok=yes]) + + if test "x$ok" = xyes; then + AC_MSG_RESULT([yes]) + PTHREAD_LIBS="-lpthread $PTHREAD_LIBS" + else + AC_MSG_RESULT([no]) + fi + fi + # + # FreeBSD 4.10 gcc forgets to use -lc_r instead of -lc + # + if test x"$ok" = xno; then + AC_MSG_CHECKING([whether -lc_r fixes that]) + LIBS="-lc_r $PTHREAD_LIBS $save_LIBS" + AC_TRY_LINK([#include ], + [pthread_t th; pthread_join(th, 0); + pthread_attr_init(0); pthread_cleanup_push(0, 0); + pthread_create(0,0,0,0); pthread_cleanup_pop(0); ], + [ok=yes]) + + if test "x$ok" = xyes; then + AC_MSG_RESULT([yes]) + PTHREAD_LIBS="-lc_r $PTHREAD_LIBS" + else + AC_MSG_RESULT([no]) + fi + fi + if test x"$ok" = xno; then + # OK, we have run out of ideas + AC_MSG_WARN([Impossible to determine how to use pthreads with shared libraries]) + + # so it's not safe to assume that we may use pthreads + acx_pthread_ok=no + fi + + CFLAGS="$save_CFLAGS" + LIBS="$save_LIBS" + CC="$save_CC" + fi +else + PTHREAD_CC="$CC" +fi + +AC_SUBST(PTHREAD_LIBS) +AC_SUBST(PTHREAD_CFLAGS) +AC_SUBST(PTHREAD_CC) + +# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: +if test x"$acx_pthread_ok" = xyes; then + ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1]) + : +else + acx_pthread_ok=no + $2 +fi +AC_LANG_RESTORE +])dnl ACX_PTHREAD diff --git a/m4/attributes.m4 b/m4/attributes.m4 new file mode 100644 index 0000000..28fac27 --- /dev/null +++ b/m4/attributes.m4 @@ -0,0 +1,311 @@ +dnl Macros to check the presence of generic (non-typed) symbols. +dnl Copyright (c) 2006-2008 Diego Pettenò +dnl Copyright (c) 2006-2008 xine project +dnl +dnl This program is free software; you can redistribute it and/or modify +dnl it under the terms of the GNU General Public License as published by +dnl the Free Software Foundation; either version 2, or (at your option) +dnl any later version. +dnl +dnl This program is distributed in the hope that it will be useful, +dnl but WITHOUT ANY WARRANTY; without even the implied warranty of +dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +dnl GNU General Public License for more details. +dnl +dnl You should have received a copy of the GNU General Public License +dnl along with this program; if not, write to the Free Software +dnl Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +dnl 02110-1301, USA. +dnl +dnl As a special exception, the copyright owners of the +dnl macro gives unlimited permission to copy, distribute and modify the +dnl configure scripts that are the output of Autoconf when processing the +dnl Macro. You need not follow the terms of the GNU General Public +dnl License when using or distributing such scripts, even though portions +dnl of the text of the Macro appear in them. The GNU General Public +dnl License (GPL) does govern all other use of the material that +dnl constitutes the Autoconf Macro. +dnl +dnl This special exception to the GPL applies to versions of the +dnl Autoconf Macro released by this project. When you make and +dnl distribute a modified version of the Autoconf Macro, you may extend +dnl this special exception to the GPL to apply to your modified version as +dnl well. + +dnl Check if the flag is supported by compiler +dnl CC_CHECK_CFLAGS_SILENT([FLAG], [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND]) + +AC_DEFUN([CC_CHECK_CFLAGS_SILENT], [ + AC_CACHE_VAL(AS_TR_SH([cc_cv_cflags_$1]), + [ac_save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $1" + AC_COMPILE_IFELSE([int a;], + [eval "AS_TR_SH([cc_cv_cflags_$1])='yes'"], + [eval "AS_TR_SH([cc_cv_cflags_$1])='no'"]) + CFLAGS="$ac_save_CFLAGS" + ]) + + AS_IF([eval test x$]AS_TR_SH([cc_cv_cflags_$1])[ = xyes], + [$2], [$3]) +]) + +dnl Check if the flag is supported by compiler (cacheable) +dnl CC_CHECK_CFLAGS([FLAG], [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND]) + +AC_DEFUN([CC_CHECK_CFLAGS], [ + AC_CACHE_CHECK([if $CC supports $1 flag], + AS_TR_SH([cc_cv_cflags_$1]), + CC_CHECK_CFLAGS_SILENT([$1]) dnl Don't execute actions here! + ) + + AS_IF([eval test x$]AS_TR_SH([cc_cv_cflags_$1])[ = xyes], + [$2], [$3]) +]) + +dnl CC_CHECK_CFLAG_APPEND(FLAG, [action-if-found], [action-if-not-found]) +dnl Check for CFLAG and appends them to CFLAGS if supported +AC_DEFUN([CC_CHECK_CFLAG_APPEND], [ + AC_CACHE_CHECK([if $CC supports $1 flag], + AS_TR_SH([cc_cv_cflags_$1]), + CC_CHECK_CFLAGS_SILENT([$1]) dnl Don't execute actions here! + ) + + AS_IF([eval test x$]AS_TR_SH([cc_cv_cflags_$1])[ = xyes], + [CFLAGS="$CFLAGS $1"; DEBUG_CFLAGS="$DEBUG_CFLAGS $1"; $2], [$3]) +]) + +dnl CC_CHECK_CFLAGS_APPEND([FLAG1 FLAG2], [action-if-found], [action-if-not]) +AC_DEFUN([CC_CHECK_CFLAGS_APPEND], [ + for flag in $1; do + CC_CHECK_CFLAG_APPEND($flag, [$2], [$3]) + done +]) + +dnl Check if the flag is supported by linker (cacheable) +dnl CC_CHECK_LDFLAGS([FLAG], [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND]) + +AC_DEFUN([CC_CHECK_LDFLAGS], [ + AC_CACHE_CHECK([if $CC supports $1 flag], + AS_TR_SH([cc_cv_ldflags_$1]), + [ac_save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $1" + AC_LINK_IFELSE([int main() { return 1; }], + [eval "AS_TR_SH([cc_cv_ldflags_$1])='yes'"], + [eval "AS_TR_SH([cc_cv_ldflags_$1])="]) + LDFLAGS="$ac_save_LDFLAGS" + ]) + + AS_IF([eval test x$]AS_TR_SH([cc_cv_ldflags_$1])[ = xyes], + [$2], [$3]) +]) + +dnl define the LDFLAGS_NOUNDEFINED variable with the correct value for +dnl the current linker to avoid undefined references in a shared object. +AC_DEFUN([CC_NOUNDEFINED], [ + dnl We check $host for which systems to enable this for. + AC_REQUIRE([AC_CANONICAL_HOST]) + + case $host in + dnl FreeBSD (et al.) does not complete linking for shared objects when pthreads + dnl are requested, as different implementations are present; to avoid problems + dnl use -Wl,-z,defs only for those platform not behaving this way. + *-freebsd* | *-openbsd*) ;; + *) + dnl First of all check for the --no-undefined variant of GNU ld. This allows + dnl for a much more readable commandline, so that people can understand what + dnl it does without going to look for what the heck -z defs does. + for possible_flags in "-Wl,--no-undefined" "-Wl,-z,defs"; do + CC_CHECK_LDFLAGS([$possible_flags], [LDFLAGS_NOUNDEFINED="$possible_flags"]) + break + done + ;; + esac + + AC_SUBST([LDFLAGS_NOUNDEFINED]) +]) + +dnl Check for a -Werror flag or equivalent. -Werror is the GCC +dnl and ICC flag that tells the compiler to treat all the warnings +dnl as fatal. We usually need this option to make sure that some +dnl constructs (like attributes) are not simply ignored. +dnl +dnl Other compilers don't support -Werror per se, but they support +dnl an equivalent flag: +dnl - Sun Studio compiler supports -errwarn=%all +AC_DEFUN([CC_CHECK_WERROR], [ + AC_CACHE_CHECK( + [for $CC way to treat warnings as errors], + [cc_cv_werror], + [CC_CHECK_CFLAGS_SILENT([-Werror], [cc_cv_werror=-Werror], + [CC_CHECK_CFLAGS_SILENT([-errwarn=%all], [cc_cv_werror=-errwarn=%all])]) + ]) +]) + +AC_DEFUN([CC_CHECK_ATTRIBUTE], [ + AC_REQUIRE([CC_CHECK_WERROR]) + AC_CACHE_CHECK([if $CC supports __attribute__(( ifelse([$2], , [$1], [$2]) ))], + AS_TR_SH([cc_cv_attribute_$1]), + [ac_save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $cc_cv_werror" + AC_COMPILE_IFELSE([$3], + [eval "AS_TR_SH([cc_cv_attribute_$1])='yes'"], + [eval "AS_TR_SH([cc_cv_attribute_$1])='no'"]) + CFLAGS="$ac_save_CFLAGS" + ]) + + AS_IF([eval test x$]AS_TR_SH([cc_cv_attribute_$1])[ = xyes], + [AC_DEFINE( + AS_TR_CPP([SUPPORT_ATTRIBUTE_$1]), 1, + [Define this if the compiler supports __attribute__(( ifelse([$2], , [$1], [$2]) ))] + ) + $4], + [$5]) +]) + +AC_DEFUN([CC_ATTRIBUTE_CONSTRUCTOR], [ + CC_CHECK_ATTRIBUTE( + [constructor],, + [void __attribute__((constructor)) ctor() { int a; }], + [$1], [$2]) +]) + +AC_DEFUN([CC_ATTRIBUTE_FORMAT], [ + CC_CHECK_ATTRIBUTE( + [format], [format(printf, n, n)], + [void __attribute__((format(printf, 1, 2))) printflike(const char *fmt, ...) { fmt = (void *)0; }], + [$1], [$2]) +]) + +AC_DEFUN([CC_ATTRIBUTE_FORMAT_ARG], [ + CC_CHECK_ATTRIBUTE( + [format_arg], [format_arg(printf)], + [char *__attribute__((format_arg(1))) gettextlike(const char *fmt) { fmt = (void *)0; }], + [$1], [$2]) +]) + +AC_DEFUN([CC_ATTRIBUTE_VISIBILITY], [ + CC_CHECK_ATTRIBUTE( + [visibility_$1], [visibility("$1")], + [void __attribute__((visibility("$1"))) $1_function() { }], + [$2], [$3]) +]) + +AC_DEFUN([CC_ATTRIBUTE_NONNULL], [ + CC_CHECK_ATTRIBUTE( + [nonnull], [nonnull()], + [void __attribute__((nonnull())) some_function(void *foo, void *bar) { foo = (void*)0; bar = (void*)0; }], + [$1], [$2]) +]) + +AC_DEFUN([CC_ATTRIBUTE_UNUSED], [ + CC_CHECK_ATTRIBUTE( + [unused], , + [void some_function(void *foo, __attribute__((unused)) void *bar);], + [$1], [$2]) +]) + +AC_DEFUN([CC_ATTRIBUTE_SENTINEL], [ + CC_CHECK_ATTRIBUTE( + [sentinel], , + [void some_function(void *foo, ...) __attribute__((sentinel));], + [$1], [$2]) +]) + +AC_DEFUN([CC_ATTRIBUTE_DEPRECATED], [ + CC_CHECK_ATTRIBUTE( + [deprecated], , + [void some_function(void *foo, ...) __attribute__((deprecated));], + [$1], [$2]) +]) + +AC_DEFUN([CC_ATTRIBUTE_ALIAS], [ + CC_CHECK_ATTRIBUTE( + [alias], [weak, alias], + [void other_function(void *foo) { } + void some_function(void *foo) __attribute__((weak, alias("other_function")));], + [$1], [$2]) +]) + +AC_DEFUN([CC_ATTRIBUTE_MALLOC], [ + CC_CHECK_ATTRIBUTE( + [malloc], , + [void * __attribute__((malloc)) my_alloc(int n);], + [$1], [$2]) +]) + +AC_DEFUN([CC_ATTRIBUTE_PACKED], [ + CC_CHECK_ATTRIBUTE( + [packed], , + [struct astructure { char a; int b; long c; void *d; } __attribute__((packed));], + [$1], [$2]) +]) + +AC_DEFUN([CC_ATTRIBUTE_CONST], [ + CC_CHECK_ATTRIBUTE( + [const], , + [int __attribute__((const)) twopow(int n) { return 1 << n; } ], + [$1], [$2]) +]) + +AC_DEFUN([CC_FLAG_VISIBILITY], [ + AC_REQUIRE([CC_CHECK_WERROR]) + AC_CACHE_CHECK([if $CC supports -fvisibility=hidden], + [cc_cv_flag_visibility], + [cc_flag_visibility_save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $cc_cv_werror" + CC_CHECK_CFLAGS_SILENT([-fvisibility=hidden], + cc_cv_flag_visibility='yes', + cc_cv_flag_visibility='no') + CFLAGS="$cc_flag_visibility_save_CFLAGS"]) + + AS_IF([test "x$cc_cv_flag_visibility" = "xyes"], + [AC_DEFINE([SUPPORT_FLAG_VISIBILITY], 1, + [Define this if the compiler supports the -fvisibility flag]) + $1], + [$2]) +]) + +AC_DEFUN([CC_FUNC_EXPECT], [ + AC_REQUIRE([CC_CHECK_WERROR]) + AC_CACHE_CHECK([if compiler has __builtin_expect function], + [cc_cv_func_expect], + [ac_save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $cc_cv_werror" + AC_COMPILE_IFELSE( + [int some_function() { + int a = 3; + return (int)__builtin_expect(a, 3); + }], + [cc_cv_func_expect=yes], + [cc_cv_func_expect=no]) + CFLAGS="$ac_save_CFLAGS" + ]) + + AS_IF([test "x$cc_cv_func_expect" = "xyes"], + [AC_DEFINE([SUPPORT__BUILTIN_EXPECT], 1, + [Define this if the compiler supports __builtin_expect() function]) + $1], + [$2]) +]) + +AC_DEFUN([CC_ATTRIBUTE_ALIGNED], [ + AC_REQUIRE([CC_CHECK_WERROR]) + AC_CACHE_CHECK([highest __attribute__ ((aligned ())) supported], + [cc_cv_attribute_aligned], + [ac_save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $cc_cv_werror" + for cc_attribute_align_try in 64 32 16 8 4 2; do + AC_COMPILE_IFELSE([ + int main() { + static char c __attribute__ ((aligned($cc_attribute_align_try))) = 0; + return c; + }], [cc_cv_attribute_aligned=$cc_attribute_align_try; break]) + done + CFLAGS="$ac_save_CFLAGS" + ]) + + if test "x$cc_cv_attribute_aligned" != "x"; then + AC_DEFINE_UNQUOTED([ATTRIBUTE_ALIGNED_MAX], [$cc_cv_attribute_aligned], + [Define the highest alignment supported]) + fi +]) diff --git a/m4/check_define.m4 b/m4/check_define.m4 new file mode 100644 index 0000000..43edc78 --- /dev/null +++ b/m4/check_define.m4 @@ -0,0 +1,13 @@ +AC_DEFUN([AC_CHECK_DEFINE],[ +AS_VAR_PUSHDEF([ac_var],[ac_cv_defined_$1_$2])dnl +AC_CACHE_CHECK([for $1 in $2], ac_var, +AC_TRY_COMPILE([#include <$2>],[ + #ifdef $1 + int ok; + #else + choke me + #endif +],AS_VAR_SET(ac_var, yes),AS_VAR_SET(ac_var, no))) +AS_IF([test AS_VAR_GET(ac_var) != "no"], [$3], [$4])dnl +AS_VAR_POPDEF([ac_var])dnl +]) diff --git a/m4/gettext.m4 b/m4/gettext.m4 new file mode 100644 index 0000000..c9ae1f7 --- /dev/null +++ b/m4/gettext.m4 @@ -0,0 +1,381 @@ +# gettext.m4 serial 60 (gettext-0.17) +dnl Copyright (C) 1995-2007 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. +dnl +dnl This file can can be used in projects which are not available under +dnl the GNU General Public License or the GNU Library General Public +dnl License but which still want to provide support for the GNU gettext +dnl functionality. +dnl Please note that the actual code of the GNU gettext library is covered +dnl by the GNU Library General Public License, and the rest of the GNU +dnl gettext package package is covered by the GNU General Public License. +dnl They are *not* in the public domain. + +dnl Authors: +dnl Ulrich Drepper , 1995-2000. +dnl Bruno Haible , 2000-2006. + +dnl Macro to add for using GNU gettext. + +dnl Usage: AM_GNU_GETTEXT([INTLSYMBOL], [NEEDSYMBOL], [INTLDIR]). +dnl INTLSYMBOL can be one of 'external', 'no-libtool', 'use-libtool'. The +dnl default (if it is not specified or empty) is 'no-libtool'. +dnl INTLSYMBOL should be 'external' for packages with no intl directory, +dnl and 'no-libtool' or 'use-libtool' for packages with an intl directory. +dnl If INTLSYMBOL is 'use-libtool', then a libtool library +dnl $(top_builddir)/intl/libintl.la will be created (shared and/or static, +dnl depending on --{enable,disable}-{shared,static} and on the presence of +dnl AM-DISABLE-SHARED). If INTLSYMBOL is 'no-libtool', a static library +dnl $(top_builddir)/intl/libintl.a will be created. +dnl If NEEDSYMBOL is specified and is 'need-ngettext', then GNU gettext +dnl implementations (in libc or libintl) without the ngettext() function +dnl will be ignored. If NEEDSYMBOL is specified and is +dnl 'need-formatstring-macros', then GNU gettext implementations that don't +dnl support the ISO C 99 formatstring macros will be ignored. +dnl INTLDIR is used to find the intl libraries. If empty, +dnl the value `$(top_builddir)/intl/' is used. +dnl +dnl The result of the configuration is one of three cases: +dnl 1) GNU gettext, as included in the intl subdirectory, will be compiled +dnl and used. +dnl Catalog format: GNU --> install in $(datadir) +dnl Catalog extension: .mo after installation, .gmo in source tree +dnl 2) GNU gettext has been found in the system's C library. +dnl Catalog format: GNU --> install in $(datadir) +dnl Catalog extension: .mo after installation, .gmo in source tree +dnl 3) No internationalization, always use English msgid. +dnl Catalog format: none +dnl Catalog extension: none +dnl If INTLSYMBOL is 'external', only cases 2 and 3 can occur. +dnl The use of .gmo is historical (it was needed to avoid overwriting the +dnl GNU format catalogs when building on a platform with an X/Open gettext), +dnl but we keep it in order not to force irrelevant filename changes on the +dnl maintainers. +dnl +AC_DEFUN([AM_GNU_GETTEXT], +[ + dnl Argument checking. + ifelse([$1], [], , [ifelse([$1], [external], , [ifelse([$1], [no-libtool], , [ifelse([$1], [use-libtool], , + [errprint([ERROR: invalid first argument to AM_GNU_GETTEXT +])])])])]) + ifelse([$2], [], , [ifelse([$2], [need-ngettext], , [ifelse([$2], [need-formatstring-macros], , + [errprint([ERROR: invalid second argument to AM_GNU_GETTEXT +])])])]) + define([gt_included_intl], + ifelse([$1], [external], + ifdef([AM_GNU_GETTEXT_][INTL_SUBDIR], [yes], [no]), + [yes])) + define([gt_libtool_suffix_prefix], ifelse([$1], [use-libtool], [l], [])) + gt_NEEDS_INIT + AM_GNU_GETTEXT_NEED([$2]) + + AC_REQUIRE([AM_PO_SUBDIRS])dnl + ifelse(gt_included_intl, yes, [ + AC_REQUIRE([AM_INTL_SUBDIR])dnl + ]) + + dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + AC_REQUIRE([AC_LIB_RPATH]) + + dnl Sometimes libintl requires libiconv, so first search for libiconv. + dnl Ideally we would do this search only after the + dnl if test "$USE_NLS" = "yes"; then + dnl if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then + dnl tests. But if configure.in invokes AM_ICONV after AM_GNU_GETTEXT + dnl the configure script would need to contain the same shell code + dnl again, outside any 'if'. There are two solutions: + dnl - Invoke AM_ICONV_LINKFLAGS_BODY here, outside any 'if'. + dnl - Control the expansions in more detail using AC_PROVIDE_IFELSE. + dnl Since AC_PROVIDE_IFELSE is only in autoconf >= 2.52 and not + dnl documented, we avoid it. + ifelse(gt_included_intl, yes, , [ + AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) + ]) + + dnl Sometimes, on MacOS X, libintl requires linking with CoreFoundation. + gt_INTL_MACOSX + + dnl Set USE_NLS. + AC_REQUIRE([AM_NLS]) + + ifelse(gt_included_intl, yes, [ + BUILD_INCLUDED_LIBINTL=no + USE_INCLUDED_LIBINTL=no + ]) + LIBINTL= + LTLIBINTL= + POSUB= + + dnl Add a version number to the cache macros. + case " $gt_needs " in + *" need-formatstring-macros "*) gt_api_version=3 ;; + *" need-ngettext "*) gt_api_version=2 ;; + *) gt_api_version=1 ;; + esac + gt_func_gnugettext_libc="gt_cv_func_gnugettext${gt_api_version}_libc" + gt_func_gnugettext_libintl="gt_cv_func_gnugettext${gt_api_version}_libintl" + + dnl If we use NLS figure out what method + if test "$USE_NLS" = "yes"; then + gt_use_preinstalled_gnugettext=no + ifelse(gt_included_intl, yes, [ + AC_MSG_CHECKING([whether included gettext is requested]) + AC_ARG_WITH(included-gettext, + [ --with-included-gettext use the GNU gettext library included here], + nls_cv_force_use_gnu_gettext=$withval, + nls_cv_force_use_gnu_gettext=no) + AC_MSG_RESULT($nls_cv_force_use_gnu_gettext) + + nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext" + if test "$nls_cv_force_use_gnu_gettext" != "yes"; then + ]) + dnl User does not insist on using GNU NLS library. Figure out what + dnl to use. If GNU gettext is available we use this. Else we have + dnl to fall back to GNU NLS library. + + if test $gt_api_version -ge 3; then + gt_revision_test_code=' +#ifndef __GNU_GETTEXT_SUPPORTED_REVISION +#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) +#endif +changequote(,)dnl +typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; +changequote([,])dnl +' + else + gt_revision_test_code= + fi + if test $gt_api_version -ge 2; then + gt_expression_test_code=' + * ngettext ("", "", 0)' + else + gt_expression_test_code= + fi + + AC_CACHE_CHECK([for GNU gettext in libc], [$gt_func_gnugettext_libc], + [AC_TRY_LINK([#include +$gt_revision_test_code +extern int _nl_msg_cat_cntr; +extern int *_nl_domain_bindings;], + [bindtextdomain ("", ""); +return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_domain_bindings], + [eval "$gt_func_gnugettext_libc=yes"], + [eval "$gt_func_gnugettext_libc=no"])]) + + if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then + dnl Sometimes libintl requires libiconv, so first search for libiconv. + ifelse(gt_included_intl, yes, , [ + AM_ICONV_LINK + ]) + dnl Search for libintl and define LIBINTL, LTLIBINTL and INCINTL + dnl accordingly. Don't use AC_LIB_LINKFLAGS_BODY([intl],[iconv]) + dnl because that would add "-liconv" to LIBINTL and LTLIBINTL + dnl even if libiconv doesn't exist. + AC_LIB_LINKFLAGS_BODY([intl]) + AC_CACHE_CHECK([for GNU gettext in libintl], + [$gt_func_gnugettext_libintl], + [gt_save_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $INCINTL" + gt_save_LIBS="$LIBS" + LIBS="$LIBS $LIBINTL" + dnl Now see whether libintl exists and does not depend on libiconv. + AC_TRY_LINK([#include +$gt_revision_test_code +extern int _nl_msg_cat_cntr; +extern +#ifdef __cplusplus +"C" +#endif +const char *_nl_expand_alias (const char *);], + [bindtextdomain ("", ""); +return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("")], + [eval "$gt_func_gnugettext_libintl=yes"], + [eval "$gt_func_gnugettext_libintl=no"]) + dnl Now see whether libintl exists and depends on libiconv. + if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" != yes; } && test -n "$LIBICONV"; then + LIBS="$LIBS $LIBICONV" + AC_TRY_LINK([#include +$gt_revision_test_code +extern int _nl_msg_cat_cntr; +extern +#ifdef __cplusplus +"C" +#endif +const char *_nl_expand_alias (const char *);], + [bindtextdomain ("", ""); +return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("")], + [LIBINTL="$LIBINTL $LIBICONV" + LTLIBINTL="$LTLIBINTL $LTLIBICONV" + eval "$gt_func_gnugettext_libintl=yes" + ]) + fi + CPPFLAGS="$gt_save_CPPFLAGS" + LIBS="$gt_save_LIBS"]) + fi + + dnl If an already present or preinstalled GNU gettext() is found, + dnl use it. But if this macro is used in GNU gettext, and GNU + dnl gettext is already preinstalled in libintl, we update this + dnl libintl. (Cf. the install rule in intl/Makefile.in.) + if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" = "yes"; } \ + || { { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; } \ + && test "$PACKAGE" != gettext-runtime \ + && test "$PACKAGE" != gettext-tools; }; then + gt_use_preinstalled_gnugettext=yes + else + dnl Reset the values set by searching for libintl. + LIBINTL= + LTLIBINTL= + INCINTL= + fi + + ifelse(gt_included_intl, yes, [ + if test "$gt_use_preinstalled_gnugettext" != "yes"; then + dnl GNU gettext is not found in the C library. + dnl Fall back on included GNU gettext library. + nls_cv_use_gnu_gettext=yes + fi + fi + + if test "$nls_cv_use_gnu_gettext" = "yes"; then + dnl Mark actions used to generate GNU NLS library. + BUILD_INCLUDED_LIBINTL=yes + USE_INCLUDED_LIBINTL=yes + LIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LIBICONV $LIBTHREAD" + LTLIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LTLIBICONV $LTLIBTHREAD" + LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'` + fi + + CATOBJEXT= + if test "$gt_use_preinstalled_gnugettext" = "yes" \ + || test "$nls_cv_use_gnu_gettext" = "yes"; then + dnl Mark actions to use GNU gettext tools. + CATOBJEXT=.gmo + fi + ]) + + if test -n "$INTL_MACOSX_LIBS"; then + if test "$gt_use_preinstalled_gnugettext" = "yes" \ + || test "$nls_cv_use_gnu_gettext" = "yes"; then + dnl Some extra flags are needed during linking. + LIBINTL="$LIBINTL $INTL_MACOSX_LIBS" + LTLIBINTL="$LTLIBINTL $INTL_MACOSX_LIBS" + fi + fi + + if test "$gt_use_preinstalled_gnugettext" = "yes" \ + || test "$nls_cv_use_gnu_gettext" = "yes"; then + AC_DEFINE(ENABLE_NLS, 1, + [Define to 1 if translation of program messages to the user's native language + is requested.]) + else + USE_NLS=no + fi + fi + + AC_MSG_CHECKING([whether to use NLS]) + AC_MSG_RESULT([$USE_NLS]) + if test "$USE_NLS" = "yes"; then + AC_MSG_CHECKING([where the gettext function comes from]) + if test "$gt_use_preinstalled_gnugettext" = "yes"; then + if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then + gt_source="external libintl" + else + gt_source="libc" + fi + else + gt_source="included intl directory" + fi + AC_MSG_RESULT([$gt_source]) + fi + + if test "$USE_NLS" = "yes"; then + + if test "$gt_use_preinstalled_gnugettext" = "yes"; then + if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then + AC_MSG_CHECKING([how to link with libintl]) + AC_MSG_RESULT([$LIBINTL]) + AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCINTL]) + fi + + dnl For backward compatibility. Some packages may be using this. + AC_DEFINE(HAVE_GETTEXT, 1, + [Define if the GNU gettext() function is already present or preinstalled.]) + AC_DEFINE(HAVE_DCGETTEXT, 1, + [Define if the GNU dcgettext() function is already present or preinstalled.]) + fi + + dnl We need to process the po/ directory. + POSUB=po + fi + + ifelse(gt_included_intl, yes, [ + dnl If this is used in GNU gettext we have to set BUILD_INCLUDED_LIBINTL + dnl to 'yes' because some of the testsuite requires it. + if test "$PACKAGE" = gettext-runtime || test "$PACKAGE" = gettext-tools; then + BUILD_INCLUDED_LIBINTL=yes + fi + + dnl Make all variables we use known to autoconf. + AC_SUBST(BUILD_INCLUDED_LIBINTL) + AC_SUBST(USE_INCLUDED_LIBINTL) + AC_SUBST(CATOBJEXT) + + dnl For backward compatibility. Some configure.ins may be using this. + nls_cv_header_intl= + nls_cv_header_libgt= + + dnl For backward compatibility. Some Makefiles may be using this. + DATADIRNAME=share + AC_SUBST(DATADIRNAME) + + dnl For backward compatibility. Some Makefiles may be using this. + INSTOBJEXT=.mo + AC_SUBST(INSTOBJEXT) + + dnl For backward compatibility. Some Makefiles may be using this. + GENCAT=gencat + AC_SUBST(GENCAT) + + dnl For backward compatibility. Some Makefiles may be using this. + INTLOBJS= + if test "$USE_INCLUDED_LIBINTL" = yes; then + INTLOBJS="\$(GETTOBJS)" + fi + AC_SUBST(INTLOBJS) + + dnl Enable libtool support if the surrounding package wishes it. + INTL_LIBTOOL_SUFFIX_PREFIX=gt_libtool_suffix_prefix + AC_SUBST(INTL_LIBTOOL_SUFFIX_PREFIX) + ]) + + dnl For backward compatibility. Some Makefiles may be using this. + INTLLIBS="$LIBINTL" + AC_SUBST(INTLLIBS) + + dnl Make all documented variables known to autoconf. + AC_SUBST(LIBINTL) + AC_SUBST(LTLIBINTL) + AC_SUBST(POSUB) +]) + + +dnl gt_NEEDS_INIT ensures that the gt_needs variable is initialized. +m4_define([gt_NEEDS_INIT], +[ + m4_divert_text([DEFAULTS], [gt_needs=]) + m4_define([gt_NEEDS_INIT], []) +]) + + +dnl Usage: AM_GNU_GETTEXT_NEED([NEEDSYMBOL]) +AC_DEFUN([AM_GNU_GETTEXT_NEED], +[ + m4_divert_text([INIT_PREPARE], [gt_needs="$gt_needs $1"]) +]) + + +dnl Usage: AM_GNU_GETTEXT_VERSION([gettext-version]) +AC_DEFUN([AM_GNU_GETTEXT_VERSION], []) diff --git a/m4/iconv.m4 b/m4/iconv.m4 new file mode 100644 index 0000000..66bc76f --- /dev/null +++ b/m4/iconv.m4 @@ -0,0 +1,180 @@ +# iconv.m4 serial AM6 (gettext-0.17) +dnl Copyright (C) 2000-2002, 2007 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Bruno Haible. + +AC_DEFUN([AM_ICONV_LINKFLAGS_BODY], +[ + dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + AC_REQUIRE([AC_LIB_RPATH]) + + dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV + dnl accordingly. + AC_LIB_LINKFLAGS_BODY([iconv]) +]) + +AC_DEFUN([AM_ICONV_LINK], +[ + dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and + dnl those with the standalone portable GNU libiconv installed). + AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles + + dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV + dnl accordingly. + AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) + + dnl Add $INCICONV to CPPFLAGS before performing the following checks, + dnl because if the user has installed libiconv and not disabled its use + dnl via --without-libiconv-prefix, he wants to use it. The first + dnl AC_TRY_LINK will then fail, the second AC_TRY_LINK will succeed. + am_save_CPPFLAGS="$CPPFLAGS" + AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCICONV]) + + AC_CACHE_CHECK([for iconv], am_cv_func_iconv, [ + am_cv_func_iconv="no, consider installing GNU libiconv" + am_cv_lib_iconv=no + AC_TRY_LINK([#include +#include ], + [iconv_t cd = iconv_open("",""); + iconv(cd,NULL,NULL,NULL,NULL); + iconv_close(cd);], + am_cv_func_iconv=yes) + if test "$am_cv_func_iconv" != yes; then + am_save_LIBS="$LIBS" + LIBS="$LIBS $LIBICONV" + AC_TRY_LINK([#include +#include ], + [iconv_t cd = iconv_open("",""); + iconv(cd,NULL,NULL,NULL,NULL); + iconv_close(cd);], + am_cv_lib_iconv=yes + am_cv_func_iconv=yes) + LIBS="$am_save_LIBS" + fi + ]) + if test "$am_cv_func_iconv" = yes; then + AC_CACHE_CHECK([for working iconv], am_cv_func_iconv_works, [ + dnl This tests against bugs in AIX 5.1 and HP-UX 11.11. + am_save_LIBS="$LIBS" + if test $am_cv_lib_iconv = yes; then + LIBS="$LIBS $LIBICONV" + fi + AC_TRY_RUN([ +#include +#include +int main () +{ + /* Test against AIX 5.1 bug: Failures are not distinguishable from successful + returns. */ + { + iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8"); + if (cd_utf8_to_88591 != (iconv_t)(-1)) + { + static const char input[] = "\342\202\254"; /* EURO SIGN */ + char buf[10]; + const char *inptr = input; + size_t inbytesleft = strlen (input); + char *outptr = buf; + size_t outbytesleft = sizeof (buf); + size_t res = iconv (cd_utf8_to_88591, + (char **) &inptr, &inbytesleft, + &outptr, &outbytesleft); + if (res == 0) + return 1; + } + } +#if 0 /* This bug could be worked around by the caller. */ + /* Test against HP-UX 11.11 bug: Positive return value instead of 0. */ + { + iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591"); + if (cd_88591_to_utf8 != (iconv_t)(-1)) + { + static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337"; + char buf[50]; + const char *inptr = input; + size_t inbytesleft = strlen (input); + char *outptr = buf; + size_t outbytesleft = sizeof (buf); + size_t res = iconv (cd_88591_to_utf8, + (char **) &inptr, &inbytesleft, + &outptr, &outbytesleft); + if ((int)res > 0) + return 1; + } + } +#endif + /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is + provided. */ + if (/* Try standardized names. */ + iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1) + /* Try IRIX, OSF/1 names. */ + && iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1) + /* Try AIX names. */ + && iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1) + /* Try HP-UX names. */ + && iconv_open ("utf8", "eucJP") == (iconv_t)(-1)) + return 1; + return 0; +}], [am_cv_func_iconv_works=yes], [am_cv_func_iconv_works=no], + [case "$host_os" in + aix* | hpux*) am_cv_func_iconv_works="guessing no" ;; + *) am_cv_func_iconv_works="guessing yes" ;; + esac]) + LIBS="$am_save_LIBS" + ]) + case "$am_cv_func_iconv_works" in + *no) am_func_iconv=no am_cv_lib_iconv=no ;; + *) am_func_iconv=yes ;; + esac + else + am_func_iconv=no am_cv_lib_iconv=no + fi + if test "$am_func_iconv" = yes; then + AC_DEFINE(HAVE_ICONV, 1, + [Define if you have the iconv() function and it works.]) + fi + if test "$am_cv_lib_iconv" = yes; then + AC_MSG_CHECKING([how to link with libiconv]) + AC_MSG_RESULT([$LIBICONV]) + else + dnl If $LIBICONV didn't lead to a usable library, we don't need $INCICONV + dnl either. + CPPFLAGS="$am_save_CPPFLAGS" + LIBICONV= + LTLIBICONV= + fi + AC_SUBST(LIBICONV) + AC_SUBST(LTLIBICONV) +]) + +AC_DEFUN([AM_ICONV], +[ + AM_ICONV_LINK + if test "$am_cv_func_iconv" = yes; then + AC_MSG_CHECKING([for iconv declaration]) + AC_CACHE_VAL(am_cv_proto_iconv, [ + AC_TRY_COMPILE([ +#include +#include +extern +#ifdef __cplusplus +"C" +#endif +#if defined(__STDC__) || defined(__cplusplus) +size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft); +#else +size_t iconv(); +#endif +], [], am_cv_proto_iconv_arg1="", am_cv_proto_iconv_arg1="const") + am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"]) + am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'` + AC_MSG_RESULT([$]{ac_t:- + }[$]am_cv_proto_iconv) + AC_DEFINE_UNQUOTED(ICONV_CONST, $am_cv_proto_iconv_arg1, + [Define as const if the declaration of iconv() needs const.]) + fi +]) diff --git a/m4/intltool.m4 b/m4/intltool.m4 new file mode 100644 index 0000000..122d773 --- /dev/null +++ b/m4/intltool.m4 @@ -0,0 +1,216 @@ +## intltool.m4 - Configure intltool for the target system. -*-Shell-script-*- +## Copyright (C) 2001 Eazel, Inc. +## Author: Maciej Stachowiak +## Kenneth Christiansen +## +## 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +## +## As a special exception to the GNU General Public License, if you +## distribute this file as part of a program that contains a +## configuration script generated by Autoconf, you may include it under +## the same distribution terms that you use for the rest of that program. + +dnl IT_PROG_INTLTOOL([MINIMUM-VERSION], [no-xml]) +# serial 40 IT_PROG_INTLTOOL +AC_DEFUN([IT_PROG_INTLTOOL], [ +AC_PREREQ([2.50])dnl +AC_REQUIRE([AM_NLS])dnl + +case "$am__api_version" in + 1.[01234]) + AC_MSG_ERROR([Automake 1.5 or newer is required to use intltool]) + ;; + *) + ;; +esac + +if test -n "$1"; then + AC_MSG_CHECKING([for intltool >= $1]) + + INTLTOOL_REQUIRED_VERSION_AS_INT=`echo $1 | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'` + INTLTOOL_APPLIED_VERSION=`intltool-update --version | head -1 | cut -d" " -f3` + [INTLTOOL_APPLIED_VERSION_AS_INT=`echo $INTLTOOL_APPLIED_VERSION | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'` + ] + AC_MSG_RESULT([$INTLTOOL_APPLIED_VERSION found]) + test "$INTLTOOL_APPLIED_VERSION_AS_INT" -ge "$INTLTOOL_REQUIRED_VERSION_AS_INT" || + AC_MSG_ERROR([Your intltool is too old. You need intltool $1 or later.]) +fi + +AC_PATH_PROG(INTLTOOL_UPDATE, [intltool-update]) +AC_PATH_PROG(INTLTOOL_MERGE, [intltool-merge]) +AC_PATH_PROG(INTLTOOL_EXTRACT, [intltool-extract]) +if test -z "$INTLTOOL_UPDATE" -o -z "$INTLTOOL_MERGE" -o -z "$INTLTOOL_EXTRACT"; then + AC_MSG_ERROR([The intltool scripts were not found. Please install intltool.]) +fi + + INTLTOOL_DESKTOP_RULE='%.desktop: %.desktop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' +INTLTOOL_DIRECTORY_RULE='%.directory: %.directory.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' + INTLTOOL_KEYS_RULE='%.keys: %.keys.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -k -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' + INTLTOOL_PROP_RULE='%.prop: %.prop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' + INTLTOOL_OAF_RULE='%.oaf: %.oaf.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -o -p $(top_srcdir)/po $< [$]@' + INTLTOOL_PONG_RULE='%.pong: %.pong.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' + INTLTOOL_SERVER_RULE='%.server: %.server.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -o -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' + INTLTOOL_SHEET_RULE='%.sheet: %.sheet.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' +INTLTOOL_SOUNDLIST_RULE='%.soundlist: %.soundlist.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' + INTLTOOL_UI_RULE='%.ui: %.ui.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' + INTLTOOL_XML_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' + INTLTOOL_XML_NOMERGE_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u /tmp $< [$]@' + INTLTOOL_XAM_RULE='%.xam: %.xml.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' + INTLTOOL_KBD_RULE='%.kbd: %.kbd.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -m -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' + INTLTOOL_CAVES_RULE='%.caves: %.caves.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' + INTLTOOL_SCHEMAS_RULE='%.schemas: %.schemas.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -s -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' + INTLTOOL_THEME_RULE='%.theme: %.theme.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' + INTLTOOL_SERVICE_RULE='%.service: %.service.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' + INTLTOOL_POLICY_RULE='%.policy: %.policy.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' + +_IT_SUBST(INTLTOOL_DESKTOP_RULE) +_IT_SUBST(INTLTOOL_DIRECTORY_RULE) +_IT_SUBST(INTLTOOL_KEYS_RULE) +_IT_SUBST(INTLTOOL_PROP_RULE) +_IT_SUBST(INTLTOOL_OAF_RULE) +_IT_SUBST(INTLTOOL_PONG_RULE) +_IT_SUBST(INTLTOOL_SERVER_RULE) +_IT_SUBST(INTLTOOL_SHEET_RULE) +_IT_SUBST(INTLTOOL_SOUNDLIST_RULE) +_IT_SUBST(INTLTOOL_UI_RULE) +_IT_SUBST(INTLTOOL_XAM_RULE) +_IT_SUBST(INTLTOOL_KBD_RULE) +_IT_SUBST(INTLTOOL_XML_RULE) +_IT_SUBST(INTLTOOL_XML_NOMERGE_RULE) +_IT_SUBST(INTLTOOL_CAVES_RULE) +_IT_SUBST(INTLTOOL_SCHEMAS_RULE) +_IT_SUBST(INTLTOOL_THEME_RULE) +_IT_SUBST(INTLTOOL_SERVICE_RULE) +_IT_SUBST(INTLTOOL_POLICY_RULE) + +# Check the gettext tools to make sure they are GNU +AC_PATH_PROG(XGETTEXT, xgettext) +AC_PATH_PROG(MSGMERGE, msgmerge) +AC_PATH_PROG(MSGFMT, msgfmt) +AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) +if test -z "$XGETTEXT" -o -z "$MSGMERGE" -o -z "$MSGFMT"; then + AC_MSG_ERROR([GNU gettext tools not found; required for intltool]) +fi +xgversion="`$XGETTEXT --version|grep '(GNU ' 2> /dev/null`" +mmversion="`$MSGMERGE --version|grep '(GNU ' 2> /dev/null`" +mfversion="`$MSGFMT --version|grep '(GNU ' 2> /dev/null`" +if test -z "$xgversion" -o -z "$mmversion" -o -z "$mfversion"; then + AC_MSG_ERROR([GNU gettext tools not found; required for intltool]) +fi + +AC_PATH_PROG(INTLTOOL_PERL, perl) +if test -z "$INTLTOOL_PERL"; then + AC_MSG_ERROR([perl not found]) +fi +AC_MSG_CHECKING([for perl >= 5.8.1]) +$INTLTOOL_PERL -e "use 5.8.1;" > /dev/null 2>&1 +if test $? -ne 0; then + AC_MSG_ERROR([perl 5.8.1 is required for intltool]) +else + IT_PERL_VERSION="`$INTLTOOL_PERL -e \"printf '%vd', $^V\"`" + AC_MSG_RESULT([$IT_PERL_VERSION]) +fi +if test "x$2" != "xno-xml"; then + AC_MSG_CHECKING([for XML::Parser]) + if `$INTLTOOL_PERL -e "require XML::Parser" 2>/dev/null`; then + AC_MSG_RESULT([ok]) + else + AC_MSG_ERROR([XML::Parser perl module is required for intltool]) + fi +fi + +# Substitute ALL_LINGUAS so we can use it in po/Makefile +AC_SUBST(ALL_LINGUAS) + +# Set DATADIRNAME correctly if it is not set yet +# (copied from glib-gettext.m4) +if test -z "$DATADIRNAME"; then + AC_LINK_IFELSE( + [AC_LANG_PROGRAM([[]], + [[extern int _nl_msg_cat_cntr; + return _nl_msg_cat_cntr]])], + [DATADIRNAME=share], + [case $host in + *-*-solaris*) + dnl On Solaris, if bind_textdomain_codeset is in libc, + dnl GNU format message catalog is always supported, + dnl since both are added to the libc all together. + dnl Hence, we'd like to go with DATADIRNAME=share + dnl in this case. + AC_CHECK_FUNC(bind_textdomain_codeset, + [DATADIRNAME=share], [DATADIRNAME=lib]) + ;; + *) + [DATADIRNAME=lib] + ;; + esac]) +fi +AC_SUBST(DATADIRNAME) + +IT_PO_SUBDIR([po]) + +]) + + +# IT_PO_SUBDIR(DIRNAME) +# --------------------- +# All po subdirs have to be declared with this macro; the subdir "po" is +# declared by IT_PROG_INTLTOOL. +# +AC_DEFUN([IT_PO_SUBDIR], +[AC_PREREQ([2.53])dnl We use ac_top_srcdir inside AC_CONFIG_COMMANDS. +dnl +dnl The following CONFIG_COMMANDS should be exetuted at the very end +dnl of config.status. +AC_CONFIG_COMMANDS_PRE([ + AC_CONFIG_COMMANDS([$1/stamp-it], [ + if [ ! grep "^# INTLTOOL_MAKEFILE$" "$1/Makefile.in" > /dev/null ]; then + AC_MSG_ERROR([$1/Makefile.in.in was not created by intltoolize.]) + fi + rm -f "$1/stamp-it" "$1/stamp-it.tmp" "$1/POTFILES" "$1/Makefile.tmp" + >"$1/stamp-it.tmp" + [sed '/^#/d + s/^[[].*] *// + /^[ ]*$/d + '"s|^| $ac_top_srcdir/|" \ + "$srcdir/$1/POTFILES.in" | sed '$!s/$/ \\/' >"$1/POTFILES" + ] + [sed '/^POTFILES =/,/[^\\]$/ { + /^POTFILES =/!d + r $1/POTFILES + } + ' "$1/Makefile.in" >"$1/Makefile"] + rm -f "$1/Makefile.tmp" + mv "$1/stamp-it.tmp" "$1/stamp-it" + ]) +])dnl +]) + +# _IT_SUBST(VARIABLE) +# ------------------- +# Abstract macro to do either _AM_SUBST_NOTMAKE or AC_SUBST +# +AC_DEFUN([_IT_SUBST], +[ +AC_SUBST([$1]) +m4_ifdef([_AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE([$1])]) +] +) + +# deprecated macros +AU_ALIAS([AC_PROG_INTLTOOL], [IT_PROG_INTLTOOL]) +# A hint is needed for aclocal from Automake <= 1.9.4: +# AC_DEFUN([AC_PROG_INTLTOOL], ...) + diff --git a/m4/lib-ld.m4 b/m4/lib-ld.m4 new file mode 100644 index 0000000..96c4e2c --- /dev/null +++ b/m4/lib-ld.m4 @@ -0,0 +1,110 @@ +# lib-ld.m4 serial 3 (gettext-0.13) +dnl Copyright (C) 1996-2003 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl Subroutines of libtool.m4, +dnl with replacements s/AC_/AC_LIB/ and s/lt_cv/acl_cv/ to avoid collision +dnl with libtool.m4. + +dnl From libtool-1.4. Sets the variable with_gnu_ld to yes or no. +AC_DEFUN([AC_LIB_PROG_LD_GNU], +[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], acl_cv_prog_gnu_ld, +[# I'd rather use --version here, but apparently some GNU ld's only accept -v. +case `$LD -v 2>&1 conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by GCC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]* | [A-Za-z]:[\\/]*)] + [re_direlt='/[^/][^/]*/\.\./'] + # Canonicalize the path of ld + ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(acl_cv_path_LD, +[if test -z "$LD"; then + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + acl_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in + *GNU* | *'with BFD'*) + test "$with_gnu_ld" != no && break ;; + *) + test "$with_gnu_ld" != yes && break ;; + esac + fi + done + IFS="$ac_save_ifs" +else + acl_cv_path_LD="$LD" # Let the user override the test with a path. +fi]) +LD="$acl_cv_path_LD" +if test -n "$LD"; then + AC_MSG_RESULT($LD) +else + AC_MSG_RESULT(no) +fi +test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH]) +AC_LIB_PROG_LD_GNU +]) diff --git a/m4/lib-link.m4 b/m4/lib-link.m4 new file mode 100644 index 0000000..e3d26fc --- /dev/null +++ b/m4/lib-link.m4 @@ -0,0 +1,709 @@ +# lib-link.m4 serial 13 (gettext-0.17) +dnl Copyright (C) 2001-2007 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Bruno Haible. + +AC_PREREQ(2.54) + +dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and +dnl the libraries corresponding to explicit and implicit dependencies. +dnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and +dnl augments the CPPFLAGS variable. +dnl Sets and AC_SUBSTs the LIB${NAME}_PREFIX variable to nonempty if libname +dnl was found in ${LIB${NAME}_PREFIX}/$acl_libdirstem. +AC_DEFUN([AC_LIB_LINKFLAGS], +[ + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + AC_REQUIRE([AC_LIB_RPATH]) + define([Name],[translit([$1],[./-], [___])]) + define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) + AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [ + AC_LIB_LINKFLAGS_BODY([$1], [$2]) + ac_cv_lib[]Name[]_libs="$LIB[]NAME" + ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME" + ac_cv_lib[]Name[]_cppflags="$INC[]NAME" + ac_cv_lib[]Name[]_prefix="$LIB[]NAME[]_PREFIX" + ]) + LIB[]NAME="$ac_cv_lib[]Name[]_libs" + LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs" + INC[]NAME="$ac_cv_lib[]Name[]_cppflags" + LIB[]NAME[]_PREFIX="$ac_cv_lib[]Name[]_prefix" + AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) + AC_SUBST([LIB]NAME) + AC_SUBST([LTLIB]NAME) + AC_SUBST([LIB]NAME[_PREFIX]) + dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the + dnl results of this search when this library appears as a dependency. + HAVE_LIB[]NAME=yes + undefine([Name]) + undefine([NAME]) +]) + +dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode) +dnl searches for libname and the libraries corresponding to explicit and +dnl implicit dependencies, together with the specified include files and +dnl the ability to compile and link the specified testcode. If found, it +dnl sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME} and +dnl LTLIB${NAME} variables and augments the CPPFLAGS variable, and +dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs +dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty. +dnl Sets and AC_SUBSTs the LIB${NAME}_PREFIX variable to nonempty if libname +dnl was found in ${LIB${NAME}_PREFIX}/$acl_libdirstem. +AC_DEFUN([AC_LIB_HAVE_LINKFLAGS], +[ + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + AC_REQUIRE([AC_LIB_RPATH]) + define([Name],[translit([$1],[./-], [___])]) + define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) + + dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME + dnl accordingly. + AC_LIB_LINKFLAGS_BODY([$1], [$2]) + + dnl Add $INC[]NAME to CPPFLAGS before performing the following checks, + dnl because if the user has installed lib[]Name and not disabled its use + dnl via --without-lib[]Name-prefix, he wants to use it. + ac_save_CPPFLAGS="$CPPFLAGS" + AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) + + AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [ + ac_save_LIBS="$LIBS" + LIBS="$LIBS $LIB[]NAME" + AC_TRY_LINK([$3], [$4], [ac_cv_lib[]Name=yes], [ac_cv_lib[]Name=no]) + LIBS="$ac_save_LIBS" + ]) + if test "$ac_cv_lib[]Name" = yes; then + HAVE_LIB[]NAME=yes + AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the $1 library.]) + AC_MSG_CHECKING([how to link with lib[]$1]) + AC_MSG_RESULT([$LIB[]NAME]) + else + HAVE_LIB[]NAME=no + dnl If $LIB[]NAME didn't lead to a usable library, we don't need + dnl $INC[]NAME either. + CPPFLAGS="$ac_save_CPPFLAGS" + LIB[]NAME= + LTLIB[]NAME= + LIB[]NAME[]_PREFIX= + fi + AC_SUBST([HAVE_LIB]NAME) + AC_SUBST([LIB]NAME) + AC_SUBST([LTLIB]NAME) + AC_SUBST([LIB]NAME[_PREFIX]) + undefine([Name]) + undefine([NAME]) +]) + +dnl Determine the platform dependent parameters needed to use rpath: +dnl acl_libext, +dnl acl_shlibext, +dnl acl_hardcode_libdir_flag_spec, +dnl acl_hardcode_libdir_separator, +dnl acl_hardcode_direct, +dnl acl_hardcode_minus_L. +AC_DEFUN([AC_LIB_RPATH], +[ + dnl Tell automake >= 1.10 to complain if config.rpath is missing. + m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([config.rpath])]) + AC_REQUIRE([AC_PROG_CC]) dnl we use $CC, $GCC, $LDFLAGS + AC_REQUIRE([AC_LIB_PROG_LD]) dnl we use $LD, $with_gnu_ld + AC_REQUIRE([AC_CANONICAL_HOST]) dnl we use $host + AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir + AC_CACHE_CHECK([for shared library run path origin], acl_cv_rpath, [ + CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ + ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh + . ./conftest.sh + rm -f ./conftest.sh + acl_cv_rpath=done + ]) + wl="$acl_cv_wl" + acl_libext="$acl_cv_libext" + acl_shlibext="$acl_cv_shlibext" + acl_libname_spec="$acl_cv_libname_spec" + acl_library_names_spec="$acl_cv_library_names_spec" + acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" + acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" + acl_hardcode_direct="$acl_cv_hardcode_direct" + acl_hardcode_minus_L="$acl_cv_hardcode_minus_L" + dnl Determine whether the user wants rpath handling at all. + AC_ARG_ENABLE(rpath, + [ --disable-rpath do not hardcode runtime library paths], + :, enable_rpath=yes) +]) + +dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and +dnl the libraries corresponding to explicit and implicit dependencies. +dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables. +dnl Also, sets the LIB${NAME}_PREFIX variable to nonempty if libname was found +dnl in ${LIB${NAME}_PREFIX}/$acl_libdirstem. +AC_DEFUN([AC_LIB_LINKFLAGS_BODY], +[ + AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) + define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) + dnl Autoconf >= 2.61 supports dots in --with options. + define([N_A_M_E],[m4_if(m4_version_compare(m4_defn([m4_PACKAGE_VERSION]),[2.61]),[-1],[translit([$1],[.],[_])],[$1])]) + dnl By default, look in $includedir and $libdir. + use_additional=yes + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + AC_LIB_ARG_WITH([lib]N_A_M_E[-prefix], +[ --with-lib]N_A_M_E[-prefix[=DIR] search for lib$1 in DIR/include and DIR/lib + --without-lib]N_A_M_E[-prefix don't search for lib$1 in includedir and libdir], +[ + if test "X$withval" = "Xno"; then + use_additional=no + else + if test "X$withval" = "X"; then + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + else + additional_includedir="$withval/include" + additional_libdir="$withval/$acl_libdirstem" + fi + fi +]) + dnl Search the library and its dependencies in $additional_libdir and + dnl $LDFLAGS. Using breadth-first-seach. + LIB[]NAME= + LTLIB[]NAME= + INC[]NAME= + LIB[]NAME[]_PREFIX= + rpathdirs= + ltrpathdirs= + names_already_handled= + names_next_round='$1 $2' + while test -n "$names_next_round"; do + names_this_round="$names_next_round" + names_next_round= + for name in $names_this_round; do + already_handled= + for n in $names_already_handled; do + if test "$n" = "$name"; then + already_handled=yes + break + fi + done + if test -z "$already_handled"; then + names_already_handled="$names_already_handled $name" + dnl See if it was already located by an earlier AC_LIB_LINKFLAGS + dnl or AC_LIB_HAVE_LINKFLAGS call. + uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` + eval value=\"\$HAVE_LIB$uppername\" + if test -n "$value"; then + if test "$value" = yes; then + eval value=\"\$LIB$uppername\" + test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value" + eval value=\"\$LTLIB$uppername\" + test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value" + else + dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined + dnl that this library doesn't exist. So just drop it. + : + fi + else + dnl Search the library lib$name in $additional_libdir and $LDFLAGS + dnl and the already constructed $LIBNAME/$LTLIBNAME. + found_dir= + found_la= + found_so= + found_a= + eval libname=\"$acl_libname_spec\" # typically: libname=lib$name + if test -n "$acl_shlibext"; then + shrext=".$acl_shlibext" # typically: shrext=.so + else + shrext= + fi + if test $use_additional = yes; then + dir="$additional_libdir" + dnl The same code as in the loop below: + dnl First look for a shared library. + if test -n "$acl_shlibext"; then + if test -f "$dir/$libname$shrext"; then + found_dir="$dir" + found_so="$dir/$libname$shrext" + else + if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then + ver=`(cd "$dir" && \ + for f in "$libname$shrext".*; do echo "$f"; done \ + | sed -e "s,^$libname$shrext\\\\.,," \ + | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ + | sed 1q ) 2>/dev/null` + if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then + found_dir="$dir" + found_so="$dir/$libname$shrext.$ver" + fi + else + eval library_names=\"$acl_library_names_spec\" + for f in $library_names; do + if test -f "$dir/$f"; then + found_dir="$dir" + found_so="$dir/$f" + break + fi + done + fi + fi + fi + dnl Then look for a static library. + if test "X$found_dir" = "X"; then + if test -f "$dir/$libname.$acl_libext"; then + found_dir="$dir" + found_a="$dir/$libname.$acl_libext" + fi + fi + if test "X$found_dir" != "X"; then + if test -f "$dir/$libname.la"; then + found_la="$dir/$libname.la" + fi + fi + fi + if test "X$found_dir" = "X"; then + for x in $LDFLAGS $LTLIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + case "$x" in + -L*) + dir=`echo "X$x" | sed -e 's/^X-L//'` + dnl First look for a shared library. + if test -n "$acl_shlibext"; then + if test -f "$dir/$libname$shrext"; then + found_dir="$dir" + found_so="$dir/$libname$shrext" + else + if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then + ver=`(cd "$dir" && \ + for f in "$libname$shrext".*; do echo "$f"; done \ + | sed -e "s,^$libname$shrext\\\\.,," \ + | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ + | sed 1q ) 2>/dev/null` + if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then + found_dir="$dir" + found_so="$dir/$libname$shrext.$ver" + fi + else + eval library_names=\"$acl_library_names_spec\" + for f in $library_names; do + if test -f "$dir/$f"; then + found_dir="$dir" + found_so="$dir/$f" + break + fi + done + fi + fi + fi + dnl Then look for a static library. + if test "X$found_dir" = "X"; then + if test -f "$dir/$libname.$acl_libext"; then + found_dir="$dir" + found_a="$dir/$libname.$acl_libext" + fi + fi + if test "X$found_dir" != "X"; then + if test -f "$dir/$libname.la"; then + found_la="$dir/$libname.la" + fi + fi + ;; + esac + if test "X$found_dir" != "X"; then + break + fi + done + fi + if test "X$found_dir" != "X"; then + dnl Found the library. + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name" + if test "X$found_so" != "X"; then + dnl Linking with a shared library. We attempt to hardcode its + dnl directory into the executable's runpath, unless it's the + dnl standard /usr/lib. + if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/$acl_libdirstem"; then + dnl No hardcoding is needed. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + else + dnl Use an explicit option to hardcode DIR into the resulting + dnl binary. + dnl Potentially add DIR to ltrpathdirs. + dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $found_dir" + fi + dnl The hardcoding into $LIBNAME is system dependent. + if test "$acl_hardcode_direct" = yes; then + dnl Using DIR/libNAME.so during linking hardcodes DIR into the + dnl resulting binary. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + else + if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then + dnl Use an explicit option to hardcode DIR into the resulting + dnl binary. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + dnl Potentially add DIR to rpathdirs. + dnl The rpathdirs will be appended to $LIBNAME at the end. + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $found_dir" + fi + else + dnl Rely on "-L$found_dir". + dnl But don't add it if it's already contained in the LDFLAGS + dnl or the already constructed $LIBNAME + haveit= + for x in $LDFLAGS $LIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-L$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir" + fi + if test "$acl_hardcode_minus_L" != no; then + dnl FIXME: Not sure whether we should use + dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" + dnl here. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + else + dnl We cannot use $acl_hardcode_runpath_var and LD_RUN_PATH + dnl here, because this doesn't fit in flags passed to the + dnl compiler. So give up. No hardcoding. This affects only + dnl very old systems. + dnl FIXME: Not sure whether we should use + dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" + dnl here. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" + fi + fi + fi + fi + else + if test "X$found_a" != "X"; then + dnl Linking with a static library. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a" + else + dnl We shouldn't come here, but anyway it's good to have a + dnl fallback. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name" + fi + fi + dnl Assume the include files are nearby. + additional_includedir= + case "$found_dir" in + */$acl_libdirstem | */$acl_libdirstem/) + basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` + LIB[]NAME[]_PREFIX="$basedir" + additional_includedir="$basedir/include" + ;; + esac + if test "X$additional_includedir" != "X"; then + dnl Potentially add $additional_includedir to $INCNAME. + dnl But don't add it + dnl 1. if it's the standard /usr/include, + dnl 2. if it's /usr/local/include and we are using GCC on Linux, + dnl 3. if it's already present in $CPPFLAGS or the already + dnl constructed $INCNAME, + dnl 4. if it doesn't exist as a directory. + if test "X$additional_includedir" != "X/usr/include"; then + haveit= + if test "X$additional_includedir" = "X/usr/local/include"; then + if test -n "$GCC"; then + case $host_os in + linux* | gnu* | k*bsd*-gnu) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + for x in $CPPFLAGS $INC[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-I$additional_includedir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_includedir"; then + dnl Really add $additional_includedir to $INCNAME. + INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir" + fi + fi + fi + fi + fi + dnl Look for dependencies. + if test -n "$found_la"; then + dnl Read the .la file. It defines the variables + dnl dlname, library_names, old_library, dependency_libs, current, + dnl age, revision, installed, dlopen, dlpreopen, libdir. + save_libdir="$libdir" + case "$found_la" in + */* | *\\*) . "$found_la" ;; + *) . "./$found_la" ;; + esac + libdir="$save_libdir" + dnl We use only dependency_libs. + for dep in $dependency_libs; do + case "$dep" in + -L*) + additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` + dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME. + dnl But don't add it + dnl 1. if it's the standard /usr/lib, + dnl 2. if it's /usr/local/lib and we are using GCC on Linux, + dnl 3. if it's already present in $LDFLAGS or the already + dnl constructed $LIBNAME, + dnl 4. if it doesn't exist as a directory. + if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then + haveit= + if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then + if test -n "$GCC"; then + case $host_os in + linux* | gnu* | k*bsd*-gnu) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + haveit= + for x in $LDFLAGS $LIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + dnl Really add $additional_libdir to $LIBNAME. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir" + fi + fi + haveit= + for x in $LDFLAGS $LTLIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + dnl Really add $additional_libdir to $LTLIBNAME. + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir" + fi + fi + fi + fi + ;; + -R*) + dir=`echo "X$dep" | sed -e 's/^X-R//'` + if test "$enable_rpath" != no; then + dnl Potentially add DIR to rpathdirs. + dnl The rpathdirs will be appended to $LIBNAME at the end. + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $dir" + fi + dnl Potentially add DIR to ltrpathdirs. + dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $dir" + fi + fi + ;; + -l*) + dnl Handle this in the next round. + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` + ;; + *.la) + dnl Handle this in the next round. Throw away the .la's + dnl directory; it is already contained in a preceding -L + dnl option. + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` + ;; + *) + dnl Most likely an immediate library name. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep" + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep" + ;; + esac + done + fi + else + dnl Didn't find the library; assume it is in the system directories + dnl known to the linker and runtime loader. (All the system + dnl directories known to the linker should also be known to the + dnl runtime loader, otherwise the system is severely misconfigured.) + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name" + fi + fi + fi + done + done + if test "X$rpathdirs" != "X"; then + if test -n "$acl_hardcode_libdir_separator"; then + dnl Weird platform: only the last -rpath option counts, the user must + dnl pass all path elements in one option. We can arrange that for a + dnl single library, but not when more than one $LIBNAMEs are used. + alldirs= + for found_dir in $rpathdirs; do + alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" + done + dnl Note: acl_hardcode_libdir_flag_spec uses $libdir and $wl. + acl_save_libdir="$libdir" + libdir="$alldirs" + eval flag=\"$acl_hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" + else + dnl The -rpath options are cumulative. + for found_dir in $rpathdirs; do + acl_save_libdir="$libdir" + libdir="$found_dir" + eval flag=\"$acl_hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" + done + fi + fi + if test "X$ltrpathdirs" != "X"; then + dnl When using libtool, the option that works for both libraries and + dnl executables is -R. The -R options are cumulative. + for found_dir in $ltrpathdirs; do + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir" + done + fi +]) + +dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR, +dnl unless already present in VAR. +dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes +dnl contains two or three consecutive elements that belong together. +AC_DEFUN([AC_LIB_APPENDTOVAR], +[ + for element in [$2]; do + haveit= + for x in $[$1]; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X$element"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + [$1]="${[$1]}${[$1]:+ }$element" + fi + done +]) + +dnl For those cases where a variable contains several -L and -l options +dnl referring to unknown libraries and directories, this macro determines the +dnl necessary additional linker options for the runtime path. +dnl AC_LIB_LINKFLAGS_FROM_LIBS([LDADDVAR], [LIBSVALUE], [USE-LIBTOOL]) +dnl sets LDADDVAR to linker options needed together with LIBSVALUE. +dnl If USE-LIBTOOL evaluates to non-empty, linking with libtool is assumed, +dnl otherwise linking without libtool is assumed. +AC_DEFUN([AC_LIB_LINKFLAGS_FROM_LIBS], +[ + AC_REQUIRE([AC_LIB_RPATH]) + AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) + $1= + if test "$enable_rpath" != no; then + if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then + dnl Use an explicit option to hardcode directories into the resulting + dnl binary. + rpathdirs= + next= + for opt in $2; do + if test -n "$next"; then + dir="$next" + dnl No need to hardcode the standard /usr/lib. + if test "X$dir" != "X/usr/$acl_libdirstem"; then + rpathdirs="$rpathdirs $dir" + fi + next= + else + case $opt in + -L) next=yes ;; + -L*) dir=`echo "X$opt" | sed -e 's,^X-L,,'` + dnl No need to hardcode the standard /usr/lib. + if test "X$dir" != "X/usr/$acl_libdirstem"; then + rpathdirs="$rpathdirs $dir" + fi + next= ;; + *) next= ;; + esac + fi + done + if test "X$rpathdirs" != "X"; then + if test -n ""$3""; then + dnl libtool is used for linking. Use -R options. + for dir in $rpathdirs; do + $1="${$1}${$1:+ }-R$dir" + done + else + dnl The linker is used for linking directly. + if test -n "$acl_hardcode_libdir_separator"; then + dnl Weird platform: only the last -rpath option counts, the user + dnl must pass all path elements in one option. + alldirs= + for dir in $rpathdirs; do + alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$dir" + done + acl_save_libdir="$libdir" + libdir="$alldirs" + eval flag=\"$acl_hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + $1="$flag" + else + dnl The -rpath options are cumulative. + for dir in $rpathdirs; do + acl_save_libdir="$libdir" + libdir="$dir" + eval flag=\"$acl_hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + $1="${$1}${$1:+ }$flag" + done + fi + fi + fi + fi + fi + AC_SUBST([$1]) +]) diff --git a/m4/lib-prefix.m4 b/m4/lib-prefix.m4 new file mode 100644 index 0000000..a8684e1 --- /dev/null +++ b/m4/lib-prefix.m4 @@ -0,0 +1,185 @@ +# lib-prefix.m4 serial 5 (gettext-0.15) +dnl Copyright (C) 2001-2005 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Bruno Haible. + +dnl AC_LIB_ARG_WITH is synonymous to AC_ARG_WITH in autoconf-2.13, and +dnl similar to AC_ARG_WITH in autoconf 2.52...2.57 except that is doesn't +dnl require excessive bracketing. +ifdef([AC_HELP_STRING], +[AC_DEFUN([AC_LIB_ARG_WITH], [AC_ARG_WITH([$1],[[$2]],[$3],[$4])])], +[AC_DEFUN([AC_][LIB_ARG_WITH], [AC_ARG_WITH([$1],[$2],[$3],[$4])])]) + +dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed +dnl to access previously installed libraries. The basic assumption is that +dnl a user will want packages to use other packages he previously installed +dnl with the same --prefix option. +dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate +dnl libraries, but is otherwise very convenient. +AC_DEFUN([AC_LIB_PREFIX], +[ + AC_BEFORE([$0], [AC_LIB_LINKFLAGS]) + AC_REQUIRE([AC_PROG_CC]) + AC_REQUIRE([AC_CANONICAL_HOST]) + AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + dnl By default, look in $includedir and $libdir. + use_additional=yes + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + AC_LIB_ARG_WITH([lib-prefix], +[ --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib + --without-lib-prefix don't search for libraries in includedir and libdir], +[ + if test "X$withval" = "Xno"; then + use_additional=no + else + if test "X$withval" = "X"; then + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + else + additional_includedir="$withval/include" + additional_libdir="$withval/$acl_libdirstem" + fi + fi +]) + if test $use_additional = yes; then + dnl Potentially add $additional_includedir to $CPPFLAGS. + dnl But don't add it + dnl 1. if it's the standard /usr/include, + dnl 2. if it's already present in $CPPFLAGS, + dnl 3. if it's /usr/local/include and we are using GCC on Linux, + dnl 4. if it doesn't exist as a directory. + if test "X$additional_includedir" != "X/usr/include"; then + haveit= + for x in $CPPFLAGS; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-I$additional_includedir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test "X$additional_includedir" = "X/usr/local/include"; then + if test -n "$GCC"; then + case $host_os in + linux* | gnu* | k*bsd*-gnu) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + if test -d "$additional_includedir"; then + dnl Really add $additional_includedir to $CPPFLAGS. + CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir" + fi + fi + fi + fi + dnl Potentially add $additional_libdir to $LDFLAGS. + dnl But don't add it + dnl 1. if it's the standard /usr/lib, + dnl 2. if it's already present in $LDFLAGS, + dnl 3. if it's /usr/local/lib and we are using GCC on Linux, + dnl 4. if it doesn't exist as a directory. + if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then + haveit= + for x in $LDFLAGS; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then + if test -n "$GCC"; then + case $host_os in + linux*) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + dnl Really add $additional_libdir to $LDFLAGS. + LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir" + fi + fi + fi + fi + fi +]) + +dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix, +dnl acl_final_exec_prefix, containing the values to which $prefix and +dnl $exec_prefix will expand at the end of the configure script. +AC_DEFUN([AC_LIB_PREPARE_PREFIX], +[ + dnl Unfortunately, prefix and exec_prefix get only finally determined + dnl at the end of configure. + if test "X$prefix" = "XNONE"; then + acl_final_prefix="$ac_default_prefix" + else + acl_final_prefix="$prefix" + fi + if test "X$exec_prefix" = "XNONE"; then + acl_final_exec_prefix='${prefix}' + else + acl_final_exec_prefix="$exec_prefix" + fi + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" + prefix="$acl_save_prefix" +]) + +dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the +dnl variables prefix and exec_prefix bound to the values they will have +dnl at the end of the configure script. +AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX], +[ + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + $1 + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" +]) + +dnl AC_LIB_PREPARE_MULTILIB creates a variable acl_libdirstem, containing +dnl the basename of the libdir, either "lib" or "lib64". +AC_DEFUN([AC_LIB_PREPARE_MULTILIB], +[ + dnl There is no formal standard regarding lib and lib64. The current + dnl practice is that on a system supporting 32-bit and 64-bit instruction + dnl sets or ABIs, 64-bit libraries go under $prefix/lib64 and 32-bit + dnl libraries go under $prefix/lib. We determine the compiler's default + dnl mode by looking at the compiler's library search path. If at least + dnl of its elements ends in /lib64 or points to a directory whose absolute + dnl pathname ends in /lib64, we assume a 64-bit ABI. Otherwise we use the + dnl default, namely "lib". + acl_libdirstem=lib + searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'` + if test -n "$searchpath"; then + acl_save_IFS="${IFS= }"; IFS=":" + for searchdir in $searchpath; do + if test -d "$searchdir"; then + case "$searchdir" in + */lib64/ | */lib64 ) acl_libdirstem=lib64 ;; + *) searchdir=`cd "$searchdir" && pwd` + case "$searchdir" in + */lib64 ) acl_libdirstem=lib64 ;; + esac ;; + esac + fi + done + IFS="$acl_save_IFS" + fi +]) diff --git a/m4/nls.m4 b/m4/nls.m4 new file mode 100644 index 0000000..7967cc2 --- /dev/null +++ b/m4/nls.m4 @@ -0,0 +1,31 @@ +# nls.m4 serial 3 (gettext-0.15) +dnl Copyright (C) 1995-2003, 2005-2006 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. +dnl +dnl This file can can be used in projects which are not available under +dnl the GNU General Public License or the GNU Library General Public +dnl License but which still want to provide support for the GNU gettext +dnl functionality. +dnl Please note that the actual code of the GNU gettext library is covered +dnl by the GNU Library General Public License, and the rest of the GNU +dnl gettext package package is covered by the GNU General Public License. +dnl They are *not* in the public domain. + +dnl Authors: +dnl Ulrich Drepper , 1995-2000. +dnl Bruno Haible , 2000-2003. + +AC_PREREQ(2.50) + +AC_DEFUN([AM_NLS], +[ + AC_MSG_CHECKING([whether NLS is requested]) + dnl Default is enabled NLS + AC_ARG_ENABLE(nls, + [ --disable-nls do not use Native Language Support], + USE_NLS=$enableval, USE_NLS=yes) + AC_MSG_RESULT($USE_NLS) + AC_SUBST(USE_NLS) +]) diff --git a/m4/orc.m4 b/m4/orc.m4 new file mode 100644 index 0000000..92bf21e --- /dev/null +++ b/m4/orc.m4 @@ -0,0 +1,56 @@ +dnl pkg-config-based checks for Orc + +dnl specific: +dnl ORC_CHECK([REQUIRED_VERSION]) + +AC_DEFUN([ORC_CHECK], +[ + ORC_REQ=ifelse([$1], , "0.4.5", [$1]) + + AC_ARG_ENABLE(orc, + AC_HELP_STRING([--enable-orc],[use Orc if installed]), + [case "${enableval}" in + auto) enable_orc=auto ;; + yes) enable_orc=yes ;; + no) enable_orc=no ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-orc) ;; + esac + ], + [enable_orc=auto]) dnl Default value + + if test "x$enable_orc" != "xno" ; then + PKG_CHECK_MODULES(ORC, orc-0.4 >= $ORC_REQ, [ + AC_DEFINE(HAVE_ORC, 1, [Use Orc]) + ORCC=`$PKG_CONFIG --variable=orcc orc-0.4` + AC_SUBST(ORCC) + HAVE_ORC=yes + ], [ + if test "x$enable_orc" = "xyes" ; then + AC_MSG_ERROR([--enable-orc specified, but Orc >= $ORC_REQ not found]) + fi + AC_DEFINE(DISABLE_ORC, 1, [Disable Orc]) + HAVE_ORC=no + ]) + else + AC_DEFINE(DISABLE_ORC, 1, [Disable Orc]) + HAVE_ORC=no + fi + AM_CONDITIONAL(HAVE_ORC, test "x$HAVE_ORC" = "xyes") + +])) + +AC_DEFUN([ORC_OUTPUT], +[ + if test "$HAVE_ORC" = yes ; then + printf "configure: *** Orc acceleration enabled.\n" + else + if test "x$enable_orc" = "xno" ; then + printf "configure: *** Orc acceleration disabled by --disable-orc. Slower code paths\n" + printf " will be used.\n" + else + printf "configure: *** Orc acceleration disabled. Requires Orc >= $ORC_REQ, which was\n" + printf " not found. Slower code paths will be used.\n" + fi + fi + printf "\n" +]) diff --git a/m4/po.m4 b/m4/po.m4 new file mode 100644 index 0000000..0734762 --- /dev/null +++ b/m4/po.m4 @@ -0,0 +1,449 @@ +# po.m4 serial 15 (gettext-0.17) +dnl Copyright (C) 1995-2007 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. +dnl +dnl This file can can be used in projects which are not available under +dnl the GNU General Public License or the GNU Library General Public +dnl License but which still want to provide support for the GNU gettext +dnl functionality. +dnl Please note that the actual code of the GNU gettext library is covered +dnl by the GNU Library General Public License, and the rest of the GNU +dnl gettext package package is covered by the GNU General Public License. +dnl They are *not* in the public domain. + +dnl Authors: +dnl Ulrich Drepper , 1995-2000. +dnl Bruno Haible , 2000-2003. + +AC_PREREQ(2.50) + +dnl Checks for all prerequisites of the po subdirectory. +AC_DEFUN([AM_PO_SUBDIRS], +[ + AC_REQUIRE([AC_PROG_MAKE_SET])dnl + AC_REQUIRE([AC_PROG_INSTALL])dnl + AC_REQUIRE([AM_PROG_MKDIR_P])dnl defined by automake + AC_REQUIRE([AM_NLS])dnl + + dnl Release version of the gettext macros. This is used to ensure that + dnl the gettext macros and po/Makefile.in.in are in sync. + AC_SUBST([GETTEXT_MACRO_VERSION], [0.17]) + + dnl Perform the following tests also if --disable-nls has been given, + dnl because they are needed for "make dist" to work. + + dnl Search for GNU msgfmt in the PATH. + dnl The first test excludes Solaris msgfmt and early GNU msgfmt versions. + dnl The second test excludes FreeBSD msgfmt. + AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, + [$ac_dir/$ac_word --statistics /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1 && + (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], + :) + AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) + + dnl Test whether it is GNU msgfmt >= 0.15. +changequote(,)dnl + case `$MSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in + '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) MSGFMT_015=: ;; + *) MSGFMT_015=$MSGFMT ;; + esac +changequote([,])dnl + AC_SUBST([MSGFMT_015]) +changequote(,)dnl + case `$GMSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in + '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) GMSGFMT_015=: ;; + *) GMSGFMT_015=$GMSGFMT ;; + esac +changequote([,])dnl + AC_SUBST([GMSGFMT_015]) + + dnl Search for GNU xgettext 0.12 or newer in the PATH. + dnl The first test excludes Solaris xgettext and early GNU xgettext versions. + dnl The second test excludes FreeBSD xgettext. + AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, + [$ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1 && + (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], + :) + dnl Remove leftover from FreeBSD xgettext call. + rm -f messages.po + + dnl Test whether it is GNU xgettext >= 0.15. +changequote(,)dnl + case `$XGETTEXT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in + '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) XGETTEXT_015=: ;; + *) XGETTEXT_015=$XGETTEXT ;; + esac +changequote([,])dnl + AC_SUBST([XGETTEXT_015]) + + dnl Search for GNU msgmerge 0.11 or newer in the PATH. + AM_PATH_PROG_WITH_TEST(MSGMERGE, msgmerge, + [$ac_dir/$ac_word --update -q /dev/null /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1], :) + + dnl Installation directories. + dnl Autoconf >= 2.60 defines localedir. For older versions of autoconf, we + dnl have to define it here, so that it can be used in po/Makefile. + test -n "$localedir" || localedir='${datadir}/locale' + AC_SUBST([localedir]) + + dnl Support for AM_XGETTEXT_OPTION. + test -n "${XGETTEXT_EXTRA_OPTIONS+set}" || XGETTEXT_EXTRA_OPTIONS= + AC_SUBST([XGETTEXT_EXTRA_OPTIONS]) + + AC_CONFIG_COMMANDS([po-directories], [[ + for ac_file in $CONFIG_FILES; do + # Support "outfile[:infile[:infile...]]" + case "$ac_file" in + *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; + esac + # PO directories have a Makefile.in generated from Makefile.in.in. + case "$ac_file" in */Makefile.in) + # Adjust a relative srcdir. + ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` + ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" + ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` + # In autoconf-2.13 it is called $ac_given_srcdir. + # In autoconf-2.50 it is called $srcdir. + test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" + case "$ac_given_srcdir" in + .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; + /*) top_srcdir="$ac_given_srcdir" ;; + *) top_srcdir="$ac_dots$ac_given_srcdir" ;; + esac + # Treat a directory as a PO directory if and only if it has a + # POTFILES.in file. This allows packages to have multiple PO + # directories under different names or in different locations. + if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then + rm -f "$ac_dir/POTFILES" + test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES" + cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES" + POMAKEFILEDEPS="POTFILES.in" + # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend + # on $ac_dir but don't depend on user-specified configuration + # parameters. + if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then + # The LINGUAS file contains the set of available languages. + if test -n "$OBSOLETE_ALL_LINGUAS"; then + test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete" + fi + ALL_LINGUAS_=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"` + # Hide the ALL_LINGUAS assigment from automake < 1.5. + eval 'ALL_LINGUAS''=$ALL_LINGUAS_' + POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS" + else + # The set of available languages was given in configure.in. + # Hide the ALL_LINGUAS assigment from automake < 1.5. + eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS' + fi + # Compute POFILES + # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po) + # Compute UPDATEPOFILES + # as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update) + # Compute DUMMYPOFILES + # as $(foreach lang, $(ALL_LINGUAS), $(lang).nop) + # Compute GMOFILES + # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo) + case "$ac_given_srcdir" in + .) srcdirpre= ;; + *) srcdirpre='$(srcdir)/' ;; + esac + POFILES= + UPDATEPOFILES= + DUMMYPOFILES= + GMOFILES= + for lang in $ALL_LINGUAS; do + POFILES="$POFILES $srcdirpre$lang.po" + UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" + DUMMYPOFILES="$DUMMYPOFILES $lang.nop" + GMOFILES="$GMOFILES $srcdirpre$lang.gmo" + done + # CATALOGS depends on both $ac_dir and the user's LINGUAS + # environment variable. + INST_LINGUAS= + if test -n "$ALL_LINGUAS"; then + for presentlang in $ALL_LINGUAS; do + useit=no + if test "%UNSET%" != "$LINGUAS"; then + desiredlanguages="$LINGUAS" + else + desiredlanguages="$ALL_LINGUAS" + fi + for desiredlang in $desiredlanguages; do + # Use the presentlang catalog if desiredlang is + # a. equal to presentlang, or + # b. a variant of presentlang (because in this case, + # presentlang can be used as a fallback for messages + # which are not translated in the desiredlang catalog). + case "$desiredlang" in + "$presentlang"*) useit=yes;; + esac + done + if test $useit = yes; then + INST_LINGUAS="$INST_LINGUAS $presentlang" + fi + done + fi + CATALOGS= + if test -n "$INST_LINGUAS"; then + for lang in $INST_LINGUAS; do + CATALOGS="$CATALOGS $lang.gmo" + done + fi + test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile" + sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile" + for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do + if test -f "$f"; then + case "$f" in + *.orig | *.bak | *~) ;; + *) cat "$f" >> "$ac_dir/Makefile" ;; + esac + fi + done + fi + ;; + esac + done]], + [# Capture the value of obsolete ALL_LINGUAS because we need it to compute + # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it + # from automake < 1.5. + eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"' + # Capture the value of LINGUAS because we need it to compute CATALOGS. + LINGUAS="${LINGUAS-%UNSET%}" + ]) +]) + +dnl Postprocesses a Makefile in a directory containing PO files. +AC_DEFUN([AM_POSTPROCESS_PO_MAKEFILE], +[ + # When this code is run, in config.status, two variables have already been + # set: + # - OBSOLETE_ALL_LINGUAS is the value of LINGUAS set in configure.in, + # - LINGUAS is the value of the environment variable LINGUAS at configure + # time. + +changequote(,)dnl + # Adjust a relative srcdir. + ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` + ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" + ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` + # In autoconf-2.13 it is called $ac_given_srcdir. + # In autoconf-2.50 it is called $srcdir. + test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" + case "$ac_given_srcdir" in + .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; + /*) top_srcdir="$ac_given_srcdir" ;; + *) top_srcdir="$ac_dots$ac_given_srcdir" ;; + esac + + # Find a way to echo strings without interpreting backslash. + if test "X`(echo '\t') 2>/dev/null`" = 'X\t'; then + gt_echo='echo' + else + if test "X`(printf '%s\n' '\t') 2>/dev/null`" = 'X\t'; then + gt_echo='printf %s\n' + else + echo_func () { + cat < "$ac_file.tmp" + if grep -l '@TCLCATALOGS@' "$ac_file" > /dev/null; then + # Add dependencies that cannot be formulated as a simple suffix rule. + for lang in $ALL_LINGUAS; do + frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'` + cat >> "$ac_file.tmp" < /dev/null; then + # Add dependencies that cannot be formulated as a simple suffix rule. + for lang in $ALL_LINGUAS; do + frobbedlang=`echo $lang | sed -e 's/_/-/g' -e 's/^sr-CS/sr-SP/' -e 's/@latin$/-Latn/' -e 's/@cyrillic$/-Cyrl/' -e 's/^sr-SP$/sr-SP-Latn/' -e 's/^uz-UZ$/uz-UZ-Latn/'` + cat >> "$ac_file.tmp" <> "$ac_file.tmp" <, 1996. + +AC_PREREQ(2.50) + +# Search path for a program which passes the given test. + +dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR, +dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) +AC_DEFUN([AM_PATH_PROG_WITH_TEST], +[ +# Prepare PATH_SEPARATOR. +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + +# Find out how to test for executable files. Don't use a zero-byte file, +# as systems may use methods other than mode bits to determine executability. +cat >conf$$.file <<_ASEOF +#! /bin/sh +exit 0 +_ASEOF +chmod +x conf$$.file +if test -x conf$$.file >/dev/null 2>&1; then + ac_executable_p="test -x" +else + ac_executable_p="test -f" +fi +rm -f conf$$.file + +# Extract the first word of "$2", so it can be a program name with args. +set dummy $2; ac_word=[$]2 +AC_MSG_CHECKING([for $ac_word]) +AC_CACHE_VAL(ac_cv_path_$1, +[case "[$]$1" in + [[\\/]]* | ?:[[\\/]]*) + ac_cv_path_$1="[$]$1" # Let the user override the test with a path. + ;; + *) + ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in ifelse([$5], , $PATH, [$5]); do + IFS="$ac_save_IFS" + test -z "$ac_dir" && ac_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then + echo "$as_me: trying $ac_dir/$ac_word..." >&AS_MESSAGE_LOG_FD + if [$3]; then + ac_cv_path_$1="$ac_dir/$ac_word$ac_exec_ext" + break 2 + fi + fi + done + done + IFS="$ac_save_IFS" +dnl If no 4th arg is given, leave the cache variable unset, +dnl so AC_PATH_PROGS will keep looking. +ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" +])dnl + ;; +esac])dnl +$1="$ac_cv_path_$1" +if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then + AC_MSG_RESULT([$]$1) +else + AC_MSG_RESULT(no) +fi +AC_SUBST($1)dnl +]) diff --git a/m4/tls.m4 b/m4/tls.m4 new file mode 100644 index 0000000..3808f06 --- /dev/null +++ b/m4/tls.m4 @@ -0,0 +1,17 @@ +AC_DEFUN([CC_CHECK_TLS], [ + AC_CACHE_CHECK([whether $CC knows __thread for Thread-Local Storage], + cc_cv_tls___thread, + [AC_COMPILE_IFELSE( + AC_LANG_PROGRAM( + [[static __thread int a = 6;]], + [[a = 5;]]), + [cc_cv_tls___thread=yes], + [cc_cv_tls___thread=no]) + ]) + + AS_IF([test "x$cc_cv_tls___thread" = "xyes"], + [AC_DEFINE([SUPPORT_TLS___THREAD], 1, + [Define this if the compiler supports __thread for Thread-Local Storage]) + $1], + [$2]) +]) diff --git a/man/Makefile.am b/man/Makefile.am new file mode 100644 index 0000000..7793fe7 --- /dev/null +++ b/man/Makefile.am @@ -0,0 +1,90 @@ +# This file is part of PulseAudio. +# +# PulseAudio is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA. + +pulseconfdir=$(sysconfdir)/pulse + +CLEANFILES = \ + $(noinst_DATA) + +noinst_DATA = \ + pulseaudio.1.xml \ + esdcompat.1.xml \ + pax11publish.1.xml \ + paplay.1.xml \ + pacat.1.xml \ + pacmd.1.xml \ + pactl.1.xml \ + pasuspender.1.xml \ + padsp.1.xml \ + pabrowse.1.xml \ + pulse-daemon.conf.5.xml \ + pulse-client.conf.5.xml \ + default.pa.5.xml + +%.xml: %.xml.in Makefile + sed -e 's,@pulseconfdir\@,$(pulseconfdir),g' \ + -e 's,@PACKAGE_BUGREPORT\@,$(PACKAGE_BUGREPORT),g' \ + -e 's,@PACKAGE_URL\@,$(PACKAGE_URL),g' $< > $@ + +xmllint: $(noinst_DATA) + for f in $(noinst_DATA) ; do \ + xmllint --noout --valid "$$f" || exit 1 ; \ + done + +if BUILD_MANPAGES + +dist_man_MANS = \ + pulseaudio.1 \ + esdcompat.1 \ + pax11publish.1 \ + paplay.1 \ + pacat.1 \ + pacmd.1 \ + pactl.1 \ + pasuspender.1 \ + padsp.1 \ + pabrowse.1 \ + pulse-daemon.conf.5 \ + pulse-client.conf.5 \ + default.pa.5 + +CLEANFILES += \ + $(dist_man_MANS) + +%: %.xml Makefile + perl $(srcdir)/xmltoman $< > $@ || rm -f $@ + +endif + +EXTRA_DIST = \ + pulseaudio.1.xml.in \ + esdcompat.1.xml.in \ + pax11publish.1.xml.in \ + paplay.1.xml.in \ + pacat.1.xml.in \ + pacmd.1.xml.in \ + pactl.1.xml.in \ + pasuspender.1.xml.in \ + padsp.1.xml.in \ + pabrowse.1.xml.in \ + pulse-daemon.conf.5.xml.in \ + pulse-client.conf.5.xml.in \ + default.pa.5.xml.in \ + xmltoman \ + xmltoman.css \ + xmltoman.xsl \ + xmltoman.dtd diff --git a/man/default.pa.5.xml.in b/man/default.pa.5.xml.in new file mode 100644 index 0000000..4caad7c --- /dev/null +++ b/man/default.pa.5.xml.in @@ -0,0 +1,56 @@ + + + + + + + + + +

~/.pulse/default.pa

+ +

@pulseconfdir@/default.pa

+
+ + +

The PulseAudio sound server interprets the file + ~/.pulse/default.pa on startup, and when that file + doesn't exist @pulseconfdir@/default.pa. It + should contain directives in the PulseAudio CLI languages, as + documented on .

+ +

The same commands can also be entered during runtime in the tool, allowing flexible runtime reconfiguration.

+
+ +
+

The PulseAudio Developers <@PACKAGE_BUGREPORT@>; + PulseAudio is available from

+
+ +
+

+ , , +

+
+ +
diff --git a/man/esdcompat.1.xml.in b/man/esdcompat.1.xml.in new file mode 100644 index 0000000..61fefa3 --- /dev/null +++ b/man/esdcompat.1.xml.in @@ -0,0 +1,89 @@ + + + + + + + + + + esdcompat [options] + esdcompat --help + esdcompat --version + + + +

esdcompat is a compatiblity script that takes the + same arguments as the ESD sound daemon , but uses them to start a the PulseAudio sound server with the appropriate parameters. It is + required to make PulseAudio a drop-in replacement for esd, i.e. it + can be used to make + start up PulseAudio instead of esd.

+ +

It is recommended to make esd a symbolic link to this script.

+
+ + + + + + + + + + + + + + +
+

The PulseAudio Developers <@PACKAGE_BUGREPORT@>; PulseAudio is available from

+
+ +
+

+ , +

+
+ +
diff --git a/man/pabrowse.1.xml.in b/man/pabrowse.1.xml.in new file mode 100644 index 0000000..33f071b --- /dev/null +++ b/man/pabrowse.1.xml.in @@ -0,0 +1,47 @@ + + + + + + + + + + pabrowse + + + +

pabrowse lists all PulseAudio sound servers on the + local network that are being announced with Zeroconf/Avahi.

+ +

This program takes no command line arguments.

+
+ +
+

The PulseAudio Developers <@PACKAGE_BUGREPORT@>; PulseAudio is available from

+
+ +
+

+ , +

+
+ +
diff --git a/man/pacat.1.xml.in b/man/pacat.1.xml.in new file mode 100644 index 0000000..68a3a12 --- /dev/null +++ b/man/pacat.1.xml.in @@ -0,0 +1,185 @@ + + + + + + + + + + pacat [options] [FILE] + parec [options] [FILE] + paplay --help + paplay --version + + + +

pacat is a simple tool for playing back or + capturing raw audio files on a PulseAudio sound server.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

The PulseAudio Developers <@PACKAGE_BUGREPORT@>; PulseAudio is available from

+
+ +
+

+ , +

+
+ +
diff --git a/man/pacmd.1.xml.in b/man/pacmd.1.xml.in new file mode 100644 index 0000000..c20c016 --- /dev/null +++ b/man/pacmd.1.xml.in @@ -0,0 +1,50 @@ + + + + + + + + + + pacmd + + + +

This tool can be used to introspect or reconfigure a running + PulseAudio sound server during runtime. It connects to the sound + server and offers a simple live shell that can be used to enter + the commands also understood in the default.pa + configuration scripts.

+ +

This program takes no command line options.

+
+ +
+

The PulseAudio Developers <@PACKAGE_BUGREPORT@>; PulseAudio is available from

+
+ +
+

+ , , +

+
+ +
diff --git a/man/pactl.1.xml.in b/man/pactl.1.xml.in new file mode 100644 index 0000000..8d5bf1d --- /dev/null +++ b/man/pactl.1.xml.in @@ -0,0 +1,189 @@ + + + + + + + + + + pactl [options] stat + pactl [options] list + pactl [options] exit + pactl [options] upload-sample FILENAME [NAME] + pactl [options] play-sample NAME [SINK] + pactl [options] remove-sample NAME + pactl [options] move-sink-input ID SINK + pactl [options] move-source-input ID SOURCE + pactl [options] load-module NAME [ARGUMENTS ...] + pactl [options] unload-module ID + pactl [options] suspend-sink [SINK] 1|0 + pactl [options] suspend-source [SOURCE] 1|0 + pactl --help + pactl --version + + + +

pactl can be used to issue control commands to the PulseAudio sound server.

+ +

pactl only exposes a subset of the available operations. For the full set use the .

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

The PulseAudio Developers <@PACKAGE_BUGREPORT@>; PulseAudio is available from

+
+ +
+

+ , +

+
+ +
diff --git a/man/padsp.1.xml.in b/man/padsp.1.xml.in new file mode 100644 index 0000000..9bbe3d1 --- /dev/null +++ b/man/padsp.1.xml.in @@ -0,0 +1,110 @@ + + + + + + + + + + padsp [options] PROGRAM [ARGUMENTS ...] + padsp -h + + + +

padsp starts the specified program and + redirects its access to OSS compatible audio devices + (/dev/dsp and auxiliary devices) to a PulseAudio + sound server.

+ +

padsp uses the $LD_PRELOAD environment variable + that is interpreted by and thus + does not work for SUID binaries and statically built + executables.

+ +

Equivalent to using padsp is starting an + application with $LD_PRELOAD set to + libpulsedsp.so

+
+ + + + + + + + + + + + + + + + + + + + + + +
+

The PulseAudio Developers <@PACKAGE_BUGREPORT@>; PulseAudio is available from

+
+ +
+

+ , , +

+
+ +
diff --git a/man/paplay.1.xml.in b/man/paplay.1.xml.in new file mode 100644 index 0000000..843b172 --- /dev/null +++ b/man/paplay.1.xml.in @@ -0,0 +1,127 @@ + + + + + + + + + + paplay [options] FILE + paplay --help + paplay --version + + + +

paplay is a simple tool for playing back audio + files on a PulseAudio sound server. It understands all audio file + formats supported by libsndfile.

+
+ + + + + + + + + + + + + + + + + + + + + + + +
+ +

Due to a limitation in libsndfile + paplay currently does not always set the correct channel + mapping for playback of multichannel (i.e. surround) audio files, even if the channel mapping information is + available in the audio file.

+ +
+ +
+

The PulseAudio Developers <@PACKAGE_BUGREPORT@>; PulseAudio is available from

+
+ +
+

+ , +

+
+ +
diff --git a/man/pasuspender.1.xml.in b/man/pasuspender.1.xml.in new file mode 100644 index 0000000..52deae6 --- /dev/null +++ b/man/pasuspender.1.xml.in @@ -0,0 +1,80 @@ + + + + + + + + + + pasuspender [options] -- PROGRAM [ARGUMENTS ...] + pasuspender --help + pasuspender --version + + + +

pasuspender is a tool that can be used to tell a + local PulseAudio sound server to temporarily suspend access to the + audio devices, to allow other + applications access them directly. pasuspender will + suspend access to the audio devices, fork a child process, and + when the child process terminates, resume access again.

+ +

Make sure to include -- in + your pasuspender command line before passing the + subprocess command line (as shown + above). Otherwise pasuspender itself might end up + interpreting the command line switches and options you intended to + pass to the subprocess.

+
+ + + + + + + + + + + +
+

The PulseAudio Developers <@PACKAGE_BUGREPORT@>; PulseAudio is available from

+
+ +
+

+ , , , +

+
+ +
diff --git a/man/pax11publish.1.xml.in b/man/pax11publish.1.xml.in new file mode 100644 index 0000000..3b40b97 --- /dev/null +++ b/man/pax11publish.1.xml.in @@ -0,0 +1,151 @@ + + + + + + + + + + pax11publish -h + pax11publish [options] [-d] + pax11publish [options] -e + pax11publish [options] -i + pax11publish [options] -r + + + +

The pax11publish utility can be used to dump or + manipulate the PulseAudio server credentials that can be stored as + properties on the X11 root window.

+ +

Please note that the loadable module + module-x11-publish exports the same information + directly from the PulseAudio sound server, and should in most + cases be used in preference over this tool.

+ +

Use the following command to dump the raw + PulseAudio-specific data that is stored in your X11 root + window:

+ +

xprop -root | grep ^PULSE_

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
+

The PulseAudio Developers <@PACKAGE_BUGREPORT@>; PulseAudio is available from

+
+ +
+

+ , +

+
+ +
diff --git a/man/pulse-client.conf.5.xml.in b/man/pulse-client.conf.5.xml.in new file mode 100644 index 0000000..46cc845 --- /dev/null +++ b/man/pulse-client.conf.5.xml.in @@ -0,0 +1,122 @@ + + + + + + + + + +

~/.pulse/client.conf

+ +

@pulseconfdir@/client.conf

+
+ + +

The PulseAudio client library reads configuration directives from + a file ~/.pulse/client.conf on startup and when that + file doesn't exist from + @pulseconfdir@/client.conf.

+ +

The configuration file is a simple collection of variable + declarations. If the configuration file parser encounters either ; + or # it ignores the rest of the line until its end.

+ +

For the settings that take a boolean argument the values + true, yes, on and 1 + are equivalent, resp. false, no, + off, 0.

+ +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+

The PulseAudio Developers <@PACKAGE_BUGREPORT@>; + PulseAudio is available from

+
+ +
+

+ , +

+
+ +
diff --git a/man/pulse-daemon.conf.5.xml.in b/man/pulse-daemon.conf.5.xml.in new file mode 100644 index 0000000..e6b1e19 --- /dev/null +++ b/man/pulse-daemon.conf.5.xml.in @@ -0,0 +1,450 @@ + + + + + + + + + +

~/.pulse/daemon.conf

+ +

@pulseconfdir@/daemon.conf

+
+ + +

The PulseAudio sound server reads configuration directives from + a file ~/.pulse/daemon.conf on startup and when that + file doesn't exist from + @pulseconfdir@/daemon.conf. Please note that the + server also reads a configuration script on startup + default.pa which also contains runtime configuration + directives.

+ +

The configuration file is a simple collection of variable + declarations. If the configuration file parser encounters either ; + or # it ignores the rest of the line until its end.

+ +

For the settings that take a boolean argument the values + true, yes, on and 1 + are equivalent, resp. false, no, + off, 0.

+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + + + + +
+ +
+ + + + + + + + + + + +
+ +
+ +

See for + more information. Set to -1 if PulseAudio shall not touch the resource + limit. Not all resource limits are available on all operating + systems.

+ + + + + + + + + + + + + + + + + +
+ +
+ +

Most drivers try to open the audio device with these settings + and then fall back to lower settings. The default settings are CD + quality: 16bit native endian, 2 channels, 44100 Hz sampling.

+ + + + + + + + + +
+ +
+ +

Some hardware drivers require the hardware playback buffer to + be subdivided into several fragments. It is possible to change + these buffer metrics for machines with high scheduling + latencies. Not all possible values that may be configured here are + available in all hardware. The driver will to find the nearest + setting supported. Modern drivers that support timer-based + scheduling ignore these options.

+ + + + +
+ +
+

The PulseAudio Developers <@PACKAGE_BUGREPORT@>; PulseAudio is available from

+
+ +
+

+ , , , +

+
+ +
diff --git a/man/pulseaudio.1.xml.in b/man/pulseaudio.1.xml.in new file mode 100644 index 0000000..8810e90 --- /dev/null +++ b/man/pulseaudio.1.xml.in @@ -0,0 +1,457 @@ + + + + + + + + + + pulseaudio [options] + pulseaudio --help + pulseaudio --version + pulseaudio --dump-conf + pulseaudio --dump-modules + pulseaudio --dump-resample-methods + pulseaudio --cleanup-shm + pulseaudio --start + pulseaudio --kill + pulseaudio --check + + + +

PulseAudio is a networked low-latency sound server for Linux, POSIX and Windows systems.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +

~/.pulse/daemon.conf, + @pulseconfdir@/daemon.conf: configuration settings + for the PulseAudio daemon. If the version in the user's home + directory does not exist the global configuration file is + loaded. See for + more information.

+ +

~/.pulse/default.pa, + @pulseconfdir@/default.pa: the default configuration + script to execute when the PulseAudio daemon is started. If the + version in the user's home directory does not exist the global + configuration script is loaded. See for more information.

+ +

~/.pulse/client.conf, + @pulseconfdir@/client.conf: configuration settings + for PulseAudio client applications. If the version in the user's + home directory does not exist the global configuration file is + loaded. See for + more information.

+ +
+ +
+ +

SIGINT, SIGTERM: the PulseAudio daemon will shut + down (Same as --kill).

+ +

SIGHUP: dump a long status report to STDOUT or + syslog, depending on the configuration.

+ +

SIGUSR1: load module-cli, allowing runtime + reconfiguration via STDIN/STDOUT.

+ +

SIGUSR2: load module-cli-protocol-unix, allowing + runtime reconfiguration via a AF_UNIX socket. See for more information.

+ +
+ +
+ +

Group pulse-rt: if the PulseAudio binary is marked + SUID root, then membership of the calling user in this group + decides whether real-time and/or high-priority scheduling is + enabled. Please note that enabling real-time scheduling is a + security risk (see below).

+ +

Group pulse-access: if PulseAudio is running as a system + daemon (see --system above) access is granted to + members of this group when they connect via AF_UNIX sockets. If + PulseAudio is running as a user daemon this group has no + meaning.

+ +

User pulse, group pulse: if PulseAudio is running as a system + daemon (see --system above) and is started as root the + daemon will drop priviliges and become a normal user process using + this user and group. If PulseAudio is running as a user daemon + this user and group has no meaning.

+
+ +
+

To minimize the risk of drop-outs during playback it is + recommended to run PulseAudio with real-time scheduling if the + underlying platform supports it. This decouples the scheduling + latency of the PulseAudio daemon from the system load and is thus + the best way to make sure that PulseAudio always gets CPU time + when it needs it to refill the hardware playback + buffers. Unfortunately this is a security risk on most systems, + since PulseAudio runs as user process, and giving realtime + scheduling priviliges to a user process always comes with the risk + that the user misuses it to lock up the system -- which is + possible since making a process real-time effectively disables + preemption.

+ +

To minimize the risk PulseAudio by default does not enable + real-time scheduling. It is however recommended to enable it + on trusted systems. To do that start PulseAudio with + --realtime (see above) or enabled the appropriate option in + daemon.conf. Since acquiring realtime scheduling is a + priviliged operation on most systems, some special changes to the + system configuration need to be made to allow them to the calling + user. Two options are available:

+ +

On newer Linux systems the system resource limit RLIMIT_RTPRIO + (see for more information) + can be used to allow specific users to acquire real-time + scheduling. This can be configured in + /etc/security/limits.conf, a resource limit of 9 is recommended.

+ +

Alternatively, the SUID root bit can be set for the PulseAudio + binary. Then, the daemon will drop root priviliges immediately on + startup, however retain the CAP_NICE capability (on systems that + support it), but only if the calling user is a member of the + pulse-rt group (see above). For all other users all + capababilities are dropped immediately. The advantage of this + solution is that the real-time priviliges are only granted to the + PulseAudio daemon -- not to all the user's processes.

+ +

Alternatively, if the risk of locking up the machine is + considered too big to enable real-time scheduling, high-priority + scheduling can be enabled instead (i.e. negative nice level). This + can be enabled by passing --high-priority (see above) + when starting PulseAudio and may also be enabled with the + approriate option in daemon.conf. Negative nice + levels can only be enabled when the appropriate resource limit + RLIMIT_NICE is set (see for + more information), possibly configured in + /etc/security/limits.conf. A resource limit of 31 + (corresponding with nice level -11) is recommended.

+
+ +
+ +

The PulseAudio client libraries check for the existance of the + following environment variables and change their local configuration accordingly:

+ +

$PULSE_SERVER: the server string specifying the server to connect to when a client asks for a sound server connection and doesn't explicitly ask for a specific server.

+ +

$PULSE_SINK: the symbolic name of the sink to connect to when a client creates a playback stream and doesn't explicitly ask for a specific sink.

+ +

$PULSE_SOURCE: the symbolic name of the source to connect to when a client creates a record stream and doesn't explicitly ask for a specific source.

+ +

$PULSE_BINARY: path of PulseAudio executable to run when server auto-spawning is used.

+ +

$PULSE_CLIENTCONFIG: path of file that shall be read instead of client.conf (see above) for client configuration.

+ +

These environment settings take precedence -- if set -- over the configuration settings from client.conf (see above).

+ +
+ +
+

The PulseAudio Developers <@PACKAGE_BUGREPORT@>; PulseAudio is available from

+
+ +
+

+ , , , +

+
+ +
diff --git a/man/xmltoman b/man/xmltoman new file mode 100755 index 0000000..6a7489a --- /dev/null +++ b/man/xmltoman @@ -0,0 +1,217 @@ +#!/usr/bin/perl -w + +# xmltoman - simple xml to man converter +# Copyright (C) 2000-2002 Oliver Kurth +# 2003 Lennart Poettering +# +# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +use XML::Parser; + +my $buffer = ""; +my $break_req = 0; + +my @stack; +my $stack_n = 0; + +my $para = 0; + +sub out { + my $t = shift; + + if ($t ne "") { + print $t; + $break_req=1; + } +} + +sub out_buf { + local $_; + + my $space = shift; + + $_ = $buffer; + $buffer = ""; + + s/\n/\ /gm; + s/\s+/\ /gm; + s/^\s*//gm if (!$break_req); + s/^\s$//gm if (!$space); + + out($_); +} + +sub stack_push { + my $a = shift; + + if ($stack_n == 0 or $a ne $stack[$stack_n-1]) { + out("\\fB") if $a =~ /^bold$/; + out("\\fI") if $a =~ /^italic$/; + } + + $stack[$stack_n++] = $a; +} + +sub stack_pop { + local $_; + + if ($stack_n > 0) { + $stack_n--; + + if ($stack_n > 0) { + $a = $stack[$stack_n-1]; + out("\\fB") if $a =~ /^bold$/; + out("\\fI") if $a =~ /^italic$/; + } else { + out("\\f1"); + } + } +} + +sub handle_start { + local $_; + my $expat = shift; + my $element = shift; + my %attr = @_; + + $_ = $element; + + if (/^manpage$/) { + out_buf(0); + print "\n" if ($break_req); + print ".TH " . $attr{name} . " " . $attr{section} . " User Manuals\n"; + print ".SH NAME\n"; + print $attr{name} . " \\- " . $attr{desc} . "\n"; + $break_req = 0; + } elsif (/^synopsis$/) { + out_buf(0); + print "\n" if ($break_req); + print ".SH SYNOPSIS\n"; + $section = $element; + $break_req = 0; + stack_push("bold"); + } elsif (/^description$/) { + out_buf(0); + print "\n" if ($break_req); + print ".SH DESCRIPTION\n"; + $section = $element; + $break_req = 0; + } elsif (/^options$/) { + out_buf(0); + print "\n" if ($break_req); + print ".SH OPTIONS\n"; + $section = $element; + $break_req = 0; + } elsif (/^seealso$/) { + out_buf(0); + print "\n" if ($break_req); + print ".SH SEE ALSO\n"; + $section = $element; + $break_req = 0; + } elsif (/^section$/) { + out_buf(0); + print "\n" if ($break_req); + print ".SH ".uc($attr{name})."\n"; + $section = $attr{name}; + $break_req = 0; + } elsif (/^option$/) { + out_buf(0); + print "\n" if ($break_req); + print ".TP\n"; + $break_req = 0; + } elsif (/^p$/ or /^cmd$/) { + out_buf(0); + print "\n" if ($para); + $break_req = 0; + } elsif (/^optdesc$/) { + out_buf(0); + $break_req = 0; + } elsif (/^arg$/ or /^file$/) { + out_buf(1); + stack_push("italic"); + } elsif (/^opt$/) { + out_buf(1); + stack_push("bold"); + } elsif (/^manref$/) { + out_buf(1); + stack_push("bold"); + out($attr{name} ."(" . $attr{section} . ")"); + stack_pop(); + } elsif (/^url$/) { + out_buf(1); + stack_push("bold"); + out($attr{href}); + stack_pop(); + }; + + $para = 0; +} + +sub handle_end { + local $_; + my $expat = shift; + my $element = shift; + + $_ = $element; + + $para = 0; + + if (/^description$/ or /^options$/ or /^section$/ or /^seealso$/) { + out_buf(0); + } elsif (/^p$/ or /^cmd$/) { + out_buf(0); + print "\n" if ($break_req); + $para = 1; + $break_req = 0; + } elsif (/^synopsis$/) { + out_buf(0); + stack_pop(); + } elsif (/^opt$/ or /^arg$/ or /^file$/) { + out_buf(1); + stack_pop(); + } elsif (/^manpage$/) { + out_buf(0); + print "\n" if $break_req; + $break_req = 0; + } elsif (/^optdesc$/ or /^cmd$/ or /^option$/) { + # Simply ignore + } else { + out_buf(1); + } +}; + +sub handle_char { + local $_; + my $expat = shift; + my $string = shift; + + $buffer .= $string; +} + +MAIN:{ + my $file = shift; + + if (!$file) { + print STDERR "You need to specify a file to parse\n"; + exit(1); + } + + my $parser = new XML::Parser(Handlers => { + Start => \&handle_start, + End => \&handle_end, + Char => \&handle_char}); + + $parser->parsefile($file, ProtocolEncoding => 'ISO-8859-1'); +} diff --git a/man/xmltoman.css b/man/xmltoman.css new file mode 100644 index 0000000..113aeec --- /dev/null +++ b/man/xmltoman.css @@ -0,0 +1,28 @@ +/*** + This file is part of PulseAudio. + + PulseAudio 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. + + PulseAudio 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 PulseAudio; if not, write to the Free Software Foundation, + Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. +***/ + +body { color: black; background-color: white; } +a:link, a:visited { color: #900000; } +h1 { text-transform:uppercase; font-size: 18pt; } +p { margin-left:1cm; margin-right:1cm; } +.cmd { font-family:monospace; } +.file { font-family:monospace; } +.arg { text-transform:uppercase; font-family:monospace; font-style: italic; } +.opt { font-family:monospace; font-weight: bold; } +.manref { font-family:monospace; } +.option .optdesc { margin-left:2cm; } diff --git a/man/xmltoman.dtd b/man/xmltoman.dtd new file mode 100644 index 0000000..4760638 --- /dev/null +++ b/man/xmltoman.dtd @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/man/xmltoman.xsl b/man/xmltoman.xsl new file mode 100644 index 0000000..766ab25 --- /dev/null +++ b/man/xmltoman.xsl @@ -0,0 +1,127 @@ + + + + + + + + + + + + + <xsl:value-of select="@name"/>(<xsl:value-of select="@section"/>) + + + +

Name

+

+ - +

+ + + +
+ + +

+ +

+
+ + +

+ +

+
+ + + + + + + + + + + + + + +
+ +
+
+ + +

Synopsis

+ +
+ + +

Synopsis

+ +
+ + +

Description

+ +
+ + +

Options

+ +
+ + +

+ +
+ + +
+
+ + + + + () + + + () + + + + + + + + +
diff --git a/packaging/pulseaudio.spec b/packaging/pulseaudio.spec new file mode 100644 index 0000000..d73e5a9 --- /dev/null +++ b/packaging/pulseaudio.spec @@ -0,0 +1,309 @@ +%define pulseversion 0.9.21 + +Name: pulseaudio +Summary: Improved Linux sound server +Version: 0.9.21 +Release: 1 +Group: Multimedia/PulseAudio +License: LGPLv2+ +URL: http://pulseaudio.org +Source0: http://0pointer.de/lennart/projects/pulseaudio/pulseaudio-%{version}.tar.gz +Requires: udev +Requires(post): /sbin/ldconfig +Requires(postun): /sbin/ldconfig +BuildRequires: pkgconfig(pmapi) +BuildRequires: pkgconfig(sysman) +BuildRequires: pkgconfig(speexdsp) +BuildRequires: pkgconfig(xextproto) +BuildRequires: pkgconfig(inputproto) +BuildRequires: pkgconfig(x11) +BuildRequires: pkgconfig(ice) +BuildRequires: pkgconfig(sm) +BuildRequires: pkgconfig(xtst) +BuildRequires: pkgconfig(sndfile) +BuildRequires: pkgconfig(alsa) +BuildRequires: pkgconfig(glib-2.0) +BuildRequires: pkgconfig(gconf-2.0) +BuildRequires: pkgconfig(bluez) +BuildRequires: pkgconfig(xi) +BuildRequires: pkgconfig(libudev) +BuildRequires: pkgconfig(dlog) +BuildRequires: m4 +BuildRequires: libtool-ltdl-devel +BuildRequires: libtool +BuildRequires: intltool +BuildRequires: fdupes + + +%description +PulseAudio is a sound server for Linux and other Unix like operating +systems. It is intended to be an improved drop-in replacement for the +Enlightened Sound Daemon (ESOUND). + +%package libs +Summary: PulseAudio client libraries +Group: Multimedia/PulseAudio +Requires: %{name} = %{version}-%{release} +Requires: /bin/sed + +%description libs +Client libraries used by applications that access a PulseAudio sound server +via PulseAudio's native interface. + + +%package libs-devel +Summary: PulseAudio client development headers and libraries +Group: Development/Libraries +Requires: %{name} = %{version}-%{release} + +%description libs-devel +Headers and libraries for developing applications that access a PulseAudio + sound server via PulseAudio's native interface + + +%package utils +Summary: Command line tools for the PulseAudio sound server +Group: Multimedia/PulseAudio +Requires: %{name} = %{version}-%{release} +Requires: /bin/sed + +%description utils +These tools provide command line access to various features of the +PulseAudio sound server. Included tools are: + pabrowse - Browse available PulseAudio servers on the local network. + paplay - Playback a WAV file via a PulseAudio sink. + pacat - Cat raw audio data to a PulseAudio sink. + parec - Cat raw audio data from a PulseAudio source. + pacmd - Connect to PulseAudio's built-in command line control interface. + pactl - Send a control command to a PulseAudio server. + padsp - /dev/dsp wrapper to transparently support OSS applications. + pax11publish - Store/retrieve PulseAudio default server/sink/source + settings in the X11 root window. + + +%package module-bluetooth +Summary: Bluetooth module for PulseAudio sound server +Group: Multimedia/PulseAudio +Requires: %{name} = %{version}-%{release} +Requires: /bin/sed + +%description module-bluetooth +This module enables PulseAudio to work with bluetooth devices, like headset + or audio gatewa + +%package module-x11 +Summary: PulseAudio components needed for starting x11 User session +Group: Multimedia/PulseAudio +Requires: %{name} = %{version}-%{release} +Requires: /bin/sed + +%description module-x11 +Description: %{summary} + +%prep +%setup -q + + +%build +unset LD_AS_NEEDED +export LDFLAGS+="-Wl,--no-as-needed" +%reconfigure --disable-static --enable-alsa --disable-ipv6 --disable-oss-output --disable-oss-wrapper --enable-dlog --enable-bluez --disable-hal --disable-hal-compat +make %{?jobs:-j%jobs} + +%install +rm -rf %{buildroot} +%make_install + + +install -D -m0755 pulseaudio.sh.in %{buildroot}%{_sysconfdir}/rc.d/init.d/pulseaudio.sh + +pushd %{buildroot}/opt/etc/pulse +ln -sf filter_8000_44100.dat filter_11025_44100.dat +ln -sf filter_8000_44100.dat filter_12000_44100.dat +ln -sf filter_8000_44100.dat filter_16000_44100.dat +ln -sf filter_8000_44100.dat filter_22050_44100.dat +ln -sf filter_8000_44100.dat filter_24000_44100.dat +ln -sf filter_8000_44100.dat filter_32000_44100.dat +popd + +rm -rf %{buildroot}/etc/xdg/autostart/pulseaudio-kde.desktop +rm -rf %{buildroot}/usr/bin/start-pulseaudio-kde +rm -rf %{buildroot}/%{_libdir}/pulse-%{pulseversion}/modules/module-device-manager.so + +%find_lang pulseaudio +%fdupes %{buildroot}/%{_datadir} +%fdupes %{buildroot}/%{_includedir} + + + +%post +/sbin/ldconfig +ln -s /etc/rc.d/init.d/pulseaudio.sh /etc/rc.d/rc3.d/S40puleaudio +ln -s /etc/rc.d/init.d/pulseaudio.sh /etc/rc.d/rc4.d/S40puleaudio + +%postun +/sbin/ldconfig +rm -f %{_sysconfdir}/rc.d/rc3.d/S40puleaudio +rm -f %{_sysconfdir}/rc.d/rc4.d/S40puleaudio + +%post libs -p /sbin/ldconfig + +%postun libs -p /sbin/ldconfig + + +%post module-bluetooth -p /sbin/ldconfig +%postun module-bluetooth -p /sbin/ldconfig + + +%docs_package + +%lang_package + + +%files +%defattr(-,root,root,-) +%doc LICENSE GPL LGPL +/opt/etc/pulse/*.dat + + +%dir %{_sysconfdir}/pulse/ +%config(noreplace) %{_sysconfdir}/pulse/daemon.conf +%config(noreplace) %{_sysconfdir}/pulse/default.pa +%config(noreplace) %{_sysconfdir}/pulse/system.pa +%{_sysconfdir}/rc.d/init.d/pulseaudio.sh +%{_bindir}/esdcompat +%{_bindir}/pulseaudio +%dir %{_libexecdir}/pulse +%{_libexecdir}/pulse/* +%{_libdir}/libpulsecore-%{pulseversion}.so +%{_libdir}/libpulse-mainloop-glib.so.* +/lib/udev/rules.d/90-pulseaudio.rules +%{_datadir}/pulseaudio/alsa-mixer/paths/* +%{_datadir}/pulseaudio/alsa-mixer/profile-sets/* +%{_bindir}/pamon +%config %{_sysconfdir}/xdg/autostart/pulseaudio.desktop +/etc/dbus-1/system.d/pulseaudio-system.conf +#list all modules +%{_libdir}/pulse-%{pulseversion}/modules/libalsa-util.so +%{_libdir}/pulse-%{pulseversion}/modules/libcli.so +%{_libdir}/pulse-%{pulseversion}/modules/libprotocol-cli.so +%{_libdir}/pulse-%{pulseversion}/modules/libprotocol-http.so +%{_libdir}/pulse-%{pulseversion}/modules/libprotocol-native.so +%{_libdir}/pulse-%{pulseversion}/modules/libprotocol-simple.so +%{_libdir}/pulse-%{pulseversion}/modules/librtp.so +%{_libdir}/pulse-%{pulseversion}/modules/module-alsa-sink.so +%{_libdir}/pulse-%{pulseversion}/modules/module-alsa-source.so +%{_libdir}/pulse-%{pulseversion}/modules/module-always-sink.so +%{_libdir}/pulse-%{pulseversion}/modules/module-console-kit.so +%{_libdir}/pulse-%{pulseversion}/modules/module-device-restore.so +%{_libdir}/pulse-%{pulseversion}/modules/module-stream-restore.so +%{_libdir}/pulse-%{pulseversion}/modules/module-cli-protocol-tcp.so +%{_libdir}/pulse-%{pulseversion}/modules/module-cli-protocol-unix.so +%{_libdir}/pulse-%{pulseversion}/modules/module-cli.so +%{_libdir}/pulse-%{pulseversion}/modules/module-combine.so +%{_libdir}/pulse-%{pulseversion}/modules/module-default-device-restore.so +%{_libdir}/pulse-%{pulseversion}/modules/module-detect.so +%{_libdir}/pulse-%{pulseversion}/modules/module-esound-sink.so +%{_libdir}/pulse-%{pulseversion}/modules/module-http-protocol-tcp.so +%{_libdir}/pulse-%{pulseversion}/modules/module-http-protocol-unix.so +%{_libdir}/pulse-%{pulseversion}/modules/module-intended-roles.so +%{_libdir}/pulse-%{pulseversion}/modules/module-ladspa-sink.so +%{_libdir}/pulse-%{pulseversion}/modules/module-match.so +%{_libdir}/pulse-%{pulseversion}/modules/module-mmkbd-evdev.so +%{_libdir}/pulse-%{pulseversion}/modules/module-native-protocol-fd.so +%{_libdir}/pulse-%{pulseversion}/modules/module-native-protocol-tcp.so +%{_libdir}/pulse-%{pulseversion}/modules/module-native-protocol-unix.so +%{_libdir}/pulse-%{pulseversion}/modules/module-null-sink.so +%{_libdir}/pulse-%{pulseversion}/modules/module-pipe-sink.so +%{_libdir}/pulse-%{pulseversion}/modules/module-pipe-source.so +%{_libdir}/pulse-%{pulseversion}/modules/module-position-event-sounds.so +%{_libdir}/pulse-%{pulseversion}/modules/module-remap-sink.so +%{_libdir}/pulse-%{pulseversion}/modules/module-rescue-streams.so +%{_libdir}/pulse-%{pulseversion}/modules/module-rtp-recv.so +%{_libdir}/pulse-%{pulseversion}/modules/module-rtp-send.so +%{_libdir}/pulse-%{pulseversion}/modules/module-simple-protocol-tcp.so +%{_libdir}/pulse-%{pulseversion}/modules/module-simple-protocol-unix.so +%{_libdir}/pulse-%{pulseversion}/modules/module-sine.so +%{_libdir}/pulse-%{pulseversion}/modules/module-tunnel-sink.so +%{_libdir}/pulse-%{pulseversion}/modules/module-tunnel-source.so +%{_libdir}/pulse-%{pulseversion}/modules/module-suspend-on-idle.so +%{_libdir}/pulse-%{pulseversion}/modules/module-volume-restore.so +%{_libdir}/pulse-%{pulseversion}/modules/module-alsa-card.so +%{_libdir}/pulse-%{pulseversion}/modules/module-augment-properties.so +%{_libdir}/pulse-%{pulseversion}/modules/module-card-restore.so +%{_libdir}/pulse-%{pulseversion}/modules/module-cork-music-on-phone.so +%{_libdir}/pulse-%{pulseversion}/modules/module-sine-source.so +%{_libdir}/pulse-%{pulseversion}/modules/module-loopback.so +%{_libdir}/pulse-%{pulseversion}/modules/module-rygel-media-server.so +%{_libdir}/pulse-%{pulseversion}/modules/module-policy.so +%{_libdir}/pulse-%{pulseversion}/modules/module-echo-cancel.so +%{_libdir}/pulse-%{pulseversion}/modules/module-virtual-sink.so +%{_libdir}/pulse-%{pulseversion}/modules/module-virtual-source.so +%{_libdir}/pulse-%{pulseversion}/modules/libprotocol-esound.so +%{_libdir}/pulse-%{pulseversion}/modules/module-esound-compat-spawnfd.so +%{_libdir}/pulse-%{pulseversion}/modules/module-esound-compat-spawnpid.so +%{_libdir}/pulse-%{pulseversion}/modules/module-esound-protocol-tcp.so +%{_libdir}/pulse-%{pulseversion}/modules/module-esound-protocol-unix.so +%{_libdir}/pulse-%{pulseversion}/modules/module-gconf.so +%{_libdir}/pulse-%{pulseversion}/modules/module-udev-detect.so + + +%files libs +%defattr(-,root,root,-) +#%doc %{_mandir}/man1/pax11publish.1.gz +%config(noreplace) %{_sysconfdir}/pulse/client.conf +%{_libdir}/libpulse.so.* +%{_libdir}/libpulse-simple.so.* +%{_libdir}/libpulsecommon-*.so + +%files libs-devel +%defattr(-,root,root,-) +%{_includedir}/pulse/* +#%{_includedir}/pulse-modules-headers/pulsecore/ +%{_libdir}/libpulse.so +%{_libdir}/libpulse-simple.so +%{_libdir}/pkgconfig/libpulse-simple.pc +%{_libdir}/pkgconfig/libpulse.pc +%{_datadir}/vala/vapi/libpulse.vapi +%{_libdir}/pkgconfig/libpulse-mainloop-glib.pc +%{_libdir}/libpulse-mainloop-glib.so + +%files utils +%defattr(-,root,root,-) +%doc %{_mandir}/man1/pabrowse.1.gz +%doc %{_mandir}/man1/pacat.1.gz +%doc %{_mandir}/man1/pacmd.1.gz +%doc %{_mandir}/man1/pactl.1.gz +#%doc %{_mandir}/man1/padsp.1.gz +%doc %{_mandir}/man1/paplay.1.gz +%doc %{_mandir}/man1/pasuspender.1.gz +%{_bindir}/pacat +%{_bindir}/pacmd +%{_bindir}/pactl +#%{_bindir}/padsp +%{_bindir}/paplay +%{_bindir}/parec +%{_bindir}/pamon +%{_bindir}/parecord +%{_bindir}/pasuspender + +%files module-bluetooth +%defattr(-,root,root,-) +%{_libdir}/pulse-%{pulseversion}/modules/module-bluetooth-proximity.so +%{_libdir}/pulse-%{pulseversion}/modules/module-bluetooth-device.so +%{_libdir}/pulse-%{pulseversion}/modules/module-bluetooth-discover.so +%{_libdir}/pulse-%{pulseversion}/modules/libbluetooth-ipc.so +%{_libdir}/pulse-%{pulseversion}/modules/libbluetooth-sbc.so +%{_libdir}/pulse-%{pulseversion}/modules/libbluetooth-util.so +#%{_libdir}/pulseaudio/pulse/proximity-helper + +%files module-x11 +%defattr(-,root,root,-) +%doc %{_mandir}/man1/pax11publish.1.gz +%{_bindir}/start-pulseaudio-x11 +%{_bindir}/pax11publish +%{_libdir}/pulse-%{pulseversion}/modules/module-x11-bell.so +%{_libdir}/pulse-%{pulseversion}/modules/module-x11-publish.so +%{_libdir}/pulse-%{pulseversion}/modules/module-x11-xsmp.so +%{_libdir}/pulse-%{pulseversion}/modules/module-x11-cork-request.so + diff --git a/po/ChangeLog b/po/ChangeLog new file mode 100644 index 0000000..c7f1a63 --- /dev/null +++ b/po/ChangeLog @@ -0,0 +1,702 @@ +2010-02-11 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2010-02-10 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2010-02-10 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2010-02-10 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2010-02-10 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2010-02-10 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2010-02-10 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2010-02-10 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2010-02-10 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2010-02-10 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + * Rules-quot: New file, from gettext-0.17. + * boldquot.sed: New file, from gettext-0.17. + * en@boldquot.header: New file, from gettext-0.17. + * en@quot.header: New file, from gettext-0.17. + * insert-header.sin: New file, from gettext-0.17. + * quot.sed: New file, from gettext-0.17. + * remove-potcdate.sin: New file, from gettext-0.17. + +2009-11-23 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-11-23 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-11-21 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-11-18 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-11-18 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-11-15 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-11-15 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-11-15 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-11-11 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-11-11 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-11-11 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-11-05 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-11-05 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-10-31 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-10-31 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-10-30 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-10-29 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-10-28 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-10-07 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-09-30 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-09-29 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-09-29 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-09-19 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-09-11 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-09-11 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-09-11 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-09-10 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-09-10 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-09-10 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-09-09 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-09-09 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-09-08 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-09-08 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-09-07 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-09-03 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-08-29 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-08-24 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-08-24 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-08-24 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-08-23 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-08-22 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-08-21 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-08-19 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-08-19 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-08-19 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-08-19 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-08-19 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-08-17 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-08-16 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-08-16 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-08-16 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-08-15 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-08-15 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-08-15 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-08-11 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-08-11 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-08-11 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-08-11 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-08-11 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-08-11 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-08-11 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-08-11 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-08-11 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-08-11 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-08-11 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-08-11 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-08-11 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-08-10 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-08-10 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-08-08 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-08-08 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-08-07 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-08-06 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-08-05 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-07-31 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-07-30 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-07-28 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-07-28 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-07-24 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-07-23 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-07-23 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-07-02 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-07-02 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-06-29 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-06-23 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-06-23 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-06-23 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-06-23 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-06-23 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-06-23 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-06-23 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-06-23 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-06-23 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-06-23 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-06-23 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-06-23 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-06-23 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-06-23 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-06-23 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-06-23 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-06-23 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-06-23 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-06-23 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-06-23 gettextize + + * Makefile.in.in: New file, from gettext-0.17. + +2009-06-23 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-06-22 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-06-22 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-06-22 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-06-19 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-06-19 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-06-19 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-06-18 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-06-17 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-06-17 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-06-17 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-06-17 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-06-10 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-06-06 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-06-06 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-05-28 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-05-28 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-05-28 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-05-25 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-05-21 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-05-21 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-05-16 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-05-16 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-05-14 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-05-14 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-05-14 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-05-14 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-05-14 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-05-14 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-05-14 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-05-11 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-05-11 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-05-07 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-04-28 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-04-28 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-04-24 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-04-19 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-04-14 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-04-10 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-04-10 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-04-01 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-04-01 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-03-31 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-03-31 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-03-05 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-03-05 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-03-05 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-03-05 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-03-05 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-03-05 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-03-05 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-03-03 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-03-03 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-03-03 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-03-02 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-03-02 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-02-24 gettextize + + * Makefile.in.in: Upgrade to gettext-0.17. + +2009-02-24 gettextize + + * Makefile.in.in: New file, from gettext-0.17. + * boldquot.sed: New file, from gettext-0.17. + * en@boldquot.header: New file, from gettext-0.17. + * en@quot.header: New file, from gettext-0.17. + * insert-header.sin: New file, from gettext-0.17. + * quot.sed: New file, from gettext-0.17. + * remove-potcdate.sin: New file, from gettext-0.17. + * Rules-quot: New file, from gettext-0.17. + diff --git a/po/LINGUAS b/po/LINGUAS new file mode 100644 index 0000000..363599e --- /dev/null +++ b/po/LINGUAS @@ -0,0 +1,31 @@ +as +bn_IN +ca +cs +de +de_CH +el +es +fi +fr +gu +hi +hu +it +ja +kn +ml +mr +nl +or +pa +pl +pt +pt_BR +sr +sr@latin +sv +ta +te +uk +zh_CN diff --git a/po/Makefile.in.in b/po/Makefile.in.in new file mode 100644 index 0000000..cc8a222 --- /dev/null +++ b/po/Makefile.in.in @@ -0,0 +1,217 @@ +# Makefile for program source directory in GNU NLS utilities package. +# Copyright (C) 1995, 1996, 1997 by Ulrich Drepper +# Copyright (C) 2004-2008 Rodney Dawes +# +# This file may be copied and used freely without restrictions. It may +# be used in projects which are not available under a GNU Public License, +# but which still want to provide support for the GNU gettext functionality. +# +# - Modified by Owen Taylor to use GETTEXT_PACKAGE +# instead of PACKAGE and to look for po2tbl in ./ not in intl/ +# +# - Modified by jacob berkman to install +# Makefile.in.in and po2tbl.sed.in for use with glib-gettextize +# +# - Modified by Rodney Dawes for use with intltool +# +# We have the following line for use by intltoolize: +# INTLTOOL_MAKEFILE + +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +PACKAGE = @PACKAGE@ +VERSION = @VERSION@ + +SHELL = @SHELL@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +top_builddir = @top_builddir@ +VPATH = @srcdir@ + +prefix = @prefix@ +exec_prefix = @exec_prefix@ +datadir = @datadir@ +datarootdir = @datarootdir@ +libdir = @libdir@ +DATADIRNAME = @DATADIRNAME@ +itlocaledir = $(prefix)/$(DATADIRNAME)/locale +subdir = po +install_sh = @install_sh@ +# Automake >= 1.8 provides @mkdir_p@. +# Until it can be supposed, use the safe fallback: +mkdir_p = $(install_sh) -d + +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ + +GMSGFMT = @GMSGFMT@ +MSGFMT = @MSGFMT@ +XGETTEXT = @XGETTEXT@ +INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ +INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ +MSGMERGE = INTLTOOL_EXTRACT=$(INTLTOOL_EXTRACT) srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --dist +GENPOT = INTLTOOL_EXTRACT=$(INTLTOOL_EXTRACT) srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --pot + +ALL_LINGUAS = @ALL_LINGUAS@ + +PO_LINGUAS=$(shell if test -r $(srcdir)/LINGUAS; then grep -v "^\#" $(srcdir)/LINGUAS; else echo "$(ALL_LINGUAS)"; fi) + +USER_LINGUAS=$(shell if test -n "$(LINGUAS)"; then LLINGUAS="$(LINGUAS)"; ALINGUAS="$(ALL_LINGUAS)"; for lang in $$LLINGUAS; do if test -n "`grep \^$$lang$$ $(srcdir)/LINGUAS 2>/dev/null`" -o -n "`echo $$ALINGUAS|tr ' ' '\n'|grep \^$$lang$$`"; then printf "$$lang "; fi; done; fi) + +USE_LINGUAS=$(shell if test -n "$(USER_LINGUAS)" -o -n "$(LINGUAS)"; then LLINGUAS="$(USER_LINGUAS)"; else if test -n "$(PO_LINGUAS)"; then LLINGUAS="$(PO_LINGUAS)"; else LLINGUAS="$(ALL_LINGUAS)"; fi; fi; for lang in $$LLINGUAS; do printf "$$lang "; done) + +POFILES=$(shell LINGUAS="$(PO_LINGUAS)"; for lang in $$LINGUAS; do printf "$$lang.po "; done) + +DISTFILES = Makefile.in.in POTFILES.in $(POFILES) +EXTRA_DISTFILES = ChangeLog POTFILES.skip Makevars LINGUAS + +POTFILES = \ +# This comment gets stripped out + +CATALOGS=$(shell LINGUAS="$(USE_LINGUAS)"; for lang in $$LINGUAS; do printf "$$lang.gmo "; done) + +.SUFFIXES: +.SUFFIXES: .po .pox .gmo .mo .msg .cat + +.po.pox: + $(MAKE) $(GETTEXT_PACKAGE).pot + $(MSGMERGE) $< $(GETTEXT_PACKAGE).pot -o $*.pox + +.po.mo: + $(MSGFMT) -o $@ $< + +.po.gmo: + file=`echo $* | sed 's,.*/,,'`.gmo \ + && rm -f $$file && $(GMSGFMT) -o $$file $< + +.po.cat: + sed -f ../intl/po2msg.sed < $< > $*.msg \ + && rm -f $@ && gencat $@ $*.msg + + +all: all-@USE_NLS@ + +all-yes: $(CATALOGS) +all-no: + +$(GETTEXT_PACKAGE).pot: $(POTFILES) + $(GENPOT) + +install: install-data +install-data: install-data-@USE_NLS@ +install-data-no: all +install-data-yes: all + linguas="$(USE_LINGUAS)"; \ + for lang in $$linguas; do \ + dir=$(DESTDIR)$(itlocaledir)/$$lang/LC_MESSAGES; \ + $(mkdir_p) $$dir; \ + if test -r $$lang.gmo; then \ + $(INSTALL_DATA) $$lang.gmo $$dir/$(GETTEXT_PACKAGE).mo; \ + echo "installing $$lang.gmo as $$dir/$(GETTEXT_PACKAGE).mo"; \ + else \ + $(INSTALL_DATA) $(srcdir)/$$lang.gmo $$dir/$(GETTEXT_PACKAGE).mo; \ + echo "installing $(srcdir)/$$lang.gmo as" \ + "$$dir/$(GETTEXT_PACKAGE).mo"; \ + fi; \ + if test -r $$lang.gmo.m; then \ + $(INSTALL_DATA) $$lang.gmo.m $$dir/$(GETTEXT_PACKAGE).mo.m; \ + echo "installing $$lang.gmo.m as $$dir/$(GETTEXT_PACKAGE).mo.m"; \ + else \ + if test -r $(srcdir)/$$lang.gmo.m ; then \ + $(INSTALL_DATA) $(srcdir)/$$lang.gmo.m \ + $$dir/$(GETTEXT_PACKAGE).mo.m; \ + echo "installing $(srcdir)/$$lang.gmo.m as" \ + "$$dir/$(GETTEXT_PACKAGE).mo.m"; \ + else \ + true; \ + fi; \ + fi; \ + done + +# Empty stubs to satisfy archaic automake needs +dvi info ctags tags CTAGS TAGS ID: + +# Define this as empty until I found a useful application. +install-exec installcheck: + +uninstall: + linguas="$(USE_LINGUAS)"; \ + for lang in $$linguas; do \ + rm -f $(DESTDIR)$(itlocaledir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo; \ + rm -f $(DESTDIR)$(itlocaledir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo.m; \ + done + +check: all $(GETTEXT_PACKAGE).pot + rm -f missing notexist + srcdir=$(srcdir) $(INTLTOOL_UPDATE) -m + if [ -r missing -o -r notexist ]; then \ + exit 1; \ + fi + +mostlyclean: + rm -f *.pox $(GETTEXT_PACKAGE).pot *.old.po cat-id-tbl.tmp + rm -f .intltool-merge-cache + +clean: mostlyclean + +distclean: clean + rm -f Makefile Makefile.in POTFILES stamp-it + rm -f *.mo *.msg *.cat *.cat.m *.gmo + +maintainer-clean: distclean + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + rm -f Makefile.in.in + +distdir = ../$(PACKAGE)-$(VERSION)/$(subdir) +dist distdir: $(DISTFILES) + dists="$(DISTFILES)"; \ + extra_dists="$(EXTRA_DISTFILES)"; \ + for file in $$extra_dists; do \ + test -f $(srcdir)/$$file && dists="$$dists $(srcdir)/$$file"; \ + done; \ + for file in $$dists; do \ + test -f $$file || file="$(srcdir)/$$file"; \ + ln $$file $(distdir) 2> /dev/null \ + || cp -p $$file $(distdir); \ + done + +update-po: Makefile + $(MAKE) $(GETTEXT_PACKAGE).pot + tmpdir=`pwd`; \ + linguas="$(USE_LINGUAS)"; \ + for lang in $$linguas; do \ + echo "$$lang:"; \ + result="`$(MSGMERGE) -o $$tmpdir/$$lang.new.po $$lang`"; \ + if $$result; then \ + if cmp $(srcdir)/$$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ + rm -f $$tmpdir/$$lang.new.po; \ + else \ + if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ + :; \ + else \ + echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ + rm -f $$tmpdir/$$lang.new.po; \ + exit 1; \ + fi; \ + fi; \ + else \ + echo "msgmerge for $$lang.gmo failed!"; \ + rm -f $$tmpdir/$$lang.new.po; \ + fi; \ + done + +Makefile POTFILES: stamp-it + @if test ! -f $@; then \ + rm -f stamp-it; \ + $(MAKE) stamp-it; \ + fi + +stamp-it: Makefile.in.in $(top_builddir)/config.status POTFILES.in + cd $(top_builddir) \ + && CONFIG_FILES=$(subdir)/Makefile.in CONFIG_HEADERS= CONFIG_LINKS= \ + $(SHELL) ./config.status + +# Tell versions [3.59,3.63) of GNU make not to export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/po/POTFILES.in b/po/POTFILES.in new file mode 100644 index 0000000..0bf7087 --- /dev/null +++ b/po/POTFILES.in @@ -0,0 +1,196 @@ +src/modules/module-rescue-streams.c +src/modules/module-tunnel.c +src/modules/module-native-protocol-fd.c +src/modules/module-zeroconf-discover.c +src/modules/alsa/module-alsa-source.c +src/modules/module-device-restore.c +src/modules/module-match.c +src/pulsecore/dbus-util.c +src/modules/module-console-kit.c +src/modules/oss/module-oss.c +src/modules/oss/oss-util.c +src/modules/module-mmkbd-evdev.c +src/modules/module-position-event-sounds.c +src/modules/alsa/alsa-util.c +src/modules/module-pipe-source.c +src/modules/module-solaris.c +src/modules/module-default-device-restore.c +src/modules/x11/module-x11-xsmp.c +src/modules/module-remap-sink.c +src/modules/bluetooth/module-bluetooth-proximity.c +src/modules/module-detect.c +src/modules/module-always-sink.c +src/modules/module-lirc.c +src/modules/module-hal-detect.c +src/modules/module-sine.c +src/modules/module-zeroconf-publish.c +src/modules/jack/module-jack-source.c +src/modules/module-cli.c +src/modules/gconf/module-gconf.c +src/modules/gconf/gconf-helper.c +src/modules/module-esound-sink.c +src/modules/alsa/module-alsa-sink.c +src/modules/module-volume-restore.c +src/modules/x11/module-x11-bell.c +src/modules/module-protocol-stub.c +src/modules/module-stream-restore.c +src/modules/jack/module-jack-sink.c +src/modules/module-esound-compat-spawnfd.c +src/modules/module-esound-compat-spawnpid.c +#src/modules/module-waveout.c +src/modules/module-combine.c +src/modules/bluetooth/proximity-helper.c +src/modules/x11/module-x11-publish.c +src/modules/rtp/module-rtp-recv.c +src/modules/rtp/sdp.c +src/modules/rtp/rtp.c +src/modules/rtp/sap.c +src/modules/rtp/module-rtp-send.c +src/modules/module-ladspa-sink.c +src/modules/module-suspend-on-idle.c +src/modules/module-pipe-sink.c +src/modules/module-null-sink.c +src/pulsecore/memblock.c +src/pulsecore/queue.c +src/pulsecore/core.c +#src/pulsecore/shmasyncq.c +src/pulsecore/x11wrap.c +src/pulsecore/ioline.c +src/pulsecore/asyncq.c +src/pulsecore/mutex-posix.c +src/pulsecore/protocol-esound.c +src/pulsecore/proplist-util.c +src/pulsecore/pstream.c +src/pulsecore/cli-command.c +src/pulsecore/ltdl-helper.c +src/pulsecore/ipacl.c +src/pulsecore/sample-util.c +src/pulsecore/log.c +src/pulsecore/auth-cookie.c +src/pulsecore/protocol-cli.c +src/pulsecore/resampler.c +src/pulsecore/pdispatch.c +src/pulsecore/hook-list.c +src/pulsecore/conf-parser.c +src/pulsecore/mcalign.c +src/pulsecore/core-subscribe.c +src/pulsecore/protocol-native.c +src/pulsecore/source-output.c +src/pulsecore/modargs.c +src/pulsecore/core-scache.c +src/pulsecore/iochannel.c +src/pulsecore/shared.c +src/pulsecore/socket-client.c +src/pulsecore/idxset.c +src/pulsecore/pipe.c +src/pulsecore/asyncmsgq.c +src/pulsecore/inet_pton.c +src/pulsecore/socket-util.c +src/pulsecore/object.c +src/pulsecore/sioman.c +src/pulsecore/sink-input.c +src/pulsecore/x11prop.c +src/pulsecore/sconv-s16be.c +src/pulsecore/thread-posix.c +src/pulsecore/client.c +src/pulsecore/inet_ntop.c +src/pulsecore/strlist.c +src/pulsecore/msgobject.c +src/pulsecore/mutex-win32.c +src/pulsecore/dynarray.c +src/pulsecore/once.c +src/pulsecore/source.c +src/pulsecore/memchunk.c +src/pulsecore/protocol-simple.c +src/pulsecore/sink.c +src/pulsecore/sconv-s16le.c +src/pulsecore/sconv.c +src/pulsecore/core-error.c +src/pulsecore/strbuf.c +src/pulsecore/play-memblockq.c +src/pulsecore/dllmain.c +src/pulsecore/envelope.c +src/pulsecore/pid.c +src/pulsecore/thread-mq.c +src/pulsecore/shm.c +src/pulsecore/play-memchunk.c +src/pulsecore/hashmap.c +src/pulsecore/avahi-wrap.c +src/pulsecore/authkey.c +src/pulsecore/namereg.c +src/pulsecore/poll.c +src/pulsecore/tokenizer.c +src/pulsecore/semaphore-posix.c +src/pulsecore/cli-text.c +src/pulsecore/g711.c +src/pulsecore/core-util.c +src/pulsecore/thread-win32.c +src/pulsecore/tagstruct.c +src/pulsecore/socket-server.c +src/pulsecore/flist.c +src/pulsecore/fdsem.c +src/pulsecore/random.c +src/pulsecore/modinfo.c +src/pulsecore/start-child.c +src/pulsecore/packet.c +src/pulsecore/pstream-util.c +src/pulsecore/rtpoll.c +src/pulsecore/sound-file.c +src/pulsecore/module.c +src/pulsecore/ffmpeg/resample2.c +src/pulsecore/cli.c +src/pulsecore/time-smoother.c +src/pulsecore/parseaddr.c +src/pulsecore/sound-file-stream.c +src/pulsecore/memblockq.c +src/pulsecore/protocol-http.c +src/pulsecore/semaphore-win32.c +src/daemon/cpulimit.c +src/daemon/ltdl-bind-now.c +src/daemon/main.c +src/daemon/cmdline.c +src/daemon/dumpmodules.c +src/daemon/daemon-conf.c +src/daemon/caps.c +src/daemon/pulseaudio.desktop.in +src/pulse/channelmap.c +src/pulse/error.c +src/pulse/proplist.c +src/pulse/xmalloc.c +src/pulse/ext-stream-restore.c +src/pulse/stream.c +src/pulse/i18n.c +src/pulse/util.c +src/pulse/utf8.c +src/pulse/mainloop-api.c +src/pulse/sample.c +src/pulse/client-conf-x11.c +src/pulse/client-conf.c +src/pulse/browser.c +src/pulse/volume.c +src/pulse/simple.c +src/pulse/subscribe.c +src/pulse/introspect.c +src/pulse/mainloop.c +src/pulse/mainloop-signal.c +src/pulse/operation.c +src/pulse/context.c +src/pulse/thread-mainloop.c +src/pulse/scache.c +src/pulse/glib-mainloop.c +src/pulse/timeval.c +src/utils/pacat.c +src/utils/pasuspender.c +src/utils/pabrowse.c +src/utils/pactl.c +src/utils/padsp.c +src/utils/pax11publish.c +src/utils/pacmd.c +src/pulsecore/lock-autospawn.c +src/modules/alsa/alsa-sink.c +src/modules/alsa/alsa-source.c +src/modules/alsa/module-alsa-card.c +src/modules/bluetooth/module-bluetooth-device.c +src/modules/reserve-wrap.c +src/modules/module-rygel-media-server.c +src/modules/alsa/alsa-mixer.c diff --git a/po/POTFILES.skip b/po/POTFILES.skip new file mode 100644 index 0000000..4622d2f --- /dev/null +++ b/po/POTFILES.skip @@ -0,0 +1 @@ +src/pulsecore/atomic.h diff --git a/po/as.po b/po/as.po new file mode 100644 index 0000000..f7b2dee --- /dev/null +++ b/po/as.po @@ -0,0 +1,2571 @@ +# translation of pulseaudio.master-tx.as.po to Assamese +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Amitakhya Phukan , 2009. +msgid "" +msgstr "" +"Project-Id-Version: pulseaudio.master-tx.as\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-09-29 23:47+0200\n" +"PO-Revision-Date: 2009-09-08 21:04+0530\n" +"Last-Translator: Amitakhya Phukan \n" +"Language-Team: Assamese\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +#: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629 +#, c-format +msgid "%s %s" +msgstr "%s %s" + +#: ../src/modules/alsa/alsa-util.c:1106 +#, c-format +msgid "" +"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu " +"ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_avail() এ এটা বৰ ডাঙৰ মান ঘূৰালে: %lu bytes (%lu ms) ।\n" +"অতি সম্ভৱ এইটো ALSA চালক '%s' ৰ এটা বাগ । অনুগ্ৰহ কৰি এই সমস্যা ALSA বিকাশকক " +"জনাওক ।" + +#: ../src/modules/alsa/alsa-util.c:1147 +#, c-format +msgid "" +"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%" +"lu ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_delay() এ এটা বৰ ডাঙৰ মান ঘূৰালে: %li bytes (%s%lu ms) ।\n" +"অতি সম্ভৱ এইটো ALSA চালক '%s' ৰ এটা বাগ । অনুগ্ৰহ কৰি এই সমস্যা ALSA বিকাশকক " +"জনাওক ।" + +#: ../src/modules/alsa/alsa-util.c:1194 +#, c-format +msgid "" +"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes " +"(%lu ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_mmap_begin() এ এটা বৰ ডাঙৰ মান ঘূৰালে: %lu bytes (%lu ms) ।\n" +"অতি সম্ভৱ এইটো ALSA চালক '%s' ৰ এটা বাগ । অনুগ্ৰহ কৰি এই সমস্যা ALSA বিকাশকক " +"জনাওক ।" + +#: ../src/modules/module-always-sink.c:39 +msgid "Always keeps at least one sink loaded even if it's a null one" +msgstr "" + +#: ../src/modules/module-always-sink.c:83 +msgid "Dummy Output" +msgstr "" + +#: ../src/modules/module-ladspa-sink.c:49 +msgid "Virtual LADSPA sink" +msgstr "ভার্চুয়াল LADSPA sink" + +#: ../src/modules/module-ladspa-sink.c:53 +msgid "" +"sink_name= sink_properties= " +"master= format= rate= " +"channels= channel_map= plugin= label= control=" +msgstr "" +"sink_name= sink_properties= " +"master= format= rate= " +"channels= channel_map= plugin= label= control=" + +#: ../src/modules/module-null-sink.c:55 +msgid "Clocked NULL sink" +msgstr "" + +#: ../src/modules/module-null-sink.c:291 +msgid "Null Output" +msgstr "" + +#: ../src/pulsecore/sink.c:2613 +msgid "Internal Audio" +msgstr "আভ্যন্তৰীণ অ'ডিঅ'" + +#: ../src/pulsecore/sink.c:2618 +msgid "Modem" +msgstr "মোডেম" + +#: ../src/daemon/ltdl-bind-now.c:124 +msgid "Failed to find original lt_dlopen loader." +msgstr "প্ৰাথমিক lt_dlopen loader পোৱা ন'গ'ল ।" + +#: ../src/daemon/ltdl-bind-now.c:129 +msgid "Failed to allocate new dl loader." +msgstr "নতুন dl loader বিতৰণ কৰিবলৈ বিফল ।" + +#: ../src/daemon/ltdl-bind-now.c:142 +msgid "Failed to add bind-now-loader." +msgstr "bind-now-loader যোগ কৰিবলৈ বিফল ।" + +#: ../src/daemon/main.c:141 +#, c-format +msgid "Got signal %s." +msgstr "চিগ্নেল %s পোৱা গ'ল ।" + +#: ../src/daemon/main.c:168 +msgid "Exiting." +msgstr "প্ৰস্থান কৰা হৈছে ।" + +#: ../src/daemon/main.c:186 +#, c-format +msgid "Failed to find user '%s'." +msgstr "ব্যৱহাৰকৰ্তা '%s' পোৱা ন'গ'ল ।" + +#: ../src/daemon/main.c:191 +#, c-format +msgid "Failed to find group '%s'." +msgstr "'%s' সমষ্টি পোৱা ন'গ'ল ।" + +#: ../src/daemon/main.c:195 +#, c-format +msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)." +msgstr "ব্যৱহাৰকৰ্তা '%s' (UID %lu) আৰু সমষ্টি '%s' (GID %lu) পোৱা গ'ল ।" + +#: ../src/daemon/main.c:200 +#, c-format +msgid "GID of user '%s' and of group '%s' don't match." +msgstr "ব্যৱহাৰকৰ্তা '%s' আৰু সমষ্টি '%s' ৰ GID অমিল ।" + +#: ../src/daemon/main.c:205 +#, c-format +msgid "Home directory of user '%s' is not '%s', ignoring." +msgstr "ব্যৱহাৰকৰ্তা '%s' ৰ ঘৰৰ পঞ্জিকা '%s' নহয়, আওকাণ কৰা হৈছে ।" + +#: ../src/daemon/main.c:208 ../src/daemon/main.c:213 +#, c-format +msgid "Failed to create '%s': %s" +msgstr "'%s' সৃষ্টি কৰিবলৈ বিফল: %s" + +#: ../src/daemon/main.c:220 +#, c-format +msgid "Failed to change group list: %s" +msgstr "সমষ্টিৰ তালিকা সলনি কৰিবলৈ ব্যৰ্থ: %s" + +#: ../src/daemon/main.c:236 +#, c-format +msgid "Failed to change GID: %s" +msgstr "GID সলনি কৰিবলৈ ব্যৰ্থ: %s" + +#: ../src/daemon/main.c:252 +#, c-format +msgid "Failed to change UID: %s" +msgstr "UID সলনি কৰিবলৈ ব্যৰ্থ: %s" + +#: ../src/daemon/main.c:271 +msgid "Successfully dropped root privileges." +msgstr "ৰূটৰ অধিকাৰ সফলভাবে এৰোৱা গ'ল ।" + +#: ../src/daemon/main.c:279 +msgid "System wide mode unsupported on this platform." +msgstr "এই স্থাপত্যত প্ৰণালী ব্যাপক মোড অসমৰ্থিত ।" + +#: ../src/daemon/main.c:297 +#, c-format +msgid "setrlimit(%s, (%u, %u)) failed: %s" +msgstr "setrlimit(%s, (%u, %u)) বিফল: %s" + +#: ../src/daemon/main.c:474 +msgid "Failed to parse command line." +msgstr "আদেশ শাৰী বিশ্লেষণ কৰিবলৈ বিফল ।" + +#: ../src/daemon/main.c:541 +msgid "Daemon not running" +msgstr "ডেমন নাই চলা" + +#: ../src/daemon/main.c:543 +#, c-format +msgid "Daemon running as PID %u" +msgstr "PID %u ৰূপে ডেমন চলিছে" + +#: ../src/daemon/main.c:553 +#, c-format +msgid "Failed to kill daemon: %s" +msgstr "ডেমন kill কৰিবলৈ ব্যৰ্থ: %s" + +#: ../src/daemon/main.c:571 +msgid "" +"This program is not intended to be run as root (unless --system is " +"specified)." +msgstr "" +"root পৰিচয়ে এই প্ৰোগ্ৰাম সঞ্চালিত হোৱা উচিত নহয় (ন'হ'লে --system উল্লিখিত হয়) ।" + +#: ../src/daemon/main.c:573 +msgid "Root privileges required." +msgstr "Root-ৰ অধিকাৰ আৱশ্যক ।" + +#: ../src/daemon/main.c:578 +msgid "--start not supported for system instances." +msgstr "প্ৰণালী চানেকিৰ ক্ষেত্ৰত --start সমৰ্থিত নহয় ।" + +#: ../src/daemon/main.c:583 +msgid "Running in system mode, but --disallow-exit not set!" +msgstr "প্ৰণালী মোডত চলিছে, কিন্তু --disallow-exit নিৰ্ধাৰিত নহয়!" + +#: ../src/daemon/main.c:586 +msgid "Running in system mode, but --disallow-module-loading not set!" +msgstr "প্ৰণালী মোডত চলিছে, কিন্তু --disallow-module-loading নিৰ্ধাৰিত নহয়!" + +#: ../src/daemon/main.c:589 +msgid "Running in system mode, forcibly disabling SHM mode!" +msgstr "প্ৰণালী মোডত চলিছে, SHM মোড বলপূৰ্বক নিষ্ক্ৰিয় কৰা হৈছে!" + +#: ../src/daemon/main.c:594 +msgid "Running in system mode, forcibly disabling exit idle time!" +msgstr "" +"প্ৰণালী মোডত চলিছে, কাম নকৰা সময়ৰ পৰা প্ৰস্থান কৰা বলপূৰ্বক নিষ্ক্ৰিয় কৰা হৈছে!" + +#: ../src/daemon/main.c:621 +msgid "Failed to acquire stdio." +msgstr "stdio প্ৰাপ্ত কৰিবলৈ ব্যৰ্থ ।" + +#: ../src/daemon/main.c:627 +#, c-format +msgid "pipe failed: %s" +msgstr "pipe বিফল: %s" + +#: ../src/daemon/main.c:632 +#, c-format +msgid "fork() failed: %s" +msgstr "fork() বিফল: %s" + +#: ../src/daemon/main.c:646 ../src/utils/pacat.c:508 +#, c-format +msgid "read() failed: %s" +msgstr "read() বিফল: %s" + +#: ../src/daemon/main.c:652 +msgid "Daemon startup failed." +msgstr "ডেমন আৰম্ভ কৰিবলৈ বিফল ।" + +#: ../src/daemon/main.c:654 +msgid "Daemon startup successful." +msgstr "সফলতাৰে ডেমন আৰম্ভ কৰা হৈছে ।" + +#: ../src/daemon/main.c:731 +#, c-format +msgid "This is PulseAudio %s" +msgstr "এইটো PulseAudio %s" + +#: ../src/daemon/main.c:732 +#, c-format +msgid "Compilation host: %s" +msgstr "সঙ্কলনৰ গৃহস্থ: %s" + +#: ../src/daemon/main.c:733 +#, c-format +msgid "Compilation CFLAGS: %s" +msgstr "সঙ্কলনৰ CFLAGS: %s" + +#: ../src/daemon/main.c:736 +#, c-format +msgid "Running on host: %s" +msgstr "গৃহস্থত চলোৱা হৈছে: %s" + +#: ../src/daemon/main.c:739 +#, c-format +msgid "Found %u CPUs." +msgstr "%u CPU পোৱা গৈছে ।" + +#: ../src/daemon/main.c:741 +#, c-format +msgid "Page size is %lu bytes" +msgstr "পেজৰ মাপ %lu bytes" + +#: ../src/daemon/main.c:744 +msgid "Compiled with Valgrind support: yes" +msgstr "Valgrind সমৰ্থনৰ সৈতে সঙ্কলন কৰা হৈছে: হয়" + +#: ../src/daemon/main.c:746 +msgid "Compiled with Valgrind support: no" +msgstr "Valgrind সমৰ্থনৰ সৈতে সঙ্কলন কৰা হৈছে: নহয়" + +#: ../src/daemon/main.c:749 +#, c-format +msgid "Running in valgrind mode: %s" +msgstr "valgrind মোডত চলিছে: %s" + +#: ../src/daemon/main.c:752 +msgid "Optimized build: yes" +msgstr "Optimized build: হয়" + +#: ../src/daemon/main.c:754 +msgid "Optimized build: no" +msgstr "Optimized build: নহয়" + +#: ../src/daemon/main.c:758 +msgid "NDEBUG defined, all asserts disabled." +msgstr "NDEBUG ব্যাখ্যা কৰা হৈছে, সকলো asserts নিষ্ক্ৰিয় কৰা হৈছে ।" + +#: ../src/daemon/main.c:760 +msgid "FASTPATH defined, only fast path asserts disabled." +msgstr "FASTPATH ব্যাখ্যা কৰা হৈছে, অকল fast path asserts নিষ্ক্ৰিয় কৰা হৈছে ।" + +#: ../src/daemon/main.c:762 +msgid "All asserts enabled." +msgstr "সকলো asserts সক্ৰিয় কৰা হৈছে ।" + +#: ../src/daemon/main.c:766 +msgid "Failed to get machine ID" +msgstr "যন্ত্ৰ ID প্ৰাপ্ত কৰিবলৈ ব্যৰ্থ" + +#: ../src/daemon/main.c:769 +#, c-format +msgid "Machine ID is %s." +msgstr "যন্ত্ৰ ID হ'ল %s ।" + +#: ../src/daemon/main.c:773 +#, c-format +msgid "Session ID is %s." +msgstr "সেশান ID হল %s।" + +#: ../src/daemon/main.c:779 +#, c-format +msgid "Using runtime directory %s." +msgstr "ৰান-টাইম পঞ্জিকা %s ব্যৱহাৰ কৰা হৈছে ।" + +#: ../src/daemon/main.c:784 +#, c-format +msgid "Using state directory %s." +msgstr "অৱস্থাসূচক পঞ্জিকা %s ব্যৱহাৰ কৰা হৈছে ।" + +#: ../src/daemon/main.c:787 +#, c-format +msgid "Using modules directory %s." +msgstr "মডিউল ডিরেক্টরি %s ব্যবহার করা হচ্ছে।" + +#: ../src/daemon/main.c:789 +#, c-format +msgid "Running in system mode: %s" +msgstr "প্ৰণালী মোডত চলিছে: %s" + +#: ../src/daemon/main.c:792 +msgid "" +"OK, so you are running PA in system mode. Please note that you most likely " +"shouldn't be doing that.\n" +"If you do it nonetheless then it's your own fault if things don't work as " +"expected.\n" +"Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an " +"explanation why system mode is usually a bad idea." +msgstr "" +"আপনি সিস্টেম মোডে PA সঞ্চালিত করছেন এবং এটি না করাই বাঞ্ছনীয়।\n" +"এর ফলে প্রত্যাশামত ফলাফল না পাওয়ার সম্ভাবনা রয়েছে।\n" +"সিস্টেম মোডে ব্যবহারের সমস্যা সম্পর্কে জানতে হলে http://pulseaudio.org/wiki/" +"WhatIsWrongWithSystemMode দেখুন।" + +#: ../src/daemon/main.c:809 +msgid "pa_pid_file_create() failed." +msgstr "pa_pid_file_create() ব্যৰ্থ ।" + +#: ../src/daemon/main.c:819 +msgid "Fresh high-resolution timers available! Bon appetit!" +msgstr "নতুন high-resolution timers পোৱা হয়! অভিনন্দন!" + +#: ../src/daemon/main.c:821 +msgid "" +"Dude, your kernel stinks! The chef's recommendation today is Linux with high-" +"resolution timers enabled!" +msgstr "" +"শ্ৰীমান, আপোনাৰ কাৰ্ণেল পূৰণি! high-resolution timer সক্ৰিয় থকা Linux ক আজি " +"উপদেশ দিয়া হয়!" + +#: ../src/daemon/main.c:844 +msgid "pa_core_new() failed." +msgstr "pa_core_new() ব্যৰ্থ ।" + +#: ../src/daemon/main.c:904 +msgid "Failed to initialize daemon." +msgstr "ডেমন আৰম্ভ কৰিবলৈ ব্যৰ্থ ।" + +#: ../src/daemon/main.c:909 +msgid "Daemon startup without any loaded modules, refusing to work." +msgstr "" +"তুলি লোৱা মডিউল নোহোৱাকে ডেমন আৰম্ভ কৰা হৈছে, কোনো কাম সঞ্চালন কৰা সম্ভৱ নহয় ।" + +#: ../src/daemon/main.c:926 +msgid "Daemon startup complete." +msgstr "ডেমন আৰম্ভ কৰা সম্পূৰ্ণ ।" + +#: ../src/daemon/main.c:932 +msgid "Daemon shutdown initiated." +msgstr "ডেমন বন্ধ কৰাৰ প্ৰক্ৰিয়া আৰম্ভ কৰা হৈছে ।" + +#: ../src/daemon/main.c:954 +msgid "Daemon terminated." +msgstr "ডেমন বন্ধ কৰা হৈছে ।" + +#: ../src/daemon/cmdline.c:115 +#, c-format +msgid "" +"%s [options]\n" +"\n" +"COMMANDS:\n" +" -h, --help Show this help\n" +" --version Show version\n" +" --dump-conf Dump default configuration\n" +" --dump-modules Dump list of available modules\n" +" --dump-resample-methods Dump available resample methods\n" +" --cleanup-shm Cleanup stale shared memory " +"segments\n" +" --start Start the daemon if it is not " +"running\n" +" -k --kill Kill a running daemon\n" +" --check Check for a running daemon (only " +"returns exit code)\n" +"\n" +"OPTIONS:\n" +" --system[=BOOL] Run as system-wide instance\n" +" -D, --daemonize[=BOOL] Daemonize after startup\n" +" --fail[=BOOL] Quit when startup fails\n" +" --high-priority[=BOOL] Try to set high nice level\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_NICE)\n" +" --realtime[=BOOL] Try to enable realtime scheduling\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_RTPRIO)\n" +" --disallow-module-loading[=BOOL] Disallow module user requested " +"module\n" +" loading/unloading after startup\n" +" --disallow-exit[=BOOL] Disallow user requested exit\n" +" --exit-idle-time=SECS Terminate the daemon when idle and " +"this\n" +" time passed\n" +" --module-idle-time=SECS Unload autoloaded modules when idle " +"and\n" +" this time passed\n" +" --scache-idle-time=SECS Unload autoloaded samples when idle " +"and\n" +" this time passed\n" +" --log-level[=LEVEL] Increase or set verbosity level\n" +" -v Increase the verbosity level\n" +" --log-target={auto,syslog,stderr} Specify the log target\n" +" --log-meta[=BOOL] Include code location in log " +"messages\n" +" --log-time[=BOOL] Include timestamps in log messages\n" +" --log-backtrace=FRAMES Include a backtrace in log messages\n" +" -p, --dl-search-path=PATH Set the search path for dynamic " +"shared\n" +" objects (plugins)\n" +" --resample-method=METHOD Use the specified resampling method\n" +" (See --dump-resample-methods for\n" +" possible values)\n" +" --use-pid-file[=BOOL] Create a PID file\n" +" --no-cpu-limit[=BOOL] Do not install CPU load limiter on\n" +" platforms that support it.\n" +" --disable-shm[=BOOL] Disable shared memory support.\n" +"\n" +"STARTUP SCRIPT:\n" +" -L, --load=\"MODULE ARGUMENTS\" Load the specified plugin module " +"with\n" +" the specified argument\n" +" -F, --file=FILENAME Run the specified script\n" +" -C Open a command line on the running " +"TTY\n" +" after startup\n" +"\n" +" -n Don't load default script file\n" +msgstr "" +"%s [options]\n" +"\n" +"COMMANDS:\n" +" -h, --help Show this help\n" +" --version Show version\n" +" --dump-conf Dump default configuration\n" +" --dump-modules Dump list of available modules\n" +" --dump-resample-methods Dump available resample methods\n" +" --cleanup-shm Cleanup stale shared memory " +"segments\n" +" --start Start the daemon if it is not " +"running\n" +" -k --kill Kill a running daemon\n" +" --check Check for a running daemon (only " +"returns exit code)\n" +"\n" +"OPTIONS:\n" +" --system[=BOOL] Run as system-wide instance\n" +" -D, --daemonize[=BOOL] Daemonize after startup\n" +" --fail[=BOOL] Quit when startup fails\n" +" --high-priority[=BOOL] Try to set high nice level\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_NICE)\n" +" --realtime[=BOOL] Try to enable realtime scheduling\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_RTPRIO)\n" +" --disallow-module-loading[=BOOL] Disallow module user requested " +"module\n" +" loading/unloading after startup\n" +" --disallow-exit[=BOOL] Disallow user requested exit\n" +" --exit-idle-time=SECS Terminate the daemon when idle and " +"this\n" +" time passed\n" +" --module-idle-time=SECS Unload autoloaded modules when idle " +"and\n" +" this time passed\n" +" --scache-idle-time=SECS Unload autoloaded samples when idle " +"and\n" +" this time passed\n" +" --log-level[=LEVEL] Increase or set verbosity level\n" +" -v Increase the verbosity level\n" +" --log-target={auto,syslog,stderr} Specify the log target\n" +" --log-meta[=BOOL] Include code location in log " +"messages\n" +" --log-time[=BOOL] Include timestamps in log messages\n" +" --log-backtrace=FRAMES Include a backtrace in log messages\n" +" -p, --dl-search-path=PATH Set the search path for dynamic " +"shared\n" +" objects (plugins)\n" +" --resample-method=METHOD Use the specified resampling method\n" +" (See --dump-resample-methods for\n" +" possible values)\n" +" --use-pid-file[=BOOL] Create a PID file\n" +" --no-cpu-limit[=BOOL] Do not install CPU load limiter on\n" +" platforms that support it.\n" +" --disable-shm[=BOOL] Disable shared memory support.\n" +"\n" +"STARTUP SCRIPT:\n" +" -L, --load=\"MODULE ARGUMENTS\" Load the specified plugin module " +"with\n" +" the specified argument\n" +" -F, --file=FILENAME Run the specified script\n" +" -C Open a command line on the running " +"TTY\n" +" after startup\n" +"\n" +" -n Don't load default script file\n" + +#: ../src/daemon/cmdline.c:247 +msgid "--daemonize expects boolean argument" +msgstr "--daemonize দ্বাৰা বুলিয়েন তৰ্ক প্ৰত্যাশিত" + +#: ../src/daemon/cmdline.c:254 +msgid "--fail expects boolean argument" +msgstr "--fail দ্বাৰা বুলিয়েন তৰ্ক প্ৰত্যাশিত" + +#: ../src/daemon/cmdline.c:264 +msgid "" +"--log-level expects log level argument (either numeric in range 0..4 or one " +"of debug, info, notice, warn, error)." +msgstr "" +"--log-level ৰ কাৰণে লগ স্তৰৰ তৰ্ক প্ৰত্যাশিত (হয় সংখ্যা ০..৪ ৰ সীমাত বা debug, " +"info, notice, warn, error ৰ যিকোনো এটা) ।" + +#: ../src/daemon/cmdline.c:276 +msgid "--high-priority expects boolean argument" +msgstr "--high-priority দ্বাৰা বুলিয়েন তৰ্ক প্ৰত্যাশিত" + +#: ../src/daemon/cmdline.c:283 +msgid "--realtime expects boolean argument" +msgstr "--realtime দ্বাৰা বুলিয়েন তৰ্ক প্ৰত্যাশিত" + +#: ../src/daemon/cmdline.c:290 +msgid "--disallow-module-loading expects boolean argument" +msgstr "--disallow-module-loading দ্বাৰা বুলিয়েন তৰ্ক প্ৰত্যাশিত" + +#: ../src/daemon/cmdline.c:297 +msgid "--disallow-exit expects boolean argument" +msgstr "--disallow-exit দ্বাৰা বুলিয়েন তৰ্ক প্ৰত্যাশিত" + +#: ../src/daemon/cmdline.c:304 +msgid "--use-pid-file expects boolean argument" +msgstr "--use-pid-file দ্বাৰা বুলিয়েন তৰ্ক প্ৰত্যাশিত" + +#: ../src/daemon/cmdline.c:321 +msgid "Invalid log target: use either 'syslog', 'stderr' or 'auto'." +msgstr "অবৈধ লগ লক্ষ্য: 'syslog', 'stderr' বা 'auto' ৰ এটা ব্যৱহাৰ কৰক" + +#: ../src/daemon/cmdline.c:328 +msgid "--log-time expects boolean argument" +msgstr "--log-time দ্বাৰা বুলিয়েন তৰ্ক প্ৰত্যাশিত" + +#: ../src/daemon/cmdline.c:335 +msgid "--log-meta expects boolean argument" +msgstr "--log-meta দ্বাৰা বুলিয়েন তৰ্ক প্ৰত্যাশিত" + +#: ../src/daemon/cmdline.c:354 +#, c-format +msgid "Invalid resample method '%s'." +msgstr "resample পদ্ধতি '%s' বৈধ নহয় ।" + +#: ../src/daemon/cmdline.c:361 +msgid "--system expects boolean argument" +msgstr "--system দ্বাৰা বুলিয়েন তৰ্ক প্ৰত্যাশিত" + +#: ../src/daemon/cmdline.c:368 +msgid "--no-cpu-limit expects boolean argument" +msgstr "--no-cpu-limit দ্বাৰা বুলিয়েন তৰ্ক প্ৰত্যাশিত" + +#: ../src/daemon/cmdline.c:375 +msgid "--disable-shm expects boolean argument" +msgstr "--disable-shm দ্বাৰা বুলিয়েন তৰ্ক প্ৰত্যাশিত" + +#: ../src/daemon/dumpmodules.c:60 +#, c-format +msgid "Name: %s\n" +msgstr "নাম: %s\n" + +#: ../src/daemon/dumpmodules.c:63 +#, c-format +msgid "No module information available\n" +msgstr "মডিউল সংক্ৰান্ত কোনো তথ্য উপলব্ধ নাই\n" + +#: ../src/daemon/dumpmodules.c:66 +#, c-format +msgid "Version: %s\n" +msgstr "সংস্কৰণ: %s\n" + +#: ../src/daemon/dumpmodules.c:68 +#, c-format +msgid "Description: %s\n" +msgstr "বিৱৰণ: %s\n" + +#: ../src/daemon/dumpmodules.c:70 +#, c-format +msgid "Author: %s\n" +msgstr "নিৰ্মাতা: %s\n" + +#: ../src/daemon/dumpmodules.c:72 +#, c-format +msgid "Usage: %s\n" +msgstr "ব্যৱহাৰ পদ্ধতি: %s\n" + +#: ../src/daemon/dumpmodules.c:73 +#, c-format +msgid "Load Once: %s\n" +msgstr "এবাৰ তুলি লোৱা হ'ব: %s\n" + +#: ../src/daemon/dumpmodules.c:75 +#, c-format +msgid "DEPRECATION WARNING: %s\n" +msgstr "অবচিত করার সতর্কবার্তা: %s\n" + +#: ../src/daemon/dumpmodules.c:79 +#, c-format +msgid "Path: %s\n" +msgstr "পাথ: %s\n" + +#: ../src/daemon/daemon-conf.c:232 +#, c-format +msgid "[%s:%u] Invalid log target '%s'." +msgstr "[%s:%u] লগ লক্ষ্য '%s' বৈধ নহয় ।" + +#: ../src/daemon/daemon-conf.c:248 +#, c-format +msgid "[%s:%u] Invalid log level '%s'." +msgstr "[%s:%u] লগৰ স্তৰ '%s' বৈধ নহয় ।" + +#: ../src/daemon/daemon-conf.c:264 +#, c-format +msgid "[%s:%u] Invalid resample method '%s'." +msgstr "[%s:%u] resample পদ্ধতি '%s' বৈধ নহয় ।" + +#: ../src/daemon/daemon-conf.c:287 +#, c-format +msgid "[%s:%u] Invalid rlimit '%s'." +msgstr "[%s:%u] rlimit '%s' বৈধ নহয় ।" + +#: ../src/daemon/daemon-conf.c:294 +#, c-format +msgid "[%s:%u] rlimit not supported on this platform." +msgstr "[%s:%u] এই স্থাপত্যত rlimit সমৰ্থিত নহয় ।" + +#: ../src/daemon/daemon-conf.c:310 +#, c-format +msgid "[%s:%u] Invalid sample format '%s'." +msgstr "[%s:%u] চানেকিৰ বিন্যাস '%s' বৈধ নহয় ।" + +#: ../src/daemon/daemon-conf.c:328 +#, c-format +msgid "[%s:%u] Invalid sample rate '%s'." +msgstr "[%s:%u] চানেকিৰ মাত্ৰা '%s' বৈধ নহয় ।" + +#: ../src/daemon/daemon-conf.c:352 +#, c-format +msgid "[%s:%u] Invalid sample channels '%s'." +msgstr "[%s:%u] চানেকিৰ চেনেল '%s' বৈধ নহয়" + +#: ../src/daemon/daemon-conf.c:370 +#, c-format +msgid "[%s:%u] Invalid channel map '%s'." +msgstr "[%s:%u] চেনেল মেপ '%s' বৈধ নহয় ।" + +#: ../src/daemon/daemon-conf.c:388 +#, c-format +msgid "[%s:%u] Invalid number of fragments '%s'." +msgstr "[%s:%u] অংশৰ সংখ্যা '%s' বৈধ নহয় ।" + +#: ../src/daemon/daemon-conf.c:406 +#, c-format +msgid "[%s:%u] Invalid fragment size '%s'." +msgstr "[%s:%u] অংশৰ মাপ '%s' বৈধ নহয় ।" + +#: ../src/daemon/daemon-conf.c:424 +#, c-format +msgid "[%s:%u] Invalid nice level '%s'." +msgstr "[%s:%u] nice স্তৰ '%s' বৈধ নহয় ।" + +#: ../src/daemon/daemon-conf.c:546 +#, c-format +msgid "Failed to open configuration file: %s" +msgstr "বিন্যাস নথিপত্ৰ খুলিবলৈ ব্যৰ্থ: %s" + +#: ../src/daemon/daemon-conf.c:562 +msgid "" +"The specified default channel map has a different number of channels than " +"the specified default number of channels." +msgstr "" +"নিৰ্ধাৰিত অবিকল্পিত চেনেল মেপত নিৰ্ধাৰিত অবিকল্পিত চেনেলৰ সংখ্যাতকে বেলেগ সংখ্যক " +"চেনেল আছে ।" + +#: ../src/daemon/daemon-conf.c:638 +#, c-format +msgid "### Read from configuration file: %s ###\n" +msgstr "### চিহ্নিত বিন্যাস নথিপত্ৰৰ পৰা পঢ়া হ'ব: %s ###\n" + +#: ../src/daemon/caps.c:62 +msgid "Cleaning up privileges." +msgstr "অধিকার বর্জন করা হচ্ছে।" + +#: ../src/daemon/pulseaudio.desktop.in.h:1 +msgid "PulseAudio Sound System" +msgstr "PulseAudio শব্দ ব্যৱস্থা" + +#: ../src/daemon/pulseaudio.desktop.in.h:2 +msgid "Start the PulseAudio Sound System" +msgstr "PulseAudio শব্দ ব্যৱস্থা আৰম্ভ কৰা হ'ব" + +#: ../src/pulse/channelmap.c:105 ../src/pulse/channelmap.c:757 +msgid "Mono" +msgstr "মোনো" + +#: ../src/pulse/channelmap.c:107 +msgid "Front Center" +msgstr "সন্মুখত কেন্দ্ৰস্থিত" + +#: ../src/pulse/channelmap.c:108 +msgid "Front Left" +msgstr "সন্মুখত কেন্দ্ৰস্থিত" + +#: ../src/pulse/channelmap.c:109 +msgid "Front Right" +msgstr "সন্মুখত বাওঁফালে" + +#: ../src/pulse/channelmap.c:111 +msgid "Rear Center" +msgstr "পিছত কেন্দ্ৰস্থিত" + +#: ../src/pulse/channelmap.c:112 +msgid "Rear Left" +msgstr "পিছত বাওঁফালে" + +#: ../src/pulse/channelmap.c:113 +msgid "Rear Right" +msgstr "পিছত সোঁফালে" + +#: ../src/pulse/channelmap.c:115 +msgid "Low Frequency Emmiter" +msgstr "Low Frequency Emmiter" + +#: ../src/pulse/channelmap.c:117 +msgid "Front Left-of-center" +msgstr "সন্মুখত কেন্দ্ৰৰ-বাওঁফালে" + +#: ../src/pulse/channelmap.c:118 +msgid "Front Right-of-center" +msgstr "সন্মুখত কেন্দ্ৰৰ-সোঁফালে" + +#: ../src/pulse/channelmap.c:120 +msgid "Side Left" +msgstr "কাষত বাওঁফালে" + +#: ../src/pulse/channelmap.c:121 +msgid "Side Right" +msgstr "কাষত সোঁফালে" + +#: ../src/pulse/channelmap.c:123 +msgid "Auxiliary 0" +msgstr "অ'ক্সিলেৰি ০" + +#: ../src/pulse/channelmap.c:124 +msgid "Auxiliary 1" +msgstr "অ'ক্সিলেৰি ০" + +#: ../src/pulse/channelmap.c:125 +msgid "Auxiliary 2" +msgstr "অ'ক্সিলেৰি ১" + +#: ../src/pulse/channelmap.c:126 +msgid "Auxiliary 3" +msgstr "অ'ক্সিলেৰি ৩" + +#: ../src/pulse/channelmap.c:127 +msgid "Auxiliary 4" +msgstr "অ'ক্সিলেৰি ৪" + +#: ../src/pulse/channelmap.c:128 +msgid "Auxiliary 5" +msgstr "অ'ক্সিলেৰি ৪" + +#: ../src/pulse/channelmap.c:129 +msgid "Auxiliary 6" +msgstr "অ'ক্সিলেৰি ৬" + +#: ../src/pulse/channelmap.c:130 +msgid "Auxiliary 7" +msgstr "অ'ক্সিলেৰি ৭" + +#: ../src/pulse/channelmap.c:131 +msgid "Auxiliary 8" +msgstr "অ'ক্সিলেৰি ৮" + +#: ../src/pulse/channelmap.c:132 +msgid "Auxiliary 9" +msgstr "অ'ক্সিলেৰি ৯" + +#: ../src/pulse/channelmap.c:133 +msgid "Auxiliary 10" +msgstr "অ'ক্সিলেৰি ১০" + +#: ../src/pulse/channelmap.c:134 +msgid "Auxiliary 11" +msgstr "অ'ক্সিলেৰি ১১" + +#: ../src/pulse/channelmap.c:135 +msgid "Auxiliary 12" +msgstr "অ'ক্সিলেৰি ১২" + +#: ../src/pulse/channelmap.c:136 +msgid "Auxiliary 13" +msgstr "অ'ক্সিলেৰি ১৩" + +#: ../src/pulse/channelmap.c:137 +msgid "Auxiliary 14" +msgstr "অ'ক্সিলেৰি ১৪" + +#: ../src/pulse/channelmap.c:138 +msgid "Auxiliary 15" +msgstr "অ'ক্সিলেৰি ১৫" + +#: ../src/pulse/channelmap.c:139 +msgid "Auxiliary 16" +msgstr "অ'ক্সিলেৰি ১৬" + +#: ../src/pulse/channelmap.c:140 +msgid "Auxiliary 17" +msgstr "অ'ক্সিলেৰি ১৭" + +#: ../src/pulse/channelmap.c:141 +msgid "Auxiliary 18" +msgstr "অ'ক্সিলেৰি ১৮" + +#: ../src/pulse/channelmap.c:142 +msgid "Auxiliary 19" +msgstr "অ'ক্সিলেৰি ১৯" + +#: ../src/pulse/channelmap.c:143 +msgid "Auxiliary 20" +msgstr "অ'ক্সিলেৰি ২০" + +#: ../src/pulse/channelmap.c:144 +msgid "Auxiliary 21" +msgstr "অ'ক্সিলেৰি ২১" + +#: ../src/pulse/channelmap.c:145 +msgid "Auxiliary 22" +msgstr "অ'ক্সিলেৰি ২২" + +#: ../src/pulse/channelmap.c:146 +msgid "Auxiliary 23" +msgstr "অ'ক্সিলেৰি ২৩" + +#: ../src/pulse/channelmap.c:147 +msgid "Auxiliary 24" +msgstr "অ'ক্সিলেৰি ২৪" + +#: ../src/pulse/channelmap.c:148 +msgid "Auxiliary 25" +msgstr "অ'ক্সিলেৰি ২৫" + +#: ../src/pulse/channelmap.c:149 +msgid "Auxiliary 26" +msgstr "অ'ক্সিলেৰি ২৬" + +#: ../src/pulse/channelmap.c:150 +msgid "Auxiliary 27" +msgstr "অ'ক্সিলেৰি ২৭" + +#: ../src/pulse/channelmap.c:151 +msgid "Auxiliary 28" +msgstr "অ'ক্সিলেৰি ২৮" + +#: ../src/pulse/channelmap.c:152 +msgid "Auxiliary 29" +msgstr "অ'ক্সিলেৰি ২৯" + +#: ../src/pulse/channelmap.c:153 +msgid "Auxiliary 30" +msgstr "অ'ক্সিলেৰি ৩০" + +#: ../src/pulse/channelmap.c:154 +msgid "Auxiliary 31" +msgstr "অ'ক্সিলেৰি ৩১" + +#: ../src/pulse/channelmap.c:156 +msgid "Top Center" +msgstr "ওপৰত কেন্দ্ৰস্থিত" + +#: ../src/pulse/channelmap.c:158 +msgid "Top Front Center" +msgstr "ওপৰত সন্মুখত কেন্দ্ৰস্থিত" + +#: ../src/pulse/channelmap.c:159 +msgid "Top Front Left" +msgstr "ওপৰত সন্মুখত বাওঁফালে" + +#: ../src/pulse/channelmap.c:160 +msgid "Top Front Right" +msgstr "ওপৰত সন্মুখত বাওঁফালে" + +#: ../src/pulse/channelmap.c:162 +msgid "Top Rear Center" +msgstr "ওপৰত পিছত কেন্দ্ৰস্থিত" + +#: ../src/pulse/channelmap.c:163 +msgid "Top Rear Left" +msgstr "ওপৰত পিছত বাওঁফালে" + +#: ../src/pulse/channelmap.c:164 +msgid "Top Rear Right" +msgstr "ওপৰত পিছত সোঁফালে" + +#: ../src/pulse/channelmap.c:484 ../src/pulse/sample.c:170 +#: ../src/pulse/volume.c:295 ../src/pulse/volume.c:321 +#: ../src/pulse/volume.c:341 ../src/pulse/volume.c:371 +msgid "(invalid)" +msgstr "(অবৈধ)" + +#: ../src/pulse/channelmap.c:761 +msgid "Stereo" +msgstr "স্টিৰিও" + +#: ../src/pulse/channelmap.c:766 +msgid "Surround 4.0" +msgstr "ছাৰাউণ্ড ৪.০" + +#: ../src/pulse/channelmap.c:772 +msgid "Surround 4.1" +msgstr "ছাৰাউণ্ড ৪.১" + +#: ../src/pulse/channelmap.c:778 +msgid "Surround 5.0" +msgstr "ছাৰাউণ্ড ৫.০" + +#: ../src/pulse/channelmap.c:784 +msgid "Surround 5.1" +msgstr "ছাৰাউণ্ড ৫.১" + +#: ../src/pulse/channelmap.c:791 +msgid "Surround 7.1" +msgstr "ছাৰাউণ্ড ৭.১" + +#: ../src/pulse/error.c:43 +msgid "OK" +msgstr "ঠিক আছে" + +#: ../src/pulse/error.c:44 +msgid "Access denied" +msgstr "ব্যৱহাৰৰ অধিকাৰ প্ৰত্যাখ্যাত" + +#: ../src/pulse/error.c:45 +msgid "Unknown command" +msgstr "অজ্ঞাত নিৰ্দেশ" + +#: ../src/pulse/error.c:46 +msgid "Invalid argument" +msgstr "অবৈধ তৰ্ক" + +#: ../src/pulse/error.c:47 +msgid "Entity exists" +msgstr "পদাৰ্থ উপস্থিত" + +#: ../src/pulse/error.c:48 +msgid "No such entity" +msgstr "এই ধৰনৰ কোনো পদাৰ্থ উপস্থিত নাই" + +#: ../src/pulse/error.c:49 +msgid "Connection refused" +msgstr "সংযোগ নাকচ কৰা হৈছে" + +#: ../src/pulse/error.c:50 +msgid "Protocol error" +msgstr "প্ৰোটোকল সংক্ৰান্ত ত্ৰুটি" + +#: ../src/pulse/error.c:51 +msgid "Timeout" +msgstr "সময়সীমা" + +#: ../src/pulse/error.c:52 +msgid "No authorization key" +msgstr "কোনো অনুমোদনৰ-কি নাই" + +#: ../src/pulse/error.c:53 +msgid "Internal error" +msgstr "অভ্যন্তৰীণ ত্ৰুটি" + +#: ../src/pulse/error.c:54 +msgid "Connection terminated" +msgstr "সংযোগ বন্ধ কৰা হৈছে" + +#: ../src/pulse/error.c:55 +msgid "Entity killed" +msgstr "পদাৰ্থ kill কৰা হৈছে" + +#: ../src/pulse/error.c:56 +msgid "Invalid server" +msgstr "সেৱক বৈধ নহয়" + +#: ../src/pulse/error.c:57 +msgid "Module initalization failed" +msgstr "মডিউল আৰম্ভ কৰিবলৈ ব্যৰ্থ" + +#: ../src/pulse/error.c:58 +msgid "Bad state" +msgstr "অৱস্থা সঠিক নহয়" + +#: ../src/pulse/error.c:59 +msgid "No data" +msgstr "তথ্য অনুপস্থিত " + +#: ../src/pulse/error.c:60 +msgid "Incompatible protocol version" +msgstr "বিসঙ্গতিপূৰ্ণ প্ৰটকল সংস্কৰণ" + +#: ../src/pulse/error.c:61 +msgid "Too large" +msgstr "অত্যাধিক বড়" + +#: ../src/pulse/error.c:62 +msgid "Not supported" +msgstr "সমৰ্থন কৰা নহয়" + +#: ../src/pulse/error.c:63 +msgid "Unknown error code" +msgstr "অজানা ত্ৰুটিৰ কোড" + +#: ../src/pulse/error.c:64 +msgid "No such extension" +msgstr "এই ধৰনৰ কোনো এক্সটেনশন নাই" + +#: ../src/pulse/error.c:65 +msgid "Obsolete functionality" +msgstr "অবচিত বৈশিষ্ট্য" + +#: ../src/pulse/error.c:66 +msgid "Missing implementation" +msgstr "অনুপস্থিত বাস্তবায়ন" + +#: ../src/pulse/error.c:67 +msgid "Client forked" +msgstr "গ্ৰাহক ফৰ্ক কৰা হৈছে" + +#: ../src/pulse/error.c:68 +msgid "Input/Output error" +msgstr "" + +#: ../src/pulse/error.c:69 +msgid "Device or resource busy" +msgstr "" + +#: ../src/pulse/sample.c:172 +#, c-format +msgid "%s %uch %uHz" +msgstr "%s %uch %uHz" + +#: ../src/pulse/sample.c:184 +#, c-format +msgid "%0.1f GiB" +msgstr "%0.1f GiB" + +#: ../src/pulse/sample.c:186 +#, c-format +msgid "%0.1f MiB" +msgstr "%0.1f MiB" + +#: ../src/pulse/sample.c:188 +#, c-format +msgid "%0.1f KiB" +msgstr "%0.1f KiB" + +#: ../src/pulse/sample.c:190 +#, c-format +msgid "%u B" +msgstr "%u B" + +#: ../src/pulse/client-conf-x11.c:55 ../src/utils/pax11publish.c:100 +msgid "XOpenDisplay() failed" +msgstr "XOpenDisplay() ব্যৰ্থ" + +#: ../src/pulse/client-conf-x11.c:93 +msgid "Failed to parse cookie data" +msgstr "কুকিৰ তথ্য বিশ্লেষণ কৰিবলৈ ব্যৰ্থ" + +#: ../src/pulse/client-conf.c:111 +#, c-format +msgid "Failed to open configuration file '%s': %s" +msgstr "বিন্যাস নথিপত্ৰ '%s' খুলিবলৈ ব্যৰ্থ: %s" + +#: ../src/pulse/context.c:550 +msgid "No cookie loaded. Attempting to connect without." +msgstr "কোনো কুকি তুলি লোৱা নহয় । কুকি নোহোৱাকে সংযোগৰ প্ৰচেষ্টা কৰা হৈছে ।" + +#: ../src/pulse/context.c:693 +#, c-format +msgid "fork(): %s" +msgstr "fork(): %s" + +#: ../src/pulse/context.c:748 +#, c-format +msgid "waitpid(): %s" +msgstr "waitpid(): %s" + +#: ../src/pulse/context.c:1438 +#, c-format +msgid "Received message for unknown extension '%s'" +msgstr "অজানা এক্সটেনশন '%s'-ৰ বাবে বাৰ্তা প্ৰাপ্ত হৈছে" + +#: ../src/utils/pacat.c:108 +#, c-format +msgid "Failed to drain stream: %s" +msgstr "স্ট্রিম ড্রেইন (অর্থাৎ ফাঁকা) করতে ব্যর্থ: %s" + +#: ../src/utils/pacat.c:113 +msgid "Playback stream drained." +msgstr "প্লে-ব্যাক স্ট্রিম ফাঁকা করা হয়েছে।" + +#: ../src/utils/pacat.c:123 +msgid "Draining connection to server." +msgstr "সার্ভারের সাথে স্থাপিত সংযোগ ফাঁকা করা হচ্ছে।" + +#: ../src/utils/pacat.c:136 +#, c-format +msgid "pa_stream_drain(): %s" +msgstr "pa_stream_drain(): %s" + +#: ../src/utils/pacat.c:159 +#, c-format +msgid "pa_stream_write() failed: %s" +msgstr "pa_stream_write() ব্যর্থ: %s" + +#: ../src/utils/pacat.c:197 +#, c-format +msgid "pa_stream_begin_write() failed: %s" +msgstr "pa_stream_write() ব্যর্থ: %s" + +#: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267 +#, c-format +msgid "pa_stream_peek() failed: %s" +msgstr "pa_stream_peek() ব্যর্থ: %s" + +#: ../src/utils/pacat.c:307 +msgid "Stream successfully created." +msgstr "সাফল্যের সাথে স্ট্রিম নির্মিত হয়েছে।" + +#: ../src/utils/pacat.c:310 +#, c-format +msgid "pa_stream_get_buffer_attr() failed: %s" +msgstr "pa_stream_get_buffer_attr() ব্যর্থ: %s" + +#: ../src/utils/pacat.c:314 +#, c-format +msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u" +msgstr "বাফারের মাপ: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u" + +#: ../src/utils/pacat.c:317 +#, c-format +msgid "Buffer metrics: maxlength=%u, fragsize=%u" +msgstr "বাফারের মাপ: maxlength=%u, fragsize=%u" + +#: ../src/utils/pacat.c:321 +#, c-format +msgid "Using sample spec '%s', channel map '%s'." +msgstr "স্যাম্পেলের spec '%s', ও চ্যানেল ম্যাপ '%s' ব্যবহার করা হচ্ছে।" + +#: ../src/utils/pacat.c:325 +#, c-format +msgid "Connected to device %s (%u, %ssuspended)." +msgstr "ডিভাইস %s-র সাথে সংযোগ করা হয়েছে (%u, %ssuspended)।" + +#: ../src/utils/pacat.c:335 +#, c-format +msgid "Stream error: %s" +msgstr "ষ্ট্রিম সংক্রান্ত ত্রুটি: %s" + +#: ../src/utils/pacat.c:345 +#, c-format +msgid "Stream device suspended.%s" +msgstr "স্ট্রিম ডিভাইস স্থগিত করা হয়েছে। %s" + +#: ../src/utils/pacat.c:347 +#, c-format +msgid "Stream device resumed.%s" +msgstr "স্ট্রিম ডিভাইস পুনরারম্ভ করা হয়েছে। %s" + +#: ../src/utils/pacat.c:355 +#, c-format +msgid "Stream underrun.%s" +msgstr "ধীর গতির স্ট্রিম.%s" + +#: ../src/utils/pacat.c:362 +#, c-format +msgid "Stream overrun.%s" +msgstr "স্ট্রিম মাত্রা অতিক্রম করেছে।%s" + +#: ../src/utils/pacat.c:369 +#, c-format +msgid "Stream started.%s" +msgstr "স্ট্রিম আরম্ভ করা হয়েছে। %s" + +#: ../src/utils/pacat.c:376 +#, c-format +msgid "Stream moved to device %s (%u, %ssuspended).%s" +msgstr "%s ডিভাইসে স্ট্রিম স্থানান্তর করা হয়েছে (%u, %ssuspended)।%s" + +#: ../src/utils/pacat.c:376 +msgid "not " +msgstr "not " + +#: ../src/utils/pacat.c:383 +#, c-format +msgid "Stream buffer attributes changed.%s" +msgstr "স্ট্রিম বাফারের অ্যাট্রিবিউট পরিবর্তিত হয়েছে। %s" + +#: ../src/utils/pacat.c:415 +#, c-format +msgid "Connection established.%s" +msgstr "সংযোগ স্থাপিত হয়েছে।%s" + +#: ../src/utils/pacat.c:418 +#, c-format +msgid "pa_stream_new() failed: %s" +msgstr "pa_stream_new() ব্যর্থ: %s" + +#: ../src/utils/pacat.c:450 +#, c-format +msgid "pa_stream_connect_playback() failed: %s" +msgstr "pa_stream_connect_playback() ব্যর্থ: %s" + +#: ../src/utils/pacat.c:456 +#, c-format +msgid "pa_stream_connect_record() failed: %s" +msgstr "pa_stream_connect_record() ব্যর্থ: %s" + +#: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857 +#, c-format +msgid "Connection failure: %s" +msgstr "সংযোগ বিফল: %s" + +#: ../src/utils/pacat.c:503 +msgid "Got EOF." +msgstr "ফাইলের সমাপ্তি সনাক্ত হয়েছে।" + +#: ../src/utils/pacat.c:540 +#, c-format +msgid "write() failed: %s" +msgstr "write() ব্যর্থ: %s" + +#: ../src/utils/pacat.c:561 +msgid "Got signal, exiting." +msgstr "সিগন্যাল প্রাপ্ত হয়েছে, প্রস্থান করা হবে।" + +#: ../src/utils/pacat.c:575 +#, c-format +msgid "Failed to get latency: %s" +msgstr "লেটেন্সির পরিমাণ প্রাপ্ত করতে ব্যর্থ: %s" + +#: ../src/utils/pacat.c:580 +#, fuzzy, c-format +msgid "Time: %0.3f sec; Latency: %0.0f usec." +msgstr "সময়: %0.3f sec; Latency: %0.0f usec. \r" + +#: ../src/utils/pacat.c:599 +#, c-format +msgid "pa_stream_update_timing_info() failed: %s" +msgstr "pa_stream_update_timing_info() ব্যর্থ: %s" + +#: ../src/utils/pacat.c:609 +#, c-format +msgid "" +"%s [options]\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -r, --record Create a connection for recording\n" +" -p, --playback Create a connection for playback\n" +"\n" +" -v, --verbose Enable verbose operations\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -d, --device=DEVICE The name of the sink/source to " +"connect to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" +" --stream-name=NAME How to call this stream on the " +"server\n" +" --volume=VOLUME Specify the initial (linear) volume " +"in range 0...65536\n" +" --rate=SAMPLERATE The sample rate in Hz (defaults to " +"44100)\n" +" --format=SAMPLEFORMAT The sample type, one of s16le, " +"s16be, u8, float32le,\n" +" float32be, ulaw, alaw, s32le, s32be, " +"s24le, s24be,\n" +" s24-32le, s24-32be (defaults to " +"s16ne)\n" +" --channels=CHANNELS The number of channels, 1 for mono, " +"2 for stereo\n" +" (defaults to 2)\n" +" --channel-map=CHANNELMAP Channel map to use instead of the " +"default\n" +" --fix-format Take the sample format from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-rate Take the sampling rate from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-channels Take the number of channels and the " +"channel map\n" +" from the sink the stream is being " +"connected to.\n" +" --no-remix Don't upmix or downmix channels.\n" +" --no-remap Map channels by index instead of " +"name.\n" +" --latency=BYTES Request the specified latency in " +"bytes.\n" +" --process-time=BYTES Request the specified process time " +"per request in bytes.\n" +" --property=PROPERTY=VALUE Set the specified property to the " +"specified value.\n" +" --raw Record/play raw PCM data.\n" +" --file-format=FFORMAT Record/play formatted PCM data.\n" +" --list-file-formats List available file formats.\n" +msgstr "" +"%s [options]\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -r, --record Create a connection for recording\n" +" -p, --playback Create a connection for playback\n" +"\n" +" -v, --verbose Enable verbose operations\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -d, --device=DEVICE The name of the sink/source to " +"connect to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" +" --stream-name=NAME How to call this stream on the " +"server\n" +" --volume=VOLUME Specify the initial (linear) volume " +"in range 0...65536\n" +" --rate=SAMPLERATE The sample rate in Hz (defaults to " +"44100)\n" +" --format=SAMPLEFORMAT The sample type, one of s16le, " +"s16be, u8, float32le,\n" +" float32be, ulaw, alaw, s32le, s32be, " +"s24le, s24be,\n" +" s24-32le, s24-32be (defaults to " +"s16ne)\n" +" --channels=CHANNELS The number of channels, 1 for mono, " +"2 for stereo\n" +" (defaults to 2)\n" +" --channel-map=CHANNELMAP Channel map to use instead of the " +"default\n" +" --fix-format Take the sample format from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-rate Take the sampling rate from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-channels Take the number of channels and the " +"channel map\n" +" from the sink the stream is being " +"connected to.\n" +" --no-remix Don't upmix or downmix channels.\n" +" --no-remap Map channels by index instead of " +"name.\n" +" --latency=BYTES Request the specified latency in " +"bytes.\n" +" --process-time=BYTES Request the specified process time " +"per request in bytes.\n" +" --property=PROPERTY=VALUE Set the specified property to the " +"specified value.\n" +" --raw Record/play raw PCM data.\n" +" --file-format=FFORMAT Record/play formatted PCM data.\n" +" --list-file-formats List available file formats.\n" + +#: ../src/utils/pacat.c:731 +#, c-format +msgid "" +"pacat %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pacat %s\n" +"libpulse ৰ সৈতে সঙ্কলন কৰা হৈছে %s\n" +"libpulse ৰ সৈতে যুক্ত %s\n" + +#: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953 +#, c-format +msgid "Invalid client name '%s'" +msgstr "ক্লায়েন্টের নাম '%s' বৈধ নয়" + +#: ../src/utils/pacat.c:779 +#, c-format +msgid "Invalid stream name '%s'" +msgstr "স্ট্রিমের নাম '%s' বৈধ নয়।" + +#: ../src/utils/pacat.c:816 +#, c-format +msgid "Invalid channel map '%s'" +msgstr "চ্যানেল ম্যাপ '%s' বৈধ নয়" + +#: ../src/utils/pacat.c:845 +#, c-format +msgid "Invalid latency specification '%s'" +msgstr "লেটেন্সির জন্য নির্ধারিত বৈশিষ্ট্য '%s' বৈধ নয়" + +#: ../src/utils/pacat.c:852 +#, c-format +msgid "Invalid process time specification '%s'" +msgstr "প্রসেসের সময়ের বৈশিষ্ট্য '%s' বৈধ নয়" + +#: ../src/utils/pacat.c:864 +#, c-format +msgid "Invalid property '%s'" +msgstr "বৈশিষ্ট্য '%s' বৈধ নয়।" + +#: ../src/utils/pacat.c:881 +#, c-format +msgid "Unknown file format %s." +msgstr "ফাইলের অজানা বিন্যাস %s।" + +#: ../src/utils/pacat.c:900 +msgid "Invalid sample specification" +msgstr "অবৈধ স্যাম্পেল নির্ধারিত" + +#: ../src/utils/pacat.c:910 +#, c-format +msgid "open(): %s" +msgstr "open(): %s" + +#: ../src/utils/pacat.c:915 +#, c-format +msgid "dup2(): %s" +msgstr "dup2(): %s" + +#: ../src/utils/pacat.c:922 +msgid "Too many arguments." +msgstr "অত্যাধিক আর্গুমেন্ট।" + +#: ../src/utils/pacat.c:933 +msgid "Failed to generate sample specification for file." +msgstr "স্যাম্পেলের মান নির্ধারণের ফাইল নির্মাণ করতে ব্যর্থ" + +#: ../src/utils/pacat.c:953 +msgid "Failed to open audio file." +msgstr "শব্দের ফাইল খুলতে ব্যর্থ।" + +#: ../src/utils/pacat.c:959 +msgid "" +"Warning: specified sample specification will be overwritten with " +"specification from file." +msgstr "" +"সতর্কবার্তা: চিহ্নিত স্যাম্পেল নির্ধারণের ফাইলটির তথ্য, এই ফাইলের থেকে উপলব্ধ তথ্য " +"দ্বারা প্রতিস্থাপিত হবে।" + +#: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997 +msgid "Failed to determine sample specification from file." +msgstr "ফাইল থেকে স্যাম্পেল সংক্রান্ত তথ্য প্রাপ্ত করতে ব্যর্থ।" + +#: ../src/utils/pacat.c:971 +msgid "Warning: Failed to determine channel map from file." +msgstr "সতর্কবার্তা: ফাইল থেকে চ্যানেলের ম্যাপ নির্ধারণ করতে ব্যর্থ।" + +#: ../src/utils/pacat.c:982 +msgid "Channel map doesn't match sample specification" +msgstr "চ্যানেলের ম্যাপ ও স্যাম্পেলের নির্ধারিত মানে গরমিল" + +#: ../src/utils/pacat.c:993 +msgid "Warning: failed to write channel map to file." +msgstr "সতর্কবার্তা: ফাইলের মধ্যে চ্যানেলের ম্যাপ লিখতে ব্যর্থ।" + +#: ../src/utils/pacat.c:1008 +#, c-format +msgid "" +"Opening a %s stream with sample specification '%s' and channel map '%s'." +msgstr "" +"একটি %s স্ট্রিম খোলা হচ্ছে। এটির জন্য '%s'-র স্যাম্পেলের নির্ধারিত মান ও '%s' " +"চ্যানেলের ম্যাপ প্রয়োগ করা হবে।" + +#: ../src/utils/pacat.c:1009 +msgid "recording" +msgstr "ৰেকৰ্ড কৰা হৈছে" + +#: ../src/utils/pacat.c:1009 +msgid "playback" +msgstr "প্লে-বেক" + +#: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267 +msgid "pa_mainloop_new() failed." +msgstr "pa_mainloop_new() ব্যর্থ।" + +#: ../src/utils/pacat.c:1054 +msgid "io_new() failed." +msgstr "io_new() ব্যর্থ।" + +#: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279 +msgid "pa_context_new() failed." +msgstr "pa_context_new() ব্যর্থ।" + +#: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285 +#, c-format +msgid "pa_context_connect() failed: %s" +msgstr "pa_context_connect() ব্যৰ্থ: %s" + +#: ../src/utils/pacat.c:1075 +msgid "pa_context_rttime_new() failed." +msgstr "pa_context_rttime_new() ব্যর্থ।" + +#: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290 +msgid "pa_mainloop_run() failed." +msgstr "pa_mainloop_run() ব্যর্থ।" + +#: ../src/utils/pasuspender.c:81 +#, c-format +msgid "fork(): %s\n" +msgstr "fork(): %s\n" + +#: ../src/utils/pasuspender.c:92 +#, c-format +msgid "execvp(): %s\n" +msgstr "execvp(): %s\n" + +#: ../src/utils/pasuspender.c:109 +#, c-format +msgid "Failure to suspend: %s\n" +msgstr "স্থগিত কৰিবলৈ ব্যৰ্থ: %s\n" + +#: ../src/utils/pasuspender.c:124 +#, c-format +msgid "Failure to resume: %s\n" +msgstr "পুনৰাৰম্ভ কৰিবলৈ ব্যৰ্থ: %s\n" + +#: ../src/utils/pasuspender.c:147 +#, c-format +msgid "WARNING: Sound server is not local, not suspending.\n" +msgstr "সতৰ্কবাৰ্তা: ধ্বনি সেৱক স্থানীয় নহয়, স্থগিত কৰা নহয় ।\n" + +#: ../src/utils/pasuspender.c:159 +#, c-format +msgid "Connection failure: %s\n" +msgstr "সংযোগৰ মোড: %s
\n" + +#: ../src/utils/pasuspender.c:176 +#, c-format +msgid "Got SIGINT, exiting.\n" +msgstr "SIGINT প্ৰাপ্ত হৈছে, প্ৰস্থান কৰা হৈছে ।\n" + +#: ../src/utils/pasuspender.c:194 +#, c-format +msgid "WARNING: Child process terminated by signal %u\n" +msgstr "সতৰ্কবাৰ্তা: চিগ্নেল %u দ্বাৰা চাইল্ড প্ৰক্ৰিয়া বন্ধ কৰা হৈছে\n" + +#: ../src/utils/pasuspender.c:212 +#, c-format +msgid "" +"%s [options] ... \n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +"\n" +msgstr "" +"%s [options] ... \n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +"\n" + +#: ../src/utils/pasuspender.c:248 +#, c-format +msgid "" +"pasuspender %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pasuspender %s\n" +"libpulse ৰ সৈতে সঙ্কলন কৰা হৈছে %s\n" +"libpulse ৰ সৈতে যুক্ত %s\n" + +#: ../src/utils/pasuspender.c:277 +#, c-format +msgid "pa_mainloop_new() failed.\n" +msgstr "pa_mainloop_new() ব্যৰ্থ ।\n" + +#: ../src/utils/pasuspender.c:290 +#, c-format +msgid "pa_context_new() failed.\n" +msgstr "pa_context_new() ব্যৰ্থ ।\n" + +#: ../src/utils/pasuspender.c:298 +#, c-format +msgid "pa_mainloop_run() failed.\n" +msgstr "pa_mainloop_run() ব্যৰ্থ ।\n" + +#: ../src/utils/pactl.c:135 +#, c-format +msgid "Failed to get statistics: %s" +msgstr "পরিসংখ্যান প্রাপ্ত করতে ব্যর্থ: %s" + +#: ../src/utils/pactl.c:141 +#, c-format +msgid "Currently in use: %u blocks containing %s bytes total.\n" +msgstr "বৰ্ত্তমানে ব্যৱহৃত: %u blocks containing %s bytes total.\n" + +#: ../src/utils/pactl.c:144 +#, c-format +msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n" +msgstr "সম্পূৰ্ণ জীৱনকালত বিতৰণ কৰা: %u blocks containing %s bytes total.\n" + +#: ../src/utils/pactl.c:147 +#, c-format +msgid "Sample cache size: %s\n" +msgstr "চানেকি কেশ্বৰ মাপ: %s\n" + +#: ../src/utils/pactl.c:156 +#, c-format +msgid "Failed to get server information: %s" +msgstr "সার্ভার সংক্রান্ত তথ্য প্রাপ্ত করতে ব্যর্থ: %s" + +#: ../src/utils/pactl.c:164 +#, c-format +msgid "" +"User name: %s\n" +"Host Name: %s\n" +"Server Name: %s\n" +"Server Version: %s\n" +"Default Sample Specification: %s\n" +"Default Channel Map: %s\n" +"Default Sink: %s\n" +"Default Source: %s\n" +"Cookie: %08x\n" +msgstr "" +"ব্যৱহাৰকৰ্তাৰ নাম: %s\n" +"গৃহস্থৰ নাম: %s\n" +"সেৱকৰ নাম: %s\n" +"সেৱকৰ সংস্কৰণ: %s\n" +"চানেকিৰ অবিকল্পিত নিৰ্ধাৰিত মান: %s\n" +"অবিকল্পিত চেনেল মেপ: %s\n" +"অবিকল্পিত চিঙ্ক: %s\n" +"অবিকল্পিত উৎস: %s\n" +"কুকি: %08x\n" + +#: ../src/utils/pactl.c:205 +#, c-format +msgid "Failed to get sink information: %s" +msgstr "sink সংক্রান্ত তথ্য প্রাপ্ত করতে ব্যর্থ: %s" + +#: ../src/utils/pactl.c:221 +#, c-format +msgid "" +"Sink #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor Source: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"চিঙ্ক #%u\n" +"\tঅৱস্থা: %s\n" +"\tনাম: %s\n" +"\tবিৱৰণ: %s\n" +"\tচালক: %s\n" +"\tচানেকি নিৰ্ধাৰণ: %s\n" +"\tচেনেল মাপ: %s\n" +"\tগৰাকীৰ অংশ: %u\n" +"\tমিউট: %s\n" +"\tধ্বনি মাত্ৰা: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase ধ্বনি: %s%s%s\n" +"\tমণিটৰ উৎস: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tফ্লেগ: %s%s%s%s%s%s\n" +"\tগুণ:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360 +#, c-format +msgid "\tPorts:\n" +msgstr "\tপোর্ট:\n" + +#: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366 +#, c-format +msgid "\tActive Port: %s\n" +msgstr "\tসক্রিয় পোর্ট: %s\n" + +#: ../src/utils/pactl.c:297 +#, c-format +msgid "Failed to get source information: %s" +msgstr "উৎস সংক্রান্ত তথ্য প্রাপ্ত করতে ব্যর্থ: %s" + +#: ../src/utils/pactl.c:313 +#, c-format +msgid "" +"Source #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor of Sink: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"উৎস #%u\n" +"\tঅৱস্থা: %s\n" +"\tনাম: %s\n" +"\tবিৱৰণ: %s\n" +"\tচালক: %s\n" +"\tচানেকি নিৰ্ধাৰণ: %s\n" +"\tচেনেল মেপ: %s\n" +"\tগৰাকীৰ অংশ: %u\n" +"\tমিউট: %s\n" +"\tধ্বনিৰ মাত্ৰা: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tচিঙ্কৰ মণিটৰ: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tফ্লেগ: %s%s%s%s%s%s\n" +"\tগুণ:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:345 ../src/utils/pactl.c:401 ../src/utils/pactl.c:436 +#: ../src/utils/pactl.c:473 ../src/utils/pactl.c:532 ../src/utils/pactl.c:533 +#: ../src/utils/pactl.c:543 ../src/utils/pactl.c:587 ../src/utils/pactl.c:588 +#: ../src/utils/pactl.c:594 ../src/utils/pactl.c:637 ../src/utils/pactl.c:638 +#: ../src/utils/pactl.c:645 +msgid "n/a" +msgstr "n/a" + +#: ../src/utils/pactl.c:375 +#, c-format +msgid "Failed to get module information: %s" +msgstr "মডিউল সংক্রান্ত তথ্য প্রাপ্ত করতে ব্যর্থ: %s" + +#: ../src/utils/pactl.c:393 +#, c-format +msgid "" +"Module #%u\n" +"\tName: %s\n" +"\tArgument: %s\n" +"\tUsage counter: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"অংশ #%u\n" +"\tনাম: %s\n" +"\tতৰ্ক: %s\n" +"\tব্যৱহাৰৰ কাউন্টাৰ: %s\n" +"\tগুণ:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:412 +#, c-format +msgid "Failed to get client information: %s" +msgstr "ক্লায়েন্ট সংক্রান্ত তথ্য প্রাপ্ত করতে ব্যর্থ: %s" + +#: ../src/utils/pactl.c:430 +#, c-format +msgid "" +"Client #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"গ্ৰাহক #%u\n" +"\tচালক: %s\n" +"\tগৰাকীৰ অংশ: %s\n" +"\tগুণ:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:447 +#, c-format +msgid "Failed to get card information: %s" +msgstr "কার্ড সংক্রান্ত তথ্য প্রাপ্ত করতে ব্যর্থ: %s" + +#: ../src/utils/pactl.c:465 +#, c-format +msgid "" +"Card #%u\n" +"\tName: %s\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"কাৰ্ড #%u\n" +"\tনাম: %s\n" +"\tচালক: %s\n" +"\tগৰাকীৰ অংশ: %s\n" +"\tগুণ:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:479 +#, c-format +msgid "\tProfiles:\n" +msgstr "\tপাৰ্শ্বৰূপ:\n" + +#: ../src/utils/pactl.c:485 +#, c-format +msgid "\tActive Profile: %s\n" +msgstr "\tসক্ৰিয় পাৰ্শ্বৰূপ: %s\n" + +#: ../src/utils/pactl.c:496 +#, c-format +msgid "Failed to get sink input information: %s" +msgstr "sink ইনপুট সংক্রান্ত তথ্য প্রাপ্ত করতে ব্যর্থ: %s" + +#: ../src/utils/pactl.c:515 +#, c-format +msgid "" +"Sink Input #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSink: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tMute: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSink Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"চিঙ্ক নিবেশ #%u\n" +"\tচালক: %s\n" +"\tগৰাকীৰ অংশ: %s\n" +"\tগ্ৰাহক: %s\n" +"\tচিঙ্ক: %u\n" +"\tচানেকি নিৰ্ধাৰণ: %s\n" +"\tচেনেল মেপ: %s\n" +"\tমিউট: %s\n" +"\tধ্বনি মাত্ৰা: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSink Latency: %0.0f usec\n" +"\tResample ধৰণ: %s\n" +"\tগুণ:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:554 +#, c-format +msgid "Failed to get source output information: %s" +msgstr "উৎস আউটপুট সংক্রান্ত তথ্য প্রাপ্ত করতে ব্যর্থ: %s" + +#: ../src/utils/pactl.c:574 +#, c-format +msgid "" +"Source Output #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSource: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSource Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"উৎসৰ নিৰ্গম #%u\n" +"\tচালক: %s\n" +"\tগৰাকীৰ অংশ: %s\n" +"\tগ্ৰাহক: %s\n" +"\tউৎস: %u\n" +"\tচানেকি নিৰ্ধাৰণ: %s\n" +"\tচেনেল মেপ: %s\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSource Latency: %0.0f usec\n" +"\tResample ধৰণ: %s\n" +"\tগুণ:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:605 +#, c-format +msgid "Failed to get sample information: %s" +msgstr "স্যাম্পেল সংক্রান্ত তথ্য প্রাপ্ত করতে ব্যর্থ: %s" + +#: ../src/utils/pactl.c:623 +#, c-format +msgid "" +"Sample #%u\n" +"\tName: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tDuration: %0.1fs\n" +"\tSize: %s\n" +"\tLazy: %s\n" +"\tFilename: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"চানেকি #%u\n" +"\tনাম: %s\n" +"\tচানেকি নিৰ্ধাৰণ: %s\n" +"\tচেনেল মেপ: %s\n" +"\tধ্বনি মাত্ৰা: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tসময়: %0.1fs\n" +"\tআকাৰ: %s\n" +"\tএলেহুৱা: %s\n" +"\tনথিপত্ৰৰ নাম: %s\n" +"\tগুণ:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663 +#, c-format +msgid "Failure: %s" +msgstr "ব্যর্থতা: %s" + +#: ../src/utils/pactl.c:687 +#, c-format +msgid "Failed to upload sample: %s" +msgstr "স্যাম্পেল আপলোড করতে ব্যর্থ: %s" + +#: ../src/utils/pactl.c:704 +msgid "Premature end of file" +msgstr "সম্পূর্ণ হওয়ার পূর্বে ফাইল সমাপ্ত হয়েছে" + +#: ../src/utils/pactl.c:863 +msgid "Got SIGINT, exiting." +msgstr "SIGINT প্রাপ্ত হয়েছে, প্রস্থান করা হয়েছে।" + +#: ../src/utils/pactl.c:869 +#, c-format +msgid "" +"%s [options] stat\n" +"%s [options] list\n" +"%s [options] exit\n" +"%s [options] upload-sample FILENAME [NAME]\n" +"%s [options] play-sample NAME [SINK]\n" +"%s [options] remove-sample NAME\n" +"%s [options] move-sink-input SINKINPUT SINK\n" +"%s [options] move-source-output SOURCEOUTPUT SOURCE\n" +"%s [options] load-module NAME [ARGS ...]\n" +"%s [options] unload-module MODULE\n" +"%s [options] suspend-sink SINK 1|0\n" +"%s [options] suspend-source SOURCE 1|0\n" +"%s [options] set-card-profile CARD PROFILE\n" +"%s [options] set-sink-port SINK PORT\n" +"%s [options] set-source-port SOURCE PORT\n" +"%s [options] set-sink-volume SINK VOLUME\n" +"%s [options] set-source-volume SOURCE VOLUME\n" +"%s [options] set-sink-input-volume SINKINPUT VOLUME\n" +"%s [options] set-sink-mute SINK 1|0\n" +"%s [options] set-source-mute SOURCE 1|0\n" +"%s [options] set-sink-input-mute SINKINPUT 1|0\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" +msgstr "" +"%s [options] stat\n" +"%s [options] list\n" +"%s [options] exit\n" +"%s [options] upload-sample FILENAME [NAME]\n" +"%s [options] play-sample NAME [SINK]\n" +"%s [options] remove-sample NAME\n" +"%s [options] move-sink-input SINKINPUT SINK\n" +"%s [options] move-source-output SOURCEOUTPUT SOURCE\n" +"%s [options] load-module NAME [ARGS ...]\n" +"%s [options] unload-module MODULE\n" +"%s [options] suspend-sink SINK 1|0\n" +"%s [options] suspend-source SOURCE 1|0\n" +"%s [options] set-card-profile CARD PROFILE\n" +"%s [options] set-sink-port SINK PORT\n" +"%s [options] set-source-port SOURCE PORT\n" +"%s [options] set-sink-volume SINK VOLUME\n" +"%s [options] set-source-volume SOURCE VOLUME\n" +"%s [options] set-sink-input-volume SINKINPUT VOLUME\n" +"%s [options] set-sink-mute SINK 1|0\n" +"%s [options] set-source-mute SOURCE 1|0\n" +"%s [options] set-sink-input-mute SINKINPUT 1|0\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" + +#: ../src/utils/pactl.c:933 +#, c-format +msgid "" +"pactl %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pactl %s\n" +"libpulseৰ সৈতে সঙ্কলন কৰা %s\n" +"libpulse-ৰ সৈতে যুক্ত %s\n" + +#: ../src/utils/pactl.c:979 +msgid "Please specify a sample file to load" +msgstr "লোড করার উদ্দেশ্যে অনুগ্রহ করে একটি স্যাম্পেল ফাইল উল্লেখ করুন" + +#: ../src/utils/pactl.c:992 +msgid "Failed to open sound file." +msgstr "শব্দের ফাইল খুলতে ব্যর্থ।" + +#: ../src/utils/pactl.c:1004 +msgid "Warning: Failed to determine sample specification from file." +msgstr "সতর্কবার্তা: ফাইল থেকে স্যাম্পেলের নির্ধারিত মাপ নির্মাণ করতে ব্যর্থ।" + +#: ../src/utils/pactl.c:1014 +msgid "You have to specify a sample name to play" +msgstr "বাজানোর উদ্দেশ্যে একটি স্যাম্পেল ফাইল উল্লেখ করা আবশ্যক" + +#: ../src/utils/pactl.c:1026 +msgid "You have to specify a sample name to remove" +msgstr "অপসারণের উদ্দেশ্যে একটি স্যাম্পেল ফাইল উল্লেখ করা আবশ্যক" + +#: ../src/utils/pactl.c:1035 +msgid "You have to specify a sink input index and a sink" +msgstr "সিংক ইনপুট ইন্ডেক্স ও একটি সিংক নির্ধারণ করা আবশ্যক" + +#: ../src/utils/pactl.c:1045 +msgid "You have to specify a source output index and a source" +msgstr "সোর্স আউটপুট ইন্ডেক্স ও একটি সোর্স নির্ধারণ করা আবশ্যক" + +#: ../src/utils/pactl.c:1060 +msgid "You have to specify a module name and arguments." +msgstr "মডিউলের নাম ও আর্গুমেন্ট নির্ধারণ করা আবশ্যক।" + +#: ../src/utils/pactl.c:1080 +msgid "You have to specify a module index" +msgstr "মডিউল ইন্ডেক্স নির্ধারণ করা আবশ্যক" + +#: ../src/utils/pactl.c:1090 +msgid "" +"You may not specify more than one sink. You have to specify a boolean value." +msgstr "একাধিক সিংক নির্ধারণ করা যাবে না। বুলিয়েন মান নির্ধারণ করা আবশ্যক।" + +#: ../src/utils/pactl.c:1103 +msgid "" +"You may not specify more than one source. You have to specify a boolean " +"value." +msgstr "একাধিক সোর্স নির্ধারণ করা যাবে না। বুলিয়েন মান নির্ধারণ করা আবশ্যক।" + +#: ../src/utils/pactl.c:1115 +msgid "You have to specify a card name/index and a profile name" +msgstr "কার্ডের নাম/ইন্ডেক্স ও একটি প্রোফাইলের নাম উল্লেখ করা আবশ্যক" + +#: ../src/utils/pactl.c:1126 +msgid "You have to specify a sink name/index and a port name" +msgstr "sink-র নাম/ইন্ডেক্স ও একটি পোর্টের নাম উল্লেখ করা আবশ্যক" + +#: ../src/utils/pactl.c:1137 +msgid "You have to specify a source name/index and a port name" +msgstr "উৎসের নাম/ইন্ডেক্স ও একটি পোর্টে নাম উল্লেখ করা আবশ্যক" + +#: ../src/utils/pactl.c:1149 +msgid "You have to specify a sink name/index and a volume" +msgstr "sink-র নাম/ইন্ডেক্স ও একটি পোর্টের নাম উল্লেখ করা আবশ্যক" + +#: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171 +#: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209 +#: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248 +msgid "Invalid volume specification" +msgstr "অবৈধ শব্দের মাত্রা নির্ধারিত" + +#: ../src/utils/pactl.c:1166 +msgid "You have to specify a source name/index and a volume" +msgstr "উৎসের নাম/ইন্ডেক্স ও একটি শব্দের মাত্রা উল্লেখ করা আবশ্যক" + +#: ../src/utils/pactl.c:1183 +msgid "You have to specify a sink input index and a volume" +msgstr "সিংক ইনপুট ইন্ডেক্স ও শব্দের মাত্রা নির্ধারণ করা আবশ্যক" + +#: ../src/utils/pactl.c:1188 +msgid "Invalid sink input index" +msgstr "সিংক ইনপুট ইন্ডেক্স বৈধ নয়" + +#: ../src/utils/pactl.c:1204 +msgid "You have to specify a sink name/index and a mute boolean" +msgstr "sink-র নাম/ইন্ডেক্স ও একটি নিঃশব্দতার বুলিয়ান উল্লেখ করা আবশ্যক" + +#: ../src/utils/pactl.c:1221 +msgid "You have to specify a source name/index and a mute boolean" +msgstr "উৎসের নাম/ইন্ডেক্স ও নিঃশব্দতার বুলিয়ান উল্লেখ করা আবশ্যক" + +#: ../src/utils/pactl.c:1238 +msgid "You have to specify a sink input index and a mute boolean" +msgstr "সিংক ইনপুট ইন্ডেক্স ও নিঃশব্দতার বুলিয়ান নির্ধারণ করা আবশ্যক" + +#: ../src/utils/pactl.c:1243 +msgid "Invalid sink input index specification" +msgstr "অবৈধ সিংক ইনপুট ইন্ডেক্স নির্ধারিত" + +#: ../src/utils/pactl.c:1262 +msgid "No valid command specified." +msgstr "কোনো বৈধ কমান্ড নির্ধারিত হয়নি।" + +#: ../src/utils/pax11publish.c:61 +#, c-format +msgid "" +"%s [-D display] [-S server] [-O sink] [-I source] [-c file] [-d|-e|-i|-r]\n" +"\n" +" -d Show current PulseAudio data attached to X11 display (default)\n" +" -e Export local PulseAudio data to X11 display\n" +" -i Import PulseAudio data from X11 display to local environment " +"variables and cookie file.\n" +" -r Remove PulseAudio data from X11 display\n" +msgstr "" +"%s [-D display] [-S server] [-O sink] [-I source] [-c file] [-d|-e|-i|-r]\n" +"\n" +" -d Show current PulseAudio data attached to X11 display (default)\n" +" -e Export local PulseAudio data to X11 display\n" +" -i Import PulseAudio data from X11 display to local environment " +"variables and cookie file.\n" +" -r Remove PulseAudio data from X11 display\n" + +#: ../src/utils/pax11publish.c:94 +#, c-format +msgid "Failed to parse command line.\n" +msgstr "আদেশ-শাৰী বিশ্লেষণ কৰিবলৈ ব্যৰ্থ ।\n" + +#: ../src/utils/pax11publish.c:108 +#, c-format +msgid "Server: %s\n" +msgstr "সেৱক: %s\n" + +#: ../src/utils/pax11publish.c:110 +#, c-format +msgid "Source: %s\n" +msgstr "উৎস: %s\n" + +#: ../src/utils/pax11publish.c:112 +#, c-format +msgid "Sink: %s\n" +msgstr "চিঙ্ক: %s\n" + +#: ../src/utils/pax11publish.c:114 +#, c-format +msgid "Cookie: %s\n" +msgstr "কুকি: %s\n" + +#: ../src/utils/pax11publish.c:132 +#, c-format +msgid "Failed to parse cookie data\n" +msgstr "কুকি সংক্ৰান্ত তথ্য বিশ্লেষণ কৰিবলৈ ব্যৰ্থ\n" + +#: ../src/utils/pax11publish.c:137 +#, c-format +msgid "Failed to save cookie data\n" +msgstr "কুকি সংক্ৰান্ত তথ্য সংৰক্ষণ কৰিবলৈ ব্যৰ্থ\n" + +#: ../src/utils/pax11publish.c:152 +#, c-format +msgid "Failed to load client configuration file.\n" +msgstr "গ্ৰাহক বিন্যাস নথিপত্ৰ তুলিবলৈ ব্যৰ্থ ।\n" + +#: ../src/utils/pax11publish.c:157 +#, c-format +msgid "Failed to read environment configuration data.\n" +msgstr "পৰিবেশ বিন্যাস সংক্ৰান্ত তথ্য পঢ়িবলৈ ব্যৰ্থ ।\n" + +#: ../src/utils/pax11publish.c:174 +#, c-format +msgid "Failed to get FQDN.\n" +msgstr "FQDN প্ৰাপ্ত কৰিবলৈ ব্যৰ্থ ।\n" + +#: ../src/utils/pax11publish.c:194 +#, c-format +msgid "Failed to load cookie data\n" +msgstr "কুকি সংক্ৰান্ত তথ্য তুলিবলৈ ব্যৰ্থ\n" + +#: ../src/utils/pax11publish.c:211 +#, c-format +msgid "Not yet implemented.\n" +msgstr "এতিয়াও বাস্তবায়িত নহয় ।\n" + +#: ../src/utils/pacmd.c:69 +msgid "No PulseAudio daemon running, or not running as session daemon." +msgstr "PulseAudio ডেমন চলছে না অথবা সেশানের ডেমন রূপে চলছে না।" + +#: ../src/utils/pacmd.c:74 +#, c-format +msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s" +msgstr "socket(PF_UNIX, SOCK_STREAM, 0): %s" + +#: ../src/utils/pacmd.c:91 +#, c-format +msgid "connect(): %s" +msgstr "connect(): %s" + +#: ../src/utils/pacmd.c:99 +msgid "Failed to kill PulseAudio daemon." +msgstr "PulseAudio ডেমন kill কৰিবলৈ ব্যৰ্থ ।" + +#: ../src/utils/pacmd.c:107 +msgid "Daemon not responding." +msgstr "ডেমনৰ পৰা কোনো প্ৰতিক্ৰিয়া পোৱা নাযায় ।" + +#: ../src/utils/pacmd.c:161 +#, c-format +msgid "poll(): %s" +msgstr "poll(): %s" + +#: ../src/utils/pacmd.c:171 ../src/utils/pacmd.c:188 +#, c-format +msgid "read(): %s" +msgstr "read(): %s" + +#: ../src/utils/pacmd.c:207 ../src/utils/pacmd.c:223 +#, c-format +msgid "write(): %s" +msgstr "write(): %s" + +#: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:219 +msgid "Cannot access autospawn lock." +msgstr "autospawn লক প্ৰয়োগ কৰিবলৈ ব্যৰ্থ ।" + +#: ../src/modules/alsa/alsa-sink.c:530 ../src/modules/alsa/alsa-sink.c:689 +#, c-format +msgid "" +"ALSA woke us up to write new data to the device, but there was actually " +"nothing to write!\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers.\n" +"We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() " +"returned 0 or another value < min_avail." +msgstr "" +"ALSA ই আমাক যন্ত্ৰৰ পৰা নতুন তথ্য লিখিবলৈ উথালে, কিন্তু একো লিখিবলৈ নাছিল!\n" +"অতি সম্ভৱ এইটো ALSA চালক '%s' ৰ এটা বাগ । অনুগ্ৰহ কৰি এই সমস্যা ALSA বিকাশকক " +"জনাওক ।\n" +"POLLOUT নিৰ্ধাৰিত হোৱাৰি পিছতো আমি উথিলো -- কিন্তু তাৰ পিছৰ snd_pcm_avail() এ ০ " +"দিলে বা অন্য এটা মান < min_avail." + +#: ../src/modules/alsa/alsa-source.c:506 ../src/modules/alsa/alsa-source.c:656 +#, c-format +msgid "" +"ALSA woke us up to read new data from the device, but there was actually " +"nothing to read!\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers.\n" +"We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() " +"returned 0 or another value < min_avail." +msgstr "" +"ALSA ই আমাক যন্ত্ৰৰ পৰা নতুন তথ্য পঢ়িবলৈ উথালে, কিন্তু একো পঢ়িবলৈ নাছিল!\n" +"অতি সম্ভৱ এইটো ALSA চালক '%s' ৰ এটা বাগ । অনুগ্ৰহ কৰি এই সমস্যা ALSA বিকাশকক " +"জনাওক ।\n" +"POLLIN নিৰ্ধাৰিত হোৱাৰি পিছতো আমি উথিলো -- কিন্তু তাৰ পিছৰ snd_pcm_avail() এ ০ " +"দিলে বা অন্য এটা মান < min_avail." + +#: ../src/modules/alsa/module-alsa-card.c:152 +#: ../src/modules/bluetooth/module-bluetooth-device.c:2228 +#: ../src/modules/alsa/alsa-mixer.c:2931 +msgid "Off" +msgstr "বন্ধ" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2184 +msgid "High Fidelity Playback (A2DP)" +msgstr "High Fidelity Playback (A2DP)" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2198 +msgid "High Fidelity Capture (A2DP)" +msgstr "হাই-ফিডেলিটি ক্যাপচার (A2DP)" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2213 +msgid "Telephony Duplex (HSP/HFP)" +msgstr "Telephony Duplex (HSP/HFP)" + +#: ../src/modules/reserve-wrap.c:151 +msgid "PulseAudio Sound Server" +msgstr "PulseAudio ধ্বনি সেৱক" + +#: ../src/modules/module-rygel-media-server.c:569 +#: ../src/modules/module-rygel-media-server.c:583 +msgid "Output Devices" +msgstr "" + +#: ../src/modules/module-rygel-media-server.c:570 +#: ../src/modules/module-rygel-media-server.c:584 +msgid "Input Devices" +msgstr "" + +#: ../src/modules/module-rygel-media-server.c:774 +msgid "Audio on @HOSTNAME@" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1701 +msgid "Input" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1702 +msgid "Docking Station Input" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1703 +msgid "Docking Station Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1704 +msgid "Line-In" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1705 +msgid "Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1706 +msgid "External Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1707 +#, fuzzy +msgid "Internal Microphone" +msgstr "আভ্যন্তৰীণ অ'ডিঅ'" + +#: ../src/modules/alsa/alsa-mixer.c:1708 +msgid "Radio" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1709 +msgid "Video" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1710 +msgid "Automatic Gain Control" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1711 +msgid "No Automatic Gain Control" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1712 +msgid "Boost" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1713 +msgid "No Boost" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1714 +msgid "Amplifier" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1715 +msgid "No Amplifier" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1773 +msgid "Analog Input" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1774 +msgid "Analog Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1775 +msgid "Analog Line-In" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1776 +msgid "Analog Radio" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1777 +msgid "Analog Video" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1778 +msgid "Analog Output" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1779 +msgid "Analog Headphones" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1780 +msgid "Analog Output (LFE)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1781 +msgid "Analog Mono Output" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1981 +#, fuzzy, c-format +msgid "%s+%s" +msgstr "%s %s" + +#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404 +#, fuzzy, c-format +msgid "%s / %s" +msgstr "%s %s" + +#: ../src/modules/alsa/alsa-mixer.c:2790 +msgid "Analog Mono" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2791 +#, fuzzy +msgid "Analog Stereo" +msgstr "স্টিৰিও" + +#: ../src/modules/alsa/alsa-mixer.c:2792 +#, fuzzy +msgid "Analog Surround 2.1" +msgstr "ছাৰাউণ্ড ৪.১" + +#: ../src/modules/alsa/alsa-mixer.c:2793 +#, fuzzy +msgid "Analog Surround 3.0" +msgstr "ছাৰাউণ্ড ৪.০" + +#: ../src/modules/alsa/alsa-mixer.c:2794 +#, fuzzy +msgid "Analog Surround 3.1" +msgstr "ছাৰাউণ্ড ৪.১" + +#: ../src/modules/alsa/alsa-mixer.c:2795 +#, fuzzy +msgid "Analog Surround 4.0" +msgstr "ছাৰাউণ্ড ৪.০" + +#: ../src/modules/alsa/alsa-mixer.c:2796 +#, fuzzy +msgid "Analog Surround 4.1" +msgstr "ছাৰাউণ্ড ৪.১" + +#: ../src/modules/alsa/alsa-mixer.c:2797 +#, fuzzy +msgid "Analog Surround 5.0" +msgstr "ছাৰাউণ্ড ৫.০" + +#: ../src/modules/alsa/alsa-mixer.c:2798 +#, fuzzy +msgid "Analog Surround 5.1" +msgstr "ছাৰাউণ্ড ৫.১" + +#: ../src/modules/alsa/alsa-mixer.c:2799 +#, fuzzy +msgid "Analog Surround 6.0" +msgstr "ছাৰাউণ্ড ৪.০" + +#: ../src/modules/alsa/alsa-mixer.c:2800 +#, fuzzy +msgid "Analog Surround 6.1" +msgstr "ছাৰাউণ্ড ৪.১" + +#: ../src/modules/alsa/alsa-mixer.c:2801 +#, fuzzy +msgid "Analog Surround 7.0" +msgstr "ছাৰাউণ্ড ৪.০" + +#: ../src/modules/alsa/alsa-mixer.c:2802 +#, fuzzy +msgid "Analog Surround 7.1" +msgstr "ছাৰাউণ্ড ৭.১" + +#: ../src/modules/alsa/alsa-mixer.c:2803 +msgid "Digital Stereo (IEC958)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2804 +msgid "Digital Surround 4.0 (IEC958)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2805 +msgid "Digital Surround 4.0 (IEC958/AC3)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2806 +msgid "Digital Surround 5.1 (IEC958/AC3)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2807 +msgid "Digital Stereo (HDMI)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2928 +msgid "Analog Mono Duplex" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2929 +msgid "Analog Stereo Duplex" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2930 +msgid "Digital Stereo Duplex (IEC958)" +msgstr "" diff --git a/po/bn_IN.po b/po/bn_IN.po new file mode 100644 index 0000000..45adef1 --- /dev/null +++ b/po/bn_IN.po @@ -0,0 +1,2594 @@ +# translation of pulseaudio.master-tx.bn_IN.po to Bengali INDIA +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Runa Bhattacharjee , 2009. +# Runa Bhattacharjee , 2009. +msgid "" +msgstr "" +"Project-Id-Version: pulseaudio.master-tx.bn_IN\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-09-29 23:47+0200\n" +"PO-Revision-Date: 2009-09-10 17:08+0530\n" +"Last-Translator: Runa Bhattacharjee \n" +"Language-Team: Bengali INDIA \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629 +#, c-format +msgid "%s %s" +msgstr "%s %s" + +#: ../src/modules/alsa/alsa-util.c:1106 +#, c-format +msgid "" +"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu " +"ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_avail() থেকে প্রাপ্ত মান অত্যাধিক বড়: %lu বাইট (%lu ms)।\n" +"সম্ভবত এটি ALSA ড্রাইভার '%s'-র একটি বাগ। অনুগ্রহ করে এই সমস্যা সম্বন্ধে ALSA " +"ডিভেলপরদের সূচিত করুন।" + +#: ../src/modules/alsa/alsa-util.c:1147 +#, c-format +msgid "" +"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%" +"lu ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_delay() থেকে প্রাপ্ত মান অত্যাধিক বড়: %li বাইট (%s%lu ms)।\n" +"সম্ভবত এটি ALSA ড্রাইভার '%s'-র একটি বাগ। অনুগ্রহ করে এই সমস্যা সম্বন্ধে ALSA " +"ডিভেলপরদের সূচিত করুন।" + +#: ../src/modules/alsa/alsa-util.c:1194 +#, c-format +msgid "" +"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes " +"(%lu ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_mmap_begin() থেকে প্রাপ্ত মান অত্যাধিক বড়: %lu বাইট (%lu ms)।\n" +"সম্ভবত এটি ALSA ড্রাইভার '%s'-র একটি বাগ। অনুগ্রহ করে এই সমস্যা সম্বন্ধে ALSA " +"ডিভেলপরদের সূচিত করুন।" + +#: ../src/modules/module-always-sink.c:39 +msgid "Always keeps at least one sink loaded even if it's a null one" +msgstr "" +"সর্বদা অন্তত একটি sink লোড করে রাখা হবে, প্রয়োজনে null sink ব্যবহার করা হবে" + +#: ../src/modules/module-always-sink.c:83 +msgid "Dummy Output" +msgstr "ডামি আউটপুট" + +#: ../src/modules/module-ladspa-sink.c:49 +msgid "Virtual LADSPA sink" +msgstr "ভার্চুয়াল LADSPA sink" + +#: ../src/modules/module-ladspa-sink.c:53 +msgid "" +"sink_name= sink_properties= " +"master= format= rate= " +"channels= channel_map= plugin= label= control=" +msgstr "" +"sink_name= sink_properties= " +"master= format= rate= " +"channels= channel_map= plugin= label= control=" + +#: ../src/modules/module-null-sink.c:55 +msgid "Clocked NULL sink" +msgstr "NULL sink-র সময় নির্ধারণ" + +#: ../src/modules/module-null-sink.c:291 +msgid "Null Output" +msgstr "Null ফলাফল" + +#: ../src/pulsecore/sink.c:2613 +msgid "Internal Audio" +msgstr "অভ্যন্তরীণ অডিও" + +#: ../src/pulsecore/sink.c:2618 +msgid "Modem" +msgstr "মোডেম" + +#: ../src/daemon/ltdl-bind-now.c:124 +msgid "Failed to find original lt_dlopen loader." +msgstr "মূল lt_dlopen লোডার সনাক্ত করতে ব্যর্থ।" + +#: ../src/daemon/ltdl-bind-now.c:129 +msgid "Failed to allocate new dl loader." +msgstr "নতুন dl লোডার বরাদ্দ করতে ব্যর্থ।" + +#: ../src/daemon/ltdl-bind-now.c:142 +msgid "Failed to add bind-now-loader." +msgstr "bind-now-loader যোগ করতে ব্যর্থ।" + +#: ../src/daemon/main.c:141 +#, c-format +msgid "Got signal %s." +msgstr "%s সিগন্যাল প্রাপ্ত হয়েছে।" + +#: ../src/daemon/main.c:168 +msgid "Exiting." +msgstr "প্রস্থান করা হচ্ছে।" + +#: ../src/daemon/main.c:186 +#, c-format +msgid "Failed to find user '%s'." +msgstr "'%s' ব্যবহারকারী সন্ধান করতে ব্যর্থ।" + +#: ../src/daemon/main.c:191 +#, c-format +msgid "Failed to find group '%s'." +msgstr "দল '%s' সন্ধান করতে ব্যর্থ।" + +#: ../src/daemon/main.c:195 +#, c-format +msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)." +msgstr "ব্যবহারকারী '%s' (UID %lu) ও দল '%s' (GID %lu) প্রাপ্ত হয়েছে।" + +#: ../src/daemon/main.c:200 +#, c-format +msgid "GID of user '%s' and of group '%s' don't match." +msgstr "'%s' ব্যবহারকারীর ও '%s' দলের GID-র মধ্যে গরমিল।" + +#: ../src/daemon/main.c:205 +#, c-format +msgid "Home directory of user '%s' is not '%s', ignoring." +msgstr "" +"'%s' ব্যবহারকারী ব্যক্তিগত ডিরেক্টরি রূপে '%s' ধার্য করা হয়নি, অগ্রাহ্য করা হবে।" + +#: ../src/daemon/main.c:208 ../src/daemon/main.c:213 +#, c-format +msgid "Failed to create '%s': %s" +msgstr "'%s' নির্মাণ করতে ব্যর্থ: %s" + +#: ../src/daemon/main.c:220 +#, c-format +msgid "Failed to change group list: %s" +msgstr "দলের তালিকা পরিবর্তন করতে ব্যর্থ: %s" + +#: ../src/daemon/main.c:236 +#, c-format +msgid "Failed to change GID: %s" +msgstr "GID পরিবর্তন করতে ব্যর্থ: %s" + +#: ../src/daemon/main.c:252 +#, c-format +msgid "Failed to change UID: %s" +msgstr "UID পরিবর্তন করতে ব্যর্থ: %s" + +#: ../src/daemon/main.c:271 +msgid "Successfully dropped root privileges." +msgstr "root-র অধিকার সাফল্যের সাথে বর্জন করা হয়েছে।" + +#: ../src/daemon/main.c:279 +msgid "System wide mode unsupported on this platform." +msgstr "এই প্ল্যাটফর্মে, সিস্টেমব্যাপী মোড সমর্থিত নয়।" + +#: ../src/daemon/main.c:297 +#, c-format +msgid "setrlimit(%s, (%u, %u)) failed: %s" +msgstr "setrlimit(%s, (%u, %u)) বিফল: %s" + +#: ../src/daemon/main.c:474 +msgid "Failed to parse command line." +msgstr "কমান্ড-লাইন পার্স করতে ব্যর্থ।" + +#: ../src/daemon/main.c:541 +msgid "Daemon not running" +msgstr "ডেমন চলছে না" + +#: ../src/daemon/main.c:543 +#, c-format +msgid "Daemon running as PID %u" +msgstr "PID %u রূপে ডেমন চলছে" + +#: ../src/daemon/main.c:553 +#, c-format +msgid "Failed to kill daemon: %s" +msgstr "ডেমন kill করতে ব্যর্থ: %s" + +#: ../src/daemon/main.c:571 +msgid "" +"This program is not intended to be run as root (unless --system is " +"specified)." +msgstr "" +"root পরিচয়ে এই প্রোগ্রামটি সঞ্চালিত হওয়া উচিত নয় (যদি না --system উল্লিখিত হয়)।" + +#: ../src/daemon/main.c:573 +msgid "Root privileges required." +msgstr "Root-র অধিকার আবশ্যক।" + +#: ../src/daemon/main.c:578 +msgid "--start not supported for system instances." +msgstr "সিস্টেম ইনস্ট্যান্সের ক্ষেত্রে --start সমর্থিত নয়।" + +#: ../src/daemon/main.c:583 +msgid "Running in system mode, but --disallow-exit not set!" +msgstr "সিস্টেম মোডে চলছে, কিন্তু --disallow-exit নির্ধারিত হয়নি!" + +#: ../src/daemon/main.c:586 +msgid "Running in system mode, but --disallow-module-loading not set!" +msgstr "সিস্টেম মোডে চলছে, কিন্তু --disallow-module-loading নির্ধারিত হয়নি!" + +#: ../src/daemon/main.c:589 +msgid "Running in system mode, forcibly disabling SHM mode!" +msgstr "সিস্টেম মোডে চলছে, SHM মোড বলপূর্বক নিষ্ক্রিয় করা হচ্ছে!" + +# http://linux.die.net/man/1/pulseaudio এখানে রেফারেন্স পাওয়া যাবে +#: ../src/daemon/main.c:594 +msgid "Running in system mode, forcibly disabling exit idle time!" +msgstr "" +"সিস্টেম মোডে চলছে, কর্মহীন অবস্থার জন্য ধার্য সময়সীমা পূর্তী পরে প্রস্থানের ব্যবস্থা " +"বলপূর্বক নিষ্ক্রিয় করা হচ্ছে!" + +#: ../src/daemon/main.c:621 +msgid "Failed to acquire stdio." +msgstr "stdio প্রাপ্ত করতে ব্যর্থ।" + +#: ../src/daemon/main.c:627 +#, c-format +msgid "pipe failed: %s" +msgstr "পাইপ বিফল: %s" + +#: ../src/daemon/main.c:632 +#, c-format +msgid "fork() failed: %s" +msgstr "fork() বিফল: %s" + +#: ../src/daemon/main.c:646 ../src/utils/pacat.c:508 +#, c-format +msgid "read() failed: %s" +msgstr "read() বিফল: %s" + +#: ../src/daemon/main.c:652 +msgid "Daemon startup failed." +msgstr "ডেমন আরম্ভ করতে বিফল।" + +#: ../src/daemon/main.c:654 +msgid "Daemon startup successful." +msgstr "সাফল্যের সাথে ডেমন আরম্ভ করা হয়েছে।" + +#: ../src/daemon/main.c:731 +#, c-format +msgid "This is PulseAudio %s" +msgstr "এটি PulseAudio %s" + +#: ../src/daemon/main.c:732 +#, c-format +msgid "Compilation host: %s" +msgstr "কম্পাইলেশনের হোস্ট: %s" + +#: ../src/daemon/main.c:733 +#, c-format +msgid "Compilation CFLAGS: %s" +msgstr "কম্পাইলশনের CFLAGS: %s" + +#: ../src/daemon/main.c:736 +#, c-format +msgid "Running on host: %s" +msgstr "চিহ্নিত হোস্টে চলছে: %s" + +#: ../src/daemon/main.c:739 +#, c-format +msgid "Found %u CPUs." +msgstr "%u CPU পাওয়া গিয়েছে।" + +#: ../src/daemon/main.c:741 +#, c-format +msgid "Page size is %lu bytes" +msgstr "পেজের মাপ %lu বাইট" + +#: ../src/daemon/main.c:744 +msgid "Compiled with Valgrind support: yes" +msgstr "Valgrind সমর্থন সহ কম্পাইল করা হয়েছে: হ্যাঁ" + +#: ../src/daemon/main.c:746 +msgid "Compiled with Valgrind support: no" +msgstr "Valgrind সমর্থন সহ কম্পাইল করা হয়েছে: না" + +#: ../src/daemon/main.c:749 +#, c-format +msgid "Running in valgrind mode: %s" +msgstr "valgrind মোডে চলছে: %s" + +#: ../src/daemon/main.c:752 +msgid "Optimized build: yes" +msgstr "সর্বাপেক্ষ উত্তম বিল্ড: হ্যাঁ" + +#: ../src/daemon/main.c:754 +msgid "Optimized build: no" +msgstr "সর্বাপেক্ষ উত্তম বিল্ড: না" + +#: ../src/daemon/main.c:758 +msgid "NDEBUG defined, all asserts disabled." +msgstr "NDEBUG ব্যাখ্যা করা হয়েছে, সকল অ্যাসার্ট নিষ্ক্রিয় করা হয়েছে।" + +#: ../src/daemon/main.c:760 +msgid "FASTPATH defined, only fast path asserts disabled." +msgstr "FASTPATH ব্যাখ্যা করা হয়েছে, শুধুমাত্র ফাস্ট পাথ অ্যাসার্ট নিষ্ক্রিয় করা হয়েছে।" + +#: ../src/daemon/main.c:762 +msgid "All asserts enabled." +msgstr "সকল অ্যাসার্ট সক্রিয় করা হয়েছে।" + +#: ../src/daemon/main.c:766 +msgid "Failed to get machine ID" +msgstr "মেশিন ID প্রাপ্ত করতে ব্যর্থ" + +#: ../src/daemon/main.c:769 +#, c-format +msgid "Machine ID is %s." +msgstr "মেশিন ID হল %s।" + +#: ../src/daemon/main.c:773 +#, c-format +msgid "Session ID is %s." +msgstr "সেশান ID হল %s।" + +#: ../src/daemon/main.c:779 +#, c-format +msgid "Using runtime directory %s." +msgstr "রান-টাইম ডিরেক্টরি %s ব্যবহার করা হচ্ছে।" + +#: ../src/daemon/main.c:784 +#, c-format +msgid "Using state directory %s." +msgstr "অবস্থাসূচক ডিরেক্টরি %s ব্যবহার করা হচ্ছে।" + +#: ../src/daemon/main.c:787 +#, c-format +msgid "Using modules directory %s." +msgstr "মডিউল ডিরেক্টরি %s ব্যবহার করা হচ্ছে।" + +#: ../src/daemon/main.c:789 +#, c-format +msgid "Running in system mode: %s" +msgstr "সিস্টেম মোডে চলছে: %s" + +#: ../src/daemon/main.c:792 +msgid "" +"OK, so you are running PA in system mode. Please note that you most likely " +"shouldn't be doing that.\n" +"If you do it nonetheless then it's your own fault if things don't work as " +"expected.\n" +"Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an " +"explanation why system mode is usually a bad idea." +msgstr "" +"আপনি সিস্টেম মোডে PA সঞ্চালিত করছেন এবং এটি না করাই বাঞ্ছনীয়।\n" +"এর ফলে প্রত্যাশামত ফলাফল না পাওয়ার সম্ভাবনা রয়েছে।\n" +"সিস্টেম মোডে ব্যবহারের সমস্যা সম্পর্কে জানতে হলে http://pulseaudio.org/wiki/" +"WhatIsWrongWithSystemMode দেখুন।" + +#: ../src/daemon/main.c:809 +msgid "pa_pid_file_create() failed." +msgstr "pa_pid_file_create() ব্যর্থ।" + +#: ../src/daemon/main.c:819 +msgid "Fresh high-resolution timers available! Bon appetit!" +msgstr "উচ্চ-রেসোলিউশনের নতুন টাইমার উপলব্ধ রয়েছে! পরীক্ষা করে দেখুন!" + +#: ../src/daemon/main.c:821 +msgid "" +"Dude, your kernel stinks! The chef's recommendation today is Linux with high-" +"resolution timers enabled!" +msgstr "উচ্চ-রেসোলিউশনের নতুন টাইমার সহ Linux সক্রিয় করা বাঞ্ছনীয়!" + +#: ../src/daemon/main.c:844 +msgid "pa_core_new() failed." +msgstr "pa_core_new() ব্যর্থ।" + +#: ../src/daemon/main.c:904 +msgid "Failed to initialize daemon." +msgstr "ডেমন আরম্ভ করতে ব্যর্থ।" + +#: ../src/daemon/main.c:909 +msgid "Daemon startup without any loaded modules, refusing to work." +msgstr "" +"লোড করা মডিউল বিনা ডেমন আরম্ভ করা হয়েছে এবং কোনো কর্ম সঞ্চালন করা সম্ভব নয়।" + +#: ../src/daemon/main.c:926 +msgid "Daemon startup complete." +msgstr "ডেমন আরম্ভ করা হয়েছে।" + +#: ../src/daemon/main.c:932 +msgid "Daemon shutdown initiated." +msgstr "ডেমন বন্ধ করার প্রক্রিয়া আরম্ভ করা হয়েছে।" + +#: ../src/daemon/main.c:954 +msgid "Daemon terminated." +msgstr "ডেমন বন্ধ করা হয়েছে।" + +#: ../src/daemon/cmdline.c:115 +#, c-format +msgid "" +"%s [options]\n" +"\n" +"COMMANDS:\n" +" -h, --help Show this help\n" +" --version Show version\n" +" --dump-conf Dump default configuration\n" +" --dump-modules Dump list of available modules\n" +" --dump-resample-methods Dump available resample methods\n" +" --cleanup-shm Cleanup stale shared memory " +"segments\n" +" --start Start the daemon if it is not " +"running\n" +" -k --kill Kill a running daemon\n" +" --check Check for a running daemon (only " +"returns exit code)\n" +"\n" +"OPTIONS:\n" +" --system[=BOOL] Run as system-wide instance\n" +" -D, --daemonize[=BOOL] Daemonize after startup\n" +" --fail[=BOOL] Quit when startup fails\n" +" --high-priority[=BOOL] Try to set high nice level\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_NICE)\n" +" --realtime[=BOOL] Try to enable realtime scheduling\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_RTPRIO)\n" +" --disallow-module-loading[=BOOL] Disallow module user requested " +"module\n" +" loading/unloading after startup\n" +" --disallow-exit[=BOOL] Disallow user requested exit\n" +" --exit-idle-time=SECS Terminate the daemon when idle and " +"this\n" +" time passed\n" +" --module-idle-time=SECS Unload autoloaded modules when idle " +"and\n" +" this time passed\n" +" --scache-idle-time=SECS Unload autoloaded samples when idle " +"and\n" +" this time passed\n" +" --log-level[=LEVEL] Increase or set verbosity level\n" +" -v Increase the verbosity level\n" +" --log-target={auto,syslog,stderr} Specify the log target\n" +" --log-meta[=BOOL] Include code location in log " +"messages\n" +" --log-time[=BOOL] Include timestamps in log messages\n" +" --log-backtrace=FRAMES Include a backtrace in log messages\n" +" -p, --dl-search-path=PATH Set the search path for dynamic " +"shared\n" +" objects (plugins)\n" +" --resample-method=METHOD Use the specified resampling method\n" +" (See --dump-resample-methods for\n" +" possible values)\n" +" --use-pid-file[=BOOL] Create a PID file\n" +" --no-cpu-limit[=BOOL] Do not install CPU load limiter on\n" +" platforms that support it.\n" +" --disable-shm[=BOOL] Disable shared memory support.\n" +"\n" +"STARTUP SCRIPT:\n" +" -L, --load=\"MODULE ARGUMENTS\" Load the specified plugin module " +"with\n" +" the specified argument\n" +" -F, --file=FILENAME Run the specified script\n" +" -C Open a command line on the running " +"TTY\n" +" after startup\n" +"\n" +" -n Don't load default script file\n" +msgstr "" +"%s [options]\n" +"\n" +"COMMANDS:\n" +" -h, --help সাহায্যের এই বার্তা প্রদর্শন করা হবে\n" +" --version সংস্করণ প্রদর্শন করা হবে\n" +" --dump-conf ডিফল্ট কনফিগারেশন ডাম্প করা হবে\n" +" --dump-modules উপলব্ধ মডিউলের তালিকা ডাম্প করা হবে\n" +" --dump-resample-methods উপলব্ধ রি-স্যাম্পেলের পদ্ধতি ডাম্প করা " +"হবে\n" +" --cleanup-shm যৌথরূপে ব্যবহৃত মেমরির পুরোনো অংশগুলি " +"পরিশ্রুত করা হবে\n" +" --start ডেমন সক্রিয় না হলে তা আরম্ভ করুন\n" +" -k --kill চলমান ডেমন kill করুন\n" +" --check চলমান ডেমন পরীক্ষা করুন (শুধুমাত্র এক্সিট " +"কোড উৎপন্ন হবে)\n" +"\n" +"OPTIONS:\n" +" --system[=BOOL] সিস্টেমব্যাপী ইন্সট্যান্স রূপে সঞ্চালিত " +"হবে\n" +" -D, --daemonize[=BOOL] আরম্ভের পরে ডেমন নির্মাণ করা হবে\n" +" --fail[=BOOL] আরম্ভ করতে ব্যর্থ হলে প্রস্থান করা হবে\n" +" --high-priority[=BOOL] nice-র উচ্চ মাত্রা ধার্যের প্রচেষ্টা করা " +"হবে\n" +" (root, SUID অথবা\n" +" উচ্চ মাত্রার RLIMIT_NICE-র ক্ষেত্রে " +"উপলব্ধ করা হবে)\n" +" --realtime[=BOOL] রিয়েল-টাইম শিডিউলিং সক্রিয় করার " +"প্রচেষ্টা করুন\n" +" (root, SUID অথবা\n" +" উচ্চ মাত্রার RLIMIT_RTPRIO-র ক্ষেত্রে " +"উপলব্ধ করা হবে)\n" +" --disallow-module-loading[=BOOL] Disallow module user requested " +"module\n" +" loading/unloading after startup\n" +" --disallow-exit[=BOOL] ব্যবহারকারী দ্বারা প্রস্থানের অনুরোধ " +"গ্রাহ্য করা হবে না\n" +" --exit-idle-time=SECS কর্মহীন অবস্থায় চিহ্নিত সময় অতিবাহিত " +"হলে, ডেমনটি\n" +" বন্ধ করুন\n" +" --module-idle-time=SECS কর্মহীন অবস্থায় চিহ্নিত সময় অতিবাহিত " +"হলে, অটো-লোড করা\n" +" মডিউলগুলি আন-লোড করুন\n" +" --scache-idle-time=SECS কর্মহীন অবস্থায় চিহ্নিত সময় অতিবাহিত " +"হলে, অটো-লোড করা\n" +" স্যাম্পেলগুলি আন-লোড করুন\n" +" --log-level[=LEVEL] ভার্বোসিটির মাত্রা বৃদ্ধি অথবা নির্ধারণ " +"করুন\n" +" -v ভার্বোসিটির মাত্রা বৃদ্ধি করুন\n" +" --log-target={auto,syslog,stderr} লগের উদ্দিষ্ট স্থান উল্লেখ করা হবে\n" +" --log-meta[=BOOL] লগ-বার্তার মধ্যে কোডের অবস্থান অন্তর্ভুক্ত " +"করা হবে\n" +" --log-time[=BOOL] লগ-বার্তার মধ্যে সময় অন্তর্ভুক্ত করা হবে\n" +" --log-backtrace=FRAMES লগ-বার্তার মধ্যে ব্যাক-ট্রেস অন্তর্ভুক্ত করা " +"হবে\n" +" -p, --dl-search-path=PATH পরিবর্তনশীল যৌথব্যবহারের অবজেক্ট (প্লাগ-" +"ইন) অনুসন্ধানের\n" +" পাথ নির্ধারণ করুন\n" +" --resample-method=METHOD উল্লিখিত রি-স্যাম্পলিং পদ্ধতি প্রয়োগ করা " +"হবে\n" +" (সম্ভাব্য মান জানার জন্য --dump-" +"resample-methods\n" +" দেখুন)\n" +" --use-pid-file[=BOOL] একটি PID ফাইল নির্মাণ করুন\n" +" --no-cpu-limit[=BOOL] Do not install CPU load limiter on\n" +" platforms that support it.\n" +" --disable-shm[=BOOL] যৌথ মেমরি ব্যবহারের সমর্থন নিষ্ক্রিয় করা " +"হবে।\n" +"\n" +"STARTUP SCRIPT:\n" +" -L, --load=\"MODULE ARGUMENTS\" চিহ্নিত আর্গুমেন্ট সহ, উল্লিখিত প্লাগ-" +"ইন\n" +" লোড করা হবে\n" +" -F, --file=FILENAME চিহ্নিত স্ক্রিপ্ট সঞ্চালন করুন\n" +" -C প্রারম্ভের পরে চলমান TTY-র মধ্যে একটি " +"কমান্ড-লাইন\n" +" আরম্ভ করুন\n" +"\n" +" -n ডিফল্ট স্ক্রিপ্ট ফাইল লোড করা হবে না\n" + +#: ../src/daemon/cmdline.c:247 +msgid "--daemonize expects boolean argument" +msgstr "--daemonize দ্বারা বুলিয়ান আর্গুমেন্ট প্রত্যাশিত" + +#: ../src/daemon/cmdline.c:254 +msgid "--fail expects boolean argument" +msgstr "--fail দ্বারা বুলিয়ান আর্গুমেন্ট প্রত্যাশিত" + +#: ../src/daemon/cmdline.c:264 +msgid "" +"--log-level expects log level argument (either numeric in range 0..4 or one " +"of debug, info, notice, warn, error)." +msgstr "" +"--log-level-র ক্ষেত্রে লগ স্তরের আর্গুমেন্ট প্রত্যাশিত (0..4 সীমার মধ্যে একটি সংখ্যা " +"অথবা debug, info, notice, warn, ও error-র মধ্যে একটি মান)।" + +#: ../src/daemon/cmdline.c:276 +msgid "--high-priority expects boolean argument" +msgstr "--high-priority দ্বারা বুলিয়ান আর্গুমেন্ট প্রত্যাশিত" + +#: ../src/daemon/cmdline.c:283 +msgid "--realtime expects boolean argument" +msgstr "--realtime দ্বারা বুলিয়ান আর্গুমেন্ট প্রত্যাশিত" + +#: ../src/daemon/cmdline.c:290 +msgid "--disallow-module-loading expects boolean argument" +msgstr "--disallow-module-loading দ্বারা বুলিয়ান আর্গুমেন্ট প্রত্যাশিত" + +#: ../src/daemon/cmdline.c:297 +msgid "--disallow-exit expects boolean argument" +msgstr "--disallow-exit দ্বারা বুলিয়ান আর্গুমেন্ট প্রত্যাশিত" + +#: ../src/daemon/cmdline.c:304 +msgid "--use-pid-file expects boolean argument" +msgstr "--use-pid-file দ্বারা বুলিয়ান আর্গুমেন্ট প্রত্যাশিত" + +#: ../src/daemon/cmdline.c:321 +msgid "Invalid log target: use either 'syslog', 'stderr' or 'auto'." +msgstr "লগের উদ্দিষ্ট স্থন বৈধ নয়: 'syslog', 'stderr' অথবা 'auto' প্রয়োগ করুন।" + +#: ../src/daemon/cmdline.c:328 +msgid "--log-time expects boolean argument" +msgstr "--log-time দ্বারা বুলিয়ান আর্গুমেন্ট প্রত্যাশিত" + +#: ../src/daemon/cmdline.c:335 +msgid "--log-meta expects boolean argument" +msgstr "--log-meta দ্বারা বুলিয়ান আর্গুমেন্ট প্রত্যাশিত" + +#: ../src/daemon/cmdline.c:354 +#, c-format +msgid "Invalid resample method '%s'." +msgstr "রি-স্যাম্পেল পদ্ধতি '%s' বৈধ নয়।" + +#: ../src/daemon/cmdline.c:361 +msgid "--system expects boolean argument" +msgstr "--system দ্বারা বুলিয়ান আর্গুমেন্ট প্রত্যাশিত" + +#: ../src/daemon/cmdline.c:368 +msgid "--no-cpu-limit expects boolean argument" +msgstr "--no-cpu-limit দ্বারা বুলিয়ান আর্গুমেন্ট প্রত্যাশিত" + +#: ../src/daemon/cmdline.c:375 +msgid "--disable-shm expects boolean argument" +msgstr "--disable-shm দ্বারা বুলিয়ান আর্গুমেন্ট প্রত্যাশিত" + +#: ../src/daemon/dumpmodules.c:60 +#, c-format +msgid "Name: %s\n" +msgstr "নাম: %s\n" + +#: ../src/daemon/dumpmodules.c:63 +#, c-format +msgid "No module information available\n" +msgstr "মডিউল সংক্রান্ত কোনো তথ্য উপলব্ধ নেই\n" + +#: ../src/daemon/dumpmodules.c:66 +#, c-format +msgid "Version: %s\n" +msgstr "সংস্করণ: %s\n" + +#: ../src/daemon/dumpmodules.c:68 +#, c-format +msgid "Description: %s\n" +msgstr "বিবরণ: %s\n" + +#: ../src/daemon/dumpmodules.c:70 +#, c-format +msgid "Author: %s\n" +msgstr "নির্মাতা: %s\n" + +#: ../src/daemon/dumpmodules.c:72 +#, c-format +msgid "Usage: %s\n" +msgstr "ব্যবহার পদ্ধতি: %s\n" + +#: ../src/daemon/dumpmodules.c:73 +#, c-format +msgid "Load Once: %s\n" +msgstr "একবার লোড করা হবে: %s\n" + +#: ../src/daemon/dumpmodules.c:75 +#, c-format +msgid "DEPRECATION WARNING: %s\n" +msgstr "অবচিত করার সতর্কবার্তা: %s\n" + +#: ../src/daemon/dumpmodules.c:79 +#, c-format +msgid "Path: %s\n" +msgstr "পাথ: %s\n" + +#: ../src/daemon/daemon-conf.c:232 +#, c-format +msgid "[%s:%u] Invalid log target '%s'." +msgstr "[%s:%u] লগ টার্গেট '%s' বৈধ নয়।" + +#: ../src/daemon/daemon-conf.c:248 +#, c-format +msgid "[%s:%u] Invalid log level '%s'." +msgstr "[%s:%u] লগের স্তর '%s' বৈধ নয়।" + +#: ../src/daemon/daemon-conf.c:264 +#, c-format +msgid "[%s:%u] Invalid resample method '%s'." +msgstr "[%s:%u] রি-স্যাম্পেল পদ্ধতি '%s' বৈধ নয়।" + +#: ../src/daemon/daemon-conf.c:287 +#, c-format +msgid "[%s:%u] Invalid rlimit '%s'." +msgstr "[%s:%u] rlimit '%s' বৈধ নয়।" + +#: ../src/daemon/daemon-conf.c:294 +#, c-format +msgid "[%s:%u] rlimit not supported on this platform." +msgstr "[%s:%u] এই প্ল্যাটফর্মে rlimit সমর্থিত নয়।" + +#: ../src/daemon/daemon-conf.c:310 +#, c-format +msgid "[%s:%u] Invalid sample format '%s'." +msgstr "[%s:%u] স্যাম্পেলের বিন্যাস '%s' বৈধ নয়।" + +#: ../src/daemon/daemon-conf.c:328 +#, c-format +msgid "[%s:%u] Invalid sample rate '%s'." +msgstr "[%s:%u] স্যাম্পেলের মাত্রা '%s' বৈধ নয়।" + +#: ../src/daemon/daemon-conf.c:352 +#, c-format +msgid "[%s:%u] Invalid sample channels '%s'." +msgstr "[%s:%u] স্যাম্পেলের চ্যানেল '%s' বৈধ নয়" + +#: ../src/daemon/daemon-conf.c:370 +#, c-format +msgid "[%s:%u] Invalid channel map '%s'." +msgstr "[%s:%u] চ্যানেল ম্যাপ '%s' বৈধ নয়।" + +#: ../src/daemon/daemon-conf.c:388 +#, c-format +msgid "[%s:%u] Invalid number of fragments '%s'." +msgstr "[%s:%u] অংশ সংখ্যা '%s' বৈধ নয়।" + +#: ../src/daemon/daemon-conf.c:406 +#, c-format +msgid "[%s:%u] Invalid fragment size '%s'." +msgstr "[%s:%u] অংশের মাপ '%s' বৈধ নয়।" + +#: ../src/daemon/daemon-conf.c:424 +#, c-format +msgid "[%s:%u] Invalid nice level '%s'." +msgstr "[%s:%u] nice স্তর '%s' বৈধ নয়।" + +#: ../src/daemon/daemon-conf.c:546 +#, c-format +msgid "Failed to open configuration file: %s" +msgstr "কনফিগারেশন ফাইল খুলতে ব্যর্থ: %s" + +#: ../src/daemon/daemon-conf.c:562 +msgid "" +"The specified default channel map has a different number of channels than " +"the specified default number of channels." +msgstr "" +"ডিফল্ট চ্যানেল ম্যাপের মধ্যে অন্তর্ভুক্ত চ্যানেলের সংখ্যা ও চ্যানেলের ডিফল্ট সংখ্যার মধ্যে " +"গরমিল।" + +#: ../src/daemon/daemon-conf.c:638 +#, c-format +msgid "### Read from configuration file: %s ###\n" +msgstr "### চিহ্নিত কনফিগারেশন ফাইল থেকে পড়া হবে: %s ###\n" + +#: ../src/daemon/caps.c:62 +msgid "Cleaning up privileges." +msgstr "অধিকার বর্জন করা হচ্ছে।" + +#: ../src/daemon/pulseaudio.desktop.in.h:1 +msgid "PulseAudio Sound System" +msgstr "PulseAudio শব্দ ব্যবস্থা" + +#: ../src/daemon/pulseaudio.desktop.in.h:2 +msgid "Start the PulseAudio Sound System" +msgstr "PulseAudio শব্দ ব্যবস্থা আরম্ভ করা হবে" + +#: ../src/pulse/channelmap.c:105 ../src/pulse/channelmap.c:757 +msgid "Mono" +msgstr "মোনো" + +#: ../src/pulse/channelmap.c:107 +msgid "Front Center" +msgstr "সামনে কেন্দ্রস্থিত" + +#: ../src/pulse/channelmap.c:108 +msgid "Front Left" +msgstr "সামনে বাঁদিকে" + +#: ../src/pulse/channelmap.c:109 +msgid "Front Right" +msgstr "সামনে ডানদিকে" + +#: ../src/pulse/channelmap.c:111 +msgid "Rear Center" +msgstr "পিছনে কেন্দ্রস্থিত" + +#: ../src/pulse/channelmap.c:112 +msgid "Rear Left" +msgstr "পিছনে বাঁদিকে" + +#: ../src/pulse/channelmap.c:113 +msgid "Rear Right" +msgstr "পিছনে ডানদিকে" + +#: ../src/pulse/channelmap.c:115 +msgid "Low Frequency Emmiter" +msgstr "কম ফ্রিকোয়েন্সির নিঃসরণকারী" + +#: ../src/pulse/channelmap.c:117 +msgid "Front Left-of-center" +msgstr "সামনে কেন্দ্রের-বাঁদিকে" + +#: ../src/pulse/channelmap.c:118 +msgid "Front Right-of-center" +msgstr "সামনে কেন্দ্রের-ডানদিকে" + +#: ../src/pulse/channelmap.c:120 +msgid "Side Left" +msgstr "পাশে বাঁদিকে" + +#: ../src/pulse/channelmap.c:121 +msgid "Side Right" +msgstr "পাশে ডানদিকে" + +#: ../src/pulse/channelmap.c:123 +msgid "Auxiliary 0" +msgstr "অক্সিলারি ০" + +#: ../src/pulse/channelmap.c:124 +msgid "Auxiliary 1" +msgstr "অক্সিলারি ১" + +#: ../src/pulse/channelmap.c:125 +msgid "Auxiliary 2" +msgstr "অক্সিলারি ২" + +#: ../src/pulse/channelmap.c:126 +msgid "Auxiliary 3" +msgstr "অক্সিলারি ৩" + +#: ../src/pulse/channelmap.c:127 +msgid "Auxiliary 4" +msgstr "অক্সিলারি ৪" + +#: ../src/pulse/channelmap.c:128 +msgid "Auxiliary 5" +msgstr "অক্সিলারি ৫" + +#: ../src/pulse/channelmap.c:129 +msgid "Auxiliary 6" +msgstr "অক্সিলারি ৬" + +#: ../src/pulse/channelmap.c:130 +msgid "Auxiliary 7" +msgstr "অক্সিলারি ৭" + +#: ../src/pulse/channelmap.c:131 +msgid "Auxiliary 8" +msgstr "অক্সিলারি ৮" + +#: ../src/pulse/channelmap.c:132 +msgid "Auxiliary 9" +msgstr "অক্সিলারি ৯" + +#: ../src/pulse/channelmap.c:133 +msgid "Auxiliary 10" +msgstr "অক্সিলারি ১০" + +#: ../src/pulse/channelmap.c:134 +msgid "Auxiliary 11" +msgstr "অক্সিলারি ১১" + +#: ../src/pulse/channelmap.c:135 +msgid "Auxiliary 12" +msgstr "অক্সিলারি ১২" + +#: ../src/pulse/channelmap.c:136 +msgid "Auxiliary 13" +msgstr "অক্সিলারি ১৩" + +#: ../src/pulse/channelmap.c:137 +msgid "Auxiliary 14" +msgstr "অক্সিলারি ১৪" + +#: ../src/pulse/channelmap.c:138 +msgid "Auxiliary 15" +msgstr "অক্সিলারি ১৫" + +#: ../src/pulse/channelmap.c:139 +msgid "Auxiliary 16" +msgstr "অক্সিলারি ১৬" + +#: ../src/pulse/channelmap.c:140 +msgid "Auxiliary 17" +msgstr "অক্সিলারি ১৭" + +#: ../src/pulse/channelmap.c:141 +msgid "Auxiliary 18" +msgstr "অক্সিলারি ১৮" + +#: ../src/pulse/channelmap.c:142 +msgid "Auxiliary 19" +msgstr "অক্সিলারি ১৯" + +#: ../src/pulse/channelmap.c:143 +msgid "Auxiliary 20" +msgstr "অক্সিলারি ২০" + +#: ../src/pulse/channelmap.c:144 +msgid "Auxiliary 21" +msgstr "অক্সিলারি ২১" + +#: ../src/pulse/channelmap.c:145 +msgid "Auxiliary 22" +msgstr "অক্সিলারি ২২" + +#: ../src/pulse/channelmap.c:146 +msgid "Auxiliary 23" +msgstr "অক্সিলারি ২৩" + +#: ../src/pulse/channelmap.c:147 +msgid "Auxiliary 24" +msgstr "অক্সিলারি ২৪" + +#: ../src/pulse/channelmap.c:148 +msgid "Auxiliary 25" +msgstr "অক্সিলারি ২৫" + +#: ../src/pulse/channelmap.c:149 +msgid "Auxiliary 26" +msgstr "অক্সিলারি ২৬" + +#: ../src/pulse/channelmap.c:150 +msgid "Auxiliary 27" +msgstr "অক্সিলারি ২৭" + +#: ../src/pulse/channelmap.c:151 +msgid "Auxiliary 28" +msgstr "অক্সিলারি ২৮" + +#: ../src/pulse/channelmap.c:152 +msgid "Auxiliary 29" +msgstr "অক্সিলারি ২৯" + +#: ../src/pulse/channelmap.c:153 +msgid "Auxiliary 30" +msgstr "অক্সিলারি ৩০" + +#: ../src/pulse/channelmap.c:154 +msgid "Auxiliary 31" +msgstr "অক্সিলারি ৩১" + +#: ../src/pulse/channelmap.c:156 +msgid "Top Center" +msgstr "উপরে কেন্দ্রস্থিত" + +#: ../src/pulse/channelmap.c:158 +msgid "Top Front Center" +msgstr "উপরে সামনে কেন্দ্রস্থিত" + +#: ../src/pulse/channelmap.c:159 +msgid "Top Front Left" +msgstr "উপরে সামনে বাঁদিকে" + +#: ../src/pulse/channelmap.c:160 +msgid "Top Front Right" +msgstr "উপরে সামনে ডানদিকে" + +#: ../src/pulse/channelmap.c:162 +msgid "Top Rear Center" +msgstr "উপরে পিছনে কেন্দ্রস্থিত" + +#: ../src/pulse/channelmap.c:163 +msgid "Top Rear Left" +msgstr "উপরে পিছনে বাঁদিকে" + +#: ../src/pulse/channelmap.c:164 +msgid "Top Rear Right" +msgstr "উপরে পিছনে ডানদিকে" + +#: ../src/pulse/channelmap.c:484 ../src/pulse/sample.c:170 +#: ../src/pulse/volume.c:295 ../src/pulse/volume.c:321 +#: ../src/pulse/volume.c:341 ../src/pulse/volume.c:371 +msgid "(invalid)" +msgstr "(অবৈধ)" + +#: ../src/pulse/channelmap.c:761 +msgid "Stereo" +msgstr "স্টিরিও" + +#: ../src/pulse/channelmap.c:766 +msgid "Surround 4.0" +msgstr "সারাউন্ড ৪.০" + +#: ../src/pulse/channelmap.c:772 +msgid "Surround 4.1" +msgstr "সারাউন্ড ৪.১" + +#: ../src/pulse/channelmap.c:778 +msgid "Surround 5.0" +msgstr "সারাউন্ড ৫.০" + +#: ../src/pulse/channelmap.c:784 +msgid "Surround 5.1" +msgstr "সারাউন্ড ৫.১" + +#: ../src/pulse/channelmap.c:791 +msgid "Surround 7.1" +msgstr "সারাউন্ড ৭.১" + +#: ../src/pulse/error.c:43 +msgid "OK" +msgstr "ঠিক আছে" + +#: ../src/pulse/error.c:44 +msgid "Access denied" +msgstr "ব্যবহারাধিকার প্রত্যাখ্যাত" + +#: ../src/pulse/error.c:45 +msgid "Unknown command" +msgstr "অজানা কমান্ড" + +#: ../src/pulse/error.c:46 +msgid "Invalid argument" +msgstr "অবৈধ আর্গুমেন্ট" + +#: ../src/pulse/error.c:47 +msgid "Entity exists" +msgstr "এনটিটি উপস্থিত রয়েছে" + +#: ../src/pulse/error.c:48 +msgid "No such entity" +msgstr "এই ধরনের কোনো এনটিটি উপস্থিত নেই" + +#: ../src/pulse/error.c:49 +msgid "Connection refused" +msgstr "সংযোগ প্রত্যাখ্যান করা হয়েছে" + +#: ../src/pulse/error.c:50 +msgid "Protocol error" +msgstr "প্রোটোকল সংক্রান্ত ত্রুটি" + +#: ../src/pulse/error.c:51 +msgid "Timeout" +msgstr "সময়সীমা" + +#: ../src/pulse/error.c:52 +msgid "No authorization key" +msgstr "কোনো অনুমোদনের-কি নেই" + +#: ../src/pulse/error.c:53 +msgid "Internal error" +msgstr "অভ্যন্তরীণ ত্রুটি" + +#: ../src/pulse/error.c:54 +msgid "Connection terminated" +msgstr "সংযোগ বন্ধ করা হয়েছে" + +#: ../src/pulse/error.c:55 +msgid "Entity killed" +msgstr "এনটিটি kill করা হয়েছে" + +#: ../src/pulse/error.c:56 +msgid "Invalid server" +msgstr "সার্ভার বৈধ নয়" + +#: ../src/pulse/error.c:57 +msgid "Module initalization failed" +msgstr "মডিউল আরম্ভ করতে ব্যর্থ" + +#: ../src/pulse/error.c:58 +msgid "Bad state" +msgstr "অবস্থা সঠিক নয়" + +#: ../src/pulse/error.c:59 +msgid "No data" +msgstr "তথ্য অনুপস্থিত " + +#: ../src/pulse/error.c:60 +msgid "Incompatible protocol version" +msgstr "প্রোটোকলের সংস্করণে গরমিল" + +#: ../src/pulse/error.c:61 +msgid "Too large" +msgstr "অত্যাধিক বড়" + +#: ../src/pulse/error.c:62 +msgid "Not supported" +msgstr "সমর্থিত নয়" + +#: ../src/pulse/error.c:63 +msgid "Unknown error code" +msgstr "অজানা ত্রুটির কোড" + +#: ../src/pulse/error.c:64 +msgid "No such extension" +msgstr "এই ধরনের কোনো এক্সটেনশন নেই" + +#: ../src/pulse/error.c:65 +msgid "Obsolete functionality" +msgstr "অবচিত বৈশিষ্ট্য" + +#: ../src/pulse/error.c:66 +msgid "Missing implementation" +msgstr "অনুপস্থিত বাস্তবায়ন" + +#: ../src/pulse/error.c:67 +msgid "Client forked" +msgstr "ক্লায়েন্ট ফর্ক করা হয়েছে" + +#: ../src/pulse/error.c:68 +msgid "Input/Output error" +msgstr "" + +#: ../src/pulse/error.c:69 +msgid "Device or resource busy" +msgstr "" + +#: ../src/pulse/sample.c:172 +#, c-format +msgid "%s %uch %uHz" +msgstr "%s %uch %uHz" + +#: ../src/pulse/sample.c:184 +#, c-format +msgid "%0.1f GiB" +msgstr "%0.1f গিবিবাইট" + +#: ../src/pulse/sample.c:186 +#, c-format +msgid "%0.1f MiB" +msgstr "%0.1f মিবিবাইট" + +#: ../src/pulse/sample.c:188 +#, c-format +msgid "%0.1f KiB" +msgstr "%0.1f কিবিবাইট" + +#: ../src/pulse/sample.c:190 +#, c-format +msgid "%u B" +msgstr "%u বাইট" + +#: ../src/pulse/client-conf-x11.c:55 ../src/utils/pax11publish.c:100 +msgid "XOpenDisplay() failed" +msgstr "XOpenDisplay() ব্যর্থ" + +#: ../src/pulse/client-conf-x11.c:93 +msgid "Failed to parse cookie data" +msgstr "কুকির তথ্য পার্স করতে ব্যর্থ" + +#: ../src/pulse/client-conf.c:111 +#, c-format +msgid "Failed to open configuration file '%s': %s" +msgstr "কনফিগারেশন ফাইল '%s' খুলতে ব্যর্থ: %s" + +#: ../src/pulse/context.c:550 +msgid "No cookie loaded. Attempting to connect without." +msgstr "কোনো কুকি লোড করা হয়নি। কুকি বিনা সংযোগের প্রচেষ্টা করা হচ্ছে।" + +#: ../src/pulse/context.c:693 +#, c-format +msgid "fork(): %s" +msgstr "fork(): %s" + +#: ../src/pulse/context.c:748 +#, c-format +msgid "waitpid(): %s" +msgstr "waitpid(): %s" + +#: ../src/pulse/context.c:1438 +#, c-format +msgid "Received message for unknown extension '%s'" +msgstr "অজানা এক্সটেনশন '%s'-র জন্য বার্তা প্রাপ্ত হয়েছে" + +# drain a stream = যখন স্ট্রিমের মধ্যে উপস্থিত সকল তথ্য আহরণ করা হয় ও স্ট্রিমটি সম্পূর্ণরূপে ফাঁকা হয়ে যায়। +#: ../src/utils/pacat.c:108 +#, c-format +msgid "Failed to drain stream: %s" +msgstr "স্ট্রিম ড্রেইন (অর্থাৎ ফাঁকা) করতে ব্যর্থ: %s" + +#: ../src/utils/pacat.c:113 +msgid "Playback stream drained." +msgstr "প্লে-ব্যাক স্ট্রিম ফাঁকা করা হয়েছে।" + +#: ../src/utils/pacat.c:123 +msgid "Draining connection to server." +msgstr "সার্ভারের সাথে স্থাপিত সংযোগ ফাঁকা করা হচ্ছে।" + +#: ../src/utils/pacat.c:136 +#, c-format +msgid "pa_stream_drain(): %s" +msgstr "pa_stream_drain(): %s" + +#: ../src/utils/pacat.c:159 +#, c-format +msgid "pa_stream_write() failed: %s" +msgstr "pa_stream_write() ব্যর্থ: %s" + +#: ../src/utils/pacat.c:197 +#, c-format +msgid "pa_stream_begin_write() failed: %s" +msgstr "pa_stream_write() ব্যর্থ: %s" + +#: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267 +#, c-format +msgid "pa_stream_peek() failed: %s" +msgstr "pa_stream_peek() ব্যর্থ: %s" + +#: ../src/utils/pacat.c:307 +msgid "Stream successfully created." +msgstr "সাফল্যের সাথে স্ট্রিম নির্মিত হয়েছে।" + +#: ../src/utils/pacat.c:310 +#, c-format +msgid "pa_stream_get_buffer_attr() failed: %s" +msgstr "pa_stream_get_buffer_attr() ব্যর্থ: %s" + +#: ../src/utils/pacat.c:314 +#, c-format +msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u" +msgstr "বাফারের মাপ: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u" + +#: ../src/utils/pacat.c:317 +#, c-format +msgid "Buffer metrics: maxlength=%u, fragsize=%u" +msgstr "বাফারের মাপ: maxlength=%u, fragsize=%u" + +#: ../src/utils/pacat.c:321 +#, c-format +msgid "Using sample spec '%s', channel map '%s'." +msgstr "স্যাম্পেলের spec '%s', ও চ্যানেল ম্যাপ '%s' ব্যবহার করা হচ্ছে।" + +#: ../src/utils/pacat.c:325 +#, c-format +msgid "Connected to device %s (%u, %ssuspended)." +msgstr "ডিভাইস %s-র সাথে সংযোগ করা হয়েছে (%u, %ssuspended)।" + +#: ../src/utils/pacat.c:335 +#, c-format +msgid "Stream error: %s" +msgstr "ষ্ট্রিম সংক্রান্ত ত্রুটি: %s" + +#: ../src/utils/pacat.c:345 +#, c-format +msgid "Stream device suspended.%s" +msgstr "স্ট্রিম ডিভাইস স্থগিত করা হয়েছে। %s" + +#: ../src/utils/pacat.c:347 +#, c-format +msgid "Stream device resumed.%s" +msgstr "স্ট্রিম ডিভাইস পুনরারম্ভ করা হয়েছে। %s" + +# underrun = ধীর গতির স্ট্রিম +#: ../src/utils/pacat.c:355 +#, c-format +msgid "Stream underrun.%s" +msgstr "ধীর গতির স্ট্রিম.%s" + +# overrun=the stream fills up the allocated buffer space and there is no more space for it +#: ../src/utils/pacat.c:362 +#, c-format +msgid "Stream overrun.%s" +msgstr "স্ট্রিম মাত্রা অতিক্রম করেছে।%s" + +#: ../src/utils/pacat.c:369 +#, c-format +msgid "Stream started.%s" +msgstr "স্ট্রিম আরম্ভ করা হয়েছে। %s" + +#: ../src/utils/pacat.c:376 +#, c-format +msgid "Stream moved to device %s (%u, %ssuspended).%s" +msgstr "%s ডিভাইসে স্ট্রিম স্থানান্তর করা হয়েছে (%u, %ssuspended)।%s" + +#: ../src/utils/pacat.c:376 +msgid "not " +msgstr "না " + +#: ../src/utils/pacat.c:383 +#, c-format +msgid "Stream buffer attributes changed.%s" +msgstr "স্ট্রিম বাফারের অ্যাট্রিবিউট পরিবর্তিত হয়েছে। %s" + +#: ../src/utils/pacat.c:415 +#, c-format +msgid "Connection established.%s" +msgstr "সংযোগ স্থাপিত হয়েছে।%s" + +#: ../src/utils/pacat.c:418 +#, c-format +msgid "pa_stream_new() failed: %s" +msgstr "pa_stream_new() ব্যর্থ: %s" + +#: ../src/utils/pacat.c:450 +#, c-format +msgid "pa_stream_connect_playback() failed: %s" +msgstr "pa_stream_connect_playback() ব্যর্থ: %s" + +#: ../src/utils/pacat.c:456 +#, c-format +msgid "pa_stream_connect_record() failed: %s" +msgstr "pa_stream_connect_record() ব্যর্থ: %s" + +#: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857 +#, c-format +msgid "Connection failure: %s" +msgstr "সংযোগ বিফল: %s" + +#: ../src/utils/pacat.c:503 +msgid "Got EOF." +msgstr "ফাইলের সমাপ্তি সনাক্ত হয়েছে।" + +#: ../src/utils/pacat.c:540 +#, c-format +msgid "write() failed: %s" +msgstr "write() ব্যর্থ: %s" + +#: ../src/utils/pacat.c:561 +msgid "Got signal, exiting." +msgstr "সিগন্যাল প্রাপ্ত হয়েছে, প্রস্থান করা হবে।" + +# latency here = delay (technical term +#: ../src/utils/pacat.c:575 +#, c-format +msgid "Failed to get latency: %s" +msgstr "লেটেন্সির পরিমাণ প্রাপ্ত করতে ব্যর্থ: %s" + +#: ../src/utils/pacat.c:580 +#, c-format +msgid "Time: %0.3f sec; Latency: %0.0f usec." +msgstr "সময়: %0.3f সেকেন্ড; লেটেন্সি: %0.0f usec।" + +#: ../src/utils/pacat.c:599 +#, c-format +msgid "pa_stream_update_timing_info() failed: %s" +msgstr "pa_stream_update_timing_info() ব্যর্থ: %s" + +# reverting this to english because the command line text gets messed up +#: ../src/utils/pacat.c:609 +#, c-format +msgid "" +"%s [options]\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -r, --record Create a connection for recording\n" +" -p, --playback Create a connection for playback\n" +"\n" +" -v, --verbose Enable verbose operations\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -d, --device=DEVICE The name of the sink/source to " +"connect to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" +" --stream-name=NAME How to call this stream on the " +"server\n" +" --volume=VOLUME Specify the initial (linear) volume " +"in range 0...65536\n" +" --rate=SAMPLERATE The sample rate in Hz (defaults to " +"44100)\n" +" --format=SAMPLEFORMAT The sample type, one of s16le, " +"s16be, u8, float32le,\n" +" float32be, ulaw, alaw, s32le, s32be, " +"s24le, s24be,\n" +" s24-32le, s24-32be (defaults to " +"s16ne)\n" +" --channels=CHANNELS The number of channels, 1 for mono, " +"2 for stereo\n" +" (defaults to 2)\n" +" --channel-map=CHANNELMAP Channel map to use instead of the " +"default\n" +" --fix-format Take the sample format from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-rate Take the sampling rate from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-channels Take the number of channels and the " +"channel map\n" +" from the sink the stream is being " +"connected to.\n" +" --no-remix Don't upmix or downmix channels.\n" +" --no-remap Map channels by index instead of " +"name.\n" +" --latency=BYTES Request the specified latency in " +"bytes.\n" +" --process-time=BYTES Request the specified process time " +"per request in bytes.\n" +" --property=PROPERTY=VALUE Set the specified property to the " +"specified value.\n" +" --raw Record/play raw PCM data.\n" +" --file-format=FFORMAT Record/play formatted PCM data.\n" +" --list-file-formats List available file formats.\n" +msgstr "" +"%s [options]\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -r, --record Create a connection for recording\n" +" -p, --playback Create a connection for playback\n" +"\n" +" -v, --verbose Enable verbose operations\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -d, --device=DEVICE The name of the sink/source to " +"connect to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" +" --stream-name=NAME How to call this stream on the " +"server\n" +" --volume=VOLUME Specify the initial (linear) volume " +"in range 0...65536\n" +" --rate=SAMPLERATE The sample rate in Hz (defaults to " +"44100)\n" +" --format=SAMPLEFORMAT The sample type, one of s16le, " +"s16be, u8, float32le,\n" +" float32be, ulaw, alaw, s32le, s32be, " +"s24le, s24be,\n" +" s24-32le, s24-32be (defaults to " +"s16ne)\n" +" --channels=CHANNELS The number of channels, 1 for mono, " +"2 for stereo\n" +" (defaults to 2)\n" +" --channel-map=CHANNELMAP Channel map to use instead of the " +"default\n" +" --fix-format Take the sample format from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-rate Take the sampling rate from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-channels Take the number of channels and the " +"channel map\n" +" from the sink the stream is being " +"connected to.\n" +" --no-remix Don't upmix or downmix channels.\n" +" --no-remap Map channels by index instead of " +"name.\n" +" --latency=BYTES Request the specified latency in " +"bytes.\n" +" --process-time=BYTES Request the specified process time " +"per request in bytes.\n" +" --property=PROPERTY=VALUE Set the specified property to the " +"specified value.\n" +" --raw Record/play raw PCM data.\n" +" --file-format=FFORMAT Record/play formatted PCM data.\n" +" --list-file-formats List available file formats.\n" + +#: ../src/utils/pacat.c:731 +#, c-format +msgid "" +"pacat %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pacat %s\n" +"libpulse সহযোগে কম্পাইল করা হয়েছে %s\n" +"libpulse-র সাথে যুক্ত %s\n" + +#: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953 +#, c-format +msgid "Invalid client name '%s'" +msgstr "ক্লায়েন্টের নাম '%s' বৈধ নয়" + +#: ../src/utils/pacat.c:779 +#, c-format +msgid "Invalid stream name '%s'" +msgstr "স্ট্রিমের নাম '%s' বৈধ নয়।" + +#: ../src/utils/pacat.c:816 +#, c-format +msgid "Invalid channel map '%s'" +msgstr "চ্যানেল ম্যাপ '%s' বৈধ নয়" + +#: ../src/utils/pacat.c:845 +#, c-format +msgid "Invalid latency specification '%s'" +msgstr "লেটেন্সির জন্য নির্ধারিত বৈশিষ্ট্য '%s' বৈধ নয়" + +#: ../src/utils/pacat.c:852 +#, c-format +msgid "Invalid process time specification '%s'" +msgstr "প্রসেসের সময়ের বৈশিষ্ট্য '%s' বৈধ নয়" + +#: ../src/utils/pacat.c:864 +#, c-format +msgid "Invalid property '%s'" +msgstr "বৈশিষ্ট্য '%s' বৈধ নয়।" + +#: ../src/utils/pacat.c:881 +#, c-format +msgid "Unknown file format %s." +msgstr "ফাইলের অজানা বিন্যাস %s।" + +#: ../src/utils/pacat.c:900 +msgid "Invalid sample specification" +msgstr "অবৈধ স্যাম্পেল নির্ধারিত" + +#: ../src/utils/pacat.c:910 +#, c-format +msgid "open(): %s" +msgstr "open(): %s" + +#: ../src/utils/pacat.c:915 +#, c-format +msgid "dup2(): %s" +msgstr "dup2(): %s" + +#: ../src/utils/pacat.c:922 +msgid "Too many arguments." +msgstr "অত্যাধিক আর্গুমেন্ট।" + +#: ../src/utils/pacat.c:933 +msgid "Failed to generate sample specification for file." +msgstr "স্যাম্পেলের মান নির্ধারণের ফাইল নির্মাণ করতে ব্যর্থ" + +#: ../src/utils/pacat.c:953 +msgid "Failed to open audio file." +msgstr "শব্দের ফাইল খুলতে ব্যর্থ।" + +#: ../src/utils/pacat.c:959 +msgid "" +"Warning: specified sample specification will be overwritten with " +"specification from file." +msgstr "" +"সতর্কবার্তা: চিহ্নিত স্যাম্পেল নির্ধারণের ফাইলটির তথ্য, এই ফাইলের থেকে উপলব্ধ তথ্য " +"দ্বারা প্রতিস্থাপিত হবে।" + +#: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997 +msgid "Failed to determine sample specification from file." +msgstr "ফাইল থেকে স্যাম্পেল সংক্রান্ত তথ্য প্রাপ্ত করতে ব্যর্থ।" + +#: ../src/utils/pacat.c:971 +msgid "Warning: Failed to determine channel map from file." +msgstr "সতর্কবার্তা: ফাইল থেকে চ্যানেলের ম্যাপ নির্ধারণ করতে ব্যর্থ।" + +#: ../src/utils/pacat.c:982 +msgid "Channel map doesn't match sample specification" +msgstr "চ্যানেলের ম্যাপ ও স্যাম্পেলের নির্ধারিত মানে গরমিল" + +#: ../src/utils/pacat.c:993 +msgid "Warning: failed to write channel map to file." +msgstr "সতর্কবার্তা: ফাইলের মধ্যে চ্যানেলের ম্যাপ লিখতে ব্যর্থ।" + +#: ../src/utils/pacat.c:1008 +#, c-format +msgid "" +"Opening a %s stream with sample specification '%s' and channel map '%s'." +msgstr "" +"একটি %s স্ট্রিম খোলা হচ্ছে। এটির জন্য '%s'-র স্যাম্পেলের নির্ধারিত মান ও '%s' " +"চ্যানেলের ম্যাপ প্রয়োগ করা হবে।" + +#: ../src/utils/pacat.c:1009 +msgid "recording" +msgstr "রেকর্ড করা হচ্ছে" + +#: ../src/utils/pacat.c:1009 +msgid "playback" +msgstr "প্লে-ব্যাক" + +#: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267 +msgid "pa_mainloop_new() failed." +msgstr "pa_mainloop_new() ব্যর্থ।" + +#: ../src/utils/pacat.c:1054 +msgid "io_new() failed." +msgstr "io_new() ব্যর্থ।" + +#: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279 +msgid "pa_context_new() failed." +msgstr "pa_context_new() ব্যর্থ।" + +#: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285 +#, c-format +msgid "pa_context_connect() failed: %s" +msgstr "pa_context_connect() ব্যর্থ: %s" + +#: ../src/utils/pacat.c:1075 +msgid "pa_context_rttime_new() failed." +msgstr "pa_context_rttime_new() ব্যর্থ।" + +#: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290 +msgid "pa_mainloop_run() failed." +msgstr "pa_mainloop_run() ব্যর্থ।" + +#: ../src/utils/pasuspender.c:81 +#, c-format +msgid "fork(): %s\n" +msgstr "fork(): %s\n" + +#: ../src/utils/pasuspender.c:92 +#, c-format +msgid "execvp(): %s\n" +msgstr "execvp(): %s\n" + +#: ../src/utils/pasuspender.c:109 +#, c-format +msgid "Failure to suspend: %s\n" +msgstr "স্থগিত করতে ব্যর্থ: %s\n" + +#: ../src/utils/pasuspender.c:124 +#, c-format +msgid "Failure to resume: %s\n" +msgstr "পুনরারম্ভ করতে ব্যর্থ: %s\n" + +#: ../src/utils/pasuspender.c:147 +#, c-format +msgid "WARNING: Sound server is not local, not suspending.\n" +msgstr "সতর্কবার্তা: শব্দের সার্ভারটি স্থানীয় নয় ও স্থগিত করা হচ্ছে না।\n" + +#: ../src/utils/pasuspender.c:159 +#, c-format +msgid "Connection failure: %s\n" +msgstr "সংযোগ বিফল: %s\n" + +#: ../src/utils/pasuspender.c:176 +#, c-format +msgid "Got SIGINT, exiting.\n" +msgstr "SIGINT প্রাপ্ত হয়েছে, প্রস্থান করা হয়েছে।\n" + +#: ../src/utils/pasuspender.c:194 +#, c-format +msgid "WARNING: Child process terminated by signal %u\n" +msgstr "সতর্কবার্তা: সিগন্যাল %u দ্বারা চাইল্ড প্রসেস বন্ধ করা হয়েছে\n" + +#: ../src/utils/pasuspender.c:212 +#, c-format +msgid "" +"%s [options] ... \n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +"\n" +msgstr "" +"%s [options] ... \n" +"\n" +" -h, --help এই সাহায্য বার্তা প্রদর্শন করা হবে\n" +" --version সংস্করণ প্রদর্শন করা হবে\n" +" -s, --server=SERVER সংযোগ করার উদ্দেশ্যে চিহ্নিত সার্ভারের " +"নাম\n" +"\n" + +#: ../src/utils/pasuspender.c:248 +#, c-format +msgid "" +"pasuspender %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pasuspender %s\n" +"libpulse সহযোগে কম্পাইল করা হয়েছে %s\n" +"libpulse-র সাথে যুক্ত %s\n" + +#: ../src/utils/pasuspender.c:277 +#, c-format +msgid "pa_mainloop_new() failed.\n" +msgstr "pa_mainloop_new() ব্যর্থ।\n" + +#: ../src/utils/pasuspender.c:290 +#, c-format +msgid "pa_context_new() failed.\n" +msgstr "pa_context_new() ব্যর্থ।\n" + +#: ../src/utils/pasuspender.c:298 +#, c-format +msgid "pa_mainloop_run() failed.\n" +msgstr "pa_mainloop_run() ব্যর্থ।\n" + +#: ../src/utils/pactl.c:135 +#, c-format +msgid "Failed to get statistics: %s" +msgstr "পরিসংখ্যান প্রাপ্ত করতে ব্যর্থ: %s" + +#: ../src/utils/pactl.c:141 +#, c-format +msgid "Currently in use: %u blocks containing %s bytes total.\n" +msgstr "বর্তমানে ব্যবহৃত: %u ব্লকের মধ্যে উপস্থিত সর্বমোট %s বাইট।\n" + +#: ../src/utils/pactl.c:144 +#, c-format +msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n" +msgstr "" +"সম্পূর্ণ কর্মকালের জন্য বরাদ্দ করা হয়েছে: %u ব্লকের মধ্যে উপস্থিত সর্বমোট %s বাইট।\n" + +#: ../src/utils/pactl.c:147 +#, c-format +msgid "Sample cache size: %s\n" +msgstr "স্যাম্পেল ক্যাশের মাপ: %s\n" + +#: ../src/utils/pactl.c:156 +#, c-format +msgid "Failed to get server information: %s" +msgstr "সার্ভার সংক্রান্ত তথ্য প্রাপ্ত করতে ব্যর্থ: %s" + +#: ../src/utils/pactl.c:164 +#, c-format +msgid "" +"User name: %s\n" +"Host Name: %s\n" +"Server Name: %s\n" +"Server Version: %s\n" +"Default Sample Specification: %s\n" +"Default Channel Map: %s\n" +"Default Sink: %s\n" +"Default Source: %s\n" +"Cookie: %08x\n" +msgstr "" +"ব্যবহারকারীর নাম: %s\n" +"হোস্ট-নেম: %s\n" +"সার্ভারের নাম: %s\n" +"সার্ভারের সংস্করণ: %s\n" +"স্যাম্পেলের ডিফল্ট নির্ধারিত মান: %s\n" +"ডিফল্ট চ্যানেল ম্যাপ: %s\n" +"ডিফল্ট সিংক: %s\n" +"ডিফল্ট সোর্স: %s\n" +"কুকি: %08x\n" + +#: ../src/utils/pactl.c:205 +#, c-format +msgid "Failed to get sink information: %s" +msgstr "sink সংক্রান্ত তথ্য প্রাপ্ত করতে ব্যর্থ: %s" + +#: ../src/utils/pactl.c:221 +#, c-format +msgid "" +"Sink #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor Source: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"সিংক #%u\n" +"\tঅবস্থা: %s\n" +"\tনাম: %s\n" +"\tবিবরণ: %s\n" +"\tড্রাইভার: %s\n" +"\tস্যাম্পেলের বৈশিষ্ট্য: %s\n" +"\tচ্যানেল ম্যাপ: %s\n" +"\tচিহ্নিত মডিউলের মালিকানাধীন: %u\n" +"\tনিঃশব্দ: %s\n" +"\tআওয়াজ: %s%s%s\n" +"\t ভারসাম্য %0.2f\n" +"\tআওয়াজের মূল মাত্রা: %s%s%s\n" +"\tসোর্স নিরীক্ষণ: %s\n" +"\tলেটেন্সি: %0.0f usec, কনফিগার করা হয়েছে %0.0f usec\n" +"\tফ্ল্যাগ: %s%s%s%s%s%s\n" +"\tবিবিধ বৈশিষ্ট্য:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360 +#, c-format +msgid "\tPorts:\n" +msgstr "\tপোর্ট:\n" + +#: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366 +#, c-format +msgid "\tActive Port: %s\n" +msgstr "\tসক্রিয় পোর্ট: %s\n" + +#: ../src/utils/pactl.c:297 +#, c-format +msgid "Failed to get source information: %s" +msgstr "উৎস সংক্রান্ত তথ্য প্রাপ্ত করতে ব্যর্থ: %s" + +#: ../src/utils/pactl.c:313 +#, c-format +msgid "" +"Source #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor of Sink: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"সোর্স #%u\n" +"\tঅবস্থা: %s\n" +"\tনাম: %s\n" +"\tবিবরণ: %s\n" +"\tড্রাইভার: %s\n" +"\tস্যাম্পেলের বৈশিষ্ট্য: %s\n" +"\tচ্যানেল ম্যাপ: %s\n" +"\tচিহ্নিত মডিউলের মালিকানাধীন: %u\n" +"\tনিঃশব্দ: %s\n" +"\tআওয়াজ: %s%s%s\n" +"\t ভারসাম্য %0.2f\n" +"\tআওয়াজের মূল মাত্রা: %s%s%s\n" +"\tসিংক নিরীক্ষণ: %s\n" +"\tলেটেন্সি: %0.0f usec, কনফিগার করা হয়েছে %0.0f usec\n" +"\tফ্ল্যাগ: %s%s%s%s%s%s\n" +"\tবিবিধ বৈশিষ্ট্য:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:345 ../src/utils/pactl.c:401 ../src/utils/pactl.c:436 +#: ../src/utils/pactl.c:473 ../src/utils/pactl.c:532 ../src/utils/pactl.c:533 +#: ../src/utils/pactl.c:543 ../src/utils/pactl.c:587 ../src/utils/pactl.c:588 +#: ../src/utils/pactl.c:594 ../src/utils/pactl.c:637 ../src/utils/pactl.c:638 +#: ../src/utils/pactl.c:645 +msgid "n/a" +msgstr "n/a" + +#: ../src/utils/pactl.c:375 +#, c-format +msgid "Failed to get module information: %s" +msgstr "মডিউল সংক্রান্ত তথ্য প্রাপ্ত করতে ব্যর্থ: %s" + +#: ../src/utils/pactl.c:393 +#, c-format +msgid "" +"Module #%u\n" +"\tName: %s\n" +"\tArgument: %s\n" +"\tUsage counter: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"মডিউল #%u\n" +"\tনাম: %s\n" +"\tআর্গুমেন্ট: %s\n" +"\tব্যবহারের সংখ্যা: %s\n" +"\tবিবিধ বৈশিষ্ট্য:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:412 +#, c-format +msgid "Failed to get client information: %s" +msgstr "ক্লায়েন্ট সংক্রান্ত তথ্য প্রাপ্ত করতে ব্যর্থ: %s" + +#: ../src/utils/pactl.c:430 +#, c-format +msgid "" +"Client #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"ক্লায়েন্ট #%u\n" +"\tড্রাইভার: %s\n" +"\tচিহ্নিত মডিউলের মালিকানাধীন: %s\n" +"\tবিবিধ বৈশিষ্ট্য:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:447 +#, c-format +msgid "Failed to get card information: %s" +msgstr "কার্ড সংক্রান্ত তথ্য প্রাপ্ত করতে ব্যর্থ: %s" + +#: ../src/utils/pactl.c:465 +#, c-format +msgid "" +"Card #%u\n" +"\tName: %s\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"কার্ড #%u\n" +"\tনাম: %s\n" +"\tড্রাইভার: %s\n" +"\tচিহ্নিত মডিউলের মালিকানাধীন: %s\n" +"\tবিবিধ বৈশিষ্ট্য:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:479 +#, c-format +msgid "\tProfiles:\n" +msgstr "\tপ্রোফাইল:\n" + +#: ../src/utils/pactl.c:485 +#, c-format +msgid "\tActive Profile: %s\n" +msgstr "\tসক্রিয় প্রোফাইল: %s\n" + +#: ../src/utils/pactl.c:496 +#, c-format +msgid "Failed to get sink input information: %s" +msgstr "sink ইনপুট সংক্রান্ত তথ্য প্রাপ্ত করতে ব্যর্থ: %s" + +#: ../src/utils/pactl.c:515 +#, c-format +msgid "" +"Sink Input #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSink: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tMute: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSink Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"সিংক ইনপুট #%u\n" +"\tড্রাইভার: %s\n" +"\tচিহ্নিত মডিউলের মালিকানাধীন: %s\n" +"\tক্লায়েন্ট: %s\n" +"\tসিংক: %u\n" +"\tস্যাম্পেলের বৈশিষ্ট্য: %s\n" +"\tচ্যানেল ম্যাপ: %s\n" +"\tনিঃশব্দ: %s\n" +"\tআওয়াজ: %s\n" +"\t %s\n" +"\t ভারসাম্য %0.2f\n" +"\tবাফারের লেটেন্সি: %0.0f usec\n" +"\tসিংকের লেটেন্সি: %0.0f usec\n" +"\tরি-স্যাম্পেলের পদ্ধতি %s\n" +"\tবিবিধ বৈশিষ্ট্য:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:554 +#, c-format +msgid "Failed to get source output information: %s" +msgstr "উৎস আউটপুট সংক্রান্ত তথ্য প্রাপ্ত করতে ব্যর্থ: %s" + +#: ../src/utils/pactl.c:574 +#, c-format +msgid "" +"Source Output #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSource: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSource Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"সোর্সের আউটপুট #%u\n" +"\tড্রাইভার: %s\n" +"\tচিহ্নিত মডিউলের মালিকানাধীন: %s\n" +"\tক্লায়েন্ট: %s\n" +"\tসোর্স: %u\n" +"\tস্যাম্পেলের বৈশিষ্ট্য: %s\n" +"\tচ্যানেলের ম্যাপ: %s\n" +"\tবাফারের লেটেন্সি: %0.0f usec\n" +"\tসোর্সের লেটেন্সি: %0.0f usec\n" +"\tরি-স্যাম্পেলের পদ্ধতি: %s\n" +"\tবিবিধ বৈশিষ্ট্য:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:605 +#, c-format +msgid "Failed to get sample information: %s" +msgstr "স্যাম্পেল সংক্রান্ত তথ্য প্রাপ্ত করতে ব্যর্থ: %s" + +# Lazy = low quality sample +#: ../src/utils/pactl.c:623 +#, c-format +msgid "" +"Sample #%u\n" +"\tName: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tDuration: %0.1fs\n" +"\tSize: %s\n" +"\tLazy: %s\n" +"\tFilename: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"স্যাম্পেল #%u\n" +"\tনাম: %s\n" +"\tস্যাম্পেলের বৈশিষ্ট্য: %s\n" +"\tচ্যানেলের ম্যাপ: %s\n" +"\tআওয়াজ: %s\n" +"\t %s\n" +"\t ভারসাম্য %0.2f\n" +"\tঅবকাল: %0.1fs\n" +"\tমাপ: %s\n" +"\tলেজি (নিম্নমান): %s\n" +"\tফাইলের নাম: %s\n" +"\tবিবিধ বৈশিষ্ট্য:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663 +#, c-format +msgid "Failure: %s" +msgstr "ব্যর্থতা: %s" + +#: ../src/utils/pactl.c:687 +#, c-format +msgid "Failed to upload sample: %s" +msgstr "স্যাম্পেল আপলোড করতে ব্যর্থ: %s" + +#: ../src/utils/pactl.c:704 +msgid "Premature end of file" +msgstr "সম্পূর্ণ হওয়ার পূর্বে ফাইল সমাপ্ত হয়েছে" + +#: ../src/utils/pactl.c:863 +msgid "Got SIGINT, exiting." +msgstr "SIGINT প্রাপ্ত হয়েছে, প্রস্থান করা হয়েছে।" + +# reverting to english because the command line output gets messed up +#: ../src/utils/pactl.c:869 +#, c-format +msgid "" +"%s [options] stat\n" +"%s [options] list\n" +"%s [options] exit\n" +"%s [options] upload-sample FILENAME [NAME]\n" +"%s [options] play-sample NAME [SINK]\n" +"%s [options] remove-sample NAME\n" +"%s [options] move-sink-input SINKINPUT SINK\n" +"%s [options] move-source-output SOURCEOUTPUT SOURCE\n" +"%s [options] load-module NAME [ARGS ...]\n" +"%s [options] unload-module MODULE\n" +"%s [options] suspend-sink SINK 1|0\n" +"%s [options] suspend-source SOURCE 1|0\n" +"%s [options] set-card-profile CARD PROFILE\n" +"%s [options] set-sink-port SINK PORT\n" +"%s [options] set-source-port SOURCE PORT\n" +"%s [options] set-sink-volume SINK VOLUME\n" +"%s [options] set-source-volume SOURCE VOLUME\n" +"%s [options] set-sink-input-volume SINKINPUT VOLUME\n" +"%s [options] set-sink-mute SINK 1|0\n" +"%s [options] set-source-mute SOURCE 1|0\n" +"%s [options] set-sink-input-mute SINKINPUT 1|0\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" +msgstr "" +"%s [options] stat\n" +"%s [options] list\n" +"%s [options] exit\n" +"%s [options] upload-sample FILENAME [NAME]\n" +"%s [options] play-sample NAME [SINK]\n" +"%s [options] remove-sample NAME\n" +"%s [options] move-sink-input SINKINPUT SINK\n" +"%s [options] move-source-output SOURCEOUTPUT SOURCE\n" +"%s [options] load-module NAME [ARGS ...]\n" +"%s [options] unload-module MODULE\n" +"%s [options] suspend-sink SINK 1|0\n" +"%s [options] suspend-source SOURCE 1|0\n" +"%s [options] set-card-profile CARD PROFILE\n" +"%s [options] set-sink-port SINK PORT\n" +"%s [options] set-source-port SOURCE PORT\n" +"%s [options] set-sink-volume SINK VOLUME\n" +"%s [options] set-source-volume SOURCE VOLUME\n" +"%s [options] set-sink-input-volume SINKINPUT VOLUME\n" +"%s [options] set-sink-mute SINK 1|0\n" +"%s [options] set-source-mute SOURCE 1|0\n" +"%s [options] set-sink-input-mute SINKINPUT 1|0\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" + +#: ../src/utils/pactl.c:933 +#, c-format +msgid "" +"pactl %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pactl %s\n" +"libpulse সহযোগে কম্পাইল করা %s\n" +"libpulse-র সাথে যুক্ত %s\n" + +#: ../src/utils/pactl.c:979 +msgid "Please specify a sample file to load" +msgstr "লোড করার উদ্দেশ্যে অনুগ্রহ করে একটি স্যাম্পেল ফাইল উল্লেখ করুন" + +#: ../src/utils/pactl.c:992 +msgid "Failed to open sound file." +msgstr "শব্দের ফাইল খুলতে ব্যর্থ।" + +#: ../src/utils/pactl.c:1004 +msgid "Warning: Failed to determine sample specification from file." +msgstr "সতর্কবার্তা: ফাইল থেকে স্যাম্পেলের নির্ধারিত মাপ নির্মাণ করতে ব্যর্থ।" + +#: ../src/utils/pactl.c:1014 +msgid "You have to specify a sample name to play" +msgstr "বাজানোর উদ্দেশ্যে একটি স্যাম্পেল ফাইল উল্লেখ করা আবশ্যক" + +#: ../src/utils/pactl.c:1026 +msgid "You have to specify a sample name to remove" +msgstr "অপসারণের উদ্দেশ্যে একটি স্যাম্পেল ফাইল উল্লেখ করা আবশ্যক" + +#: ../src/utils/pactl.c:1035 +msgid "You have to specify a sink input index and a sink" +msgstr "সিংক ইনপুট ইন্ডেক্স ও একটি সিংক নির্ধারণ করা আবশ্যক" + +#: ../src/utils/pactl.c:1045 +msgid "You have to specify a source output index and a source" +msgstr "সোর্স আউটপুট ইন্ডেক্স ও একটি সোর্স নির্ধারণ করা আবশ্যক" + +#: ../src/utils/pactl.c:1060 +msgid "You have to specify a module name and arguments." +msgstr "মডিউলের নাম ও আর্গুমেন্ট নির্ধারণ করা আবশ্যক।" + +#: ../src/utils/pactl.c:1080 +msgid "You have to specify a module index" +msgstr "মডিউল ইন্ডেক্স নির্ধারণ করা আবশ্যক" + +#: ../src/utils/pactl.c:1090 +msgid "" +"You may not specify more than one sink. You have to specify a boolean value." +msgstr "একাধিক সিংক নির্ধারণ করা যাবে না। বুলিয়েন মান নির্ধারণ করা আবশ্যক।" + +#: ../src/utils/pactl.c:1103 +msgid "" +"You may not specify more than one source. You have to specify a boolean " +"value." +msgstr "একাধিক সোর্স নির্ধারণ করা যাবে না। বুলিয়েন মান নির্ধারণ করা আবশ্যক।" + +#: ../src/utils/pactl.c:1115 +msgid "You have to specify a card name/index and a profile name" +msgstr "কার্ডের নাম/ইন্ডেক্স ও একটি প্রোফাইলের নাম উল্লেখ করা আবশ্যক" + +#: ../src/utils/pactl.c:1126 +msgid "You have to specify a sink name/index and a port name" +msgstr "sink-র নাম/ইন্ডেক্স ও একটি পোর্টের নাম উল্লেখ করা আবশ্যক" + +#: ../src/utils/pactl.c:1137 +msgid "You have to specify a source name/index and a port name" +msgstr "উৎসের নাম/ইন্ডেক্স ও একটি পোর্টে নাম উল্লেখ করা আবশ্যক" + +#: ../src/utils/pactl.c:1149 +msgid "You have to specify a sink name/index and a volume" +msgstr "sink-র নাম/ইন্ডেক্স ও একটি পোর্টের নাম উল্লেখ করা আবশ্যক" + +#: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171 +#: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209 +#: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248 +msgid "Invalid volume specification" +msgstr "অবৈধ শব্দের মাত্রা নির্ধারিত" + +#: ../src/utils/pactl.c:1166 +msgid "You have to specify a source name/index and a volume" +msgstr "উৎসের নাম/ইন্ডেক্স ও একটি শব্দের মাত্রা উল্লেখ করা আবশ্যক" + +#: ../src/utils/pactl.c:1183 +msgid "You have to specify a sink input index and a volume" +msgstr "সিংক ইনপুট ইন্ডেক্স ও শব্দের মাত্রা নির্ধারণ করা আবশ্যক" + +#: ../src/utils/pactl.c:1188 +msgid "Invalid sink input index" +msgstr "সিংক ইনপুট ইন্ডেক্স বৈধ নয়" + +#: ../src/utils/pactl.c:1204 +msgid "You have to specify a sink name/index and a mute boolean" +msgstr "sink-র নাম/ইন্ডেক্স ও একটি নিঃশব্দতার বুলিয়ান উল্লেখ করা আবশ্যক" + +#: ../src/utils/pactl.c:1221 +msgid "You have to specify a source name/index and a mute boolean" +msgstr "উৎসের নাম/ইন্ডেক্স ও নিঃশব্দতার বুলিয়ান উল্লেখ করা আবশ্যক" + +#: ../src/utils/pactl.c:1238 +msgid "You have to specify a sink input index and a mute boolean" +msgstr "সিংক ইনপুট ইন্ডেক্স ও নিঃশব্দতার বুলিয়ান নির্ধারণ করা আবশ্যক" + +#: ../src/utils/pactl.c:1243 +msgid "Invalid sink input index specification" +msgstr "অবৈধ সিংক ইনপুট ইন্ডেক্স নির্ধারিত" + +#: ../src/utils/pactl.c:1262 +msgid "No valid command specified." +msgstr "কোনো বৈধ কমান্ড নির্ধারিত হয়নি।" + +#: ../src/utils/pax11publish.c:61 +#, c-format +msgid "" +"%s [-D display] [-S server] [-O sink] [-I source] [-c file] [-d|-e|-i|-r]\n" +"\n" +" -d Show current PulseAudio data attached to X11 display (default)\n" +" -e Export local PulseAudio data to X11 display\n" +" -i Import PulseAudio data from X11 display to local environment " +"variables and cookie file.\n" +" -r Remove PulseAudio data from X11 display\n" +msgstr "" +"%s [-D display] [-S server] [-O sink] [-I source] [-c file] [-d|-e|-i|-r]\n" +"\n" +" -d X11 প্রদর্শনের সাথে যুক্ত PulseAudio-র বর্তমান তথ্য প্রদর্শন করা হবে (ডিফল্ট)\n" +" -e স্থানীয় PulseAudio-র তথ্য X11 প্রদর্শনে এক্সপোর্ট করা হবে\n" +" -i X11 প্রদর্শন থেকে PulseAudio-র তথ্য স্থানীয় এনভায়রনমেন্ট ভেরিয়েবল ও কুকি " +"ফাইলের মধ্যে ইম্পোর্ট করা হবে\n" +" -r X11 প্রদর্শন থেকে PulseAudio-র তথ্য মুছে ফেলা হবে\n" + +#: ../src/utils/pax11publish.c:94 +#, c-format +msgid "Failed to parse command line.\n" +msgstr "কমান্ড-লাইন পার্স করতে ব্যর্থ।\n" + +#: ../src/utils/pax11publish.c:108 +#, c-format +msgid "Server: %s\n" +msgstr "সার্ভার: %s\n" + +#: ../src/utils/pax11publish.c:110 +#, c-format +msgid "Source: %s\n" +msgstr "সোর্স: %s\n" + +#: ../src/utils/pax11publish.c:112 +#, c-format +msgid "Sink: %s\n" +msgstr "সিংক: %s\n" + +#: ../src/utils/pax11publish.c:114 +#, c-format +msgid "Cookie: %s\n" +msgstr "কুকি: %s\n" + +#: ../src/utils/pax11publish.c:132 +#, c-format +msgid "Failed to parse cookie data\n" +msgstr "কুকি সংক্রান্ত তথ্য পার্স করতে ব্যর্থ\n" + +#: ../src/utils/pax11publish.c:137 +#, c-format +msgid "Failed to save cookie data\n" +msgstr "কুকি সংক্রান্ত তথ্য সংরক্ষণ করতে ব্যর্থ\n" + +#: ../src/utils/pax11publish.c:152 +#, c-format +msgid "Failed to load client configuration file.\n" +msgstr "ক্লায়েন্ট কনফিগারেশন ফাইল লোড করতে ব্যর্থ।\n" + +#: ../src/utils/pax11publish.c:157 +#, c-format +msgid "Failed to read environment configuration data.\n" +msgstr "পরিবেশ কনফিগারেশন সংক্রান্ত তথ্য পড়তে ব্যর্থ।\n" + +#: ../src/utils/pax11publish.c:174 +#, c-format +msgid "Failed to get FQDN.\n" +msgstr "FQDN প্রাপ্ত করতে ব্যর্থ।\n" + +#: ../src/utils/pax11publish.c:194 +#, c-format +msgid "Failed to load cookie data\n" +msgstr "কুকি সংক্রান্ত তথ্য লোড করতে ব্যর্থ\n" + +#: ../src/utils/pax11publish.c:211 +#, c-format +msgid "Not yet implemented.\n" +msgstr "এখনো বাস্তবায়িত হয়নি।\n" + +#: ../src/utils/pacmd.c:69 +msgid "No PulseAudio daemon running, or not running as session daemon." +msgstr "PulseAudio ডেমন চলছে না অথবা সেশানের ডেমন রূপে চলছে না।" + +#: ../src/utils/pacmd.c:74 +#, c-format +msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s" +msgstr "socket(PF_UNIX, SOCK_STREAM, 0): %s" + +#: ../src/utils/pacmd.c:91 +#, c-format +msgid "connect(): %s" +msgstr "connect(): %s" + +#: ../src/utils/pacmd.c:99 +msgid "Failed to kill PulseAudio daemon." +msgstr "PulseAudio ডেমন kill করতে ব্যর্থ।" + +#: ../src/utils/pacmd.c:107 +msgid "Daemon not responding." +msgstr "ডেমন থেকে কোনো প্রতিক্রিয়া পাওয়া যাচ্ছে না।" + +#: ../src/utils/pacmd.c:161 +#, c-format +msgid "poll(): %s" +msgstr "poll(): %s" + +#: ../src/utils/pacmd.c:171 ../src/utils/pacmd.c:188 +#, c-format +msgid "read(): %s" +msgstr "read(): %s" + +#: ../src/utils/pacmd.c:207 ../src/utils/pacmd.c:223 +#, c-format +msgid "write(): %s" +msgstr "write(): %s" + +#: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:219 +msgid "Cannot access autospawn lock." +msgstr "autospawn লক প্রয়োগ করতে ব্যর্থ।" + +#: ../src/modules/alsa/alsa-sink.c:530 ../src/modules/alsa/alsa-sink.c:689 +#, c-format +msgid "" +"ALSA woke us up to write new data to the device, but there was actually " +"nothing to write!\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers.\n" +"We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() " +"returned 0 or another value < min_avail." +msgstr "" +"লেখার যোগ্য কোনো তথ্য উপস্থিত না থাকলেও, ডিভাইসের মধ্যে নতুন তথ্য লেখার উদ্দেশ্যে " +"ALSA থেকে চেতাবনী প্রাপ্ত হয়েছে!\n" +"সম্ভবত এটি ALSA ড্রাইভার '%s'-র একটি বাগ। অনুগ্রহ করে এই সমস্যা সম্বন্ধে ALSA " +"ডিভেলপরদের সূচিত করুন।\n" +"POLLOUT set দ্বারা চেতাবনী সৃষ্টি হয়েছে -- পরবর্তী snd_pcm_avail() থেকে 0 অথবা < " +"min_avail-র থেকে কম অন্য একটি মান প্রাপ্ত হয়েছে।" + +#: ../src/modules/alsa/alsa-source.c:506 ../src/modules/alsa/alsa-source.c:656 +#, c-format +msgid "" +"ALSA woke us up to read new data from the device, but there was actually " +"nothing to read!\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers.\n" +"We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() " +"returned 0 or another value < min_avail." +msgstr "" +"পড়ার যোগ্য কোনো তথ্য উপস্থিত না থাকলেও, ডিভাইস থেকে নতুন তথ্য পড়ার উদ্দেশ্যে ALSA " +"থেকে চেতাবনী প্রাপ্ত হয়েছে!\n" +"সম্ভবত এটি ALSA ড্রাইভার '%s'-র একটি বাগ। অনুগ্রহ করে এই সমস্যা সম্বন্ধে ALSA " +"ডিভেলপরদের সূচিত করুন।\n" +"POLLIN set দ্বারা চেতাবনী সৃষ্টি হয়েছে -- পরবর্তী snd_pcm_avail() থেকে 0 অথবা < " +"min_avail-র থেকে কম অন্য একটি মান প্রাপ্ত হয়েছে।" + +#: ../src/modules/alsa/module-alsa-card.c:152 +#: ../src/modules/bluetooth/module-bluetooth-device.c:2228 +#: ../src/modules/alsa/alsa-mixer.c:2931 +msgid "Off" +msgstr "বন্ধ" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2184 +msgid "High Fidelity Playback (A2DP)" +msgstr "হাই-ফিডেলিটি প্লে-ব্যাক (A2DP)" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2198 +msgid "High Fidelity Capture (A2DP)" +msgstr "হাই-ফিডেলিটি ক্যাপচার (A2DP)" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2213 +msgid "Telephony Duplex (HSP/HFP)" +msgstr "টেলিফোনি ডুপ্লে (HSP/HFP)" + +#: ../src/modules/reserve-wrap.c:151 +msgid "PulseAudio Sound Server" +msgstr "PulseAudio শব্দের সার্ভার" + +#: ../src/modules/module-rygel-media-server.c:569 +#: ../src/modules/module-rygel-media-server.c:583 +msgid "Output Devices" +msgstr "" + +#: ../src/modules/module-rygel-media-server.c:570 +#: ../src/modules/module-rygel-media-server.c:584 +msgid "Input Devices" +msgstr "" + +#: ../src/modules/module-rygel-media-server.c:774 +msgid "Audio on @HOSTNAME@" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1701 +msgid "Input" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1702 +msgid "Docking Station Input" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1703 +msgid "Docking Station Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1704 +msgid "Line-In" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1705 +msgid "Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1706 +msgid "External Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1707 +#, fuzzy +msgid "Internal Microphone" +msgstr "অভ্যন্তরীণ অডিও" + +#: ../src/modules/alsa/alsa-mixer.c:1708 +msgid "Radio" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1709 +msgid "Video" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1710 +msgid "Automatic Gain Control" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1711 +msgid "No Automatic Gain Control" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1712 +msgid "Boost" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1713 +msgid "No Boost" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1714 +msgid "Amplifier" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1715 +msgid "No Amplifier" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1773 +msgid "Analog Input" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1774 +msgid "Analog Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1775 +msgid "Analog Line-In" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1776 +msgid "Analog Radio" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1777 +msgid "Analog Video" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1778 +#, fuzzy +msgid "Analog Output" +msgstr "Null ফলাফল" + +#: ../src/modules/alsa/alsa-mixer.c:1779 +msgid "Analog Headphones" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1780 +msgid "Analog Output (LFE)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1781 +msgid "Analog Mono Output" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1981 +#, fuzzy, c-format +msgid "%s+%s" +msgstr "%s %s" + +#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404 +#, fuzzy, c-format +msgid "%s / %s" +msgstr "%s %s" + +#: ../src/modules/alsa/alsa-mixer.c:2790 +msgid "Analog Mono" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2791 +#, fuzzy +msgid "Analog Stereo" +msgstr "স্টিরিও" + +#: ../src/modules/alsa/alsa-mixer.c:2792 +#, fuzzy +msgid "Analog Surround 2.1" +msgstr "সারাউন্ড ৪.১" + +#: ../src/modules/alsa/alsa-mixer.c:2793 +#, fuzzy +msgid "Analog Surround 3.0" +msgstr "সারাউন্ড ৪.০" + +#: ../src/modules/alsa/alsa-mixer.c:2794 +#, fuzzy +msgid "Analog Surround 3.1" +msgstr "সারাউন্ড ৪.১" + +#: ../src/modules/alsa/alsa-mixer.c:2795 +#, fuzzy +msgid "Analog Surround 4.0" +msgstr "সারাউন্ড ৪.০" + +#: ../src/modules/alsa/alsa-mixer.c:2796 +#, fuzzy +msgid "Analog Surround 4.1" +msgstr "সারাউন্ড ৪.১" + +#: ../src/modules/alsa/alsa-mixer.c:2797 +#, fuzzy +msgid "Analog Surround 5.0" +msgstr "সারাউন্ড ৫.০" + +#: ../src/modules/alsa/alsa-mixer.c:2798 +#, fuzzy +msgid "Analog Surround 5.1" +msgstr "সারাউন্ড ৫.১" + +#: ../src/modules/alsa/alsa-mixer.c:2799 +#, fuzzy +msgid "Analog Surround 6.0" +msgstr "সারাউন্ড ৪.০" + +#: ../src/modules/alsa/alsa-mixer.c:2800 +#, fuzzy +msgid "Analog Surround 6.1" +msgstr "সারাউন্ড ৪.১" + +#: ../src/modules/alsa/alsa-mixer.c:2801 +#, fuzzy +msgid "Analog Surround 7.0" +msgstr "সারাউন্ড ৪.০" + +#: ../src/modules/alsa/alsa-mixer.c:2802 +#, fuzzy +msgid "Analog Surround 7.1" +msgstr "সারাউন্ড ৭.১" + +#: ../src/modules/alsa/alsa-mixer.c:2803 +msgid "Digital Stereo (IEC958)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2804 +msgid "Digital Surround 4.0 (IEC958)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2805 +msgid "Digital Surround 4.0 (IEC958/AC3)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2806 +msgid "Digital Surround 5.1 (IEC958/AC3)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2807 +msgid "Digital Stereo (HDMI)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2928 +msgid "Analog Mono Duplex" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2929 +msgid "Analog Stereo Duplex" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2930 +msgid "Digital Stereo Duplex (IEC958)" +msgstr "" diff --git a/po/ca.po b/po/ca.po new file mode 100644 index 0000000..e9938df --- /dev/null +++ b/po/ca.po @@ -0,0 +1,2936 @@ +# Catalan translation of pulseaudio by Softcatalà +# Copyright (C) 2008 Free Software Foundation +# This file is distributed under the same license as the pulseaudio package. +# +# Xavier Conde Rueda , 2008. +# Agustí Grau , 2009. +# Judith Pintó Subirada +# Josep Torné Llavall , 2009 +# +# This file is translated according to the glossary and style guide of +# Softcatalà. If you plan to modify this file, please read first the page +# of the Catalan translation team for the Fedora project at: +# http://www.softcatala.org/projectes/fedora/ +# and contact the previous translator. +# +# Aquest fitxer s'ha de traduir d'acord amb el recull de termes i la guia +# d'estil de Softcatalà. Si voleu modificar aquest fitxer, llegiu si +# us plau la pàgina de catalanització del projecte Fedora a: +# http://www.softcatala.org/projectes/fedora/ +# i contacteu l'anterior traductor/a. +# +# +msgid "" +msgstr "" +"Project-Id-Version: pulseaudio\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-09-29 23:47+0200\n" +"PO-Revision-Date: 2009-09-12 11:40+0100\n" +"Last-Translator: Josep Torné Llavall \n" +"Language-Team: Catalan \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629 +#, c-format +msgid "%s %s" +msgstr "%s %s" + +#: ../src/modules/alsa/alsa-util.c:1106 +#, c-format +msgid "" +"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu " +"ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_avail() ha retornat un valor excepcionalment gran: %lu bytes (%lu " +"ms).\n" +"Probablement es tracta d'un error del controlador de l'ALSA '%s'. Informeu " +"d'aquest incident als desenvolupadors de l'ALSA." + +#: ../src/modules/alsa/alsa-util.c:1147 +#, c-format +msgid "" +"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%" +"lu ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_delay() ha retornat un valor excepcionalment gran: %li bytes (%s%lu " +"ms).\n" +"Probablement es tracta d'un error del controlador de l'ALSA '%s'. Informeu " +"d'aquest incident als desenvolupadors de l'ALSA." + +#: ../src/modules/alsa/alsa-util.c:1194 +#, c-format +msgid "" +"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes " +"(%lu ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_mmap_begin() ha retornat un valor excepcionalment gran: %lu bytes (%" +"lu ms).\n" +"Probablement es tracta d'un error del controlador de l'ALSA '%s'. Informeu " +"d'aquest incident als desenvolupadors de l'ALSA." + +#: ../src/modules/module-always-sink.c:39 +msgid "Always keeps at least one sink loaded even if it's a null one" +msgstr "Conserva sempre almenys un conducte carregat fins i tot si és el nul" + +#: ../src/modules/module-always-sink.c:83 +msgid "Dummy Output" +msgstr "Sortida fingida" + +#: ../src/modules/module-ladspa-sink.c:49 +msgid "Virtual LADSPA sink" +msgstr "Conducte virtual LADSPA" + +#: ../src/modules/module-ladspa-sink.c:53 +msgid "" +"sink_name= sink_properties= " +"master= format= rate= " +"channels= channel_map= plugin= label= control=" +msgstr "" +"sink_name= sink_properties= " +"master= format= rate= channels= channel_map= " +"pulgin= label= " +"control=" + +#: ../src/modules/module-null-sink.c:55 +msgid "Clocked NULL sink" +msgstr "Conducte NULL" + +#: ../src/modules/module-null-sink.c:291 +msgid "Null Output" +msgstr "Sortida nul·la" + +#: ../src/pulsecore/sink.c:2613 +msgid "Internal Audio" +msgstr "Audio intern" + +#: ../src/pulsecore/sink.c:2618 +msgid "Modem" +msgstr "Mòdem" + +#: ../src/daemon/ltdl-bind-now.c:124 +msgid "Failed to find original lt_dlopen loader." +msgstr "No s'ha trobat el carregador lt_dlopen original." + +#: ../src/daemon/ltdl-bind-now.c:129 +msgid "Failed to allocate new dl loader." +msgstr "No s'ha pogut allotjar el nou carregador dl." + +#: ../src/daemon/ltdl-bind-now.c:142 +msgid "Failed to add bind-now-loader." +msgstr "No s'ha pogut afegir bind-now-loader." + +#: ../src/daemon/main.c:141 +#, c-format +msgid "Got signal %s." +msgstr "S'ha obtingut la senyal %s." + +#: ../src/daemon/main.c:168 +msgid "Exiting." +msgstr "S'està sortint." + +#: ../src/daemon/main.c:186 +#, c-format +msgid "Failed to find user '%s'." +msgstr "No s'ha trobat l'usuari '%s'." + +#: ../src/daemon/main.c:191 +#, c-format +msgid "Failed to find group '%s'." +msgstr "No s'ha trobat el grup '%s'." + +#: ../src/daemon/main.c:195 +#, c-format +msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)." +msgstr "S'han trobat l'usuari '%s' (UID %lu) i el grup '%s' (GID %lu)." + +#: ../src/daemon/main.c:200 +#, c-format +msgid "GID of user '%s' and of group '%s' don't match." +msgstr "El GID de l'usuari '%s' i del grup '%s' no coincideixen." + +#: ../src/daemon/main.c:205 +#, c-format +msgid "Home directory of user '%s' is not '%s', ignoring." +msgstr "El directori arrel de l'usuari '%s' no és '%s', s'ignorarà." + +#: ../src/daemon/main.c:208 ../src/daemon/main.c:213 +#, c-format +msgid "Failed to create '%s': %s" +msgstr "No s'ha pogut crear '%s': %s" + +#: ../src/daemon/main.c:220 +#, c-format +msgid "Failed to change group list: %s" +msgstr "No s'ha pogut canviar la llista del grup: %s" + +#: ../src/daemon/main.c:236 +#, c-format +msgid "Failed to change GID: %s" +msgstr "No s'ha pogut canviar el GID: %s" + +#: ../src/daemon/main.c:252 +#, c-format +msgid "Failed to change UID: %s" +msgstr "No s'ha pogut canviar l'UID: %s" + +#: ../src/daemon/main.c:271 +msgid "Successfully dropped root privileges." +msgstr "S'han alliberat els permisos de root." + +#: ../src/daemon/main.c:279 +msgid "System wide mode unsupported on this platform." +msgstr "El mode de sistema global no és compatible amb aquesta plataforma." + +#: ../src/daemon/main.c:297 +#, c-format +msgid "setrlimit(%s, (%u, %u)) failed: %s" +msgstr "S'ha produït un error en setrlimit(%s, (%u, %u)): %s" + +#: ../src/daemon/main.c:474 +msgid "Failed to parse command line." +msgstr "No s'ha pogut interpretar la línia d'ordres." + +#: ../src/daemon/main.c:541 +msgid "Daemon not running" +msgstr "El dimoni no s'està executant" + +#: ../src/daemon/main.c:543 +#, c-format +msgid "Daemon running as PID %u" +msgstr "El dimoni s'està executant amb PID %u" + +#: ../src/daemon/main.c:553 +#, c-format +msgid "Failed to kill daemon: %s" +msgstr "S'ha produït un error en matar el dimoni: %s" + +#: ../src/daemon/main.c:571 +msgid "" +"This program is not intended to be run as root (unless --system is " +"specified)." +msgstr "" +"No és necessari executar aquesta aplicació com a root (excepte si " +"s'especifica --system)" + +#: ../src/daemon/main.c:573 +msgid "Root privileges required." +msgstr "Es requereixen privilegis de root." + +#: ../src/daemon/main.c:578 +msgid "--start not supported for system instances." +msgstr "La opció --start no està suportada per a instàncies de sistema." + +#: ../src/daemon/main.c:583 +msgid "Running in system mode, but --disallow-exit not set!" +msgstr "" +"S'està executant en mode sistema, però no s'ha especificat l'opció --" +"disallow-exit." + +#: ../src/daemon/main.c:586 +msgid "Running in system mode, but --disallow-module-loading not set!" +msgstr "" +"S'està executant en mode sistema, però no s'ha especificat l'opció --" +"disallow-module-loading." + +#: ../src/daemon/main.c:589 +msgid "Running in system mode, forcibly disabling SHM mode!" +msgstr "" +"S'està executant en mode sistema, es deshabilitarà el mode SHM forçosament." + +#: ../src/daemon/main.c:594 +msgid "Running in system mode, forcibly disabling exit idle time!" +msgstr "" +"S'està executant en mode sistema, la sortida per temps d'inactivitat es " +"deshabilita." + +#: ../src/daemon/main.c:621 +msgid "Failed to acquire stdio." +msgstr "S'ha produït un error en adquirir stdio." + +#: ../src/daemon/main.c:627 +#, c-format +msgid "pipe failed: %s" +msgstr "Ha fallat la canonada: %s" + +#: ../src/daemon/main.c:632 +#, c-format +msgid "fork() failed: %s" +msgstr "Ha fallat fork(): %s" + +#: ../src/daemon/main.c:646 ../src/utils/pacat.c:508 +#, c-format +msgid "read() failed: %s" +msgstr "Ha fallat read(): %s" + +#: ../src/daemon/main.c:652 +msgid "Daemon startup failed." +msgstr "S'ha produït un error en iniciar el dimoni." + +#: ../src/daemon/main.c:654 +msgid "Daemon startup successful." +msgstr "S'ha iniciat el dimoni." + +#: ../src/daemon/main.c:731 +#, c-format +msgid "This is PulseAudio %s" +msgstr "Aquest és el PulseAudio %s" + +#: ../src/daemon/main.c:732 +#, c-format +msgid "Compilation host: %s" +msgstr "Host de compilació: %s" + +#: ../src/daemon/main.c:733 +#, c-format +msgid "Compilation CFLAGS: %s" +msgstr "CFLAGS de compilació: %s" + +#: ../src/daemon/main.c:736 +#, c-format +msgid "Running on host: %s" +msgstr "S'està executant en el host: %s" + +#: ../src/daemon/main.c:739 +#, c-format +msgid "Found %u CPUs." +msgstr "S'han trobat %u CPU's" + +#: ../src/daemon/main.c:741 +#, c-format +msgid "Page size is %lu bytes" +msgstr "La mida de pàgina és de %lu bytes." + +#: ../src/daemon/main.c:744 +msgid "Compiled with Valgrind support: yes" +msgstr "Compilat amb suport per a Valgrind: sí" + +#: ../src/daemon/main.c:746 +msgid "Compiled with Valgrind support: no" +msgstr "Compilat amb suport per a Valgrind: no" + +#: ../src/daemon/main.c:749 +#, c-format +msgid "Running in valgrind mode: %s" +msgstr "S'està executant amb el mode valgrind: %s" + +#: ../src/daemon/main.c:752 +msgid "Optimized build: yes" +msgstr "Construcció optimitzada: sí" + +#: ../src/daemon/main.c:754 +msgid "Optimized build: no" +msgstr "Construcció optmitzada: no" + +#: ../src/daemon/main.c:758 +msgid "NDEBUG defined, all asserts disabled." +msgstr "NDEBUG està definit, s'han desactivat totes les assercions." + +#: ../src/daemon/main.c:760 +msgid "FASTPATH defined, only fast path asserts disabled." +msgstr "" +"FASTPATH està definit, només s'ha deshabilitat les assercions de camí ràpid." + +#: ../src/daemon/main.c:762 +msgid "All asserts enabled." +msgstr "S'han habilitat totes les assercions." + +#: ../src/daemon/main.c:766 +msgid "Failed to get machine ID" +msgstr "No s'ha pogut obtenir l'ID de la màquina" + +#: ../src/daemon/main.c:769 +#, c-format +msgid "Machine ID is %s." +msgstr "L'ID de la màquina és %s." + +#: ../src/daemon/main.c:773 +#, c-format +msgid "Session ID is %s." +msgstr "L'ID de la sessió és %s." + +#: ../src/daemon/main.c:779 +#, c-format +msgid "Using runtime directory %s." +msgstr "S'està utilitzant el directori d'execució %s." + +#: ../src/daemon/main.c:784 +#, c-format +msgid "Using state directory %s." +msgstr "S'està utilitzant el directori d'estat %s." + +#: ../src/daemon/main.c:787 +#, c-format +msgid "Using modules directory %s." +msgstr "S'està utilitzant el directori dels móduls %s." + +#: ../src/daemon/main.c:789 +#, c-format +msgid "Running in system mode: %s" +msgstr "S'està executant en mode sistema: %s" + +#: ../src/daemon/main.c:792 +msgid "" +"OK, so you are running PA in system mode. Please note that you most likely " +"shouldn't be doing that.\n" +"If you do it nonetheless then it's your own fault if things don't work as " +"expected.\n" +"Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an " +"explanation why system mode is usually a bad idea." +msgstr "" +"Esteu utilitzant el PA en mode sistema. Tingueu en compte que molt " +"probablement no hauríeu de fer-ho.\n" +"No obstant això, si ho feu és la vostra responsabilitat si no funciona com " +"s'esperava.\n" +"Si us plau, llegiu http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode per " +"a una explicació de per què el mode sistema sol ser una mala idea." + +#: ../src/daemon/main.c:809 +msgid "pa_pid_file_create() failed." +msgstr "S'ha produït un error en pa_pid_file_create()." + +#: ../src/daemon/main.c:819 +msgid "Fresh high-resolution timers available! Bon appetit!" +msgstr "Estan disponibles els temporitzadors frescos d'alta resolució." + +#: ../src/daemon/main.c:821 +msgid "" +"Dude, your kernel stinks! The chef's recommendation today is Linux with high-" +"resolution timers enabled!" +msgstr "" +"Es recomana la utilització d'un nucli amb els temporitzadors d'alta " +"resolució habilitats." + +#: ../src/daemon/main.c:844 +msgid "pa_core_new() failed." +msgstr "S'ha produït un error en pa_core_new()." + +#: ../src/daemon/main.c:904 +msgid "Failed to initialize daemon." +msgstr "S'ha produït un error en inicialitzar el dimoni." + +#: ../src/daemon/main.c:909 +msgid "Daemon startup without any loaded modules, refusing to work." +msgstr "El dimoni s'ha iniciat sense cap mòdul carregat, no funcionarà." + +#: ../src/daemon/main.c:926 +msgid "Daemon startup complete." +msgstr "S'ha completat la inicialització del dimoni." + +#: ../src/daemon/main.c:932 +msgid "Daemon shutdown initiated." +msgstr "S'ha iniciat l'aturada del dimoni." + +#: ../src/daemon/main.c:954 +msgid "Daemon terminated." +msgstr "S'ha aturat el dimoni." + +#: ../src/daemon/cmdline.c:115 +#, c-format +msgid "" +"%s [options]\n" +"\n" +"COMMANDS:\n" +" -h, --help Show this help\n" +" --version Show version\n" +" --dump-conf Dump default configuration\n" +" --dump-modules Dump list of available modules\n" +" --dump-resample-methods Dump available resample methods\n" +" --cleanup-shm Cleanup stale shared memory " +"segments\n" +" --start Start the daemon if it is not " +"running\n" +" -k --kill Kill a running daemon\n" +" --check Check for a running daemon (only " +"returns exit code)\n" +"\n" +"OPTIONS:\n" +" --system[=BOOL] Run as system-wide instance\n" +" -D, --daemonize[=BOOL] Daemonize after startup\n" +" --fail[=BOOL] Quit when startup fails\n" +" --high-priority[=BOOL] Try to set high nice level\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_NICE)\n" +" --realtime[=BOOL] Try to enable realtime scheduling\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_RTPRIO)\n" +" --disallow-module-loading[=BOOL] Disallow module user requested " +"module\n" +" loading/unloading after startup\n" +" --disallow-exit[=BOOL] Disallow user requested exit\n" +" --exit-idle-time=SECS Terminate the daemon when idle and " +"this\n" +" time passed\n" +" --module-idle-time=SECS Unload autoloaded modules when idle " +"and\n" +" this time passed\n" +" --scache-idle-time=SECS Unload autoloaded samples when idle " +"and\n" +" this time passed\n" +" --log-level[=LEVEL] Increase or set verbosity level\n" +" -v Increase the verbosity level\n" +" --log-target={auto,syslog,stderr} Specify the log target\n" +" --log-meta[=BOOL] Include code location in log " +"messages\n" +" --log-time[=BOOL] Include timestamps in log messages\n" +" --log-backtrace=FRAMES Include a backtrace in log messages\n" +" -p, --dl-search-path=PATH Set the search path for dynamic " +"shared\n" +" objects (plugins)\n" +" --resample-method=METHOD Use the specified resampling method\n" +" (See --dump-resample-methods for\n" +" possible values)\n" +" --use-pid-file[=BOOL] Create a PID file\n" +" --no-cpu-limit[=BOOL] Do not install CPU load limiter on\n" +" platforms that support it.\n" +" --disable-shm[=BOOL] Disable shared memory support.\n" +"\n" +"STARTUP SCRIPT:\n" +" -L, --load=\"MODULE ARGUMENTS\" Load the specified plugin module " +"with\n" +" the specified argument\n" +" -F, --file=FILENAME Run the specified script\n" +" -C Open a command line on the running " +"TTY\n" +" after startup\n" +"\n" +" -n Don't load default script file\n" +msgstr "" +"%s [opcions]\n" +"\n" +"COMANDES:\n" +" -h, --help Mostra aquesta ajuda\n" +" --version Mostra la versió\n" +" --dump-conf Volca la configuració per omissió\n" +" --dump-modules Volca la llista de mòduls\n" +" --dump-resample-methods Volca els mètodes disponibles de " +"remostratge\n" +" --cleanup-shm Neteja els segments de memòria " +"compartida sense emprar\n" +" --start Inicia el dimoni si aquest no s'està " +"executant\n" +" -k --kill Mata el dimoni en execució\n" +" --check Comprova l'execució del dimoni\n" +"\n" +"OPCIONS:\n" +" --system[=BOOL] Executa com una instància de " +"sistema\n" +" -D, --daemonize[=BOOL] Converteix en dimoni després de la " +"inicialització\n" +" --fail[=BOOL] Surt quan falli la inicialització\n" +" --high-priority[=BOOL] Prova d'establir un nivell de \n" +" Prioritat alta (només disponible com " +"a root,\n" +" amb SUID o amb un RLIMIT_NICE " +"elevat)\n" +" --realtime[=BOOL] Intenta habilitar la programació en\n" +" en temps real (només disponible com " +"a root,\n" +" amb SUID o amb un RLIMIT_RTPRIO " +"elevat)\n" +" --disallow-module-loading[=BOOL] Inhabilita el mòdul de carrega/" +"descarrega \n" +" de mòduls demanats per l'usuari " +"després de l'inici\n" +" --disallow-exit[=BOOL] Inhabilita la petició de l'usuari de " +"sortida\n" +" --exit-idle-time=SEGS Mata el dimoni quan estigui inactiu " +"i hagi passat\n" +" aquest temps\n" +" --module-idle-time=SEGS Descarrega els mòduls carregats " +"automàticament\n" +" quan estigui inactiu o hagi passat " +"aquest temps\n" +" --scache-idle-time=SEGS Descarrega les mostres carregades " +"automàticament\n" +" després que hagi passat aquest " +"temps\n" +" --log-level[=NIVELL] Incrementa o especifica el nivell de " +"detall\n" +" -v Incrementa el nivell de detall\n" +" --log-target={auto,syslog,stderr} Especifica el destí del registre\n" +" --log-meta[=BOOL] Inclou codi de localització en els " +"missatges de registre\n" +" --log-time[=BOOL] Inclou marques de temps en els " +"missatges de registre\n" +" --log-backtrace=MARCS Inclou una traça en els missatges de " +"registre\n" +" -p, --dl-search-path=CAMÍ Estableix el camí de cerca " +"d'objectes dinàmics\n" +" compartits (plugins)\n" +" --resample-method=MÈTODE Utilitza el mètode de remostreig\n" +" (Per veure els valors possibles " +"utilitza --dump-resample-methods)\n" +" --use-pid-file[=BOOL] Crea un fitxer PID\n" +" --no-cpu-limit[=BOOL] No instal·lis un limitador de " +"càrrega de CPU\n" +" en plataformes que ho suportin.\n" +" --disable-shm[=BOOL] Inhabilita el suport de memòria " +"compartida.\n" +"\n" +"SCRIPT D'INICI:\n" +" -L, --load=\"ARGUMENTS MÒDUL\" Carrega el mòdul especificat amb\n" +" els arguments especificats\n" +" -F, --file=NOMFITXER Executa l'script especificat\n" +" -C Obre una línia d'ordres en la TTY " +"actual després\n" +" de l'inici\n" +"\n" +" -n No carreguis el fitxer de " +"configuració per omissió\n" + +#: ../src/daemon/cmdline.c:247 +msgid "--daemonize expects boolean argument" +msgstr "--daemonize necessita un argument booleà" + +#: ../src/daemon/cmdline.c:254 +msgid "--fail expects boolean argument" +msgstr "--fail necessita un argument booleà" + +#: ../src/daemon/cmdline.c:264 +msgid "" +"--log-level expects log level argument (either numeric in range 0..4 or one " +"of debug, info, notice, warn, error)." +msgstr "" +"--log-level necessita un argument de nivell de log (valor númeric 0..4 o " +"debug, info, notice, warn, error)." + +#: ../src/daemon/cmdline.c:276 +msgid "--high-priority expects boolean argument" +msgstr "--high-priority necessita un argument booleà" + +#: ../src/daemon/cmdline.c:283 +msgid "--realtime expects boolean argument" +msgstr "--realtime necessita un argument booleà" + +#: ../src/daemon/cmdline.c:290 +msgid "--disallow-module-loading expects boolean argument" +msgstr "--disallow-module-loading necessita un argument booleà" + +#: ../src/daemon/cmdline.c:297 +msgid "--disallow-exit expects boolean argument" +msgstr "--disallow-exit necessita un argument booleà" + +#: ../src/daemon/cmdline.c:304 +msgid "--use-pid-file expects boolean argument" +msgstr "--use-pid-file necessita un argument booleà" + +#: ../src/daemon/cmdline.c:321 +msgid "Invalid log target: use either 'syslog', 'stderr' or 'auto'." +msgstr "Objectiu de log invàlid: utilitzeu 'syslog', 'stderr' o 'auto'." + +#: ../src/daemon/cmdline.c:328 +msgid "--log-time expects boolean argument" +msgstr "--logtime necessita un argument booleà" + +#: ../src/daemon/cmdline.c:335 +msgid "--log-meta expects boolean argument" +msgstr "--log-meta necessita un argument booleà" + +#: ../src/daemon/cmdline.c:354 +#, c-format +msgid "Invalid resample method '%s'." +msgstr "Mètode de remostratge invàlid '%s'." + +#: ../src/daemon/cmdline.c:361 +msgid "--system expects boolean argument" +msgstr "--system necessita un argument booleà" + +#: ../src/daemon/cmdline.c:368 +msgid "--no-cpu-limit expects boolean argument" +msgstr "--no-cpu-limit necessita un argument booleà" + +#: ../src/daemon/cmdline.c:375 +msgid "--disable-shm expects boolean argument" +msgstr "--disable-shm necessita un argument booleà" + +#: ../src/daemon/dumpmodules.c:60 +#, c-format +msgid "Name: %s\n" +msgstr "Nom: %s\n" + +#: ../src/daemon/dumpmodules.c:63 +#, c-format +msgid "No module information available\n" +msgstr "No hi ha informació del módul disponible\n" + +#: ../src/daemon/dumpmodules.c:66 +#, c-format +msgid "Version: %s\n" +msgstr "Versió: %s\n" + +#: ../src/daemon/dumpmodules.c:68 +#, c-format +msgid "Description: %s\n" +msgstr "Descripció: %s\n" + +#: ../src/daemon/dumpmodules.c:70 +#, c-format +msgid "Author: %s\n" +msgstr "Autor: %s\n" + +#: ../src/daemon/dumpmodules.c:72 +#, c-format +msgid "Usage: %s\n" +msgstr "Utilització: %s\n" + +#: ../src/daemon/dumpmodules.c:73 +#, c-format +msgid "Load Once: %s\n" +msgstr "Càrrega: %s\n" + +#: ../src/daemon/dumpmodules.c:75 +#, c-format +msgid "DEPRECATION WARNING: %s\n" +msgstr "Advertència d'obsolescència: %s\n" + +#: ../src/daemon/dumpmodules.c:79 +#, c-format +msgid "Path: %s\n" +msgstr "Ruta: %s\n" + +#: ../src/daemon/daemon-conf.c:232 +#, c-format +msgid "[%s:%u] Invalid log target '%s'." +msgstr "[%s:%u] Destí de registre incorrecte '%s'" + +#: ../src/daemon/daemon-conf.c:248 +#, c-format +msgid "[%s:%u] Invalid log level '%s'." +msgstr "[%s:%u] Nivell de registre incorrecte '%s'." + +#: ../src/daemon/daemon-conf.c:264 +#, c-format +msgid "[%s:%u] Invalid resample method '%s'." +msgstr "[%s:%u] Mètode de remostreig incorrecte '%s'." + +#: ../src/daemon/daemon-conf.c:287 +#, c-format +msgid "[%s:%u] Invalid rlimit '%s'." +msgstr "[%s:%u] rlimit incorrecte '%s'." + +#: ../src/daemon/daemon-conf.c:294 +#, c-format +msgid "[%s:%u] rlimit not supported on this platform." +msgstr "[%s:%u] rlimit no disponible en aquesta plataforma." + +#: ../src/daemon/daemon-conf.c:310 +#, c-format +msgid "[%s:%u] Invalid sample format '%s'." +msgstr "[%s:%u] Format de mostra incorrecte '%s'." + +#: ../src/daemon/daemon-conf.c:328 +#, c-format +msgid "[%s:%u] Invalid sample rate '%s'." +msgstr "[%s:%u] Velocitat de mostreig '%s'." + +#: ../src/daemon/daemon-conf.c:352 +#, c-format +msgid "[%s:%u] Invalid sample channels '%s'." +msgstr "[%s:%u] Canals de mostreig incorrectes '%s'." + +#: ../src/daemon/daemon-conf.c:370 +#, c-format +msgid "[%s:%u] Invalid channel map '%s'." +msgstr "[%s:%u] Mapa de canals incorrecte '%s'." + +#: ../src/daemon/daemon-conf.c:388 +#, c-format +msgid "[%s:%u] Invalid number of fragments '%s'." +msgstr "[%s:%u] Nombre de fragments incorrecte '%s'." + +#: ../src/daemon/daemon-conf.c:406 +#, c-format +msgid "[%s:%u] Invalid fragment size '%s'." +msgstr "[%s:%u] Mida de fragment incorrecta '%s'." + +#: ../src/daemon/daemon-conf.c:424 +#, c-format +msgid "[%s:%u] Invalid nice level '%s'." +msgstr "[%s:%u] Nivell de prioritat incorrecte '%s'." + +#: ../src/daemon/daemon-conf.c:546 +#, c-format +msgid "Failed to open configuration file: %s" +msgstr "Error en obrir el fitxer de configuració: %s" + +#: ../src/daemon/daemon-conf.c:562 +msgid "" +"The specified default channel map has a different number of channels than " +"the specified default number of channels." +msgstr "" +"El mapa de canals especificat per omissió té un número de canals diferent " +"del número de canals especificat per omissió." + +#: ../src/daemon/daemon-conf.c:638 +#, c-format +msgid "### Read from configuration file: %s ###\n" +msgstr "### Lectura del fitxer de configuració: %s ###\n" + +#: ../src/daemon/caps.c:62 +msgid "Cleaning up privileges." +msgstr "Alliberant els privilegis." + +#: ../src/daemon/pulseaudio.desktop.in.h:1 +msgid "PulseAudio Sound System" +msgstr "Sistema de so PulseAudio" + +#: ../src/daemon/pulseaudio.desktop.in.h:2 +msgid "Start the PulseAudio Sound System" +msgstr "Inicialitza el sistema de so PulseAudio" + +#: ../src/pulse/channelmap.c:105 ../src/pulse/channelmap.c:757 +msgid "Mono" +msgstr "Mono" + +#: ../src/pulse/channelmap.c:107 +msgid "Front Center" +msgstr "Frontal central" + +#: ../src/pulse/channelmap.c:108 +msgid "Front Left" +msgstr "Frontal esquerra" + +#: ../src/pulse/channelmap.c:109 +msgid "Front Right" +msgstr "Frontal dreta" + +#: ../src/pulse/channelmap.c:111 +msgid "Rear Center" +msgstr "Posterior central" + +#: ../src/pulse/channelmap.c:112 +msgid "Rear Left" +msgstr "Posterior esquerra" + +#: ../src/pulse/channelmap.c:113 +msgid "Rear Right" +msgstr "Posterior dreta" + +#: ../src/pulse/channelmap.c:115 +msgid "Low Frequency Emmiter" +msgstr "Emissor de baixa freqüència" + +#: ../src/pulse/channelmap.c:117 +msgid "Front Left-of-center" +msgstr "Frontal central part esquerra" + +#: ../src/pulse/channelmap.c:118 +msgid "Front Right-of-center" +msgstr "Frontal central part dreta" + +#: ../src/pulse/channelmap.c:120 +msgid "Side Left" +msgstr "Lateral esquerra" + +#: ../src/pulse/channelmap.c:121 +msgid "Side Right" +msgstr "Lateral dreta" + +#: ../src/pulse/channelmap.c:123 +msgid "Auxiliary 0" +msgstr "Auxiliar 0" + +#: ../src/pulse/channelmap.c:124 +msgid "Auxiliary 1" +msgstr "Auxiliar 1" + +#: ../src/pulse/channelmap.c:125 +msgid "Auxiliary 2" +msgstr "Auxiliar 2" + +#: ../src/pulse/channelmap.c:126 +msgid "Auxiliary 3" +msgstr "Auxiliar 3" + +#: ../src/pulse/channelmap.c:127 +msgid "Auxiliary 4" +msgstr "Auxiliar 4" + +#: ../src/pulse/channelmap.c:128 +msgid "Auxiliary 5" +msgstr "Auxiliar 5" + +#: ../src/pulse/channelmap.c:129 +msgid "Auxiliary 6" +msgstr "Auxiliar 6" + +#: ../src/pulse/channelmap.c:130 +msgid "Auxiliary 7" +msgstr "Auxiliar 7" + +#: ../src/pulse/channelmap.c:131 +msgid "Auxiliary 8" +msgstr "Auxiliar 8" + +#: ../src/pulse/channelmap.c:132 +msgid "Auxiliary 9" +msgstr "Auxiliar 9" + +#: ../src/pulse/channelmap.c:133 +msgid "Auxiliary 10" +msgstr "Auxiliar 10" + +#: ../src/pulse/channelmap.c:134 +msgid "Auxiliary 11" +msgstr "Auxiliar 11" + +#: ../src/pulse/channelmap.c:135 +msgid "Auxiliary 12" +msgstr "Auxiliar 12" + +#: ../src/pulse/channelmap.c:136 +msgid "Auxiliary 13" +msgstr "Auxiliar 13" + +#: ../src/pulse/channelmap.c:137 +msgid "Auxiliary 14" +msgstr "Auxiliar 14" + +#: ../src/pulse/channelmap.c:138 +msgid "Auxiliary 15" +msgstr "Auxiliar 15" + +#: ../src/pulse/channelmap.c:139 +msgid "Auxiliary 16" +msgstr "Auxiliar 16" + +#: ../src/pulse/channelmap.c:140 +msgid "Auxiliary 17" +msgstr "Auxiliar 17" + +#: ../src/pulse/channelmap.c:141 +msgid "Auxiliary 18" +msgstr "Auxiliar 18" + +#: ../src/pulse/channelmap.c:142 +msgid "Auxiliary 19" +msgstr "Auxiliar 19" + +#: ../src/pulse/channelmap.c:143 +msgid "Auxiliary 20" +msgstr "Auxiliar 20" + +#: ../src/pulse/channelmap.c:144 +msgid "Auxiliary 21" +msgstr "Auxiliar 21" + +#: ../src/pulse/channelmap.c:145 +msgid "Auxiliary 22" +msgstr "Auxiliar 22" + +#: ../src/pulse/channelmap.c:146 +msgid "Auxiliary 23" +msgstr "Auxiliar 23" + +#: ../src/pulse/channelmap.c:147 +msgid "Auxiliary 24" +msgstr "Auxiliar 24" + +#: ../src/pulse/channelmap.c:148 +msgid "Auxiliary 25" +msgstr "Auxiliar 25" + +#: ../src/pulse/channelmap.c:149 +msgid "Auxiliary 26" +msgstr "Auxiliar 26" + +#: ../src/pulse/channelmap.c:150 +msgid "Auxiliary 27" +msgstr "Auxiliar 27" + +#: ../src/pulse/channelmap.c:151 +msgid "Auxiliary 28" +msgstr "Auxiliar 28" + +#: ../src/pulse/channelmap.c:152 +msgid "Auxiliary 29" +msgstr "Auxiliar 31" + +#: ../src/pulse/channelmap.c:153 +msgid "Auxiliary 30" +msgstr "Auxiliar 30" + +#: ../src/pulse/channelmap.c:154 +msgid "Auxiliary 31" +msgstr "Auxiliar 31" + +#: ../src/pulse/channelmap.c:156 +msgid "Top Center" +msgstr "Superior central" + +#: ../src/pulse/channelmap.c:158 +msgid "Top Front Center" +msgstr "Superior frontal central" + +#: ../src/pulse/channelmap.c:159 +msgid "Top Front Left" +msgstr "Superior frontal esquerra" + +#: ../src/pulse/channelmap.c:160 +msgid "Top Front Right" +msgstr "Superior frontal dreta" + +#: ../src/pulse/channelmap.c:162 +msgid "Top Rear Center" +msgstr "Superior posterior central" + +#: ../src/pulse/channelmap.c:163 +msgid "Top Rear Left" +msgstr "Superior posterior esquerra" + +#: ../src/pulse/channelmap.c:164 +msgid "Top Rear Right" +msgstr "Superior posterior dreta" + +#: ../src/pulse/channelmap.c:484 ../src/pulse/sample.c:170 +#: ../src/pulse/volume.c:295 ../src/pulse/volume.c:321 +#: ../src/pulse/volume.c:341 ../src/pulse/volume.c:371 +msgid "(invalid)" +msgstr "(incorrecte)" + +#: ../src/pulse/channelmap.c:761 +msgid "Stereo" +msgstr "Estèreo" + +#: ../src/pulse/channelmap.c:766 +msgid "Surround 4.0" +msgstr "Envolvent 4.0" + +#: ../src/pulse/channelmap.c:772 +msgid "Surround 4.1" +msgstr "Envolvent 4.1" + +#: ../src/pulse/channelmap.c:778 +msgid "Surround 5.0" +msgstr "Envolvent 5.0" + +#: ../src/pulse/channelmap.c:784 +msgid "Surround 5.1" +msgstr "Envolvent 5.1" + +#: ../src/pulse/channelmap.c:791 +msgid "Surround 7.1" +msgstr "Envolvent 7.1" + +#: ../src/pulse/error.c:43 +msgid "OK" +msgstr "D'acord" + +#: ../src/pulse/error.c:44 +msgid "Access denied" +msgstr "S'ha denegat l'accès" + +#: ../src/pulse/error.c:45 +msgid "Unknown command" +msgstr "Ordre desconeguda" + +#: ../src/pulse/error.c:46 +msgid "Invalid argument" +msgstr "Argument incorrecte" + +#: ../src/pulse/error.c:47 +msgid "Entity exists" +msgstr "L'entitat existeix" + +#: ../src/pulse/error.c:48 +msgid "No such entity" +msgstr "No existeix l'entitat" + +#: ../src/pulse/error.c:49 +msgid "Connection refused" +msgstr "S'ha refusat la connexió" + +#: ../src/pulse/error.c:50 +msgid "Protocol error" +msgstr "S'ha produït un error de protocol" + +#: ../src/pulse/error.c:51 +msgid "Timeout" +msgstr "S'ha esgotat el temps" + +#: ../src/pulse/error.c:52 +msgid "No authorization key" +msgstr "No s'ha trobat la clau d'autorització" + +#: ../src/pulse/error.c:53 +msgid "Internal error" +msgstr "S'ha produït un error intern" + +#: ../src/pulse/error.c:54 +msgid "Connection terminated" +msgstr "S'ha finalitzat la connexió" + +#: ../src/pulse/error.c:55 +msgid "Entity killed" +msgstr "S'ha matat l'entitat" + +#: ../src/pulse/error.c:56 +msgid "Invalid server" +msgstr "Servidor incorrecte" + +#: ../src/pulse/error.c:57 +msgid "Module initalization failed" +msgstr "Ha fallat la inicialització del mòdul" + +#: ../src/pulse/error.c:58 +msgid "Bad state" +msgstr "Estat incorrecte" + +#: ../src/pulse/error.c:59 +msgid "No data" +msgstr "Sense dades" + +#: ../src/pulse/error.c:60 +msgid "Incompatible protocol version" +msgstr "Versió de protocol incorrecta" + +#: ../src/pulse/error.c:61 +msgid "Too large" +msgstr "Massa gran" + +#: ../src/pulse/error.c:62 +msgid "Not supported" +msgstr "No suportat" + +#: ../src/pulse/error.c:63 +msgid "Unknown error code" +msgstr "Codi d'error desconegut" + +#: ../src/pulse/error.c:64 +msgid "No such extension" +msgstr "No existeix l'extensió" + +#: ../src/pulse/error.c:65 +msgid "Obsolete functionality" +msgstr "Funcionalitat obsoleta" + +#: ../src/pulse/error.c:66 +msgid "Missing implementation" +msgstr "Manca la implementació" + +#: ../src/pulse/error.c:67 +msgid "Client forked" +msgstr "Client bifurcat" + +#: ../src/pulse/error.c:68 +msgid "Input/Output error" +msgstr "Error d'entrada/sortida" + +#: ../src/pulse/error.c:69 +msgid "Device or resource busy" +msgstr "Dispositiu o recurs ocupat" + +#: ../src/pulse/sample.c:172 +#, c-format +msgid "%s %uch %uHz" +msgstr "%s %uch %uHz" + +#: ../src/pulse/sample.c:184 +#, c-format +msgid "%0.1f GiB" +msgstr "%0.1f GB" + +#: ../src/pulse/sample.c:186 +#, c-format +msgid "%0.1f MiB" +msgstr "%0.1f MB" + +#: ../src/pulse/sample.c:188 +#, c-format +msgid "%0.1f KiB" +msgstr "%0.1f KB" + +#: ../src/pulse/sample.c:190 +#, c-format +msgid "%u B" +msgstr "%u B" + +#: ../src/pulse/client-conf-x11.c:55 ../src/utils/pax11publish.c:100 +msgid "XOpenDisplay() failed" +msgstr "Ha fallat XOpenDisplay()" + +#: ../src/pulse/client-conf-x11.c:93 +msgid "Failed to parse cookie data" +msgstr "Ha fallat el parseig de les dades de la cookie" + +#: ../src/pulse/client-conf.c:111 +#, c-format +msgid "Failed to open configuration file '%s': %s" +msgstr "S'ha produït un error en obrir el fitxer de configuració '%s': %s" + +#: ../src/pulse/context.c:550 +msgid "No cookie loaded. Attempting to connect without." +msgstr "No s'ha carregat cap cookie. S'està intentant connectar sense aquesta." + +#: ../src/pulse/context.c:693 +#, c-format +msgid "fork(): %s" +msgstr "fork(): %s" + +#: ../src/pulse/context.c:748 +#, c-format +msgid "waitpid(): %s" +msgstr "waitpid(): %s" + +#: ../src/pulse/context.c:1438 +#, c-format +msgid "Received message for unknown extension '%s'" +msgstr "S'ha rebut un missatge per a una extensió desconeguda '%s'" + +#: ../src/utils/pacat.c:108 +#, c-format +msgid "Failed to drain stream: %s" +msgstr "S'ha produït un error en drenar el fluxe: %s" + +#: ../src/utils/pacat.c:113 +msgid "Playback stream drained." +msgstr "Flux de reproducció drenat." + +#: ../src/utils/pacat.c:123 +msgid "Draining connection to server." +msgstr "S'està drenant la connexió amb el servidor." + +#: ../src/utils/pacat.c:136 +#, c-format +msgid "pa_stream_drain(): %s" +msgstr "pa_stream_drain(): %s" + +#: ../src/utils/pacat.c:159 +#, c-format +msgid "pa_stream_write() failed: %s" +msgstr "Ha fallat pa_stream_write(): %s" + +#: ../src/utils/pacat.c:197 +#, c-format +msgid "pa_stream_begin_write() failed: %s" +msgstr "Ha fallat pa_stream_begin_write(): %s" + +#: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267 +#, c-format +msgid "pa_stream_peek() failed: %s" +msgstr "Ha fallat pa_stream_peek(): %s" + +#: ../src/utils/pacat.c:307 +msgid "Stream successfully created." +msgstr "Flux creat correctament." + +#: ../src/utils/pacat.c:310 +#, c-format +msgid "pa_stream_get_buffer_attr() failed: %s" +msgstr "Ha fallat pa_stream_get_buffer_attr(): %s" + +#: ../src/utils/pacat.c:314 +#, c-format +msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u" +msgstr "Mètriques del búffer: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u" + +#: ../src/utils/pacat.c:317 +#, c-format +msgid "Buffer metrics: maxlength=%u, fragsize=%u" +msgstr "Mètriques del búffer: maxlength=%u, fragsize=%u" + +#: ../src/utils/pacat.c:321 +#, c-format +msgid "Using sample spec '%s', channel map '%s'." +msgstr "" +"S'estan utilitzant les especificacions de mostreig '%s', mapejat del canal '%" +"s'." + +#: ../src/utils/pacat.c:325 +#, c-format +msgid "Connected to device %s (%u, %ssuspended)." +msgstr "S'ha connectat al dispositiu %s (%u, %ssuspès)." + +#: ../src/utils/pacat.c:335 +#, c-format +msgid "Stream error: %s" +msgstr "S'ha produït un error en l'stream: %s" + +#: ../src/utils/pacat.c:345 +#, c-format +msgid "Stream device suspended.%s" +msgstr "Flux del dispositiu suspès.%s" + +#: ../src/utils/pacat.c:347 +#, c-format +msgid "Stream device resumed.%s" +msgstr "Flux del dispositiu reprès.%s" + +#: ../src/utils/pacat.c:355 +#, c-format +msgid "Stream underrun.%s" +msgstr "Dades insuficients al flux.%s" + +#: ../src/utils/pacat.c:362 +#, c-format +msgid "Stream overrun.%s" +msgstr "Desbordament de flux.%s" + +#: ../src/utils/pacat.c:369 +#, c-format +msgid "Stream started.%s" +msgstr "S'ha iniciat el flux.%s" + +#: ../src/utils/pacat.c:376 +#, c-format +msgid "Stream moved to device %s (%u, %ssuspended).%s" +msgstr "S'ha mogut el flux al dispositiu %s (%u, %ssuspès).%s" + +#: ../src/utils/pacat.c:376 +msgid "not " +msgstr "no " + +#: ../src/utils/pacat.c:383 +#, c-format +msgid "Stream buffer attributes changed.%s" +msgstr "Els atributs del flux de memòria intermèdia han canviat.%s" + +#: ../src/utils/pacat.c:415 +#, c-format +msgid "Connection established.%s" +msgstr "S'ha establert la connexió.%s" + +#: ../src/utils/pacat.c:418 +#, c-format +msgid "pa_stream_new() failed: %s" +msgstr "Ha fallat pa_stream_new(): %s" + +#: ../src/utils/pacat.c:450 +#, c-format +msgid "pa_stream_connect_playback() failed: %s" +msgstr "Ha fallat pa_stream_connect_playback(): %s" + +#: ../src/utils/pacat.c:456 +#, c-format +msgid "pa_stream_connect_record() failed: %s" +msgstr "Ha fallat pa_stream_connect_record(): %s" + +#: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857 +#, c-format +msgid "Connection failure: %s" +msgstr "Ha fallat la connexió: %s" + +#: ../src/utils/pacat.c:503 +msgid "Got EOF." +msgstr "S'ha llegit el fi del fitxer." + +#: ../src/utils/pacat.c:540 +#, c-format +msgid "write() failed: %s" +msgstr "Ha fallat write(): %s" + +#: ../src/utils/pacat.c:561 +msgid "Got signal, exiting." +msgstr "S'ha rebut un senyal, s'està sortint." + +#: ../src/utils/pacat.c:575 +#, c-format +msgid "Failed to get latency: %s" +msgstr "No s'ha pogut obtenir la latència: %s" + +#: ../src/utils/pacat.c:580 +#, c-format +msgid "Time: %0.3f sec; Latency: %0.0f usec." +msgstr "Temps: %0.3f segs; Latència: %0.0f microsegs." + +#: ../src/utils/pacat.c:599 +#, c-format +msgid "pa_stream_update_timing_info() failed: %s" +msgstr "Ha fallat pa_stream_update_timing_info(): %s" + +#: ../src/utils/pacat.c:609 +#, c-format +msgid "" +"%s [options]\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -r, --record Create a connection for recording\n" +" -p, --playback Create a connection for playback\n" +"\n" +" -v, --verbose Enable verbose operations\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -d, --device=DEVICE The name of the sink/source to " +"connect to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" +" --stream-name=NAME How to call this stream on the " +"server\n" +" --volume=VOLUME Specify the initial (linear) volume " +"in range 0...65536\n" +" --rate=SAMPLERATE The sample rate in Hz (defaults to " +"44100)\n" +" --format=SAMPLEFORMAT The sample type, one of s16le, " +"s16be, u8, float32le,\n" +" float32be, ulaw, alaw, s32le, s32be, " +"s24le, s24be,\n" +" s24-32le, s24-32be (defaults to " +"s16ne)\n" +" --channels=CHANNELS The number of channels, 1 for mono, " +"2 for stereo\n" +" (defaults to 2)\n" +" --channel-map=CHANNELMAP Channel map to use instead of the " +"default\n" +" --fix-format Take the sample format from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-rate Take the sampling rate from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-channels Take the number of channels and the " +"channel map\n" +" from the sink the stream is being " +"connected to.\n" +" --no-remix Don't upmix or downmix channels.\n" +" --no-remap Map channels by index instead of " +"name.\n" +" --latency=BYTES Request the specified latency in " +"bytes.\n" +" --process-time=BYTES Request the specified process time " +"per request in bytes.\n" +" --property=PROPERTY=VALUE Set the specified property to the " +"specified value.\n" +" --raw Record/play raw PCM data.\n" +" --file-format=FFORMAT Record/play formatted PCM data.\n" +" --list-file-formats List available file formats.\n" +msgstr "" +"%s [opcions]\n" +"\n" +" -h, --help Mostra aquesta ajuda\n" +" --version Mostra la versió\n" +"\n" +" -r, --record Crea una connexió per a " +"l'enregistrament\n" +" -p, --playback Crea una connexió per a la " +"reproducció\n" +"\n" +" -v, --verbose Habilita les operacions detallades\n" +"\n" +" -s, --server=SERVIDOR Nom del servidor al qual connectar-" +"se\n" +" -d, --device=DISPOSITIU Nom del conducte/font al qual " +"connectar-se\n" +" -n, --client-name=NOM Com cridar aquest client al " +"servidor\n" +" --stream-name=NOM Com cridar aquest flux de dades al " +"servidor\n" +" --volume=VOLUM Especifica el volum inicial lineal " +"dins el rang 0...65536\n" +" --rate=VELOCITATMOSTREIG La velocitat de mostreig en Hz (per " +"omissió, 44100)\n" +" --format=FORMATMOSTRA El tipus de mostra, una de s16le, " +"s16be, u8, float32le,\n" +" float32be, ulaw, alaw, s32le, s32be " +"(per omissió, s16ne)\n" +" --channels=CANALS Número de canals, 1 per a mono, 2 " +"per a estèreo\n" +" (per omissió, 2)\n" +" --channel-map=MAPACANAL Mapa de canals a utilitzar\n" +" --format-fix Pren el format de mostra del " +"conducte al qual s'està connectant\n" +" el flux.\n" +" --fix-rate Pren la velocitat de mostreig del " +"conducte al qual\n" +" s'està connectant el flux.\n" +" --fix-channels Pren el número de canals i el mapa " +"de canals del\n" +" conducte al qual s'està connectant " +"el flux de dades.\n" +" --no-remix No barregis els canals.\n" +" --no-remap Mapeja els canals per índex en " +"comptes de per nom .\n" +" --latencia=BYTES Sol·licita la latència en bytes.\n" +" --process-time=BYTES Sol·licita el temps de procés per " +"petició en bytes.\n" +" --property=PROPIETAT=VALOR Establir la propietat especificada " +"per al valor especificat.\n" +" --raw Gravació/reproducció de dades crues " +"PCM.\n" +" --format-fitxer=FFORMAT Gravació/reproducció de dades amb " +"format PCM.\n" +" --list-file-formats Llista disponible de formats de " +"fitxer.\n" + +#: ../src/utils/pacat.c:731 +#, c-format +msgid "" +"pacat %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pacat %s\n" +"Compilat amb libpulse %s\n" +"Enllaçat amb libpulse %s\n" + +#: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953 +#, c-format +msgid "Invalid client name '%s'" +msgstr "Nom del client invàlid '%s'" + +#: ../src/utils/pacat.c:779 +#, c-format +msgid "Invalid stream name '%s'" +msgstr "Nom de flux de dades invàlid '%s'" + +#: ../src/utils/pacat.c:816 +#, c-format +msgid "Invalid channel map '%s'" +msgstr "Mapa de canals invàlid '%s'" + +#: ../src/utils/pacat.c:845 +#, c-format +msgid "Invalid latency specification '%s'" +msgstr "Especificació de latència invàlida '%s'" + +#: ../src/utils/pacat.c:852 +#, c-format +msgid "Invalid process time specification '%s'" +msgstr "Especificació de temps de procés invàlida '%s'" + +#: ../src/utils/pacat.c:864 +#, c-format +msgid "Invalid property '%s'" +msgstr "Propietat invàlida '%s'" + +#: ../src/utils/pacat.c:881 +#, c-format +msgid "Unknown file format %s." +msgstr "Format desconegut de fitxer %s." + +#: ../src/utils/pacat.c:900 +msgid "Invalid sample specification" +msgstr "Especificació de mostra invàlida" + +#: ../src/utils/pacat.c:910 +#, c-format +msgid "open(): %s" +msgstr "open(): %s" + +#: ../src/utils/pacat.c:915 +#, c-format +msgid "dup2(): %s" +msgstr "dup2(): %s" + +#: ../src/utils/pacat.c:922 +msgid "Too many arguments." +msgstr "Massa arguments." + +#: ../src/utils/pacat.c:933 +msgid "Failed to generate sample specification for file." +msgstr "No s'ha pogut generar l'especificació de mostra del fitxer." + +#: ../src/utils/pacat.c:953 +msgid "Failed to open audio file." +msgstr "No s'ha pogut obrir el fitxer d'àudio." + +#: ../src/utils/pacat.c:959 +msgid "" +"Warning: specified sample specification will be overwritten with " +"specification from file." +msgstr "" +"Advertència: l'especificació de mostra especificada se sobreescriurà amb " +"l'especificació del fitxer." + +#: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997 +msgid "Failed to determine sample specification from file." +msgstr "No s'ha pogut determinar l'especificació de mostra del fitxer." + +#: ../src/utils/pacat.c:971 +msgid "Warning: Failed to determine channel map from file." +msgstr "" +"Advertència: no s'ha pogut determinar el mapeig de canals des del fitxer." + +#: ../src/utils/pacat.c:982 +msgid "Channel map doesn't match sample specification" +msgstr "El mapa de canals no coincideix amb l'especificació de mostra" + +#: ../src/utils/pacat.c:993 +msgid "Warning: failed to write channel map to file." +msgstr "Advertència: no s'ha pogut escriure el mapa de canals en un fitxer." + +#: ../src/utils/pacat.c:1008 +#, c-format +msgid "" +"Opening a %s stream with sample specification '%s' and channel map '%s'." +msgstr "" +"S'està obrint un flux de dades %s amb especificació de mostra '%s' i mapa de " +"canals '%s'." + +#: ../src/utils/pacat.c:1009 +msgid "recording" +msgstr "enregistrant" + +#: ../src/utils/pacat.c:1009 +msgid "playback" +msgstr "reproducció" + +#: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267 +msgid "pa_mainloop_new() failed." +msgstr "Ha fallat el pa_mainloop_new()." + +#: ../src/utils/pacat.c:1054 +msgid "io_new() failed." +msgstr "Ha fallat el io_new()." + +#: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279 +msgid "pa_context_new() failed." +msgstr "Ha fallat el pa_context_new()." + +#: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285 +#, c-format +msgid "pa_context_connect() failed: %s" +msgstr "Ha fallat pa_context_connect(): %s" + +#: ../src/utils/pacat.c:1075 +msgid "pa_context_rttime_new() failed." +msgstr "Ha fallat el pa_context_new()." + +#: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290 +msgid "pa_mainloop_run() failed." +msgstr "Ha fallat el pa_mainloop_run()." + +#: ../src/utils/pasuspender.c:81 +#, c-format +msgid "fork(): %s\n" +msgstr "fork(): %s\n" + +#: ../src/utils/pasuspender.c:92 +#, c-format +msgid "execvp(): %s\n" +msgstr "execvp(): %s\n" + +#: ../src/utils/pasuspender.c:109 +#, c-format +msgid "Failure to suspend: %s\n" +msgstr "No s'ha pogut suspendre: %s\n" + +#: ../src/utils/pasuspender.c:124 +#, c-format +msgid "Failure to resume: %s\n" +msgstr "No s'ha pogut en rependre: %s\n" + +#: ../src/utils/pasuspender.c:147 +#, c-format +msgid "WARNING: Sound server is not local, not suspending.\n" +msgstr "ADVERTÈNCIA: el sevidor de so no és local, no s'està suspenent.\n" + +#: ../src/utils/pasuspender.c:159 +#, c-format +msgid "Connection failure: %s\n" +msgstr "Ha fallat la connexió: %s\n" + +#: ../src/utils/pasuspender.c:176 +#, c-format +msgid "Got SIGINT, exiting.\n" +msgstr "S'ha rebut SIGINT, s'està sortint.\n" + +#: ../src/utils/pasuspender.c:194 +#, c-format +msgid "WARNING: Child process terminated by signal %u\n" +msgstr "ADVERTÈNCIA: procés fill acabat pel senyal %u\n" + +#: ../src/utils/pasuspender.c:212 +#, c-format +msgid "" +"%s [options] ... \n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +"\n" +msgstr "" +"%s [opcions] ... \n" +"\n" +" -h, --help Mostra aquesta ajuda\n" +" --version Mostra la versió\n" +" -s, --server=SERVIDOR Nom del servidor al qual connectar-" +"se\n" +"\n" + +#: ../src/utils/pasuspender.c:248 +#, c-format +msgid "" +"pasuspender %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pasuspender %s\n" +"Compilat amb libpulse %s\n" +"Enllaçat amb libpulse %s\n" + +#: ../src/utils/pasuspender.c:277 +#, c-format +msgid "pa_mainloop_new() failed.\n" +msgstr "Ha fallat el pa_mainloop_new().\n" + +#: ../src/utils/pasuspender.c:290 +#, c-format +msgid "pa_context_new() failed.\n" +msgstr "Ha fallat el pa_context_new().\n" + +#: ../src/utils/pasuspender.c:298 +#, c-format +msgid "pa_mainloop_run() failed.\n" +msgstr "Ha fallat el pa_mainloop_run().\n" + +#: ../src/utils/pactl.c:135 +#, c-format +msgid "Failed to get statistics: %s" +msgstr "No s'han pogut obtenir les estadístiques: %s" + +#: ../src/utils/pactl.c:141 +#, c-format +msgid "Currently in use: %u blocks containing %s bytes total.\n" +msgstr "" +"Actualment s'estan utilitzant: %u blocs que contenen %s bytes en total.\n" + +#: ../src/utils/pactl.c:144 +#, c-format +msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n" +msgstr "" +"Allotjats durant el temps de vida: %u blocs que contenen %s bytes en total.\n" + +#: ../src/utils/pactl.c:147 +#, c-format +msgid "Sample cache size: %s\n" +msgstr "Mida de la memòria cau de mostres: %s\n" + +#: ../src/utils/pactl.c:156 +#, c-format +msgid "Failed to get server information: %s" +msgstr "No s'ha pogut obtenir la informació del servidor: %s" + +#: ../src/utils/pactl.c:164 +#, c-format +msgid "" +"User name: %s\n" +"Host Name: %s\n" +"Server Name: %s\n" +"Server Version: %s\n" +"Default Sample Specification: %s\n" +"Default Channel Map: %s\n" +"Default Sink: %s\n" +"Default Source: %s\n" +"Cookie: %08x\n" +msgstr "" +"Nom d'usuari: %s\n" +"Nom del host: %s\n" +"Nom del servidor: %s\n" +"Versió del servidor: %s\n" +"Especificació per omissió de la mostra: %s\n" +"Mapa de canals per omissió: %s\n" +"Conducte per omissió: %s\n" +"Font per omissió: %s\n" +"Galeta: %08x\n" + +#: ../src/utils/pactl.c:205 +#, c-format +msgid "Failed to get sink information: %s" +msgstr "No s'ha pogut obtenir la informació del conducte: %s" + +#: ../src/utils/pactl.c:221 +#, c-format +msgid "" +"Sink #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor Source: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Conducte #%u\n" +"\tEstat: %s\n" +"\tNom: %s\n" +"\tDescripció: %s\n" +"\tControlador: %s\n" +"\tEspecificació de mostra: %s\n" +"\tMapa de canals: %s\n" +"\tPropietari del mòdul: %u\n" +"\tSilenciat: %s\n" +"\tVolum: %s%s%s\n" +"\t balanceig %0.2f\n" +"\tVolum bàsic: %s%s%s\n" +"\tFont del monitor: %s\n" +"\tLatència: %0.0f microsegs., configurat %0.0f microsegs\n" +"\tModificadors: %s%s%s%s%s%s\n" +"\tPropietats:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360 +#, c-format +msgid "\tPorts:\n" +msgstr "\tPorts:\n" + +#: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366 +#, c-format +msgid "\tActive Port: %s\n" +msgstr "\tPort actiu: %s\n" + +#: ../src/utils/pactl.c:297 +#, c-format +msgid "Failed to get source information: %s" +msgstr "No s'ha pogut obtenir la informació de la font: %s" + +#: ../src/utils/pactl.c:313 +#, c-format +msgid "" +"Source #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor of Sink: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Font #%u\n" +"\tEstat: %s\n" +"\tNom: %s\n" +"\tDescripció: %s\n" +"\tControlador: %s\n" +"\tEspecificació de mostra: %s\n" +"\tMapa de canals: %s\n" +"\tPropietari del mòdul: %u\n" +"\tSilenciat: %s\n" +"\tVolum: %s%s%s\n" +"\t balanceig %0.2f\n" +"\tVolum bàsic: %s%s%s\n" +"\tMonitor del conducte: %s\n" +"\tLatència: %0.0f microsegs., configurat %0.0f microsegs.\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tPropietats:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:345 ../src/utils/pactl.c:401 ../src/utils/pactl.c:436 +#: ../src/utils/pactl.c:473 ../src/utils/pactl.c:532 ../src/utils/pactl.c:533 +#: ../src/utils/pactl.c:543 ../src/utils/pactl.c:587 ../src/utils/pactl.c:588 +#: ../src/utils/pactl.c:594 ../src/utils/pactl.c:637 ../src/utils/pactl.c:638 +#: ../src/utils/pactl.c:645 +msgid "n/a" +msgstr "n/a" + +#: ../src/utils/pactl.c:375 +#, c-format +msgid "Failed to get module information: %s" +msgstr "No s'ha pogut obtenir informació del mòdul: %s" + +#: ../src/utils/pactl.c:393 +#, c-format +msgid "" +"Module #%u\n" +"\tName: %s\n" +"\tArgument: %s\n" +"\tUsage counter: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Mòdul #%u\n" +"\tNom: %s\n" +"\tArguments: %s\n" +"\tContador d'utilització: %s\n" +"\tPropietats:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:412 +#, c-format +msgid "Failed to get client information: %s" +msgstr "No s'ha pogut obtenir informació del client: %s" + +#: ../src/utils/pactl.c:430 +#, c-format +msgid "" +"Client #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Client #%u\n" +"\tControlador: %s\n" +"\tPropietari del mòdul: %s\n" +"\tPropietats:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:447 +#, c-format +msgid "Failed to get card information: %s" +msgstr "No s'ha pogut obtenir la informació de la targeta: %s" + +#: ../src/utils/pactl.c:465 +#, c-format +msgid "" +"Card #%u\n" +"\tName: %s\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Targeta #%u\n" +"\tNom: %s\n" +"\tControlador: %s\n" +"\tPropietari del mòdul: %s\n" +"\tPropietats:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:479 +#, c-format +msgid "\tProfiles:\n" +msgstr "\tPerfils:\n" + +#: ../src/utils/pactl.c:485 +#, c-format +msgid "\tActive Profile: %s\n" +msgstr "\tPerfil actiu: %s\n" + +#: ../src/utils/pactl.c:496 +#, c-format +msgid "Failed to get sink input information: %s" +msgstr "No s'ha pogut obtenir informació del conducte d'entrada: %s" + +#: ../src/utils/pactl.c:515 +#, c-format +msgid "" +"Sink Input #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSink: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tMute: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSink Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Conducte d'entrada #%u\n" +"\tControlador: %s\n" +"\tPropietari del mòdul: %s\n" +"\tClient: %s\n" +"\tConducte: %u\n" +"\tEspecificació de mostra: %s\n" +"\tMapa de canals: %s\n" +"\tSilenciat: %s\n" +"\tVolum: %s\n" +"\t %s\n" +"\t balanç %0.2f\n" +"\tLatència de búffer: %0.0f microsegs.\n" +"\tLatència del conducte: %0.0f microsegs.\n" +"\tMètode de remostreig: %s\n" +"\tPropietats:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:554 +#, c-format +msgid "Failed to get source output information: %s" +msgstr "No s'ha pogut obtenir la informació del conducte de sortida: %s" + +#: ../src/utils/pactl.c:574 +#, c-format +msgid "" +"Source Output #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSource: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSource Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Sortida de la font #%u\n" +"\tControladr: %s\n" +"\tPropietari del mòdul: %s\n" +"\tClient: %s\n" +"\tFont: %u\n" +"\tEspecificació de mostra: %s\n" +"\tMapa de canals: %s\n" +"\tLatència de búffer: %0.0f microsegs.\n" +"\tLatència de la font: %0.0f microsegs.\n" +"\tMètode de remostreig: %s\n" +"\tPropietats:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:605 +#, c-format +msgid "Failed to get sample information: %s" +msgstr "No s'ha pogut obtenir informació de la mostra: %s" + +#: ../src/utils/pactl.c:623 +#, c-format +msgid "" +"Sample #%u\n" +"\tName: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tDuration: %0.1fs\n" +"\tSize: %s\n" +"\tLazy: %s\n" +"\tFilename: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Mostra #%u\n" +"\tNom: %s\n" +"\ttEspecificació de mostra: %s\n" +"\tMapa de canals: %s\n" +"\tVolum: %s\n" +"\t %s\n" +"\t balanceig %0.2f\n" +"\tDuració: %0.1fs\n" +"\tMida: %s\n" +"\tLazy: %s\n" +"\tNom de fitxer: %s\n" +"\tPropietats:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663 +#, c-format +msgid "Failure: %s" +msgstr "Ha fallat: %s" + +#: ../src/utils/pactl.c:687 +#, c-format +msgid "Failed to upload sample: %s" +msgstr "No s'ha pogut pujar la mostra: %s" + +#: ../src/utils/pactl.c:704 +msgid "Premature end of file" +msgstr "S'ha trobat un fi de fitxer prematurament" + +#: ../src/utils/pactl.c:863 +msgid "Got SIGINT, exiting." +msgstr "S'ha rebut SIGINT, s'està sortint." + +#: ../src/utils/pactl.c:869 +#, c-format +msgid "" +"%s [options] stat\n" +"%s [options] list\n" +"%s [options] exit\n" +"%s [options] upload-sample FILENAME [NAME]\n" +"%s [options] play-sample NAME [SINK]\n" +"%s [options] remove-sample NAME\n" +"%s [options] move-sink-input SINKINPUT SINK\n" +"%s [options] move-source-output SOURCEOUTPUT SOURCE\n" +"%s [options] load-module NAME [ARGS ...]\n" +"%s [options] unload-module MODULE\n" +"%s [options] suspend-sink SINK 1|0\n" +"%s [options] suspend-source SOURCE 1|0\n" +"%s [options] set-card-profile CARD PROFILE\n" +"%s [options] set-sink-port SINK PORT\n" +"%s [options] set-source-port SOURCE PORT\n" +"%s [options] set-sink-volume SINK VOLUME\n" +"%s [options] set-source-volume SOURCE VOLUME\n" +"%s [options] set-sink-input-volume SINKINPUT VOLUME\n" +"%s [options] set-sink-mute SINK 1|0\n" +"%s [options] set-source-mute SOURCE 1|0\n" +"%s [options] set-sink-input-mute SINKINPUT 1|0\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" +msgstr "" +"%s [opcions] stat\n" +"%s [opcions] list\n" +"%s [opcions] exit\n" +"%s [opcions] upload-sample NOMFITXER [NOM]\n" +"%s [opcions] play-sample NOM [CONDUCTE]\n" +"%s [opcions] remove-sample NOM\n" +"%s [opcions] move-sink-input CONDUCTEENTRADA CONDUCTE\n" +"%s [opcions] move-source-output FONTSORTIDA FONT\n" +"%s [opcions] load-module NOM [ARGUMENTS ...]\n" +"%s [opcions] unload-module MÒDUL\n" +"%s [opcions] suspend-sink CONDUCTE 1|0\n" +"%s [opcions] suspend-source FONT 1|0\n" +"%s [opcions] set-card-profile TARGETA PERFIL \n" +"%s [opcions] set-sink-port CONDUCTE PORT \n" +"%s [opcions] set-source-port FONT PORT \n" +"%s [options] set-sink-volume CONDUCTE VOLUM\n" +"%s [options] set-source-volume FONT VOLUM\n" +"%s [options] set-sink-input-volume CONDUCTEENTRADA VOLUM\n" +"%s [options] set-sink-mute CONDUCTE 1|0\n" +"%s [options] set-source-mute FONT 1|0\n" +"%s [options] set-sink-input-mute CONDUCTEENTRADA 1|0\n" +"\n" +" -h, --help Mostra aquesta ajuda\n" +" --version Mostra la versió\n" +"\n" +" -s, --server=SERVIDOR Nom del servidor on connectar-s'hi\n" +" -n, --client-name=NOM Com cridar aquest client en el " +"servidor\n" + +#: ../src/utils/pactl.c:933 +#, c-format +msgid "" +"pactl %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pactl %s\n" +"Compilat amb libpulse %s\n" +"Enllaçat amb libpulse %s\n" + +#: ../src/utils/pactl.c:979 +msgid "Please specify a sample file to load" +msgstr "Si us plau, especifiqueu un fitxer de mostra per a carregar" + +#: ../src/utils/pactl.c:992 +msgid "Failed to open sound file." +msgstr "No s'ha pogut obrir el fitxer de so." + +#: ../src/utils/pactl.c:1004 +msgid "Warning: Failed to determine sample specification from file." +msgstr "" +"Advertiment: No s'ha pogut determinar l'especificació de mostra a partir del " +"fitxer." + +#: ../src/utils/pactl.c:1014 +msgid "You have to specify a sample name to play" +msgstr "Heu d'especificar un nom de mostra a reproduir" + +#: ../src/utils/pactl.c:1026 +msgid "You have to specify a sample name to remove" +msgstr "Heu d'especificar un nom de mostra a suprimir" + +#: ../src/utils/pactl.c:1035 +msgid "You have to specify a sink input index and a sink" +msgstr "Heu d'especificar una entrada del conducte i un conducte" + +#: ../src/utils/pactl.c:1045 +msgid "You have to specify a source output index and a source" +msgstr "Heu d'especificar un índex de font de sortida i una font" + +#: ../src/utils/pactl.c:1060 +msgid "You have to specify a module name and arguments." +msgstr "Heu d'especificar un nom de mòdul i els seus arguments." + +#: ../src/utils/pactl.c:1080 +msgid "You have to specify a module index" +msgstr "Heu d'especificar un índex de mòdul" + +#: ../src/utils/pactl.c:1090 +msgid "" +"You may not specify more than one sink. You have to specify a boolean value." +msgstr "" +"No haríeu d'especificar més d'un conducte. Heu d'especificar un valor booleà." + +#: ../src/utils/pactl.c:1103 +msgid "" +"You may not specify more than one source. You have to specify a boolean " +"value." +msgstr "" +"No haríeu d'especificar més d'una font. Heu d'especificar un valor booleà." + +#: ../src/utils/pactl.c:1115 +msgid "You have to specify a card name/index and a profile name" +msgstr "Heu d'especificar un nom o un índex de targeta i un nom de perfil" + +#: ../src/utils/pactl.c:1126 +msgid "You have to specify a sink name/index and a port name" +msgstr "Heu d'especificar un nom o un índex de conducte i un nom de port" + +#: ../src/utils/pactl.c:1137 +msgid "You have to specify a source name/index and a port name" +msgstr "Heu d'especificar un nom o un índex de font i un nom de port" + +#: ../src/utils/pactl.c:1149 +msgid "You have to specify a sink name/index and a volume" +msgstr "Heu d'especificar un nom o un índex de conducte i un volum" + +#: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171 +#: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209 +#: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248 +msgid "Invalid volume specification" +msgstr "Especificació de volum invàlida" + +#: ../src/utils/pactl.c:1166 +msgid "You have to specify a source name/index and a volume" +msgstr "Heu d'especificar un nom o un índex de font i un volum" + +# +#: ../src/utils/pactl.c:1183 +msgid "You have to specify a sink input index and a volume" +msgstr "Heu d'especificar un índex entrada del conducte i un volum" + +#: ../src/utils/pactl.c:1188 +msgid "Invalid sink input index" +msgstr "Índex d'entrada del conducte invàlid" + +#: ../src/utils/pactl.c:1204 +msgid "You have to specify a sink name/index and a mute boolean" +msgstr "" +"Heu d'especificar un nom o un índex de conducte i un booleà de silenciat" + +#: ../src/utils/pactl.c:1221 +msgid "You have to specify a source name/index and a mute boolean" +msgstr "Heu d'especificar un nom o un índex de font i un booleà de silenciat" + +#: ../src/utils/pactl.c:1238 +msgid "You have to specify a sink input index and a mute boolean" +msgstr "" +"Heu d'especificar un índex d'entrada del conducte i un booleà de silenciat" + +#: ../src/utils/pactl.c:1243 +msgid "Invalid sink input index specification" +msgstr "Especificació d'índex d'entrada del conducte invàlida" + +#: ../src/utils/pactl.c:1262 +msgid "No valid command specified." +msgstr "Ordre especificada no vàlida." + +#: ../src/utils/pax11publish.c:61 +#, c-format +msgid "" +"%s [-D display] [-S server] [-O sink] [-I source] [-c file] [-d|-e|-i|-r]\n" +"\n" +" -d Show current PulseAudio data attached to X11 display (default)\n" +" -e Export local PulseAudio data to X11 display\n" +" -i Import PulseAudio data from X11 display to local environment " +"variables and cookie file.\n" +" -r Remove PulseAudio data from X11 display\n" +msgstr "" +"%s [-D pantalla] [-S servidor] [-O conducte] [-I font] [-c fitxer] [-d|-e|-" +"i|-r]\n" +"\n" +" -d Mostra les dades actuals de PulseAudio vinculat a una pantalla X11 " +"(per omissió)\n" +" -e Exporta les dades locals de PulseAudio a una pantalla X11\n" +" -i Importa les dades de PulseAudio d'una pantalla X11 a les variables " +"d'entorn locals i a un fitxer cookie\n" +" -r Esborra les dades de PulseAudio d'una pantalla X11\n" + +#: ../src/utils/pax11publish.c:94 +#, c-format +msgid "Failed to parse command line.\n" +msgstr "No s'ha pogut analitzar la línia d'ordres.\n" + +#: ../src/utils/pax11publish.c:108 +#, c-format +msgid "Server: %s\n" +msgstr "Servidor: %s\n" + +#: ../src/utils/pax11publish.c:110 +#, c-format +msgid "Source: %s\n" +msgstr "Font: %s\n" + +#: ../src/utils/pax11publish.c:112 +#, c-format +msgid "Sink: %s\n" +msgstr "Conducte: %s\n" + +#: ../src/utils/pax11publish.c:114 +#, c-format +msgid "Cookie: %s\n" +msgstr "Galeta: %s\n" + +#: ../src/utils/pax11publish.c:132 +#, c-format +msgid "Failed to parse cookie data\n" +msgstr "No s'han pogut parsejar les dades de la galeta\n" + +#: ../src/utils/pax11publish.c:137 +#, c-format +msgid "Failed to save cookie data\n" +msgstr "No s'han pogut desar les dades de la galeta\n" + +#: ../src/utils/pax11publish.c:152 +#, c-format +msgid "Failed to load client configuration file.\n" +msgstr "No s'ha pogut carregar el fitxer de configuració del client.\n" + +#: ../src/utils/pax11publish.c:157 +#, c-format +msgid "Failed to read environment configuration data.\n" +msgstr "No s'han pogut llegir les dades de configuració de l'entorn.\n" + +#: ../src/utils/pax11publish.c:174 +#, c-format +msgid "Failed to get FQDN.\n" +msgstr "No s'ha pogut obtenir el nom de domini qualificat complet.\n" + +#: ../src/utils/pax11publish.c:194 +#, c-format +msgid "Failed to load cookie data\n" +msgstr "No s'han pogut carregar les dades de la galeta\n" + +#: ../src/utils/pax11publish.c:211 +#, c-format +msgid "Not yet implemented.\n" +msgstr "Encara no s'ha implementat.\n" + +#: ../src/utils/pacmd.c:69 +msgid "No PulseAudio daemon running, or not running as session daemon." +msgstr "" +"El dimoni PulseAudio no s'està executant, o no s'està executant com a dimoni " +"de la sessió." + +#: ../src/utils/pacmd.c:74 +#, c-format +msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s" +msgstr "socket(PF_UNIX, SOCK_STREAM, 0): %s" + +#: ../src/utils/pacmd.c:91 +#, c-format +msgid "connect(): %s" +msgstr "connect(): %s" + +#: ../src/utils/pacmd.c:99 +msgid "Failed to kill PulseAudio daemon." +msgstr "No s'ha pogut matar el dimoni PulseAudio." + +#: ../src/utils/pacmd.c:107 +msgid "Daemon not responding." +msgstr "El dimoni no respon." + +#: ../src/utils/pacmd.c:161 +#, c-format +msgid "poll(): %s" +msgstr "poll(): %s" + +#: ../src/utils/pacmd.c:171 ../src/utils/pacmd.c:188 +#, c-format +msgid "read(): %s" +msgstr "read(): %s" + +#: ../src/utils/pacmd.c:207 ../src/utils/pacmd.c:223 +#, c-format +msgid "write(): %s" +msgstr "write(): %s" + +#: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:219 +msgid "Cannot access autospawn lock." +msgstr "No s'ha pogut accedir al bloqueig d'autospawn." + +#: ../src/modules/alsa/alsa-sink.c:530 ../src/modules/alsa/alsa-sink.c:689 +#, c-format +msgid "" +"ALSA woke us up to write new data to the device, but there was actually " +"nothing to write!\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers.\n" +"We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() " +"returned 0 or another value < min_avail." +msgstr "" +"ALSA ens ha despertat per a escriure dades noves al dispositiu però no hi " +"havia res a escriure!\n" +"Probablement es tracta d'un error del controlador de l'ALSA '%s'. Informeu " +"d'aquest problema als desenvolupadors de l'ALSA.\n" +"Ens han aixecat amb POLLOUT activat -- tanmateix una crida posterior a " +"snd_pcm_avail() ha retornat 0 o un altre valor < min_avail." + +#: ../src/modules/alsa/alsa-source.c:506 ../src/modules/alsa/alsa-source.c:656 +#, c-format +msgid "" +"ALSA woke us up to read new data from the device, but there was actually " +"nothing to read!\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers.\n" +"We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() " +"returned 0 or another value < min_avail." +msgstr "" +"Alsa ens ha cridat per a llegir dades noves del dispositiu, però no hi ha " +"res a llegir!\n" +"Probablement es tracta d'un error de la controladora '%s' de l'ALSA. " +"Reporteu aquest problema als desenvolupadors de l'ALSA.\n" +"Ens han aixecat amb POLLIN activat -- tanmateix una crida posterior a " +"snd_pcm_avail() ha retornat 0 o un altre valor < min_avail." + +#: ../src/modules/alsa/module-alsa-card.c:152 +#: ../src/modules/bluetooth/module-bluetooth-device.c:2228 +#: ../src/modules/alsa/alsa-mixer.c:2931 +msgid "Off" +msgstr "Inactiu" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2184 +msgid "High Fidelity Playback (A2DP)" +msgstr "Reproducció d'alta fidelitat (A2DP)" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2198 +msgid "High Fidelity Capture (A2DP)" +msgstr "Captura d'alta fidelitat (A2DP)" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2213 +msgid "Telephony Duplex (HSP/HFP)" +msgstr "Dúplex de telefonia (HSP/HFP)" + +#: ../src/modules/reserve-wrap.c:151 +msgid "PulseAudio Sound Server" +msgstr "Servidor de so PulseAudio" + +#: ../src/modules/module-rygel-media-server.c:569 +#: ../src/modules/module-rygel-media-server.c:583 +msgid "Output Devices" +msgstr "" + +#: ../src/modules/module-rygel-media-server.c:570 +#: ../src/modules/module-rygel-media-server.c:584 +#, fuzzy +msgid "Input Devices" +msgstr "Entrada %s" + +#: ../src/modules/module-rygel-media-server.c:774 +msgid "Audio on @HOSTNAME@" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1701 +#, fuzzy +msgid "Input" +msgstr "Entrada %s" + +#: ../src/modules/alsa/alsa-mixer.c:1702 +msgid "Docking Station Input" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1703 +msgid "Docking Station Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1704 +msgid "Line-In" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1705 +msgid "Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1706 +msgid "External Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1707 +#, fuzzy +msgid "Internal Microphone" +msgstr "Audio intern" + +#: ../src/modules/alsa/alsa-mixer.c:1708 +msgid "Radio" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1709 +msgid "Video" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1710 +msgid "Automatic Gain Control" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1711 +msgid "No Automatic Gain Control" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1712 +msgid "Boost" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1713 +msgid "No Boost" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1714 +msgid "Amplifier" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1715 +msgid "No Amplifier" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1773 +#, fuzzy +msgid "Analog Input" +msgstr "Mono analògic" + +#: ../src/modules/alsa/alsa-mixer.c:1774 +#, fuzzy +msgid "Analog Microphone" +msgstr "Mono analògic" + +#: ../src/modules/alsa/alsa-mixer.c:1775 +#, fuzzy +msgid "Analog Line-In" +msgstr "Mono analògic" + +#: ../src/modules/alsa/alsa-mixer.c:1776 +#, fuzzy +msgid "Analog Radio" +msgstr "Mono analògic" + +#: ../src/modules/alsa/alsa-mixer.c:1777 +#, fuzzy +msgid "Analog Video" +msgstr "Estèreo analògic" + +#: ../src/modules/alsa/alsa-mixer.c:1778 +#, fuzzy +msgid "Analog Output" +msgstr "Sortida nul·la" + +#: ../src/modules/alsa/alsa-mixer.c:1779 +#, fuzzy +msgid "Analog Headphones" +msgstr "Mono analògic" + +#: ../src/modules/alsa/alsa-mixer.c:1780 +msgid "Analog Output (LFE)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1781 +#, fuzzy +msgid "Analog Mono Output" +msgstr "Mono analògic" + +#: ../src/modules/alsa/alsa-mixer.c:1981 +#, fuzzy, c-format +msgid "%s+%s" +msgstr "%s %s" + +#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404 +#, fuzzy, c-format +msgid "%s / %s" +msgstr "%s %s" + +#: ../src/modules/alsa/alsa-mixer.c:2790 +msgid "Analog Mono" +msgstr "Mono analògic" + +#: ../src/modules/alsa/alsa-mixer.c:2791 +msgid "Analog Stereo" +msgstr "Estèreo analògic" + +#: ../src/modules/alsa/alsa-mixer.c:2792 +#, fuzzy +msgid "Analog Surround 2.1" +msgstr "Envolvent analògic 4.1 " + +#: ../src/modules/alsa/alsa-mixer.c:2793 +#, fuzzy +msgid "Analog Surround 3.0" +msgstr "Envolvent analògic 4.0 " + +#: ../src/modules/alsa/alsa-mixer.c:2794 +#, fuzzy +msgid "Analog Surround 3.1" +msgstr "Envolvent analògic 4.1 " + +#: ../src/modules/alsa/alsa-mixer.c:2795 +msgid "Analog Surround 4.0" +msgstr "Envolvent analògic 4.0 " + +#: ../src/modules/alsa/alsa-mixer.c:2796 +msgid "Analog Surround 4.1" +msgstr "Envolvent analògic 4.1 " + +#: ../src/modules/alsa/alsa-mixer.c:2797 +msgid "Analog Surround 5.0" +msgstr "Envolvent analògic 5.0" + +#: ../src/modules/alsa/alsa-mixer.c:2798 +msgid "Analog Surround 5.1" +msgstr "Envolvent analògic 5.1" + +#: ../src/modules/alsa/alsa-mixer.c:2799 +#, fuzzy +msgid "Analog Surround 6.0" +msgstr "Envolvent analògic 4.0 " + +#: ../src/modules/alsa/alsa-mixer.c:2800 +#, fuzzy +msgid "Analog Surround 6.1" +msgstr "Envolvent analògic 4.1 " + +#: ../src/modules/alsa/alsa-mixer.c:2801 +#, fuzzy +msgid "Analog Surround 7.0" +msgstr "Envolvent analògic 4.0 " + +#: ../src/modules/alsa/alsa-mixer.c:2802 +msgid "Analog Surround 7.1" +msgstr "Envolvent analògic 7.1" + +#: ../src/modules/alsa/alsa-mixer.c:2803 +msgid "Digital Stereo (IEC958)" +msgstr "Estèreo digital (IEC958)" + +#: ../src/modules/alsa/alsa-mixer.c:2804 +#, fuzzy +msgid "Digital Surround 4.0 (IEC958)" +msgstr "Envolvent digital 4.0 (IEC958/AC3)" + +#: ../src/modules/alsa/alsa-mixer.c:2805 +msgid "Digital Surround 4.0 (IEC958/AC3)" +msgstr "Envolvent digital 4.0 (IEC958/AC3)" + +#: ../src/modules/alsa/alsa-mixer.c:2806 +msgid "Digital Surround 5.1 (IEC958/AC3)" +msgstr "Envolvent digital 5.1 (IEC958/AC3)" + +#: ../src/modules/alsa/alsa-mixer.c:2807 +msgid "Digital Stereo (HDMI)" +msgstr "Estèreo digital (HDMI)" + +#: ../src/modules/alsa/alsa-mixer.c:2928 +#, fuzzy +msgid "Analog Mono Duplex" +msgstr "Mono analògic" + +#: ../src/modules/alsa/alsa-mixer.c:2929 +#, fuzzy +msgid "Analog Stereo Duplex" +msgstr "Estèreo analògic" + +#: ../src/modules/alsa/alsa-mixer.c:2930 +#, fuzzy +msgid "Digital Stereo Duplex (IEC958)" +msgstr "Estèreo digital (IEC958)" + +#~ msgid "Invalid client name '%s'\n" +#~ msgstr "Nom del client invàlid '%s'\n" + +#~ msgid "Failed to determine sample specification from file.\n" +#~ msgstr "No s'ha pogut determinar l'especificació de mostra del fitxer.\n" + +#~ msgid "select(): %s" +#~ msgstr "select(): %s" + +#~ msgid "Cannot connect to system bus: %s" +#~ msgstr "No s'ha pogut connectar al bus del sistema: %s" + +#~ msgid "Cannot get caller from PID: %s" +#~ msgstr "No s'ha pogut obtenir una crida del PID: %s" + +#~ msgid "Cannot set UID on caller object." +#~ msgstr "No s'ha pogut especificar l'UID en l'objecte crida." + +#~ msgid "Failed to get CK session." +#~ msgstr "No s'ha pogut obtenir la sessió CK." + +#~ msgid "Cannot set UID on session object." +#~ msgstr "No s'ha pogut definir l'UID en l'objecte sessió." + +#~ msgid "Cannot allocate PolKitAction." +#~ msgstr "No s'ha pogut assignar PolKitAction." + +#~ msgid "Cannot set action_id" +#~ msgstr "No s'ha pogut definir action_id" + +#~ msgid "Cannot allocate PolKitContext." +#~ msgstr "No s'ha pogut assignar PolKitContext." + +#~ msgid "Cannot initialize PolKitContext: %s" +#~ msgstr "No s'ha pogut inicialitzar PolKitContext: %s" + +#~ msgid "Could not determine whether caller is authorized: %s" +#~ msgstr "No s'ha pogut determinar si la crida està autoritzada: %s" + +#~ msgid "Cannot obtain auth: %s" +#~ msgstr "No s'ha pogut obtenir l'autorització: %s" + +#~ msgid "PolicyKit responded with '%s'" +#~ msgstr "PolicyKit ha respós '%s'" + +#~ msgid "" +#~ "High-priority scheduling (negative Unix nice level) for the PulseAudio " +#~ "daemon" +#~ msgstr "" +#~ "Programació d'alta prioritat (nivell Unix nice negatiu) per al dimoni " +#~ "PulseAudio" + +#~ msgid "Real-time scheduling for the PulseAudio daemon" +#~ msgstr "Programació en temps real per al dimoni PulseAudio" + +#~ msgid "" +#~ "System policy prevents PulseAudio from acquiring high-priority scheduling." +#~ msgstr "" +#~ "Les normes d'ús del sistema no permeten PulseAudio adquirir programació " +#~ "d'alta prioritat." + +#~ msgid "" +#~ "System policy prevents PulseAudio from acquiring real-time scheduling." +#~ msgstr "" +#~ "Les normes d'ús del sistema no permeten la programació en temps real de " +#~ "PulseAudio." + +#~ msgid "read() failed: %s\n" +#~ msgstr "Ha fallat read(): %s\n" + +#~ msgid "pa_context_connect() failed: %s\n" +#~ msgstr "Ha fallat el pa_context_connect(): %s\n" + +#~ msgid "We're in the group '%s', allowing high-priority scheduling." +#~ msgstr "" +#~ "Aquesta aplicació està en el grup '%s', s'està establint la prioritat " +#~ "alta." + +#~ msgid "We're in the group '%s', allowing real-time scheduling." +#~ msgstr "" +#~ "Aquesta aplicació està en el grup '%s', s'està establint la prioritat en " +#~ "temps real." + +#~ msgid "PolicyKit grants us acquire-high-priority privilege." +#~ msgstr "PolicyKit ha permés el privilegi acquire-high-priority." + +#~ msgid "PolicyKit refuses acquire-high-priority privilege." +#~ msgstr "PolicyKit ha rebutjat el privilegi acquire-high-priority." + +#~ msgid "PolicyKit grants us acquire-real-time privilege." +#~ msgstr "PolicyKit ha permés el privilegi acquire-real-time." + +#~ msgid "PolicyKit refuses acquire-real-time privilege." +#~ msgstr "PolicyKit ha rebutjat el privilegi acquire-real-time." + +#~ msgid "" +#~ "Called SUID root and real-time and/or high-priority scheduling was " +#~ "requested in the configuration. However, we lack the necessary " +#~ "privileges:\n" +#~ "We are not in group '%s', PolicyKit refuse to grant us the requested " +#~ "privileges and we have no increase RLIMIT_NICE/RLIMIT_RTPRIO resource " +#~ "limits.\n" +#~ "For enabling real-time/high-priority scheduling please acquire the " +#~ "appropriate PolicyKit privileges, or become a member of '%s', or increase " +#~ "the RLIMIT_NICE/RLIMIT_RTPRIO resource limits for this user." +#~ msgstr "" +#~ "S'ha demanat SUID de root i una planificació de temps real i/o d'alta " +#~ "prioritat. Tanmateix, falten els privilegis necessaris:\n" +#~ "No es pertany al grup '%s'. PolicyKit no atorga els privilegis demanats i " +#~ "no s'ha incrementat els límits de recursos RLIMIT_NICE/RLIMIT_RTPRIO.\n" +#~ "Per habilitar la planificació en temps real o d'alta prioritat, heu " +#~ "d'obtenir els privilegis de PolicyKit adequats, o pertànyer al grup '%s', " +#~ "o incrementar els límits de recursos de RLIMIT_NICE/RLIMIT_RTPRIO per a " +#~ "aquest usuari." + +#~ msgid "" +#~ "High-priority scheduling enabled in configuration but not allowed by " +#~ "policy." +#~ msgstr "" +#~ "La prioritat alta està habilitada en la configuració però no està permesa " +#~ "per la política." + +#~ msgid "Successfully increased RLIMIT_RTPRIO" +#~ msgstr "S'ha incrementat el valor de RLIMIT_RTPRIO amb éxit." + +#~ msgid "RLIMIT_RTPRIO failed: %s" +#~ msgstr "S'ha produït un error amb RLIMIT_RTPRIO: %s" + +#~ msgid "Giving up CAP_NICE" +#~ msgstr "S'abandona CAP_NICE" + +#~ msgid "" +#~ "Real-time scheduling enabled in configuration but not allowed by policy." +#~ msgstr "" +#~ "La prioritat de temps real està habilitada en la configuració però no " +#~ "està permesa per la política." + +#~ msgid "Limited capabilities successfully to CAP_SYS_NICE." +#~ msgstr "S'han limitat les capacitats cap a CAP_SYS_NICE." + +#~ msgid "time_new() failed.\n" +#~ msgstr "Ha fallat el time_new().\n" + +#~ msgid "Stream successfully created\n" +#~ msgstr "Flux creat amb èxit\n" + +#~ msgid "Stream errror: %s\n" +#~ msgstr "S'ha produït un error en el flux: %s\n" + +#~ msgid "Connection established.\n" +#~ msgstr "S'ha establert la connexió.\n" + +#~ msgid "" +#~ "%s [options] [FILE]\n" +#~ "\n" +#~ " -h, --help Show this help\n" +#~ " --version Show version\n" +#~ "\n" +#~ " -v, --verbose Enable verbose operation\n" +#~ "\n" +#~ " -s, --server=SERVER The name of the server to connect " +#~ "to\n" +#~ " -d, --device=DEVICE The name of the sink to connect " +#~ "to\n" +#~ " -n, --client-name=NAME How to call this client on the " +#~ "server\n" +#~ " --stream-name=NAME How to call this stream on the " +#~ "server\n" +#~ " --volume=VOLUME Specify the initial (linear) " +#~ "volume in range 0...65536\n" +#~ " --channel-map=CHANNELMAP Set the channel map to the use\n" +#~ msgstr "" +#~ "%s [opcions] [FITXER]\n" +#~ "\n" +#~ " -h, --help Mostra aquesta ajuda\n" +#~ " --version Mostra la versió\n" +#~ "\n" +#~ " -v, --verbose Habilita les operacions " +#~ "detallades\n" +#~ "\n" +#~ " -s, --server=SERVIDOR Nom del servidor al qual " +#~ "connectar-se\n" +#~ " -d, --device=DISPOSITIU Nom del conducte al qual " +#~ "connectar-se\n" +#~ " -n, --client-name=NOM Com cridar aquest client al " +#~ "servidor\n" +#~ " --stream-name=NOM Com cridar aquest flux al " +#~ "servidor\n" +#~ " --volume=VOLUM Especifica el volum inicial " +#~ "(lineal) dins el rang 0...65536\n" +#~ " --rate=VELOCITATMOSTREIG La velocitat de mostreig en Hz " +#~ "(per omissió, 44100)\n" +#~ " --format=FORMATMOSTRA El tipus de mostra, una de s16le, " +#~ "s16be, u8, float32le,\n" +#~ " float32be, ulaw, alaw, s32le, " +#~ "s32be (per omissió, s16ne)\n" +#~ " --channels=CANALS Número de canals, 1 per a mono, 2 " +#~ "per a estèreo\n" +#~ " (per omissió, 2)\n" +#~ " --channel-map=MAPACANAL Mapa de canals a utilitzar\n" +#~ " --fix-format Pren el format de mostra del " +#~ "conducte al qual s'està connectant\n" +#~ " el flux.\n" +#~ " --fix-rate Pren la velocitat de mostreig del " +#~ "conducte al qual\n" +#~ " s'està connectant el flux.\n" +#~ " --fix-channels Pren el número de canals i el " +#~ "mapa de canals del\n" +#~ " conducte al qual s'està " +#~ "connectant el flux.\n" +#~ " --no-remix No mesclar els canals.\n" +#~ " --no-remap Mapeja els canals per índex " +#~ "enlloc de per nom .\n" +#~ " --latency=BYTES Especifica la latència en bytes.\n" +#~ " --process-time=BYTES Especifica el temps de procés per " +#~ "petició en bytes.\n" + +#~ msgid "" +#~ "paplay %s\n" +#~ "Compiled with libpulse %s\n" +#~ "Linked with libpulse %s\n" +#~ msgstr "" +#~ "paplay %s\n" +#~ "Compilat amb libpulse %s\n" +#~ "Enllaçat amb libpulse %s\n" + +#~ msgid "Invalid channel map\n" +#~ msgstr "Mapa de canals invàlid\n" + +#~ msgid "Failed to open file '%s'\n" +#~ msgstr "No s'ha pogut obrir el fitxer '%s'\n" + +#~ msgid "Channel map doesn't match file.\n" +#~ msgstr "El mapa de canals no coincideix amb el fitxer.\n" + +#~ msgid "Using sample spec '%s'\n" +#~ msgstr "S'estan utilitzant les especificacions de mostra '%s'\n" + +#~ msgid "Output %s + Input %s" +#~ msgstr "Sortida %s + Entrada %s" + +#~ msgid "" +#~ "Called SUID root and real-time/high-priority scheduling was requested in " +#~ "the configuration. However, we lack the necessary priviliges:\n" +#~ "We are not in group '" +#~ msgstr "" +#~ "La crida de la SUID de root i la prioritat alta/temps real estàn " +#~ "especificades en la configuració, però no té els permissos necessaris:\n" +#~ "No es pertany al grup '" + +#~ msgid "" +#~ "' and PolicyKit refuse to grant us priviliges. Dropping SUID again.\n" +#~ "For enabling real-time scheduling please acquire the appropriate " +#~ "PolicyKit priviliges, or become a member of '" +#~ msgstr "" +#~ "' i PolicyKit ha denegat els permísos. S'està lliberant SUID. \n" +#~ "Per habilitar la prioritat en temps real, s'ha de adquirir els permissos " +#~ "de PolicyKit, o pertanyer a '" + +#~ msgid "" +#~ "', or increase the RLIMIT_NICE/RLIMIT_RTPRIO resource limits for this " +#~ "user." +#~ msgstr "" +#~ "', o incremetar els límits de recursos RLIMIT_NICE/RLIMIT_RTPRIO per " +#~ "aquest usuari." + +#~ msgid "Default sink name (%s) does not exist in name register." +#~ msgstr "El nom sink per omissió (%s) no existeix en el registre de noms." + +#~ msgid "Buffer overrun, dropping incoming data\n" +#~ msgstr "" +#~ "S'ha sobrepassat la memòria intermitja, s'estan descartant les dades " +#~ "entrants\n" + +#~ msgid "pa_stream_drop() failed: %s\n" +#~ msgstr "Ha fallat pa_stream_drop(): %s\n" + +#~ msgid "muted" +#~ msgstr "silenciat" + +#~ msgid "" +#~ "*** Autoload Entry #%u ***\n" +#~ "Name: %s\n" +#~ "Type: %s\n" +#~ "Module: %s\n" +#~ "Argument: %s\n" +#~ msgstr "" +#~ "*** Entrada de càrrega automàtica #%u ***\n" +#~ "Nom: %s\n" +#~ "Tipus: %s\n" +#~ "Mòdul: %s\n" +#~ "Arguments: %s\n" + +#~ msgid "sink" +#~ msgstr "conducte" + +#~ msgid "source" +#~ msgstr "font" diff --git a/po/cs.po b/po/cs.po new file mode 100644 index 0000000..6d6c3a5 --- /dev/null +++ b/po/cs.po @@ -0,0 +1,2771 @@ +# Czech translation of pulseaudio. +# Copyright (C) 2008, 2009 the author(s) of pulseaudio. +# This file is distributed under the same license as the pulseaudio package. +# Petr Kovar , 2008, 2009. +msgid "" +msgstr "" +"Project-Id-Version: pulseaudio.master-tx\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-10-17 09:51+0000\n" +"PO-Revision-Date: 2009-10-17 17:08+0200\n" +"Last-Translator: Petr Kovar \n" +"Language-Team: Czech \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" +"X-Generator: Lokalize 1.0\n" + +#: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629 +#, c-format +msgid "%s %s" +msgstr "%s %s" + +#: ../src/modules/alsa/alsa-util.c:1106 +#, c-format +msgid "" +"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu " +"ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_avail() navrátil hodnotu, která je nezvykle vysoká: %lu bajtů (%lu " +"ms).\n" +"S největší pravděpodobností se jedná o chybu v ovladači ALSA \"%s\". " +"Nahlaste prosím tento problém vývojářům ALSA." + +#: ../src/modules/alsa/alsa-util.c:1147 +#, c-format +msgid "" +"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%" +"lu ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_delay() navrátil hodnotu, která je nezvykle vysoká: %li bajtů (%s%lu " +"ms).\n" +"S největší pravděpodobností se jedná o chybu v ovladači ALSA \"%s\". " +"Nahlaste prosím tento problém vývojářům ALSA." + +#: ../src/modules/alsa/alsa-util.c:1194 +#, c-format +msgid "" +"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes " +"(%lu ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_mmap_begin() navrátil hodnotu, která je nezvykle vysoká: %lu bajtů (%" +"lu ms).\n" +"S největší pravděpodobností se jedná o chybu v ovladači ALSA \"%s\". " +"Nahlaste prosím tento problém vývojářům ALSA." + +#: ../src/modules/module-always-sink.c:39 +msgid "Always keeps at least one sink loaded even if it's a null one" +msgstr "Udržuje nahraný vždy alespoň jeden cíl, i když se jedná o \"null\"" + +#: ../src/modules/module-always-sink.c:83 +msgid "Dummy Output" +msgstr "Prázdný výstup" + +#: ../src/modules/module-ladspa-sink.c:49 +msgid "Virtual LADSPA sink" +msgstr "Virtuální cíl LADSPA" + +#: ../src/modules/module-ladspa-sink.c:53 +msgid "" +"sink_name= sink_properties= " +"master= format= rate= " +"channels= channel_map= plugin= label= control=" +msgstr "" +"sink_name= sink_properties= master= format= rate= " +"channels= channel_map= plugin= label= control=<čárkou " +"oddělený seznam hodnot ovládání vstupu>" + +#: ../src/modules/module-null-sink.c:55 +msgid "Clocked NULL sink" +msgstr "Taktovaný cíl NULL" + +#: ../src/modules/module-null-sink.c:291 +msgid "Null Output" +msgstr "Výstup \"null\"" + +#: ../src/pulsecore/sink.c:2613 +msgid "Internal Audio" +msgstr "Vnitřní zvukový systém" + +#: ../src/pulsecore/sink.c:2618 +msgid "Modem" +msgstr "Modem" + +#: ../src/daemon/ltdl-bind-now.c:124 +msgid "Failed to find original lt_dlopen loader." +msgstr "Nezdařilo se nalézt původní nahrávací program lt_dlopen." + +#: ../src/daemon/ltdl-bind-now.c:129 +msgid "Failed to allocate new dl loader." +msgstr "Nezdařilo se přidělení nového nahrávacího programu dl." + +#: ../src/daemon/ltdl-bind-now.c:142 +msgid "Failed to add bind-now-loader." +msgstr "Nezdařilo se přidat bind-now-loader." + +#: ../src/daemon/main.c:141 +#, c-format +msgid "Got signal %s." +msgstr "Získán signál %s." + +#: ../src/daemon/main.c:168 +msgid "Exiting." +msgstr "Ukončování." + +#: ../src/daemon/main.c:186 +#, c-format +msgid "Failed to find user '%s'." +msgstr "Nezdařilo se nalézt uživatele \"%s\"." + +#: ../src/daemon/main.c:191 +#, c-format +msgid "Failed to find group '%s'." +msgstr "Nezdařilo se nalézt skupinu \"%s\"." + +#: ../src/daemon/main.c:195 +#, c-format +msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)." +msgstr "Nalezen uživatel \"%s\" (UID %lu) a skupina \"%s\" (GID %lu)." + +#: ../src/daemon/main.c:200 +#, c-format +msgid "GID of user '%s' and of group '%s' don't match." +msgstr "GID uživatele \"%s\" a skupiny \"%s\" nesouhlasí." + +#: ../src/daemon/main.c:205 +#, c-format +msgid "Home directory of user '%s' is not '%s', ignoring." +msgstr "Domovský adresář uživatele \"%s\" není \"%s\", bude ignorováno." + +#: ../src/daemon/main.c:208 ../src/daemon/main.c:213 +#, c-format +msgid "Failed to create '%s': %s" +msgstr "Nezdařilo se vytvořit \"%s\": %s" + +#: ../src/daemon/main.c:220 +#, c-format +msgid "Failed to change group list: %s" +msgstr "Nezdařilo se změnit seznam skupin: %s" + +#: ../src/daemon/main.c:236 +#, c-format +msgid "Failed to change GID: %s" +msgstr "Nezdařilo se změnit GID: %s" + +#: ../src/daemon/main.c:252 +#, c-format +msgid "Failed to change UID: %s" +msgstr "Nezdařilo se změnit UID: %s" + +#: ../src/daemon/main.c:271 +msgid "Successfully dropped root privileges." +msgstr "Oprávnění superuživatele úspěšně zrušena." + +#: ../src/daemon/main.c:279 +msgid "System wide mode unsupported on this platform." +msgstr "Režim celého systému není na této platformě podporován." + +#: ../src/daemon/main.c:297 +#, c-format +msgid "setrlimit(%s, (%u, %u)) failed: %s" +msgstr "setrlimit(%s, (%u, %u)) selhalo: %s" + +#: ../src/daemon/main.c:474 +msgid "Failed to parse command line." +msgstr "Nezdařila se analýza příkazového řádku." + +#: ../src/daemon/main.c:541 +msgid "Daemon not running" +msgstr "Démon neběží" + +#: ../src/daemon/main.c:543 +#, c-format +msgid "Daemon running as PID %u" +msgstr "Démon běží jako PID %u" + +#: ../src/daemon/main.c:553 +#, c-format +msgid "Failed to kill daemon: %s" +msgstr "Zabití démona se nezdařilo: %s" + +#: ../src/daemon/main.c:571 +msgid "" +"This program is not intended to be run as root (unless --system is " +"specified)." +msgstr "" +"Tento program není určen ke spuštění pod superuživatelem (není-li zadáno --" +"system)." + +#: ../src/daemon/main.c:573 +msgid "Root privileges required." +msgstr "Jsou vyžadována oprávnění superuživatele." + +#: ../src/daemon/main.c:578 +msgid "--start not supported for system instances." +msgstr "--start nepodporováno u systémových instancí." + +#: ../src/daemon/main.c:583 +msgid "Running in system mode, but --disallow-exit not set!" +msgstr "Běží v systémovém režimu, ale nenastaveno --disallow-exit!" + +#: ../src/daemon/main.c:586 +msgid "Running in system mode, but --disallow-module-loading not set!" +msgstr "Běží v systémovém režimu, ale nenastaveno --disallow-module-loading!" + +#: ../src/daemon/main.c:589 +msgid "Running in system mode, forcibly disabling SHM mode!" +msgstr "Běží v systémovém režimu, vynuceně se vypíná režim SHM!" + +#: ../src/daemon/main.c:594 +msgid "Running in system mode, forcibly disabling exit idle time!" +msgstr "Běží v systémovém režimu, vynuceně se vypíná čas nečinnosti ukončení!" + +#: ../src/daemon/main.c:621 +msgid "Failed to acquire stdio." +msgstr "Nezdařilo se získání stdio." + +#: ../src/daemon/main.c:627 +#, c-format +msgid "pipe failed: %s" +msgstr "pipe selhalo: %s" + +#: ../src/daemon/main.c:632 +#, c-format +msgid "fork() failed: %s" +msgstr "fork() selhalo: %s" + +#: ../src/daemon/main.c:646 ../src/utils/pacat.c:508 +#, c-format +msgid "read() failed: %s" +msgstr "read() selhalo: %s" + +#: ../src/daemon/main.c:652 +msgid "Daemon startup failed." +msgstr "Spuštění démona selhalo." + +#: ../src/daemon/main.c:654 +msgid "Daemon startup successful." +msgstr "Spuštění démona bylo úspěšné." + +#: ../src/daemon/main.c:731 +#, c-format +msgid "This is PulseAudio %s" +msgstr "Toto je PulseAudio %s" + +#: ../src/daemon/main.c:732 +#, c-format +msgid "Compilation host: %s" +msgstr "Překladový počítač: %s" + +#: ../src/daemon/main.c:733 +#, c-format +msgid "Compilation CFLAGS: %s" +msgstr "Překladové CFLAGS: %s" + +#: ../src/daemon/main.c:736 +#, c-format +msgid "Running on host: %s" +msgstr "Běží na počítači: %s" + +#: ../src/daemon/main.c:739 +#, c-format +msgid "Found %u CPUs." +msgstr "Nalezen následující počet CPU: %u." + +#: ../src/daemon/main.c:741 +#, c-format +msgid "Page size is %lu bytes" +msgstr "Velikost stránky je %lu bajtů" + +#: ../src/daemon/main.c:744 +msgid "Compiled with Valgrind support: yes" +msgstr "Přeloženo s podporou Valgrind: ano" + +#: ../src/daemon/main.c:746 +msgid "Compiled with Valgrind support: no" +msgstr "Přeloženo s podporou Valgrind: ne" + +#: ../src/daemon/main.c:749 +#, c-format +msgid "Running in valgrind mode: %s" +msgstr "Běží v režimu valgrind: %s" + +#: ../src/daemon/main.c:752 +msgid "Optimized build: yes" +msgstr "Optimalizované sestavení: ano" + +#: ../src/daemon/main.c:754 +msgid "Optimized build: no" +msgstr "Optimalizované sestavení: ne" + +#: ../src/daemon/main.c:758 +msgid "NDEBUG defined, all asserts disabled." +msgstr "NDEBUG definováno, všechny výrazy zakázány." + +#: ../src/daemon/main.c:760 +msgid "FASTPATH defined, only fast path asserts disabled." +msgstr "FASTPATH definováno, zakázány pouze výrazy rychlých cest." + +#: ../src/daemon/main.c:762 +msgid "All asserts enabled." +msgstr "Všechny výrazy povoleny." + +#: ../src/daemon/main.c:766 +msgid "Failed to get machine ID" +msgstr "Nezdařilo se získání ID počítače" + +#: ../src/daemon/main.c:769 +#, c-format +msgid "Machine ID is %s." +msgstr "ID počítače je %s." + +#: ../src/daemon/main.c:773 +#, c-format +msgid "Session ID is %s." +msgstr "ID sezení je %s." + +#: ../src/daemon/main.c:779 +#, c-format +msgid "Using runtime directory %s." +msgstr "Používán běhový adresář %s." + +#: ../src/daemon/main.c:784 +#, c-format +msgid "Using state directory %s." +msgstr "Používán stavový adresář %s." + +#: ../src/daemon/main.c:787 +#, c-format +msgid "Using modules directory %s." +msgstr "Používán adresář modulů %s." + +#: ../src/daemon/main.c:789 +#, c-format +msgid "Running in system mode: %s" +msgstr "Běží v systémovém režimu: %s" + +#: ../src/daemon/main.c:792 +msgid "" +"OK, so you are running PA in system mode. Please note that you most likely " +"shouldn't be doing that.\n" +"If you do it nonetheless then it's your own fault if things don't work as " +"expected.\n" +"Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an " +"explanation why system mode is usually a bad idea." +msgstr "" +"Dobrá, máte tedy PA spuštěn v systémovém režimu. Vemte prosím na vědomí, že " +"k tomuto by až na výjimečné situace němelo docházet.\n" +"Pokud v této činnosti přesto budete pokračovat, nesete riziko za možné " +"špatné a nepředvídatelné chování systému.\n" +"Vysvětlení, proč je systémový režim obvykle velmi špatný nápad, si můžete " +"přečíst na http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode." + +#: ../src/daemon/main.c:809 +msgid "pa_pid_file_create() failed." +msgstr "pa_pid_file_create() selhalo." + +#: ../src/daemon/main.c:819 +msgid "Fresh high-resolution timers available! Bon appetit!" +msgstr "" +"Jsou dostupné výtečné časovače o vysokém rozlišení. Tak s chutí do toho!" + +#: ../src/daemon/main.c:821 +msgid "" +"Dude, your kernel stinks! The chef's recommendation today is Linux with high-" +"resolution timers enabled!" +msgstr "" +"Sorry, vole, kernel error! Tip šéfkuchaře na dnešní den zní: Linux se " +"zapnutými časovači o vysokém rozlišení." + +#: ../src/daemon/main.c:844 +msgid "pa_core_new() failed." +msgstr "pa_core_new() selhalo." + +#: ../src/daemon/main.c:904 +msgid "Failed to initialize daemon." +msgstr "Selhalo spuštění démona." + +#: ../src/daemon/main.c:909 +msgid "Daemon startup without any loaded modules, refusing to work." +msgstr "Spuštění démona bez jakýchkoliv nahraných modulů, běh bude odmítnut." + +#: ../src/daemon/main.c:926 +msgid "Daemon startup complete." +msgstr "Spuštění démona dokončeno." + +#: ../src/daemon/main.c:932 +msgid "Daemon shutdown initiated." +msgstr "Vypínání démona spuštěno." + +#: ../src/daemon/main.c:954 +msgid "Daemon terminated." +msgstr "Démon ukončen." + +#: ../src/daemon/cmdline.c:115 +#, c-format +msgid "" +"%s [options]\n" +"\n" +"COMMANDS:\n" +" -h, --help Show this help\n" +" --version Show version\n" +" --dump-conf Dump default configuration\n" +" --dump-modules Dump list of available modules\n" +" --dump-resample-methods Dump available resample methods\n" +" --cleanup-shm Cleanup stale shared memory " +"segments\n" +" --start Start the daemon if it is not " +"running\n" +" -k --kill Kill a running daemon\n" +" --check Check for a running daemon (only " +"returns exit code)\n" +"\n" +"OPTIONS:\n" +" --system[=BOOL] Run as system-wide instance\n" +" -D, --daemonize[=BOOL] Daemonize after startup\n" +" --fail[=BOOL] Quit when startup fails\n" +" --high-priority[=BOOL] Try to set high nice level\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_NICE)\n" +" --realtime[=BOOL] Try to enable realtime scheduling\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_RTPRIO)\n" +" --disallow-module-loading[=BOOL] Disallow module user requested " +"module\n" +" loading/unloading after startup\n" +" --disallow-exit[=BOOL] Disallow user requested exit\n" +" --exit-idle-time=SECS Terminate the daemon when idle and " +"this\n" +" time passed\n" +" --module-idle-time=SECS Unload autoloaded modules when idle " +"and\n" +" this time passed\n" +" --scache-idle-time=SECS Unload autoloaded samples when idle " +"and\n" +" this time passed\n" +" --log-level[=LEVEL] Increase or set verbosity level\n" +" -v Increase the verbosity level\n" +" --log-target={auto,syslog,stderr} Specify the log target\n" +" --log-meta[=BOOL] Include code location in log " +"messages\n" +" --log-time[=BOOL] Include timestamps in log messages\n" +" --log-backtrace=FRAMES Include a backtrace in log messages\n" +" -p, --dl-search-path=PATH Set the search path for dynamic " +"shared\n" +" objects (plugins)\n" +" --resample-method=METHOD Use the specified resampling method\n" +" (See --dump-resample-methods for\n" +" possible values)\n" +" --use-pid-file[=BOOL] Create a PID file\n" +" --no-cpu-limit[=BOOL] Do not install CPU load limiter on\n" +" platforms that support it.\n" +" --disable-shm[=BOOL] Disable shared memory support.\n" +"\n" +"STARTUP SCRIPT:\n" +" -L, --load=\"MODULE ARGUMENTS\" Load the specified plugin module " +"with\n" +" the specified argument\n" +" -F, --file=FILENAME Run the specified script\n" +" -C Open a command line on the running " +"TTY\n" +" after startup\n" +"\n" +" -n Don't load default script file\n" +msgstr "" +"%s [přepínače]\n" +"\n" +"PŘÍKAZY:\n" +" -h, --help Zobrazí tuto nápovědu\n" +" --version Zobrazí verzi\n" +" --dump-conf Vypíše výchozí nastavení\n" +" --dump-modules Vypíše seznam dostupných modulů\n" +" --dump-resample-methods Vypíše dostupné metody " +"převzorkování\n" +" --cleanup-shm Vyprázdní zastaralé části sdílené " +"paměti\n" +" --start Spustí démona, pokud neběží\n" +" -k --kill Zabije běžícího démona\n" +" --check Zjistí, zda démon běží (vrací pouze " +"ukončovací kód)\n" +"\n" +"PŘEPÍNAČE:\n" +" --system[=BOOLEOVSKÁ] Poběží jako celosystémová instance\n" +" -D, --daemonize[=BOOLEOVSKÁ] Stane se démonem po spuštění\n" +" --fail[=BOOLEOVSKÁ] Ukončí se v případě selhání " +"spuštění\n" +" --high-priority[=BOOLEOVSKÁ] Pokusí se nastavit vysokou úroveň " +"nice\n" +" (dostupné pouze u superuživatele, v " +"případě SUID nebo\n" +" se zvýšeným RLIMIT_NICE)\n" +" --realtime[=BOOLEOVSKÁ] Pokusí se zapnout plánování v " +"reálném čase\n" +" (dostupné pouze u superuživatele, v " +"případě SUID nebo\n" +" se zvýšeným RLIMIT_RTPRIO)\n" +" --disallow-module-loading[=BOOLEOVSKÁ] Nepovolí nahrání či zrušení " +"nahrání modulu po spuštění\n" +" vyžádané uživatelem modulu\n" +" --disallow-exit[=BOOLEOVSKÁ] Nepovolí ukončení vyžádané " +"uživatelem\n" +" --exit-idle-time=SEKUNDY Ukončí démona v případě nečinnosti a " +"po\n" +" této době\n" +" --module-idle-time=SEKUNDY Zruší nahrání automaticky nahraných " +"modulů v případě nečinnosti\n" +" a po této době\n" +" --scache-idle-time=SEKUNDY Zruší nahrání automaticky nahraných " +"vzorků v případě nečinnosti a\n" +" po této době\n" +" --log-level[=ÚROVEŇ] Zvýší nebo nastaví úroveň " +"podrobností\n" +" -v Zvýší úroveň podrobností\n" +" --log-target={auto,syslog,stderr} Určí cíl záznamů\n" +" --log-meta[=BOOLEOVSKÁ] Do záznamů zahrne umístění kódu\n" +" --log-time[=BOOLEOVSKÁ] Do záznamů zahrne určení času\n" +" --log-backtrace=RÁMCE Do záznamů zahrne backtrace\n" +" -p, --dl-search-path=CESTA Nastaví cestu hledání z důvodu " +"dynamického sdílení\n" +" objektů (zásuvných modulů)\n" +" --resample-method=METODA Použije zadanou metodu " +"převzorkování\n" +" (Možné hodnoty viz\n" +" --dump-resample-methods)\n" +" --use-pid-file[=BOOLEOVSKÁ] Vytvoří soubor PID\n" +" --no-cpu-limit[=BOOLEOVSKÁ] Nenainstaluje omezovač zátěže CPU\n" +" na platformách, které ho podporují.\n" +" --disable-shm[=BOOLEOVSKÁ] Vypne podporu sdílené paměti.\n" +"\n" +"SPOUŠTĚCÍ SKRIPT:\n" +" -L, --load=\"ARGUMENTY MODULU\" Nahraje zadaný zásuvný modul\n" +" s určeným argumentem\n" +" -F, --file=NÁZEVSOUBORU Spustí zadaný skript\n" +" -C Po spuštění otevře příkazový řádek\n" +" na běžícím TTY\n" +"\n" +" -n Nenahraje výchozí soubor skriptu\n" + +#: ../src/daemon/cmdline.c:247 +msgid "--daemonize expects boolean argument" +msgstr "--daemonize předpokládá booleovský argument" + +#: ../src/daemon/cmdline.c:254 +msgid "--fail expects boolean argument" +msgstr "--fail předpokládá booleovský argument" + +#: ../src/daemon/cmdline.c:264 +msgid "" +"--log-level expects log level argument (either numeric in range 0..4 or one " +"of debug, info, notice, warn, error)." +msgstr "" +"--log-level předpokládá argument protokolovací úrovně (buď číselný v rozmezí " +"0..4, nebo jeden z debug, info, notice, warn, error)." + +#: ../src/daemon/cmdline.c:276 +msgid "--high-priority expects boolean argument" +msgstr "--high-priority předpokládá booleovský argument" + +#: ../src/daemon/cmdline.c:283 +msgid "--realtime expects boolean argument" +msgstr "--realtime předpokládá booleovský argument" + +#: ../src/daemon/cmdline.c:290 +msgid "--disallow-module-loading expects boolean argument" +msgstr "--disallow-module-loading předpokládá booleovský argument" + +#: ../src/daemon/cmdline.c:297 +msgid "--disallow-exit expects boolean argument" +msgstr "--disallow-exit předpokládá booleovský argument" + +#: ../src/daemon/cmdline.c:304 +msgid "--use-pid-file expects boolean argument" +msgstr "--use-pid-file předpokládá booleovský argument" + +#: ../src/daemon/cmdline.c:321 +msgid "Invalid log target: use either 'syslog', 'stderr' or 'auto'." +msgstr "" +"Neplatný cíl protokolu: použijte buďto \"syslog\", \"stderr\" nebo \"auto\"." + +#: ../src/daemon/cmdline.c:328 +msgid "--log-time expects boolean argument" +msgstr "--log-time předpokládá booleovský argument" + +#: ../src/daemon/cmdline.c:335 +msgid "--log-meta expects boolean argument" +msgstr "--log-meta předpokládá booleovský argument" + +#: ../src/daemon/cmdline.c:354 +#, c-format +msgid "Invalid resample method '%s'." +msgstr "Neplatná metoda převzorkování \"%s\"." + +#: ../src/daemon/cmdline.c:361 +msgid "--system expects boolean argument" +msgstr "--system předpokládá booleovský argument" + +#: ../src/daemon/cmdline.c:368 +msgid "--no-cpu-limit expects boolean argument" +msgstr "--no-cpu-limit předpokládá booleovský argument" + +#: ../src/daemon/cmdline.c:375 +msgid "--disable-shm expects boolean argument" +msgstr "--disable-shm předpokládá booleovský argument" + +#: ../src/daemon/dumpmodules.c:60 +#, c-format +msgid "Name: %s\n" +msgstr "Název: %s\n" + +#: ../src/daemon/dumpmodules.c:63 +#, c-format +msgid "No module information available\n" +msgstr "O modulu nejsou dostupné žádné informace\n" + +#: ../src/daemon/dumpmodules.c:66 +#, c-format +msgid "Version: %s\n" +msgstr "Verze: %s\n" + +#: ../src/daemon/dumpmodules.c:68 +#, c-format +msgid "Description: %s\n" +msgstr "Popis: %s\n" + +#: ../src/daemon/dumpmodules.c:70 +#, c-format +msgid "Author: %s\n" +msgstr "Autor: %s\n" + +#: ../src/daemon/dumpmodules.c:72 +#, c-format +msgid "Usage: %s\n" +msgstr "Použití: %s\n" + +#: ../src/daemon/dumpmodules.c:73 +#, c-format +msgid "Load Once: %s\n" +msgstr "Načíst jednou: %s\n" + +#: ../src/daemon/dumpmodules.c:75 +#, c-format +msgid "DEPRECATION WARNING: %s\n" +msgstr "VAROVÁNÍ ZASTARALOSTI: %s\n" + +#: ../src/daemon/dumpmodules.c:79 +#, c-format +msgid "Path: %s\n" +msgstr "Cesta: %s\n" + +#: ../src/daemon/daemon-conf.c:232 +#, c-format +msgid "[%s:%u] Invalid log target '%s'." +msgstr "[%s:%u] Neplatný protokolovací cíl \"%s\"." + +#: ../src/daemon/daemon-conf.c:248 +#, c-format +msgid "[%s:%u] Invalid log level '%s'." +msgstr "[%s:%u] Neplatná protokolovací úroveň \"%s\"." + +#: ../src/daemon/daemon-conf.c:264 +#, c-format +msgid "[%s:%u] Invalid resample method '%s'." +msgstr "[%s:%u] Neplatná metoda převzorkování \"%s\"." + +#: ../src/daemon/daemon-conf.c:287 +#, c-format +msgid "[%s:%u] Invalid rlimit '%s'." +msgstr "[%s:%u] Neplatné rlimit \"%s\"." + +#: ../src/daemon/daemon-conf.c:294 +#, c-format +msgid "[%s:%u] rlimit not supported on this platform." +msgstr "[%s:%u] rlimit na této platformě není podporováno." + +#: ../src/daemon/daemon-conf.c:310 +#, c-format +msgid "[%s:%u] Invalid sample format '%s'." +msgstr "[%s:%u] Neplatný vzorkovací formát \"%s\"." + +#: ../src/daemon/daemon-conf.c:328 +#, c-format +msgid "[%s:%u] Invalid sample rate '%s'." +msgstr "[%s:%u] Neplatná vzorkovací frekvence \"%s\"." + +#: ../src/daemon/daemon-conf.c:352 +#, c-format +msgid "[%s:%u] Invalid sample channels '%s'." +msgstr "[%s:%u] Neplatné vzorkovací kanály \"%s\"." + +#: ../src/daemon/daemon-conf.c:370 +#, c-format +msgid "[%s:%u] Invalid channel map '%s'." +msgstr "[%s:%u] Neplatná mapa kanálů \"%s\"." + +#: ../src/daemon/daemon-conf.c:388 +#, c-format +msgid "[%s:%u] Invalid number of fragments '%s'." +msgstr "[%s:%u] Neplatný počet fragmentů \"%s\"." + +#: ../src/daemon/daemon-conf.c:406 +#, c-format +msgid "[%s:%u] Invalid fragment size '%s'." +msgstr "[%s:%u] Neplatná velikost fragmentu \"%s\"." + +#: ../src/daemon/daemon-conf.c:424 +#, c-format +msgid "[%s:%u] Invalid nice level '%s'." +msgstr "[%s:%u] Neplatná úroveň nice \"%s\"." + +#: ../src/daemon/daemon-conf.c:546 +#, c-format +msgid "Failed to open configuration file: %s" +msgstr "Nezdařilo se otevřít konfigurační soubor: %s" + +#: ../src/daemon/daemon-conf.c:562 +msgid "" +"The specified default channel map has a different number of channels than " +"the specified default number of channels." +msgstr "" +"Zadaná výchozí mapa kanálů obsahuje odlišný počet kanálů než je zadaný " +"výchozí počet kanálů." + +#: ../src/daemon/daemon-conf.c:638 +#, c-format +msgid "### Read from configuration file: %s ###\n" +msgstr "### Čtení z konfiguračního souboru: %s ###\n" + +#: ../src/daemon/caps.c:62 +msgid "Cleaning up privileges." +msgstr "Rušení oprávnění." + +#: ../src/daemon/pulseaudio.desktop.in.h:1 +msgid "PulseAudio Sound System" +msgstr "Zvukový systém PulseAudio" + +#: ../src/daemon/pulseaudio.desktop.in.h:2 +msgid "Start the PulseAudio Sound System" +msgstr "Spustit zvukový systém PulseAudio" + +#: ../src/pulse/channelmap.c:105 ../src/pulse/channelmap.c:757 +msgid "Mono" +msgstr "Mono" + +#: ../src/pulse/channelmap.c:107 +msgid "Front Center" +msgstr "Přední středový" + +#: ../src/pulse/channelmap.c:108 +msgid "Front Left" +msgstr "Přední levý" + +#: ../src/pulse/channelmap.c:109 +msgid "Front Right" +msgstr "Přední pravý" + +#: ../src/pulse/channelmap.c:111 +msgid "Rear Center" +msgstr "Zadní středový" + +#: ../src/pulse/channelmap.c:112 +msgid "Rear Left" +msgstr "Zadní levý" + +#: ../src/pulse/channelmap.c:113 +msgid "Rear Right" +msgstr "Zadní pravý" + +#: ../src/pulse/channelmap.c:115 +msgid "Low Frequency Emmiter" +msgstr "Nízkofrekvenční zářič" + +#: ../src/pulse/channelmap.c:117 +msgid "Front Left-of-center" +msgstr "Přední levý středový" + +#: ../src/pulse/channelmap.c:118 +msgid "Front Right-of-center" +msgstr "Přední pravý středový" + +#: ../src/pulse/channelmap.c:120 +msgid "Side Left" +msgstr "Boční levý" + +#: ../src/pulse/channelmap.c:121 +msgid "Side Right" +msgstr "Boční pravý" + +#: ../src/pulse/channelmap.c:123 +msgid "Auxiliary 0" +msgstr "Aux 0" + +#: ../src/pulse/channelmap.c:124 +msgid "Auxiliary 1" +msgstr "Aux 1" + +#: ../src/pulse/channelmap.c:125 +msgid "Auxiliary 2" +msgstr "Aux 2" + +#: ../src/pulse/channelmap.c:126 +msgid "Auxiliary 3" +msgstr "Aux 3" + +#: ../src/pulse/channelmap.c:127 +msgid "Auxiliary 4" +msgstr "Aux 4" + +#: ../src/pulse/channelmap.c:128 +msgid "Auxiliary 5" +msgstr "Aux 5" + +#: ../src/pulse/channelmap.c:129 +msgid "Auxiliary 6" +msgstr "Aux 6" + +#: ../src/pulse/channelmap.c:130 +msgid "Auxiliary 7" +msgstr "Aux 7" + +#: ../src/pulse/channelmap.c:131 +msgid "Auxiliary 8" +msgstr "Aux 8" + +#: ../src/pulse/channelmap.c:132 +msgid "Auxiliary 9" +msgstr "Aux 9" + +#: ../src/pulse/channelmap.c:133 +msgid "Auxiliary 10" +msgstr "Aux 10" + +#: ../src/pulse/channelmap.c:134 +msgid "Auxiliary 11" +msgstr "Aux 11" + +#: ../src/pulse/channelmap.c:135 +msgid "Auxiliary 12" +msgstr "Aux 12" + +#: ../src/pulse/channelmap.c:136 +msgid "Auxiliary 13" +msgstr "Aux 13" + +#: ../src/pulse/channelmap.c:137 +msgid "Auxiliary 14" +msgstr "Aux 14" + +#: ../src/pulse/channelmap.c:138 +msgid "Auxiliary 15" +msgstr "Aux 15" + +#: ../src/pulse/channelmap.c:139 +msgid "Auxiliary 16" +msgstr "Aux 16" + +#: ../src/pulse/channelmap.c:140 +msgid "Auxiliary 17" +msgstr "Aux 17" + +#: ../src/pulse/channelmap.c:141 +msgid "Auxiliary 18" +msgstr "Aux 18" + +#: ../src/pulse/channelmap.c:142 +msgid "Auxiliary 19" +msgstr "Aux 19" + +#: ../src/pulse/channelmap.c:143 +msgid "Auxiliary 20" +msgstr "Aux 20" + +#: ../src/pulse/channelmap.c:144 +msgid "Auxiliary 21" +msgstr "Aux 21" + +#: ../src/pulse/channelmap.c:145 +msgid "Auxiliary 22" +msgstr "Aux 22" + +#: ../src/pulse/channelmap.c:146 +msgid "Auxiliary 23" +msgstr "Aux 23" + +#: ../src/pulse/channelmap.c:147 +msgid "Auxiliary 24" +msgstr "Aux 24" + +#: ../src/pulse/channelmap.c:148 +msgid "Auxiliary 25" +msgstr "Aux 25" + +#: ../src/pulse/channelmap.c:149 +msgid "Auxiliary 26" +msgstr "Aux 26" + +#: ../src/pulse/channelmap.c:150 +msgid "Auxiliary 27" +msgstr "Aux 27" + +#: ../src/pulse/channelmap.c:151 +msgid "Auxiliary 28" +msgstr "Aux 28" + +#: ../src/pulse/channelmap.c:152 +msgid "Auxiliary 29" +msgstr "Aux 29" + +#: ../src/pulse/channelmap.c:153 +msgid "Auxiliary 30" +msgstr "Aux 30" + +#: ../src/pulse/channelmap.c:154 +msgid "Auxiliary 31" +msgstr "Aux 31" + +#: ../src/pulse/channelmap.c:156 +msgid "Top Center" +msgstr "Horní středový" + +#: ../src/pulse/channelmap.c:158 +msgid "Top Front Center" +msgstr "Horní přední středový" + +#: ../src/pulse/channelmap.c:159 +msgid "Top Front Left" +msgstr "Horní přední levý" + +#: ../src/pulse/channelmap.c:160 +msgid "Top Front Right" +msgstr "Horní přední pravý" + +#: ../src/pulse/channelmap.c:162 +msgid "Top Rear Center" +msgstr "Horní zadní středový" + +#: ../src/pulse/channelmap.c:163 +msgid "Top Rear Left" +msgstr "Horní zadní levý" + +#: ../src/pulse/channelmap.c:164 +msgid "Top Rear Right" +msgstr "Horní zadní pravý" + +#: ../src/pulse/channelmap.c:484 ../src/pulse/sample.c:170 +#: ../src/pulse/volume.c:295 ../src/pulse/volume.c:321 +#: ../src/pulse/volume.c:341 ../src/pulse/volume.c:371 +msgid "(invalid)" +msgstr "(neplatné)" + +#: ../src/pulse/channelmap.c:761 +msgid "Stereo" +msgstr "Stereo" + +#: ../src/pulse/channelmap.c:766 +msgid "Surround 4.0" +msgstr "Surround 4.0" + +#: ../src/pulse/channelmap.c:772 +msgid "Surround 4.1" +msgstr "Surround 4.1" + +#: ../src/pulse/channelmap.c:778 +msgid "Surround 5.0" +msgstr "Surround 5.0" + +#: ../src/pulse/channelmap.c:784 +msgid "Surround 5.1" +msgstr "Surround 5.1" + +#: ../src/pulse/channelmap.c:791 +msgid "Surround 7.1" +msgstr "Surround 7.1" + +#: ../src/pulse/error.c:43 +msgid "OK" +msgstr "Budiž" + +#: ../src/pulse/error.c:44 +msgid "Access denied" +msgstr "Přístup odepřen" + +#: ../src/pulse/error.c:45 +msgid "Unknown command" +msgstr "Neznámý příkaz" + +#: ../src/pulse/error.c:46 +msgid "Invalid argument" +msgstr "Neplatný argument" + +#: ../src/pulse/error.c:47 +msgid "Entity exists" +msgstr "Entita existuje" + +#: ../src/pulse/error.c:48 +msgid "No such entity" +msgstr "Taková entita neexistuje" + +#: ../src/pulse/error.c:49 +msgid "Connection refused" +msgstr "Spojení odmítnuto" + +#: ../src/pulse/error.c:50 +msgid "Protocol error" +msgstr "Chyba protokolu" + +#: ../src/pulse/error.c:51 +msgid "Timeout" +msgstr "Časový limit" + +#: ../src/pulse/error.c:52 +msgid "No authorization key" +msgstr "Bez autorizačního klíče" + +#: ../src/pulse/error.c:53 +msgid "Internal error" +msgstr "Vnitřní chyba" + +#: ../src/pulse/error.c:54 +msgid "Connection terminated" +msgstr "Spojení přerušeno" + +#: ../src/pulse/error.c:55 +msgid "Entity killed" +msgstr "Entita zabita" + +#: ../src/pulse/error.c:56 +msgid "Invalid server" +msgstr "Neplatný server" + +#: ../src/pulse/error.c:57 +msgid "Module initalization failed" +msgstr "Spuštění modulu selhalo" + +#: ../src/pulse/error.c:58 +msgid "Bad state" +msgstr "Chybný stav" + +#: ../src/pulse/error.c:59 +msgid "No data" +msgstr "Žádná data" + +#: ../src/pulse/error.c:60 +msgid "Incompatible protocol version" +msgstr "Nekompatibilní verze protokolu" + +#: ../src/pulse/error.c:61 +msgid "Too large" +msgstr "Příliš velké" + +#: ../src/pulse/error.c:62 +msgid "Not supported" +msgstr "Nepodporováno" + +#: ../src/pulse/error.c:63 +msgid "Unknown error code" +msgstr "Neznámý chybový kód" + +#: ../src/pulse/error.c:64 +msgid "No such extension" +msgstr "Takové rozšíření neexistuje" + +#: ../src/pulse/error.c:65 +msgid "Obsolete functionality" +msgstr "Zastaralá vlastnost" + +#: ../src/pulse/error.c:66 +msgid "Missing implementation" +msgstr "Scházející implementace" + +#: ../src/pulse/error.c:67 +msgid "Client forked" +msgstr "Klient rozvětven" + +#: ../src/pulse/error.c:68 +msgid "Input/Output error" +msgstr "Chyba vstupu/výstupu" + +#: ../src/pulse/error.c:69 +msgid "Device or resource busy" +msgstr "Zařízení nebo zdroj se používá" + +#: ../src/pulse/sample.c:172 +#, c-format +msgid "%s %uch %uHz" +msgstr "%s %uch %uHz" + +#: ../src/pulse/sample.c:184 +#, c-format +msgid "%0.1f GiB" +msgstr "%0.1f GiB" + +#: ../src/pulse/sample.c:186 +#, c-format +msgid "%0.1f MiB" +msgstr "%0.1f MiB" + +#: ../src/pulse/sample.c:188 +#, c-format +msgid "%0.1f KiB" +msgstr "%0.1f KiB" + +#: ../src/pulse/sample.c:190 +#, c-format +msgid "%u B" +msgstr "%u B" + +#: ../src/pulse/client-conf-x11.c:55 ../src/utils/pax11publish.c:100 +msgid "XOpenDisplay() failed" +msgstr "XOpenDisplay() selhalo" + +#: ../src/pulse/client-conf-x11.c:93 +msgid "Failed to parse cookie data" +msgstr "Selhala analýza dat cookie" + +#: ../src/pulse/client-conf.c:111 +#, c-format +msgid "Failed to open configuration file '%s': %s" +msgstr "Selhalo otevření konfiguračního souboru \"%s\": %s" + +#: ../src/pulse/context.c:550 +msgid "No cookie loaded. Attempting to connect without." +msgstr "Žádný soubor cookie nenahrán. Pokus o spojení bez tohoto kroku." + +#: ../src/pulse/context.c:693 +#, c-format +msgid "fork(): %s" +msgstr "fork(): %s" + +#: ../src/pulse/context.c:748 +#, c-format +msgid "waitpid(): %s" +msgstr "waitpid(): %s" + +#: ../src/pulse/context.c:1438 +#, c-format +msgid "Received message for unknown extension '%s'" +msgstr "Přijata zpráva pro neznámé rozšíření \"%s\"" + +#: ../src/utils/pacat.c:108 +#, c-format +msgid "Failed to drain stream: %s" +msgstr "Nezdařilo se vyprázdnit proud: %s" + +#: ../src/utils/pacat.c:113 +msgid "Playback stream drained." +msgstr "Proud přehrávání vyprázdněn." + +#: ../src/utils/pacat.c:123 +msgid "Draining connection to server." +msgstr "Vyprazdňování spojení se serverem." + +#: ../src/utils/pacat.c:136 +#, c-format +msgid "pa_stream_drain(): %s" +msgstr "pa_stream_drain(): %s" + +#: ../src/utils/pacat.c:159 +#, c-format +msgid "pa_stream_write() failed: %s" +msgstr "pa_stream_write() selhalo: %s" + +#: ../src/utils/pacat.c:197 +#, c-format +msgid "pa_stream_begin_write() failed: %s" +msgstr "pa_stream_begin_write() selhalo: %s" + +#: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267 +#, c-format +msgid "pa_stream_peek() failed: %s" +msgstr "pa_stream_peek() selhalo: %s" + +#: ../src/utils/pacat.c:307 +msgid "Stream successfully created." +msgstr "Proud úspěšně vytvořen." + +#: ../src/utils/pacat.c:310 +#, c-format +msgid "pa_stream_get_buffer_attr() failed: %s" +msgstr "pa_stream_get_buffer_attr() selhalo: %s" + +#: ../src/utils/pacat.c:314 +#, c-format +msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u" +msgstr "" +"Metrika vyrovnávací paměti: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u" + +#: ../src/utils/pacat.c:317 +#, c-format +msgid "Buffer metrics: maxlength=%u, fragsize=%u" +msgstr "Metrika vyrovnávací paměti: maxlength=%u, fragsize=%u" + +#: ../src/utils/pacat.c:321 +#, c-format +msgid "Using sample spec '%s', channel map '%s'." +msgstr "Používáno určení vzorku \"%s\", mapa kanálů \"%s\"." + +#: ../src/utils/pacat.c:325 +#, c-format +msgid "Connected to device %s (%u, %ssuspended)." +msgstr "Připojeno k zařízení %s (%u, %ssuspended)." + +#: ../src/utils/pacat.c:335 +#, c-format +msgid "Stream error: %s" +msgstr "Chyba proudu: %s" + +#: ../src/utils/pacat.c:345 +#, c-format +msgid "Stream device suspended.%s" +msgstr "Proudové zařízení pozastaveno.%s" + +#: ../src/utils/pacat.c:347 +#, c-format +msgid "Stream device resumed.%s" +msgstr "Proudové zařízení obnoveno.%s" + +#: ../src/utils/pacat.c:355 +#, c-format +msgid "Stream underrun.%s" +msgstr "Podběhnutí proudu.%s" + +#: ../src/utils/pacat.c:362 +#, c-format +msgid "Stream overrun.%s" +msgstr "Přeběhnutí proudu.%s" + +#: ../src/utils/pacat.c:369 +#, c-format +msgid "Stream started.%s" +msgstr "Proud spuštěn.%s" + +#: ../src/utils/pacat.c:376 +#, c-format +msgid "Stream moved to device %s (%u, %ssuspended).%s" +msgstr "Proud přesunut na zařízení %s (%u, %ssuspended).%s" + +#: ../src/utils/pacat.c:376 +msgid "not " +msgstr "nikoliv " + +#: ../src/utils/pacat.c:383 +#, c-format +msgid "Stream buffer attributes changed.%s" +msgstr "Změněny atributy vyrovnávací paměti proudu.%s" + +#: ../src/utils/pacat.c:415 +#, c-format +msgid "Connection established.%s" +msgstr "Spojení navázáno.%s" + +#: ../src/utils/pacat.c:418 +#, c-format +msgid "pa_stream_new() failed: %s" +msgstr "pa_stream_new() selhalo: %s" + +#: ../src/utils/pacat.c:450 +#, c-format +msgid "pa_stream_connect_playback() failed: %s" +msgstr "pa_stream_connect_playback() selhalo: %s" + +#: ../src/utils/pacat.c:456 +#, c-format +msgid "pa_stream_connect_record() failed: %s" +msgstr "pa_stream_connect_record() selhalo: %s" + +#: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857 +#, c-format +msgid "Connection failure: %s" +msgstr "Spojení selhalo: %s" + +#: ../src/utils/pacat.c:503 +msgid "Got EOF." +msgstr "Získáno EOF." + +#: ../src/utils/pacat.c:540 +#, c-format +msgid "write() failed: %s" +msgstr "write() selhalo: %s" + +#: ../src/utils/pacat.c:561 +msgid "Got signal, exiting." +msgstr "Získán signál, ukončování." + +#: ../src/utils/pacat.c:575 +#, c-format +msgid "Failed to get latency: %s" +msgstr "Nezdařilo se získat latenci: %s" + +#: ../src/utils/pacat.c:580 +#, c-format +msgid "Time: %0.3f sec; Latency: %0.0f usec." +msgstr "Čas: %0.3f sekund; latence: %0.0f μs" + +#: ../src/utils/pacat.c:599 +#, c-format +msgid "pa_stream_update_timing_info() failed: %s" +msgstr "pa_stream_update_timing_info() selhalo: %s" + +#: ../src/utils/pacat.c:609 +#, c-format +msgid "" +"%s [options]\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -r, --record Create a connection for recording\n" +" -p, --playback Create a connection for playback\n" +"\n" +" -v, --verbose Enable verbose operations\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -d, --device=DEVICE The name of the sink/source to " +"connect to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" +" --stream-name=NAME How to call this stream on the " +"server\n" +" --volume=VOLUME Specify the initial (linear) volume " +"in range 0...65536\n" +" --rate=SAMPLERATE The sample rate in Hz (defaults to " +"44100)\n" +" --format=SAMPLEFORMAT The sample type, one of s16le, " +"s16be, u8, float32le,\n" +" float32be, ulaw, alaw, s32le, s32be, " +"s24le, s24be,\n" +" s24-32le, s24-32be (defaults to " +"s16ne)\n" +" --channels=CHANNELS The number of channels, 1 for mono, " +"2 for stereo\n" +" (defaults to 2)\n" +" --channel-map=CHANNELMAP Channel map to use instead of the " +"default\n" +" --fix-format Take the sample format from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-rate Take the sampling rate from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-channels Take the number of channels and the " +"channel map\n" +" from the sink the stream is being " +"connected to.\n" +" --no-remix Don't upmix or downmix channels.\n" +" --no-remap Map channels by index instead of " +"name.\n" +" --latency=BYTES Request the specified latency in " +"bytes.\n" +" --process-time=BYTES Request the specified process time " +"per request in bytes.\n" +" --property=PROPERTY=VALUE Set the specified property to the " +"specified value.\n" +" --raw Record/play raw PCM data.\n" +" --file-format=FFORMAT Record/play formatted PCM data.\n" +" --list-file-formats List available file formats.\n" +msgstr "" +"%s [přepínače]\n" +"\n" +" -h, --help Zobrazí tuto nápovědu\n" +" --version Zobrazí verzi\n" +"\n" +" -r, --record Vytvoří spojení z důvodu nahrávání\n" +" -p, --playback Vytvoří spojení z důvodu přehrávání\n" +"\n" +" -v, --verbose Zapne nakládání s úrovní " +"podrobností\n" +"\n" +" -s, --server=SERVER Název připojovaného serveru\n" +" -d, --device=ZAŘÍZENÍ Název připojovaného cíle či zdroje\n" +" -n, --client-name=NÁZEV Způsob volání tohoto klienta na " +"serveru\n" +" --stream-name=NÁZEV Způsob volání tohoto proudu na " +"serveru\n" +" --volume=HLASITOST Určí počáteční (lineární) hlasitost " +"v rozmezí 0...65536\n" +" --rate=VZORKOVACÍFREKVENCE Vzorkovací frekvence v Hz (výchozí " +"je 44100)\n" +" --format=FORMÁTVZORKU Typ vzorku, jeden z s16le, s16be, " +"u8, float32le,\n" +" float32be, ulaw, alaw, s32le, s32be " +"(výchozí je s16ne)\n" +" --channels=KANÁLY Počet kanálů, u mono 1, u sterea 2\n" +" (výchozí je 2)\n" +" --channel-map=MAPAKANÁLŮ Mapa kanálů určená k použití namísto " +"výchozí\n" +" --fix-format Získá formát vzorku z cíle, ke " +"kterému se\n" +" připojuje proud.\n" +" --fix-rate Získá vzorkovací frekvenci z cíle, " +"ke kterému se\n" +" připojuje proud.\n" +" --fix-channels Získá počet kanálů a mapu kanálů z " +"cíle, ke kterému se\n" +" připojuje proud.\n" +" --no-remix Nesměšuje kanály.\n" +" --no-remap Mapuje kanály dle indexu namísto " +"názvu.\n" +" --latency=BAJTY Vyžádá určenou latenci v bajtech.\n" +" --process-time=BAJTY Vyžádá určený čas zpracování na " +"požadavek v bajtech.\n" +" --property=VLASTNOST=HODNOTA Nastaví určenou vlastnost na určenou " +"hodnotu.\n" +" --raw Nahrává/přehrává surová data PCM.\n" +" --file-format=FORMÁT Nahrává/přehrává formátovaná data " +"PCM.\n" +" --list-file-formats Zobrazí seznam dostupných formátů " +"souborů.\n" + +#: ../src/utils/pacat.c:731 +#, c-format +msgid "" +"pacat %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pacat %s\n" +"Přeloženo s libpulse %s\n" +"Propojeno s libpulse %s\n" + +#: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953 +#, c-format +msgid "Invalid client name '%s'" +msgstr "Neplatný název klienta \"%s\"" + +#: ../src/utils/pacat.c:779 +#, c-format +msgid "Invalid stream name '%s'" +msgstr "Neplatný název proudu \"%s\"" + +#: ../src/utils/pacat.c:816 +#, c-format +msgid "Invalid channel map '%s'" +msgstr "Neplatná mapa kanálů \"%s\"" + +#: ../src/utils/pacat.c:845 +#, c-format +msgid "Invalid latency specification '%s'" +msgstr "Neplatné upřesnění latence \"%s\"" + +#: ../src/utils/pacat.c:852 +#, c-format +msgid "Invalid process time specification '%s'" +msgstr "Neplatné upřesnění času zpracování \"%s\"" + +#: ../src/utils/pacat.c:864 +#, c-format +msgid "Invalid property '%s'" +msgstr "Neplatná vlastnost \"%s\"" + +#: ../src/utils/pacat.c:881 +#, c-format +msgid "Unknown file format %s." +msgstr "Neznámý formát souboru %s." + +#: ../src/utils/pacat.c:900 +msgid "Invalid sample specification" +msgstr "Neplatné určení vzorku" + +#: ../src/utils/pacat.c:910 +#, c-format +msgid "open(): %s" +msgstr "open(): %s" + +#: ../src/utils/pacat.c:915 +#, c-format +msgid "dup2(): %s" +msgstr "dup2(): %s" + +#: ../src/utils/pacat.c:922 +msgid "Too many arguments." +msgstr "Příliš mnoho argumentů." + +#: ../src/utils/pacat.c:933 +msgid "Failed to generate sample specification for file." +msgstr "Selhalo vytvoření určení vzorku souboru." + +#: ../src/utils/pacat.c:953 +msgid "Failed to open audio file." +msgstr "Selhalo otevření zvukového souboru." + +#: ../src/utils/pacat.c:959 +msgid "" +"Warning: specified sample specification will be overwritten with " +"specification from file." +msgstr "" +"Varování: zadané určení vzorku bude přepsáno určením získaným ze souboru." + +#: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997 +msgid "Failed to determine sample specification from file." +msgstr "Selhalo zjištění určení vzorku ze souboru." + +#: ../src/utils/pacat.c:971 +msgid "Warning: Failed to determine channel map from file." +msgstr "Varování: Selhalo zjištění mapy kanálů ze souboru." + +#: ../src/utils/pacat.c:982 +msgid "Channel map doesn't match sample specification" +msgstr "Mapa kanálů se neshoduje s určením vzorku" + +#: ../src/utils/pacat.c:993 +msgid "Warning: failed to write channel map to file." +msgstr "Varování: selhal zápis mapy kanálů do souboru." + +#: ../src/utils/pacat.c:1008 +#, c-format +msgid "" +"Opening a %s stream with sample specification '%s' and channel map '%s'." +msgstr "Otevírání proudu %s s určením vzorku \"%s\" a mapou kanálů \"%s\"." + +#: ../src/utils/pacat.c:1009 +msgid "recording" +msgstr "nahrávání" + +#: ../src/utils/pacat.c:1009 +msgid "playback" +msgstr "přehrávání" + +#: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267 +msgid "pa_mainloop_new() failed." +msgstr "pa_mainloop_new() selhalo." + +#: ../src/utils/pacat.c:1054 +msgid "io_new() failed." +msgstr "io_new() selhalo." + +#: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279 +msgid "pa_context_new() failed." +msgstr "pa_context_new() selhalo." + +#: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285 +#, c-format +msgid "pa_context_connect() failed: %s" +msgstr "pa_context_connect() selhalo: %s" + +#: ../src/utils/pacat.c:1075 +msgid "pa_context_rttime_new() failed." +msgstr "pa_context_rttime_new() selhalo." + +#: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290 +msgid "pa_mainloop_run() failed." +msgstr "pa_mainloop_run() selhalo." + +#: ../src/utils/pasuspender.c:81 +#, c-format +msgid "fork(): %s\n" +msgstr "fork(): %s\n" + +#: ../src/utils/pasuspender.c:92 +#, c-format +msgid "execvp(): %s\n" +msgstr "execvp(): %s\n" + +#: ../src/utils/pasuspender.c:109 +#, c-format +msgid "Failure to suspend: %s\n" +msgstr "Nezdařilo se pozastavení: %s\n" + +#: ../src/utils/pasuspender.c:124 +#, c-format +msgid "Failure to resume: %s\n" +msgstr "Nezdařilo se obnovení: %s\n" + +#: ../src/utils/pasuspender.c:147 +#, c-format +msgid "WARNING: Sound server is not local, not suspending.\n" +msgstr "VAROVÁNÍ: Zvukový server není místní, nedojde k pozastavení.\n" + +#: ../src/utils/pasuspender.c:159 +#, c-format +msgid "Connection failure: %s\n" +msgstr "Spojení selhalo: %s\n" + +#: ../src/utils/pasuspender.c:176 +#, c-format +msgid "Got SIGINT, exiting.\n" +msgstr "Získáno SIGINT, ukončování.\n" + +#: ../src/utils/pasuspender.c:194 +#, c-format +msgid "WARNING: Child process terminated by signal %u\n" +msgstr "VAROVÁNÍ: Proces potomka ukončen signálem %u\n" + +#: ../src/utils/pasuspender.c:212 +#, c-format +msgid "" +"%s [options] ... \n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +"\n" +msgstr "" +"%s [přepínače] ... \n" +"\n" +" -h, --help Zobrazí tuto nápovědu\n" +" --version Zobrazí verzi\n" +" -s, --server=SERVER Název připojovaného serveru\n" +"\n" + +#: ../src/utils/pasuspender.c:248 +#, c-format +msgid "" +"pasuspender %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pasuspender %s\n" +"Přeloženo s libpulse %s\n" +"Propojeno s libpulse %s\n" + +#: ../src/utils/pasuspender.c:277 +#, c-format +msgid "pa_mainloop_new() failed.\n" +msgstr "pa_mainloop_new() selhalo.\n" + +#: ../src/utils/pasuspender.c:290 +#, c-format +msgid "pa_context_new() failed.\n" +msgstr "pa_context_new() selhalo.\n" + +#: ../src/utils/pasuspender.c:298 +#, c-format +msgid "pa_mainloop_run() failed.\n" +msgstr "pa_mainloop_run() selhalo.\n" + +#: ../src/utils/pactl.c:135 +#, c-format +msgid "Failed to get statistics: %s" +msgstr "Selhalo získání statistik: %s" + +#: ../src/utils/pactl.c:141 +#, c-format +msgid "Currently in use: %u blocks containing %s bytes total.\n" +msgstr "Právě používáno: %u bloků obsahujících celkem %s bajtů.\n" + +#: ../src/utils/pactl.c:144 +#, c-format +msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n" +msgstr "Alokováno během celého běhu: %u bloků obsahujících celkem %s bajtů.\n" + +#: ../src/utils/pactl.c:147 +#, c-format +msgid "Sample cache size: %s\n" +msgstr "Velikost vzorkovací vyrovnávací paměti: %s\n" + +#: ../src/utils/pactl.c:156 +#, c-format +msgid "Failed to get server information: %s" +msgstr "Nezdařilo se získání informací o serveru: %s" + +#: ../src/utils/pactl.c:164 +#, c-format +msgid "" +"User name: %s\n" +"Host Name: %s\n" +"Server Name: %s\n" +"Server Version: %s\n" +"Default Sample Specification: %s\n" +"Default Channel Map: %s\n" +"Default Sink: %s\n" +"Default Source: %s\n" +"Cookie: %08x\n" +msgstr "" +"Uživatelské jméno: %s\n" +"Název počítače: %s\n" +"Název serveru: %s\n" +"Verze serveru: %s\n" +"Výchozí určení vzorku: %s\n" +"Výchozí mapa kanálů: %s\n" +"Výchozí cíl: %s\n" +"Výchozí zdroj: %s\n" +"Cookie: %08x\n" + +#: ../src/utils/pactl.c:205 +#, c-format +msgid "Failed to get sink information: %s" +msgstr "Nezdařilo se získání informací o cíli: %s" + +#: ../src/utils/pactl.c:221 +#, c-format +msgid "" +"Sink #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor Source: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Cíl č. %u\n" +"\tStav: %s\n" +"\tNázev: %s\n" +"\tPopis: %s\n" +"\tOvladač: %s\n" +"\tUrčení vzorku: %s\n" +"\tMapa kanálů: %s\n" +"\tModul vlastníka: %u\n" +"\tZtlumení: %s\n" +"\tHlasitost: %s%s%s\n" +"\t vyvážení %0.2f\n" +"\tZákladní hlasitost %s%s%s\n" +"\tZdroj sledování: %s\n" +"\tLatence: %0.0f μs, konfigurováno %0.0f μs\n" +"\tPříznaky: %s%s%s%s%s%s\n" +"\tVlastnosti:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360 +#, c-format +msgid "\tPorts:\n" +msgstr "\tPorty:\n" + +#: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366 +#, c-format +msgid "\tActive Port: %s\n" +msgstr "\tAktivní port: %s\n" + +#: ../src/utils/pactl.c:297 +#, c-format +msgid "Failed to get source information: %s" +msgstr "Nezdařilo se získání informací o zdroji: %s" + +#: ../src/utils/pactl.c:313 +#, c-format +msgid "" +"Source #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor of Sink: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Zdroj č. %u\n" +"\tStav: %s\n" +"\tNázev: %s\n" +"\tPopis: %s\n" +"\tOvladač: %s\n" +"\tUrčení vzorku: %s\n" +"\tMapa kanálů: %s\n" +"\tModul vlastníka: %u\n" +"\tZtlumení: %s\n" +"\tHlasitost: %s%s%s\n" +"\t vyvážení %0.2f\n" +"\tZákladní hlasitost %s%s%s\n" +"\tSledování zdroje: %s\n" +"\tLatence: %0.0f μs, konfigurováno %0.0f μs\n" +"\tPříznaky: %s%s%s%s%s%s\n" +"\tVlastnosti:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:345 ../src/utils/pactl.c:401 ../src/utils/pactl.c:436 +#: ../src/utils/pactl.c:473 ../src/utils/pactl.c:532 ../src/utils/pactl.c:533 +#: ../src/utils/pactl.c:543 ../src/utils/pactl.c:587 ../src/utils/pactl.c:588 +#: ../src/utils/pactl.c:594 ../src/utils/pactl.c:637 ../src/utils/pactl.c:638 +#: ../src/utils/pactl.c:645 +msgid "n/a" +msgstr "nic" + +#: ../src/utils/pactl.c:375 +#, c-format +msgid "Failed to get module information: %s" +msgstr "Selhalo získání informací o modulu: %s" + +#: ../src/utils/pactl.c:393 +#, c-format +msgid "" +"Module #%u\n" +"\tName: %s\n" +"\tArgument: %s\n" +"\tUsage counter: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Modul č. %u\n" +"\tNázev: %s\n" +"\tArgument: %s\n" +"\tPočet použití %s\n" +"\tVlastnosti:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:412 +#, c-format +msgid "Failed to get client information: %s" +msgstr "Selhalo získání informací o klientu: %s" + +#: ../src/utils/pactl.c:430 +#, c-format +msgid "" +"Client #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Klient č. %u\n" +"\tOvladač: %s\n" +"\tModul vlastníka: %s\n" +"\tVlastnosti:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:447 +#, c-format +msgid "Failed to get card information: %s" +msgstr "Selhalo získání informací o kartě: %s" + +#: ../src/utils/pactl.c:465 +#, c-format +msgid "" +"Card #%u\n" +"\tName: %s\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Karta č. %u\n" +"\tNázev: %s\n" +"\tOvladač: %s\n" +"\tModul vlastníka: %s\n" +"\tVlastnosti:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:479 +#, c-format +msgid "\tProfiles:\n" +msgstr "\tProfily:\n" + +#: ../src/utils/pactl.c:485 +#, c-format +msgid "\tActive Profile: %s\n" +msgstr "\tAktivní profil: %s\n" + +#: ../src/utils/pactl.c:496 +#, c-format +msgid "Failed to get sink input information: %s" +msgstr "Nezdařilo se získání informací o vstupu cíle: %s" + +#: ../src/utils/pactl.c:515 +#, c-format +msgid "" +"Sink Input #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSink: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tMute: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSink Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Vstup cíle č. %u\n" +"\tOvladač: %s\n" +"\tModul vlastníka: %s\n" +"\tKlient: %s\n" +"\tCíl: %u\n" +"\tUrčení vzorku: %s\n" +"\tMapa kanálů: %s\n" +"\tZtlumení: %s\n" +"\tHlasitost: %s\n" +"\t %s\n" +"\t vyvážení %0.2f\n" +"\tLatence vyrovnávací paměti: %0.0f μs\n" +"\tLatence cíle: %0.0f μs\n" +"\tMetoda převzorkování: %s\n" +"\tVlastnosti:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:554 +#, c-format +msgid "Failed to get source output information: %s" +msgstr "Selhalo získání informace o výstupu zdroje: %s" + +#: ../src/utils/pactl.c:574 +#, c-format +msgid "" +"Source Output #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSource: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSource Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Výstup zdroje č. %u\n" +"\tOvladač: %s\n" +"\tModul vlastníka: %s\n" +"\tKlient: %s\n" +"\tZdroj: %u\n" +"\tUrčení vzorku: %s\n" +"\tMapa kanálů: %s\n" +"\tLatence vyrovnávací paměti: %0.0f μs\n" +"\tLatence zdroje: %0.0f μs\n" +"\tMetoda převzorkování: %s\n" +"\tVlastnosti:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:605 +#, c-format +msgid "Failed to get sample information: %s" +msgstr "Selhalo získání informace o vzorku: %s" + +#: ../src/utils/pactl.c:623 +#, c-format +msgid "" +"Sample #%u\n" +"\tName: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tDuration: %0.1fs\n" +"\tSize: %s\n" +"\tLazy: %s\n" +"\tFilename: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Vzorek č. %u\n" +"\tNázev: %s\n" +"\tUrčení vzorku: %s\n" +"\tMapa kanálů: %s\n" +"\tHlasitost: %s\n" +"\t %s\n" +"\t vyvážení %0.2f\n" +"\tDélka: %0.1fs\n" +"\tVelikost: %s\n" +"\tOpoždění: %s\n" +"\tNázev souboru: %s\n" +"\tVlastnosti:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663 +#, c-format +msgid "Failure: %s" +msgstr "Selhání: %s" + +#: ../src/utils/pactl.c:687 +#, c-format +msgid "Failed to upload sample: %s" +msgstr "Selhalo nahrání vzorku: %s" + +#: ../src/utils/pactl.c:704 +msgid "Premature end of file" +msgstr "Předčasný konec souboru" + +#: ../src/utils/pactl.c:863 +msgid "Got SIGINT, exiting." +msgstr "Získáno SIGINT, ukončování." + +#: ../src/utils/pactl.c:869 +#, c-format +msgid "" +"%s [options] stat\n" +"%s [options] list\n" +"%s [options] exit\n" +"%s [options] upload-sample FILENAME [NAME]\n" +"%s [options] play-sample NAME [SINK]\n" +"%s [options] remove-sample NAME\n" +"%s [options] move-sink-input SINKINPUT SINK\n" +"%s [options] move-source-output SOURCEOUTPUT SOURCE\n" +"%s [options] load-module NAME [ARGS ...]\n" +"%s [options] unload-module MODULE\n" +"%s [options] suspend-sink SINK 1|0\n" +"%s [options] suspend-source SOURCE 1|0\n" +"%s [options] set-card-profile CARD PROFILE\n" +"%s [options] set-sink-port SINK PORT\n" +"%s [options] set-source-port SOURCE PORT\n" +"%s [options] set-sink-volume SINK VOLUME\n" +"%s [options] set-source-volume SOURCE VOLUME\n" +"%s [options] set-sink-input-volume SINKINPUT VOLUME\n" +"%s [options] set-sink-mute SINK 1|0\n" +"%s [options] set-source-mute SOURCE 1|0\n" +"%s [options] set-sink-input-mute SINKINPUT 1|0\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" +msgstr "" +"%s [přepínače] stat\n" +"%s [přepínače] list\n" +"%s [přepínače] exit\n" +"%s [přepínače] upload-sample NÁZEVSOUBORU [NÁZEV]\n" +"%s [přepínače] play-sample NÁZEV [CÍL]\n" +"%s [přepínače] remove-sample NÁZEV\n" +"%s [přepínače] move-sink-input VSTUPCÍLE CÍL\n" +"%s [přepínače] move-source-output VÝSTUPZDROJE ZDROJ\n" +"%s [přepínače] load-module NÁZEV [ARG ...]\n" +"%s [přepínače] unload-module MODUL\n" +"%s [přepínače] suspend-sink CÍL 1|0\n" +"%s [přepínače] suspend-source ZDROJ 1|0\n" +"%s [přepínače] set-card-profile KARTA PROFIL\n" +"%s [přepínače] set-sink-port CÍL PORT\n" +"%s [přepínače] set-source-port ZDROJ PORT\n" +"%s [přepínače] set-sink-volume CÍL HLASITOST\n" +"%s [přepínače] set-source-volume ZDROJ HLASITOST\n" +"%s [přepínače] set-sink-input-volume VSTUPCÍLE HLASITOST\n" +"%s [přepínače] set-sink-mute CÍL 1|0\n" +"%s [přepínače] set-source-mute ZDROJ 1|0\n" +"%s [přepínače] set-sink-input-mute VSTUPCÍLE 1|0\n" +"\n" +" -h, --help Zobrazí tuto nápovědu\n" +" --version Zobrazí verzi\n" +"\n" +" -s, --server=SERVER Název připojovaného serveru\n" +" -n, --client-name=NÁZEV Způsob volání tohoto klienta na " +"serveru\n" + +#: ../src/utils/pactl.c:933 +#, c-format +msgid "" +"pactl %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pactl %s\n" +"Přeloženo s libpulse %s\n" +"Propojeno s libpulse %s\n" + +#: ../src/utils/pactl.c:979 +msgid "Please specify a sample file to load" +msgstr "Zadejte prosím soubor se vzorkem určeným k nahrání" + +#: ../src/utils/pactl.c:992 +msgid "Failed to open sound file." +msgstr "Selhalo otevření zvukového souboru." + +#: ../src/utils/pactl.c:1004 +msgid "Warning: Failed to determine sample specification from file." +msgstr "Varování: Selhalo zjištění určení vzorku ze souboru." + +#: ../src/utils/pactl.c:1014 +msgid "You have to specify a sample name to play" +msgstr "Je nutné zadat název vzorku určeného k přehrání" + +#: ../src/utils/pactl.c:1026 +msgid "You have to specify a sample name to remove" +msgstr "Je nutné zadat název vzorku určeného k odstranění" + +#: ../src/utils/pactl.c:1035 +msgid "You have to specify a sink input index and a sink" +msgstr "Je nutné zadat vstup cíle a cíl" + +#: ../src/utils/pactl.c:1045 +msgid "You have to specify a source output index and a source" +msgstr "Je nutné zadat index výstupu zdroje a zdroj" + +#: ../src/utils/pactl.c:1060 +msgid "You have to specify a module name and arguments." +msgstr "Je nutné zadat název modulu a argumenty." + +#: ../src/utils/pactl.c:1080 +msgid "You have to specify a module index" +msgstr "Je nutné zadat index modulu" + +#: ../src/utils/pactl.c:1090 +msgid "" +"You may not specify more than one sink. You have to specify a boolean value." +msgstr "Nelze zadat více než jeden cíl. Je nutné zadat booleovskou hodnotu." + +#: ../src/utils/pactl.c:1103 +msgid "" +"You may not specify more than one source. You have to specify a boolean " +"value." +msgstr "Nelze zadat více než jeden zdroj. Je nutné zadat booleovskou hodnotu." + +#: ../src/utils/pactl.c:1115 +msgid "You have to specify a card name/index and a profile name" +msgstr "Je nutné upřesnit název karty/indexu a název profilu" + +#: ../src/utils/pactl.c:1126 +msgid "You have to specify a sink name/index and a port name" +msgstr "Je nutné upřesnit název cíle/indexu a název portu" + +#: ../src/utils/pactl.c:1137 +msgid "You have to specify a source name/index and a port name" +msgstr "Je nutné upřesnit název zdroje/indexu a název portu" + +#: ../src/utils/pactl.c:1149 +msgid "You have to specify a sink name/index and a volume" +msgstr "Je nutné upřesnit název cíle/indexu a hlasitost" + +#: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171 +#: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209 +#: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248 +msgid "Invalid volume specification" +msgstr "Neplatné určení hlasitosti" + +#: ../src/utils/pactl.c:1166 +msgid "You have to specify a source name/index and a volume" +msgstr "Je nutné upřesnit název zdroje/indexu a hlasitost" + +#: ../src/utils/pactl.c:1183 +msgid "You have to specify a sink input index and a volume" +msgstr "Je nutné zadat index vstupu cíle a hlasitost" + +#: ../src/utils/pactl.c:1188 +msgid "Invalid sink input index" +msgstr "Neplatný index vstupu cíle" + +#: ../src/utils/pactl.c:1204 +msgid "You have to specify a sink name/index and a mute boolean" +msgstr "Je nutné upřesnit název cíle/indexu a booleovskou hodnotu ztlumení" + +#: ../src/utils/pactl.c:1221 +msgid "You have to specify a source name/index and a mute boolean" +msgstr "Je nutné upřesnit název zdroje/indexu a booleovskou hodnotu ztlumení" + +#: ../src/utils/pactl.c:1238 +msgid "You have to specify a sink input index and a mute boolean" +msgstr "Je nutné zadat index vstupu cíle a booleovskou hodnotu ztlumení" + +#: ../src/utils/pactl.c:1243 +msgid "Invalid sink input index specification" +msgstr "Neplatné určení indexu vstupu cíle" + +#: ../src/utils/pactl.c:1262 +msgid "No valid command specified." +msgstr "Nezadán žádný platný příkaz." + +#: ../src/utils/pax11publish.c:61 +#, c-format +msgid "" +"%s [-D display] [-S server] [-O sink] [-I source] [-c file] [-d|-e|-i|-r]\n" +"\n" +" -d Show current PulseAudio data attached to X11 display (default)\n" +" -e Export local PulseAudio data to X11 display\n" +" -i Import PulseAudio data from X11 display to local environment " +"variables and cookie file.\n" +" -r Remove PulseAudio data from X11 display\n" +msgstr "" +"%s [-D displej] [-S server] [-O cíl] [-I zdroj] [-c soubor] [-d|-e|-i|-r]\n" +"\n" +" -d Zobrazí aktuální data PulseAudio přiřazená k displeji X11 (výchozí)\n" +" -e Exportuje místní data PulseAudio na displej X11\n" +" -i Importuje data PulseAudio z displeje X11 mezi místní proměnné " +"prostředí a soubor cookie.\n" +" -r Odstraní data PulseAudio z displeje X11\n" + +#: ../src/utils/pax11publish.c:94 +#, c-format +msgid "Failed to parse command line.\n" +msgstr "Selhala analýza příkazového řádku.\n" + +#: ../src/utils/pax11publish.c:108 +#, c-format +msgid "Server: %s\n" +msgstr "Server: %s\n" + +#: ../src/utils/pax11publish.c:110 +#, c-format +msgid "Source: %s\n" +msgstr "Zdroj: %s\n" + +#: ../src/utils/pax11publish.c:112 +#, c-format +msgid "Sink: %s\n" +msgstr "Cíl: %s\n" + +#: ../src/utils/pax11publish.c:114 +#, c-format +msgid "Cookie: %s\n" +msgstr "Cookie: %s\n" + +#: ../src/utils/pax11publish.c:132 +#, c-format +msgid "Failed to parse cookie data\n" +msgstr "Nezdařilo se analyzovat data cookie\n" + +#: ../src/utils/pax11publish.c:137 +#, c-format +msgid "Failed to save cookie data\n" +msgstr "Nezdařilo se uložit data cookie\n" + +#: ../src/utils/pax11publish.c:152 +#, c-format +msgid "Failed to load client configuration file.\n" +msgstr "Nezdařilo se nahrát konfigurační soubor klienta.\n" + +#: ../src/utils/pax11publish.c:157 +#, c-format +msgid "Failed to read environment configuration data.\n" +msgstr "Nezdařilo se přečtení konfiguračních dat prostředí.\n" + +#: ../src/utils/pax11publish.c:174 +#, c-format +msgid "Failed to get FQDN.\n" +msgstr "Nezdařilo se získání FQDN.\n" + +#: ../src/utils/pax11publish.c:194 +#, c-format +msgid "Failed to load cookie data\n" +msgstr "Nezdařilo se nahrát data cookie\n" + +#: ../src/utils/pax11publish.c:211 +#, c-format +msgid "Not yet implemented.\n" +msgstr "Doposud neimplementováno.\n" + +#: ../src/utils/pacmd.c:69 +msgid "No PulseAudio daemon running, or not running as session daemon." +msgstr "Neběží žádný démon PulseAudio, nebo neběží jako démon sezení." + +#: ../src/utils/pacmd.c:74 +#, c-format +msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s" +msgstr "socket(PF_UNIX, SOCK_STREAM, 0): %s" + +#: ../src/utils/pacmd.c:91 +#, c-format +msgid "connect(): %s" +msgstr "connect(): %s" + +#: ../src/utils/pacmd.c:99 +msgid "Failed to kill PulseAudio daemon." +msgstr "Nezdařilo se zabít démona PulseAudio." + +#: ../src/utils/pacmd.c:107 +msgid "Daemon not responding." +msgstr "Démon neodpovídá." + +#: ../src/utils/pacmd.c:161 +#, c-format +msgid "poll(): %s" +msgstr "poll(): %s" + +#: ../src/utils/pacmd.c:171 ../src/utils/pacmd.c:188 +#, c-format +msgid "read(): %s" +msgstr "read(): %s" + +#: ../src/utils/pacmd.c:207 ../src/utils/pacmd.c:223 +#, c-format +msgid "write(): %s" +msgstr "write(): %s" + +#: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:219 +msgid "Cannot access autospawn lock." +msgstr "Nelze přistoupit k zámku automatického spouštění." + +#: ../src/modules/alsa/alsa-sink.c:530 ../src/modules/alsa/alsa-sink.c:689 +#, c-format +msgid "" +"ALSA woke us up to write new data to the device, but there was actually " +"nothing to write!\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers.\n" +"We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() " +"returned 0 or another value < min_avail." +msgstr "" +"ALSA nás probudila z důvodu zápisu nových dat na zařízení, ale ve " +"skutečnosti nebylo co zapisovat.\n" +"S největší pravděpodobností se jedná o chybu v ovladači ALSA \"%s\". " +"Nahlaste prosím tento problém vývojářům ALSA.\n" +"Probudilo nás nastavení POLLOUT - nicméně následné snd_pcm_avail() vrátilo 0 " +"či jinou hodnotu < min_avail." + +#: ../src/modules/alsa/alsa-source.c:506 ../src/modules/alsa/alsa-source.c:656 +#, c-format +msgid "" +"ALSA woke us up to read new data from the device, but there was actually " +"nothing to read!\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers.\n" +"We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() " +"returned 0 or another value < min_avail." +msgstr "" +"ALSA nás probudila z důvodu čtení nových dat ze zařízení, ale ve skutečnosti " +"nebylo co číst.\n" +"S největší pravděpodobností se jedná o chybu v ovladači ALSA \"%s\". " +"Nahlaste prosím tento problém vývojářům ALSA.\n" +"Probudilo nás nastavení POLLIN - nicméně následné snd_pcm_avail() vrátilo 0 " +"či jinou hodnotu < min_avail." + +#: ../src/modules/alsa/module-alsa-card.c:152 +#: ../src/modules/bluetooth/module-bluetooth-device.c:2228 +#: ../src/modules/alsa/alsa-mixer.c:2931 +msgid "Off" +msgstr "Vypnuto" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2184 +msgid "High Fidelity Playback (A2DP)" +msgstr "Přehrávání s velmi věrnou reprodukcí (A2DP)" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2198 +msgid "High Fidelity Capture (A2DP)" +msgstr "Záznam s velmi věrnou reprodukcí (A2DP)" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2213 +msgid "Telephony Duplex (HSP/HFP)" +msgstr "Duplexní telefonie (HSP/HFP)" + +#: ../src/modules/reserve-wrap.c:151 +msgid "PulseAudio Sound Server" +msgstr "Zvukový server PulseAudio" + +#: ../src/modules/module-rygel-media-server.c:569 +#: ../src/modules/module-rygel-media-server.c:583 +msgid "Output Devices" +msgstr "Výstupní zařízení" + +#: ../src/modules/module-rygel-media-server.c:570 +#: ../src/modules/module-rygel-media-server.c:584 +msgid "Input Devices" +msgstr "Vstupní zařízení" + +#: ../src/modules/module-rygel-media-server.c:774 +msgid "Audio on @HOSTNAME@" +msgstr "Zvuk na @HOSTNAME@" + +#: ../src/modules/alsa/alsa-mixer.c:1701 +msgid "Input" +msgstr "Vstup" + +#: ../src/modules/alsa/alsa-mixer.c:1702 +msgid "Docking Station Input" +msgstr "Vstup dokovací stanice" + +#: ../src/modules/alsa/alsa-mixer.c:1703 +msgid "Docking Station Microphone" +msgstr "Mikrofon dokovací stanice" + +#: ../src/modules/alsa/alsa-mixer.c:1704 +msgid "Line-In" +msgstr "Linkový vstup" + +#: ../src/modules/alsa/alsa-mixer.c:1705 +msgid "Microphone" +msgstr "Mikrofon" + +#: ../src/modules/alsa/alsa-mixer.c:1706 +msgid "External Microphone" +msgstr "Externí mikrofon" + +#: ../src/modules/alsa/alsa-mixer.c:1707 +msgid "Internal Microphone" +msgstr "Interní mikrofon" + +#: ../src/modules/alsa/alsa-mixer.c:1708 +msgid "Radio" +msgstr "Rádio" + +#: ../src/modules/alsa/alsa-mixer.c:1709 +msgid "Video" +msgstr "Obraz" + +#: ../src/modules/alsa/alsa-mixer.c:1710 +msgid "Automatic Gain Control" +msgstr "Automatické ovládání zesílení" + +#: ../src/modules/alsa/alsa-mixer.c:1711 +msgid "No Automatic Gain Control" +msgstr "Bez automatického ovládání zesílení" + +#: ../src/modules/alsa/alsa-mixer.c:1712 +msgid "Boost" +msgstr "Zesílení" + +#: ../src/modules/alsa/alsa-mixer.c:1713 +msgid "No Boost" +msgstr "Bez zesílení" + +#: ../src/modules/alsa/alsa-mixer.c:1714 +msgid "Amplifier" +msgstr "Zesilovač" + +#: ../src/modules/alsa/alsa-mixer.c:1715 +msgid "No Amplifier" +msgstr "Bez zesilovače" + +#: ../src/modules/alsa/alsa-mixer.c:1773 +msgid "Analog Input" +msgstr "Analogový vstup" + +#: ../src/modules/alsa/alsa-mixer.c:1774 +msgid "Analog Microphone" +msgstr "Analogový mikrofon" + +#: ../src/modules/alsa/alsa-mixer.c:1775 +msgid "Analog Line-In" +msgstr "Analogový linkový vstup" + +#: ../src/modules/alsa/alsa-mixer.c:1776 +msgid "Analog Radio" +msgstr "Analogové rádio" + +#: ../src/modules/alsa/alsa-mixer.c:1777 +msgid "Analog Video" +msgstr "Analogový obraz" + +#: ../src/modules/alsa/alsa-mixer.c:1778 +msgid "Analog Output" +msgstr "Analogový výstup" + +#: ../src/modules/alsa/alsa-mixer.c:1779 +msgid "Analog Headphones" +msgstr "Analogová sluchátka" + +#: ../src/modules/alsa/alsa-mixer.c:1780 +msgid "Analog Output (LFE)" +msgstr "Analogový výstup (LFE)" + +#: ../src/modules/alsa/alsa-mixer.c:1781 +msgid "Analog Mono Output" +msgstr "Analogový výstup mono" + +#: ../src/modules/alsa/alsa-mixer.c:1981 +#, c-format +msgid "%s+%s" +msgstr "%s+%s" + +#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404 +#, c-format +msgid "%s / %s" +msgstr "%s / %s" + +#: ../src/modules/alsa/alsa-mixer.c:2790 +msgid "Analog Mono" +msgstr "Analogové mono" + +#: ../src/modules/alsa/alsa-mixer.c:2791 +msgid "Analog Stereo" +msgstr "Analogové stereo" + +#: ../src/modules/alsa/alsa-mixer.c:2792 +msgid "Analog Surround 2.1" +msgstr "Analogový Surround 2.1" + +#: ../src/modules/alsa/alsa-mixer.c:2793 +msgid "Analog Surround 3.0" +msgstr "Analogový Surround 3.0" + +#: ../src/modules/alsa/alsa-mixer.c:2794 +msgid "Analog Surround 3.1" +msgstr "Analogový Surround 3.1" + +#: ../src/modules/alsa/alsa-mixer.c:2795 +msgid "Analog Surround 4.0" +msgstr "Analogový Surround 4.0" + +#: ../src/modules/alsa/alsa-mixer.c:2796 +msgid "Analog Surround 4.1" +msgstr "Analogový Surround 4.1" + +#: ../src/modules/alsa/alsa-mixer.c:2797 +msgid "Analog Surround 5.0" +msgstr "Analogový Surround 5.0" + +#: ../src/modules/alsa/alsa-mixer.c:2798 +msgid "Analog Surround 5.1" +msgstr "Analogový Surround 5.1" + +#: ../src/modules/alsa/alsa-mixer.c:2799 +msgid "Analog Surround 6.0" +msgstr "Analogový Surround 6.0" + +#: ../src/modules/alsa/alsa-mixer.c:2800 +msgid "Analog Surround 6.1" +msgstr "Analogový Surround 6.1" + +#: ../src/modules/alsa/alsa-mixer.c:2801 +msgid "Analog Surround 7.0" +msgstr "Analogový Surround 7.0" + +#: ../src/modules/alsa/alsa-mixer.c:2802 +msgid "Analog Surround 7.1" +msgstr "Analogový Surround 7.1" + +#: ../src/modules/alsa/alsa-mixer.c:2803 +msgid "Digital Stereo (IEC958)" +msgstr "Digitální stereo (IEC958)" + +#: ../src/modules/alsa/alsa-mixer.c:2804 +msgid "Digital Surround 4.0 (IEC958)" +msgstr "Digitální Surround 4.0 (IEC958)" + +#: ../src/modules/alsa/alsa-mixer.c:2805 +msgid "Digital Surround 4.0 (IEC958/AC3)" +msgstr "Digitální Surround 4.0 (IEC958/AC3)" + +#: ../src/modules/alsa/alsa-mixer.c:2806 +msgid "Digital Surround 5.1 (IEC958/AC3)" +msgstr "Digitální Surround 5.1 (IEC958/AC3)" + +#: ../src/modules/alsa/alsa-mixer.c:2807 +msgid "Digital Stereo (HDMI)" +msgstr "Digitální stereo (HDMI)" + +#: ../src/modules/alsa/alsa-mixer.c:2928 +msgid "Analog Mono Duplex" +msgstr "Analogové duplexní mono" + +#: ../src/modules/alsa/alsa-mixer.c:2929 +msgid "Analog Stereo Duplex" +msgstr "Analogové duplexní stereo" + +#: ../src/modules/alsa/alsa-mixer.c:2930 +msgid "Digital Stereo Duplex (IEC958)" +msgstr "Digitální duplexní stereo (IEC958)" + +#~ msgid "Invalid client name '%s'\n" +#~ msgstr "Neplatný název klienta \"%s\"\n" + +#~ msgid "Failed to determine sample specification from file.\n" +#~ msgstr "Selhalo zjištění určení vzorku ze souboru.\n" + +#~ msgid "select(): %s" +#~ msgstr "select(): %s" + +#~ msgid "Cannot connect to system bus: %s" +#~ msgstr "Nelze se spojit se systémovou sběrnicí: %s" + +#~ msgid "Cannot get caller from PID: %s" +#~ msgstr "Nelze získat volajícího z PID: %s" + +#~ msgid "Cannot set UID on caller object." +#~ msgstr "Nelze nastavit UID na objekt volajícího." + +#~ msgid "Failed to get CK session." +#~ msgstr "Nezdařilo se získání sezení CK." + +#~ msgid "Cannot set UID on session object." +#~ msgstr "Nelze nastavit UID na objekt sezení." + +#~ msgid "Cannot allocate PolKitAction." +#~ msgstr "Nelze alokovat PolKitAction." + +#~ msgid "Cannot set action_id" +#~ msgstr "Nelze nastavit action_id" + +#~ msgid "Cannot allocate PolKitContext." +#~ msgstr "Nelze alokovat PolKitContext." + +#~ msgid "Cannot initialize PolKitContext: %s" +#~ msgstr "Nelze spustit PolKitContext: %s" + +#~ msgid "Could not determine whether caller is authorized: %s" +#~ msgstr "Nezdařilo se určit, zda je volající oprávněn: %s" + +#~ msgid "Cannot obtain auth: %s" +#~ msgstr "Nezdařilo se získat oprávnění: %s" + +#~ msgid "PolicyKit responded with '%s'" +#~ msgstr "PolicyKit odpověděl s \"%s\"" + +#~ msgid "" +#~ "High-priority scheduling (negative Unix nice level) for the PulseAudio " +#~ "daemon" +#~ msgstr "" +#~ "Plánování o vysoké prioritě (záporná úroveň nice v Unixu) démona " +#~ "PulseAudio" + +#~ msgid "Real-time scheduling for the PulseAudio daemon" +#~ msgstr "Plánování v reálném čase démona PulseAudio" + +#~ msgid "" +#~ "System policy prevents PulseAudio from acquiring high-priority scheduling." +#~ msgstr "" +#~ "Systémová pravidla znemožňují technologii PulseAudio získat přístup k " +#~ "plánování o vysoké prioritě." + +#~ msgid "" +#~ "System policy prevents PulseAudio from acquiring real-time scheduling." +#~ msgstr "" +#~ "Systémová pravidla znemožňují technologii PulseAudio získat přístup k " +#~ "plánování v reálném čase." + +#~ msgid "read() failed: %s\n" +#~ msgstr "read() selhalo: %s\n" + +#~ msgid "pa_context_connect() failed: %s\n" +#~ msgstr "pa_context_connect() selhalo: %s\n" + +#~ msgid "We're in the group '%s', allowing high-priority scheduling." +#~ msgstr "" +#~ "Nacházíme se ve skupině \"%s\", což umožňuje plánování o vysoké prioritě." + +#~ msgid "We're in the group '%s', allowing real-time scheduling." +#~ msgstr "" +#~ "Nacházíme se ve skupině \"%s\", což umožňuje plánování v reálném čase." + +#~ msgid "PolicyKit grants us acquire-high-priority privilege." +#~ msgstr "PolicyKit nám udělil oprávnění acquire-high-priority." + +#~ msgid "PolicyKit refuses acquire-high-priority privilege." +#~ msgstr "PolicyKit nám neudělil oprávnění acquire-high-priority." + +#~ msgid "PolicyKit grants us acquire-real-time privilege." +#~ msgstr "PolicyKit nám udělil oprávnění acquire-real-time." + +#~ msgid "PolicyKit refuses acquire-real-time privilege." +#~ msgstr "PolicyKit nám neudělil oprávnění acquire-real-time." + +#~ msgid "" +#~ "Called SUID root and real-time and/or high-priority scheduling was " +#~ "requested in the configuration. However, we lack the necessary " +#~ "privileges:\n" +#~ "We are not in group '%s', PolicyKit refuse to grant us the requested " +#~ "privileges and we have no increase RLIMIT_NICE/RLIMIT_RTPRIO resource " +#~ "limits.\n" +#~ "For enabling real-time/high-priority scheduling please acquire the " +#~ "appropriate PolicyKit privileges, or become a member of '%s', or increase " +#~ "the RLIMIT_NICE/RLIMIT_RTPRIO resource limits for this user." +#~ msgstr "" +#~ "Voláno SUID root a v nastavení bylo požádáno o plánování v reálném čase " +#~ "či o vysoké prioritě. Schází nám ovšem potřebná oprávnění.\n" +#~ "Nejsme ve skupině \"%s\", PolicyKit nám odmítá přidělit požadovaná " +#~ "oprávnění a je nutné zvýšit omezení zdroje RLIMIT_NICE/RLIMIT_RTPRIO.\n" +#~ "Plánování v reálném čase či o vysoké prioritě zapnete získáním " +#~ "příslušných oprávnění PolicyKit, nebo tím, že se stanete členy \"%s\", " +#~ "nebo uživateli zvýšíte omezení zdroje RLIMIT_NICE/RLIMIT_RTPRIO." + +#~ msgid "" +#~ "High-priority scheduling enabled in configuration but not allowed by " +#~ "policy." +#~ msgstr "" +#~ "Plánování o vysoké prioritě v konfiguraci zapnuto, ale nepovoleno " +#~ "pravidly." + +#~ msgid "Successfully increased RLIMIT_RTPRIO" +#~ msgstr "Úspěšně zvýšeno RLIMIT_RTPRIO" + +#~ msgid "RLIMIT_RTPRIO failed: %s" +#~ msgstr "RLIMIT_RTPRIO selhalo: %s" + +#~ msgid "Giving up CAP_NICE" +#~ msgstr "Vzdávání se CAP_NICE" + +#~ msgid "" +#~ "Real-time scheduling enabled in configuration but not allowed by policy." +#~ msgstr "" +#~ "Plánování v reálném čase v konfiguraci zapnuto, ale nepovoleno pravidly." + +#~ msgid "Limited capabilities successfully to CAP_SYS_NICE." +#~ msgstr "Schopnosti úspěšně omezeny na CAP_SYS_NICE." + +#~ msgid "time_new() failed.\n" +#~ msgstr "time_new() selhalo.\n" + +#~ msgid "Output %s + Input %s" +#~ msgstr "Výstup %s + vstup %s" + +#~ msgid "Stream successfully created\n" +#~ msgstr "Proud úspěšně vytvořen\n" + +#~ msgid "Stream errror: %s\n" +#~ msgstr "Chyba proudu: %s\n" + +#~ msgid "Connection established.\n" +#~ msgstr "Spojení navázáno.\n" + +#~ msgid "" +#~ "%s [options] [FILE]\n" +#~ "\n" +#~ " -h, --help Show this help\n" +#~ " --version Show version\n" +#~ "\n" +#~ " -v, --verbose Enable verbose operation\n" +#~ "\n" +#~ " -s, --server=SERVER The name of the server to connect " +#~ "to\n" +#~ " -d, --device=DEVICE The name of the sink to connect " +#~ "to\n" +#~ " -n, --client-name=NAME How to call this client on the " +#~ "server\n" +#~ " --stream-name=NAME How to call this stream on the " +#~ "server\n" +#~ " --volume=VOLUME Specify the initial (linear) " +#~ "volume in range 0...65536\n" +#~ " --channel-map=CHANNELMAP Set the channel map to the use\n" +#~ msgstr "" +#~ "%s [přepínače] [SOUBOR]\n" +#~ "\n" +#~ " -h, --help Zobrazí tuto nápovědu\n" +#~ " --version Zobrazí verzi\n" +#~ "\n" +#~ " -v, --verbose Zapne nakládání s úrovní " +#~ "podrobností\n" +#~ "\n" +#~ " -s, --server=SERVER Název připojovaného serveru\n" +#~ " -d, --device=ZAŘÍZENÍ Název připojovaného cíle\n" +#~ " -n, --client-name=NÁZEV Způsob volání tohoto klienta na " +#~ "serveru\n" +#~ " --stream-name=NÁZEV Způsob volání tohoto proudu na " +#~ "serveru\n" +#~ " --volume=HLASITOST Určí počáteční (lineární) " +#~ "hlasitost v rozmezí 0...65536\n" +#~ " --channel-map=MAPAKANÁLŮ Nastaví mapu kanálů určenou k " +#~ "použití\n" + +#~ msgid "" +#~ "paplay %s\n" +#~ "Compiled with libpulse %s\n" +#~ "Linked with libpulse %s\n" +#~ msgstr "" +#~ "paplay %s\n" +#~ "Přeloženo s libpulse %s\n" +#~ "Propojeno s libpulse %s\n" + +#~ msgid "Invalid channel map\n" +#~ msgstr "Neplatná mapa kanálů\n" + +#~ msgid "Failed to open file '%s'\n" +#~ msgstr "Selhalo otevření souboru \"%s\"\n" + +#~ msgid "Channel map doesn't match file.\n" +#~ msgstr "Mapa kanálů neodpovídá souboru.\n" + +#~ msgid "Using sample spec '%s'\n" +#~ msgstr "Používá se vzorkovací specifikace \"%s\"\n" diff --git a/po/de.po b/po/de.po new file mode 100644 index 0000000..38a5006 --- /dev/null +++ b/po/de.po @@ -0,0 +1,2809 @@ +# German translation of pulseaudio +# Copyright (C) 2008 pulseaudio +# This file is distributed under the same license as the pulseaudio package. +# +# Fabian Affolter , 2008-2009. +# Micha Pietsch , 2008, 2009. +# +msgid "" +msgstr "" +"Project-Id-Version: pulseaudio\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-09-29 23:47+0200\n" +"PO-Revision-Date: 2009-09-28 16:49+0100\n" +"Last-Translator: Joerg (kital) Simon \n" +"Language-Team: German \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Poedit-Language: German\n" + +#: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629 +#, c-format +msgid "%s %s" +msgstr "%s %s" + +#: ../src/modules/alsa/alsa-util.c:1106 +#, c-format +msgid "" +"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu " +"ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_avail() gibt einen Wert zurück, welche außerordentlich groß ist: %lu " +"bytes (%lu ms).\n" +"Dies ist wahrscheinlich ein Fehler im ALSA-Treiber '%s'. Bitte melden Sie " +"diesen Punkt den ALSA-Entwicklern." + +#: ../src/modules/alsa/alsa-util.c:1147 +#, c-format +msgid "" +"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%" +"lu ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_delay() gibt einen Wert zurück, welche außerordentlich groß ist: %li " +"bytes (%s%lu ms).\n" +"Dies ist wahrscheinlich ein Fehler im ALSA-Treiber '%s'. Bitte melden Sie " +"diesen Punkt den ALSA-Entwicklern." + +#: ../src/modules/alsa/alsa-util.c:1194 +#, c-format +msgid "" +"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes " +"(%lu ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_mmap_begin() gibt einen Wert zurück, welche außerordentlich groß " +"ist: %lu bytes (%lu ms).\n" +"Dies ist wahrscheinlich ein Fehler im ALSA-Treiber '%s'. Bitte melden Sie " +"diesen Punkt den ALSA-Entwicklern." + +#: ../src/modules/module-always-sink.c:39 +msgid "Always keeps at least one sink loaded even if it's a null one" +msgstr "" + +#: ../src/modules/module-always-sink.c:83 +msgid "Dummy Output" +msgstr "Dummy-Ausgabe" + +#: ../src/modules/module-ladspa-sink.c:49 +#, fuzzy +msgid "Virtual LADSPA sink" +msgstr "Virtueller LADSPA-Sink" + +#: ../src/modules/module-ladspa-sink.c:53 +msgid "" +"sink_name= sink_properties= " +"master= format= rate= " +"channels= channel_map= plugin= label= control=" +msgstr "" + +#: ../src/modules/module-null-sink.c:55 +msgid "Clocked NULL sink" +msgstr "" + +#: ../src/modules/module-null-sink.c:291 +#, fuzzy +msgid "Null Output" +msgstr "Ausgang %s" + +#: ../src/pulsecore/sink.c:2613 +msgid "Internal Audio" +msgstr "Internes Audio" + +#: ../src/pulsecore/sink.c:2618 +msgid "Modem" +msgstr "Modem" + +#: ../src/daemon/ltdl-bind-now.c:124 +msgid "Failed to find original lt_dlopen loader." +msgstr "Ursprünglicher dlopen-Loader konnte nicht gefunden werden." + +#: ../src/daemon/ltdl-bind-now.c:129 +msgid "Failed to allocate new dl loader." +msgstr "Neuer dlopen-Loader konnte nicht gefunden werden." + +#: ../src/daemon/ltdl-bind-now.c:142 +msgid "Failed to add bind-now-loader." +msgstr "Hinzufügen von Bind-Now-Loader fehlgeschlagen." + +#: ../src/daemon/main.c:141 +#, c-format +msgid "Got signal %s." +msgstr "Signal %s empfangen." + +#: ../src/daemon/main.c:168 +msgid "Exiting." +msgstr "Wird beendet." + +#: ../src/daemon/main.c:186 +#, c-format +msgid "Failed to find user '%s'." +msgstr "Benutzer '%s' nicht gefunden." + +#: ../src/daemon/main.c:191 +#, c-format +msgid "Failed to find group '%s'." +msgstr "Gruppe '%s' nicht gefunden." + +#: ../src/daemon/main.c:195 +#, c-format +msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)." +msgstr "Benutzer '%s' (UID %lu) und Gruppe '%s' (GID %lu) gefunden." + +#: ../src/daemon/main.c:200 +#, c-format +msgid "GID of user '%s' and of group '%s' don't match." +msgstr "GID von Benutzer '%s' und Gruppe '%s' stimmen nicht überein." + +#: ../src/daemon/main.c:205 +#, c-format +msgid "Home directory of user '%s' is not '%s', ignoring." +msgstr "Benutzerverzeichnis von Benutzer '%s' ist nicht '%s', ignoriere." + +#: ../src/daemon/main.c:208 ../src/daemon/main.c:213 +#, c-format +msgid "Failed to create '%s': %s" +msgstr "Konnte '%s' nciht erzeugen: %s" + +#: ../src/daemon/main.c:220 +#, c-format +msgid "Failed to change group list: %s" +msgstr "Wechseln der Gruppen-Liste fehlgeschlagen: %s" + +#: ../src/daemon/main.c:236 +#, c-format +msgid "Failed to change GID: %s" +msgstr "Wechseln der GID fehlgeschlagen: %s" + +#: ../src/daemon/main.c:252 +#, c-format +msgid "Failed to change UID: %s" +msgstr "Wechseln der UID fehlgeschlagen: %s" + +#: ../src/daemon/main.c:271 +msgid "Successfully dropped root privileges." +msgstr "Root-Berechtigungen erfolgreich zurückgesetzt." + +#: ../src/daemon/main.c:279 +msgid "System wide mode unsupported on this platform." +msgstr "System-Modus auf dieser Plattform nicht unterstützt." + +#: ../src/daemon/main.c:297 +#, c-format +msgid "setrlimit(%s, (%u, %u)) failed: %s" +msgstr "setrlimit(%s, (%u, %u)) fehlgeschlagen: %s" + +#: ../src/daemon/main.c:474 +msgid "Failed to parse command line." +msgstr "Parsen der Kommandzeile fehlgeschlagen." + +#: ../src/daemon/main.c:541 +msgid "Daemon not running" +msgstr "Daemon läuft nicht" + +#: ../src/daemon/main.c:543 +#, c-format +msgid "Daemon running as PID %u" +msgstr "Daemon läuft als PID %u" + +#: ../src/daemon/main.c:553 +#, c-format +msgid "Failed to kill daemon: %s" +msgstr "Konnte Prozess nicht abbrechen: %s" + +#: ../src/daemon/main.c:571 +msgid "" +"This program is not intended to be run as root (unless --system is " +"specified)." +msgstr "" +"Dieses Programm sollte ohne die Option --system nicht als Administrator " +"ausgeführt werden." + +#: ../src/daemon/main.c:573 +msgid "Root privileges required." +msgstr "Root-Berechtigungen benötigt." + +#: ../src/daemon/main.c:578 +msgid "--start not supported for system instances." +msgstr "--start nicht unterstützt für System-Instanzen." + +#: ../src/daemon/main.c:583 +msgid "Running in system mode, but --disallow-exit not set!" +msgstr "System-Modus aktiv, jeodch --disallow-exit nicht gesetzt!" + +#: ../src/daemon/main.c:586 +msgid "Running in system mode, but --disallow-module-loading not set!" +msgstr "System-Modus aktiv, jedoch --disallow-module-loading nicht gesetzt!" + +#: ../src/daemon/main.c:589 +msgid "Running in system mode, forcibly disabling SHM mode!" +msgstr "System-Modus aktiv, SHM-Modus gezwungenermaßen deaktiviert!" + +#: ../src/daemon/main.c:594 +msgid "Running in system mode, forcibly disabling exit idle time!" +msgstr "System-Modus aktiv, Exit-Idle-Time gezwungenermaßen deaktiviert!" + +#: ../src/daemon/main.c:621 +msgid "Failed to acquire stdio." +msgstr "Reservieren von STDIO fehlgeschlagen." + +#: ../src/daemon/main.c:627 +#, c-format +msgid "pipe failed: %s" +msgstr "pipe fehlgeschlagen: %s" + +#: ../src/daemon/main.c:632 +#, c-format +msgid "fork() failed: %s" +msgstr "fork() fehlgeschlagen: %s" + +#: ../src/daemon/main.c:646 ../src/utils/pacat.c:508 +#, c-format +msgid "read() failed: %s" +msgstr "read() fehlgeschlagen: %s" + +#: ../src/daemon/main.c:652 +msgid "Daemon startup failed." +msgstr "Start des Daemons fehlgeschlagen." + +#: ../src/daemon/main.c:654 +msgid "Daemon startup successful." +msgstr "Start des Daemons erfolgreich." + +#: ../src/daemon/main.c:731 +#, c-format +msgid "This is PulseAudio %s" +msgstr "Dies ist PulseAudio %s" + +#: ../src/daemon/main.c:732 +#, c-format +msgid "Compilation host: %s" +msgstr "Kompilier-Host: %s" + +#: ../src/daemon/main.c:733 +#, c-format +msgid "Compilation CFLAGS: %s" +msgstr "Kompilier-CFLAGS: %s" + +#: ../src/daemon/main.c:736 +#, c-format +msgid "Running on host: %s" +msgstr "Laufe auf Host: %s" + +#: ../src/daemon/main.c:739 +#, c-format +msgid "Found %u CPUs." +msgstr "%u CPUs gefunden." + +#: ../src/daemon/main.c:741 +#, c-format +msgid "Page size is %lu bytes" +msgstr "Seitengröße ist %lu Bytes." + +#: ../src/daemon/main.c:744 +msgid "Compiled with Valgrind support: yes" +msgstr "Kompiliere mit Valgrind-Unterstützung: ja" + +#: ../src/daemon/main.c:746 +msgid "Compiled with Valgrind support: no" +msgstr "Kompiliere mit Valgrind-Unterstützung: nein" + +#: ../src/daemon/main.c:749 +#, c-format +msgid "Running in valgrind mode: %s" +msgstr "Läuft im Valgrind-Modus: %s" + +#: ../src/daemon/main.c:752 +msgid "Optimized build: yes" +msgstr "Optimiertes Build: ja" + +#: ../src/daemon/main.c:754 +msgid "Optimized build: no" +msgstr "Optimiertes Build: nein" + +#: ../src/daemon/main.c:758 +msgid "NDEBUG defined, all asserts disabled." +msgstr "NDEBUG definiert, alle Ansprüche deaktiviert." + +#: ../src/daemon/main.c:760 +msgid "FASTPATH defined, only fast path asserts disabled." +msgstr "FASTPATH definiert, nur fast-path-Ansprüche deaktiviert." + +#: ../src/daemon/main.c:762 +msgid "All asserts enabled." +msgstr "Alle Ansprüche aktiviert." + +#: ../src/daemon/main.c:766 +msgid "Failed to get machine ID" +msgstr "Beziehen der Maschinen-ID fehlgeschlagen" + +#: ../src/daemon/main.c:769 +#, c-format +msgid "Machine ID is %s." +msgstr "System- ID ist %s." + +#: ../src/daemon/main.c:773 +#, c-format +msgid "Session ID is %s." +msgstr "System- ID ist %s." + +#: ../src/daemon/main.c:779 +#, c-format +msgid "Using runtime directory %s." +msgstr "Nutze Laufzeit-Verzeichnis %s." + +#: ../src/daemon/main.c:784 +#, c-format +msgid "Using state directory %s." +msgstr "Nutze Zustands-Verzeichnis %s." + +#: ../src/daemon/main.c:787 +#, c-format +msgid "Using modules directory %s." +msgstr "Modul-Verzeichnis %s benutzen." + +#: ../src/daemon/main.c:789 +#, c-format +msgid "Running in system mode: %s" +msgstr "Laufe im System-Modus: %s" + +#: ../src/daemon/main.c:792 +msgid "" +"OK, so you are running PA in system mode. Please note that you most likely " +"shouldn't be doing that.\n" +"If you do it nonetheless then it's your own fault if things don't work as " +"expected.\n" +"Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an " +"explanation why system mode is usually a bad idea." +msgstr "" +"OK, nun wird PA im System Mode betrieben. Vorsicht, dies sollte man nicht " +"tun.\n" +"Bei Nichtbeachtung, selber Schuld wenn Dinge nicht funktionieren.\n" +"Für eine Erklärung warum System Mode eine schlechte Idee ist, bitte http://" +"pulseaudio.org/wiki/WhatIsWrongWithSystemMode lesen" + +#: ../src/daemon/main.c:809 +msgid "pa_pid_file_create() failed." +msgstr "pa_pid_file_create() fehlgeschlagen." + +#: ../src/daemon/main.c:819 +msgid "Fresh high-resolution timers available! Bon appetit!" +msgstr "Neue hochauslösende Timer verfügbar! Guten Appetit!" + +#: ../src/daemon/main.c:821 +msgid "" +"Dude, your kernel stinks! The chef's recommendation today is Linux with high-" +"resolution timers enabled!" +msgstr "Der Chefkoch empfiehlt: Linux mit aktivierten hochauslösenden Timern!" + +#: ../src/daemon/main.c:844 +msgid "pa_core_new() failed." +msgstr "pa_core_new() fehlgeschlagen." + +#: ../src/daemon/main.c:904 +msgid "Failed to initialize daemon." +msgstr "Konnte Daemon nicht initialisieren." + +#: ../src/daemon/main.c:909 +msgid "Daemon startup without any loaded modules, refusing to work." +msgstr "Daemon verweigert Ausführung, da keine Module geladen." + +#: ../src/daemon/main.c:926 +msgid "Daemon startup complete." +msgstr "Start des Daemons abgeschlossen." + +#: ../src/daemon/main.c:932 +msgid "Daemon shutdown initiated." +msgstr "Herunterfahren des Daemon gestartet." + +#: ../src/daemon/main.c:954 +msgid "Daemon terminated." +msgstr "Daemon beendet." + +#: ../src/daemon/cmdline.c:115 +#, fuzzy, c-format +msgid "" +"%s [options]\n" +"\n" +"COMMANDS:\n" +" -h, --help Show this help\n" +" --version Show version\n" +" --dump-conf Dump default configuration\n" +" --dump-modules Dump list of available modules\n" +" --dump-resample-methods Dump available resample methods\n" +" --cleanup-shm Cleanup stale shared memory " +"segments\n" +" --start Start the daemon if it is not " +"running\n" +" -k --kill Kill a running daemon\n" +" --check Check for a running daemon (only " +"returns exit code)\n" +"\n" +"OPTIONS:\n" +" --system[=BOOL] Run as system-wide instance\n" +" -D, --daemonize[=BOOL] Daemonize after startup\n" +" --fail[=BOOL] Quit when startup fails\n" +" --high-priority[=BOOL] Try to set high nice level\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_NICE)\n" +" --realtime[=BOOL] Try to enable realtime scheduling\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_RTPRIO)\n" +" --disallow-module-loading[=BOOL] Disallow module user requested " +"module\n" +" loading/unloading after startup\n" +" --disallow-exit[=BOOL] Disallow user requested exit\n" +" --exit-idle-time=SECS Terminate the daemon when idle and " +"this\n" +" time passed\n" +" --module-idle-time=SECS Unload autoloaded modules when idle " +"and\n" +" this time passed\n" +" --scache-idle-time=SECS Unload autoloaded samples when idle " +"and\n" +" this time passed\n" +" --log-level[=LEVEL] Increase or set verbosity level\n" +" -v Increase the verbosity level\n" +" --log-target={auto,syslog,stderr} Specify the log target\n" +" --log-meta[=BOOL] Include code location in log " +"messages\n" +" --log-time[=BOOL] Include timestamps in log messages\n" +" --log-backtrace=FRAMES Include a backtrace in log messages\n" +" -p, --dl-search-path=PATH Set the search path for dynamic " +"shared\n" +" objects (plugins)\n" +" --resample-method=METHOD Use the specified resampling method\n" +" (See --dump-resample-methods for\n" +" possible values)\n" +" --use-pid-file[=BOOL] Create a PID file\n" +" --no-cpu-limit[=BOOL] Do not install CPU load limiter on\n" +" platforms that support it.\n" +" --disable-shm[=BOOL] Disable shared memory support.\n" +"\n" +"STARTUP SCRIPT:\n" +" -L, --load=\"MODULE ARGUMENTS\" Load the specified plugin module " +"with\n" +" the specified argument\n" +" -F, --file=FILENAME Run the specified script\n" +" -C Open a command line on the running " +"TTY\n" +" after startup\n" +"\n" +" -n Don't load default script file\n" +msgstr "" +"%s [options]\n" +"\n" +"BEFEHLE:\n" +" -h, --help Zeige diese Hilfe\n" +" --version Zeige Version\n" +" --dump-conf Zeige Standardkonfiguration\n" +" --dump-modules Zeige Liste verfügbarer Module\n" +" --dump-resample-methods Zeige verfügbare Resample-Methoden\n" +" --cleanup-shm Cleanup stale shared memory " +"segments\n" +" --start Starte Daemon, falls noch nicht " +"geschehen\n" +" -k --kill Laufenden Daemon beenden\n" +" --check Prüfe laufende Daemone (gibt nur " +"einen Exit-Code zurück)\n" +"\n" +"OPTIONS:\n" +" --system[=BOOL] Als systemweite Instanz ausführen\n" +" -D, --daemonize[=BOOL] Nach Start zum Daemon machen\n" +" --fail[=BOOL] Beenden, wenn Start fehlschlägt\n" +" --high-priority[=BOOL] Nutze höchste Priorität\n" +" (Nur verfügbar als root, wenn SUID " +"oder\n" +" mit erhöhtem RLIMIT_NICE)\n" +" --realtime[=BOOL] Versuche, Echtzeit-Scheduling zu " +"aktivieren\n" +" (Nur verfügbar als root, wenn SUID " +"oder\n" +" mit erhöhtem RLIMIT_RTPRIO)\n" +" --disallow-module-loading[=BOOL] Verbiete (Ent-)laden durch Nutzer " +"angeforderter\n" +" Module nach dem Start\n" +" --disallow-exit[=BOOL] Verbiete Beenden auf Anfrage des " +"Nutzers\n" +" --exit-idle-time=SECS Beende Daemon, wenn für diese Zeit \n" +" untätig\n" +" --module-idle-time=SECS Entlade untätige Module nach dieser " +"Zeit\n" +" --scache-idle-time=SECS Entlade untätige automatisch " +"geladene \n" +" Samples nach dieser Zeit\n" +" --log-level[=STUFE] Grad der Ausführlichkeit angeben\n" +" -v Ausführliche Meldungen\n" +" --log-target={auto,syslog,stderr} Protokoll-Ziel angeben\n" +" -p, --dl-search-path=PFAD Suchpfad für dynamisch " +"freigegebene \n" +" Objekte (Plugins)\n" +" --resample-method=METHODE Nutze diese Resampling-Methode\n" +" (Siehe --dump-resample-methods für\n" +" mögliche Werte)\n" +" --use-pid-file[=BOOL] Eine PID-Datei erstellen\n" +" --no-cpu-limit[=BOOL] CPU-Lastbegrenzung auf " +"unterstützten\n" +" Systemen nicht installieren.\n" +" --disable-shm[=BOOL] Keine Unterstützung für Shared " +"Memory.\n" +"\n" +"STARTUP-SCRIPT:\n" +" -L, --load=\"MODUL-ARGUMENTE\" Plugin-Modul mit diesen Parametern \n" +" laden.\n" +" -F, --file=DATEINAMEN Dieses Skript ausführen\n" +" -C Nach Start auf laufendem TTY \n" +" eine Kommandozeile öffnen\n" +"\n" +" -n Standardskript nicht laden\n" + +#: ../src/daemon/cmdline.c:247 +msgid "--daemonize expects boolean argument" +msgstr "Option --daemonize erfordert bool'schen Wert" + +#: ../src/daemon/cmdline.c:254 +msgid "--fail expects boolean argument" +msgstr "Option --fail erfordert bool'schen Wert" + +#: ../src/daemon/cmdline.c:264 +msgid "" +"--log-level expects log level argument (either numeric in range 0..4 or one " +"of debug, info, notice, warn, error)." +msgstr "" +"--log-level erfordert Wert für Grad der Protokollierung (entweder numerisch " +"im Bereich 0..4 or einen dieser: debug, info, notice, warn, error)." + +#: ../src/daemon/cmdline.c:276 +msgid "--high-priority expects boolean argument" +msgstr "Option --high-priority erfordert bool'schen Wert" + +#: ../src/daemon/cmdline.c:283 +msgid "--realtime expects boolean argument" +msgstr "Option --realtime erfordert bool'schen Wert" + +#: ../src/daemon/cmdline.c:290 +msgid "--disallow-module-loading expects boolean argument" +msgstr "Option --disallow-module-loading erfordert bool'schen Wert" + +#: ../src/daemon/cmdline.c:297 +msgid "--disallow-exit expects boolean argument" +msgstr "--disallow-exit erfordert boolsches Argument" + +#: ../src/daemon/cmdline.c:304 +msgid "--use-pid-file expects boolean argument" +msgstr "Option --use-pid-file erfordert bool'schen Wert" + +#: ../src/daemon/cmdline.c:321 +msgid "Invalid log target: use either 'syslog', 'stderr' or 'auto'." +msgstr "" +"Ungültiges Log-Ziel: Benutzen Sie entweder 'syslog', 'stderr' oder 'auto'." + +#: ../src/daemon/cmdline.c:328 +msgid "--log-time expects boolean argument" +msgstr "--realtime erfordert boolsches Argument" + +#: ../src/daemon/cmdline.c:335 +msgid "--log-meta expects boolean argument" +msgstr "--log-meta erfordert boolschen Wert" + +#: ../src/daemon/cmdline.c:354 +#, c-format +msgid "Invalid resample method '%s'." +msgstr "Ungültige Resample-Methode '%s'." + +#: ../src/daemon/cmdline.c:361 +msgid "--system expects boolean argument" +msgstr "--System erwartet Boolean-Argument" + +#: ../src/daemon/cmdline.c:368 +msgid "--no-cpu-limit expects boolean argument" +msgstr "Option --no-cpu-limit erfordert bool'schen Wert" + +#: ../src/daemon/cmdline.c:375 +msgid "--disable-shm expects boolean argument" +msgstr "Option --disable-shm erfordert bool'schen Wert" + +#: ../src/daemon/dumpmodules.c:60 +#, c-format +msgid "Name: %s\n" +msgstr "Name: %s\n" + +#: ../src/daemon/dumpmodules.c:63 +#, c-format +msgid "No module information available\n" +msgstr "Keine Modul-Informationen verfügbar\n" + +#: ../src/daemon/dumpmodules.c:66 +#, c-format +msgid "Version: %s\n" +msgstr "Version: %s\n" + +#: ../src/daemon/dumpmodules.c:68 +#, c-format +msgid "Description: %s\n" +msgstr "Beschreibung: %s\n" + +#: ../src/daemon/dumpmodules.c:70 +#, c-format +msgid "Author: %s\n" +msgstr "Autor: %s\n" + +#: ../src/daemon/dumpmodules.c:72 +#, c-format +msgid "Usage: %s\n" +msgstr "Verwendung: %s\n" + +#: ../src/daemon/dumpmodules.c:73 +#, c-format +msgid "Load Once: %s\n" +msgstr "Lade einmalig: %s\n" + +#: ../src/daemon/dumpmodules.c:75 +#, fuzzy, c-format +msgid "DEPRECATION WARNING: %s\n" +msgstr "DEPRECATION WARNING: %s\n" + +#: ../src/daemon/dumpmodules.c:79 +#, c-format +msgid "Path: %s\n" +msgstr "Pfad: %s\n" + +#: ../src/daemon/daemon-conf.c:232 +#, c-format +msgid "[%s:%u] Invalid log target '%s'." +msgstr "[%s:%u] Ungültiges Log-Ziel '%s'." + +#: ../src/daemon/daemon-conf.c:248 +#, c-format +msgid "[%s:%u] Invalid log level '%s'." +msgstr "[%s:%u] Ungültige Log-Stufe '%s'." + +#: ../src/daemon/daemon-conf.c:264 +#, c-format +msgid "[%s:%u] Invalid resample method '%s'." +msgstr "[%s:%u] Ungültige Resample-Methode '%s'." + +#: ../src/daemon/daemon-conf.c:287 +#, c-format +msgid "[%s:%u] Invalid rlimit '%s'." +msgstr "[%s:%u] Ungültiges rlimit '%s'." + +#: ../src/daemon/daemon-conf.c:294 +#, c-format +msgid "[%s:%u] rlimit not supported on this platform." +msgstr "[%s:%u] rlimit auf dieser Plattform nicht unterstützt." + +#: ../src/daemon/daemon-conf.c:310 +#, c-format +msgid "[%s:%u] Invalid sample format '%s'." +msgstr "[%s:%u] Ungültiges Sample-Format '%s'." + +#: ../src/daemon/daemon-conf.c:328 +#, c-format +msgid "[%s:%u] Invalid sample rate '%s'." +msgstr "[%s:%u] Ungültige Sample-Rate '%s'." + +#: ../src/daemon/daemon-conf.c:352 +#, c-format +msgid "[%s:%u] Invalid sample channels '%s'." +msgstr "[%s:%u] Ungültige Sample-Kanäle '%s'." + +#: ../src/daemon/daemon-conf.c:370 +#, c-format +msgid "[%s:%u] Invalid channel map '%s'." +msgstr "[%s:%u] Ungültige Kanal-Zuordnung '%s'." + +#: ../src/daemon/daemon-conf.c:388 +#, c-format +msgid "[%s:%u] Invalid number of fragments '%s'." +msgstr "[%s:%u] Ungültige Anzahl von Fragmenten '%s'." + +#: ../src/daemon/daemon-conf.c:406 +#, c-format +msgid "[%s:%u] Invalid fragment size '%s'." +msgstr "[%s:%u] Ungültige Fragmentgröße '%s'." + +#: ../src/daemon/daemon-conf.c:424 +#, c-format +msgid "[%s:%u] Invalid nice level '%s'." +msgstr "[%s:%u] Ungültige Nice-Stufe '%s'." + +#: ../src/daemon/daemon-conf.c:546 +#, c-format +msgid "Failed to open configuration file: %s" +msgstr "Öffnen der Konfigurationsdatei fehlgeschlagen : %s" + +#: ../src/daemon/daemon-conf.c:562 +msgid "" +"The specified default channel map has a different number of channels than " +"the specified default number of channels." +msgstr "" +"Die angegebene Standard-Kanalzuordnung hat eine andere Anzahl von Kanälen " +"als die angegebene Standard-Kanal-Anzahl." + +#: ../src/daemon/daemon-conf.c:638 +#, c-format +msgid "### Read from configuration file: %s ###\n" +msgstr "### Lese von Konfigurationsdatei: %s ###\n" + +#: ../src/daemon/caps.c:62 +msgid "Cleaning up privileges." +msgstr "Root-Privilegien aufräumen." + +#: ../src/daemon/pulseaudio.desktop.in.h:1 +msgid "PulseAudio Sound System" +msgstr "PulseAudio Sound System" + +#: ../src/daemon/pulseaudio.desktop.in.h:2 +msgid "Start the PulseAudio Sound System" +msgstr "Das PulseAudio Sound System starten" + +#: ../src/pulse/channelmap.c:105 ../src/pulse/channelmap.c:757 +msgid "Mono" +msgstr "Mono" + +#: ../src/pulse/channelmap.c:107 +msgid "Front Center" +msgstr "Vorne Mitte" + +#: ../src/pulse/channelmap.c:108 +msgid "Front Left" +msgstr "Vorne Links" + +#: ../src/pulse/channelmap.c:109 +msgid "Front Right" +msgstr "Vorne Rechts" + +#: ../src/pulse/channelmap.c:111 +msgid "Rear Center" +msgstr "Hinten Mitte" + +#: ../src/pulse/channelmap.c:112 +msgid "Rear Left" +msgstr "Hinten Links" + +#: ../src/pulse/channelmap.c:113 +msgid "Rear Right" +msgstr "Hinten Rechts" + +#: ../src/pulse/channelmap.c:115 +msgid "Low Frequency Emmiter" +msgstr "Niedrigfrequenzemitter" + +#: ../src/pulse/channelmap.c:117 +msgid "Front Left-of-center" +msgstr "Vorne Links der Mitte" + +#: ../src/pulse/channelmap.c:118 +msgid "Front Right-of-center" +msgstr "Vorne Rechts der Mitte" + +#: ../src/pulse/channelmap.c:120 +msgid "Side Left" +msgstr "Seite Links" + +#: ../src/pulse/channelmap.c:121 +msgid "Side Right" +msgstr "Seite Rechts" + +#: ../src/pulse/channelmap.c:123 +msgid "Auxiliary 0" +msgstr "Zusatz 0" + +#: ../src/pulse/channelmap.c:124 +msgid "Auxiliary 1" +msgstr "Zusatz 1" + +#: ../src/pulse/channelmap.c:125 +msgid "Auxiliary 2" +msgstr "Zusatz 2" + +#: ../src/pulse/channelmap.c:126 +msgid "Auxiliary 3" +msgstr "Zusatz 3" + +#: ../src/pulse/channelmap.c:127 +msgid "Auxiliary 4" +msgstr "Zusatz 4" + +#: ../src/pulse/channelmap.c:128 +msgid "Auxiliary 5" +msgstr "Zusatz 5" + +#: ../src/pulse/channelmap.c:129 +msgid "Auxiliary 6" +msgstr "Zusatz 6" + +#: ../src/pulse/channelmap.c:130 +msgid "Auxiliary 7" +msgstr "Zusatz 7" + +#: ../src/pulse/channelmap.c:131 +msgid "Auxiliary 8" +msgstr "Zusatz 8" + +#: ../src/pulse/channelmap.c:132 +msgid "Auxiliary 9" +msgstr "Zusatz 9" + +#: ../src/pulse/channelmap.c:133 +msgid "Auxiliary 10" +msgstr "Zusatz 10" + +#: ../src/pulse/channelmap.c:134 +msgid "Auxiliary 11" +msgstr "Zusatz 11" + +#: ../src/pulse/channelmap.c:135 +msgid "Auxiliary 12" +msgstr "Zusatz 12" + +#: ../src/pulse/channelmap.c:136 +msgid "Auxiliary 13" +msgstr "Zusatz 13" + +#: ../src/pulse/channelmap.c:137 +msgid "Auxiliary 14" +msgstr "Zusatz 14" + +#: ../src/pulse/channelmap.c:138 +msgid "Auxiliary 15" +msgstr "Zusatz 15" + +#: ../src/pulse/channelmap.c:139 +msgid "Auxiliary 16" +msgstr "Zusatz 16" + +#: ../src/pulse/channelmap.c:140 +msgid "Auxiliary 17" +msgstr "Zusatz 17" + +#: ../src/pulse/channelmap.c:141 +msgid "Auxiliary 18" +msgstr "Zusatz 18" + +#: ../src/pulse/channelmap.c:142 +msgid "Auxiliary 19" +msgstr "Zusatz 19" + +#: ../src/pulse/channelmap.c:143 +msgid "Auxiliary 20" +msgstr "Zusatz 20" + +#: ../src/pulse/channelmap.c:144 +msgid "Auxiliary 21" +msgstr "Zusatz 21" + +#: ../src/pulse/channelmap.c:145 +msgid "Auxiliary 22" +msgstr "Zusatz 22" + +#: ../src/pulse/channelmap.c:146 +msgid "Auxiliary 23" +msgstr "Zusatz 23" + +#: ../src/pulse/channelmap.c:147 +msgid "Auxiliary 24" +msgstr "Zusatz 24" + +#: ../src/pulse/channelmap.c:148 +msgid "Auxiliary 25" +msgstr "Zusatz 25" + +#: ../src/pulse/channelmap.c:149 +msgid "Auxiliary 26" +msgstr "Zusatz 26" + +#: ../src/pulse/channelmap.c:150 +msgid "Auxiliary 27" +msgstr "Zusatz 26" + +#: ../src/pulse/channelmap.c:151 +msgid "Auxiliary 28" +msgstr "Zusatz 28" + +#: ../src/pulse/channelmap.c:152 +msgid "Auxiliary 29" +msgstr "Zusatz 29" + +#: ../src/pulse/channelmap.c:153 +msgid "Auxiliary 30" +msgstr "Zusatz 30" + +#: ../src/pulse/channelmap.c:154 +msgid "Auxiliary 31" +msgstr "Zusatz 31" + +#: ../src/pulse/channelmap.c:156 +msgid "Top Center" +msgstr "Oben Mitte" + +#: ../src/pulse/channelmap.c:158 +msgid "Top Front Center" +msgstr "Oben Vorne Mitte" + +#: ../src/pulse/channelmap.c:159 +msgid "Top Front Left" +msgstr "Oben Vorne Links" + +#: ../src/pulse/channelmap.c:160 +msgid "Top Front Right" +msgstr "Oben Vorne Rechts" + +#: ../src/pulse/channelmap.c:162 +msgid "Top Rear Center" +msgstr "Oben Hinten Mitte" + +#: ../src/pulse/channelmap.c:163 +msgid "Top Rear Left" +msgstr "Oben Hinten Links" + +#: ../src/pulse/channelmap.c:164 +msgid "Top Rear Right" +msgstr "Oben Hinten Rechts" + +#: ../src/pulse/channelmap.c:484 ../src/pulse/sample.c:170 +#: ../src/pulse/volume.c:295 ../src/pulse/volume.c:321 +#: ../src/pulse/volume.c:341 ../src/pulse/volume.c:371 +msgid "(invalid)" +msgstr "(ungültig)" + +#: ../src/pulse/channelmap.c:761 +msgid "Stereo" +msgstr "Stereo" + +#: ../src/pulse/channelmap.c:766 +msgid "Surround 4.0" +msgstr "Surround 4.0" + +#: ../src/pulse/channelmap.c:772 +msgid "Surround 4.1" +msgstr "Surround 4.1" + +#: ../src/pulse/channelmap.c:778 +msgid "Surround 5.0" +msgstr "Surround 5.0" + +#: ../src/pulse/channelmap.c:784 +msgid "Surround 5.1" +msgstr "Surround 5.1" + +#: ../src/pulse/channelmap.c:791 +msgid "Surround 7.1" +msgstr "Surround 7.1" + +#: ../src/pulse/error.c:43 +msgid "OK" +msgstr "OK" + +#: ../src/pulse/error.c:44 +msgid "Access denied" +msgstr "Zugriff abgelehnt" + +#: ../src/pulse/error.c:45 +msgid "Unknown command" +msgstr "Unbekannter Befehl" + +#: ../src/pulse/error.c:46 +msgid "Invalid argument" +msgstr "Ungültiges Argument" + +#: ../src/pulse/error.c:47 +msgid "Entity exists" +msgstr "Entität existiert bereits" + +#: ../src/pulse/error.c:48 +msgid "No such entity" +msgstr "Entität nicht vorhanden" + +#: ../src/pulse/error.c:49 +msgid "Connection refused" +msgstr "Verbindung verweigert" + +#: ../src/pulse/error.c:50 +msgid "Protocol error" +msgstr "Protokollfehler" + +#: ../src/pulse/error.c:51 +msgid "Timeout" +msgstr "Zeitüberschreitung" + +#: ../src/pulse/error.c:52 +msgid "No authorization key" +msgstr "Kein Authorisierungsschlüssel" + +#: ../src/pulse/error.c:53 +msgid "Internal error" +msgstr "Interner Fehler" + +#: ../src/pulse/error.c:54 +msgid "Connection terminated" +msgstr "Verbindung beendet" + +#: ../src/pulse/error.c:55 +msgid "Entity killed" +msgstr "Entität terminiert" + +#: ../src/pulse/error.c:56 +msgid "Invalid server" +msgstr "Ungültiger Server" + +#: ../src/pulse/error.c:57 +msgid "Module initalization failed" +msgstr "Modulinitialisierung fehlgeschlagen" + +#: ../src/pulse/error.c:58 +msgid "Bad state" +msgstr "Ungültiger Zustand" + +#: ../src/pulse/error.c:59 +msgid "No data" +msgstr "Keine Daten" + +#: ../src/pulse/error.c:60 +msgid "Incompatible protocol version" +msgstr "Inkompatible Protokollversion" + +#: ../src/pulse/error.c:61 +msgid "Too large" +msgstr "Zu groß" + +#: ../src/pulse/error.c:62 +msgid "Not supported" +msgstr "Nicht unterstützt" + +#: ../src/pulse/error.c:63 +msgid "Unknown error code" +msgstr "Unbekannter Fehlercode" + +#: ../src/pulse/error.c:64 +msgid "No such extension" +msgstr "Erweiterung nicht vorhanden" + +#: ../src/pulse/error.c:65 +msgid "Obsolete functionality" +msgstr "Veraltete Funktion" + +#: ../src/pulse/error.c:66 +msgid "Missing implementation" +msgstr "Fehlende Implementation" + +#: ../src/pulse/error.c:67 +msgid "Client forked" +msgstr "Client geteilt" + +#: ../src/pulse/error.c:68 +msgid "Input/Output error" +msgstr "Eingabe/Ausgabe-Fehler" + +#: ../src/pulse/error.c:69 +msgid "Device or resource busy" +msgstr "Gerät oder Ressource beschäftigt" + +#: ../src/pulse/sample.c:172 +#, c-format +msgid "%s %uch %uHz" +msgstr "%s %uch %uHz" + +#: ../src/pulse/sample.c:184 +#, c-format +msgid "%0.1f GiB" +msgstr "%0.1f GB" + +#: ../src/pulse/sample.c:186 +#, c-format +msgid "%0.1f MiB" +msgstr "%0.1f MB" + +#: ../src/pulse/sample.c:188 +#, c-format +msgid "%0.1f KiB" +msgstr "%0.1f KB" + +#: ../src/pulse/sample.c:190 +#, c-format +msgid "%u B" +msgstr "%u B" + +#: ../src/pulse/client-conf-x11.c:55 ../src/utils/pax11publish.c:100 +msgid "XOpenDisplay() failed" +msgstr "XOpenDisplay() fehlgeschlagen" + +#: ../src/pulse/client-conf-x11.c:93 +msgid "Failed to parse cookie data" +msgstr "Parsen der Cookie-Daten fehlgeschlagen" + +#: ../src/pulse/client-conf.c:111 +#, c-format +msgid "Failed to open configuration file '%s': %s" +msgstr "Konfigurationsdatei '%s' konnte nicht geöffnet werden: %s" + +#: ../src/pulse/context.c:550 +msgid "No cookie loaded. Attempting to connect without." +msgstr "Verbindungsversuch ohne Cookie, da keines geladen." + +#: ../src/pulse/context.c:693 +#, c-format +msgid "fork(): %s" +msgstr "fork(): %s" + +#: ../src/pulse/context.c:748 +#, c-format +msgid "waitpid(): %s" +msgstr "waitpid(): %s" + +#: ../src/pulse/context.c:1438 +#, c-format +msgid "Received message for unknown extension '%s'" +msgstr "Nachricht für unbekannte Erweiterung '%s' erhalten" + +#: ../src/utils/pacat.c:108 +#, c-format +msgid "Failed to drain stream: %s" +msgstr "Entleeren des Streams fehlgeschlagen: %s" + +#: ../src/utils/pacat.c:113 +msgid "Playback stream drained." +msgstr "Wiedergabe-Stream entleert." + +#: ../src/utils/pacat.c:123 +msgid "Draining connection to server." +msgstr "Verbindung zu Server entleert." + +#: ../src/utils/pacat.c:136 +#, c-format +msgid "pa_stream_drain(): %s" +msgstr "pa_stream_drain(): %s" + +#: ../src/utils/pacat.c:159 +#, c-format +msgid "pa_stream_write() failed: %s" +msgstr "pa_stream_write() fehlgeschlagen: %s" + +#: ../src/utils/pacat.c:197 +#, c-format +msgid "pa_stream_begin_write() failed: %s" +msgstr "pa_stream_write() fehlgeschlagen: %s" + +#: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267 +#, c-format +msgid "pa_stream_peek() failed: %s" +msgstr "pa_stream_peek() fehlgeschlagen: %s" + +#: ../src/utils/pacat.c:307 +msgid "Stream successfully created." +msgstr "Stream wurde erfolgreich erstellt." + +#: ../src/utils/pacat.c:310 +#, c-format +msgid "pa_stream_get_buffer_attr() failed: %s" +msgstr "pa_stream_get_buffer_attr() fehlgeschlagen: %s" + +#: ../src/utils/pacat.c:314 +#, c-format +msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u" +msgstr "Pufferdaten: maxlenght=%u, tlength=%u, prebuf=%u, minreq=%u" + +#: ../src/utils/pacat.c:317 +#, c-format +msgid "Buffer metrics: maxlength=%u, fragsize=%u" +msgstr "Pufferdaten: maxlength=%u, fragsize=%u" + +#: ../src/utils/pacat.c:321 +#, c-format +msgid "Using sample spec '%s', channel map '%s'." +msgstr "Benutze Sample-Angabe '%s', Kanalzuordnung '%s'." + +#: ../src/utils/pacat.c:325 +#, c-format +msgid "Connected to device %s (%u, %ssuspended)." +msgstr "Verbunden mit Gerät %s (%u, %sausgesetzt)." + +#: ../src/utils/pacat.c:335 +#, c-format +msgid "Stream error: %s" +msgstr "Stream-Fehler: %s" + +#: ../src/utils/pacat.c:345 +#, c-format +msgid "Stream device suspended.%s" +msgstr "Stream-Gerät ausgesetzt.%s" + +#: ../src/utils/pacat.c:347 +#, c-format +msgid "Stream device resumed.%s" +msgstr "Stream-Gerät reaktiviert.%s" + +#: ../src/utils/pacat.c:355 +#, c-format +msgid "Stream underrun.%s" +msgstr "Stream leergelaufen.%s" + +#: ../src/utils/pacat.c:362 +#, c-format +msgid "Stream overrun.%s" +msgstr "Stream überlaufen.%s " + +#: ../src/utils/pacat.c:369 +#, c-format +msgid "Stream started.%s" +msgstr "Stream gestartet: %s" + +#: ../src/utils/pacat.c:376 +#, c-format +msgid "Stream moved to device %s (%u, %ssuspended).%s" +msgstr "Stream an Gerät %s übergeben (%u, %sausgesetzt).%s" + +#: ../src/utils/pacat.c:376 +msgid "not " +msgstr "nicht " + +#: ../src/utils/pacat.c:383 +#, c-format +msgid "Stream buffer attributes changed.%s" +msgstr "Stream-Zwischenspeicher-Attribute geändert.%s" + +#: ../src/utils/pacat.c:415 +#, c-format +msgid "Connection established.%s" +msgstr "Verbindung hergestellt.%s" + +#: ../src/utils/pacat.c:418 +#, c-format +msgid "pa_stream_new() failed: %s" +msgstr "pa_stream_new() fehlgeschlagen: %s" + +#: ../src/utils/pacat.c:450 +#, c-format +msgid "pa_stream_connect_playback() failed: %s" +msgstr "pa_stream_connect_playback() fehlgeschlagen: %s" + +#: ../src/utils/pacat.c:456 +#, c-format +msgid "pa_stream_connect_record() failed: %s" +msgstr "pa_stream_connect_record() fehlgeschlagen: %s" + +#: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857 +#, c-format +msgid "Connection failure: %s" +msgstr "Verbindungsfehler: %s" + +#: ../src/utils/pacat.c:503 +msgid "Got EOF." +msgstr "EOF empfangen." + +#: ../src/utils/pacat.c:540 +#, c-format +msgid "write() failed: %s" +msgstr "write() fehlgeschlagen: %s" + +#: ../src/utils/pacat.c:561 +msgid "Got signal, exiting." +msgstr "Signal empfangen, beenden." + +#: ../src/utils/pacat.c:575 +#, c-format +msgid "Failed to get latency: %s" +msgstr "Erhalten der Latenz fehlgeschlagen: %s" + +#: ../src/utils/pacat.c:580 +#, c-format +msgid "Time: %0.3f sec; Latency: %0.0f usec." +msgstr "Zeit: %0.3f sec; Latenz: %0.0f usec." + +#: ../src/utils/pacat.c:599 +#, c-format +msgid "pa_stream_update_timing_info() failed: %s" +msgstr "pa_stream_update_timing_info() fehlgeschlagen: %s" + +#: ../src/utils/pacat.c:609 +#, fuzzy, c-format +msgid "" +"%s [options]\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -r, --record Create a connection for recording\n" +" -p, --playback Create a connection for playback\n" +"\n" +" -v, --verbose Enable verbose operations\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -d, --device=DEVICE The name of the sink/source to " +"connect to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" +" --stream-name=NAME How to call this stream on the " +"server\n" +" --volume=VOLUME Specify the initial (linear) volume " +"in range 0...65536\n" +" --rate=SAMPLERATE The sample rate in Hz (defaults to " +"44100)\n" +" --format=SAMPLEFORMAT The sample type, one of s16le, " +"s16be, u8, float32le,\n" +" float32be, ulaw, alaw, s32le, s32be, " +"s24le, s24be,\n" +" s24-32le, s24-32be (defaults to " +"s16ne)\n" +" --channels=CHANNELS The number of channels, 1 for mono, " +"2 for stereo\n" +" (defaults to 2)\n" +" --channel-map=CHANNELMAP Channel map to use instead of the " +"default\n" +" --fix-format Take the sample format from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-rate Take the sampling rate from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-channels Take the number of channels and the " +"channel map\n" +" from the sink the stream is being " +"connected to.\n" +" --no-remix Don't upmix or downmix channels.\n" +" --no-remap Map channels by index instead of " +"name.\n" +" --latency=BYTES Request the specified latency in " +"bytes.\n" +" --process-time=BYTES Request the specified process time " +"per request in bytes.\n" +" --property=PROPERTY=VALUE Set the specified property to the " +"specified value.\n" +" --raw Record/play raw PCM data.\n" +" --file-format=FFORMAT Record/play formatted PCM data.\n" +" --list-file-formats List available file formats.\n" +msgstr "" +"%s [options]\n" +"\n" +" -h, --help Diese Hilfe anzeigen\n" +" --version Version anzeigen\n" +"\n" +" -r, --record Aufnahme-Verbindung aufbauen\n" +" -p, --playback Wiedergabe-Verbindung aufbauen\n" +"\n" +" -v, --verbose Ausführliche Meldungen\n" +"\n" +" -s, --server=SERVER Name des zu verbindenden Servers\n" +" -d, --device=DEVICE Name zu verbindender Sink/Quelle\n" +" -n, --client-name=NAME Rufname des Clients auf dem Server\n" +" --stream-name=NAME Rufname des Streams auf dem Server\n" +" --volume=VOLUME Initiale (lineare) Lautstärke " +"zwischen 0...65536 angeben\n" +" --rate=SAMPLERATE Sample-Rate in Hz (Standard 44100)\n" +" --format=SAMPLEFORMAT Ein Sample-Format von s16le, s16be, " +"u8, float32le,\n" +" float32be, ulaw, alaw, s32le, s32be " +"(defaults to s16ne)\n" +" --channels=CHANNELS Anzahl Kanäle, 1 für mono, 2 für " +"stereo\n" +" (Standard ist 2)\n" +" --channel-map=CHANNELMAP Diese geänderte Kanalzuordnung " +"nutzen\n" +" --fix-format Sample-Format des mit Sink\n" +" verbundenen Streams nutzen.\n" +" --fix-rate Sample-Rate des mit Sink\n" +" verbundenen Streams nutzen.\n" +" --fix-channels Anzahl und Zuordnung der Kanäle\n" +" des mit Sink verbundenen\n" +" Streams nutzen.\n" +" --no-remix Kanäle nicht up-/down-mischen.\n" +" --no-remap Kanäle nach Index statt Name " +"zuordnen.\n" +" --latency=BYTES Diese Latenz verwenden.\n" +" --process-time=BYTES Diese Prozesszeit pro Anfrage " +"verwenden.\n" + +#: ../src/utils/pacat.c:731 +#, c-format +msgid "" +"pacat %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pacat %s\n" +"Kompiliert mit libpulse %s\n" +"Gelinkt mit libpulse %s\n" + +#: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953 +#, c-format +msgid "Invalid client name '%s'" +msgstr "Ungültiger Client-Name '%s'" + +#: ../src/utils/pacat.c:779 +#, c-format +msgid "Invalid stream name '%s'" +msgstr "Ungültiger Stream-Name '%s'" + +#: ../src/utils/pacat.c:816 +#, c-format +msgid "Invalid channel map '%s'" +msgstr "Ungültige Kanal-Zuweisung '%s'" + +#: ../src/utils/pacat.c:845 +#, c-format +msgid "Invalid latency specification '%s'" +msgstr "Ungültige Latenz-Angaben '%s'" + +#: ../src/utils/pacat.c:852 +#, c-format +msgid "Invalid process time specification '%s'" +msgstr "Ungültige Prozesszeit-Angaben '%s'" + +#: ../src/utils/pacat.c:864 +#, c-format +msgid "Invalid property '%s'" +msgstr "Ungültige Eigenschaft '%s'" + +#: ../src/utils/pacat.c:881 +#, c-format +msgid "Unknown file format %s." +msgstr "Unbekanntes Dateiformat %s." + +#: ../src/utils/pacat.c:900 +msgid "Invalid sample specification" +msgstr "Ungültige Sample-Angaben" + +#: ../src/utils/pacat.c:910 +#, c-format +msgid "open(): %s" +msgstr "open(): %s" + +#: ../src/utils/pacat.c:915 +#, c-format +msgid "dup2(): %s" +msgstr "dup2(): %s" + +#: ../src/utils/pacat.c:922 +msgid "Too many arguments." +msgstr "Zu viele Argumente." + +#: ../src/utils/pacat.c:933 +msgid "Failed to generate sample specification for file." +msgstr "Beziehen der Sample-Informationen für die Datei fehlgeschlagen." + +#: ../src/utils/pacat.c:953 +msgid "Failed to open audio file." +msgstr "Öffnen der Audio-Datei fehlgeschlagen." + +#: ../src/utils/pacat.c:959 +msgid "" +"Warning: specified sample specification will be overwritten with " +"specification from file." +msgstr "Warnung: Beziehen der Sample-Angabe aus Datei fehlgeschlagen." + +#: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997 +msgid "Failed to determine sample specification from file." +msgstr "Beziehen der Sample-Informationen der Datei fehlgeschlagen." + +#: ../src/utils/pacat.c:971 +msgid "Warning: Failed to determine channel map from file." +msgstr "Warnung: Bestimmung der Kanalzuordnung aus Datei fehlgeschlagen." + +#: ../src/utils/pacat.c:982 +msgid "Channel map doesn't match sample specification" +msgstr "Kanalzuordnung entspricht nicht Einstellungen des Samples" + +#: ../src/utils/pacat.c:993 +msgid "Warning: failed to write channel map to file." +msgstr "Warnung: Schreiben der Kanalzuordnung in Datei fehlgeschlagen." + +#: ../src/utils/pacat.c:1008 +#, c-format +msgid "" +"Opening a %s stream with sample specification '%s' and channel map '%s'." +msgstr "" +"Öffnen eines %s-Streams mit Sample-Angabe '%s' und Kanalzuordnung '%s'." + +#: ../src/utils/pacat.c:1009 +msgid "recording" +msgstr "aufnehmen" + +#: ../src/utils/pacat.c:1009 +msgid "playback" +msgstr "abspielen" + +#: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267 +msgid "pa_mainloop_new() failed." +msgstr "pa_mainloop_new() fehlgeschlagen" + +#: ../src/utils/pacat.c:1054 +msgid "io_new() failed." +msgstr "io_new() fehlgeschlagen." + +#: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279 +msgid "pa_context_new() failed." +msgstr "pa_context_new() fehlgeschlagen." + +#: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285 +#, c-format +msgid "pa_context_connect() failed: %s" +msgstr "pa_context_new() fehlgeschlagen: %s" + +#: ../src/utils/pacat.c:1075 +msgid "pa_context_rttime_new() failed." +msgstr "pa_context_new() fehlgeschlagen." + +#: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290 +msgid "pa_mainloop_run() failed." +msgstr "pa_mainloop_run() fehlgeschlagen." + +#: ../src/utils/pasuspender.c:81 +#, c-format +msgid "fork(): %s\n" +msgstr "fork(): %s\n" + +#: ../src/utils/pasuspender.c:92 +#, c-format +msgid "execvp(): %s\n" +msgstr "execvp(): %s\n" + +#: ../src/utils/pasuspender.c:109 +#, c-format +msgid "Failure to suspend: %s\n" +msgstr "Aussetzen fehlgeschlagen: %s\n" + +#: ../src/utils/pasuspender.c:124 +#, c-format +msgid "Failure to resume: %s\n" +msgstr "Resume fehlgeschlagen: %s\n" + +#: ../src/utils/pasuspender.c:147 +#, c-format +msgid "WARNING: Sound server is not local, not suspending.\n" +msgstr "WARNUNG: Sound-Server läuft nicht lokal, nicht ausgesetzt.\n" + +#: ../src/utils/pasuspender.c:159 +#, c-format +msgid "Connection failure: %s\n" +msgstr "Verbindungsfehler: %s\n" + +#: ../src/utils/pasuspender.c:176 +#, c-format +msgid "Got SIGINT, exiting.\n" +msgstr "SIGINT empfangen, beende.\n" + +#: ../src/utils/pasuspender.c:194 +#, c-format +msgid "WARNING: Child process terminated by signal %u\n" +msgstr "WARNUNG: Kind-Prozess durch Signal %u beendet\n" + +#: ../src/utils/pasuspender.c:212 +#, c-format +msgid "" +"%s [options] ... \n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +"\n" +msgstr "" +"%s [options] ... \n" +"\n" +" -h, --help Diese Hilfe zeigen\n" +" --version Zeige Version\n" +" -s, --server=SERVER Name des Zielservers\n" +"\n" + +#: ../src/utils/pasuspender.c:248 +#, c-format +msgid "" +"pasuspender %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pasuspender %s\n" +"kompiliert mit libpulse %s\n" +"Gelinkt mit libpulse %s\n" + +#: ../src/utils/pasuspender.c:277 +#, c-format +msgid "pa_mainloop_new() failed.\n" +msgstr "pa_mainloop_new() fehlgeschlagen.\n" + +#: ../src/utils/pasuspender.c:290 +#, c-format +msgid "pa_context_new() failed.\n" +msgstr "pa_context_new() fehlgeschlagen.\n" + +#: ../src/utils/pasuspender.c:298 +#, c-format +msgid "pa_mainloop_run() failed.\n" +msgstr "pa_mainloop_run() fehlgeschlagen.\n" + +#: ../src/utils/pactl.c:135 +#, c-format +msgid "Failed to get statistics: %s" +msgstr "Beziehen der Statistik fehlgeschlagen: %s" + +#: ../src/utils/pactl.c:141 +#, c-format +msgid "Currently in use: %u blocks containing %s bytes total.\n" +msgstr "Momentane Nutzung: %u Blöcke mit insgesamt %s Bytes.\n" + +#: ../src/utils/pactl.c:144 +#, c-format +msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n" +msgstr "Während gesamter Laufzeit: %u Blöcke mit insgesamt %s Bytes.\n" + +#: ../src/utils/pactl.c:147 +#, c-format +msgid "Sample cache size: %s\n" +msgstr "Sample-Pufferspeichergrösse: %s\n" + +#: ../src/utils/pactl.c:156 +#, c-format +msgid "Failed to get server information: %s" +msgstr "Beziehen der Server-Information fehlgeschlagen: %s" + +#: ../src/utils/pactl.c:164 +#, c-format +msgid "" +"User name: %s\n" +"Host Name: %s\n" +"Server Name: %s\n" +"Server Version: %s\n" +"Default Sample Specification: %s\n" +"Default Channel Map: %s\n" +"Default Sink: %s\n" +"Default Source: %s\n" +"Cookie: %08x\n" +msgstr "" +"Name des Nutzers: %s\n" +"Rechnername: %s\n" +"Name des Servers: %s\n" +"Version des Server: %s\n" +"Standard-Sample-Angabe: %s\n" +"Standard-Kanal-Zuordnung: %s\n" +"Standard-Ausgabe: %s\n" +"-Standard-Quelle: %s\n" +"Cookie: %08x\n" + +#: ../src/utils/pactl.c:205 +#, c-format +msgid "Failed to get sink information: %s" +msgstr "Erhalten der Sink-Informationen fehlgeschlagen: %s" + +#: ../src/utils/pactl.c:221 +#, c-format +msgid "" +"Sink #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor Source: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Senke #%u\n" +"\tStatus: %s\n" +"\tName: %s\n" +"\tBeschreibung: %s\n" +"\tTreiber: %s\n" +"\tSample-Angabe: %s\n" +"\tKanalzuordnung: %s\n" +"\tOwner-Modul: %u\n" +"\tStumm: %s\n" +"\tLautstärke: %s%s%s\n" +"\t Verteilung %0.2f\n" +"\tBasis-Lautstärke: %s%s%s\n" +"\tQuelle Monitor: %s\n" +"\tLatenz: %0.0f usec, eingestellt %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tEigenschaften:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360 +#, c-format +msgid "\tPorts:\n" +msgstr "\tProfile:\n" + +#: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366 +#, c-format +msgid "\tActive Port: %s\n" +msgstr "\tAktive Profile: %s\n" + +#: ../src/utils/pactl.c:297 +#, c-format +msgid "Failed to get source information: %s" +msgstr "Beziehen der Quellen-Informationen fehlgeschlagen: %s" + +#: ../src/utils/pactl.c:313 +#, c-format +msgid "" +"Source #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor of Sink: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Quelle #%u\n" +"\tStatus: %s\n" +"\tName: %s\n" +"\tBeschreibung: %s\n" +"\tTreiber: %s\n" +"\tSample-Angabe: %s\n" +"\tKanalzuordnung: %s\n" +"\tBesitzer-Modul: %u\n" +"\tStumm: %s\n" +"\tLautstärke: %s%s%s\n" +"\t Verteilung %0.2f\n" +"\tBasis-Lautstärke: %s%s%s\n" +"\tSenke-Monitor: %s\n" +"\tLatenz: %0.0f usec, eingestellt %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tEigenschaften:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:345 ../src/utils/pactl.c:401 ../src/utils/pactl.c:436 +#: ../src/utils/pactl.c:473 ../src/utils/pactl.c:532 ../src/utils/pactl.c:533 +#: ../src/utils/pactl.c:543 ../src/utils/pactl.c:587 ../src/utils/pactl.c:588 +#: ../src/utils/pactl.c:594 ../src/utils/pactl.c:637 ../src/utils/pactl.c:638 +#: ../src/utils/pactl.c:645 +msgid "n/a" +msgstr "k. A." + +#: ../src/utils/pactl.c:375 +#, c-format +msgid "Failed to get module information: %s" +msgstr "Beziehen der Modul-Information fehlgeschlagen: %s" + +#: ../src/utils/pactl.c:393 +#, c-format +msgid "" +"Module #%u\n" +"\tName: %s\n" +"\tArgument: %s\n" +"\tUsage counter: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Modul #%u\n" +"\tName: %s\n" +"\tArgument: %s\n" +"\tNutzungszähler: %s\n" +"\tEigenschaften:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:412 +#, c-format +msgid "Failed to get client information: %s" +msgstr "Beziehen der Client-Information fehlgeschlagen: %s" + +#: ../src/utils/pactl.c:430 +#, c-format +msgid "" +"Client #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Client #%u\n" +"\tTreiber: %s\n" +"\tOwner-Modul: %s\n" +"\tEigenschaften:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:447 +#, c-format +msgid "Failed to get card information: %s" +msgstr "Beziehen der Karten-Information fehlgeschlagen: %s" + +#: ../src/utils/pactl.c:465 +#, c-format +msgid "" +"Card #%u\n" +"\tName: %s\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Karte #%u\n" +"\tName: %s\n" +"\tTreiber: %s\n" +"\tOwner-Modul: %s\n" +"\tEigenschaften:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:479 +#, c-format +msgid "\tProfiles:\n" +msgstr "\tProfile:\n" + +#: ../src/utils/pactl.c:485 +#, c-format +msgid "\tActive Profile: %s\n" +msgstr "\tAktive Profile: %s\n" + +#: ../src/utils/pactl.c:496 +#, c-format +msgid "Failed to get sink input information: %s" +msgstr "Konnte Sink-Eingabe-Informationen nicht holen: %s" + +#: ../src/utils/pactl.c:515 +#, c-format +msgid "" +"Sink Input #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSink: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tMute: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSink Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Eingabe-Senke #%u\n" +"\tTreiber: %s\n" +"\tOwner-Modul: %s\n" +"\tClient: %s\n" +"\tSink: %u\n" +"\tSample-Angabe: %s\n" +"\tKanalzuordnung: %s\n" +"\tStumm: %s\n" +"\tLautstärke: %s\n" +"\t %s\n" +"\t Verteilung %0.2f\n" +"\tPufferlatenz: %0.0f usec\n" +"\tSink-Latenz: %0.0f usec\n" +"\tResample-Methode: %s\n" +"\tEigenschaften:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:554 +#, c-format +msgid "Failed to get source output information: %s" +msgstr "Konnte Informationen über Quell-Ausgabe nicht holen: %s" + +#: ../src/utils/pactl.c:574 +#, c-format +msgid "" +"Source Output #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSource: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSource Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Quell-Ausgabe #%u\n" +"\tTreiber: %s\n" +"\tOwner-Modul: %s\n" +"\tClient: %s\n" +"\tQuelle: %u\n" +"\tSample-Spezifizierung: %s\n" +"\tKanalzuordnung: %s\n" +"\tPufferlatenz: %0.0f usec\n" +"\tQuelllatenz: %0.0f usec\n" +"\tResample-Methode: %s\n" +"\tEigenschaften:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:605 +#, c-format +msgid "Failed to get sample information: %s" +msgstr "Beziehen der Sample-Informationen fehlgeschlagen: %s" + +#: ../src/utils/pactl.c:623 +#, c-format +msgid "" +"Sample #%u\n" +"\tName: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tDuration: %0.1fs\n" +"\tSize: %s\n" +"\tLazy: %s\n" +"\tFilename: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Sample #%u\n" +"\tName: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tLautstärke: %s\n" +"\t %s\n" +"\t Verteilung %0.2f\n" +"\tDauer: %0.1fs\n" +"\tGrösse: %s\n" +"\tLazy: %s\n" +"\tDateinamen: %s\n" +"\tEigenschaften:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663 +#, c-format +msgid "Failure: %s" +msgstr "Fehlgeschlagen: %s" + +#: ../src/utils/pactl.c:687 +#, c-format +msgid "Failed to upload sample: %s" +msgstr "Hochladen des Sample fehlgeschlagen: %s" + +#: ../src/utils/pactl.c:704 +msgid "Premature end of file" +msgstr "Dateiende ist zu früh aufgetreten" + +#: ../src/utils/pactl.c:863 +msgid "Got SIGINT, exiting." +msgstr "SIGINT empfangen, beenden." + +#: ../src/utils/pactl.c:869 +#, c-format +msgid "" +"%s [options] stat\n" +"%s [options] list\n" +"%s [options] exit\n" +"%s [options] upload-sample FILENAME [NAME]\n" +"%s [options] play-sample NAME [SINK]\n" +"%s [options] remove-sample NAME\n" +"%s [options] move-sink-input SINKINPUT SINK\n" +"%s [options] move-source-output SOURCEOUTPUT SOURCE\n" +"%s [options] load-module NAME [ARGS ...]\n" +"%s [options] unload-module MODULE\n" +"%s [options] suspend-sink SINK 1|0\n" +"%s [options] suspend-source SOURCE 1|0\n" +"%s [options] set-card-profile CARD PROFILE\n" +"%s [options] set-sink-port SINK PORT\n" +"%s [options] set-source-port SOURCE PORT\n" +"%s [options] set-sink-volume SINK VOLUME\n" +"%s [options] set-source-volume SOURCE VOLUME\n" +"%s [options] set-sink-input-volume SINKINPUT VOLUME\n" +"%s [options] set-sink-mute SINK 1|0\n" +"%s [options] set-source-mute SOURCE 1|0\n" +"%s [options] set-sink-input-mute SINKINPUT 1|0\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" +msgstr "" +"%s [options] stat\n" +"%s [options] list\n" +"%s [options] exit\n" +"%s [options] upload-sample FILENAME [NAME]\n" +"%s [options] play-sample NAME [SINK]\n" +"%s [options] remove-sample NAME\n" +"%s [options] move-sink-input SINKINPUT SINK\n" +"%s [options] move-source-output SOURCEOUTPUT SOURCE\n" +"%s [options] load-module NAME [ARGS ...]\n" +"%s [options] unload-module MODULE\n" +"%s [options] suspend-sink SINK 1|0\n" +"%s [options] suspend-source SOURCE 1|0\n" +"%s [options] set-card-profile CARD PROFILE\n" +"%s [options] set-sink-port SINK PORT\n" +"%s [options] set-source-port SOURCE PORT\n" +"%s [options] set-sink-volume SINK VOLUME\n" +"%s [options] set-source-volume SOURCE VOLUME\n" +"%s [options] set-sink-input-volume SINKINPUT VOLUME\n" +"%s [options] set-sink-mute SINK 1|0\n" +"%s [options] set-source-mute SOURCE 1|0\n" +"%s [options] set-sink-input-mute SINKINPUT 1|0\n" +"\n" +" -h, --help Diese Hilfe anzeigen\n" +" --version Version anzeigen\n" +"\n" +" -s, --server=SERVER Name des Zielservers\n" +" -n, --client-name=NAME Rufname des Clients auf dem Server\n" + +#: ../src/utils/pactl.c:933 +#, c-format +msgid "" +"pactl %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pactl %s\n" +"Kompiliert mit libpulse %s\n" +"Gelinkt mit libpulse %s\n" + +#: ../src/utils/pactl.c:979 +msgid "Please specify a sample file to load" +msgstr "Geben Sie eine zu öffnende Sample-Datei an" + +#: ../src/utils/pactl.c:992 +msgid "Failed to open sound file." +msgstr "Öffnen der Audio-Datei fehlgeschlagen." + +#: ../src/utils/pactl.c:1004 +msgid "Warning: Failed to determine sample specification from file." +msgstr "Warnung: Beziehen der Sample-Angabe aus Datei fehlgeschlagen." + +#: ../src/utils/pactl.c:1014 +msgid "You have to specify a sample name to play" +msgstr "Sie müssen eine abzuspielende Sample-Datei angeben" + +#: ../src/utils/pactl.c:1026 +msgid "You have to specify a sample name to remove" +msgstr "Sie müssen eine zu löschende Sample-Datei angeben" + +#: ../src/utils/pactl.c:1035 +msgid "You have to specify a sink input index and a sink" +msgstr "Sie müssen einen Sink-Eingabe-Indexwert und einen Sink angeben" + +#: ../src/utils/pactl.c:1045 +msgid "You have to specify a source output index and a source" +msgstr "" +"Sie müssen eine Indexwert für die Quell-Ausgabe und eine Quelle angeben" + +#: ../src/utils/pactl.c:1060 +msgid "You have to specify a module name and arguments." +msgstr "Sie müssen einen Modulnamen angeben und Argumente übergeben." + +#: ../src/utils/pactl.c:1080 +msgid "You have to specify a module index" +msgstr "Sie müssen einen Indexwert für ein Modul angeben" + +#: ../src/utils/pactl.c:1090 +msgid "" +"You may not specify more than one sink. You have to specify a boolean value." +msgstr "" +"Sie sollten nur eine Senke angeben. Sie müssen zumindest einen bool'schen " +"Wert übergeben." + +#: ../src/utils/pactl.c:1103 +msgid "" +"You may not specify more than one source. You have to specify a boolean " +"value." +msgstr "" +"Sie sollten nur eine Quelle angeben. Sie müssen zumindest einen bool'schen " +"Wert übergeben." + +#: ../src/utils/pactl.c:1115 +msgid "You have to specify a card name/index and a profile name" +msgstr "Sie müssen einen Karten-Name/Indexwert und einen Profilnamen angeben" + +#: ../src/utils/pactl.c:1126 +msgid "You have to specify a sink name/index and a port name" +msgstr "Sie müssen einen Senkennamen/-Indexwert und einen Portnamen angeben" + +#: ../src/utils/pactl.c:1137 +msgid "You have to specify a source name/index and a port name" +msgstr "Sie müssen einen Quellennamen/-Indexwert und einen Portnamen angeben" + +#: ../src/utils/pactl.c:1149 +msgid "You have to specify a sink name/index and a volume" +msgstr "Sie müssen einen Senkennamen/-Indexwert und einen Portnamen angeben" + +#: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171 +#: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209 +#: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248 +msgid "Invalid volume specification" +msgstr "Ungültige Sample-Angaben" + +#: ../src/utils/pactl.c:1166 +msgid "You have to specify a source name/index and a volume" +msgstr "Sie müssen einen Quellennamen/-Indexwert und einen Portnamen angeben" + +#: ../src/utils/pactl.c:1183 +msgid "You have to specify a sink input index and a volume" +msgstr "Sie müssen einen Sink-Eingabe-Indexwert und einen Sink angeben" + +#: ../src/utils/pactl.c:1188 +msgid "Invalid sink input index" +msgstr "Ungültiger Sink-Eingabe-Index" + +#: ../src/utils/pactl.c:1204 +msgid "You have to specify a sink name/index and a mute boolean" +msgstr "Sie müssen einen Senkennamen/-Indexwert und einen Portnamen angeben" + +#: ../src/utils/pactl.c:1221 +msgid "You have to specify a source name/index and a mute boolean" +msgstr "Sie müssen einen Quellennamen/-Indexwert und einen Portnamen angeben" + +#: ../src/utils/pactl.c:1238 +msgid "You have to specify a sink input index and a mute boolean" +msgstr "Sie müssen einen Sink-Eingabe-Indexwert und einen Sink angeben" + +#: ../src/utils/pactl.c:1243 +msgid "Invalid sink input index specification" +msgstr "Ungültige Sink-Eingabe-Index-Angaben" + +#: ../src/utils/pactl.c:1262 +msgid "No valid command specified." +msgstr "Kein gültiger Befehl angegeben." + +#: ../src/utils/pax11publish.c:61 +#, c-format +msgid "" +"%s [-D display] [-S server] [-O sink] [-I source] [-c file] [-d|-e|-i|-r]\n" +"\n" +" -d Show current PulseAudio data attached to X11 display (default)\n" +" -e Export local PulseAudio data to X11 display\n" +" -i Import PulseAudio data from X11 display to local environment " +"variables and cookie file.\n" +" -r Remove PulseAudio data from X11 display\n" +msgstr "" +"%s [-D display] [-S server] [-O sink] [-I source] [-c file] [-d|-e|-i|-r]\n" +"\n" +" -d Zeige aktuell mit X11-Anzeige verbundene PulseAudio-Daten (Standard)\n" +" -e Lokale PulseAudio-Daten an X11-Anzeige exportieren\n" +" -i PulseAudio-Daten von X11-Anzeige in lokale Umgebungsvariablen und " +"Cookie importieren.\n" +" -r PulseAudio-Daten von X11-Anzeige löschen\n" + +#: ../src/utils/pax11publish.c:94 +#, c-format +msgid "Failed to parse command line.\n" +msgstr "Parsen der Kommandozeile fehlgeschlagen.\n" + +#: ../src/utils/pax11publish.c:108 +#, c-format +msgid "Server: %s\n" +msgstr "Server: %s\n" + +#: ../src/utils/pax11publish.c:110 +#, c-format +msgid "Source: %s\n" +msgstr "Quelle: %s\n" + +#: ../src/utils/pax11publish.c:112 +#, c-format +msgid "Sink: %s\n" +msgstr "Sink: %s\n" + +#: ../src/utils/pax11publish.c:114 +#, c-format +msgid "Cookie: %s\n" +msgstr "Cookie: %s\n" + +#: ../src/utils/pax11publish.c:132 +#, c-format +msgid "Failed to parse cookie data\n" +msgstr "Paresen der Cookie-Daten fehlgeschlagen.\n" + +#: ../src/utils/pax11publish.c:137 +#, c-format +msgid "Failed to save cookie data\n" +msgstr "Speichern der Cookie-Daten fehlgeschlagen\n" + +#: ../src/utils/pax11publish.c:152 +#, c-format +msgid "Failed to load client configuration file.\n" +msgstr "Laden der Client-Konfigurationsdatei fehlgeschlagen.\n" + +#: ../src/utils/pax11publish.c:157 +#, c-format +msgid "Failed to read environment configuration data.\n" +msgstr "Lesen the Umgebungsdaten fehlgeschlagen.\n" + +#: ../src/utils/pax11publish.c:174 +#, c-format +msgid "Failed to get FQDN.\n" +msgstr "Beziehen des FQDN fehlgeschlagen.\n" + +#: ../src/utils/pax11publish.c:194 +#, c-format +msgid "Failed to load cookie data\n" +msgstr "Laden der Cookie-Daten fehlgeschlagen\n" + +#: ../src/utils/pax11publish.c:211 +#, c-format +msgid "Not yet implemented.\n" +msgstr "Noch nicht implementiert.\n" + +#: ../src/utils/pacmd.c:69 +msgid "No PulseAudio daemon running, or not running as session daemon." +msgstr "Es läuft kein PulseAudio-Dienst oder nicht als Sessiondienst." + +#: ../src/utils/pacmd.c:74 +#, c-format +msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s" +msgstr "socket(PF_UNIX, SOCK_STREAM, 0): %s" + +#: ../src/utils/pacmd.c:91 +#, c-format +msgid "connect(): %s" +msgstr "connect(): %s" + +#: ../src/utils/pacmd.c:99 +msgid "Failed to kill PulseAudio daemon." +msgstr "Terminieren des PulseAudio-Daemon fehlgeschlagen." + +#: ../src/utils/pacmd.c:107 +msgid "Daemon not responding." +msgstr "Daemon antwortet nicht." + +#: ../src/utils/pacmd.c:161 +#, c-format +msgid "poll(): %s" +msgstr "poll(): %s" + +#: ../src/utils/pacmd.c:171 ../src/utils/pacmd.c:188 +#, c-format +msgid "read(): %s" +msgstr "read(): %s" + +#: ../src/utils/pacmd.c:207 ../src/utils/pacmd.c:223 +#, c-format +msgid "write(): %s" +msgstr "write(): %s" + +#: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:219 +msgid "Cannot access autospawn lock." +msgstr "Fehler beim Zugriff auf Autostart -Sperre." + +#: ../src/modules/alsa/alsa-sink.c:530 ../src/modules/alsa/alsa-sink.c:689 +#, c-format +msgid "" +"ALSA woke us up to write new data to the device, but there was actually " +"nothing to write!\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers.\n" +"We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() " +"returned 0 or another value < min_avail." +msgstr "" + +#: ../src/modules/alsa/alsa-source.c:506 ../src/modules/alsa/alsa-source.c:656 +#, c-format +msgid "" +"ALSA woke us up to read new data from the device, but there was actually " +"nothing to read!\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers.\n" +"We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() " +"returned 0 or another value < min_avail." +msgstr "" + +#: ../src/modules/alsa/module-alsa-card.c:152 +#: ../src/modules/bluetooth/module-bluetooth-device.c:2228 +#: ../src/modules/alsa/alsa-mixer.c:2931 +msgid "Off" +msgstr "Aus" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2184 +msgid "High Fidelity Playback (A2DP)" +msgstr "High Fidelity Playback (A2DP)" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2198 +msgid "High Fidelity Capture (A2DP)" +msgstr "High Fidelity-Wiedergabe (A2DP)" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2213 +msgid "Telephony Duplex (HSP/HFP)" +msgstr "Telephony Duplex (HSP/HFP)" + +#: ../src/modules/reserve-wrap.c:151 +msgid "PulseAudio Sound Server" +msgstr "PulseAudio Sound Server" + +#: ../src/modules/module-rygel-media-server.c:569 +#: ../src/modules/module-rygel-media-server.c:583 +msgid "Output Devices" +msgstr "" + +#: ../src/modules/module-rygel-media-server.c:570 +#: ../src/modules/module-rygel-media-server.c:584 +#, fuzzy +msgid "Input Devices" +msgstr "Eingang %s" + +#: ../src/modules/module-rygel-media-server.c:774 +msgid "Audio on @HOSTNAME@" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1701 +#, fuzzy +msgid "Input" +msgstr "Eingang %s" + +#: ../src/modules/alsa/alsa-mixer.c:1702 +msgid "Docking Station Input" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1703 +msgid "Docking Station Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1704 +msgid "Line-In" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1705 +msgid "Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1706 +msgid "External Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1707 +#, fuzzy +msgid "Internal Microphone" +msgstr "Internes Audio" + +#: ../src/modules/alsa/alsa-mixer.c:1708 +msgid "Radio" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1709 +msgid "Video" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1710 +msgid "Automatic Gain Control" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1711 +msgid "No Automatic Gain Control" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1712 +msgid "Boost" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1713 +msgid "No Boost" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1714 +msgid "Amplifier" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1715 +msgid "No Amplifier" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1773 +#, fuzzy +msgid "Analog Input" +msgstr "Analog Mono" + +#: ../src/modules/alsa/alsa-mixer.c:1774 +#, fuzzy +msgid "Analog Microphone" +msgstr "Analog Mono" + +#: ../src/modules/alsa/alsa-mixer.c:1775 +#, fuzzy +msgid "Analog Line-In" +msgstr "Analog Mono" + +#: ../src/modules/alsa/alsa-mixer.c:1776 +#, fuzzy +msgid "Analog Radio" +msgstr "Analog Mono" + +#: ../src/modules/alsa/alsa-mixer.c:1777 +#, fuzzy +msgid "Analog Video" +msgstr "Analog Stereo" + +#: ../src/modules/alsa/alsa-mixer.c:1778 +#, fuzzy +msgid "Analog Output" +msgstr "Ausgang %s" + +#: ../src/modules/alsa/alsa-mixer.c:1779 +#, fuzzy +msgid "Analog Headphones" +msgstr "Analog Mono" + +#: ../src/modules/alsa/alsa-mixer.c:1780 +msgid "Analog Output (LFE)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1781 +#, fuzzy +msgid "Analog Mono Output" +msgstr "Analog Mono" + +#: ../src/modules/alsa/alsa-mixer.c:1981 +#, fuzzy, c-format +msgid "%s+%s" +msgstr "%s %s" + +#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404 +#, fuzzy, c-format +msgid "%s / %s" +msgstr "%s %s" + +#: ../src/modules/alsa/alsa-mixer.c:2790 +msgid "Analog Mono" +msgstr "Analog Mono" + +#: ../src/modules/alsa/alsa-mixer.c:2791 +msgid "Analog Stereo" +msgstr "Analog Stereo" + +#: ../src/modules/alsa/alsa-mixer.c:2792 +#, fuzzy +msgid "Analog Surround 2.1" +msgstr "Analog Surround 4.1" + +#: ../src/modules/alsa/alsa-mixer.c:2793 +#, fuzzy +msgid "Analog Surround 3.0" +msgstr "Analog Surround 4.0" + +#: ../src/modules/alsa/alsa-mixer.c:2794 +#, fuzzy +msgid "Analog Surround 3.1" +msgstr "Analog Surround 4.1" + +#: ../src/modules/alsa/alsa-mixer.c:2795 +msgid "Analog Surround 4.0" +msgstr "Analog Surround 4.0" + +#: ../src/modules/alsa/alsa-mixer.c:2796 +msgid "Analog Surround 4.1" +msgstr "Analog Surround 4.1" + +#: ../src/modules/alsa/alsa-mixer.c:2797 +msgid "Analog Surround 5.0" +msgstr "Analog Surround 5.0" + +#: ../src/modules/alsa/alsa-mixer.c:2798 +msgid "Analog Surround 5.1" +msgstr "Analog Surround 5.1" + +#: ../src/modules/alsa/alsa-mixer.c:2799 +#, fuzzy +msgid "Analog Surround 6.0" +msgstr "Analog Surround 4.0" + +#: ../src/modules/alsa/alsa-mixer.c:2800 +#, fuzzy +msgid "Analog Surround 6.1" +msgstr "Analog Surround 4.1" + +#: ../src/modules/alsa/alsa-mixer.c:2801 +#, fuzzy +msgid "Analog Surround 7.0" +msgstr "Analog Surround 4.0" + +#: ../src/modules/alsa/alsa-mixer.c:2802 +msgid "Analog Surround 7.1" +msgstr "Analog Surround 7.1" + +#: ../src/modules/alsa/alsa-mixer.c:2803 +msgid "Digital Stereo (IEC958)" +msgstr "Digital Stereo (IEC958)" + +#: ../src/modules/alsa/alsa-mixer.c:2804 +#, fuzzy +msgid "Digital Surround 4.0 (IEC958)" +msgstr "Digital Surround 4.0 (IEC958/AC3)" + +#: ../src/modules/alsa/alsa-mixer.c:2805 +msgid "Digital Surround 4.0 (IEC958/AC3)" +msgstr "Digital Surround 4.0 (IEC958/AC3)" + +#: ../src/modules/alsa/alsa-mixer.c:2806 +msgid "Digital Surround 5.1 (IEC958/AC3)" +msgstr "Digital Surround 5.1 (IEC958/AC3)" + +#: ../src/modules/alsa/alsa-mixer.c:2807 +msgid "Digital Stereo (HDMI)" +msgstr "Digital Stereo (HDMI)" + +#: ../src/modules/alsa/alsa-mixer.c:2928 +#, fuzzy +msgid "Analog Mono Duplex" +msgstr "Analog Mono" + +#: ../src/modules/alsa/alsa-mixer.c:2929 +#, fuzzy +msgid "Analog Stereo Duplex" +msgstr "Analog Stereo" + +#: ../src/modules/alsa/alsa-mixer.c:2930 +#, fuzzy +msgid "Digital Stereo Duplex (IEC958)" +msgstr "Digital Stereo (IEC958)" + +#~ msgid "Invalid client name '%s'\n" +#~ msgstr "Ungültiger Client-Name '%s'\n" + +#~ msgid "Failed to determine sample specification from file.\n" +#~ msgstr "Beziehen der Sample-Informationen der Datei fehlgeschlagen.\n" + +#~ msgid "select(): %s" +#~ msgstr "select(): %s" + +#~ msgid "Cannot connect to system bus: %s" +#~ msgstr "Kann nicht mit dem System-Bus verbinden: %s" + +#~ msgid "Cannot get caller from PID: %s" +#~ msgstr "Kann Caller von PID nicht beziehen: %s" + +#~ msgid "Cannot set UID on caller object." +#~ msgstr "Kann UID für Caller-Objekt nicht setzen." + +#~ msgid "Failed to get CK session." +#~ msgstr "Kann CK-Session nicht beziehen." + +#~ msgid "Cannot set UID on session object." +#~ msgstr "Kann UID für Session-Objekt nicht setzen." + +#~ msgid "Cannot allocate PolKitAction." +#~ msgstr "Konnte PolKitAction nicht zuordnen." + +#~ msgid "Cannot set action_id" +#~ msgstr "Kann action_id nicht setzen" + +#~ msgid "Cannot allocate PolKitContext." +#~ msgstr "Konnte PolKitContext nicht zuordnen." + +#~ msgid "Cannot initialize PolKitContext: %s" +#~ msgstr "Konnte PolKitContext nicht initialisieren: %s" + +#~ msgid "Could not determine whether caller is authorized: %s" +#~ msgstr "Autorisierung des Callers konnte nicht sichergestellt werden: %s" + +#~ msgid "Cannot obtain auth: %s" +#~ msgstr "Keine Authorisierung erhalten: %s" + +#~ msgid "PolicyKit responded with '%s'" +#~ msgstr "PolicyKit antwortete mit '%s'" + +#, fuzzy +#~ msgid "" +#~ "High-priority scheduling (negative Unix nice level) for the PulseAudio " +#~ "daemon" +#~ msgstr "" +#~ "Hochprioritäts-Terminierung () (negative Unix nice level) für den " +#~ "PulseAudio-Dienst" + +#~ msgid "Real-time scheduling for the PulseAudio daemon" +#~ msgstr "Echtzeit-Terminierung des PulseAudio-Daemon" + +#~ msgid "" +#~ "System policy prevents PulseAudio from acquiring high-priority scheduling." +#~ msgstr "" +#~ "System-Richtlinien verhindert PulseAudio beim Erlangen des high-priority " +#~ "scheduling." + +#~ msgid "" +#~ "System policy prevents PulseAudio from acquiring real-time scheduling." +#~ msgstr "" +#~ "System-Richtlinien verhindert PulseAudio beim Erlangen der Echtzeit-" +#~ "Terminierung." + +#~ msgid "read() failed: %s\n" +#~ msgstr "read() fehlgeschlagen: %s\n" + +#~ msgid "pa_context_connect() failed: %s\n" +#~ msgstr "pa_context_connect() fehlgeschlagen: %s\n" + +#~ msgid "We're in the group '%s', allowing high-priority scheduling." +#~ msgstr "" +#~ "Wir befinden uns in der Gruppe '%s', was Scheduling höchster Priorität " +#~ "ermöglicht." + +#~ msgid "We're in the group '%s', allowing real-time scheduling." +#~ msgstr "" +#~ "Wir befinden uns in der Gruppe '%s', was Echtzeit-Scheduling ermöglicht." + +#~ msgid "PolicyKit grants us acquire-high-priority privilege." +#~ msgstr "Richtlinien gewähren das Recht aquire-high-priority." + +#~ msgid "PolicyKit refuses acquire-high-priority privilege." +#~ msgstr "Richtlinien verweigern das Recht acquire-high-priority." + +#~ msgid "PolicyKit grants us acquire-real-time privilege." +#~ msgstr "Richtlinien gewähren das Recht aquire-real-time." + +#~ msgid "PolicyKit refuses acquire-real-time privilege." +#~ msgstr "Richtlinien verweigern das Recht acquire-real-time." + +#, fuzzy +#~ msgid "" +#~ "Called SUID root and real-time and/or high-priority scheduling was " +#~ "requested in the configuration. However, we lack the necessary " +#~ "privileges:\n" +#~ "We are not in group '%s', PolicyKit refuse to grant us the requested " +#~ "privileges and we have no increase RLIMIT_NICE/RLIMIT_RTPRIO resource " +#~ "limits.\n" +#~ "For enabling real-time/high-priority scheduling please acquire the " +#~ "appropriate PolicyKit privileges, or become a member of '%s', or increase " +#~ "the RLIMIT_NICE/RLIMIT_RTPRIO resource limits for this user." +#~ msgstr "" +#~ "' und PolicyKit verweigern diese Rechte. Verwerfe SUID wieder.\n" +#~ "Erlangen Sie die den Richtlinien entsprechenden Rechte, um Echtzeit-" +#~ "Scheduling zu aktivieren oder werden Sie Mitglied der Gruppe '" + +#~ msgid "" +#~ "High-priority scheduling enabled in configuration but not allowed by " +#~ "policy." +#~ msgstr "Scheduling höchster Priorität konfiguriert, jedoch nicht erlaubt." + +#~ msgid "Successfully increased RLIMIT_RTPRIO" +#~ msgstr "RLIMIT_RTPRIO erfolgreich erhöht" + +#~ msgid "RLIMIT_RTPRIO failed: %s" +#~ msgstr "RLIMIT_RTPRIO fehlgeschlagen: %s" + +#~ msgid "Giving up CAP_NICE" +#~ msgstr "Verwerfe CAP_NICE" + +#~ msgid "" +#~ "Real-time scheduling enabled in configuration but not allowed by policy." +#~ msgstr "Echtzeit-Scheduling konfiguriert, jedoch nicht erlaubt." + +#~ msgid "Limited capabilities successfully to CAP_SYS_NICE." +#~ msgstr "Fähigkeiten erfolgreich auf CAP_SYS_NICE reduziert." + +#~ msgid "time_new() failed.\n" +#~ msgstr "time_new() fehlgeschlagen.\n" + +#~ msgid "Output %s + Input %s" +#~ msgstr "Ausgabe %s + Eingabe %s" + +#~ msgid "Stream successfully created\n" +#~ msgstr "Stream erfolgreich erzeugt\n" + +#~ msgid "Stream errror: %s\n" +#~ msgstr "Stream-Fehler: %s\n" + +#~ msgid "Connection established.\n" +#~ msgstr "Verbindung hergestellt.\n" + +#~ msgid "" +#~ "%s [options] [FILE]\n" +#~ "\n" +#~ " -h, --help Show this help\n" +#~ " --version Show version\n" +#~ "\n" +#~ " -v, --verbose Enable verbose operation\n" +#~ "\n" +#~ " -s, --server=SERVER The name of the server to connect " +#~ "to\n" +#~ " -d, --device=DEVICE The name of the sink to connect " +#~ "to\n" +#~ " -n, --client-name=NAME How to call this client on the " +#~ "server\n" +#~ " --stream-name=NAME How to call this stream on the " +#~ "server\n" +#~ " --volume=VOLUME Specify the initial (linear) " +#~ "volume in range 0...65536\n" +#~ " --channel-map=CHANNELMAP Set the channel map to the use\n" +#~ msgstr "" +#~ "%s [options] [FILE]\n" +#~ "\n" +#~ " -h, --help Zeige diese Hilfe\n" +#~ " --version Zeige Version\n" +#~ "\n" +#~ " -v, --verbose Ausführliche Meldungen\n" +#~ "\n" +#~ " -s, --server=SERVER Name des Zielservers\n" +#~ " -d, --device=DEVICE Name des Ziel-Sink\n" +#~ " -n, --client-name=NAME Rufname des Clients auf dem " +#~ "Server\n" +#~ " --stream-name=NAME Rufname des Streams auf dem " +#~ "Server\n" +#~ " --volume=VOLUME Initiale (lineare) Lautstärke " +#~ "zwischen 0...65536\n" +#~ " --channel-map=CHANNELMAP Diese Kanalzuordnung nutzen\n" + +#~ msgid "" +#~ "paplay %s\n" +#~ "Compiled with libpulse %s\n" +#~ "Linked with libpulse %s\n" +#~ msgstr "" +#~ "paplay %s\n" +#~ "Kompliert mit libpulse %s\n" +#~ "Gelinkt mit libpulse %s\n" + +#~ msgid "Invalid channel map\n" +#~ msgstr "Ungültige Kanal-Zuweisung\n" + +#~ msgid "Failed to open file '%s'\n" +#~ msgstr "Öffnen der Datei '%s' fehlgeschlagen\n" + +#~ msgid "Channel map doesn't match file.\n" +#~ msgstr "Kanal-Zuweisung stimmt mit Datei nicht überein.\n" + +#~ msgid "Using sample spec '%s'\n" +#~ msgstr "Sampling-Angabe '%s' wird benutzt\n" + +#, fuzzy +#~ msgid "" +#~ "Called SUID root and real-time and/or high-priority scheduling was " +#~ "requested in the configuration. However, we lack the necessary " +#~ "privileges:\n" +#~ "We are not in group '" +#~ msgstr "" +#~ "Konfiguration fordert Aufruf der SUID root und Echtzeit-Scheduling " +#~ "höchster Priorität. Allerdings fehlen die nötigen Rechte:\n" +#~ "Wir befinden uns nicht in der Gruppe '" + +#~ msgid "--log-time boolean argument" +#~ msgstr "--log-time erfordert bool'schen Wert" + +#~ msgid "" +#~ "', or increase the RLIMIT_NICE/RLIMIT_RTPRIO resource limits for this " +#~ "user." +#~ msgstr "" +#~ "' oder erhöhen sie die RLIMIT_NICE/RLIMIT_RTPRIO-Ressourcenbegrenzungen " +#~ "für diesen Nutzer." + +#~ msgid "Default sink name (%s) does not exist in name register." +#~ msgstr "Vorgabename für Sink (%s) existiert nicht im Namensregister." + +#~ msgid "Buffer overrun, dropping incoming data\n" +#~ msgstr "Pufferüberlauf, verwerfe eingehende Daten\n" + +#~ msgid "pa_stream_drop() failed: %s\n" +#~ msgstr "pa_stream_drop() fehlgeschlagen: %s\n" + +#~ msgid "muted" +#~ msgstr "stumm" + +#~ msgid "" +#~ "*** Autoload Entry #%u ***\n" +#~ "Name: %s\n" +#~ "Type: %s\n" +#~ "Module: %s\n" +#~ "Argument: %s\n" +#~ msgstr "" +#~ "*** Autoload-Eintrag #%u ***\n" +#~ "Name: %s\n" +#~ "Typ: %s\n" +#~ "Modul: %s\n" +#~ "Argument: %s\n" + +#~ msgid "sink" +#~ msgstr "Sink" + +#~ msgid "source" +#~ msgstr "Quelle" + +#~ msgid "socketpair(): %s" +#~ msgstr "socketpair(): %s" diff --git a/po/de_CH.po b/po/de_CH.po new file mode 100644 index 0000000..e239deb --- /dev/null +++ b/po/de_CH.po @@ -0,0 +1,2804 @@ +# German translation of pulseaudio +# Copyright (C) 2008 pulseaudio +# This file is distributed under the same license as the pulseaudio package. +# +# Fabian Affolter , 2008-2009. +# Micha Pietsch , 2008, 2009. +# +msgid "" +msgstr "" +"Project-Id-Version: pulseaudio\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-09-29 23:47+0200\n" +"PO-Revision-Date: 2009-09-14 10:22+0100\n" +"Last-Translator: Fabian Affolter \n" +"Language-Team: German \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Poedit-Language: German\n" + +#: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629 +#, c-format +msgid "%s %s" +msgstr "%s %s" + +#: ../src/modules/alsa/alsa-util.c:1106 +#, c-format +msgid "" +"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu " +"ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_avail() gibt einen Wert zurück, welche außerordentlich groß ist: %lu " +"bytes (%lu ms).\n" +"Dies ist wahrscheinlich ein Fehler im ALSA-Treiber '%s'. Bitte melden Sie " +"diesen Punkt den ALSA-Entwicklern." + +#: ../src/modules/alsa/alsa-util.c:1147 +#, c-format +msgid "" +"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%" +"lu ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_delay() gibt einen Wert zurück, welche außerordentlich groß ist: %li " +"bytes (%s%lu ms).\n" +"Dies ist wahrscheinlich ein Fehler im ALSA-Treiber '%s'. Bitte melden Sie " +"diesen Punkt den ALSA-Entwicklern." + +#: ../src/modules/alsa/alsa-util.c:1194 +#, c-format +msgid "" +"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes " +"(%lu ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_mmap_begin() gibt einen Wert zurück, welche außerordentlich groß " +"ist: %lu bytes (%lu ms).\n" +"Dies ist wahrscheinlich ein Fehler im ALSA-Treiber '%s'. Bitte melden Sie " +"diesen Punkt den ALSA-Entwicklern." + +#: ../src/modules/module-always-sink.c:39 +msgid "Always keeps at least one sink loaded even if it's a null one" +msgstr "" + +#: ../src/modules/module-always-sink.c:83 +msgid "Dummy Output" +msgstr "Dummy-Ausgabe" + +#: ../src/modules/module-ladspa-sink.c:49 +#, fuzzy +msgid "Virtual LADSPA sink" +msgstr "Virtueller LADSPA-Sink" + +#: ../src/modules/module-ladspa-sink.c:53 +msgid "" +"sink_name= sink_properties= " +"master= format= rate= " +"channels= channel_map= plugin= label= control=" +msgstr "" + +#: ../src/modules/module-null-sink.c:55 +msgid "Clocked NULL sink" +msgstr "" + +#: ../src/modules/module-null-sink.c:291 +#, fuzzy +msgid "Null Output" +msgstr "Ausgang %s" + +#: ../src/pulsecore/sink.c:2613 +msgid "Internal Audio" +msgstr "Internes Audio" + +#: ../src/pulsecore/sink.c:2618 +msgid "Modem" +msgstr "Modem" + +#: ../src/daemon/ltdl-bind-now.c:124 +msgid "Failed to find original lt_dlopen loader." +msgstr "Ursprünglicher dlopen-Loader konnte nicht gefunden werden." + +#: ../src/daemon/ltdl-bind-now.c:129 +msgid "Failed to allocate new dl loader." +msgstr "Neuer dlopen-Loader konnte nicht gefunden werden." + +#: ../src/daemon/ltdl-bind-now.c:142 +msgid "Failed to add bind-now-loader." +msgstr "Hinzufügen von Bind-Now-Loader fehlgeschlagen." + +#: ../src/daemon/main.c:141 +#, c-format +msgid "Got signal %s." +msgstr "Signal %s empfangen." + +#: ../src/daemon/main.c:168 +msgid "Exiting." +msgstr "Wird beendet." + +#: ../src/daemon/main.c:186 +#, c-format +msgid "Failed to find user '%s'." +msgstr "Benutzer '%s' nicht gefunden." + +#: ../src/daemon/main.c:191 +#, c-format +msgid "Failed to find group '%s'." +msgstr "Gruppe '%s' nicht gefunden." + +#: ../src/daemon/main.c:195 +#, c-format +msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)." +msgstr "Benutzer '%s' (UID %lu) und Gruppe '%s' (GID %lu) gefunden." + +#: ../src/daemon/main.c:200 +#, c-format +msgid "GID of user '%s' and of group '%s' don't match." +msgstr "GID von Benutzer '%s' und Gruppe '%s' stimmen nicht überein." + +#: ../src/daemon/main.c:205 +#, c-format +msgid "Home directory of user '%s' is not '%s', ignoring." +msgstr "Benutzerverzeichnis von Benutzer '%s' ist nicht '%s', ignoriere." + +#: ../src/daemon/main.c:208 ../src/daemon/main.c:213 +#, c-format +msgid "Failed to create '%s': %s" +msgstr "Konnte '%s' nciht erzeugen: %s" + +#: ../src/daemon/main.c:220 +#, c-format +msgid "Failed to change group list: %s" +msgstr "Wechseln der Gruppen-Liste fehlgeschlagen: %s" + +#: ../src/daemon/main.c:236 +#, c-format +msgid "Failed to change GID: %s" +msgstr "Wechseln der GID fehlgeschlagen: %s" + +#: ../src/daemon/main.c:252 +#, c-format +msgid "Failed to change UID: %s" +msgstr "Wechseln der UID fehlgeschlagen: %s" + +#: ../src/daemon/main.c:271 +msgid "Successfully dropped root privileges." +msgstr "Root-Berechtigungen erfolgreich zurückgesetzt." + +#: ../src/daemon/main.c:279 +msgid "System wide mode unsupported on this platform." +msgstr "System-Modus auf dieser Plattform nicht unterstützt." + +#: ../src/daemon/main.c:297 +#, c-format +msgid "setrlimit(%s, (%u, %u)) failed: %s" +msgstr "setrlimit(%s, (%u, %u)) fehlgeschlagen: %s" + +#: ../src/daemon/main.c:474 +msgid "Failed to parse command line." +msgstr "Parsen der Kommandzeile fehlgeschlagen." + +#: ../src/daemon/main.c:541 +msgid "Daemon not running" +msgstr "Daemon läuft nicht" + +#: ../src/daemon/main.c:543 +#, c-format +msgid "Daemon running as PID %u" +msgstr "Daemon läuft als PID %u" + +#: ../src/daemon/main.c:553 +#, c-format +msgid "Failed to kill daemon: %s" +msgstr "Konnte Prozess nicht abbrechen: %s" + +#: ../src/daemon/main.c:571 +msgid "" +"This program is not intended to be run as root (unless --system is " +"specified)." +msgstr "" +"Dieses Programm sollte ohne die Option --system nicht als Administrator " +"ausgeführt werden." + +#: ../src/daemon/main.c:573 +msgid "Root privileges required." +msgstr "Root-Berechtigungen benötigt." + +#: ../src/daemon/main.c:578 +msgid "--start not supported for system instances." +msgstr "--start nicht unterstützt für System-Instanzen." + +#: ../src/daemon/main.c:583 +msgid "Running in system mode, but --disallow-exit not set!" +msgstr "System-Modus aktiv, jeodch --disallow-exit nicht gesetzt!" + +#: ../src/daemon/main.c:586 +msgid "Running in system mode, but --disallow-module-loading not set!" +msgstr "System-Modus aktiv, jedoch --disallow-module-loading nicht gesetzt!" + +#: ../src/daemon/main.c:589 +msgid "Running in system mode, forcibly disabling SHM mode!" +msgstr "System-Modus aktiv, SHM-Modus gezwungenermaßen deaktiviert!" + +#: ../src/daemon/main.c:594 +msgid "Running in system mode, forcibly disabling exit idle time!" +msgstr "System-Modus aktiv, Exit-Idle-Time gezwungenermaßen deaktiviert!" + +#: ../src/daemon/main.c:621 +msgid "Failed to acquire stdio." +msgstr "Reservieren von STDIO fehlgeschlagen." + +#: ../src/daemon/main.c:627 +#, c-format +msgid "pipe failed: %s" +msgstr "pipe fehlgeschlagen: %s" + +#: ../src/daemon/main.c:632 +#, c-format +msgid "fork() failed: %s" +msgstr "fork() fehlgeschlagen: %s" + +#: ../src/daemon/main.c:646 ../src/utils/pacat.c:508 +#, c-format +msgid "read() failed: %s" +msgstr "read() fehlgeschlagen: %s" + +#: ../src/daemon/main.c:652 +msgid "Daemon startup failed." +msgstr "Start des Daemons fehlgeschlagen." + +#: ../src/daemon/main.c:654 +msgid "Daemon startup successful." +msgstr "Start des Daemons erfolgreich." + +#: ../src/daemon/main.c:731 +#, c-format +msgid "This is PulseAudio %s" +msgstr "Dies ist PulseAudio %s" + +#: ../src/daemon/main.c:732 +#, c-format +msgid "Compilation host: %s" +msgstr "Kompilier-Host: %s" + +#: ../src/daemon/main.c:733 +#, c-format +msgid "Compilation CFLAGS: %s" +msgstr "Kompilier-CFLAGS: %s" + +#: ../src/daemon/main.c:736 +#, c-format +msgid "Running on host: %s" +msgstr "Laufe auf Host: %s" + +#: ../src/daemon/main.c:739 +#, c-format +msgid "Found %u CPUs." +msgstr "%u CPUs gefunden." + +#: ../src/daemon/main.c:741 +#, c-format +msgid "Page size is %lu bytes" +msgstr "Seitengröße ist %lu Bytes." + +#: ../src/daemon/main.c:744 +msgid "Compiled with Valgrind support: yes" +msgstr "Kompiliere mit Valgrind-Unterstützung: ja" + +#: ../src/daemon/main.c:746 +msgid "Compiled with Valgrind support: no" +msgstr "Kompiliere mit Valgrind-Unterstützung: nein" + +#: ../src/daemon/main.c:749 +#, c-format +msgid "Running in valgrind mode: %s" +msgstr "Läuft im Valgrind-Modus: %s" + +#: ../src/daemon/main.c:752 +msgid "Optimized build: yes" +msgstr "Optimiertes Build: ja" + +#: ../src/daemon/main.c:754 +msgid "Optimized build: no" +msgstr "Optimiertes Build: nein" + +#: ../src/daemon/main.c:758 +msgid "NDEBUG defined, all asserts disabled." +msgstr "NDEBUG definiert, alle Ansprüche deaktiviert." + +#: ../src/daemon/main.c:760 +msgid "FASTPATH defined, only fast path asserts disabled." +msgstr "FASTPATH definiert, nur fast-path-Ansprüche deaktiviert." + +#: ../src/daemon/main.c:762 +msgid "All asserts enabled." +msgstr "Alle Ansprüche aktiviert." + +#: ../src/daemon/main.c:766 +msgid "Failed to get machine ID" +msgstr "Beziehen der Maschinen-ID fehlgeschlagen" + +#: ../src/daemon/main.c:769 +#, c-format +msgid "Machine ID is %s." +msgstr "System- ID ist %s." + +#: ../src/daemon/main.c:773 +#, c-format +msgid "Session ID is %s." +msgstr "System- ID ist %s." + +#: ../src/daemon/main.c:779 +#, c-format +msgid "Using runtime directory %s." +msgstr "Nutze Laufzeit-Verzeichnis %s." + +#: ../src/daemon/main.c:784 +#, c-format +msgid "Using state directory %s." +msgstr "Nutze Zustands-Verzeichnis %s." + +#: ../src/daemon/main.c:787 +#, c-format +msgid "Using modules directory %s." +msgstr "Modul-Verzeichnis %s benutzen." + +#: ../src/daemon/main.c:789 +#, c-format +msgid "Running in system mode: %s" +msgstr "Laufe im System-Modus: %s" + +#: ../src/daemon/main.c:792 +msgid "" +"OK, so you are running PA in system mode. Please note that you most likely " +"shouldn't be doing that.\n" +"If you do it nonetheless then it's your own fault if things don't work as " +"expected.\n" +"Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an " +"explanation why system mode is usually a bad idea." +msgstr "" + +#: ../src/daemon/main.c:809 +msgid "pa_pid_file_create() failed." +msgstr "pa_pid_file_create() fehlgeschlagen." + +#: ../src/daemon/main.c:819 +msgid "Fresh high-resolution timers available! Bon appetit!" +msgstr "Neue hochauslösende Timer verfügbar! Guten Appetit!" + +#: ../src/daemon/main.c:821 +msgid "" +"Dude, your kernel stinks! The chef's recommendation today is Linux with high-" +"resolution timers enabled!" +msgstr "Der Chefkoch empfiehlt: Linux mit aktivierten hochauslösenden Timern!" + +#: ../src/daemon/main.c:844 +msgid "pa_core_new() failed." +msgstr "pa_core_new() fehlgeschlagen." + +#: ../src/daemon/main.c:904 +msgid "Failed to initialize daemon." +msgstr "Konnte Daemon nicht initialisieren." + +#: ../src/daemon/main.c:909 +msgid "Daemon startup without any loaded modules, refusing to work." +msgstr "Daemon verweigert Ausführung, da keine Module geladen." + +#: ../src/daemon/main.c:926 +msgid "Daemon startup complete." +msgstr "Start des Daemons abgeschlossen." + +#: ../src/daemon/main.c:932 +msgid "Daemon shutdown initiated." +msgstr "Herunterfahren des Daemon gestartet." + +#: ../src/daemon/main.c:954 +msgid "Daemon terminated." +msgstr "Daemon beendet." + +#: ../src/daemon/cmdline.c:115 +#, fuzzy, c-format +msgid "" +"%s [options]\n" +"\n" +"COMMANDS:\n" +" -h, --help Show this help\n" +" --version Show version\n" +" --dump-conf Dump default configuration\n" +" --dump-modules Dump list of available modules\n" +" --dump-resample-methods Dump available resample methods\n" +" --cleanup-shm Cleanup stale shared memory " +"segments\n" +" --start Start the daemon if it is not " +"running\n" +" -k --kill Kill a running daemon\n" +" --check Check for a running daemon (only " +"returns exit code)\n" +"\n" +"OPTIONS:\n" +" --system[=BOOL] Run as system-wide instance\n" +" -D, --daemonize[=BOOL] Daemonize after startup\n" +" --fail[=BOOL] Quit when startup fails\n" +" --high-priority[=BOOL] Try to set high nice level\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_NICE)\n" +" --realtime[=BOOL] Try to enable realtime scheduling\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_RTPRIO)\n" +" --disallow-module-loading[=BOOL] Disallow module user requested " +"module\n" +" loading/unloading after startup\n" +" --disallow-exit[=BOOL] Disallow user requested exit\n" +" --exit-idle-time=SECS Terminate the daemon when idle and " +"this\n" +" time passed\n" +" --module-idle-time=SECS Unload autoloaded modules when idle " +"and\n" +" this time passed\n" +" --scache-idle-time=SECS Unload autoloaded samples when idle " +"and\n" +" this time passed\n" +" --log-level[=LEVEL] Increase or set verbosity level\n" +" -v Increase the verbosity level\n" +" --log-target={auto,syslog,stderr} Specify the log target\n" +" --log-meta[=BOOL] Include code location in log " +"messages\n" +" --log-time[=BOOL] Include timestamps in log messages\n" +" --log-backtrace=FRAMES Include a backtrace in log messages\n" +" -p, --dl-search-path=PATH Set the search path for dynamic " +"shared\n" +" objects (plugins)\n" +" --resample-method=METHOD Use the specified resampling method\n" +" (See --dump-resample-methods for\n" +" possible values)\n" +" --use-pid-file[=BOOL] Create a PID file\n" +" --no-cpu-limit[=BOOL] Do not install CPU load limiter on\n" +" platforms that support it.\n" +" --disable-shm[=BOOL] Disable shared memory support.\n" +"\n" +"STARTUP SCRIPT:\n" +" -L, --load=\"MODULE ARGUMENTS\" Load the specified plugin module " +"with\n" +" the specified argument\n" +" -F, --file=FILENAME Run the specified script\n" +" -C Open a command line on the running " +"TTY\n" +" after startup\n" +"\n" +" -n Don't load default script file\n" +msgstr "" +"%s [options]\n" +"\n" +"BEFEHLE:\n" +" -h, --help Zeige diese Hilfe\n" +" --version Zeige Version\n" +" --dump-conf Zeige Standardkonfiguration\n" +" --dump-modules Zeige Liste verfügbarer Module\n" +" --dump-resample-methods Zeige verfügbare Resample-Methoden\n" +" --cleanup-shm Cleanup stale shared memory " +"segments\n" +" --start Starte Daemon, falls noch nicht " +"geschehen\n" +" -k --kill Laufenden Daemon beenden\n" +" --check Prüfe laufende Daemone (gibt nur " +"einen Exit-Code zurück)\n" +"\n" +"OPTIONS:\n" +" --system[=BOOL] Als systemweite Instanz ausführen\n" +" -D, --daemonize[=BOOL] Nach Start zum Daemon machen\n" +" --fail[=BOOL] Beenden, wenn Start fehlschlägt\n" +" --high-priority[=BOOL] Nutze höchste Priorität\n" +" (Nur verfügbar als root, wenn SUID " +"oder\n" +" mit erhöhtem RLIMIT_NICE)\n" +" --realtime[=BOOL] Versuche, Echtzeit-Scheduling zu " +"aktivieren\n" +" (Nur verfügbar als root, wenn SUID " +"oder\n" +" mit erhöhtem RLIMIT_RTPRIO)\n" +" --disallow-module-loading[=BOOL] Verbiete (Ent-)laden durch Nutzer " +"angeforderter\n" +" Module nach dem Start\n" +" --disallow-exit[=BOOL] Verbiete Beenden auf Anfrage des " +"Nutzers\n" +" --exit-idle-time=SECS Beende Daemon, wenn für diese Zeit \n" +" untätig\n" +" --module-idle-time=SECS Entlade untätige Module nach dieser " +"Zeit\n" +" --scache-idle-time=SECS Entlade untätige automatisch " +"geladene \n" +" Samples nach dieser Zeit\n" +" --log-level[=STUFE] Grad der Ausführlichkeit angeben\n" +" -v Ausführliche Meldungen\n" +" --log-target={auto,syslog,stderr} Protokoll-Ziel angeben\n" +" -p, --dl-search-path=PFAD Suchpfad für dynamisch " +"freigegebene \n" +" Objekte (Plugins)\n" +" --resample-method=METHODE Nutze diese Resampling-Methode\n" +" (Siehe --dump-resample-methods für\n" +" mögliche Werte)\n" +" --use-pid-file[=BOOL] Eine PID-Datei erstellen\n" +" --no-cpu-limit[=BOOL] CPU-Lastbegrenzung auf " +"unterstützten\n" +" Systemen nicht installieren.\n" +" --disable-shm[=BOOL] Keine Unterstützung für Shared " +"Memory.\n" +"\n" +"STARTUP-SCRIPT:\n" +" -L, --load=\"MODUL-ARGUMENTE\" Plugin-Modul mit diesen Parametern \n" +" laden.\n" +" -F, --file=DATEINAMEN Dieses Skript ausführen\n" +" -C Nach Start auf laufendem TTY \n" +" eine Kommandozeile öffnen\n" +"\n" +" -n Standardskript nicht laden\n" + +#: ../src/daemon/cmdline.c:247 +msgid "--daemonize expects boolean argument" +msgstr "Option --daemonize erfordert bool'schen Wert" + +#: ../src/daemon/cmdline.c:254 +msgid "--fail expects boolean argument" +msgstr "Option --fail erfordert bool'schen Wert" + +#: ../src/daemon/cmdline.c:264 +msgid "" +"--log-level expects log level argument (either numeric in range 0..4 or one " +"of debug, info, notice, warn, error)." +msgstr "" +"--log-level erfordert Wert für Grad der Protokollierung (entweder numerisch " +"im Bereich 0..4 or einen dieser: debug, info, notice, warn, error)." + +#: ../src/daemon/cmdline.c:276 +msgid "--high-priority expects boolean argument" +msgstr "Option --high-priority erfordert bool'schen Wert" + +#: ../src/daemon/cmdline.c:283 +msgid "--realtime expects boolean argument" +msgstr "Option --realtime erfordert bool'schen Wert" + +#: ../src/daemon/cmdline.c:290 +msgid "--disallow-module-loading expects boolean argument" +msgstr "Option --disallow-module-loading erfordert bool'schen Wert" + +#: ../src/daemon/cmdline.c:297 +msgid "--disallow-exit expects boolean argument" +msgstr "--disallow-exit erfordert boolsches Argument" + +#: ../src/daemon/cmdline.c:304 +msgid "--use-pid-file expects boolean argument" +msgstr "Option --use-pid-file erfordert bool'schen Wert" + +#: ../src/daemon/cmdline.c:321 +msgid "Invalid log target: use either 'syslog', 'stderr' or 'auto'." +msgstr "" +"Ungültiges Log-Ziel: Benutzen Sie entweder 'syslog', 'stderr' oder 'auto'." + +#: ../src/daemon/cmdline.c:328 +msgid "--log-time expects boolean argument" +msgstr "--realtime erfordert boolsches Argument" + +#: ../src/daemon/cmdline.c:335 +msgid "--log-meta expects boolean argument" +msgstr "--log-meta erfordert boolschen Wert" + +#: ../src/daemon/cmdline.c:354 +#, c-format +msgid "Invalid resample method '%s'." +msgstr "Ungültige Resample-Methode '%s'." + +#: ../src/daemon/cmdline.c:361 +msgid "--system expects boolean argument" +msgstr "--System erwartet Boolean-Argument" + +#: ../src/daemon/cmdline.c:368 +msgid "--no-cpu-limit expects boolean argument" +msgstr "Option --no-cpu-limit erfordert bool'schen Wert" + +#: ../src/daemon/cmdline.c:375 +msgid "--disable-shm expects boolean argument" +msgstr "Option --disable-shm erfordert bool'schen Wert" + +#: ../src/daemon/dumpmodules.c:60 +#, c-format +msgid "Name: %s\n" +msgstr "Name: %s\n" + +#: ../src/daemon/dumpmodules.c:63 +#, c-format +msgid "No module information available\n" +msgstr "Keine Modul-Informationen verfügbar\n" + +#: ../src/daemon/dumpmodules.c:66 +#, c-format +msgid "Version: %s\n" +msgstr "Version: %s\n" + +#: ../src/daemon/dumpmodules.c:68 +#, c-format +msgid "Description: %s\n" +msgstr "Beschreibung: %s\n" + +#: ../src/daemon/dumpmodules.c:70 +#, c-format +msgid "Author: %s\n" +msgstr "Autor: %s\n" + +#: ../src/daemon/dumpmodules.c:72 +#, c-format +msgid "Usage: %s\n" +msgstr "Verwendung: %s\n" + +#: ../src/daemon/dumpmodules.c:73 +#, c-format +msgid "Load Once: %s\n" +msgstr "Lade einmalig: %s\n" + +#: ../src/daemon/dumpmodules.c:75 +#, fuzzy, c-format +msgid "DEPRECATION WARNING: %s\n" +msgstr "DEPRECATION WARNING: %s\n" + +#: ../src/daemon/dumpmodules.c:79 +#, c-format +msgid "Path: %s\n" +msgstr "Pfad: %s\n" + +#: ../src/daemon/daemon-conf.c:232 +#, c-format +msgid "[%s:%u] Invalid log target '%s'." +msgstr "[%s:%u] Ungültiges Log-Ziel '%s'." + +#: ../src/daemon/daemon-conf.c:248 +#, c-format +msgid "[%s:%u] Invalid log level '%s'." +msgstr "[%s:%u] Ungültige Log-Stufe '%s'." + +#: ../src/daemon/daemon-conf.c:264 +#, c-format +msgid "[%s:%u] Invalid resample method '%s'." +msgstr "[%s:%u] Ungültige Resample-Methode '%s'." + +#: ../src/daemon/daemon-conf.c:287 +#, c-format +msgid "[%s:%u] Invalid rlimit '%s'." +msgstr "[%s:%u] Ungültiges rlimit '%s'." + +#: ../src/daemon/daemon-conf.c:294 +#, c-format +msgid "[%s:%u] rlimit not supported on this platform." +msgstr "[%s:%u] rlimit auf dieser Plattform nicht unterstützt." + +#: ../src/daemon/daemon-conf.c:310 +#, c-format +msgid "[%s:%u] Invalid sample format '%s'." +msgstr "[%s:%u] Ungültiges Sample-Format '%s'." + +#: ../src/daemon/daemon-conf.c:328 +#, c-format +msgid "[%s:%u] Invalid sample rate '%s'." +msgstr "[%s:%u] Ungültige Sample-Rate '%s'." + +#: ../src/daemon/daemon-conf.c:352 +#, c-format +msgid "[%s:%u] Invalid sample channels '%s'." +msgstr "[%s:%u] Ungültige Sample-Kanäle '%s'." + +#: ../src/daemon/daemon-conf.c:370 +#, c-format +msgid "[%s:%u] Invalid channel map '%s'." +msgstr "[%s:%u] Ungültige Kanal-Zuordnung '%s'." + +#: ../src/daemon/daemon-conf.c:388 +#, c-format +msgid "[%s:%u] Invalid number of fragments '%s'." +msgstr "[%s:%u] Ungültige Anzahl von Fragmenten '%s'." + +#: ../src/daemon/daemon-conf.c:406 +#, c-format +msgid "[%s:%u] Invalid fragment size '%s'." +msgstr "[%s:%u] Ungültige Fragmentgröße '%s'." + +#: ../src/daemon/daemon-conf.c:424 +#, c-format +msgid "[%s:%u] Invalid nice level '%s'." +msgstr "[%s:%u] Ungültige Nice-Stufe '%s'." + +#: ../src/daemon/daemon-conf.c:546 +#, c-format +msgid "Failed to open configuration file: %s" +msgstr "Öffnen der Konfigurationsdatei fehlgeschlagen : %s" + +#: ../src/daemon/daemon-conf.c:562 +msgid "" +"The specified default channel map has a different number of channels than " +"the specified default number of channels." +msgstr "" +"Die angegebene Standard-Kanalzuordnung hat eine andere Anzahl von Kanälen " +"als die angegebene Standard-Kanal-Anzahl." + +#: ../src/daemon/daemon-conf.c:638 +#, c-format +msgid "### Read from configuration file: %s ###\n" +msgstr "### Lese von Konfigurationsdatei: %s ###\n" + +#: ../src/daemon/caps.c:62 +msgid "Cleaning up privileges." +msgstr "Root-Privilegien aufräumen." + +#: ../src/daemon/pulseaudio.desktop.in.h:1 +msgid "PulseAudio Sound System" +msgstr "PulseAudio Sound System" + +#: ../src/daemon/pulseaudio.desktop.in.h:2 +msgid "Start the PulseAudio Sound System" +msgstr "Das PulseAudio Sound System starten" + +#: ../src/pulse/channelmap.c:105 ../src/pulse/channelmap.c:757 +msgid "Mono" +msgstr "Mono" + +#: ../src/pulse/channelmap.c:107 +msgid "Front Center" +msgstr "Vorne Mitte" + +#: ../src/pulse/channelmap.c:108 +msgid "Front Left" +msgstr "Vorne Links" + +#: ../src/pulse/channelmap.c:109 +msgid "Front Right" +msgstr "Vorne Rechts" + +#: ../src/pulse/channelmap.c:111 +msgid "Rear Center" +msgstr "Hinten Mitte" + +#: ../src/pulse/channelmap.c:112 +msgid "Rear Left" +msgstr "Hinten Links" + +#: ../src/pulse/channelmap.c:113 +msgid "Rear Right" +msgstr "Hinten Rechts" + +#: ../src/pulse/channelmap.c:115 +msgid "Low Frequency Emmiter" +msgstr "Niedrigfrequenzemitter" + +#: ../src/pulse/channelmap.c:117 +msgid "Front Left-of-center" +msgstr "Vorne Links der Mitte" + +#: ../src/pulse/channelmap.c:118 +msgid "Front Right-of-center" +msgstr "Vorne Rechts der Mitte" + +#: ../src/pulse/channelmap.c:120 +msgid "Side Left" +msgstr "Seite Links" + +#: ../src/pulse/channelmap.c:121 +msgid "Side Right" +msgstr "Seite Rechts" + +#: ../src/pulse/channelmap.c:123 +msgid "Auxiliary 0" +msgstr "Zusatz 0" + +#: ../src/pulse/channelmap.c:124 +msgid "Auxiliary 1" +msgstr "Zusatz 1" + +#: ../src/pulse/channelmap.c:125 +msgid "Auxiliary 2" +msgstr "Zusatz 2" + +#: ../src/pulse/channelmap.c:126 +msgid "Auxiliary 3" +msgstr "Zusatz 3" + +#: ../src/pulse/channelmap.c:127 +msgid "Auxiliary 4" +msgstr "Zusatz 4" + +#: ../src/pulse/channelmap.c:128 +msgid "Auxiliary 5" +msgstr "Zusatz 5" + +#: ../src/pulse/channelmap.c:129 +msgid "Auxiliary 6" +msgstr "Zusatz 6" + +#: ../src/pulse/channelmap.c:130 +msgid "Auxiliary 7" +msgstr "Zusatz 7" + +#: ../src/pulse/channelmap.c:131 +msgid "Auxiliary 8" +msgstr "Zusatz 8" + +#: ../src/pulse/channelmap.c:132 +msgid "Auxiliary 9" +msgstr "Zusatz 9" + +#: ../src/pulse/channelmap.c:133 +msgid "Auxiliary 10" +msgstr "Zusatz 10" + +#: ../src/pulse/channelmap.c:134 +msgid "Auxiliary 11" +msgstr "Zusatz 11" + +#: ../src/pulse/channelmap.c:135 +msgid "Auxiliary 12" +msgstr "Zusatz 12" + +#: ../src/pulse/channelmap.c:136 +msgid "Auxiliary 13" +msgstr "Zusatz 13" + +#: ../src/pulse/channelmap.c:137 +msgid "Auxiliary 14" +msgstr "Zusatz 14" + +#: ../src/pulse/channelmap.c:138 +msgid "Auxiliary 15" +msgstr "Zusatz 15" + +#: ../src/pulse/channelmap.c:139 +msgid "Auxiliary 16" +msgstr "Zusatz 16" + +#: ../src/pulse/channelmap.c:140 +msgid "Auxiliary 17" +msgstr "Zusatz 17" + +#: ../src/pulse/channelmap.c:141 +msgid "Auxiliary 18" +msgstr "Zusatz 18" + +#: ../src/pulse/channelmap.c:142 +msgid "Auxiliary 19" +msgstr "Zusatz 19" + +#: ../src/pulse/channelmap.c:143 +msgid "Auxiliary 20" +msgstr "Zusatz 20" + +#: ../src/pulse/channelmap.c:144 +msgid "Auxiliary 21" +msgstr "Zusatz 21" + +#: ../src/pulse/channelmap.c:145 +msgid "Auxiliary 22" +msgstr "Zusatz 22" + +#: ../src/pulse/channelmap.c:146 +msgid "Auxiliary 23" +msgstr "Zusatz 23" + +#: ../src/pulse/channelmap.c:147 +msgid "Auxiliary 24" +msgstr "Zusatz 24" + +#: ../src/pulse/channelmap.c:148 +msgid "Auxiliary 25" +msgstr "Zusatz 25" + +#: ../src/pulse/channelmap.c:149 +msgid "Auxiliary 26" +msgstr "Zusatz 26" + +#: ../src/pulse/channelmap.c:150 +msgid "Auxiliary 27" +msgstr "Zusatz 26" + +#: ../src/pulse/channelmap.c:151 +msgid "Auxiliary 28" +msgstr "Zusatz 28" + +#: ../src/pulse/channelmap.c:152 +msgid "Auxiliary 29" +msgstr "Zusatz 29" + +#: ../src/pulse/channelmap.c:153 +msgid "Auxiliary 30" +msgstr "Zusatz 30" + +#: ../src/pulse/channelmap.c:154 +msgid "Auxiliary 31" +msgstr "Zusatz 31" + +#: ../src/pulse/channelmap.c:156 +msgid "Top Center" +msgstr "Oben Mitte" + +#: ../src/pulse/channelmap.c:158 +msgid "Top Front Center" +msgstr "Oben Vorne Mitte" + +#: ../src/pulse/channelmap.c:159 +msgid "Top Front Left" +msgstr "Oben Vorne Links" + +#: ../src/pulse/channelmap.c:160 +msgid "Top Front Right" +msgstr "Oben Vorne Rechts" + +#: ../src/pulse/channelmap.c:162 +msgid "Top Rear Center" +msgstr "Oben Hinten Mitte" + +#: ../src/pulse/channelmap.c:163 +msgid "Top Rear Left" +msgstr "Oben Hinten Links" + +#: ../src/pulse/channelmap.c:164 +msgid "Top Rear Right" +msgstr "Oben Hinten Rechts" + +#: ../src/pulse/channelmap.c:484 ../src/pulse/sample.c:170 +#: ../src/pulse/volume.c:295 ../src/pulse/volume.c:321 +#: ../src/pulse/volume.c:341 ../src/pulse/volume.c:371 +msgid "(invalid)" +msgstr "(ungültig)" + +#: ../src/pulse/channelmap.c:761 +msgid "Stereo" +msgstr "Stereo" + +#: ../src/pulse/channelmap.c:766 +msgid "Surround 4.0" +msgstr "Surround 4.0" + +#: ../src/pulse/channelmap.c:772 +msgid "Surround 4.1" +msgstr "Surround 4.1" + +#: ../src/pulse/channelmap.c:778 +msgid "Surround 5.0" +msgstr "Surround 5.0" + +#: ../src/pulse/channelmap.c:784 +msgid "Surround 5.1" +msgstr "Surround 5.1" + +#: ../src/pulse/channelmap.c:791 +msgid "Surround 7.1" +msgstr "Surround 7.1" + +#: ../src/pulse/error.c:43 +msgid "OK" +msgstr "OK" + +#: ../src/pulse/error.c:44 +msgid "Access denied" +msgstr "Zugriff abgelehnt" + +#: ../src/pulse/error.c:45 +msgid "Unknown command" +msgstr "Unbekannter Befehl" + +#: ../src/pulse/error.c:46 +msgid "Invalid argument" +msgstr "Ungültiges Argument" + +#: ../src/pulse/error.c:47 +msgid "Entity exists" +msgstr "Entität existiert bereits" + +#: ../src/pulse/error.c:48 +msgid "No such entity" +msgstr "Entität nicht vorhanden" + +#: ../src/pulse/error.c:49 +msgid "Connection refused" +msgstr "Verbindung verweigert" + +#: ../src/pulse/error.c:50 +msgid "Protocol error" +msgstr "Protokollfehler" + +#: ../src/pulse/error.c:51 +msgid "Timeout" +msgstr "Zeitüberschreitung" + +#: ../src/pulse/error.c:52 +msgid "No authorization key" +msgstr "Kein Authorisierungsschlüssel" + +#: ../src/pulse/error.c:53 +msgid "Internal error" +msgstr "Interner Fehler" + +#: ../src/pulse/error.c:54 +msgid "Connection terminated" +msgstr "Verbindung beendet" + +#: ../src/pulse/error.c:55 +msgid "Entity killed" +msgstr "Entität terminiert" + +#: ../src/pulse/error.c:56 +msgid "Invalid server" +msgstr "Ungültiger Server" + +#: ../src/pulse/error.c:57 +msgid "Module initalization failed" +msgstr "Modulinitialisierung fehlgeschlagen" + +#: ../src/pulse/error.c:58 +msgid "Bad state" +msgstr "Ungültiger Zustand" + +#: ../src/pulse/error.c:59 +msgid "No data" +msgstr "Keine Daten" + +#: ../src/pulse/error.c:60 +msgid "Incompatible protocol version" +msgstr "Inkompatible Protokollversion" + +#: ../src/pulse/error.c:61 +msgid "Too large" +msgstr "Zu groß" + +#: ../src/pulse/error.c:62 +msgid "Not supported" +msgstr "Nicht unterstützt" + +#: ../src/pulse/error.c:63 +msgid "Unknown error code" +msgstr "Unbekannter Fehlercode" + +#: ../src/pulse/error.c:64 +msgid "No such extension" +msgstr "Erweiterung nicht vorhanden" + +#: ../src/pulse/error.c:65 +msgid "Obsolete functionality" +msgstr "Veraltete Funktion" + +#: ../src/pulse/error.c:66 +msgid "Missing implementation" +msgstr "Fehlende Implementation" + +#: ../src/pulse/error.c:67 +msgid "Client forked" +msgstr "Client geteilt" + +#: ../src/pulse/error.c:68 +msgid "Input/Output error" +msgstr "Eingabe/Ausgabe-Fehler" + +#: ../src/pulse/error.c:69 +msgid "Device or resource busy" +msgstr "Gerät oder Ressource beschäftigt" + +#: ../src/pulse/sample.c:172 +#, c-format +msgid "%s %uch %uHz" +msgstr "%s %uch %uHz" + +#: ../src/pulse/sample.c:184 +#, c-format +msgid "%0.1f GiB" +msgstr "%0.1f GB" + +#: ../src/pulse/sample.c:186 +#, c-format +msgid "%0.1f MiB" +msgstr "%0.1f MB" + +#: ../src/pulse/sample.c:188 +#, c-format +msgid "%0.1f KiB" +msgstr "%0.1f KB" + +#: ../src/pulse/sample.c:190 +#, c-format +msgid "%u B" +msgstr "%u B" + +#: ../src/pulse/client-conf-x11.c:55 ../src/utils/pax11publish.c:100 +msgid "XOpenDisplay() failed" +msgstr "XOpenDisplay() fehlgeschlagen" + +#: ../src/pulse/client-conf-x11.c:93 +msgid "Failed to parse cookie data" +msgstr "Parsen der Cookie-Daten fehlgeschlagen" + +#: ../src/pulse/client-conf.c:111 +#, c-format +msgid "Failed to open configuration file '%s': %s" +msgstr "Konfigurationsdatei '%s' konnte nicht geöffnet werden: %s" + +#: ../src/pulse/context.c:550 +msgid "No cookie loaded. Attempting to connect without." +msgstr "Verbindungsversuch ohne Cookie, da keines geladen." + +#: ../src/pulse/context.c:693 +#, c-format +msgid "fork(): %s" +msgstr "fork(): %s" + +#: ../src/pulse/context.c:748 +#, c-format +msgid "waitpid(): %s" +msgstr "waitpid(): %s" + +#: ../src/pulse/context.c:1438 +#, c-format +msgid "Received message for unknown extension '%s'" +msgstr "Nachricht für unbekannte Erweiterung '%s' erhalten" + +#: ../src/utils/pacat.c:108 +#, c-format +msgid "Failed to drain stream: %s" +msgstr "Entleeren des Streams fehlgeschlagen: %s" + +#: ../src/utils/pacat.c:113 +msgid "Playback stream drained." +msgstr "Wiedergabe-Stream entleert." + +#: ../src/utils/pacat.c:123 +msgid "Draining connection to server." +msgstr "Verbindung zu Server entleert." + +#: ../src/utils/pacat.c:136 +#, c-format +msgid "pa_stream_drain(): %s" +msgstr "pa_stream_drain(): %s" + +#: ../src/utils/pacat.c:159 +#, c-format +msgid "pa_stream_write() failed: %s" +msgstr "pa_stream_write() fehlgeschlagen: %s" + +#: ../src/utils/pacat.c:197 +#, c-format +msgid "pa_stream_begin_write() failed: %s" +msgstr "pa_stream_write() fehlgeschlagen: %s" + +#: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267 +#, c-format +msgid "pa_stream_peek() failed: %s" +msgstr "pa_stream_peek() fehlgeschlagen: %s" + +#: ../src/utils/pacat.c:307 +msgid "Stream successfully created." +msgstr "Stream wurde erfolgreich erstellt." + +#: ../src/utils/pacat.c:310 +#, c-format +msgid "pa_stream_get_buffer_attr() failed: %s" +msgstr "pa_stream_get_buffer_attr() fehlgeschlagen: %s" + +#: ../src/utils/pacat.c:314 +#, c-format +msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u" +msgstr "Pufferdaten: maxlenght=%u, tlength=%u, prebuf=%u, minreq=%u" + +#: ../src/utils/pacat.c:317 +#, c-format +msgid "Buffer metrics: maxlength=%u, fragsize=%u" +msgstr "Pufferdaten: maxlength=%u, fragsize=%u" + +#: ../src/utils/pacat.c:321 +#, c-format +msgid "Using sample spec '%s', channel map '%s'." +msgstr "Benutze Sample-Angabe '%s', Kanalzuordnung '%s'." + +#: ../src/utils/pacat.c:325 +#, c-format +msgid "Connected to device %s (%u, %ssuspended)." +msgstr "Verbunden mit Gerät %s (%u, %sausgesetzt)." + +#: ../src/utils/pacat.c:335 +#, c-format +msgid "Stream error: %s" +msgstr "Stream-Fehler: %s" + +#: ../src/utils/pacat.c:345 +#, c-format +msgid "Stream device suspended.%s" +msgstr "Stream-Gerät ausgesetzt.%s" + +#: ../src/utils/pacat.c:347 +#, c-format +msgid "Stream device resumed.%s" +msgstr "Stream-Gerät reaktiviert.%s" + +#: ../src/utils/pacat.c:355 +#, c-format +msgid "Stream underrun.%s" +msgstr "Stream leergelaufen.%s" + +#: ../src/utils/pacat.c:362 +#, c-format +msgid "Stream overrun.%s" +msgstr "Stream überlaufen.%s " + +#: ../src/utils/pacat.c:369 +#, c-format +msgid "Stream started.%s" +msgstr "Stream gestartet: %s" + +#: ../src/utils/pacat.c:376 +#, c-format +msgid "Stream moved to device %s (%u, %ssuspended).%s" +msgstr "Stream an Gerät %s übergeben (%u, %sausgesetzt).%s" + +#: ../src/utils/pacat.c:376 +msgid "not " +msgstr "nicht " + +#: ../src/utils/pacat.c:383 +#, c-format +msgid "Stream buffer attributes changed.%s" +msgstr "Stream-Zwischenspeicher-Attribute geändert.%s" + +#: ../src/utils/pacat.c:415 +#, c-format +msgid "Connection established.%s" +msgstr "Verbindung hergestellt.%s" + +#: ../src/utils/pacat.c:418 +#, c-format +msgid "pa_stream_new() failed: %s" +msgstr "pa_stream_new() fehlgeschlagen: %s" + +#: ../src/utils/pacat.c:450 +#, c-format +msgid "pa_stream_connect_playback() failed: %s" +msgstr "pa_stream_connect_playback() fehlgeschlagen: %s" + +#: ../src/utils/pacat.c:456 +#, c-format +msgid "pa_stream_connect_record() failed: %s" +msgstr "pa_stream_connect_record() fehlgeschlagen: %s" + +#: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857 +#, c-format +msgid "Connection failure: %s" +msgstr "Verbindungsfehler: %s" + +#: ../src/utils/pacat.c:503 +msgid "Got EOF." +msgstr "EOF empfangen." + +#: ../src/utils/pacat.c:540 +#, c-format +msgid "write() failed: %s" +msgstr "write() fehlgeschlagen: %s" + +#: ../src/utils/pacat.c:561 +msgid "Got signal, exiting." +msgstr "Signal empfangen, beenden." + +#: ../src/utils/pacat.c:575 +#, c-format +msgid "Failed to get latency: %s" +msgstr "Erhalten der Latenz fehlgeschlagen: %s" + +#: ../src/utils/pacat.c:580 +#, c-format +msgid "Time: %0.3f sec; Latency: %0.0f usec." +msgstr "Zeit: %0.3f sec; Latenz: %0.0f usec." + +#: ../src/utils/pacat.c:599 +#, c-format +msgid "pa_stream_update_timing_info() failed: %s" +msgstr "pa_stream_update_timing_info() fehlgeschlagen: %s" + +#: ../src/utils/pacat.c:609 +#, fuzzy, c-format +msgid "" +"%s [options]\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -r, --record Create a connection for recording\n" +" -p, --playback Create a connection for playback\n" +"\n" +" -v, --verbose Enable verbose operations\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -d, --device=DEVICE The name of the sink/source to " +"connect to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" +" --stream-name=NAME How to call this stream on the " +"server\n" +" --volume=VOLUME Specify the initial (linear) volume " +"in range 0...65536\n" +" --rate=SAMPLERATE The sample rate in Hz (defaults to " +"44100)\n" +" --format=SAMPLEFORMAT The sample type, one of s16le, " +"s16be, u8, float32le,\n" +" float32be, ulaw, alaw, s32le, s32be, " +"s24le, s24be,\n" +" s24-32le, s24-32be (defaults to " +"s16ne)\n" +" --channels=CHANNELS The number of channels, 1 for mono, " +"2 for stereo\n" +" (defaults to 2)\n" +" --channel-map=CHANNELMAP Channel map to use instead of the " +"default\n" +" --fix-format Take the sample format from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-rate Take the sampling rate from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-channels Take the number of channels and the " +"channel map\n" +" from the sink the stream is being " +"connected to.\n" +" --no-remix Don't upmix or downmix channels.\n" +" --no-remap Map channels by index instead of " +"name.\n" +" --latency=BYTES Request the specified latency in " +"bytes.\n" +" --process-time=BYTES Request the specified process time " +"per request in bytes.\n" +" --property=PROPERTY=VALUE Set the specified property to the " +"specified value.\n" +" --raw Record/play raw PCM data.\n" +" --file-format=FFORMAT Record/play formatted PCM data.\n" +" --list-file-formats List available file formats.\n" +msgstr "" +"%s [options]\n" +"\n" +" -h, --help Diese Hilfe anzeigen\n" +" --version Version anzeigen\n" +"\n" +" -r, --record Aufnahme-Verbindung aufbauen\n" +" -p, --playback Wiedergabe-Verbindung aufbauen\n" +"\n" +" -v, --verbose Ausführliche Meldungen\n" +"\n" +" -s, --server=SERVER Name des zu verbindenden Servers\n" +" -d, --device=DEVICE Name zu verbindender Sink/Quelle\n" +" -n, --client-name=NAME Rufname des Clients auf dem Server\n" +" --stream-name=NAME Rufname des Streams auf dem Server\n" +" --volume=VOLUME Initiale (lineare) Lautstärke " +"zwischen 0...65536 angeben\n" +" --rate=SAMPLERATE Sample-Rate in Hz (Standard 44100)\n" +" --format=SAMPLEFORMAT Ein Sample-Format von s16le, s16be, " +"u8, float32le,\n" +" float32be, ulaw, alaw, s32le, s32be " +"(defaults to s16ne)\n" +" --channels=CHANNELS Anzahl Kanäle, 1 für mono, 2 für " +"stereo\n" +" (Standard ist 2)\n" +" --channel-map=CHANNELMAP Diese geänderte Kanalzuordnung " +"nutzen\n" +" --fix-format Sample-Format des mit Sink\n" +" verbundenen Streams nutzen.\n" +" --fix-rate Sample-Rate des mit Sink\n" +" verbundenen Streams nutzen.\n" +" --fix-channels Anzahl und Zuordnung der Kanäle\n" +" des mit Sink verbundenen\n" +" Streams nutzen.\n" +" --no-remix Kanäle nicht up-/down-mischen.\n" +" --no-remap Kanäle nach Index statt Name " +"zuordnen.\n" +" --latency=BYTES Diese Latenz verwenden.\n" +" --process-time=BYTES Diese Prozesszeit pro Anfrage " +"verwenden.\n" + +#: ../src/utils/pacat.c:731 +#, c-format +msgid "" +"pacat %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pacat %s\n" +"Kompiliert mit libpulse %s\n" +"Gelinkt mit libpulse %s\n" + +#: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953 +#, c-format +msgid "Invalid client name '%s'" +msgstr "Ungültiger Client-Name '%s'" + +#: ../src/utils/pacat.c:779 +#, c-format +msgid "Invalid stream name '%s'" +msgstr "Ungültiger Stream-Name '%s'" + +#: ../src/utils/pacat.c:816 +#, c-format +msgid "Invalid channel map '%s'" +msgstr "Ungültige Kanal-Zuweisung '%s'" + +#: ../src/utils/pacat.c:845 +#, c-format +msgid "Invalid latency specification '%s'" +msgstr "Ungültige Latenz-Angaben '%s'" + +#: ../src/utils/pacat.c:852 +#, c-format +msgid "Invalid process time specification '%s'" +msgstr "Ungültige Prozesszeit-Angaben '%s'" + +#: ../src/utils/pacat.c:864 +#, c-format +msgid "Invalid property '%s'" +msgstr "Ungültige Eigenschaft '%s'" + +#: ../src/utils/pacat.c:881 +#, c-format +msgid "Unknown file format %s." +msgstr "Unbekanntes Dateiformat %s." + +#: ../src/utils/pacat.c:900 +msgid "Invalid sample specification" +msgstr "Ungültige Sample-Angaben" + +#: ../src/utils/pacat.c:910 +#, c-format +msgid "open(): %s" +msgstr "open(): %s" + +#: ../src/utils/pacat.c:915 +#, c-format +msgid "dup2(): %s" +msgstr "dup2(): %s" + +#: ../src/utils/pacat.c:922 +msgid "Too many arguments." +msgstr "Zu viele Argumente." + +#: ../src/utils/pacat.c:933 +msgid "Failed to generate sample specification for file." +msgstr "Beziehen der Sample-Informationen für die Datei fehlgeschlagen." + +#: ../src/utils/pacat.c:953 +msgid "Failed to open audio file." +msgstr "Öffnen der Audio-Datei fehlgeschlagen." + +#: ../src/utils/pacat.c:959 +msgid "" +"Warning: specified sample specification will be overwritten with " +"specification from file." +msgstr "Warnung: Beziehen der Sample-Angabe aus Datei fehlgeschlagen." + +#: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997 +msgid "Failed to determine sample specification from file." +msgstr "Beziehen der Sample-Informationen der Datei fehlgeschlagen." + +#: ../src/utils/pacat.c:971 +msgid "Warning: Failed to determine channel map from file." +msgstr "Warnung: Bestimmung der Kanalzuordnung aus Datei fehlgeschlagen." + +#: ../src/utils/pacat.c:982 +msgid "Channel map doesn't match sample specification" +msgstr "Kanalzuordnung entspricht nicht Einstellungen des Samples" + +#: ../src/utils/pacat.c:993 +msgid "Warning: failed to write channel map to file." +msgstr "Warnung: Schreiben der Kanalzuordnung in Datei fehlgeschlagen." + +#: ../src/utils/pacat.c:1008 +#, c-format +msgid "" +"Opening a %s stream with sample specification '%s' and channel map '%s'." +msgstr "" +"Öffnen eines %s-Streams mit Sample-Angabe '%s' und Kanalzuordnung '%s'." + +#: ../src/utils/pacat.c:1009 +msgid "recording" +msgstr "aufnehmen" + +#: ../src/utils/pacat.c:1009 +msgid "playback" +msgstr "abspielen" + +#: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267 +msgid "pa_mainloop_new() failed." +msgstr "pa_mainloop_new() fehlgeschlagen" + +#: ../src/utils/pacat.c:1054 +msgid "io_new() failed." +msgstr "io_new() fehlgeschlagen." + +#: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279 +msgid "pa_context_new() failed." +msgstr "pa_context_new() fehlgeschlagen." + +#: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285 +#, c-format +msgid "pa_context_connect() failed: %s" +msgstr "pa_context_new() fehlgeschlagen: %s" + +#: ../src/utils/pacat.c:1075 +msgid "pa_context_rttime_new() failed." +msgstr "pa_context_new() fehlgeschlagen." + +#: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290 +msgid "pa_mainloop_run() failed." +msgstr "pa_mainloop_run() fehlgeschlagen." + +#: ../src/utils/pasuspender.c:81 +#, c-format +msgid "fork(): %s\n" +msgstr "fork(): %s\n" + +#: ../src/utils/pasuspender.c:92 +#, c-format +msgid "execvp(): %s\n" +msgstr "execvp(): %s\n" + +#: ../src/utils/pasuspender.c:109 +#, c-format +msgid "Failure to suspend: %s\n" +msgstr "Aussetzen fehlgeschlagen: %s\n" + +#: ../src/utils/pasuspender.c:124 +#, c-format +msgid "Failure to resume: %s\n" +msgstr "Resume fehlgeschlagen: %s\n" + +#: ../src/utils/pasuspender.c:147 +#, c-format +msgid "WARNING: Sound server is not local, not suspending.\n" +msgstr "WARNUNG: Sound-Server läuft nicht lokal, nicht ausgesetzt.\n" + +#: ../src/utils/pasuspender.c:159 +#, c-format +msgid "Connection failure: %s\n" +msgstr "Verbindungsfehler: %s\n" + +#: ../src/utils/pasuspender.c:176 +#, c-format +msgid "Got SIGINT, exiting.\n" +msgstr "SIGINT empfangen, beende.\n" + +#: ../src/utils/pasuspender.c:194 +#, c-format +msgid "WARNING: Child process terminated by signal %u\n" +msgstr "WARNUNG: Kind-Prozess durch Signal %u beendet\n" + +#: ../src/utils/pasuspender.c:212 +#, c-format +msgid "" +"%s [options] ... \n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +"\n" +msgstr "" +"%s [options] ... \n" +"\n" +" -h, --help Diese Hilfe zeigen\n" +" --version Zeige Version\n" +" -s, --server=SERVER Name des Zielservers\n" +"\n" + +#: ../src/utils/pasuspender.c:248 +#, c-format +msgid "" +"pasuspender %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pasuspender %s\n" +"kompiliert mit libpulse %s\n" +"Gelinkt mit libpulse %s\n" + +#: ../src/utils/pasuspender.c:277 +#, c-format +msgid "pa_mainloop_new() failed.\n" +msgstr "pa_mainloop_new() fehlgeschlagen.\n" + +#: ../src/utils/pasuspender.c:290 +#, c-format +msgid "pa_context_new() failed.\n" +msgstr "pa_context_new() fehlgeschlagen.\n" + +#: ../src/utils/pasuspender.c:298 +#, c-format +msgid "pa_mainloop_run() failed.\n" +msgstr "pa_mainloop_run() fehlgeschlagen.\n" + +#: ../src/utils/pactl.c:135 +#, c-format +msgid "Failed to get statistics: %s" +msgstr "Beziehen der Statistik fehlgeschlagen: %s" + +#: ../src/utils/pactl.c:141 +#, c-format +msgid "Currently in use: %u blocks containing %s bytes total.\n" +msgstr "Momentane Nutzung: %u Blöcke mit insgesamt %s Bytes.\n" + +#: ../src/utils/pactl.c:144 +#, c-format +msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n" +msgstr "Während gesamter Laufzeit: %u Blöcke mit insgesamt %s Bytes.\n" + +#: ../src/utils/pactl.c:147 +#, c-format +msgid "Sample cache size: %s\n" +msgstr "Sample-Pufferspeichergrösse: %s\n" + +#: ../src/utils/pactl.c:156 +#, c-format +msgid "Failed to get server information: %s" +msgstr "Beziehen der Server-Information fehlgeschlagen: %s" + +#: ../src/utils/pactl.c:164 +#, c-format +msgid "" +"User name: %s\n" +"Host Name: %s\n" +"Server Name: %s\n" +"Server Version: %s\n" +"Default Sample Specification: %s\n" +"Default Channel Map: %s\n" +"Default Sink: %s\n" +"Default Source: %s\n" +"Cookie: %08x\n" +msgstr "" +"Name des Nutzers: %s\n" +"Rechnername: %s\n" +"Name des Servers: %s\n" +"Version des Server: %s\n" +"Standard-Sample-Angabe: %s\n" +"Standard-Kanal-Zuordnung: %s\n" +"Standard-Ausgabe: %s\n" +"-Standard-Quelle: %s\n" +"Cookie: %08x\n" + +#: ../src/utils/pactl.c:205 +#, c-format +msgid "Failed to get sink information: %s" +msgstr "Erhalten der Sink-Informationen fehlgeschlagen: %s" + +#: ../src/utils/pactl.c:221 +#, c-format +msgid "" +"Sink #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor Source: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Senke #%u\n" +"\tStatus: %s\n" +"\tName: %s\n" +"\tBeschreibung: %s\n" +"\tTreiber: %s\n" +"\tSample-Angabe: %s\n" +"\tKanalzuordnung: %s\n" +"\tOwner-Modul: %u\n" +"\tStumm: %s\n" +"\tLautstärke: %s%s%s\n" +"\t Verteilung %0.2f\n" +"\tBasis-Lautstärke: %s%s%s\n" +"\tQuelle Monitor: %s\n" +"\tLatenz: %0.0f usec, eingestellt %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tEigenschaften:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360 +#, c-format +msgid "\tPorts:\n" +msgstr "\tProfile:\n" + +#: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366 +#, c-format +msgid "\tActive Port: %s\n" +msgstr "\tAktive Profile: %s\n" + +#: ../src/utils/pactl.c:297 +#, c-format +msgid "Failed to get source information: %s" +msgstr "Beziehen der Quellen-Informationen fehlgeschlagen: %s" + +#: ../src/utils/pactl.c:313 +#, c-format +msgid "" +"Source #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor of Sink: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Quelle #%u\n" +"\tStatus: %s\n" +"\tName: %s\n" +"\tBeschreibung: %s\n" +"\tTreiber: %s\n" +"\tSample-Angabe: %s\n" +"\tKanalzuordnung: %s\n" +"\tBesitzer-Modul: %u\n" +"\tStumm: %s\n" +"\tLautstärke: %s%s%s\n" +"\t Verteilung %0.2f\n" +"\tBasis-Lautstärke: %s%s%s\n" +"\tSenke-Monitor: %s\n" +"\tLatenz: %0.0f usec, eingestellt %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tEigenschaften:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:345 ../src/utils/pactl.c:401 ../src/utils/pactl.c:436 +#: ../src/utils/pactl.c:473 ../src/utils/pactl.c:532 ../src/utils/pactl.c:533 +#: ../src/utils/pactl.c:543 ../src/utils/pactl.c:587 ../src/utils/pactl.c:588 +#: ../src/utils/pactl.c:594 ../src/utils/pactl.c:637 ../src/utils/pactl.c:638 +#: ../src/utils/pactl.c:645 +msgid "n/a" +msgstr "k. A." + +#: ../src/utils/pactl.c:375 +#, c-format +msgid "Failed to get module information: %s" +msgstr "Beziehen der Modul-Information fehlgeschlagen: %s" + +#: ../src/utils/pactl.c:393 +#, c-format +msgid "" +"Module #%u\n" +"\tName: %s\n" +"\tArgument: %s\n" +"\tUsage counter: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Modul #%u\n" +"\tName: %s\n" +"\tArgument: %s\n" +"\tNutzungszähler: %s\n" +"\tEigenschaften:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:412 +#, c-format +msgid "Failed to get client information: %s" +msgstr "Beziehen der Client-Information fehlgeschlagen: %s" + +#: ../src/utils/pactl.c:430 +#, c-format +msgid "" +"Client #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Client #%u\n" +"\tTreiber: %s\n" +"\tOwner-Modul: %s\n" +"\tEigenschaften:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:447 +#, c-format +msgid "Failed to get card information: %s" +msgstr "Beziehen der Karten-Information fehlgeschlagen: %s" + +#: ../src/utils/pactl.c:465 +#, c-format +msgid "" +"Card #%u\n" +"\tName: %s\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Karte #%u\n" +"\tName: %s\n" +"\tTreiber: %s\n" +"\tOwner-Modul: %s\n" +"\tEigenschaften:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:479 +#, c-format +msgid "\tProfiles:\n" +msgstr "\tProfile:\n" + +#: ../src/utils/pactl.c:485 +#, c-format +msgid "\tActive Profile: %s\n" +msgstr "\tAktive Profile: %s\n" + +#: ../src/utils/pactl.c:496 +#, c-format +msgid "Failed to get sink input information: %s" +msgstr "Konnte Sink-Eingabe-Informationen nicht holen: %s" + +#: ../src/utils/pactl.c:515 +#, c-format +msgid "" +"Sink Input #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSink: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tMute: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSink Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Eingabe-Senke #%u\n" +"\tTreiber: %s\n" +"\tOwner-Modul: %s\n" +"\tClient: %s\n" +"\tSink: %u\n" +"\tSample-Angabe: %s\n" +"\tKanalzuordnung: %s\n" +"\tStumm: %s\n" +"\tLautstärke: %s\n" +"\t %s\n" +"\t Verteilung %0.2f\n" +"\tPufferlatenz: %0.0f usec\n" +"\tSink-Latenz: %0.0f usec\n" +"\tResample-Methode: %s\n" +"\tEigenschaften:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:554 +#, c-format +msgid "Failed to get source output information: %s" +msgstr "Konnte Informationen über Quell-Ausgabe nicht holen: %s" + +#: ../src/utils/pactl.c:574 +#, c-format +msgid "" +"Source Output #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSource: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSource Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Quell-Ausgabe #%u\n" +"\tTreiber: %s\n" +"\tOwner-Modul: %s\n" +"\tClient: %s\n" +"\tQuelle: %u\n" +"\tSample-Spezifizierung: %s\n" +"\tKanalzuordnung: %s\n" +"\tPufferlatenz: %0.0f usec\n" +"\tQuelllatenz: %0.0f usec\n" +"\tResample-Methode: %s\n" +"\tEigenschaften:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:605 +#, c-format +msgid "Failed to get sample information: %s" +msgstr "Beziehen der Sample-Informationen fehlgeschlagen: %s" + +#: ../src/utils/pactl.c:623 +#, c-format +msgid "" +"Sample #%u\n" +"\tName: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tDuration: %0.1fs\n" +"\tSize: %s\n" +"\tLazy: %s\n" +"\tFilename: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Sample #%u\n" +"\tName: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tLautstärke: %s\n" +"\t %s\n" +"\t Verteilung %0.2f\n" +"\tDauer: %0.1fs\n" +"\tGrösse: %s\n" +"\tLazy: %s\n" +"\tDateinamen: %s\n" +"\tEigenschaften:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663 +#, c-format +msgid "Failure: %s" +msgstr "Fehlgeschlagen: %s" + +#: ../src/utils/pactl.c:687 +#, c-format +msgid "Failed to upload sample: %s" +msgstr "Hochladen des Sample fehlgeschlagen: %s" + +#: ../src/utils/pactl.c:704 +msgid "Premature end of file" +msgstr "Dateiende ist zu früh aufgetreten" + +#: ../src/utils/pactl.c:863 +msgid "Got SIGINT, exiting." +msgstr "SIGINT empfangen, beenden." + +#: ../src/utils/pactl.c:869 +#, c-format +msgid "" +"%s [options] stat\n" +"%s [options] list\n" +"%s [options] exit\n" +"%s [options] upload-sample FILENAME [NAME]\n" +"%s [options] play-sample NAME [SINK]\n" +"%s [options] remove-sample NAME\n" +"%s [options] move-sink-input SINKINPUT SINK\n" +"%s [options] move-source-output SOURCEOUTPUT SOURCE\n" +"%s [options] load-module NAME [ARGS ...]\n" +"%s [options] unload-module MODULE\n" +"%s [options] suspend-sink SINK 1|0\n" +"%s [options] suspend-source SOURCE 1|0\n" +"%s [options] set-card-profile CARD PROFILE\n" +"%s [options] set-sink-port SINK PORT\n" +"%s [options] set-source-port SOURCE PORT\n" +"%s [options] set-sink-volume SINK VOLUME\n" +"%s [options] set-source-volume SOURCE VOLUME\n" +"%s [options] set-sink-input-volume SINKINPUT VOLUME\n" +"%s [options] set-sink-mute SINK 1|0\n" +"%s [options] set-source-mute SOURCE 1|0\n" +"%s [options] set-sink-input-mute SINKINPUT 1|0\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" +msgstr "" +"%s [options] stat\n" +"%s [options] list\n" +"%s [options] exit\n" +"%s [options] upload-sample FILENAME [NAME]\n" +"%s [options] play-sample NAME [SINK]\n" +"%s [options] remove-sample NAME\n" +"%s [options] move-sink-input SINKINPUT SINK\n" +"%s [options] move-source-output SOURCEOUTPUT SOURCE\n" +"%s [options] load-module NAME [ARGS ...]\n" +"%s [options] unload-module MODULE\n" +"%s [options] suspend-sink SINK 1|0\n" +"%s [options] suspend-source SOURCE 1|0\n" +"%s [options] set-card-profile CARD PROFILE\n" +"%s [options] set-sink-port SINK PORT\n" +"%s [options] set-source-port SOURCE PORT\n" +"%s [options] set-sink-volume SINK VOLUME\n" +"%s [options] set-source-volume SOURCE VOLUME\n" +"%s [options] set-sink-input-volume SINKINPUT VOLUME\n" +"%s [options] set-sink-mute SINK 1|0\n" +"%s [options] set-source-mute SOURCE 1|0\n" +"%s [options] set-sink-input-mute SINKINPUT 1|0\n" +"\n" +" -h, --help Diese Hilfe anzeigen\n" +" --version Version anzeigen\n" +"\n" +" -s, --server=SERVER Name des Zielservers\n" +" -n, --client-name=NAME Rufname des Clients auf dem Server\n" + +#: ../src/utils/pactl.c:933 +#, c-format +msgid "" +"pactl %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pactl %s\n" +"Kompiliert mit libpulse %s\n" +"Gelinkt mit libpulse %s\n" + +#: ../src/utils/pactl.c:979 +msgid "Please specify a sample file to load" +msgstr "Geben Sie eine zu öffnende Sample-Datei an" + +#: ../src/utils/pactl.c:992 +msgid "Failed to open sound file." +msgstr "Öffnen der Audio-Datei fehlgeschlagen." + +#: ../src/utils/pactl.c:1004 +msgid "Warning: Failed to determine sample specification from file." +msgstr "Warnung: Beziehen der Sample-Angabe aus Datei fehlgeschlagen." + +#: ../src/utils/pactl.c:1014 +msgid "You have to specify a sample name to play" +msgstr "Sie müssen eine abzuspielende Sample-Datei angeben" + +#: ../src/utils/pactl.c:1026 +msgid "You have to specify a sample name to remove" +msgstr "Sie müssen eine zu löschende Sample-Datei angeben" + +#: ../src/utils/pactl.c:1035 +msgid "You have to specify a sink input index and a sink" +msgstr "Sie müssen einen Sink-Eingabe-Indexwert und einen Sink angeben" + +#: ../src/utils/pactl.c:1045 +msgid "You have to specify a source output index and a source" +msgstr "" +"Sie müssen eine Indexwert für die Quell-Ausgabe und eine Quelle angeben" + +#: ../src/utils/pactl.c:1060 +msgid "You have to specify a module name and arguments." +msgstr "Sie müssen einen Modulnamen angeben und Argumente übergeben." + +#: ../src/utils/pactl.c:1080 +msgid "You have to specify a module index" +msgstr "Sie müssen einen Indexwert für ein Modul angeben" + +#: ../src/utils/pactl.c:1090 +msgid "" +"You may not specify more than one sink. You have to specify a boolean value." +msgstr "" +"Sie sollten nur eine Senke angeben. Sie müssen zumindest einen bool'schen " +"Wert übergeben." + +#: ../src/utils/pactl.c:1103 +msgid "" +"You may not specify more than one source. You have to specify a boolean " +"value." +msgstr "" +"Sie sollten nur eine Quelle angeben. Sie müssen zumindest einen bool'schen " +"Wert übergeben." + +#: ../src/utils/pactl.c:1115 +msgid "You have to specify a card name/index and a profile name" +msgstr "Sie müssen einen Karten-Name/Indexwert und einen Profilnamen angeben" + +#: ../src/utils/pactl.c:1126 +msgid "You have to specify a sink name/index and a port name" +msgstr "Sie müssen einen Senkennamen/-Indexwert und einen Portnamen angeben" + +#: ../src/utils/pactl.c:1137 +msgid "You have to specify a source name/index and a port name" +msgstr "Sie müssen einen Quellennamen/-Indexwert und einen Portnamen angeben" + +#: ../src/utils/pactl.c:1149 +msgid "You have to specify a sink name/index and a volume" +msgstr "Sie müssen einen Senkennamen/-Indexwert und einen Portnamen angeben" + +#: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171 +#: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209 +#: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248 +msgid "Invalid volume specification" +msgstr "Ungültige Sample-Angaben" + +#: ../src/utils/pactl.c:1166 +msgid "You have to specify a source name/index and a volume" +msgstr "Sie müssen einen Quellennamen/-Indexwert und einen Portnamen angeben" + +#: ../src/utils/pactl.c:1183 +msgid "You have to specify a sink input index and a volume" +msgstr "Sie müssen einen Sink-Eingabe-Indexwert und einen Sink angeben" + +#: ../src/utils/pactl.c:1188 +msgid "Invalid sink input index" +msgstr "Ungültiger Sink-Eingabe-Index" + +#: ../src/utils/pactl.c:1204 +msgid "You have to specify a sink name/index and a mute boolean" +msgstr "Sie müssen einen Senkennamen/-Indexwert und einen Portnamen angeben" + +#: ../src/utils/pactl.c:1221 +msgid "You have to specify a source name/index and a mute boolean" +msgstr "Sie müssen einen Quellennamen/-Indexwert und einen Portnamen angeben" + +#: ../src/utils/pactl.c:1238 +msgid "You have to specify a sink input index and a mute boolean" +msgstr "Sie müssen einen Sink-Eingabe-Indexwert und einen Sink angeben" + +#: ../src/utils/pactl.c:1243 +msgid "Invalid sink input index specification" +msgstr "Ungültige Sink-Eingabe-Index-Angaben" + +#: ../src/utils/pactl.c:1262 +msgid "No valid command specified." +msgstr "Kein gültiger Befehl angegeben." + +#: ../src/utils/pax11publish.c:61 +#, c-format +msgid "" +"%s [-D display] [-S server] [-O sink] [-I source] [-c file] [-d|-e|-i|-r]\n" +"\n" +" -d Show current PulseAudio data attached to X11 display (default)\n" +" -e Export local PulseAudio data to X11 display\n" +" -i Import PulseAudio data from X11 display to local environment " +"variables and cookie file.\n" +" -r Remove PulseAudio data from X11 display\n" +msgstr "" +"%s [-D display] [-S server] [-O sink] [-I source] [-c file] [-d|-e|-i|-r]\n" +"\n" +" -d Zeige aktuell mit X11-Anzeige verbundene PulseAudio-Daten (Standard)\n" +" -e Lokale PulseAudio-Daten an X11-Anzeige exportieren\n" +" -i PulseAudio-Daten von X11-Anzeige in lokale Umgebungsvariablen und " +"Cookie importieren.\n" +" -r PulseAudio-Daten von X11-Anzeige löschen\n" + +#: ../src/utils/pax11publish.c:94 +#, c-format +msgid "Failed to parse command line.\n" +msgstr "Parsen der Kommandozeile fehlgeschlagen.\n" + +#: ../src/utils/pax11publish.c:108 +#, c-format +msgid "Server: %s\n" +msgstr "Server: %s\n" + +#: ../src/utils/pax11publish.c:110 +#, c-format +msgid "Source: %s\n" +msgstr "Quelle: %s\n" + +#: ../src/utils/pax11publish.c:112 +#, c-format +msgid "Sink: %s\n" +msgstr "Sink: %s\n" + +#: ../src/utils/pax11publish.c:114 +#, c-format +msgid "Cookie: %s\n" +msgstr "Cookie: %s\n" + +#: ../src/utils/pax11publish.c:132 +#, c-format +msgid "Failed to parse cookie data\n" +msgstr "Paresen der Cookie-Daten fehlgeschlagen.\n" + +#: ../src/utils/pax11publish.c:137 +#, c-format +msgid "Failed to save cookie data\n" +msgstr "Speichern der Cookie-Daten fehlgeschlagen\n" + +#: ../src/utils/pax11publish.c:152 +#, c-format +msgid "Failed to load client configuration file.\n" +msgstr "Laden der Client-Konfigurationsdatei fehlgeschlagen.\n" + +#: ../src/utils/pax11publish.c:157 +#, c-format +msgid "Failed to read environment configuration data.\n" +msgstr "Lesen the Umgebungsdaten fehlgeschlagen.\n" + +#: ../src/utils/pax11publish.c:174 +#, c-format +msgid "Failed to get FQDN.\n" +msgstr "Beziehen des FQDN fehlgeschlagen.\n" + +#: ../src/utils/pax11publish.c:194 +#, c-format +msgid "Failed to load cookie data\n" +msgstr "Laden der Cookie-Daten fehlgeschlagen\n" + +#: ../src/utils/pax11publish.c:211 +#, c-format +msgid "Not yet implemented.\n" +msgstr "Noch nicht implementiert.\n" + +#: ../src/utils/pacmd.c:69 +msgid "No PulseAudio daemon running, or not running as session daemon." +msgstr "Es läuft kein PulseAudio-Dienst oder nicht als Sessiondienst." + +#: ../src/utils/pacmd.c:74 +#, c-format +msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s" +msgstr "socket(PF_UNIX, SOCK_STREAM, 0): %s" + +#: ../src/utils/pacmd.c:91 +#, c-format +msgid "connect(): %s" +msgstr "connect(): %s" + +#: ../src/utils/pacmd.c:99 +msgid "Failed to kill PulseAudio daemon." +msgstr "Terminieren des PulseAudio-Daemon fehlgeschlagen." + +#: ../src/utils/pacmd.c:107 +msgid "Daemon not responding." +msgstr "Daemon antwortet nicht." + +#: ../src/utils/pacmd.c:161 +#, c-format +msgid "poll(): %s" +msgstr "poll(): %s" + +#: ../src/utils/pacmd.c:171 ../src/utils/pacmd.c:188 +#, c-format +msgid "read(): %s" +msgstr "read(): %s" + +#: ../src/utils/pacmd.c:207 ../src/utils/pacmd.c:223 +#, c-format +msgid "write(): %s" +msgstr "write(): %s" + +#: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:219 +msgid "Cannot access autospawn lock." +msgstr "Fehler beim Zugriff auf Autostart -Sperre." + +#: ../src/modules/alsa/alsa-sink.c:530 ../src/modules/alsa/alsa-sink.c:689 +#, c-format +msgid "" +"ALSA woke us up to write new data to the device, but there was actually " +"nothing to write!\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers.\n" +"We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() " +"returned 0 or another value < min_avail." +msgstr "" + +#: ../src/modules/alsa/alsa-source.c:506 ../src/modules/alsa/alsa-source.c:656 +#, c-format +msgid "" +"ALSA woke us up to read new data from the device, but there was actually " +"nothing to read!\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers.\n" +"We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() " +"returned 0 or another value < min_avail." +msgstr "" + +#: ../src/modules/alsa/module-alsa-card.c:152 +#: ../src/modules/bluetooth/module-bluetooth-device.c:2228 +#: ../src/modules/alsa/alsa-mixer.c:2931 +msgid "Off" +msgstr "Aus" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2184 +msgid "High Fidelity Playback (A2DP)" +msgstr "High Fidelity-Wiedergabe (A2DP)" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2198 +msgid "High Fidelity Capture (A2DP)" +msgstr "High Fidelity-Aufnahme (A2DP)" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2213 +msgid "Telephony Duplex (HSP/HFP)" +msgstr "Telephony Duplex (HSP/HFP)" + +#: ../src/modules/reserve-wrap.c:151 +msgid "PulseAudio Sound Server" +msgstr "PulseAudio Sound Server" + +#: ../src/modules/module-rygel-media-server.c:569 +#: ../src/modules/module-rygel-media-server.c:583 +msgid "Output Devices" +msgstr "" + +#: ../src/modules/module-rygel-media-server.c:570 +#: ../src/modules/module-rygel-media-server.c:584 +#, fuzzy +msgid "Input Devices" +msgstr "Eingang %s" + +#: ../src/modules/module-rygel-media-server.c:774 +msgid "Audio on @HOSTNAME@" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1701 +#, fuzzy +msgid "Input" +msgstr "Eingang %s" + +#: ../src/modules/alsa/alsa-mixer.c:1702 +msgid "Docking Station Input" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1703 +msgid "Docking Station Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1704 +msgid "Line-In" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1705 +msgid "Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1706 +msgid "External Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1707 +#, fuzzy +msgid "Internal Microphone" +msgstr "Internes Audio" + +#: ../src/modules/alsa/alsa-mixer.c:1708 +msgid "Radio" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1709 +msgid "Video" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1710 +msgid "Automatic Gain Control" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1711 +msgid "No Automatic Gain Control" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1712 +msgid "Boost" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1713 +msgid "No Boost" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1714 +msgid "Amplifier" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1715 +msgid "No Amplifier" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1773 +#, fuzzy +msgid "Analog Input" +msgstr "Analog Mono" + +#: ../src/modules/alsa/alsa-mixer.c:1774 +#, fuzzy +msgid "Analog Microphone" +msgstr "Analog Mono" + +#: ../src/modules/alsa/alsa-mixer.c:1775 +#, fuzzy +msgid "Analog Line-In" +msgstr "Analog Mono" + +#: ../src/modules/alsa/alsa-mixer.c:1776 +#, fuzzy +msgid "Analog Radio" +msgstr "Analog Mono" + +#: ../src/modules/alsa/alsa-mixer.c:1777 +#, fuzzy +msgid "Analog Video" +msgstr "Analog Stereo" + +#: ../src/modules/alsa/alsa-mixer.c:1778 +#, fuzzy +msgid "Analog Output" +msgstr "Ausgang %s" + +#: ../src/modules/alsa/alsa-mixer.c:1779 +#, fuzzy +msgid "Analog Headphones" +msgstr "Analog Mono" + +#: ../src/modules/alsa/alsa-mixer.c:1780 +msgid "Analog Output (LFE)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1781 +#, fuzzy +msgid "Analog Mono Output" +msgstr "Analog Mono" + +#: ../src/modules/alsa/alsa-mixer.c:1981 +#, fuzzy, c-format +msgid "%s+%s" +msgstr "%s %s" + +#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404 +#, fuzzy, c-format +msgid "%s / %s" +msgstr "%s %s" + +#: ../src/modules/alsa/alsa-mixer.c:2790 +msgid "Analog Mono" +msgstr "Analog Mono" + +#: ../src/modules/alsa/alsa-mixer.c:2791 +msgid "Analog Stereo" +msgstr "Analog Stereo" + +#: ../src/modules/alsa/alsa-mixer.c:2792 +#, fuzzy +msgid "Analog Surround 2.1" +msgstr "Analog Surround 4.1" + +#: ../src/modules/alsa/alsa-mixer.c:2793 +#, fuzzy +msgid "Analog Surround 3.0" +msgstr "Analog Surround 4.0" + +#: ../src/modules/alsa/alsa-mixer.c:2794 +#, fuzzy +msgid "Analog Surround 3.1" +msgstr "Analog Surround 4.1" + +#: ../src/modules/alsa/alsa-mixer.c:2795 +msgid "Analog Surround 4.0" +msgstr "Analog Surround 4.0" + +#: ../src/modules/alsa/alsa-mixer.c:2796 +msgid "Analog Surround 4.1" +msgstr "Analog Surround 4.1" + +#: ../src/modules/alsa/alsa-mixer.c:2797 +msgid "Analog Surround 5.0" +msgstr "Analog Surround 5.0" + +#: ../src/modules/alsa/alsa-mixer.c:2798 +msgid "Analog Surround 5.1" +msgstr "Analog Surround 5.1" + +#: ../src/modules/alsa/alsa-mixer.c:2799 +#, fuzzy +msgid "Analog Surround 6.0" +msgstr "Analog Surround 4.0" + +#: ../src/modules/alsa/alsa-mixer.c:2800 +#, fuzzy +msgid "Analog Surround 6.1" +msgstr "Analog Surround 4.1" + +#: ../src/modules/alsa/alsa-mixer.c:2801 +#, fuzzy +msgid "Analog Surround 7.0" +msgstr "Analog Surround 4.0" + +#: ../src/modules/alsa/alsa-mixer.c:2802 +msgid "Analog Surround 7.1" +msgstr "Analog Surround 7.1" + +#: ../src/modules/alsa/alsa-mixer.c:2803 +msgid "Digital Stereo (IEC958)" +msgstr "Digital Stereo (IEC958)" + +#: ../src/modules/alsa/alsa-mixer.c:2804 +#, fuzzy +msgid "Digital Surround 4.0 (IEC958)" +msgstr "Digital Surround 4.0 (IEC958/AC3)" + +#: ../src/modules/alsa/alsa-mixer.c:2805 +msgid "Digital Surround 4.0 (IEC958/AC3)" +msgstr "Digital Surround 4.0 (IEC958/AC3)" + +#: ../src/modules/alsa/alsa-mixer.c:2806 +msgid "Digital Surround 5.1 (IEC958/AC3)" +msgstr "Digital Surround 5.1 (IEC958/AC3)" + +#: ../src/modules/alsa/alsa-mixer.c:2807 +msgid "Digital Stereo (HDMI)" +msgstr "Digital Stereo (HDMI)" + +#: ../src/modules/alsa/alsa-mixer.c:2928 +#, fuzzy +msgid "Analog Mono Duplex" +msgstr "Analog Mono" + +#: ../src/modules/alsa/alsa-mixer.c:2929 +#, fuzzy +msgid "Analog Stereo Duplex" +msgstr "Analog Stereo" + +#: ../src/modules/alsa/alsa-mixer.c:2930 +#, fuzzy +msgid "Digital Stereo Duplex (IEC958)" +msgstr "Digital Stereo (IEC958)" + +#~ msgid "Invalid client name '%s'\n" +#~ msgstr "Ungültiger Client-Name '%s'\n" + +#~ msgid "Failed to determine sample specification from file.\n" +#~ msgstr "Beziehen der Sample-Informationen der Datei fehlgeschlagen.\n" + +#~ msgid "select(): %s" +#~ msgstr "select(): %s" + +#~ msgid "Cannot connect to system bus: %s" +#~ msgstr "Kann nicht mit dem System-Bus verbinden: %s" + +#~ msgid "Cannot get caller from PID: %s" +#~ msgstr "Kann Caller von PID nicht beziehen: %s" + +#~ msgid "Cannot set UID on caller object." +#~ msgstr "Kann UID für Caller-Objekt nicht setzen." + +#~ msgid "Failed to get CK session." +#~ msgstr "Kann CK-Session nicht beziehen." + +#~ msgid "Cannot set UID on session object." +#~ msgstr "Kann UID für Session-Objekt nicht setzen." + +#~ msgid "Cannot allocate PolKitAction." +#~ msgstr "Konnte PolKitAction nicht zuordnen." + +#~ msgid "Cannot set action_id" +#~ msgstr "Kann action_id nicht setzen" + +#~ msgid "Cannot allocate PolKitContext." +#~ msgstr "Konnte PolKitContext nicht zuordnen." + +#~ msgid "Cannot initialize PolKitContext: %s" +#~ msgstr "Konnte PolKitContext nicht initialisieren: %s" + +#~ msgid "Could not determine whether caller is authorized: %s" +#~ msgstr "Autorisierung des Callers konnte nicht sichergestellt werden: %s" + +#~ msgid "Cannot obtain auth: %s" +#~ msgstr "Keine Authorisierung erhalten: %s" + +#~ msgid "PolicyKit responded with '%s'" +#~ msgstr "PolicyKit antwortete mit '%s'" + +#, fuzzy +#~ msgid "" +#~ "High-priority scheduling (negative Unix nice level) for the PulseAudio " +#~ "daemon" +#~ msgstr "" +#~ "Hochprioritäts-Terminierung () (negative Unix nice level) für den " +#~ "PulseAudio-Dienst" + +#~ msgid "Real-time scheduling for the PulseAudio daemon" +#~ msgstr "Echtzeit-Terminierung des PulseAudio-Daemon" + +#~ msgid "" +#~ "System policy prevents PulseAudio from acquiring high-priority scheduling." +#~ msgstr "" +#~ "System-Richtlinien verhindert PulseAudio beim Erlangen des high-priority " +#~ "scheduling." + +#~ msgid "" +#~ "System policy prevents PulseAudio from acquiring real-time scheduling." +#~ msgstr "" +#~ "System-Richtlinien verhindert PulseAudio beim Erlangen der Echtzeit-" +#~ "Terminierung." + +#~ msgid "read() failed: %s\n" +#~ msgstr "read() fehlgeschlagen: %s\n" + +#~ msgid "pa_context_connect() failed: %s\n" +#~ msgstr "pa_context_connect() fehlgeschlagen: %s\n" + +#~ msgid "We're in the group '%s', allowing high-priority scheduling." +#~ msgstr "" +#~ "Wir befinden uns in der Gruppe '%s', was Scheduling höchster Priorität " +#~ "ermöglicht." + +#~ msgid "We're in the group '%s', allowing real-time scheduling." +#~ msgstr "" +#~ "Wir befinden uns in der Gruppe '%s', was Echtzeit-Scheduling ermöglicht." + +#~ msgid "PolicyKit grants us acquire-high-priority privilege." +#~ msgstr "Richtlinien gewähren das Recht aquire-high-priority." + +#~ msgid "PolicyKit refuses acquire-high-priority privilege." +#~ msgstr "Richtlinien verweigern das Recht acquire-high-priority." + +#~ msgid "PolicyKit grants us acquire-real-time privilege." +#~ msgstr "Richtlinien gewähren das Recht aquire-real-time." + +#~ msgid "PolicyKit refuses acquire-real-time privilege." +#~ msgstr "Richtlinien verweigern das Recht acquire-real-time." + +#, fuzzy +#~ msgid "" +#~ "Called SUID root and real-time and/or high-priority scheduling was " +#~ "requested in the configuration. However, we lack the necessary " +#~ "privileges:\n" +#~ "We are not in group '%s', PolicyKit refuse to grant us the requested " +#~ "privileges and we have no increase RLIMIT_NICE/RLIMIT_RTPRIO resource " +#~ "limits.\n" +#~ "For enabling real-time/high-priority scheduling please acquire the " +#~ "appropriate PolicyKit privileges, or become a member of '%s', or increase " +#~ "the RLIMIT_NICE/RLIMIT_RTPRIO resource limits for this user." +#~ msgstr "" +#~ "' und PolicyKit verweigern diese Rechte. Verwerfe SUID wieder.\n" +#~ "Erlangen Sie die den Richtlinien entsprechenden Rechte, um Echtzeit-" +#~ "Scheduling zu aktivieren oder werden Sie Mitglied der Gruppe '" + +#~ msgid "" +#~ "High-priority scheduling enabled in configuration but not allowed by " +#~ "policy." +#~ msgstr "Scheduling höchster Priorität konfiguriert, jedoch nicht erlaubt." + +#~ msgid "Successfully increased RLIMIT_RTPRIO" +#~ msgstr "RLIMIT_RTPRIO erfolgreich erhöht" + +#~ msgid "RLIMIT_RTPRIO failed: %s" +#~ msgstr "RLIMIT_RTPRIO fehlgeschlagen: %s" + +#~ msgid "Giving up CAP_NICE" +#~ msgstr "Verwerfe CAP_NICE" + +#~ msgid "" +#~ "Real-time scheduling enabled in configuration but not allowed by policy." +#~ msgstr "Echtzeit-Scheduling konfiguriert, jedoch nicht erlaubt." + +#~ msgid "Limited capabilities successfully to CAP_SYS_NICE." +#~ msgstr "Fähigkeiten erfolgreich auf CAP_SYS_NICE reduziert." + +#~ msgid "time_new() failed.\n" +#~ msgstr "time_new() fehlgeschlagen.\n" + +#~ msgid "Output %s + Input %s" +#~ msgstr "Ausgabe %s + Eingabe %s" + +#~ msgid "Stream successfully created\n" +#~ msgstr "Stream erfolgreich erzeugt\n" + +#~ msgid "Stream errror: %s\n" +#~ msgstr "Stream-Fehler: %s\n" + +#~ msgid "Connection established.\n" +#~ msgstr "Verbindung hergestellt.\n" + +#~ msgid "" +#~ "%s [options] [FILE]\n" +#~ "\n" +#~ " -h, --help Show this help\n" +#~ " --version Show version\n" +#~ "\n" +#~ " -v, --verbose Enable verbose operation\n" +#~ "\n" +#~ " -s, --server=SERVER The name of the server to connect " +#~ "to\n" +#~ " -d, --device=DEVICE The name of the sink to connect " +#~ "to\n" +#~ " -n, --client-name=NAME How to call this client on the " +#~ "server\n" +#~ " --stream-name=NAME How to call this stream on the " +#~ "server\n" +#~ " --volume=VOLUME Specify the initial (linear) " +#~ "volume in range 0...65536\n" +#~ " --channel-map=CHANNELMAP Set the channel map to the use\n" +#~ msgstr "" +#~ "%s [options] [FILE]\n" +#~ "\n" +#~ " -h, --help Zeige diese Hilfe\n" +#~ " --version Zeige Version\n" +#~ "\n" +#~ " -v, --verbose Ausführliche Meldungen\n" +#~ "\n" +#~ " -s, --server=SERVER Name des Zielservers\n" +#~ " -d, --device=DEVICE Name des Ziel-Sink\n" +#~ " -n, --client-name=NAME Rufname des Clients auf dem " +#~ "Server\n" +#~ " --stream-name=NAME Rufname des Streams auf dem " +#~ "Server\n" +#~ " --volume=VOLUME Initiale (lineare) Lautstärke " +#~ "zwischen 0...65536\n" +#~ " --channel-map=CHANNELMAP Diese Kanalzuordnung nutzen\n" + +#~ msgid "" +#~ "paplay %s\n" +#~ "Compiled with libpulse %s\n" +#~ "Linked with libpulse %s\n" +#~ msgstr "" +#~ "paplay %s\n" +#~ "Kompliert mit libpulse %s\n" +#~ "Gelinkt mit libpulse %s\n" + +#~ msgid "Invalid channel map\n" +#~ msgstr "Ungültige Kanal-Zuweisung\n" + +#~ msgid "Failed to open file '%s'\n" +#~ msgstr "Öffnen der Datei '%s' fehlgeschlagen\n" + +#~ msgid "Channel map doesn't match file.\n" +#~ msgstr "Kanal-Zuweisung stimmt mit Datei nicht überein.\n" + +#~ msgid "Using sample spec '%s'\n" +#~ msgstr "Sampling-Angabe '%s' wird benutzt\n" + +#, fuzzy +#~ msgid "" +#~ "Called SUID root and real-time and/or high-priority scheduling was " +#~ "requested in the configuration. However, we lack the necessary " +#~ "privileges:\n" +#~ "We are not in group '" +#~ msgstr "" +#~ "Konfiguration fordert Aufruf der SUID root und Echtzeit-Scheduling " +#~ "höchster Priorität. Allerdings fehlen die nötigen Rechte:\n" +#~ "Wir befinden uns nicht in der Gruppe '" + +#~ msgid "--log-time boolean argument" +#~ msgstr "--log-time erfordert bool'schen Wert" + +#~ msgid "" +#~ "', or increase the RLIMIT_NICE/RLIMIT_RTPRIO resource limits for this " +#~ "user." +#~ msgstr "" +#~ "' oder erhöhen sie die RLIMIT_NICE/RLIMIT_RTPRIO-Ressourcenbegrenzungen " +#~ "für diesen Nutzer." + +#~ msgid "Default sink name (%s) does not exist in name register." +#~ msgstr "Vorgabename für Sink (%s) existiert nicht im Namensregister." + +#~ msgid "Buffer overrun, dropping incoming data\n" +#~ msgstr "Pufferüberlauf, verwerfe eingehende Daten\n" + +#~ msgid "pa_stream_drop() failed: %s\n" +#~ msgstr "pa_stream_drop() fehlgeschlagen: %s\n" + +#~ msgid "muted" +#~ msgstr "stumm" + +#~ msgid "" +#~ "*** Autoload Entry #%u ***\n" +#~ "Name: %s\n" +#~ "Type: %s\n" +#~ "Module: %s\n" +#~ "Argument: %s\n" +#~ msgstr "" +#~ "*** Autoload-Eintrag #%u ***\n" +#~ "Name: %s\n" +#~ "Typ: %s\n" +#~ "Modul: %s\n" +#~ "Argument: %s\n" + +#~ msgid "sink" +#~ msgstr "Sink" + +#~ msgid "source" +#~ msgstr "Quelle" + +#~ msgid "socketpair(): %s" +#~ msgstr "socketpair(): %s" diff --git a/po/el.po b/po/el.po new file mode 100644 index 0000000..d9b2a4d --- /dev/null +++ b/po/el.po @@ -0,0 +1,2207 @@ +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Dimitris Glezos , 2008. +# Thalia Papoutsaki , 2009. +msgid "" +msgstr "" +"Project-Id-Version: el\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-10-26 09:45+0000\n" +"PO-Revision-Date: 2009-10-26 17:15+0200\n" +"Last-Translator: Thalia Papoutsaki \n" +"Language-Team: Greek \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KAider 0.1\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: ../src/modules/alsa/alsa-util.c:858 +#: ../src/pulsecore/sink.c:2629 +#, c-format +msgid "%s %s" +msgstr "%s %s" + +#: ../src/modules/alsa/alsa-util.c:1106 +#, c-format +msgid "" +"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers." +msgstr "" + +#: ../src/modules/alsa/alsa-util.c:1147 +#, c-format +msgid "" +"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%lu ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers." +msgstr "" + +#: ../src/modules/alsa/alsa-util.c:1194 +#, c-format +msgid "" +"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes (%lu ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers." +msgstr "" + +#: ../src/modules/module-always-sink.c:39 +msgid "Always keeps at least one sink loaded even if it's a null one" +msgstr "" + +#: ../src/modules/module-always-sink.c:83 +msgid "Dummy Output" +msgstr "" + +#: ../src/modules/module-ladspa-sink.c:49 +msgid "Virtual LADSPA sink" +msgstr "" + +#: ../src/modules/module-ladspa-sink.c:53 +msgid "sink_name= sink_properties= master= format= rate= channels= channel_map= plugin= label= control=" +msgstr "" + +#: ../src/modules/module-null-sink.c:55 +msgid "Clocked NULL sink" +msgstr "" + +#: ../src/modules/module-null-sink.c:291 +msgid "Null Output" +msgstr "" + +#: ../src/pulsecore/sink.c:2613 +msgid "Internal Audio" +msgstr "" + +#: ../src/pulsecore/sink.c:2618 +msgid "Modem" +msgstr "Modem" + +#: ../src/daemon/ltdl-bind-now.c:124 +msgid "Failed to find original lt_dlopen loader." +msgstr "" + +#: ../src/daemon/ltdl-bind-now.c:129 +msgid "Failed to allocate new dl loader." +msgstr "" + +#: ../src/daemon/ltdl-bind-now.c:142 +msgid "Failed to add bind-now-loader." +msgstr "" + +#: ../src/daemon/main.c:141 +#, c-format +msgid "Got signal %s." +msgstr "" + +#: ../src/daemon/main.c:168 +msgid "Exiting." +msgstr "Έξοδος." + +#: ../src/daemon/main.c:186 +#, c-format +msgid "Failed to find user '%s'." +msgstr "Αποτυχία εύρεσης χρήστη '%s'." + +#: ../src/daemon/main.c:191 +#, c-format +msgid "Failed to find group '%s'." +msgstr "Αποτυχία εύρεσης ομάδας χρηστών '%s'." + +#: ../src/daemon/main.c:195 +#, c-format +msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)." +msgstr "" + +#: ../src/daemon/main.c:200 +#, c-format +msgid "GID of user '%s' and of group '%s' don't match." +msgstr "" + +#: ../src/daemon/main.c:205 +#, c-format +msgid "Home directory of user '%s' is not '%s', ignoring." +msgstr "" + +#: ../src/daemon/main.c:208 +#: ../src/daemon/main.c:213 +#, c-format +msgid "Failed to create '%s': %s" +msgstr "" + +#: ../src/daemon/main.c:220 +#, c-format +msgid "Failed to change group list: %s" +msgstr "" + +#: ../src/daemon/main.c:236 +#, c-format +msgid "Failed to change GID: %s" +msgstr "" + +#: ../src/daemon/main.c:252 +#, c-format +msgid "Failed to change UID: %s" +msgstr "" + +#: ../src/daemon/main.c:271 +msgid "Successfully dropped root privileges." +msgstr "" + +#: ../src/daemon/main.c:279 +msgid "System wide mode unsupported on this platform." +msgstr "" + +#: ../src/daemon/main.c:297 +#, c-format +msgid "setrlimit(%s, (%u, %u)) failed: %s" +msgstr "" + +#: ../src/daemon/main.c:474 +msgid "Failed to parse command line." +msgstr "" + +#: ../src/daemon/main.c:541 +msgid "Daemon not running" +msgstr "" + +#: ../src/daemon/main.c:543 +#, c-format +msgid "Daemon running as PID %u" +msgstr "" + +#: ../src/daemon/main.c:553 +#, c-format +msgid "Failed to kill daemon: %s" +msgstr "" + +#: ../src/daemon/main.c:571 +msgid "This program is not intended to be run as root (unless --system is specified)." +msgstr "" + +#: ../src/daemon/main.c:573 +msgid "Root privileges required." +msgstr "" + +#: ../src/daemon/main.c:578 +msgid "--start not supported for system instances." +msgstr "" + +#: ../src/daemon/main.c:583 +msgid "Running in system mode, but --disallow-exit not set!" +msgstr "" + +#: ../src/daemon/main.c:586 +msgid "Running in system mode, but --disallow-module-loading not set!" +msgstr "" + +#: ../src/daemon/main.c:589 +msgid "Running in system mode, forcibly disabling SHM mode!" +msgstr "" + +#: ../src/daemon/main.c:594 +msgid "Running in system mode, forcibly disabling exit idle time!" +msgstr "" + +#: ../src/daemon/main.c:621 +msgid "Failed to acquire stdio." +msgstr "" + +#: ../src/daemon/main.c:627 +#, c-format +msgid "pipe failed: %s" +msgstr "" + +#: ../src/daemon/main.c:632 +#, c-format +msgid "fork() failed: %s" +msgstr "" + +#: ../src/daemon/main.c:646 +#: ../src/utils/pacat.c:508 +#, c-format +msgid "read() failed: %s" +msgstr "" + +#: ../src/daemon/main.c:652 +msgid "Daemon startup failed." +msgstr "" + +#: ../src/daemon/main.c:654 +msgid "Daemon startup successful." +msgstr "" + +#: ../src/daemon/main.c:731 +#, c-format +msgid "This is PulseAudio %s" +msgstr "Αυτό είναι το PulseAudio %s" + +#: ../src/daemon/main.c:732 +#, c-format +msgid "Compilation host: %s" +msgstr "" + +#: ../src/daemon/main.c:733 +#, c-format +msgid "Compilation CFLAGS: %s" +msgstr "" + +#: ../src/daemon/main.c:736 +#, c-format +msgid "Running on host: %s" +msgstr "" + +#: ../src/daemon/main.c:739 +#, c-format +msgid "Found %u CPUs." +msgstr "" + +#: ../src/daemon/main.c:741 +#, c-format +msgid "Page size is %lu bytes" +msgstr "" + +#: ../src/daemon/main.c:744 +msgid "Compiled with Valgrind support: yes" +msgstr "" + +#: ../src/daemon/main.c:746 +msgid "Compiled with Valgrind support: no" +msgstr "" + +#: ../src/daemon/main.c:749 +#, c-format +msgid "Running in valgrind mode: %s" +msgstr "" + +#: ../src/daemon/main.c:752 +msgid "Optimized build: yes" +msgstr "" + +#: ../src/daemon/main.c:754 +msgid "Optimized build: no" +msgstr "" + +#: ../src/daemon/main.c:758 +msgid "NDEBUG defined, all asserts disabled." +msgstr "" + +#: ../src/daemon/main.c:760 +msgid "FASTPATH defined, only fast path asserts disabled." +msgstr "" + +#: ../src/daemon/main.c:762 +msgid "All asserts enabled." +msgstr "" + +#: ../src/daemon/main.c:766 +msgid "Failed to get machine ID" +msgstr "" + +#: ../src/daemon/main.c:769 +#, c-format +msgid "Machine ID is %s." +msgstr "" + +#: ../src/daemon/main.c:773 +#, c-format +msgid "Session ID is %s." +msgstr "" + +#: ../src/daemon/main.c:779 +#, c-format +msgid "Using runtime directory %s." +msgstr "" + +#: ../src/daemon/main.c:784 +#, c-format +msgid "Using state directory %s." +msgstr "" + +#: ../src/daemon/main.c:787 +#, c-format +msgid "Using modules directory %s." +msgstr "" + +#: ../src/daemon/main.c:789 +#, c-format +msgid "Running in system mode: %s" +msgstr "" + +#: ../src/daemon/main.c:792 +msgid "" +"OK, so you are running PA in system mode. Please note that you most likely shouldn't be doing that.\n" +"If you do it nonetheless then it's your own fault if things don't work as expected.\n" +"Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an explanation why system mode is usually a bad idea." +msgstr "" + +#: ../src/daemon/main.c:809 +msgid "pa_pid_file_create() failed." +msgstr "" + +#: ../src/daemon/main.c:819 +msgid "Fresh high-resolution timers available! Bon appetit!" +msgstr "" + +#: ../src/daemon/main.c:821 +msgid "Dude, your kernel stinks! The chef's recommendation today is Linux with high-resolution timers enabled!" +msgstr "Δικέ μου, ο πυρήνας σου είναι για τα μπάζα! Η πρόταση του σεφ σήμερα είναι Linux με ενεργοποιημένα τα high-resolution timers!" + +#: ../src/daemon/main.c:844 +msgid "pa_core_new() failed." +msgstr "" + +#: ../src/daemon/main.c:904 +msgid "Failed to initialize daemon." +msgstr "" + +#: ../src/daemon/main.c:909 +msgid "Daemon startup without any loaded modules, refusing to work." +msgstr "" + +#: ../src/daemon/main.c:926 +msgid "Daemon startup complete." +msgstr "" + +#: ../src/daemon/main.c:932 +msgid "Daemon shutdown initiated." +msgstr "" + +#: ../src/daemon/main.c:954 +msgid "Daemon terminated." +msgstr "" + +#: ../src/daemon/cmdline.c:115 +#, c-format +msgid "" +"%s [options]\n" +"\n" +"COMMANDS:\n" +" -h, --help Show this help\n" +" --version Show version\n" +" --dump-conf Dump default configuration\n" +" --dump-modules Dump list of available modules\n" +" --dump-resample-methods Dump available resample methods\n" +" --cleanup-shm Cleanup stale shared memory segments\n" +" --start Start the daemon if it is not running\n" +" -k --kill Kill a running daemon\n" +" --check Check for a running daemon (only returns exit code)\n" +"\n" +"OPTIONS:\n" +" --system[=BOOL] Run as system-wide instance\n" +" -D, --daemonize[=BOOL] Daemonize after startup\n" +" --fail[=BOOL] Quit when startup fails\n" +" --high-priority[=BOOL] Try to set high nice level\n" +" (only available as root, when SUID or\n" +" with elevated RLIMIT_NICE)\n" +" --realtime[=BOOL] Try to enable realtime scheduling\n" +" (only available as root, when SUID or\n" +" with elevated RLIMIT_RTPRIO)\n" +" --disallow-module-loading[=BOOL] Disallow module user requested module\n" +" loading/unloading after startup\n" +" --disallow-exit[=BOOL] Disallow user requested exit\n" +" --exit-idle-time=SECS Terminate the daemon when idle and this\n" +" time passed\n" +" --module-idle-time=SECS Unload autoloaded modules when idle and\n" +" this time passed\n" +" --scache-idle-time=SECS Unload autoloaded samples when idle and\n" +" this time passed\n" +" --log-level[=LEVEL] Increase or set verbosity level\n" +" -v Increase the verbosity level\n" +" --log-target={auto,syslog,stderr} Specify the log target\n" +" --log-meta[=BOOL] Include code location in log messages\n" +" --log-time[=BOOL] Include timestamps in log messages\n" +" --log-backtrace=FRAMES Include a backtrace in log messages\n" +" -p, --dl-search-path=PATH Set the search path for dynamic shared\n" +" objects (plugins)\n" +" --resample-method=METHOD Use the specified resampling method\n" +" (See --dump-resample-methods for\n" +" possible values)\n" +" --use-pid-file[=BOOL] Create a PID file\n" +" --no-cpu-limit[=BOOL] Do not install CPU load limiter on\n" +" platforms that support it.\n" +" --disable-shm[=BOOL] Disable shared memory support.\n" +"\n" +"STARTUP SCRIPT:\n" +" -L, --load=\"MODULE ARGUMENTS\" Load the specified plugin module with\n" +" the specified argument\n" +" -F, --file=FILENAME Run the specified script\n" +" -C Open a command line on the running TTY\n" +" after startup\n" +"\n" +" -n Don't load default script file\n" +msgstr "" + +#: ../src/daemon/cmdline.c:247 +msgid "--daemonize expects boolean argument" +msgstr "" + +#: ../src/daemon/cmdline.c:254 +msgid "--fail expects boolean argument" +msgstr "" + +#: ../src/daemon/cmdline.c:264 +msgid "--log-level expects log level argument (either numeric in range 0..4 or one of debug, info, notice, warn, error)." +msgstr "" + +#: ../src/daemon/cmdline.c:276 +msgid "--high-priority expects boolean argument" +msgstr "" + +#: ../src/daemon/cmdline.c:283 +msgid "--realtime expects boolean argument" +msgstr "" + +#: ../src/daemon/cmdline.c:290 +msgid "--disallow-module-loading expects boolean argument" +msgstr "" + +#: ../src/daemon/cmdline.c:297 +msgid "--disallow-exit expects boolean argument" +msgstr "" + +#: ../src/daemon/cmdline.c:304 +msgid "--use-pid-file expects boolean argument" +msgstr "" + +#: ../src/daemon/cmdline.c:321 +msgid "Invalid log target: use either 'syslog', 'stderr' or 'auto'." +msgstr "" + +#: ../src/daemon/cmdline.c:328 +msgid "--log-time expects boolean argument" +msgstr "" + +#: ../src/daemon/cmdline.c:335 +msgid "--log-meta expects boolean argument" +msgstr "" + +#: ../src/daemon/cmdline.c:354 +#, c-format +msgid "Invalid resample method '%s'." +msgstr "" + +#: ../src/daemon/cmdline.c:361 +msgid "--system expects boolean argument" +msgstr "" + +#: ../src/daemon/cmdline.c:368 +msgid "--no-cpu-limit expects boolean argument" +msgstr "" + +#: ../src/daemon/cmdline.c:375 +msgid "--disable-shm expects boolean argument" +msgstr "" + +#: ../src/daemon/dumpmodules.c:60 +#, c-format +msgid "Name: %s\n" +msgstr "Όνομα: %s\n" + +#: ../src/daemon/dumpmodules.c:63 +#, c-format +msgid "No module information available\n" +msgstr "" + +#: ../src/daemon/dumpmodules.c:66 +#, c-format +msgid "Version: %s\n" +msgstr "Έκδοση: %s\n" + +#: ../src/daemon/dumpmodules.c:68 +#, c-format +msgid "Description: %s\n" +msgstr "Περιγραφή: %s\n" + +#: ../src/daemon/dumpmodules.c:70 +#, c-format +msgid "Author: %s\n" +msgstr "Συγγραφέας: %s\n" + +#: ../src/daemon/dumpmodules.c:72 +#, c-format +msgid "Usage: %s\n" +msgstr "Χρήση: %s\n" + +#: ../src/daemon/dumpmodules.c:73 +#, c-format +msgid "Load Once: %s\n" +msgstr "" + +#: ../src/daemon/dumpmodules.c:75 +#, c-format +msgid "DEPRECATION WARNING: %s\n" +msgstr "" + +#: ../src/daemon/dumpmodules.c:79 +#, c-format +msgid "Path: %s\n" +msgstr "" + +#: ../src/daemon/daemon-conf.c:232 +#, c-format +msgid "[%s:%u] Invalid log target '%s'." +msgstr "" + +#: ../src/daemon/daemon-conf.c:248 +#, c-format +msgid "[%s:%u] Invalid log level '%s'." +msgstr "" + +#: ../src/daemon/daemon-conf.c:264 +#, c-format +msgid "[%s:%u] Invalid resample method '%s'." +msgstr "" + +#: ../src/daemon/daemon-conf.c:287 +#, c-format +msgid "[%s:%u] Invalid rlimit '%s'." +msgstr "" + +#: ../src/daemon/daemon-conf.c:294 +#, c-format +msgid "[%s:%u] rlimit not supported on this platform." +msgstr "" + +#: ../src/daemon/daemon-conf.c:310 +#, c-format +msgid "[%s:%u] Invalid sample format '%s'." +msgstr "" + +#: ../src/daemon/daemon-conf.c:328 +#, c-format +msgid "[%s:%u] Invalid sample rate '%s'." +msgstr "" + +#: ../src/daemon/daemon-conf.c:352 +#, c-format +msgid "[%s:%u] Invalid sample channels '%s'." +msgstr "" + +#: ../src/daemon/daemon-conf.c:370 +#, c-format +msgid "[%s:%u] Invalid channel map '%s'." +msgstr "" + +#: ../src/daemon/daemon-conf.c:388 +#, c-format +msgid "[%s:%u] Invalid number of fragments '%s'." +msgstr "" + +#: ../src/daemon/daemon-conf.c:406 +#, c-format +msgid "[%s:%u] Invalid fragment size '%s'." +msgstr "" + +#: ../src/daemon/daemon-conf.c:424 +#, c-format +msgid "[%s:%u] Invalid nice level '%s'." +msgstr "" + +#: ../src/daemon/daemon-conf.c:546 +#, c-format +msgid "Failed to open configuration file: %s" +msgstr "" + +#: ../src/daemon/daemon-conf.c:562 +msgid "The specified default channel map has a different number of channels than the specified default number of channels." +msgstr "" + +#: ../src/daemon/daemon-conf.c:638 +#, c-format +msgid "### Read from configuration file: %s ###\n" +msgstr "" + +#: ../src/daemon/caps.c:62 +msgid "Cleaning up privileges." +msgstr "" + +#: ../src/daemon/pulseaudio.desktop.in.h:1 +msgid "PulseAudio Sound System" +msgstr "" + +#: ../src/daemon/pulseaudio.desktop.in.h:2 +msgid "Start the PulseAudio Sound System" +msgstr "" + +#: ../src/pulse/channelmap.c:105 +#: ../src/pulse/channelmap.c:757 +msgid "Mono" +msgstr "Mono" + +#: ../src/pulse/channelmap.c:107 +msgid "Front Center" +msgstr "" + +#: ../src/pulse/channelmap.c:108 +msgid "Front Left" +msgstr "" + +#: ../src/pulse/channelmap.c:109 +msgid "Front Right" +msgstr "" + +#: ../src/pulse/channelmap.c:111 +msgid "Rear Center" +msgstr "" + +#: ../src/pulse/channelmap.c:112 +msgid "Rear Left" +msgstr "" + +#: ../src/pulse/channelmap.c:113 +msgid "Rear Right" +msgstr "" + +#: ../src/pulse/channelmap.c:115 +msgid "Low Frequency Emmiter" +msgstr "" + +#: ../src/pulse/channelmap.c:117 +msgid "Front Left-of-center" +msgstr "" + +#: ../src/pulse/channelmap.c:118 +msgid "Front Right-of-center" +msgstr "" + +#: ../src/pulse/channelmap.c:120 +msgid "Side Left" +msgstr "" + +#: ../src/pulse/channelmap.c:121 +msgid "Side Right" +msgstr "" + +#: ../src/pulse/channelmap.c:123 +msgid "Auxiliary 0" +msgstr "Auxiliary 0" + +#: ../src/pulse/channelmap.c:124 +msgid "Auxiliary 1" +msgstr "Auxiliary 1" + +#: ../src/pulse/channelmap.c:125 +msgid "Auxiliary 2" +msgstr "Auxiliary 2" + +#: ../src/pulse/channelmap.c:126 +msgid "Auxiliary 3" +msgstr "Auxiliary 3" + +#: ../src/pulse/channelmap.c:127 +msgid "Auxiliary 4" +msgstr "Auxiliary 4" + +#: ../src/pulse/channelmap.c:128 +msgid "Auxiliary 5" +msgstr "Auxiliary 5" + +#: ../src/pulse/channelmap.c:129 +msgid "Auxiliary 6" +msgstr "Auxiliary 6" + +#: ../src/pulse/channelmap.c:130 +msgid "Auxiliary 7" +msgstr "Auxiliary 7" + +#: ../src/pulse/channelmap.c:131 +msgid "Auxiliary 8" +msgstr "Auxiliary 8" + +#: ../src/pulse/channelmap.c:132 +msgid "Auxiliary 9" +msgstr "Auxiliary 9" + +#: ../src/pulse/channelmap.c:133 +msgid "Auxiliary 10" +msgstr "Auxiliary 10" + +#: ../src/pulse/channelmap.c:134 +msgid "Auxiliary 11" +msgstr "Auxiliary 11" + +#: ../src/pulse/channelmap.c:135 +msgid "Auxiliary 12" +msgstr "Auxiliary 12" + +#: ../src/pulse/channelmap.c:136 +msgid "Auxiliary 13" +msgstr "Auxiliary 13" + +#: ../src/pulse/channelmap.c:137 +msgid "Auxiliary 14" +msgstr "Auxiliary 14" + +#: ../src/pulse/channelmap.c:138 +msgid "Auxiliary 15" +msgstr "Auxiliary 15" + +#: ../src/pulse/channelmap.c:139 +msgid "Auxiliary 16" +msgstr "Auxiliary 16" + +#: ../src/pulse/channelmap.c:140 +msgid "Auxiliary 17" +msgstr "Auxiliary 17" + +#: ../src/pulse/channelmap.c:141 +msgid "Auxiliary 18" +msgstr "Auxiliary 18" + +#: ../src/pulse/channelmap.c:142 +msgid "Auxiliary 19" +msgstr "Auxiliary 19" + +#: ../src/pulse/channelmap.c:143 +msgid "Auxiliary 20" +msgstr "Auxiliary 20" + +#: ../src/pulse/channelmap.c:144 +msgid "Auxiliary 21" +msgstr "Auxiliary 21" + +#: ../src/pulse/channelmap.c:145 +msgid "Auxiliary 22" +msgstr "Auxiliary 22" + +#: ../src/pulse/channelmap.c:146 +msgid "Auxiliary 23" +msgstr "Auxiliary 23" + +#: ../src/pulse/channelmap.c:147 +msgid "Auxiliary 24" +msgstr "Auxiliary 24" + +#: ../src/pulse/channelmap.c:148 +msgid "Auxiliary 25" +msgstr "Auxiliary 25" + +#: ../src/pulse/channelmap.c:149 +msgid "Auxiliary 26" +msgstr "Auxiliary 26" + +#: ../src/pulse/channelmap.c:150 +msgid "Auxiliary 27" +msgstr "Auxiliary 27" + +#: ../src/pulse/channelmap.c:151 +msgid "Auxiliary 28" +msgstr "Auxiliary 28" + +#: ../src/pulse/channelmap.c:152 +msgid "Auxiliary 29" +msgstr "Auxiliary 29" + +#: ../src/pulse/channelmap.c:153 +msgid "Auxiliary 30" +msgstr "Auxiliary 30" + +#: ../src/pulse/channelmap.c:154 +msgid "Auxiliary 31" +msgstr "Auxiliary 31" + +#: ../src/pulse/channelmap.c:156 +msgid "Top Center" +msgstr "" + +#: ../src/pulse/channelmap.c:158 +msgid "Top Front Center" +msgstr "" + +#: ../src/pulse/channelmap.c:159 +msgid "Top Front Left" +msgstr "" + +#: ../src/pulse/channelmap.c:160 +msgid "Top Front Right" +msgstr "" + +#: ../src/pulse/channelmap.c:162 +msgid "Top Rear Center" +msgstr "" + +#: ../src/pulse/channelmap.c:163 +msgid "Top Rear Left" +msgstr "" + +#: ../src/pulse/channelmap.c:164 +msgid "Top Rear Right" +msgstr "" + +#: ../src/pulse/channelmap.c:484 +#: ../src/pulse/sample.c:170 +#: ../src/pulse/volume.c:295 +#: ../src/pulse/volume.c:321 +#: ../src/pulse/volume.c:341 +#: ../src/pulse/volume.c:371 +msgid "(invalid)" +msgstr "(μη έγκυρο)" + +#: ../src/pulse/channelmap.c:761 +msgid "Stereo" +msgstr "Stereo" + +#: ../src/pulse/channelmap.c:766 +msgid "Surround 4.0" +msgstr "Surround 4.0" + +#: ../src/pulse/channelmap.c:772 +msgid "Surround 4.1" +msgstr "Surround 4.1" + +#: ../src/pulse/channelmap.c:778 +msgid "Surround 5.0" +msgstr "Surround 5.0" + +#: ../src/pulse/channelmap.c:784 +msgid "Surround 5.1" +msgstr "Surround 5.1" + +#: ../src/pulse/channelmap.c:791 +msgid "Surround 7.1" +msgstr "Surround 7.1" + +#: ../src/pulse/error.c:43 +msgid "OK" +msgstr "Εντάξει" + +#: ../src/pulse/error.c:44 +msgid "Access denied" +msgstr "" + +#: ../src/pulse/error.c:45 +msgid "Unknown command" +msgstr "" + +#: ../src/pulse/error.c:46 +msgid "Invalid argument" +msgstr "" + +#: ../src/pulse/error.c:47 +msgid "Entity exists" +msgstr "" + +#: ../src/pulse/error.c:48 +msgid "No such entity" +msgstr "" + +#: ../src/pulse/error.c:49 +msgid "Connection refused" +msgstr "" + +#: ../src/pulse/error.c:50 +msgid "Protocol error" +msgstr "" + +#: ../src/pulse/error.c:51 +msgid "Timeout" +msgstr "" + +#: ../src/pulse/error.c:52 +msgid "No authorization key" +msgstr "" + +#: ../src/pulse/error.c:53 +msgid "Internal error" +msgstr "" + +#: ../src/pulse/error.c:54 +msgid "Connection terminated" +msgstr "" + +#: ../src/pulse/error.c:55 +msgid "Entity killed" +msgstr "" + +#: ../src/pulse/error.c:56 +msgid "Invalid server" +msgstr "" + +#: ../src/pulse/error.c:57 +msgid "Module initalization failed" +msgstr "" + +#: ../src/pulse/error.c:58 +msgid "Bad state" +msgstr "" + +#: ../src/pulse/error.c:59 +msgid "No data" +msgstr "" + +#: ../src/pulse/error.c:60 +msgid "Incompatible protocol version" +msgstr "" + +#: ../src/pulse/error.c:61 +msgid "Too large" +msgstr "" + +#: ../src/pulse/error.c:62 +msgid "Not supported" +msgstr "" + +#: ../src/pulse/error.c:63 +msgid "Unknown error code" +msgstr "" + +#: ../src/pulse/error.c:64 +msgid "No such extension" +msgstr "" + +#: ../src/pulse/error.c:65 +msgid "Obsolete functionality" +msgstr "" + +#: ../src/pulse/error.c:66 +msgid "Missing implementation" +msgstr "" + +#: ../src/pulse/error.c:67 +msgid "Client forked" +msgstr "" + +#: ../src/pulse/error.c:68 +msgid "Input/Output error" +msgstr "" + +#: ../src/pulse/error.c:69 +msgid "Device or resource busy" +msgstr "" + +#: ../src/pulse/sample.c:172 +#, c-format +msgid "%s %uch %uHz" +msgstr "%s %uch %uHz" + +#: ../src/pulse/sample.c:184 +#, c-format +msgid "%0.1f GiB" +msgstr "%0.1f GiB" + +#: ../src/pulse/sample.c:186 +#, c-format +msgid "%0.1f MiB" +msgstr "%0.1f MiB" + +#: ../src/pulse/sample.c:188 +#, c-format +msgid "%0.1f KiB" +msgstr "%0.1f KiB" + +#: ../src/pulse/sample.c:190 +#, c-format +msgid "%u B" +msgstr "%u B" + +#: ../src/pulse/client-conf-x11.c:55 +#: ../src/utils/pax11publish.c:100 +msgid "XOpenDisplay() failed" +msgstr "" + +#: ../src/pulse/client-conf-x11.c:93 +msgid "Failed to parse cookie data" +msgstr "" + +#: ../src/pulse/client-conf.c:111 +#, c-format +msgid "Failed to open configuration file '%s': %s" +msgstr "" + +#: ../src/pulse/context.c:550 +msgid "No cookie loaded. Attempting to connect without." +msgstr "" + +#: ../src/pulse/context.c:693 +#, fuzzy, c-format +msgid "fork(): %s" +msgstr "fork(): %s" + +#: ../src/pulse/context.c:748 +#, fuzzy, c-format +msgid "waitpid(): %s" +msgstr "waitpid(): %s" + +#: ../src/pulse/context.c:1438 +#, c-format +msgid "Received message for unknown extension '%s'" +msgstr "" + +#: ../src/utils/pacat.c:108 +#, fuzzy, c-format +msgid "Failed to drain stream: %s" +msgstr "Αποτυχία εύρεσης χρήστη '%s'." + +#: ../src/utils/pacat.c:113 +msgid "Playback stream drained." +msgstr "" + +#: ../src/utils/pacat.c:123 +msgid "Draining connection to server." +msgstr "" + +#: ../src/utils/pacat.c:136 +#, c-format +msgid "pa_stream_drain(): %s" +msgstr "" + +#: ../src/utils/pacat.c:159 +#, c-format +msgid "pa_stream_write() failed: %s" +msgstr "" + +#: ../src/utils/pacat.c:197 +#, c-format +msgid "pa_stream_begin_write() failed: %s" +msgstr "" + +#: ../src/utils/pacat.c:237 +#: ../src/utils/pacat.c:267 +#, c-format +msgid "pa_stream_peek() failed: %s" +msgstr "" + +#: ../src/utils/pacat.c:307 +msgid "Stream successfully created." +msgstr "" + +#: ../src/utils/pacat.c:310 +#, c-format +msgid "pa_stream_get_buffer_attr() failed: %s" +msgstr "" + +#: ../src/utils/pacat.c:314 +#, c-format +msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u" +msgstr "" + +#: ../src/utils/pacat.c:317 +#, c-format +msgid "Buffer metrics: maxlength=%u, fragsize=%u" +msgstr "" + +#: ../src/utils/pacat.c:321 +#, c-format +msgid "Using sample spec '%s', channel map '%s'." +msgstr "" + +#: ../src/utils/pacat.c:325 +#, c-format +msgid "Connected to device %s (%u, %ssuspended)." +msgstr "" + +#: ../src/utils/pacat.c:335 +#, c-format +msgid "Stream error: %s" +msgstr "" + +#: ../src/utils/pacat.c:345 +#, c-format +msgid "Stream device suspended.%s" +msgstr "" + +#: ../src/utils/pacat.c:347 +#, c-format +msgid "Stream device resumed.%s" +msgstr "" + +#: ../src/utils/pacat.c:355 +#, c-format +msgid "Stream underrun.%s" +msgstr "" + +#: ../src/utils/pacat.c:362 +#, c-format +msgid "Stream overrun.%s" +msgstr "" + +#: ../src/utils/pacat.c:369 +#, c-format +msgid "Stream started.%s" +msgstr "" + +#: ../src/utils/pacat.c:376 +#, c-format +msgid "Stream moved to device %s (%u, %ssuspended).%s" +msgstr "" + +#: ../src/utils/pacat.c:376 +msgid "not " +msgstr "" + +#: ../src/utils/pacat.c:383 +#, c-format +msgid "Stream buffer attributes changed.%s" +msgstr "" + +#: ../src/utils/pacat.c:415 +#, c-format +msgid "Connection established.%s" +msgstr "" + +#: ../src/utils/pacat.c:418 +#, c-format +msgid "pa_stream_new() failed: %s" +msgstr "" + +#: ../src/utils/pacat.c:450 +#, c-format +msgid "pa_stream_connect_playback() failed: %s" +msgstr "" + +#: ../src/utils/pacat.c:456 +#, c-format +msgid "pa_stream_connect_record() failed: %s" +msgstr "" + +#: ../src/utils/pacat.c:470 +#: ../src/utils/pactl.c:857 +#, c-format +msgid "Connection failure: %s" +msgstr "Αποτυχία σύνδεσης: %s" + +#: ../src/utils/pacat.c:503 +msgid "Got EOF." +msgstr "" + +#: ../src/utils/pacat.c:540 +#, c-format +msgid "write() failed: %s" +msgstr "" + +#: ../src/utils/pacat.c:561 +msgid "Got signal, exiting." +msgstr "" + +#: ../src/utils/pacat.c:575 +#, fuzzy, c-format +msgid "Failed to get latency: %s" +msgstr "Αποτυχία εύρεσης χρήστη '%s'." + +#: ../src/utils/pacat.c:580 +#, c-format +msgid "Time: %0.3f sec; Latency: %0.0f usec." +msgstr "" + +#: ../src/utils/pacat.c:599 +#, c-format +msgid "pa_stream_update_timing_info() failed: %s" +msgstr "" + +#: ../src/utils/pacat.c:609 +#, c-format +msgid "" +"%s [options]\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -r, --record Create a connection for recording\n" +" -p, --playback Create a connection for playback\n" +"\n" +" -v, --verbose Enable verbose operations\n" +"\n" +" -s, --server=SERVER The name of the server to connect to\n" +" -d, --device=DEVICE The name of the sink/source to connect to\n" +" -n, --client-name=NAME How to call this client on the server\n" +" --stream-name=NAME How to call this stream on the server\n" +" --volume=VOLUME Specify the initial (linear) volume in range 0...65536\n" +" --rate=SAMPLERATE The sample rate in Hz (defaults to 44100)\n" +" --format=SAMPLEFORMAT The sample type, one of s16le, s16be, u8, float32le,\n" +" float32be, ulaw, alaw, s32le, s32be, s24le, s24be,\n" +" s24-32le, s24-32be (defaults to s16ne)\n" +" --channels=CHANNELS The number of channels, 1 for mono, 2 for stereo\n" +" (defaults to 2)\n" +" --channel-map=CHANNELMAP Channel map to use instead of the default\n" +" --fix-format Take the sample format from the sink the stream is\n" +" being connected to.\n" +" --fix-rate Take the sampling rate from the sink the stream is\n" +" being connected to.\n" +" --fix-channels Take the number of channels and the channel map\n" +" from the sink the stream is being connected to.\n" +" --no-remix Don't upmix or downmix channels.\n" +" --no-remap Map channels by index instead of name.\n" +" --latency=BYTES Request the specified latency in bytes.\n" +" --process-time=BYTES Request the specified process time per request in bytes.\n" +" --property=PROPERTY=VALUE Set the specified property to the specified value.\n" +" --raw Record/play raw PCM data.\n" +" --file-format=FFORMAT Record/play formatted PCM data.\n" +" --list-file-formats List available file formats.\n" +msgstr "" + +#: ../src/utils/pacat.c:731 +#, c-format +msgid "" +"pacat %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" + +#: ../src/utils/pacat.c:764 +#: ../src/utils/pactl.c:953 +#, c-format +msgid "Invalid client name '%s'" +msgstr "" + +#: ../src/utils/pacat.c:779 +#, c-format +msgid "Invalid stream name '%s'" +msgstr "" + +#: ../src/utils/pacat.c:816 +#, c-format +msgid "Invalid channel map '%s'" +msgstr "" + +#: ../src/utils/pacat.c:845 +#, c-format +msgid "Invalid latency specification '%s'" +msgstr "" + +#: ../src/utils/pacat.c:852 +#, c-format +msgid "Invalid process time specification '%s'" +msgstr "" + +#: ../src/utils/pacat.c:864 +#, c-format +msgid "Invalid property '%s'" +msgstr "" + +#: ../src/utils/pacat.c:881 +#, c-format +msgid "Unknown file format %s." +msgstr "" + +#: ../src/utils/pacat.c:900 +msgid "Invalid sample specification" +msgstr "" + +#: ../src/utils/pacat.c:910 +#, c-format +msgid "open(): %s" +msgstr "" + +#: ../src/utils/pacat.c:915 +#, c-format +msgid "dup2(): %s" +msgstr "" + +#: ../src/utils/pacat.c:922 +msgid "Too many arguments." +msgstr "" + +#: ../src/utils/pacat.c:933 +msgid "Failed to generate sample specification for file." +msgstr "" + +#: ../src/utils/pacat.c:953 +msgid "Failed to open audio file." +msgstr "" + +#: ../src/utils/pacat.c:959 +msgid "Warning: specified sample specification will be overwritten with specification from file." +msgstr "" + +#: ../src/utils/pacat.c:962 +#: ../src/utils/pactl.c:997 +msgid "Failed to determine sample specification from file." +msgstr "" + +#: ../src/utils/pacat.c:971 +msgid "Warning: Failed to determine channel map from file." +msgstr "" + +#: ../src/utils/pacat.c:982 +msgid "Channel map doesn't match sample specification" +msgstr "" + +#: ../src/utils/pacat.c:993 +msgid "Warning: failed to write channel map to file." +msgstr "" + +#: ../src/utils/pacat.c:1008 +#, c-format +msgid "Opening a %s stream with sample specification '%s' and channel map '%s'." +msgstr "" + +#: ../src/utils/pacat.c:1009 +msgid "recording" +msgstr "" + +#: ../src/utils/pacat.c:1009 +msgid "playback" +msgstr "" + +#: ../src/utils/pacat.c:1035 +#: ../src/utils/pactl.c:1267 +msgid "pa_mainloop_new() failed." +msgstr "" + +#: ../src/utils/pacat.c:1054 +msgid "io_new() failed." +msgstr "" + +#: ../src/utils/pacat.c:1061 +#: ../src/utils/pactl.c:1279 +msgid "pa_context_new() failed." +msgstr "" + +#: ../src/utils/pacat.c:1069 +#: ../src/utils/pactl.c:1285 +#, c-format +msgid "pa_context_connect() failed: %s" +msgstr "" + +#: ../src/utils/pacat.c:1075 +msgid "pa_context_rttime_new() failed." +msgstr "" + +#: ../src/utils/pacat.c:1082 +#: ../src/utils/pactl.c:1290 +msgid "pa_mainloop_run() failed." +msgstr "" + +#: ../src/utils/pasuspender.c:81 +#, fuzzy, c-format +msgid "fork(): %s\n" +msgstr "fork(): %s\n" + +#: ../src/utils/pasuspender.c:92 +#, fuzzy, c-format +msgid "execvp(): %s\n" +msgstr "execvp(): %s\n" + +#: ../src/utils/pasuspender.c:109 +#, c-format +msgid "Failure to suspend: %s\n" +msgstr "" + +#: ../src/utils/pasuspender.c:124 +#, c-format +msgid "Failure to resume: %s\n" +msgstr "" + +#: ../src/utils/pasuspender.c:147 +#, c-format +msgid "WARNING: Sound server is not local, not suspending.\n" +msgstr "" + +#: ../src/utils/pasuspender.c:159 +#, c-format +msgid "Connection failure: %s\n" +msgstr "" + +#: ../src/utils/pasuspender.c:176 +#, c-format +msgid "Got SIGINT, exiting.\n" +msgstr "" + +#: ../src/utils/pasuspender.c:194 +#, c-format +msgid "WARNING: Child process terminated by signal %u\n" +msgstr "" + +#: ../src/utils/pasuspender.c:212 +#, c-format +msgid "" +"%s [options] ... \n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +" -s, --server=SERVER The name of the server to connect to\n" +"\n" +msgstr "" + +#: ../src/utils/pasuspender.c:248 +#, c-format +msgid "" +"pasuspender %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" + +#: ../src/utils/pasuspender.c:277 +#, c-format +msgid "pa_mainloop_new() failed.\n" +msgstr "" + +#: ../src/utils/pasuspender.c:290 +#, c-format +msgid "pa_context_new() failed.\n" +msgstr "" + +#: ../src/utils/pasuspender.c:298 +#, c-format +msgid "pa_mainloop_run() failed.\n" +msgstr "" + +#: ../src/utils/pactl.c:135 +#, fuzzy, c-format +msgid "Failed to get statistics: %s" +msgstr "Αποτυχία εύρεσης χρήστη '%s'." + +#: ../src/utils/pactl.c:141 +#, c-format +msgid "Currently in use: %u blocks containing %s bytes total.\n" +msgstr "" + +#: ../src/utils/pactl.c:144 +#, c-format +msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n" +msgstr "" + +#: ../src/utils/pactl.c:147 +#, c-format +msgid "Sample cache size: %s\n" +msgstr "" + +#: ../src/utils/pactl.c:156 +#, fuzzy, c-format +msgid "Failed to get server information: %s" +msgstr "Αποτυχία εύρεσης χρήστη '%s'." + +#: ../src/utils/pactl.c:164 +#, c-format +msgid "" +"User name: %s\n" +"Host Name: %s\n" +"Server Name: %s\n" +"Server Version: %s\n" +"Default Sample Specification: %s\n" +"Default Channel Map: %s\n" +"Default Sink: %s\n" +"Default Source: %s\n" +"Cookie: %08x\n" +msgstr "" + +#: ../src/utils/pactl.c:205 +#, fuzzy, c-format +msgid "Failed to get sink information: %s" +msgstr "Αποτυχία εύρεσης χρήστη '%s'." + +#: ../src/utils/pactl.c:221 +#, c-format +msgid "" +"Sink #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor Source: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" + +#: ../src/utils/pactl.c:268 +#: ../src/utils/pactl.c:360 +#, c-format +msgid "\tPorts:\n" +msgstr "" + +#: ../src/utils/pactl.c:274 +#: ../src/utils/pactl.c:366 +#, c-format +msgid "\tActive Port: %s\n" +msgstr "" + +#: ../src/utils/pactl.c:297 +#, fuzzy, c-format +msgid "Failed to get source information: %s" +msgstr "Αποτυχία εύρεσης χρήστη '%s'." + +#: ../src/utils/pactl.c:313 +#, c-format +msgid "" +"Source #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor of Sink: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" + +#: ../src/utils/pactl.c:345 +#: ../src/utils/pactl.c:401 +#: ../src/utils/pactl.c:436 +#: ../src/utils/pactl.c:473 +#: ../src/utils/pactl.c:532 +#: ../src/utils/pactl.c:533 +#: ../src/utils/pactl.c:543 +#: ../src/utils/pactl.c:587 +#: ../src/utils/pactl.c:588 +#: ../src/utils/pactl.c:594 +#: ../src/utils/pactl.c:637 +#: ../src/utils/pactl.c:638 +#: ../src/utils/pactl.c:645 +msgid "n/a" +msgstr "" + +#: ../src/utils/pactl.c:375 +#, fuzzy, c-format +msgid "Failed to get module information: %s" +msgstr "Αποτυχία εύρεσης χρήστη '%s'." + +#: ../src/utils/pactl.c:393 +#, c-format +msgid "" +"Module #%u\n" +"\tName: %s\n" +"\tArgument: %s\n" +"\tUsage counter: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" + +#: ../src/utils/pactl.c:412 +#, fuzzy, c-format +msgid "Failed to get client information: %s" +msgstr "Αποτυχία εύρεσης χρήστη '%s'." + +#: ../src/utils/pactl.c:430 +#, c-format +msgid "" +"Client #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" + +#: ../src/utils/pactl.c:447 +#, fuzzy, c-format +msgid "Failed to get card information: %s" +msgstr "Αποτυχία εύρεσης χρήστη '%s'." + +#: ../src/utils/pactl.c:465 +#, c-format +msgid "" +"Card #%u\n" +"\tName: %s\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" + +#: ../src/utils/pactl.c:479 +#, c-format +msgid "\tProfiles:\n" +msgstr "" + +#: ../src/utils/pactl.c:485 +#, c-format +msgid "\tActive Profile: %s\n" +msgstr "" + +#: ../src/utils/pactl.c:496 +#, fuzzy, c-format +msgid "Failed to get sink input information: %s" +msgstr "Αποτυχία εύρεσης χρήστη '%s'." + +#: ../src/utils/pactl.c:515 +#, c-format +msgid "" +"Sink Input #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSink: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tMute: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSink Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" + +#: ../src/utils/pactl.c:554 +#, fuzzy, c-format +msgid "Failed to get source output information: %s" +msgstr "Αποτυχία εύρεσης χρήστη '%s'." + +#: ../src/utils/pactl.c:574 +#, c-format +msgid "" +"Source Output #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSource: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSource Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" + +#: ../src/utils/pactl.c:605 +#, fuzzy, c-format +msgid "Failed to get sample information: %s" +msgstr "Αποτυχία εύρεσης χρήστη '%s'." + +#: ../src/utils/pactl.c:623 +#, c-format +msgid "" +"Sample #%u\n" +"\tName: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tDuration: %0.1fs\n" +"\tSize: %s\n" +"\tLazy: %s\n" +"\tFilename: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" + +#: ../src/utils/pactl.c:653 +#: ../src/utils/pactl.c:663 +#, c-format +msgid "Failure: %s" +msgstr "Αποτυχία: %s" + +#: ../src/utils/pactl.c:687 +#, fuzzy, c-format +msgid "Failed to upload sample: %s" +msgstr "Αποτυχία εύρεσης χρήστη '%s'." + +#: ../src/utils/pactl.c:704 +msgid "Premature end of file" +msgstr "" + +#: ../src/utils/pactl.c:863 +msgid "Got SIGINT, exiting." +msgstr "" + +#: ../src/utils/pactl.c:869 +#, c-format +msgid "" +"%s [options] stat\n" +"%s [options] list\n" +"%s [options] exit\n" +"%s [options] upload-sample FILENAME [NAME]\n" +"%s [options] play-sample NAME [SINK]\n" +"%s [options] remove-sample NAME\n" +"%s [options] move-sink-input SINKINPUT SINK\n" +"%s [options] move-source-output SOURCEOUTPUT SOURCE\n" +"%s [options] load-module NAME [ARGS ...]\n" +"%s [options] unload-module MODULE\n" +"%s [options] suspend-sink SINK 1|0\n" +"%s [options] suspend-source SOURCE 1|0\n" +"%s [options] set-card-profile CARD PROFILE\n" +"%s [options] set-sink-port SINK PORT\n" +"%s [options] set-source-port SOURCE PORT\n" +"%s [options] set-sink-volume SINK VOLUME\n" +"%s [options] set-source-volume SOURCE VOLUME\n" +"%s [options] set-sink-input-volume SINKINPUT VOLUME\n" +"%s [options] set-sink-mute SINK 1|0\n" +"%s [options] set-source-mute SOURCE 1|0\n" +"%s [options] set-sink-input-mute SINKINPUT 1|0\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -s, --server=SERVER The name of the server to connect to\n" +" -n, --client-name=NAME How to call this client on the server\n" +msgstr "" + +#: ../src/utils/pactl.c:933 +#, c-format +msgid "" +"pactl %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" + +#: ../src/utils/pactl.c:979 +msgid "Please specify a sample file to load" +msgstr "" + +#: ../src/utils/pactl.c:992 +msgid "Failed to open sound file." +msgstr "Αποτυχία ανοίγματος αρχείου ήχου." + +#: ../src/utils/pactl.c:1004 +msgid "Warning: Failed to determine sample specification from file." +msgstr "" + +#: ../src/utils/pactl.c:1014 +msgid "You have to specify a sample name to play" +msgstr "" + +#: ../src/utils/pactl.c:1026 +msgid "You have to specify a sample name to remove" +msgstr "" + +#: ../src/utils/pactl.c:1035 +msgid "You have to specify a sink input index and a sink" +msgstr "" + +#: ../src/utils/pactl.c:1045 +msgid "You have to specify a source output index and a source" +msgstr "" + +#: ../src/utils/pactl.c:1060 +msgid "You have to specify a module name and arguments." +msgstr "" + +#: ../src/utils/pactl.c:1080 +msgid "You have to specify a module index" +msgstr "" + +#: ../src/utils/pactl.c:1090 +msgid "You may not specify more than one sink. You have to specify a boolean value." +msgstr "" + +#: ../src/utils/pactl.c:1103 +msgid "You may not specify more than one source. You have to specify a boolean value." +msgstr "" + +#: ../src/utils/pactl.c:1115 +msgid "You have to specify a card name/index and a profile name" +msgstr "" + +#: ../src/utils/pactl.c:1126 +msgid "You have to specify a sink name/index and a port name" +msgstr "" + +#: ../src/utils/pactl.c:1137 +msgid "You have to specify a source name/index and a port name" +msgstr "" + +#: ../src/utils/pactl.c:1149 +msgid "You have to specify a sink name/index and a volume" +msgstr "" + +#: ../src/utils/pactl.c:1154 +#: ../src/utils/pactl.c:1171 +#: ../src/utils/pactl.c:1193 +#: ../src/utils/pactl.c:1209 +#: ../src/utils/pactl.c:1226 +#: ../src/utils/pactl.c:1248 +msgid "Invalid volume specification" +msgstr "" + +#: ../src/utils/pactl.c:1166 +msgid "You have to specify a source name/index and a volume" +msgstr "" + +#: ../src/utils/pactl.c:1183 +msgid "You have to specify a sink input index and a volume" +msgstr "" + +#: ../src/utils/pactl.c:1188 +msgid "Invalid sink input index" +msgstr "" + +#: ../src/utils/pactl.c:1204 +msgid "You have to specify a sink name/index and a mute boolean" +msgstr "" + +#: ../src/utils/pactl.c:1221 +msgid "You have to specify a source name/index and a mute boolean" +msgstr "" + +#: ../src/utils/pactl.c:1238 +msgid "You have to specify a sink input index and a mute boolean" +msgstr "" + +#: ../src/utils/pactl.c:1243 +msgid "Invalid sink input index specification" +msgstr "" + +#: ../src/utils/pactl.c:1262 +msgid "No valid command specified." +msgstr "" + +#: ../src/utils/pax11publish.c:61 +#, c-format +msgid "" +"%s [-D display] [-S server] [-O sink] [-I source] [-c file] [-d|-e|-i|-r]\n" +"\n" +" -d Show current PulseAudio data attached to X11 display (default)\n" +" -e Export local PulseAudio data to X11 display\n" +" -i Import PulseAudio data from X11 display to local environment variables and cookie file.\n" +" -r Remove PulseAudio data from X11 display\n" +msgstr "" + +#: ../src/utils/pax11publish.c:94 +#, c-format +msgid "Failed to parse command line.\n" +msgstr "" + +#: ../src/utils/pax11publish.c:108 +#, c-format +msgid "Server: %s\n" +msgstr "" + +#: ../src/utils/pax11publish.c:110 +#, c-format +msgid "Source: %s\n" +msgstr "" + +#: ../src/utils/pax11publish.c:112 +#, c-format +msgid "Sink: %s\n" +msgstr "" + +#: ../src/utils/pax11publish.c:114 +#, c-format +msgid "Cookie: %s\n" +msgstr "" + +#: ../src/utils/pax11publish.c:132 +#, c-format +msgid "Failed to parse cookie data\n" +msgstr "" + +#: ../src/utils/pax11publish.c:137 +#, c-format +msgid "Failed to save cookie data\n" +msgstr "" + +#: ../src/utils/pax11publish.c:152 +#, c-format +msgid "Failed to load client configuration file.\n" +msgstr "" + +#: ../src/utils/pax11publish.c:157 +#, c-format +msgid "Failed to read environment configuration data.\n" +msgstr "" + +#: ../src/utils/pax11publish.c:174 +#, c-format +msgid "Failed to get FQDN.\n" +msgstr "" + +#: ../src/utils/pax11publish.c:194 +#, c-format +msgid "Failed to load cookie data\n" +msgstr "" + +#: ../src/utils/pax11publish.c:211 +#, c-format +msgid "Not yet implemented.\n" +msgstr "" + +#: ../src/utils/pacmd.c:69 +msgid "No PulseAudio daemon running, or not running as session daemon." +msgstr "" + +#: ../src/utils/pacmd.c:74 +#, c-format +msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s" +msgstr "" + +#: ../src/utils/pacmd.c:91 +#, c-format +msgid "connect(): %s" +msgstr "σύνδεση(): %s" + +#: ../src/utils/pacmd.c:99 +msgid "Failed to kill PulseAudio daemon." +msgstr "" + +#: ../src/utils/pacmd.c:107 +msgid "Daemon not responding." +msgstr "" + +#: ../src/utils/pacmd.c:161 +#, c-format +msgid "poll(): %s" +msgstr "" + +#: ../src/utils/pacmd.c:171 +#: ../src/utils/pacmd.c:188 +#, c-format +msgid "read(): %s" +msgstr "" + +#: ../src/utils/pacmd.c:207 +#: ../src/utils/pacmd.c:223 +#, c-format +msgid "write(): %s" +msgstr "" + +#: ../src/pulsecore/lock-autospawn.c:136 +#: ../src/pulsecore/lock-autospawn.c:219 +msgid "Cannot access autospawn lock." +msgstr "" + +#: ../src/modules/alsa/alsa-sink.c:530 +#: ../src/modules/alsa/alsa-sink.c:689 +#, c-format +msgid "" +"ALSA woke us up to write new data to the device, but there was actually nothing to write!\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.\n" +"We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() returned 0 or another value < min_avail." +msgstr "" + +#: ../src/modules/alsa/alsa-source.c:506 +#: ../src/modules/alsa/alsa-source.c:656 +#, c-format +msgid "" +"ALSA woke us up to read new data from the device, but there was actually nothing to read!\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.\n" +"We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() returned 0 or another value < min_avail." +msgstr "" + +#: ../src/modules/alsa/module-alsa-card.c:152 +#: ../src/modules/bluetooth/module-bluetooth-device.c:2228 +#: ../src/modules/alsa/alsa-mixer.c:2931 +msgid "Off" +msgstr "" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2184 +msgid "High Fidelity Playback (A2DP)" +msgstr "" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2198 +msgid "High Fidelity Capture (A2DP)" +msgstr "" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2213 +msgid "Telephony Duplex (HSP/HFP)" +msgstr "" + +#: ../src/modules/reserve-wrap.c:151 +msgid "PulseAudio Sound Server" +msgstr "" + +#: ../src/modules/module-rygel-media-server.c:569 +#: ../src/modules/module-rygel-media-server.c:583 +msgid "Output Devices" +msgstr "" + +#: ../src/modules/module-rygel-media-server.c:570 +#: ../src/modules/module-rygel-media-server.c:584 +msgid "Input Devices" +msgstr "" + +#: ../src/modules/module-rygel-media-server.c:774 +msgid "Audio on @HOSTNAME@" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1701 +msgid "Input" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1702 +msgid "Docking Station Input" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1703 +msgid "Docking Station Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1704 +msgid "Line-In" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1705 +msgid "Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1706 +msgid "External Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1707 +msgid "Internal Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1708 +msgid "Radio" +msgstr "Radio" + +#: ../src/modules/alsa/alsa-mixer.c:1709 +msgid "Video" +msgstr "Video" + +#: ../src/modules/alsa/alsa-mixer.c:1710 +msgid "Automatic Gain Control" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1711 +msgid "No Automatic Gain Control" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1712 +msgid "Boost" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1713 +msgid "No Boost" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1714 +msgid "Amplifier" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1715 +msgid "No Amplifier" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1773 +msgid "Analog Input" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1774 +msgid "Analog Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1775 +msgid "Analog Line-In" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1776 +msgid "Analog Radio" +msgstr "Analog Radio" + +#: ../src/modules/alsa/alsa-mixer.c:1777 +msgid "Analog Video" +msgstr "Analog Video" + +#: ../src/modules/alsa/alsa-mixer.c:1778 +msgid "Analog Output" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1779 +msgid "Analog Headphones" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1780 +msgid "Analog Output (LFE)" +msgstr "Analog Output (LFE)" + +#: ../src/modules/alsa/alsa-mixer.c:1781 +msgid "Analog Mono Output" +msgstr "Analog Mono Output" + +#: ../src/modules/alsa/alsa-mixer.c:1981 +#, c-format +msgid "%s+%s" +msgstr "%s+%s" + +#: ../src/modules/alsa/alsa-mixer.c:1984 +#: ../src/modules/alsa/alsa-mixer.c:3404 +#, c-format +msgid "%s / %s" +msgstr "%s / %s" + +#: ../src/modules/alsa/alsa-mixer.c:2790 +msgid "Analog Mono" +msgstr "Analog Mono" + +#: ../src/modules/alsa/alsa-mixer.c:2791 +msgid "Analog Stereo" +msgstr "Analog Stereo" + +#: ../src/modules/alsa/alsa-mixer.c:2792 +msgid "Analog Surround 2.1" +msgstr "Analog Surround 2.1" + +#: ../src/modules/alsa/alsa-mixer.c:2793 +msgid "Analog Surround 3.0" +msgstr "Analog Surround 3.0" + +#: ../src/modules/alsa/alsa-mixer.c:2794 +msgid "Analog Surround 3.1" +msgstr "Analog Surround 3.1" + +#: ../src/modules/alsa/alsa-mixer.c:2795 +msgid "Analog Surround 4.0" +msgstr "Analog Surround 4.0" + +#: ../src/modules/alsa/alsa-mixer.c:2796 +msgid "Analog Surround 4.1" +msgstr "Analog Surround 4.1" + +#: ../src/modules/alsa/alsa-mixer.c:2797 +msgid "Analog Surround 5.0" +msgstr "Analog Surround 5.0" + +#: ../src/modules/alsa/alsa-mixer.c:2798 +msgid "Analog Surround 5.1" +msgstr "Analog Surround 5.1" + +#: ../src/modules/alsa/alsa-mixer.c:2799 +msgid "Analog Surround 6.0" +msgstr "Analog Surround 6.0" + +#: ../src/modules/alsa/alsa-mixer.c:2800 +msgid "Analog Surround 6.1" +msgstr "Analog Surround 6.1" + +#: ../src/modules/alsa/alsa-mixer.c:2801 +msgid "Analog Surround 7.0" +msgstr "Analog Surround 7.0" + +#: ../src/modules/alsa/alsa-mixer.c:2802 +msgid "Analog Surround 7.1" +msgstr "Analog Surround 7.1" + +#: ../src/modules/alsa/alsa-mixer.c:2803 +msgid "Digital Stereo (IEC958)" +msgstr "Digital Stereo (IEC958)" + +#: ../src/modules/alsa/alsa-mixer.c:2804 +msgid "Digital Surround 4.0 (IEC958)" +msgstr "Digital Surround 4.0 (IEC958)" + +#: ../src/modules/alsa/alsa-mixer.c:2805 +msgid "Digital Surround 4.0 (IEC958/AC3)" +msgstr "Digital Surround 4.0 (IEC958/AC3)" + +#: ../src/modules/alsa/alsa-mixer.c:2806 +msgid "Digital Surround 5.1 (IEC958/AC3)" +msgstr "Digital Surround 5.1 (IEC958/AC3)" + +#: ../src/modules/alsa/alsa-mixer.c:2807 +msgid "Digital Stereo (HDMI)" +msgstr "Digital Stereo (HDMI)" + +#: ../src/modules/alsa/alsa-mixer.c:2928 +msgid "Analog Mono Duplex" +msgstr "Analog Mono Duplex" + +#: ../src/modules/alsa/alsa-mixer.c:2929 +msgid "Analog Stereo Duplex" +msgstr "Analog Stereo Duplex" + +#: ../src/modules/alsa/alsa-mixer.c:2930 +msgid "Digital Stereo Duplex (IEC958)" +msgstr "Digital Stereo Duplex (IEC958)" + diff --git a/po/es.po b/po/es.po new file mode 100644 index 0000000..48a4f13 --- /dev/null +++ b/po/es.po @@ -0,0 +1,2883 @@ +# Fedora Spanish translation of PulseAudio. +# This file is distributed under the same license as the PulseAudio Package. +# +# Domingo Becker , 2009. +# Héctor Daniel Cabrera , 2009. +# +# Fernando Gonzalez Blanco , 2009. +msgid "" +msgstr "" +"Project-Id-Version: PulseAudio\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-10-04 16:37+0000\n" +"PO-Revision-Date: 2009-10-04 21:16+0200\n" +"Last-Translator: Fernando Gonzalez Blanco \n" +"Language-Team: Spanish \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Spanish\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629 +#, c-format +msgid "%s %s" +msgstr "%s %s" + +#: ../src/modules/alsa/alsa-util.c:1106 +#, c-format +msgid "" +"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu " +"ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_avail() devolvió un valor que es excepcionalmente grande: %lu bytes " +"(%lu ms).\n" +"Lo más probable es que sea un error del controlador ALSA '%s'. Por favor, " +"informe ésto a los desarrolladores de ALSA." + +#: ../src/modules/alsa/alsa-util.c:1147 +#, c-format +msgid "" +"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%" +"lu ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_delay() devolvió un valor que es excepcionalmente grande: %li bytes " +"(%s%lu ms).\n" +"Lo más probable es que sea un error del controlador ALSA '%s'. Por favor, " +"informe ésto a los desarrolladores de ALSA." + +#: ../src/modules/alsa/alsa-util.c:1194 +#, c-format +msgid "" +"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes " +"(%lu ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_mmap_begin() devolvió un valor que es excepcionalmente grande: %lu " +"bytes (%lu ms).\n" +"Lo más probable es que sea un error del controlador ALSA '%s'. Por favor, " +"informe ésto a los desarrolladores de ALSA." + +#: ../src/modules/module-always-sink.c:39 +msgid "Always keeps at least one sink loaded even if it's a null one" +msgstr "Siempre tenga al menos un sumidero cargado aunque sea uno nulo" + +#: ../src/modules/module-always-sink.c:83 +msgid "Dummy Output" +msgstr "Salida Boba" + +#: ../src/modules/module-ladspa-sink.c:49 +msgid "Virtual LADSPA sink" +msgstr "Sumidero virtual LADSPA" + +#: ../src/modules/module-ladspa-sink.c:53 +msgid "" +"sink_name= sink_properties= " +"master= format= rate= " +"channels= channel_map= plugin= label= control=" +msgstr "" +"sink_name= sink_properties= master= format= " +"rate= channels= channel_map= plugin= label= control=" + +#: ../src/modules/module-null-sink.c:55 +msgid "Clocked NULL sink" +msgstr "Sumidero nulo sincronizado" + +#: ../src/modules/module-null-sink.c:291 +msgid "Null Output" +msgstr "Salida Nula" + +#: ../src/pulsecore/sink.c:2613 +msgid "Internal Audio" +msgstr "Audio Interno" + +#: ../src/pulsecore/sink.c:2618 +msgid "Modem" +msgstr "Módem" + +#: ../src/daemon/ltdl-bind-now.c:124 +msgid "Failed to find original lt_dlopen loader." +msgstr "Falló al buscar cargador el cargador llt_dlopen original." + +#: ../src/daemon/ltdl-bind-now.c:129 +msgid "Failed to allocate new dl loader." +msgstr "Falló al asignar el cargador dl nuevo." + +#: ../src/daemon/ltdl-bind-now.c:142 +msgid "Failed to add bind-now-loader." +msgstr "Falló al agregar bind-now-loader." + +#: ../src/daemon/main.c:141 +#, c-format +msgid "Got signal %s." +msgstr "Se obtuvo la señal %s." + +#: ../src/daemon/main.c:168 +msgid "Exiting." +msgstr "Saliendo." + +#: ../src/daemon/main.c:186 +#, c-format +msgid "Failed to find user '%s'." +msgstr "Falló al buscar usuario '%s'." + +#: ../src/daemon/main.c:191 +#, c-format +msgid "Failed to find group '%s'." +msgstr "Falló al buscar grupo '%s'." + +#: ../src/daemon/main.c:195 +#, c-format +msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)." +msgstr "Se encontró el usuario '%s' (UID %lu) y el grupo '%s' (GID %lu)." + +#: ../src/daemon/main.c:200 +#, c-format +msgid "GID of user '%s' and of group '%s' don't match." +msgstr "GID del usuario '%s' y del grupo '%s' no son similares." + +#: ../src/daemon/main.c:205 +#, c-format +msgid "Home directory of user '%s' is not '%s', ignoring." +msgstr "El directorio de inicio del usuario '%s' no es '%s', ignorando." + +#: ../src/daemon/main.c:208 ../src/daemon/main.c:213 +#, c-format +msgid "Failed to create '%s': %s" +msgstr "Falló al crear '%s': %s" + +#: ../src/daemon/main.c:220 +#, c-format +msgid "Failed to change group list: %s" +msgstr "Falló al cambiar la lista de grupo: %s" + +#: ../src/daemon/main.c:236 +#, c-format +msgid "Failed to change GID: %s" +msgstr "Falló al cambiar GID: %s" + +#: ../src/daemon/main.c:252 +#, c-format +msgid "Failed to change UID: %s" +msgstr "Falló al cambiar UID: %s" + +#: ../src/daemon/main.c:271 +msgid "Successfully dropped root privileges." +msgstr "Se han liberado con éxitos los privilegios de root." + +#: ../src/daemon/main.c:279 +msgid "System wide mode unsupported on this platform." +msgstr "El modo a nivel de sistema no es soportado en esta plataforma." + +#: ../src/daemon/main.c:297 +#, c-format +msgid "setrlimit(%s, (%u, %u)) failed: %s" +msgstr "setrlimit(%s, (%u, %u)) falló: %s" + +#: ../src/daemon/main.c:474 +msgid "Failed to parse command line." +msgstr "Falló al analizar la línea de comando." + +#: ../src/daemon/main.c:541 +msgid "Daemon not running" +msgstr "El demonio no está funcionando" + +#: ../src/daemon/main.c:543 +#, c-format +msgid "Daemon running as PID %u" +msgstr "El demonio está funcionando como PID %u" + +#: ../src/daemon/main.c:553 +#, c-format +msgid "Failed to kill daemon: %s" +msgstr "No se ha podido detener el demonio: %s" + +#: ../src/daemon/main.c:571 +msgid "" +"This program is not intended to be run as root (unless --system is " +"specified)." +msgstr "" +"Este programa no tiene por qué ser ejecutado como root (a menos que --system " +"sea especificado)." + +#: ../src/daemon/main.c:573 +msgid "Root privileges required." +msgstr "Se necesitan privilegios de root." + +#: ../src/daemon/main.c:578 +msgid "--start not supported for system instances." +msgstr "--start no está soportado para las instancias del sistema." + +#: ../src/daemon/main.c:583 +msgid "Running in system mode, but --disallow-exit not set!" +msgstr "" +"Ejecutándose en modo de sistema, ¡pero no se ha configurado --disallow-exit! " + +#: ../src/daemon/main.c:586 +msgid "Running in system mode, but --disallow-module-loading not set!" +msgstr "" +"Ejecutándose en modo de sistema, ¡pero no se ha configurado --disallow-" +"module-loading!" + +#: ../src/daemon/main.c:589 +msgid "Running in system mode, forcibly disabling SHM mode!" +msgstr "" +"Ejecutándose en modo de sistema, ¡desactivando forzadamente el modo SHM!" + +#: ../src/daemon/main.c:594 +msgid "Running in system mode, forcibly disabling exit idle time!" +msgstr "" +"Ejecutándose en modo de sistema, ¡desactivando forzadamente exit idle time!" + +#: ../src/daemon/main.c:621 +msgid "Failed to acquire stdio." +msgstr "Fallo al intentar adquirir stdio." + +#: ../src/daemon/main.c:627 +#, c-format +msgid "pipe failed: %s" +msgstr "Falló el pipe: %s" + +#: ../src/daemon/main.c:632 +#, c-format +msgid "fork() failed: %s" +msgstr "Falló el fork(): %s" + +#: ../src/daemon/main.c:646 ../src/utils/pacat.c:508 +#, c-format +msgid "read() failed: %s" +msgstr "Falló la operación read(): %s" + +#: ../src/daemon/main.c:652 +msgid "Daemon startup failed." +msgstr "Falló el inicio del demonio. " + +#: ../src/daemon/main.c:654 +msgid "Daemon startup successful." +msgstr "El demonio se inició exitosamente." + +#: ../src/daemon/main.c:731 +#, c-format +msgid "This is PulseAudio %s" +msgstr "Esto es PulseAudio %s" + +#: ../src/daemon/main.c:732 +#, c-format +msgid "Compilation host: %s" +msgstr "Host de compilación: %s" + +#: ../src/daemon/main.c:733 +#, c-format +msgid "Compilation CFLAGS: %s" +msgstr "Compilación CFLAGS: %s" + +#: ../src/daemon/main.c:736 +#, c-format +msgid "Running on host: %s" +msgstr "Ejecutándose en el host: %s" + +#: ../src/daemon/main.c:739 +#, c-format +msgid "Found %u CPUs." +msgstr "Se encontraron %u CPUs." + +#: ../src/daemon/main.c:741 +#, c-format +msgid "Page size is %lu bytes" +msgstr "El tamaño de la página es de %lu bytes" + +#: ../src/daemon/main.c:744 +msgid "Compiled with Valgrind support: yes" +msgstr "Soporte para compilar con Valgrind: si" + +#: ../src/daemon/main.c:746 +msgid "Compiled with Valgrind support: no" +msgstr "Soporte para compilar con Valgrind: no" + +#: ../src/daemon/main.c:749 +#, c-format +msgid "Running in valgrind mode: %s" +msgstr "Ejecutándose en modo valgrind: %s" + +#: ../src/daemon/main.c:752 +msgid "Optimized build: yes" +msgstr "Build optimizado: si" + +#: ../src/daemon/main.c:754 +msgid "Optimized build: no" +msgstr "Build optimizado: no" + +#: ../src/daemon/main.c:758 +msgid "NDEBUG defined, all asserts disabled." +msgstr "NDEBUG definido, todos los chequeos deshabilitados." + +#: ../src/daemon/main.c:760 +msgid "FASTPATH defined, only fast path asserts disabled." +msgstr "FASTPATH definido, sólo se deshabilitan los chequeos fast path." + +#: ../src/daemon/main.c:762 +msgid "All asserts enabled." +msgstr "Todos los chequeos habilitados." + +#: ../src/daemon/main.c:766 +msgid "Failed to get machine ID" +msgstr "Fallo al intentar obtener el ID de la máquina" + +#: ../src/daemon/main.c:769 +#, c-format +msgid "Machine ID is %s." +msgstr "El ID de la máquina es %s" + +#: ../src/daemon/main.c:773 +#, c-format +msgid "Session ID is %s." +msgstr "El ID de la sesión es %s." + +#: ../src/daemon/main.c:779 +#, c-format +msgid "Using runtime directory %s." +msgstr "Utilizando directorio de tiempo de ejecución %s." + +#: ../src/daemon/main.c:784 +#, c-format +msgid "Using state directory %s." +msgstr "Utilizando directorio de estado %s." + +#: ../src/daemon/main.c:787 +#, c-format +msgid "Using modules directory %s." +msgstr "Utilizando directorio de módulos %s." + +#: ../src/daemon/main.c:789 +#, c-format +msgid "Running in system mode: %s" +msgstr "Ejecutándose en modo de sistema: %s" + +#: ../src/daemon/main.c:792 +msgid "" +"OK, so you are running PA in system mode. Please note that you most likely " +"shouldn't be doing that.\n" +"If you do it nonetheless then it's your own fault if things don't work as " +"expected.\n" +"Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an " +"explanation why system mode is usually a bad idea." +msgstr "" +"Bien, o sea que está ejecutando PA en modo de sistema. Por favor entienda " +"que, en general, no debería estar haciéndolo.\n" +"Si insiste en seguir utilizando este modo, será debido a su propio accionar " +"que las cosas no funcionen como se esperaba.\n" +"Por favor lea http://pulseaudio.org/wiki/WhatIsWrongWithSystemMod para " +"obtener una explicación acerca de por qué es una mala idea utilizar el modo " +"sistema." + +#: ../src/daemon/main.c:809 +msgid "pa_pid_file_create() failed." +msgstr "Ha fallado pa_pid_file_create()." + +#: ../src/daemon/main.c:819 +msgid "Fresh high-resolution timers available! Bon appetit!" +msgstr "" +"¡Existen cronómetros de alta resolución fresquitos y disponibles! ¡Bon " +"appetit!" + +#: ../src/daemon/main.c:821 +msgid "" +"Dude, your kernel stinks! The chef's recommendation today is Linux with high-" +"resolution timers enabled!" +msgstr "" +"¡Amigo, su kernel deja mucho que desear! ¡El plato que hoy recomienda el " +"chef es Linux con cronómetros de alta resolución activados! " + +#: ../src/daemon/main.c:844 +msgid "pa_core_new() failed." +msgstr "Falló pa_core_new()." + +#: ../src/daemon/main.c:904 +msgid "Failed to initialize daemon." +msgstr "Fallo al intentar iniciar el demonio." + +#: ../src/daemon/main.c:909 +msgid "Daemon startup without any loaded modules, refusing to work." +msgstr "" +"El demonio se ha iniciado sin ningún módulo cargado, y por ello se niega a " +"funcionar." + +#: ../src/daemon/main.c:926 +msgid "Daemon startup complete." +msgstr "El demonio se inició completamente." + +#: ../src/daemon/main.c:932 +msgid "Daemon shutdown initiated." +msgstr "Comienza a apagarse el demonio." + +#: ../src/daemon/main.c:954 +msgid "Daemon terminated." +msgstr "El demonio se ha apagado." + +#: ../src/daemon/cmdline.c:115 +#, c-format +msgid "" +"%s [options]\n" +"\n" +"COMMANDS:\n" +" -h, --help Show this help\n" +" --version Show version\n" +" --dump-conf Dump default configuration\n" +" --dump-modules Dump list of available modules\n" +" --dump-resample-methods Dump available resample methods\n" +" --cleanup-shm Cleanup stale shared memory " +"segments\n" +" --start Start the daemon if it is not " +"running\n" +" -k --kill Kill a running daemon\n" +" --check Check for a running daemon (only " +"returns exit code)\n" +"\n" +"OPTIONS:\n" +" --system[=BOOL] Run as system-wide instance\n" +" -D, --daemonize[=BOOL] Daemonize after startup\n" +" --fail[=BOOL] Quit when startup fails\n" +" --high-priority[=BOOL] Try to set high nice level\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_NICE)\n" +" --realtime[=BOOL] Try to enable realtime scheduling\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_RTPRIO)\n" +" --disallow-module-loading[=BOOL] Disallow module user requested " +"module\n" +" loading/unloading after startup\n" +" --disallow-exit[=BOOL] Disallow user requested exit\n" +" --exit-idle-time=SECS Terminate the daemon when idle and " +"this\n" +" time passed\n" +" --module-idle-time=SECS Unload autoloaded modules when idle " +"and\n" +" this time passed\n" +" --scache-idle-time=SECS Unload autoloaded samples when idle " +"and\n" +" this time passed\n" +" --log-level[=LEVEL] Increase or set verbosity level\n" +" -v Increase the verbosity level\n" +" --log-target={auto,syslog,stderr} Specify the log target\n" +" --log-meta[=BOOL] Include code location in log " +"messages\n" +" --log-time[=BOOL] Include timestamps in log messages\n" +" --log-backtrace=FRAMES Include a backtrace in log messages\n" +" -p, --dl-search-path=PATH Set the search path for dynamic " +"shared\n" +" objects (plugins)\n" +" --resample-method=METHOD Use the specified resampling method\n" +" (See --dump-resample-methods for\n" +" possible values)\n" +" --use-pid-file[=BOOL] Create a PID file\n" +" --no-cpu-limit[=BOOL] Do not install CPU load limiter on\n" +" platforms that support it.\n" +" --disable-shm[=BOOL] Disable shared memory support.\n" +"\n" +"STARTUP SCRIPT:\n" +" -L, --load=\"MODULE ARGUMENTS\" Load the specified plugin module " +"with\n" +" the specified argument\n" +" -F, --file=FILENAME Run the specified script\n" +" -C Open a command line on the running " +"TTY\n" +" after startup\n" +"\n" +" -n Don't load default script file\n" +msgstr "" +"%s [opciones]\n" +"\n" +"COMANDOS:\n" +" -h, --help Muestra esta ayuda\n" +" --version Muestra la versión\n" +" --dump-conf Vuelca la configuración por defecto\n" +" --dump-modules Vuelca una lista de múdulos " +"disponibles\n" +" --dump-resample-methods Vuelca los métodos disponibles de " +"remuestreo\n" +" --cleanup-shm Limpia los segmentos de memoria " +"compartidos\n" +" --start Inicia el demonio, si es que aún no " +"está funcionando\n" +" -k --kill Detiene a un demonio funcionando\n" +" --check Verifica qué demonios están " +"funcionando\n" +"\n" +"OPCIONES:\n" +" --system[=BOOL] Se ejecuta como unica instancia a " +"nivel del sistema\n" +" -D, --daemonize[=BOOL] Se convierte en demonio luego de " +"iniciarse\n" +" --fail[=BOOL] Se cierra cuando falla el inicio\n" +" --high-priority[=BOOL] Trata de establecer un nivel de nice " +"alto\n" +" (sólo disponible como root, cuando " +"el SUID o\n" +" con RLIMIT_NICE) elevado\n" +" --realtime[=BOOL] Trata de activar planificación en " +"tiempo real\n" +" (sólo disponible como root, cuando " +"el SUID o\n" +" con RLIMIT_RTPRIO) elevado\n" +" --disallow-module-loading[=BOOL] No permite la carga/descarga del " +"módulo por el usuario\n" +" después que se haya iniciado\n" +" --disallow-exit[=BOOL] No permite la petición del usuario " +"de abandonar el programa\n" +" --exit-idle-time=SECS Desactiva un demonio cuando está " +"ocioso y\n" +" ha transcurrido esta cantidad de " +"tiempo\n" +" --module-idle-time=SECS Descarga modulos que se han cargado " +"automáticamente cuando están ociosos y\n" +" ha transcurrido esta cantidad de " +"tiempo\n" +" --scache-idle-time=SECS Descarga muestras cargadas " +"automáticamente cuando están\n" +" ociosos y ha transcurrido esta " +"cantidad de tiempo\n" +" --log-level[=LEVEL] Aumenta o define el grado de salida " +"a utilizar\n" +" -v Aumenta el grado de salida\n" +" --log-target={auto,syslog,stderr} Especifica el destino del log\n" +" -p, --dl-search-path=PATH Establece la ruta de búsqueda " +"(search path) para complementos\n" +" (plugins) compartidos\n" +" --resample-method=METHOD Utiliza un método de remuestreo " +"específico\n" +" (Ver en --dump-resample-methods los " +"valores posibles)\n" +" --use-pid-file[=BOOL] Crea el archivo PID\n" +" --no-cpu-limit[=BOOL] No instala un limitador de carga de " +"CPU en\n" +" plataformas que lo soporten.\n" +" --disable-shm[=BOOL] Deshabilita el soporte para memoria " +"compartida.\n" +"\n" +"SCRIPT DE INICIO:\n" +" -L, --load=\"ARGUMENTOS DEL MODULO\" Carga el módulo complemento con los " +"parámetros dados\n" +" -F, --file=FILENAME Ejecuta el script especificado\n" +" -C Abre una línea de comando en el TTY " +"actual después de iniciar\n" +"\n" +" -n No carga el archivo script " +"predeterminado\n" + +#: ../src/daemon/cmdline.c:247 +msgid "--daemonize expects boolean argument" +msgstr "--daemonize espera un argumento booleano" + +#: ../src/daemon/cmdline.c:254 +msgid "--fail expects boolean argument" +msgstr "--fail espera un argumento booleano" + +#: ../src/daemon/cmdline.c:264 +msgid "" +"--log-level expects log level argument (either numeric in range 0..4 or one " +"of debug, info, notice, warn, error)." +msgstr "" +"--log-level espera un argumento en el nivel del log (ya sea numérico, que " +"caiga en el rango de 0..4; ya sea uno de debug, info, notice, warn, o " +"error). " + +#: ../src/daemon/cmdline.c:276 +msgid "--high-priority expects boolean argument" +msgstr "--high-priority espera un argumento booleano" + +#: ../src/daemon/cmdline.c:283 +msgid "--realtime expects boolean argument" +msgstr "--realtime espera un argumento booleano" + +#: ../src/daemon/cmdline.c:290 +msgid "--disallow-module-loading expects boolean argument" +msgstr "--disallow-module-loading espera un argumento booleano" + +#: ../src/daemon/cmdline.c:297 +msgid "--disallow-exit expects boolean argument" +msgstr "--disallow-exit espera un argumento booleano" + +#: ../src/daemon/cmdline.c:304 +msgid "--use-pid-file expects boolean argument" +msgstr "--use pid-file espera un argumento booleano" + +#: ../src/daemon/cmdline.c:321 +msgid "Invalid log target: use either 'syslog', 'stderr' or 'auto'." +msgstr "Log target inválido: use o \"syslog\", o \"stderr\", o \"auto\"." + +#: ../src/daemon/cmdline.c:328 +msgid "--log-time expects boolean argument" +msgstr "--log-time espera un argumento booleano" + +#: ../src/daemon/cmdline.c:335 +msgid "--log-meta expects boolean argument" +msgstr "--log-meta espera un argumento booleano" + +#: ../src/daemon/cmdline.c:354 +#, c-format +msgid "Invalid resample method '%s'." +msgstr "Método de remuestreo inválido '%s'" + +#: ../src/daemon/cmdline.c:361 +msgid "--system expects boolean argument" +msgstr "--system espera un argumento booleano" + +#: ../src/daemon/cmdline.c:368 +msgid "--no-cpu-limit expects boolean argument" +msgstr "--no-cpu-limit espera un argumento booleano" + +#: ../src/daemon/cmdline.c:375 +msgid "--disable-shm expects boolean argument" +msgstr "--disable-shm espera un argumento booleano" + +#: ../src/daemon/dumpmodules.c:60 +#, c-format +msgid "Name: %s\n" +msgstr "Nombre: %s\n" + +#: ../src/daemon/dumpmodules.c:63 +#, c-format +msgid "No module information available\n" +msgstr "No existe información disponible acerca del módulo\n" + +#: ../src/daemon/dumpmodules.c:66 +#, c-format +msgid "Version: %s\n" +msgstr "Versión: %s\n" + +#: ../src/daemon/dumpmodules.c:68 +#, c-format +msgid "Description: %s\n" +msgstr "Descripción: %s\n" + +#: ../src/daemon/dumpmodules.c:70 +#, c-format +msgid "Author: %s\n" +msgstr "Autor: %s\n" + +#: ../src/daemon/dumpmodules.c:72 +#, c-format +msgid "Usage: %s\n" +msgstr "Uso: %s\n" + +#: ../src/daemon/dumpmodules.c:73 +#, c-format +msgid "Load Once: %s\n" +msgstr "Carga una vez: %s\n" + +#: ../src/daemon/dumpmodules.c:75 +#, c-format +msgid "DEPRECATION WARNING: %s\n" +msgstr "ADVERTENCIA DE COMPATIBILIDAD: %s\n" + +#: ../src/daemon/dumpmodules.c:79 +#, c-format +msgid "Path: %s\n" +msgstr "Ruta: %s\n" + +#: ../src/daemon/daemon-conf.c:232 +#, c-format +msgid "[%s:%u] Invalid log target '%s'." +msgstr "[%s:%u] Destino de log inválido '%s'." + +#: ../src/daemon/daemon-conf.c:248 +#, c-format +msgid "[%s:%u] Invalid log level '%s'." +msgstr "[%s:%u] Nivel de log inválido '%s'." + +#: ../src/daemon/daemon-conf.c:264 +#, c-format +msgid "[%s:%u] Invalid resample method '%s'." +msgstr "[%s:%u] Método de remuestreo inválido '%s'." + +#: ../src/daemon/daemon-conf.c:287 +#, c-format +msgid "[%s:%u] Invalid rlimit '%s'." +msgstr "[%s:%u] Rlimit inválido '%s'." + +#: ../src/daemon/daemon-conf.c:294 +#, c-format +msgid "[%s:%u] rlimit not supported on this platform." +msgstr "[%s:%u] Rlimit no soportado en esta plataforma." + +#: ../src/daemon/daemon-conf.c:310 +#, c-format +msgid "[%s:%u] Invalid sample format '%s'." +msgstr "[%s:%u] Formato de muestra inválido '%s'." + +#: ../src/daemon/daemon-conf.c:328 +#, c-format +msgid "[%s:%u] Invalid sample rate '%s'." +msgstr "[%s:%u] Tasa de muestra inválida '%s'." + +#: ../src/daemon/daemon-conf.c:352 +#, c-format +msgid "[%s:%u] Invalid sample channels '%s'." +msgstr "[%s:%u] Canales de muestra inválidos '%s'." + +#: ../src/daemon/daemon-conf.c:370 +#, c-format +msgid "[%s:%u] Invalid channel map '%s'." +msgstr "[%s:%u] Mapa de canal inválido '%s'." + +#: ../src/daemon/daemon-conf.c:388 +#, c-format +msgid "[%s:%u] Invalid number of fragments '%s'." +msgstr "[%s:%u] Cantidad de fragmentoa inválidos '%s'." + +#: ../src/daemon/daemon-conf.c:406 +#, c-format +msgid "[%s:%u] Invalid fragment size '%s'." +msgstr "[%s:%u] Tamaño inválido de fragmento '%s'." + +#: ../src/daemon/daemon-conf.c:424 +#, c-format +msgid "[%s:%u] Invalid nice level '%s'." +msgstr "[%s:%u] Nivel de nice inválido '%s'." + +#: ../src/daemon/daemon-conf.c:546 +#, c-format +msgid "Failed to open configuration file: %s" +msgstr "No se pudo abrir el archivo de configuración: %s" + +#: ../src/daemon/daemon-conf.c:562 +msgid "" +"The specified default channel map has a different number of channels than " +"the specified default number of channels." +msgstr "" +"El mapa de canal predeterminado especificado tiene un número de canales " +"distinto al especificado como predeterminado." + +#: ../src/daemon/daemon-conf.c:638 +#, c-format +msgid "### Read from configuration file: %s ###\n" +msgstr "### Leyendo desde el archivo de confioguración: %s ###\n" + +#: ../src/daemon/caps.c:62 +msgid "Cleaning up privileges." +msgstr "Abandonando privilegios." + +#: ../src/daemon/pulseaudio.desktop.in.h:1 +msgid "PulseAudio Sound System" +msgstr "Sistema de Sonido PulseAudio" + +#: ../src/daemon/pulseaudio.desktop.in.h:2 +msgid "Start the PulseAudio Sound System" +msgstr "Iniciar el Sistema de Sonido PulseAudio" + +#: ../src/pulse/channelmap.c:105 ../src/pulse/channelmap.c:757 +msgid "Mono" +msgstr "Mono" + +#: ../src/pulse/channelmap.c:107 +msgid "Front Center" +msgstr "Frente central" + +#: ../src/pulse/channelmap.c:108 +msgid "Front Left" +msgstr "Frente izquierdo" + +#: ../src/pulse/channelmap.c:109 +msgid "Front Right" +msgstr "Frente derecho" + +#: ../src/pulse/channelmap.c:111 +msgid "Rear Center" +msgstr "Posterior central" + +#: ../src/pulse/channelmap.c:112 +msgid "Rear Left" +msgstr "POsterior izquierdo" + +#: ../src/pulse/channelmap.c:113 +msgid "Rear Right" +msgstr "POsterior derecho" + +#: ../src/pulse/channelmap.c:115 +msgid "Low Frequency Emmiter" +msgstr "Emisor de baja frecuencia" + +#: ../src/pulse/channelmap.c:117 +msgid "Front Left-of-center" +msgstr "Frente izquierdo del centro" + +#: ../src/pulse/channelmap.c:118 +msgid "Front Right-of-center" +msgstr "Frente derecho del centro" + +#: ../src/pulse/channelmap.c:120 +msgid "Side Left" +msgstr "Lateral izquierdo" + +#: ../src/pulse/channelmap.c:121 +msgid "Side Right" +msgstr "Lateral derecho" + +#: ../src/pulse/channelmap.c:123 +msgid "Auxiliary 0" +msgstr "Auxiliar 0" + +#: ../src/pulse/channelmap.c:124 +msgid "Auxiliary 1" +msgstr "Auxiliar 1" + +#: ../src/pulse/channelmap.c:125 +msgid "Auxiliary 2" +msgstr "Auxiliar 2" + +#: ../src/pulse/channelmap.c:126 +msgid "Auxiliary 3" +msgstr "Auxiliar 3" + +#: ../src/pulse/channelmap.c:127 +msgid "Auxiliary 4" +msgstr "Auxiliar 4" + +#: ../src/pulse/channelmap.c:128 +msgid "Auxiliary 5" +msgstr "Auxiliar 5" + +#: ../src/pulse/channelmap.c:129 +msgid "Auxiliary 6" +msgstr "Auxiliar 6" + +#: ../src/pulse/channelmap.c:130 +msgid "Auxiliary 7" +msgstr "Auxiliar 7" + +#: ../src/pulse/channelmap.c:131 +msgid "Auxiliary 8" +msgstr "Auxiliar 8" + +#: ../src/pulse/channelmap.c:132 +msgid "Auxiliary 9" +msgstr "Auxiliar 9" + +#: ../src/pulse/channelmap.c:133 +msgid "Auxiliary 10" +msgstr "Auxiliar 10" + +#: ../src/pulse/channelmap.c:134 +msgid "Auxiliary 11" +msgstr "Auxiliar 11" + +#: ../src/pulse/channelmap.c:135 +msgid "Auxiliary 12" +msgstr "Auxiliar 12" + +#: ../src/pulse/channelmap.c:136 +msgid "Auxiliary 13" +msgstr "Auxiliar 13" + +#: ../src/pulse/channelmap.c:137 +msgid "Auxiliary 14" +msgstr "Auxiliar 14" + +#: ../src/pulse/channelmap.c:138 +msgid "Auxiliary 15" +msgstr "Auxiliar 15" + +#: ../src/pulse/channelmap.c:139 +msgid "Auxiliary 16" +msgstr "Auxiliar 16" + +#: ../src/pulse/channelmap.c:140 +msgid "Auxiliary 17" +msgstr "Auxiliar 17" + +#: ../src/pulse/channelmap.c:141 +msgid "Auxiliary 18" +msgstr "Auxiliar 18" + +#: ../src/pulse/channelmap.c:142 +msgid "Auxiliary 19" +msgstr "Auxiliar 19" + +#: ../src/pulse/channelmap.c:143 +msgid "Auxiliary 20" +msgstr "Auxiliar 20" + +#: ../src/pulse/channelmap.c:144 +msgid "Auxiliary 21" +msgstr "Auxiliar 21" + +#: ../src/pulse/channelmap.c:145 +msgid "Auxiliary 22" +msgstr "Auxiliar 22" + +#: ../src/pulse/channelmap.c:146 +msgid "Auxiliary 23" +msgstr "Auxiliar 23" + +#: ../src/pulse/channelmap.c:147 +msgid "Auxiliary 24" +msgstr "Auxiliar 24" + +#: ../src/pulse/channelmap.c:148 +msgid "Auxiliary 25" +msgstr "Auxiliar 25" + +#: ../src/pulse/channelmap.c:149 +msgid "Auxiliary 26" +msgstr "Auxiliar 26" + +#: ../src/pulse/channelmap.c:150 +msgid "Auxiliary 27" +msgstr "Auxiliar 27" + +#: ../src/pulse/channelmap.c:151 +msgid "Auxiliary 28" +msgstr "Auxiliar 28" + +#: ../src/pulse/channelmap.c:152 +msgid "Auxiliary 29" +msgstr "Auxiliar 29" + +#: ../src/pulse/channelmap.c:153 +msgid "Auxiliary 30" +msgstr "Auxiliar 30" + +#: ../src/pulse/channelmap.c:154 +msgid "Auxiliary 31" +msgstr "Auxiliar 31" + +#: ../src/pulse/channelmap.c:156 +msgid "Top Center" +msgstr "Central superior" + +#: ../src/pulse/channelmap.c:158 +msgid "Top Front Center" +msgstr "Central frontal superior" + +#: ../src/pulse/channelmap.c:159 +msgid "Top Front Left" +msgstr "Frontal superior izquierdo" + +#: ../src/pulse/channelmap.c:160 +msgid "Top Front Right" +msgstr "Frontal superior derecho" + +#: ../src/pulse/channelmap.c:162 +msgid "Top Rear Center" +msgstr "Posterior central superior " + +#: ../src/pulse/channelmap.c:163 +msgid "Top Rear Left" +msgstr "Posterior izquierdo superior" + +#: ../src/pulse/channelmap.c:164 +msgid "Top Rear Right" +msgstr "Posterior derecho superior" + +#: ../src/pulse/channelmap.c:484 ../src/pulse/sample.c:170 +#: ../src/pulse/volume.c:295 ../src/pulse/volume.c:321 +#: ../src/pulse/volume.c:341 ../src/pulse/volume.c:371 +msgid "(invalid)" +msgstr "(inválido)" + +#: ../src/pulse/channelmap.c:761 +msgid "Stereo" +msgstr "Estéreo" + +#: ../src/pulse/channelmap.c:766 +msgid "Surround 4.0" +msgstr "Envolvente 4.0" + +#: ../src/pulse/channelmap.c:772 +msgid "Surround 4.1" +msgstr "Envolvente 4.1" + +#: ../src/pulse/channelmap.c:778 +msgid "Surround 5.0" +msgstr "Envolvente 5.0" + +#: ../src/pulse/channelmap.c:784 +msgid "Surround 5.1" +msgstr "Envolvente 5.1" + +#: ../src/pulse/channelmap.c:791 +msgid "Surround 7.1" +msgstr "Envolvente 7.1" + +#: ../src/pulse/error.c:43 +msgid "OK" +msgstr "OK" + +#: ../src/pulse/error.c:44 +msgid "Access denied" +msgstr "Acceso negado" + +#: ../src/pulse/error.c:45 +msgid "Unknown command" +msgstr "Comando desconocido" + +#: ../src/pulse/error.c:46 +msgid "Invalid argument" +msgstr "Argumento inválido" + +#: ../src/pulse/error.c:47 +msgid "Entity exists" +msgstr "Entidad existente" + +#: ../src/pulse/error.c:48 +msgid "No such entity" +msgstr "No existe tal entidad" + +#: ../src/pulse/error.c:49 +msgid "Connection refused" +msgstr "Conexión negada" + +#: ../src/pulse/error.c:50 +msgid "Protocol error" +msgstr "Error de protocolo" + +#: ../src/pulse/error.c:51 +msgid "Timeout" +msgstr "Timeout" + +#: ../src/pulse/error.c:52 +msgid "No authorization key" +msgstr "Sin hay llave de autorización" + +#: ../src/pulse/error.c:53 +msgid "Internal error" +msgstr "Error interno" + +#: ../src/pulse/error.c:54 +msgid "Connection terminated" +msgstr "Conexión finalizada" + +#: ../src/pulse/error.c:55 +msgid "Entity killed" +msgstr "Entidad terminada" + +#: ../src/pulse/error.c:56 +msgid "Invalid server" +msgstr "Servidor inválido" + +#: ../src/pulse/error.c:57 +msgid "Module initalization failed" +msgstr "Falló la inicialización del módulo" + +#: ../src/pulse/error.c:58 +msgid "Bad state" +msgstr "Mal estado" + +#: ../src/pulse/error.c:59 +msgid "No data" +msgstr "Sin datos" + +#: ../src/pulse/error.c:60 +msgid "Incompatible protocol version" +msgstr "Versión de protocolo incompatible" + +#: ../src/pulse/error.c:61 +msgid "Too large" +msgstr "Demasiado largo" + +#: ../src/pulse/error.c:62 +msgid "Not supported" +msgstr "No soportado" + +#: ../src/pulse/error.c:63 +msgid "Unknown error code" +msgstr "Código de error desconocido" + +#: ../src/pulse/error.c:64 +msgid "No such extension" +msgstr "No existe tal extensión" + +#: ../src/pulse/error.c:65 +msgid "Obsolete functionality" +msgstr "Funcionalidad Obsoleta" + +#: ../src/pulse/error.c:66 +msgid "Missing implementation" +msgstr "Falta implementación" + +#: ../src/pulse/error.c:67 +msgid "Client forked" +msgstr "Cliente iniciado" + +#: ../src/pulse/error.c:68 +msgid "Input/Output error" +msgstr "Error de Entrada/Salida" + +#: ../src/pulse/error.c:69 +msgid "Device or resource busy" +msgstr "Dispositivo o recurso ocupado" + +#: ../src/pulse/sample.c:172 +#, c-format +msgid "%s %uch %uHz" +msgstr "%s %uch %uHz" + +#: ../src/pulse/sample.c:184 +#, c-format +msgid "%0.1f GiB" +msgstr "%0.1f GiB" + +#: ../src/pulse/sample.c:186 +#, c-format +msgid "%0.1f MiB" +msgstr "%0.1f MiB" + +#: ../src/pulse/sample.c:188 +#, c-format +msgid "%0.1f KiB" +msgstr "%0.1f KiB" + +#: ../src/pulse/sample.c:190 +#, c-format +msgid "%u B" +msgstr "%u B" + +#: ../src/pulse/client-conf-x11.c:55 ../src/utils/pax11publish.c:100 +msgid "XOpenDisplay() failed" +msgstr "XOpenDisplay() falló" + +#: ../src/pulse/client-conf-x11.c:93 +msgid "Failed to parse cookie data" +msgstr "Fallo al analizar los datos de la cookie" + +#: ../src/pulse/client-conf.c:111 +#, c-format +msgid "Failed to open configuration file '%s': %s" +msgstr "Fallo al abrir el archivo de configuración '%s': %s" + +#: ../src/pulse/context.c:550 +msgid "No cookie loaded. Attempting to connect without." +msgstr "No se ha cargado ninguna cookie. Intentando conectar de todos modos." + +#: ../src/pulse/context.c:693 +#, c-format +msgid "fork(): %s" +msgstr "fork(): %s" + +#: ../src/pulse/context.c:748 +#, c-format +msgid "waitpid(): %s" +msgstr "waitpid(:) %s" + +#: ../src/pulse/context.c:1438 +#, c-format +msgid "Received message for unknown extension '%s'" +msgstr "Se ha recibido un mensaje para una extensión desconocida '%s'" + +#: ../src/utils/pacat.c:108 +#, c-format +msgid "Failed to drain stream: %s" +msgstr "Falló al drenar el flujo: %s" + +#: ../src/utils/pacat.c:113 +msgid "Playback stream drained." +msgstr "El flujo de reproducción ha sido drenado." + +#: ../src/utils/pacat.c:123 +msgid "Draining connection to server." +msgstr "Drenando conexión con el servidor." + +#: ../src/utils/pacat.c:136 +#, c-format +msgid "pa_stream_drain(): %s" +msgstr "pa_stream_drain(): %s" + +#: ../src/utils/pacat.c:159 +#, c-format +msgid "pa_stream_write() failed: %s" +msgstr "pa_stream_write() falló: %s" + +#: ../src/utils/pacat.c:197 +#, c-format +msgid "pa_stream_begin_write() failed: %s" +msgstr "pa_stream_write() falló: %s" + +#: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267 +#, c-format +msgid "pa_stream_peek() failed: %s" +msgstr "pa_stream_peek() falló: %s" + +#: ../src/utils/pacat.c:307 +msgid "Stream successfully created." +msgstr "Se ha creado exitosamente el flujo (stream)." + +#: ../src/utils/pacat.c:310 +#, c-format +msgid "pa_stream_get_buffer_attr() failed: %s" +msgstr "pa_stream_get_buffer_attr() falló: %s" + +#: ../src/utils/pacat.c:314 +#, c-format +msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u" +msgstr "Métrica del búfer: maxlenght=%u, tlenghth=%u, prebuf=%u, minreq=%u" + +#: ../src/utils/pacat.c:317 +#, c-format +msgid "Buffer metrics: maxlength=%u, fragsize=%u" +msgstr "Métrica del búfer: maxlenght=%u, fragsize=%u" + +#: ../src/utils/pacat.c:321 +#, c-format +msgid "Using sample spec '%s', channel map '%s'." +msgstr "Utilizando especificaciones de muestra '%s', mapa del canal '%s'." + +#: ../src/utils/pacat.c:325 +#, c-format +msgid "Connected to device %s (%u, %ssuspended)." +msgstr "Conectado al dispositivo %s (%u, %ssuspended)." + +#: ../src/utils/pacat.c:335 +#, c-format +msgid "Stream error: %s" +msgstr "Error de flujo: %s" + +#: ../src/utils/pacat.c:345 +#, c-format +msgid "Stream device suspended.%s" +msgstr "Dispositivo de flujo suspendido.%s" + +#: ../src/utils/pacat.c:347 +#, c-format +msgid "Stream device resumed.%s" +msgstr "Dispositivo de flujo reestablecido.%s" + +#: ../src/utils/pacat.c:355 +#, c-format +msgid "Stream underrun.%s" +msgstr "Flujo agotado.%s" + +#: ../src/utils/pacat.c:362 +#, c-format +msgid "Stream overrun.%s" +msgstr "Flujo saturado.%s" + +#: ../src/utils/pacat.c:369 +#, c-format +msgid "Stream started.%s" +msgstr "Flujo iniciado.%s" + +#: ../src/utils/pacat.c:376 +#, c-format +msgid "Stream moved to device %s (%u, %ssuspended).%s" +msgstr "Fujo trasladado al dispositivo %s (%u, %ssuspended).%s" + +#: ../src/utils/pacat.c:376 +msgid "not " +msgstr "no" + +#: ../src/utils/pacat.c:383 +#, c-format +msgid "Stream buffer attributes changed.%s" +msgstr "Los atributos del búfer de flujo han cambiado.%s" + +#: ../src/utils/pacat.c:415 +#, c-format +msgid "Connection established.%s" +msgstr "Conexión establecida.%s" + +#: ../src/utils/pacat.c:418 +#, c-format +msgid "pa_stream_new() failed: %s" +msgstr "pa_stream_new() falló: %s" + +#: ../src/utils/pacat.c:450 +#, c-format +msgid "pa_stream_connect_playback() failed: %s" +msgstr "pa_stream_connect_playback() falló: %s" + +#: ../src/utils/pacat.c:456 +#, c-format +msgid "pa_stream_connect_record() failed: %s" +msgstr "pa_stream_connect_record() falló: %s" + +#: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857 +#, c-format +msgid "Connection failure: %s" +msgstr "Error en la conexión: %s" + +#: ../src/utils/pacat.c:503 +msgid "Got EOF." +msgstr "Se tiene EOF." + +#: ../src/utils/pacat.c:540 +#, c-format +msgid "write() failed: %s" +msgstr "write() falló: %s" + +#: ../src/utils/pacat.c:561 +msgid "Got signal, exiting." +msgstr "Hay señal, saliendo (exiting)." + +#: ../src/utils/pacat.c:575 +#, c-format +msgid "Failed to get latency: %s" +msgstr "No se pudo obtener latencia: %s" + +#: ../src/utils/pacat.c:580 +#, c-format +msgid "Time: %0.3f sec; Latency: %0.0f usec." +msgstr "Tiempo: %0.3f seg; Latencia: %0.0f useg." + +#: ../src/utils/pacat.c:599 +#, c-format +msgid "pa_stream_update_timing_info() failed: %s" +msgstr "pa_stream_update_timing_info() falló: %s" + +#: ../src/utils/pacat.c:609 +#, c-format +msgid "" +"%s [options]\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -r, --record Create a connection for recording\n" +" -p, --playback Create a connection for playback\n" +"\n" +" -v, --verbose Enable verbose operations\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -d, --device=DEVICE The name of the sink/source to " +"connect to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" +" --stream-name=NAME How to call this stream on the " +"server\n" +" --volume=VOLUME Specify the initial (linear) volume " +"in range 0...65536\n" +" --rate=SAMPLERATE The sample rate in Hz (defaults to " +"44100)\n" +" --format=SAMPLEFORMAT The sample type, one of s16le, " +"s16be, u8, float32le,\n" +" float32be, ulaw, alaw, s32le, s32be, " +"s24le, s24be,\n" +" s24-32le, s24-32be (defaults to " +"s16ne)\n" +" --channels=CHANNELS The number of channels, 1 for mono, " +"2 for stereo\n" +" (defaults to 2)\n" +" --channel-map=CHANNELMAP Channel map to use instead of the " +"default\n" +" --fix-format Take the sample format from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-rate Take the sampling rate from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-channels Take the number of channels and the " +"channel map\n" +" from the sink the stream is being " +"connected to.\n" +" --no-remix Don't upmix or downmix channels.\n" +" --no-remap Map channels by index instead of " +"name.\n" +" --latency=BYTES Request the specified latency in " +"bytes.\n" +" --process-time=BYTES Request the specified process time " +"per request in bytes.\n" +" --property=PROPERTY=VALUE Set the specified property to the " +"specified value.\n" +" --raw Record/play raw PCM data.\n" +" --file-format=FFORMAT Record/play formatted PCM data.\n" +" --list-file-formats List available file formats.\n" +msgstr "" +"%s [opciones]\n" +"\n" +" -h, --help Muestra esta ayuda\n" +" --version Muestra la versión\n" +"\n" +" -r, --record Crea una conexión para grabar\n" +" -p, --playback Create a connection for playback\n" +"\n" +" -v, --verbose Habilita operaciones con vocabulario " +"más detallado\n" +"\n" +" -s, --server=SERVER El nombre del servidor con el que " +"conectarse\n" +" -d, --device=DEVICE El nombre del sumidero/fuente a la " +"que conectarse\n" +" -n, --client-name=NAME Cómo llamar a este cliente en el " +"servidor\n" +" --stream-name=NAME Cómo llamar a este flujo en el " +"servidor\n" +" --volume=VOLUME Especifica el salida inicial " +"(linear) de volumen dentro del rango 0...65536\n" +" --rate=SAMPLERATE Tasa de muestra en Hz (establecida " +"en 44100 por defecto)\n" +" --format=SAMPLEFORMAT El tipo de ejemplo, alguno entre " +"s16le, s16be, u8, float32le,\n" +" float32be, ulaw, alaw, s32le, s32be " +"(establecido en s16ne por defecto)\n" +" --channels=CHANNELS La cantidad de canales, 1 para mono, " +"2 para stereo\n" +" (establecido en 2 por defecto)\n" +" --channel-map=CHANNELMAP Mapeo de canales a ser usado en " +"lugar del establecido por defecto\n" +" --fix-format Obtener el formato de ejemplo desde " +"el sumidero al que el flujo\n" +" se ha conectado.\n" +" --fix-rate Obtiene la tasa de ejemplo desde el " +"destino al que el flujo\n" +" se ha conectado.\n" +" --fix-channels Obtener el mapa y la cantidad de " +"canales\n" +" desde el sumidero al que el flujo se " +"ha conectado.\n" +" --no-remix No realiza un upmix o un downmix de " +"los canales.\n" +" --no-remap Mapea canales por índices en lugar " +"de por nombres.\n" +" --latency=BYTES Solicita la latencia especificada en " +"bytes.\n" +" --process-time=BYTES Solicita los procesos de tiempo por " +"pedido especificados en bytes.\n" +" --property=PROPERTY=VALUE Estabelce la propiedad especificada " +"al valor especificado.\n" +" --raw Graba/reproduce datos PCM con " +"formato raw.\n" +" --file-format=FFORMAT Graba/reproduce datos PCM " +"formateados.\n" +" --list-file-formats Muestra una lista con los formatos " +"de archivo disponibles.\n" + +#: ../src/utils/pacat.c:731 +#, c-format +msgid "" +"pacat %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pacat %s\n" +"Compilado con libpulse %s\n" +"Linkeado con libpulse %s\n" + +#: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953 +#, c-format +msgid "Invalid client name '%s'" +msgstr "Nombre de cliente '%s' inválido" + +#: ../src/utils/pacat.c:779 +#, c-format +msgid "Invalid stream name '%s'" +msgstr "Nombre de flujo '%s' inválido" + +#: ../src/utils/pacat.c:816 +#, c-format +msgid "Invalid channel map '%s'" +msgstr "Mapa de canales '%s' inválido" + +#: ../src/utils/pacat.c:845 +#, c-format +msgid "Invalid latency specification '%s'" +msgstr "Especificación de latencia '%s' inválida" + +#: ../src/utils/pacat.c:852 +#, c-format +msgid "Invalid process time specification '%s'" +msgstr "Especificación de tiempo de proceso '%s' inválida" + +#: ../src/utils/pacat.c:864 +#, c-format +msgid "Invalid property '%s'" +msgstr "Propiedad '%s' inválida" + +#: ../src/utils/pacat.c:881 +#, c-format +msgid "Unknown file format %s." +msgstr "Formato de archivo desconocido %s." + +#: ../src/utils/pacat.c:900 +msgid "Invalid sample specification" +msgstr "Especificación de muestra inválida" + +#: ../src/utils/pacat.c:910 +#, c-format +msgid "open(): %s" +msgstr "open() %s" + +#: ../src/utils/pacat.c:915 +#, c-format +msgid "dup2(): %s" +msgstr "dup2(): %s" + +#: ../src/utils/pacat.c:922 +msgid "Too many arguments." +msgstr "Demasiados argumentos." + +#: ../src/utils/pacat.c:933 +msgid "Failed to generate sample specification for file." +msgstr "Falló al generar especificación de ejemplo para el archivo." + +#: ../src/utils/pacat.c:953 +msgid "Failed to open audio file." +msgstr "Falló al abrir el archivo de sonido." + +#: ../src/utils/pacat.c:959 +msgid "" +"Warning: specified sample specification will be overwritten with " +"specification from file." +msgstr "" +"Aviso: el ejemplo de especificación indicado será sobreescrito con las " +"especificaciones del archivo." + +#: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997 +msgid "Failed to determine sample specification from file." +msgstr "Falló al determinar especificación de ejemplo del archivo." + +#: ../src/utils/pacat.c:971 +msgid "Warning: Failed to determine channel map from file." +msgstr "Aviso: Falló al determinar el mapeo del canal desde el archivo." + +#: ../src/utils/pacat.c:982 +msgid "Channel map doesn't match sample specification" +msgstr "El mapa del canal no se corresponde con la especificación de muestra" + +#: ../src/utils/pacat.c:993 +msgid "Warning: failed to write channel map to file." +msgstr "Aviso: Faló al escribir el mapeo del canal en el archivo." + +#: ../src/utils/pacat.c:1008 +#, c-format +msgid "" +"Opening a %s stream with sample specification '%s' and channel map '%s'." +msgstr "" +"Abriendo un flujo %s con especificación de muestra '%s' y mapeo de canal '%" +"s'." + +#: ../src/utils/pacat.c:1009 +msgid "recording" +msgstr "grabando" + +#: ../src/utils/pacat.c:1009 +msgid "playback" +msgstr "playback" + +#: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267 +msgid "pa_mainloop_new() failed." +msgstr "pa_mainloop_new() falló." + +#: ../src/utils/pacat.c:1054 +msgid "io_new() failed." +msgstr "io_new() falló." + +#: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279 +msgid "pa_context_new() failed." +msgstr "pa_context_new() falló." + +#: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285 +#, c-format +msgid "pa_context_connect() failed: %s" +msgstr "pa_context_connect() falló: %s" + +#: ../src/utils/pacat.c:1075 +msgid "pa_context_rttime_new() failed." +msgstr "pa_context_rttime_new() falló." + +#: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290 +msgid "pa_mainloop_run() failed." +msgstr "pa_mainloop_run() falló." + +#: ../src/utils/pasuspender.c:81 +#, c-format +msgid "fork(): %s\n" +msgstr "fork(): %s\n" + +#: ../src/utils/pasuspender.c:92 +#, c-format +msgid "execvp(): %s\n" +msgstr "execvp(): %s\n" + +#: ../src/utils/pasuspender.c:109 +#, c-format +msgid "Failure to suspend: %s\n" +msgstr "Error al suspender: %s\n" + +#: ../src/utils/pasuspender.c:124 +#, c-format +msgid "Failure to resume: %s\n" +msgstr "Error al continuar: %s\n" + +#: ../src/utils/pasuspender.c:147 +#, c-format +msgid "WARNING: Sound server is not local, not suspending.\n" +msgstr "AVISO: El servidor de sonido no es local, no se suspende.\n" + +#: ../src/utils/pasuspender.c:159 +#, c-format +msgid "Connection failure: %s\n" +msgstr "Error en la conexión: %s\n" + +#: ../src/utils/pasuspender.c:176 +#, c-format +msgid "Got SIGINT, exiting.\n" +msgstr "Hay SIGINT, saliendo.\n" + +#: ../src/utils/pasuspender.c:194 +#, c-format +msgid "WARNING: Child process terminated by signal %u\n" +msgstr "AVISO: El proceso niño terminado por la señal %u\n" + +#: ../src/utils/pasuspender.c:212 +#, c-format +msgid "" +"%s [options] ... \n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +"\n" +msgstr "" +"%s [opciones] ... \n" +"\n" +" -h, --help Muestra esta ayuda\n" +" --version Muestra la versión\n" +" -s, --server=SERVER El nombre del servidor con el que " +"conectarse\n" +"\n" + +#: ../src/utils/pasuspender.c:248 +#, c-format +msgid "" +"pasuspender %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pasuspender %s\n" +"Compilado con libpulse %s\n" +"Linkeado con libpulse %s\n" + +#: ../src/utils/pasuspender.c:277 +#, c-format +msgid "pa_mainloop_new() failed.\n" +msgstr "pa_mainloop_new() falló.\n" + +#: ../src/utils/pasuspender.c:290 +#, c-format +msgid "pa_context_new() failed.\n" +msgstr "pa_context_new() falló.\n" + +#: ../src/utils/pasuspender.c:298 +#, c-format +msgid "pa_mainloop_run() failed.\n" +msgstr "pa_mainloop_run() falló.\n" + +#: ../src/utils/pactl.c:135 +#, c-format +msgid "Failed to get statistics: %s" +msgstr "Error al intentar obtener estadísticas: %s" + +#: ../src/utils/pactl.c:141 +#, c-format +msgid "Currently in use: %u blocks containing %s bytes total.\n" +msgstr "Actualmente en uso: %u bloques conteniendo %s bytes en total.\n" + +#: ../src/utils/pactl.c:144 +#, c-format +msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n" +msgstr "" +"Ubicados durante a lo largo del tiempo: %u bloques conteniendo %s bytes en " +"total.\n" + +#: ../src/utils/pactl.c:147 +#, c-format +msgid "Sample cache size: %s\n" +msgstr "Tamaño del cache de muestra: %s\n" + +#: ../src/utils/pactl.c:156 +#, c-format +msgid "Failed to get server information: %s" +msgstr "Error al intentar obtener información del servidor: %s" + +#: ../src/utils/pactl.c:164 +#, c-format +msgid "" +"User name: %s\n" +"Host Name: %s\n" +"Server Name: %s\n" +"Server Version: %s\n" +"Default Sample Specification: %s\n" +"Default Channel Map: %s\n" +"Default Sink: %s\n" +"Default Source: %s\n" +"Cookie: %08x\n" +msgstr "" +"Nombre de usuario: %s\n" +"Nombre del equipo: %s\n" +"Nombre del servidor: %s\n" +"Versión del servidor: %s\n" +"Especificación de muestra por defecto: %s\n" +"Mapa de canal por defecto: %s\n" +"Sumidero por defecto: %s\n" +"Fuente por defecto: %s\n" +"Cookie: %08x\n" + +#: ../src/utils/pactl.c:205 +#, c-format +msgid "Failed to get sink information: %s" +msgstr "Error al intentar obtener información del sumidero: %s" + +#: ../src/utils/pactl.c:221 +#, c-format +msgid "" +"Sink #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor Source: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Sumidero #%u\n" +"\tEstado: %s\n" +"\tNombre: %s\n" +"\tDescripción: %s\n" +"\tControlador: %s\n" +"\tEspecificación de la Muestra: %s\n" +"\tMapa del Canal: %s\n" +"\tMódulo Dueño: %u\n" +"\tMudo: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tVolume Base: %s%s%s\n" +"\tMonitorear Fuente: %s\n" +"\tLatencia: %0.0f usec, configurado %0.0f useg\n" +"\tBanderas: %s%s%s%s%s%s\n" +"\tPropiedades:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360 +#, c-format +msgid "\tPorts:\n" +msgstr "\tPuertos:\n" + +#: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366 +#, c-format +msgid "\tActive Port: %s\n" +msgstr "\tPuerto Activo: %s\n" + +#: ../src/utils/pactl.c:297 +#, c-format +msgid "Failed to get source information: %s" +msgstr "Error al intentar obtener información de la fuente: %s" + +#: ../src/utils/pactl.c:313 +#, c-format +msgid "" +"Source #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor of Sink: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Fuente #%u\n" +"\tEstado: %s\n" +"\tNombre: %s\n" +"\tDescripción: %s\n" +"\tControlador: %s\n" +"\tEspecificación de la Muestra: %s\n" +"\tMapa del Canal: %s\n" +"\tMódulo Dueño: %u\n" +"\tMudo: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tVolume Base: %s%s%s\n" +"\tMonitoreo del Sumidero: %s\n" +"\tLatencia: %0.0f usec, configurado %0.0f useg\n" +"\tBanderas: %s%s%s%s%s%s\n" +"\tPropiedades:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:345 ../src/utils/pactl.c:401 ../src/utils/pactl.c:436 +#: ../src/utils/pactl.c:473 ../src/utils/pactl.c:532 ../src/utils/pactl.c:533 +#: ../src/utils/pactl.c:543 ../src/utils/pactl.c:587 ../src/utils/pactl.c:588 +#: ../src/utils/pactl.c:594 ../src/utils/pactl.c:637 ../src/utils/pactl.c:638 +#: ../src/utils/pactl.c:645 +msgid "n/a" +msgstr "n/a" + +#: ../src/utils/pactl.c:375 +#, c-format +msgid "Failed to get module information: %s" +msgstr "Error al intentar obtener información del módulo: %s" + +#: ../src/utils/pactl.c:393 +#, c-format +msgid "" +"Module #%u\n" +"\tName: %s\n" +"\tArgument: %s\n" +"\tUsage counter: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Módulo #%u\n" +"\tNombre: %s\n" +"\tArgumento: %s\n" +"\tContador de uso: %s\n" +"\tPropiedades:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:412 +#, c-format +msgid "Failed to get client information: %s" +msgstr "Error al intentar obtener información del cliente: %s" + +#: ../src/utils/pactl.c:430 +#, c-format +msgid "" +"Client #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Cliente #%u\n" +"\tControlador: %s\n" +"\tMódulo dueño: %s\n" +"\tPropiedades:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:447 +#, c-format +msgid "Failed to get card information: %s" +msgstr "Fallo al obtener la información de la placa: %s" + +#: ../src/utils/pactl.c:465 +#, c-format +msgid "" +"Card #%u\n" +"\tName: %s\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Placa #%u\n" +"\tNombre: %s\n" +"\tControlador: %s\n" +"\tMódulo dueño: %s\n" +"\tPropiedades:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:479 +#, c-format +msgid "\tProfiles:\n" +msgstr "\tPerfiles:\n" + +#: ../src/utils/pactl.c:485 +#, c-format +msgid "\tActive Profile: %s\n" +msgstr "\tPerfil Activo: %s\n" + +#: ../src/utils/pactl.c:496 +#, c-format +msgid "Failed to get sink input information: %s" +msgstr "Error al intentar obtener información de entrada del sumidero: %s" + +#: ../src/utils/pactl.c:515 +#, c-format +msgid "" +"Sink Input #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSink: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tMute: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSink Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Entrada del sumidero #%u\n" +"\tControlador: %s\n" +"\tMódulo dueño: %s\n" +"\tCliente: %s\n" +"\tSumidero: %u\n" +"\tEspecificación de muestra: %s\n" +"\tMapa de canales: %s\n" +"\tMudo: %s\n" +"\tVolumen: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tLatencia del búfer: %0.0f useg\n" +"\tLatencia del sumidero: %0.0f useg\n" +"\tMétodo de remuestreo: %s\n" +"\tPropiedades:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:554 +#, c-format +msgid "Failed to get source output information: %s" +msgstr "Falló al obtener información de salida de la fuente: %s" + +#: ../src/utils/pactl.c:574 +#, c-format +msgid "" +"Source Output #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSource: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSource Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Salida de la fuente #%u\n" +"\tControlador: %s\n" +"\tMódulo dueño: %s\n" +"\tCliente: %s\n" +"\tFuente: %u\n" +"\tEspecificación de muestra: %s\n" +"\tMapa del canal: %s\n" +"\tLatencia del búfer: %0.0f useg\n" +"\tLatencia de la fuente: %0.0f useg\n" +"\tMétodo de remuestreo: %s\n" +"\tPropiedades:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:605 +#, c-format +msgid "Failed to get sample information: %s" +msgstr "Falló al obtener información de la muestra: %s" + +#: ../src/utils/pactl.c:623 +#, c-format +msgid "" +"Sample #%u\n" +"\tName: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tDuration: %0.1fs\n" +"\tSize: %s\n" +"\tLazy: %s\n" +"\tFilename: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Muestra #%u\n" +"\tNombre: %s\n" +"\tEspecificaciones de la muestra: %s\n" +"\tMapa del canal: %s\n" +"\tVolumen: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tDuración: %0.1fs\n" +"\tTamaño: %s\n" +"\tLazy: %s\n" +"\tNombre del archivo: %s\n" +"\tPropiedades:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663 +#, c-format +msgid "Failure: %s" +msgstr "Falla: %s" + +#: ../src/utils/pactl.c:687 +#, c-format +msgid "Failed to upload sample: %s" +msgstr "Falló al subir muestra: %s" + +#: ../src/utils/pactl.c:704 +msgid "Premature end of file" +msgstr "Fin de archivo prematuro" + +#: ../src/utils/pactl.c:863 +msgid "Got SIGINT, exiting." +msgstr "Hay un SIGINT, saliendo." + +#: ../src/utils/pactl.c:869 +#, c-format +msgid "" +"%s [options] stat\n" +"%s [options] list\n" +"%s [options] exit\n" +"%s [options] upload-sample FILENAME [NAME]\n" +"%s [options] play-sample NAME [SINK]\n" +"%s [options] remove-sample NAME\n" +"%s [options] move-sink-input SINKINPUT SINK\n" +"%s [options] move-source-output SOURCEOUTPUT SOURCE\n" +"%s [options] load-module NAME [ARGS ...]\n" +"%s [options] unload-module MODULE\n" +"%s [options] suspend-sink SINK 1|0\n" +"%s [options] suspend-source SOURCE 1|0\n" +"%s [options] set-card-profile CARD PROFILE\n" +"%s [options] set-sink-port SINK PORT\n" +"%s [options] set-source-port SOURCE PORT\n" +"%s [options] set-sink-volume SINK VOLUME\n" +"%s [options] set-source-volume SOURCE VOLUME\n" +"%s [options] set-sink-input-volume SINKINPUT VOLUME\n" +"%s [options] set-sink-mute SINK 1|0\n" +"%s [options] set-source-mute SOURCE 1|0\n" +"%s [options] set-sink-input-mute SINKINPUT 1|0\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" +msgstr "" +"%s [opciones] stat\n" +"%s [opciones] list\n" +"%s [opciones] exit\n" +"%s [opciones] upload-sample FILENAME [NAME]\n" +"%s [opciones] play-sample NAME [SINK]\n" +"%s [opciones] remove-sample NAME\n" +"%s [opciones] move-sink-input ID SINK\n" +"%s [opciones] move-source-output ID SOURCE\n" +"%s [opciones] load-module NAME [ARGS ...]\n" +"%s [opciones] unload-module ID\n" +"%s [opciones] suspend-sink [SINK] 1|0\n" +"%s [opciones] suspend-source [SOURCE] 1|0\n" +"%s [opciones] set-card-profile [CARD] [PROFILE] \n" +"%s [opciones] set-sink-port [SINK] [PORT] \n" +"%s [opciones] set-source-port [SOURCE] [PORT] \n" +"%s [opciones] set-sink-volume SINK VOLUME\n" +"%s [opciones] set-source-volume SOURCE VOLUME\n" +"%s [opciones] set-sink-input-volume SINKINPUT VOLUME\n" +"%s [opciones] set-sink-mute SINK 1|0\n" +"%s [opciones] set-source-mute SOURCE 1|0\n" +"%s [opciones] set-sink-input-mute SINKINPUT 1|0\n" +"\n" +" -h, --help Muestra esta ayuda\n" +" --version Muestra la versión\n" +"\n" +" -s, --server=SERVER El nombre del servidor al que " +"conectarse\n" +" -n, --client-name=NAME El nombre de este cliente en el " +"servidor\n" + +#: ../src/utils/pactl.c:933 +#, c-format +msgid "" +"pactl %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pactl %s\n" +"Compilado con libpulse %s\n" +"Linked con libpulse %s\n" + +#: ../src/utils/pactl.c:979 +msgid "Please specify a sample file to load" +msgstr "Por favor, especifique un archivo de muestra a cargar" + +#: ../src/utils/pactl.c:992 +msgid "Failed to open sound file." +msgstr "Error al intentar abrir el archivo de sonido." + +#: ../src/utils/pactl.c:1004 +msgid "Warning: Failed to determine sample specification from file." +msgstr "" +"Aviso: Falló al intentar determinar especificación de la muestra desde el " +"archivo." + +#: ../src/utils/pactl.c:1014 +msgid "You have to specify a sample name to play" +msgstr "Debe especificar un nombre de muestra para reproducir" + +#: ../src/utils/pactl.c:1026 +msgid "You have to specify a sample name to remove" +msgstr "Debe especificar un nombre de muestra a eliminar" + +#: ../src/utils/pactl.c:1035 +msgid "You have to specify a sink input index and a sink" +msgstr "Debe especificar un índice para la entrada al sumidero y un sumidero" + +#: ../src/utils/pactl.c:1045 +msgid "You have to specify a source output index and a source" +msgstr "Debe especificar un índice para las salida de la fuente y una fuente" + +#: ../src/utils/pactl.c:1060 +msgid "You have to specify a module name and arguments." +msgstr "Debe especificar un nombre de módulo y los argumentos." + +#: ../src/utils/pactl.c:1080 +msgid "You have to specify a module index" +msgstr "Debe especificar un índice de módulo" + +#: ../src/utils/pactl.c:1090 +msgid "" +"You may not specify more than one sink. You have to specify a boolean value." +msgstr "" +"No puede especificar más de un sumidero. Tiene que especificar un valor " +"booleano." + +#: ../src/utils/pactl.c:1103 +msgid "" +"You may not specify more than one source. You have to specify a boolean " +"value." +msgstr "" +"No puede especificar más de una fuente. Tiene que especificar un valor " +"booleano." + +#: ../src/utils/pactl.c:1115 +msgid "You have to specify a card name/index and a profile name" +msgstr "Debe especificar un nombre/índice de placa y un nombre de perfil" + +#: ../src/utils/pactl.c:1126 +msgid "You have to specify a sink name/index and a port name" +msgstr "Debe especificar un nombre/índice de sumidero y un nombre de puerto" + +#: ../src/utils/pactl.c:1137 +msgid "You have to specify a source name/index and a port name" +msgstr "Debe especificar un nombre/índice de fuente y un nombre de puerto" + +#: ../src/utils/pactl.c:1149 +msgid "You have to specify a sink name/index and a volume" +msgstr "Debe especificar un nombre/índice de sumidero y el volumen" + +#: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171 +#: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209 +#: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248 +msgid "Invalid volume specification" +msgstr "Especificación de volumen inválida" + +#: ../src/utils/pactl.c:1166 +msgid "You have to specify a source name/index and a volume" +msgstr "Debe especificar un nombre/índice de fuente y un volumen" + +#: ../src/utils/pactl.c:1183 +msgid "You have to specify a sink input index and a volume" +msgstr "Debe especificar un índice de sumidero y un volumen" + +#: ../src/utils/pactl.c:1188 +msgid "Invalid sink input index" +msgstr "Indice de entrada a sumidero inválido" + +#: ../src/utils/pactl.c:1204 +msgid "You have to specify a sink name/index and a mute boolean" +msgstr "Debe especificar un nombre/índice de sumidero y un booleano para mudo" + +#: ../src/utils/pactl.c:1221 +msgid "You have to specify a source name/index and a mute boolean" +msgstr "Debe especificar un nombre/índice de fuente y un booleano para mudo" + +#: ../src/utils/pactl.c:1238 +msgid "You have to specify a sink input index and a mute boolean" +msgstr "" +"Debe especificar un índice de entrada a sumidero y un booleano para mudo" + +#: ../src/utils/pactl.c:1243 +msgid "Invalid sink input index specification" +msgstr "Especificación de índice de entrada a sumidero inválida" + +#: ../src/utils/pactl.c:1262 +msgid "No valid command specified." +msgstr "No se ha especificado ningún comando válido." + +#: ../src/utils/pax11publish.c:61 +#, c-format +msgid "" +"%s [-D display] [-S server] [-O sink] [-I source] [-c file] [-d|-e|-i|-r]\n" +"\n" +" -d Show current PulseAudio data attached to X11 display (default)\n" +" -e Export local PulseAudio data to X11 display\n" +" -i Import PulseAudio data from X11 display to local environment " +"variables and cookie file.\n" +" -r Remove PulseAudio data from X11 display\n" +msgstr "" +"%s [-D display] [-S server] [-O sink] [-I source] [-c file] [-d|-e|-i|-r]\n" +"\n" +" -d Muestra los datos actuales de PulseAudio asociados en un display X11 " +"(por defecto)\n" +" -e Exporta los datos locales de PulseAudio a un display X11\n" +" -i Importa los datos de PulseAudio de un display X11 hacia las variables " +"del entorno local y el archivo de cookies.\n" +" -r Elimina todo dato de PulseAudio de un display X11\n" + +#: ../src/utils/pax11publish.c:94 +#, c-format +msgid "Failed to parse command line.\n" +msgstr "Error al interpretar una línea de comando.\n" + +#: ../src/utils/pax11publish.c:108 +#, c-format +msgid "Server: %s\n" +msgstr "Servidor: %s\n" + +#: ../src/utils/pax11publish.c:110 +#, c-format +msgid "Source: %s\n" +msgstr "Fuente: %s\n" + +#: ../src/utils/pax11publish.c:112 +#, c-format +msgid "Sink: %s\n" +msgstr "Destino: %s\n" + +#: ../src/utils/pax11publish.c:114 +#, c-format +msgid "Cookie: %s\n" +msgstr "Cookie: %s\n" + +#: ../src/utils/pax11publish.c:132 +#, c-format +msgid "Failed to parse cookie data\n" +msgstr "Error al intepretar datos de cookie\n" + +#: ../src/utils/pax11publish.c:137 +#, c-format +msgid "Failed to save cookie data\n" +msgstr "Error al intentar guardar datos de cookie\n" + +#: ../src/utils/pax11publish.c:152 +#, c-format +msgid "Failed to load client configuration file.\n" +msgstr "Error al intentar cargar el archivo de configuración del cliente.\n" + +#: ../src/utils/pax11publish.c:157 +#, c-format +msgid "Failed to read environment configuration data.\n" +msgstr "Error al intentar leer datos de configuración de entorno.\n" + +#: ../src/utils/pax11publish.c:174 +#, c-format +msgid "Failed to get FQDN.\n" +msgstr "Error al obtener FQDN.\n" + +#: ../src/utils/pax11publish.c:194 +#, c-format +msgid "Failed to load cookie data\n" +msgstr "Error al cargar datos de cookie\n" + +#: ../src/utils/pax11publish.c:211 +#, c-format +msgid "Not yet implemented.\n" +msgstr "Aún no se ha implementado.\n" + +#: ../src/utils/pacmd.c:69 +msgid "No PulseAudio daemon running, or not running as session daemon." +msgstr "" +"El demonio PulseAudio no está ejecutándose, o no se está ejecutando como un " +"demonio de sesión." + +#: ../src/utils/pacmd.c:74 +#, c-format +msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s" +msgstr "socket(PF_UNIX, SOCK_STREAM, 0): %s" + +#: ../src/utils/pacmd.c:91 +#, c-format +msgid "connect(): %s" +msgstr "connect(): %s" + +#: ../src/utils/pacmd.c:99 +msgid "Failed to kill PulseAudio daemon." +msgstr "Error al intentar detener el demonio de PulseAudio." + +#: ../src/utils/pacmd.c:107 +msgid "Daemon not responding." +msgstr "El demonio no responde." + +#: ../src/utils/pacmd.c:161 +#, c-format +msgid "poll(): %s" +msgstr "poll(): %s" + +#: ../src/utils/pacmd.c:171 ../src/utils/pacmd.c:188 +#, c-format +msgid "read(): %s" +msgstr "read(): %s" + +#: ../src/utils/pacmd.c:207 ../src/utils/pacmd.c:223 +#, c-format +msgid "write(): %s" +msgstr "write(): %s" + +#: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:219 +msgid "Cannot access autospawn lock." +msgstr "No se puede acceder al candado de autogeneración." + +#: ../src/modules/alsa/alsa-sink.c:530 ../src/modules/alsa/alsa-sink.c:689 +#, c-format +msgid "" +"ALSA woke us up to write new data to the device, but there was actually " +"nothing to write!\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers.\n" +"We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() " +"returned 0 or another value < min_avail." +msgstr "" +"ALSA nos despertó para escribir nuevos datos al dispositivo, ¡pero en " +"realidad no hay nada para escribir!\n" +"Probablemente sea un error en el controlador ALSA '%s'. Por favor, informe " +"esto a los desarrolladores de ALSA.\n" +"Nos despertaron con POLLOUT puesto -- sin embargo, una llamada a " +"snd_pcm_avail() devolvió 0 u otro valor < min_avail." + +#: ../src/modules/alsa/alsa-source.c:506 ../src/modules/alsa/alsa-source.c:656 +#, c-format +msgid "" +"ALSA woke us up to read new data from the device, but there was actually " +"nothing to read!\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers.\n" +"We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() " +"returned 0 or another value < min_avail." +msgstr "" +"ALSA nos despertó para leer nuevos datos desde el dispositivo, ¡pero en " +"realidad no hay nada para leer!\n" +"Lo más probable es que sea un error del controlador ALSA '%s'. Por favor, " +"informe esto a los desarrolladores de ALSA.\n" +"Nos despertaron con POLLIN puesto -- sin embargo, una llamada a snd_pcm_avail" +"() devolvió 0 u otro valor < min_avail." + +#: ../src/modules/alsa/module-alsa-card.c:152 +#: ../src/modules/bluetooth/module-bluetooth-device.c:2228 +#: ../src/modules/alsa/alsa-mixer.c:2931 +msgid "Off" +msgstr "Apagado" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2184 +msgid "High Fidelity Playback (A2DP)" +msgstr "Reproducción de Alta Fidelidad (A2DP)" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2198 +msgid "High Fidelity Capture (A2DP)" +msgstr "Captura de Alta Fidelidad (A2DP)" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2213 +msgid "Telephony Duplex (HSP/HFP)" +msgstr "Telefonía Duplex (HSP/HFP)" + +#: ../src/modules/reserve-wrap.c:151 +msgid "PulseAudio Sound Server" +msgstr "Servidor de Sonido PulseAudio" + +#: ../src/modules/module-rygel-media-server.c:569 +#: ../src/modules/module-rygel-media-server.c:583 +msgid "Output Devices" +msgstr "Dispositivos de salida" + +#: ../src/modules/module-rygel-media-server.c:570 +#: ../src/modules/module-rygel-media-server.c:584 +msgid "Input Devices" +msgstr "Dispositivos de entrada" + +#: ../src/modules/module-rygel-media-server.c:774 +msgid "Audio on @HOSTNAME@" +msgstr "Audio en @HOSTNAME@" + +#: ../src/modules/alsa/alsa-mixer.c:1701 +msgid "Input" +msgstr "Entrada" + +#: ../src/modules/alsa/alsa-mixer.c:1702 +msgid "Docking Station Input" +msgstr "Estación dock de entrada" + +#: ../src/modules/alsa/alsa-mixer.c:1703 +msgid "Docking Station Microphone" +msgstr "Micrófono de la estación Dock" + +#: ../src/modules/alsa/alsa-mixer.c:1704 +msgid "Line-In" +msgstr "En línea" + +#: ../src/modules/alsa/alsa-mixer.c:1705 +msgid "Microphone" +msgstr "Micrófono" + +#: ../src/modules/alsa/alsa-mixer.c:1706 +msgid "External Microphone" +msgstr "Micrófono externo" + +#: ../src/modules/alsa/alsa-mixer.c:1707 +msgid "Internal Microphone" +msgstr "Micrófono interno" + +#: ../src/modules/alsa/alsa-mixer.c:1708 +msgid "Radio" +msgstr "Radio" + +#: ../src/modules/alsa/alsa-mixer.c:1709 +msgid "Video" +msgstr "Vídeo" + +#: ../src/modules/alsa/alsa-mixer.c:1710 +msgid "Automatic Gain Control" +msgstr "Control automático de ganancia" + +#: ../src/modules/alsa/alsa-mixer.c:1711 +msgid "No Automatic Gain Control" +msgstr "Sin control automático de ganancia" + +#: ../src/modules/alsa/alsa-mixer.c:1712 +msgid "Boost" +msgstr "Incremento de ganancia" + +#: ../src/modules/alsa/alsa-mixer.c:1713 +msgid "No Boost" +msgstr "Sin incremento de ganancia" + +#: ../src/modules/alsa/alsa-mixer.c:1714 +msgid "Amplifier" +msgstr "Amplificador" + +#: ../src/modules/alsa/alsa-mixer.c:1715 +msgid "No Amplifier" +msgstr "Sin amplificador" + +#: ../src/modules/alsa/alsa-mixer.c:1773 +msgid "Analog Input" +msgstr "Entrada analógica" + +#: ../src/modules/alsa/alsa-mixer.c:1774 +msgid "Analog Microphone" +msgstr "Micrófono analógico" + +#: ../src/modules/alsa/alsa-mixer.c:1775 +msgid "Analog Line-In" +msgstr "Entrada en línea analógica" + +#: ../src/modules/alsa/alsa-mixer.c:1776 +msgid "Analog Radio" +msgstr "Radio analógico" + +#: ../src/modules/alsa/alsa-mixer.c:1777 +msgid "Analog Video" +msgstr "Vídeo analógico" + +#: ../src/modules/alsa/alsa-mixer.c:1778 +msgid "Analog Output" +msgstr "Salida analógica" + +#: ../src/modules/alsa/alsa-mixer.c:1779 +msgid "Analog Headphones" +msgstr "Auriculares analógicos" + +#: ../src/modules/alsa/alsa-mixer.c:1780 +msgid "Analog Output (LFE)" +msgstr "Salida analógica (LFE)" + +#: ../src/modules/alsa/alsa-mixer.c:1781 +msgid "Analog Mono Output" +msgstr "Salida Mono analógica " + +#: ../src/modules/alsa/alsa-mixer.c:1981 +#, c-format +msgid "%s+%s" +msgstr "%s+%s" + +#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404 +#, c-format +msgid "%s / %s" +msgstr "%s / %s" + +#: ../src/modules/alsa/alsa-mixer.c:2790 +msgid "Analog Mono" +msgstr "Mono Analógico" + +#: ../src/modules/alsa/alsa-mixer.c:2791 +msgid "Analog Stereo" +msgstr "Estéreo Analógico" + +#: ../src/modules/alsa/alsa-mixer.c:2792 +msgid "Analog Surround 2.1" +msgstr "Análogico Envolvente 2.1" + +#: ../src/modules/alsa/alsa-mixer.c:2793 +msgid "Analog Surround 3.0" +msgstr "Análogico Envolvente 3.0" + +#: ../src/modules/alsa/alsa-mixer.c:2794 +msgid "Analog Surround 3.1" +msgstr "Análogico Envolvente 3.1" + +#: ../src/modules/alsa/alsa-mixer.c:2795 +msgid "Analog Surround 4.0" +msgstr "Análogo Envolvente 4.0" + +#: ../src/modules/alsa/alsa-mixer.c:2796 +msgid "Analog Surround 4.1" +msgstr "Análogo Envolvente 4.1" + +#: ../src/modules/alsa/alsa-mixer.c:2797 +msgid "Analog Surround 5.0" +msgstr "Análogo Envolvente 5.0" + +#: ../src/modules/alsa/alsa-mixer.c:2798 +msgid "Analog Surround 5.1" +msgstr "Análogo Envolvente 5.1" + +#: ../src/modules/alsa/alsa-mixer.c:2799 +msgid "Analog Surround 6.0" +msgstr "Análogico Envolvente 6.0" + +#: ../src/modules/alsa/alsa-mixer.c:2800 +msgid "Analog Surround 6.1" +msgstr "Análogico Envolvente 6.1" + +#: ../src/modules/alsa/alsa-mixer.c:2801 +msgid "Analog Surround 7.0" +msgstr "Análogico Envolvente 7.0" + +#: ../src/modules/alsa/alsa-mixer.c:2802 +msgid "Analog Surround 7.1" +msgstr "Análogo Envolvénte 7.1" + +#: ../src/modules/alsa/alsa-mixer.c:2803 +msgid "Digital Stereo (IEC958)" +msgstr "Estéreo Digital (IEC958)" + +#: ../src/modules/alsa/alsa-mixer.c:2804 +msgid "Digital Surround 4.0 (IEC958)" +msgstr "Digital Envolvente 4.0 (IEC9588)" + +#: ../src/modules/alsa/alsa-mixer.c:2805 +msgid "Digital Surround 4.0 (IEC958/AC3)" +msgstr "Digital Envolvente 4.0 (IEC9588/AC3)" + +#: ../src/modules/alsa/alsa-mixer.c:2806 +msgid "Digital Surround 5.1 (IEC958/AC3)" +msgstr "Digital Envolvente 5.1 (IEC958/AC3)" + +#: ../src/modules/alsa/alsa-mixer.c:2807 +msgid "Digital Stereo (HDMI)" +msgstr "Estéreo Digital (HDMI)" + +#: ../src/modules/alsa/alsa-mixer.c:2928 +msgid "Analog Mono Duplex" +msgstr "Mono Analógico.Duplex" + +#: ../src/modules/alsa/alsa-mixer.c:2929 +msgid "Analog Stereo Duplex" +msgstr "Estéreo Analógico.Duplex" + +#: ../src/modules/alsa/alsa-mixer.c:2930 +msgid "Digital Stereo Duplex (IEC958)" +msgstr "Estéreo Digital Duplex(IEC958)" + +#~ msgid "Invalid client name '%s'\n" +#~ msgstr "Nombre de cliente inválido '%s'\n" + +#~ msgid "Failed to determine sample specification from file.\n" +#~ msgstr "" +#~ "Error al intentar determinar especificación de ejemplo del archivo.\n" + +#~ msgid "select(): %s" +#~ msgstr "select(): %s" + +#~ msgid "Cannot connect to system bus: %s" +#~ msgstr "No se puede conectar al bus del sistema: %s" + +#~ msgid "Cannot get caller from PID: %s" +#~ msgstr "No se puede obtener el llamador desde el PID: %s" + +#~ msgid "Cannot set UID on caller object." +#~ msgstr "No se puede poner UID en el objeto llamador." + +#~ msgid "Failed to get CK session." +#~ msgstr "Falló al obtener sesión CK." + +#~ msgid "Cannot set UID on session object." +#~ msgstr "No se puede poner UID en el objeto de sesión." + +#~ msgid "Cannot allocate PolKitAction." +#~ msgstr "No se puede asignar PolKitAction." + +#~ msgid "Cannot set action_id" +#~ msgstr "No se pudo poner action_id" + +#~ msgid "Cannot allocate PolKitContext." +#~ msgstr "No se pudo asignar PolKitContext." + +#~ msgid "Cannot initialize PolKitContext: %s" +#~ msgstr "No se pudo inicializar PolKitContext: %s" + +#~ msgid "Could not determine whether caller is authorized: %s" +#~ msgstr "No se pudo determinar si el llamador está autorizado: %s" + +#~ msgid "Cannot obtain auth: %s" +#~ msgstr "No se pudo obtener auth: %s" + +#~ msgid "PolicyKit responded with '%s'" +#~ msgstr "PolicyKit respondió con '%s'" + +#~ msgid "" +#~ "High-priority scheduling (negative Unix nice level) for the PulseAudio " +#~ "daemon" +#~ msgstr "" +#~ "Planificación de alta prioridad (nivel Unix negativo) para el demonio " +#~ "PulseAudio" + +#~ msgid "Real-time scheduling for the PulseAudio daemon" +#~ msgstr "Planificación de tiempo real para el demonio de PulseAudio." + +#~ msgid "" +#~ "System policy prevents PulseAudio from acquiring high-priority scheduling." +#~ msgstr "" +#~ "Las políticas del sistema impidieron a PulseAudio adquirir la " +#~ "planificación de alta prioridad." + +#~ msgid "" +#~ "System policy prevents PulseAudio from acquiring real-time scheduling." +#~ msgstr "" +#~ "Las políticas del sistema impidieron a PulseAudio adquirir la " +#~ "planificación de tiempo real." + +#~ msgid "read() failed: %s\n" +#~ msgstr "read() falló: %s\n" + +#~ msgid "pa_context_connect() failed: %s\n" +#~ msgstr "pa_context_connect() falló: %s\n" + +#~ msgid "We're in the group '%s', allowing high-priority scheduling." +#~ msgstr "" +#~ "Estamos en el grupo '%s', permitiendo planificación de prioridad alta." + +#~ msgid "We're in the group '%s', allowing real-time scheduling." +#~ msgstr "Estamos en el grupo '%s', permitiendo planificación en tiempo real." + +#~ msgid "PolicyKit grants us acquire-high-priority privilege." +#~ msgstr "PolicyKit garantiza que se obtenga el privilegio de alta prioridad." + +#~ msgid "PolicyKit refuses acquire-high-priority privilege." +#~ msgstr "PolicyKit se niega a dar acceso al privilegio de alta prioridad." + +#~ msgid "PolicyKit grants us acquire-real-time privilege." +#~ msgstr "PolicyKit garantiza el acceso al privilegio de tiempo real." + +#~ msgid "PolicyKit refuses acquire-real-time privilege." +#~ msgstr "PolicyKit se niega a dar acceso al privilegio de tiempo real." + +#~ msgid "" +#~ "Called SUID root and real-time and/or high-priority scheduling was " +#~ "requested in the configuration. However, we lack the necessary " +#~ "privileges:\n" +#~ "We are not in group '%s', PolicyKit refuse to grant us the requested " +#~ "privileges and we have no increase RLIMIT_NICE/RLIMIT_RTPRIO resource " +#~ "limits.\n" +#~ "For enabling real-time/high-priority scheduling please acquire the " +#~ "appropriate PolicyKit privileges, or become a member of '%s', or increase " +#~ "the RLIMIT_NICE/RLIMIT_RTPRIO resource limits for this user." +#~ msgstr "" +#~ "Se llamó con SUID root y se pidió planificación en tiempo real y/o de " +#~ "alta prioridad en la configuración. Sin embargo, no se tiene los " +#~ "privilegios necesarios:\n" +#~ "No se está en el grupo '%s'. PolicyKit rechaza darnos el permiso " +#~ "necesario y no se puede aumentar los límites del recurso RLIMIT_NICE/" +#~ "RLIMIT_RTPRIO.\n" +#~ "Para habilitar la planifiación de tiempo real/alta prioridad por favor " +#~ "adquiera los privilegios apropiados en PolicyKit, o hágase miembro de '%" +#~ "s', o aumente los límites del recurso RLIMIT_NICE/RLIMIT_RTPRIO para este " +#~ "usuario." + +#~ msgid "" +#~ "High-priority scheduling enabled in configuration but not allowed by " +#~ "policy." +#~ msgstr "" +#~ "Está habilitadada la planificación de prioridad alta, pero no están " +#~ "permitidas por la política." + +#~ msgid "Successfully increased RLIMIT_RTPRIO" +#~ msgstr "RLIMIT_RTPRIO incrementado en forma exitosa" + +#~ msgid "RLIMIT_RTPRIO failed: %s" +#~ msgstr "Fallo en RLIMIT_RTPRIO: %s" + +#~ msgid "Giving up CAP_NICE" +#~ msgstr "Abandonando CAP_NICE" + +#~ msgid "" +#~ "Real-time scheduling enabled in configuration but not allowed by policy." +#~ msgstr "" +#~ "Está habilitada la planificación en tiempo real, pero no está permitido " +#~ "por la política." + +#~ msgid "Limited capabilities successfully to CAP_SYS_NICE." +#~ msgstr "Capacidades limitadas con éxito para CAP_SYS_NICE-" + +#~ msgid "time_new() failed.\n" +#~ msgstr "time_new() falló.\n" + +#~ msgid "Output %s + Input %s" +#~ msgstr "Salida %s + Entrada %s" + +#~ msgid "Stream successfully created\n" +#~ msgstr "Se ha creado el flujo exitosamente\n" + +#~ msgid "Stream errror: %s\n" +#~ msgstr "Error de flujo: %s\n" + +#~ msgid "Connection established.\n" +#~ msgstr "Conección establecida.\n" + +#~ msgid "" +#~ "%s [options] [FILE]\n" +#~ "\n" +#~ " -h, --help Show this help\n" +#~ " --version Show version\n" +#~ "\n" +#~ " -v, --verbose Enable verbose operation\n" +#~ "\n" +#~ " -s, --server=SERVER The name of the server to connect " +#~ "to\n" +#~ " -d, --device=DEVICE The name of the sink to connect " +#~ "to\n" +#~ " -n, --client-name=NAME How to call this client on the " +#~ "server\n" +#~ " --stream-name=NAME How to call this stream on the " +#~ "server\n" +#~ " --volume=VOLUME Specify the initial (linear) " +#~ "volume in range 0...65536\n" +#~ " --channel-map=CHANNELMAP Set the channel map to the use\n" +#~ msgstr "" +#~ "%s [options] [FILE]\n" +#~ "\n" +#~ " -h, --help Muestra esta ayuda\n" +#~ " --version Muestra la versión\n" +#~ "\n" +#~ " -v, --verbose Habilita operación con " +#~ "vocabulario más detallado\n" +#~ "\n" +#~ " -s, --server=SERVER El nombre del servidor al que " +#~ "conectarse\n" +#~ " -d, --device=DEVICE El nombre del destino al que " +#~ "conectarse\n" +#~ " -n, --client-name=NAME Cómo llamar a este cliente en el " +#~ "servidor\n" +#~ " --stream-name=NAME Cómo llamar a este flujo en el " +#~ "servidor\n" +#~ " --volume=VOLUME Especifica el volumen inicial " +#~ "(linear)en el rango de 0...65536\n" +#~ " --channel-map=CHANNELMAP Establece el mapa del canal para " +#~ "el uso\n" + +#~ msgid "" +#~ "paplay %s\n" +#~ "Compiled with libpulse %s\n" +#~ "Linked with libpulse %s\n" +#~ msgstr "" +#~ "paplay %s\n" +#~ "Compilado con libpulse %s\n" +#~ "Linked con libpulse %s\n" + +#~ msgid "Invalid channel map\n" +#~ msgstr "Mapa de canal inválido\n" + +#~ msgid "Failed to open file '%s'\n" +#~ msgstr "Error al intentar abrir el archivo '%s'\n" + +#~ msgid "Channel map doesn't match file.\n" +#~ msgstr "El mapa del canal no se corresponde con el archivo.\n" + +#~ msgid "Using sample spec '%s'\n" +#~ msgstr "Utilizando especificaciones de muestra '%s'\n" + +#, fuzzy +#~ msgid "" +#~ "Called SUID root and real-time and/or high-priority scheduling was " +#~ "requested in the configuration. However, we lack the necessary " +#~ "privileges:\n" +#~ "We are not in group '" +#~ msgstr "" +#~ "En la configuración se ha pedido una llamada de SUID root y planificación " +#~ "en tiempo real/de prioridad alta. Sin embargo, carecemos de los " +#~ "provilegios necesarios:\n" +#~ "No estamos en el grupo '" + +#, fuzzy +#~ msgid "--log-time boolean argument" +#~ msgstr "--disallow-exit argumento booleano" + +#~ msgid "" +#~ "' and PolicyKit refuse to grant us priviliges. Dropping SUID again.\n" +#~ "For enabling real-time scheduling please acquire the appropriate " +#~ "PolicyKit priviliges, or become a member of '" +#~ msgstr "" +#~ "' y PolicyKit se niega a darnos privilegios. Abandonando SUID de nuevo.\n" +#~ "Para permitir planificación en tiempo real, por favor adquiera los " +#~ "privilegios de PolicyKit adecuados, o forme parte de '" + +#~ msgid "" +#~ "', or increase the RLIMIT_NICE/RLIMIT_RTPRIO resource limits for this " +#~ "user." +#~ msgstr "" +#~ "', o incremente los límites del recurso RLIMIT_NICE/RLIMIT_RTPRIO para " +#~ "ese usuario. " + +#~ msgid "Default sink name (%s) does not exist in name register." +#~ msgstr "" +#~ "El nombre de destino por defecto (%s) no existe en el registro de nombres." + +#~ msgid "Buffer overrun, dropping incoming data\n" +#~ msgstr "Búfer desbordado, abandonando datos entrantes\n" + +#~ msgid "pa_stream_drop() failed: %s\n" +#~ msgstr "pa_stream_drop() falló: %s\n" + +#~ msgid "muted" +#~ msgstr "mudo" + +#~ msgid "" +#~ "*** Autoload Entry #%u ***\n" +#~ "Name: %s\n" +#~ "Type: %s\n" +#~ "Module: %s\n" +#~ "Argument: %s\n" +#~ msgstr "" +#~ "*** Entrada de Autoload #%u ***\n" +#~ "Nombre: %s\n" +#~ "Tipo: %s\n" +#~ "Módulo: %s\n" +#~ "Argumento: %s\n" + +#~ msgid "sink" +#~ msgstr "destino" + +#~ msgid "source" +#~ msgstr "fuente" diff --git a/po/fi.po b/po/fi.po new file mode 100644 index 0000000..cfb1437 --- /dev/null +++ b/po/fi.po @@ -0,0 +1,2818 @@ +# pulseaudio translation to Finnish (fi). +# Copyright (C) 2008 Timo Jyrinki +# This file is distributed under the same license as the pulseaudio package. +# Timo Jyrinki , 2008. +# Ville-Pekka Vainio , 2009. +msgid "" +msgstr "" +"Project-Id-Version: git trunk\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-09-29 23:47+0200\n" +"PO-Revision-Date: 2009-11-09 15:16+0200\n" +"Last-Translator: Ville-Pekka Vainio \n" +"Language-Team: Finnish \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629 +#, c-format +msgid "%s %s" +msgstr "%s %s" + +#: ../src/modules/alsa/alsa-util.c:1106 +#, c-format +msgid "" +"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu " +"ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_avail() palautti poikkeuksellisen suuren arvon: %lu tavua (%lu ms).\n" +"Tämä on todennäköisesti ohjelmavirhe ALSA-ajurissa ”%s”. Ilmoita tästä " +"ongelmasta ALSA-kehittäjille." + +#: ../src/modules/alsa/alsa-util.c:1147 +#, c-format +msgid "" +"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%" +"lu ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_delay() palautti poikkeuksellisen suuren arvon: %li tavua (%s%lu " +"ms).\n" +"Tämä on todennäköisesti ohjelmavirhe ALSA-ajurissa ”%s”. Ilmoita tästä " +"ongelmasta ALSA-kehittäjille." + +#: ../src/modules/alsa/alsa-util.c:1194 +#, c-format +msgid "" +"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes " +"(%lu ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_mmap_begin() palautti poikkeuksellisen suuren arvon: %lu tavua (%lu " +"ms).\n" +"Tämä on todennäköisesti ohjelmavirhe ALSA-ajurissa ”%s”. Ilmoita tästä " +"ongelmasta ALSA-kehittäjille." + +#: ../src/modules/module-always-sink.c:39 +msgid "Always keeps at least one sink loaded even if it's a null one" +msgstr "Pidä aina vähintään yksi nielu ladattuna, vaikka se olisi tyhjä nielu" + +#: ../src/modules/module-always-sink.c:83 +msgid "Dummy Output" +msgstr "Valeulostulo" + +#: ../src/modules/module-ladspa-sink.c:49 +msgid "Virtual LADSPA sink" +msgstr "Virtuaalinen LADSPA-nielu" + +#: ../src/modules/module-ladspa-sink.c:53 +msgid "" +"sink_name= sink_properties= " +"master= format= rate= " +"channels= channel_map= plugin= label= control=" +msgstr "" +"sink_name= sink_properties= " +"master= format= " +"rate= channels= " +"channel_map= plugin= label= control=" + +#: ../src/modules/module-null-sink.c:55 +msgid "Clocked NULL sink" +msgstr "Kellotettu tyhjä nielu" + +#: ../src/modules/module-null-sink.c:291 +msgid "Null Output" +msgstr "Tyhjä ulostulo" + +#: ../src/pulsecore/sink.c:2613 +msgid "Internal Audio" +msgstr "Sisäinen äänentoisto" + +#: ../src/pulsecore/sink.c:2618 +msgid "Modem" +msgstr "Modeemi" + +#: ../src/daemon/ltdl-bind-now.c:124 +msgid "Failed to find original lt_dlopen loader." +msgstr "Alkuperäisen lt_dlopen-lataimen löytäminen epäonnistui." + +#: ../src/daemon/ltdl-bind-now.c:129 +msgid "Failed to allocate new dl loader." +msgstr "Uuden dl-lataaminen varaaminen epäonnistui." + +#: ../src/daemon/ltdl-bind-now.c:142 +msgid "Failed to add bind-now-loader." +msgstr "bind-now-loaderin lisääminen epäonnistui." + +#: ../src/daemon/main.c:141 +#, c-format +msgid "Got signal %s." +msgstr "Saatiin signaali %s." + +#: ../src/daemon/main.c:168 +msgid "Exiting." +msgstr "Poistutaan." + +#: ../src/daemon/main.c:186 +#, c-format +msgid "Failed to find user '%s'." +msgstr "Käyttäjää ”%s” ei löydetty." + +#: ../src/daemon/main.c:191 +#, c-format +msgid "Failed to find group '%s'." +msgstr "Ryhmää ”%s” ei löydetty." + +#: ../src/daemon/main.c:195 +#, c-format +msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)." +msgstr "Löydettiin käyttäjä ”%s” (UID %lu) ja ryhmä ”%s” (GID %lu)." + +#: ../src/daemon/main.c:200 +#, c-format +msgid "GID of user '%s' and of group '%s' don't match." +msgstr "Käyttäjän ”%s” ja ryhmän ”%s” GID:t eivät vastaa toisiaan." + +#: ../src/daemon/main.c:205 +#, c-format +msgid "Home directory of user '%s' is not '%s', ignoring." +msgstr "Käyttäjän ”%s” kotihakemisto ei ole ”%s”, ohitetaan." + +#: ../src/daemon/main.c:208 ../src/daemon/main.c:213 +#, c-format +msgid "Failed to create '%s': %s" +msgstr "Hakemiston ”%s” luominen epäonnistui: %s" + +#: ../src/daemon/main.c:220 +#, c-format +msgid "Failed to change group list: %s" +msgstr "Ryhmäluettelon vaihtaminen epäonnistui: %s" + +#: ../src/daemon/main.c:236 +#, c-format +msgid "Failed to change GID: %s" +msgstr "GID:n vaihtaminen epäonnistui: %s" + +#: ../src/daemon/main.c:252 +#, c-format +msgid "Failed to change UID: %s" +msgstr "UID:n vaihtaminen epäonnistui: %s" + +#: ../src/daemon/main.c:271 +msgid "Successfully dropped root privileges." +msgstr "Root-oikeuksista luopuminen onnistui." + +#: ../src/daemon/main.c:279 +msgid "System wide mode unsupported on this platform." +msgstr "Järjestelmänlaajuista tilaa ei tueta tällä alustalla." + +#: ../src/daemon/main.c:297 +#, c-format +msgid "setrlimit(%s, (%u, %u)) failed: %s" +msgstr "setrlimit(%s, (%u, %u)) epäonnistui: %s" + +#: ../src/daemon/main.c:474 +msgid "Failed to parse command line." +msgstr "Komentorivin jäsentäminen epäonnistui." + +#: ../src/daemon/main.c:541 +msgid "Daemon not running" +msgstr "Taustaprosessi ei ole käynnissä" + +#: ../src/daemon/main.c:543 +#, c-format +msgid "Daemon running as PID %u" +msgstr "Taustaprosessi käynnissä prosessitunnisteella %u" + +#: ../src/daemon/main.c:553 +#, c-format +msgid "Failed to kill daemon: %s" +msgstr "Taustaprosessin lopettaminen epäonnistui: %s" + +#: ../src/daemon/main.c:571 +msgid "" +"This program is not intended to be run as root (unless --system is " +"specified)." +msgstr "" +"Tätä ohjelmaa ei ole tarkoitettu suoritettavaksi pääkäyttäjänä (ellei --" +"system ole määritelty)." + +#: ../src/daemon/main.c:573 +msgid "Root privileges required." +msgstr "Pääkäyttäjän (root) oikeudet vaaditaan." + +#: ../src/daemon/main.c:578 +msgid "--start not supported for system instances." +msgstr "--start-valitsinta ei tueta järjestelmätilassa." + +#: ../src/daemon/main.c:583 +msgid "Running in system mode, but --disallow-exit not set!" +msgstr "" +"Suoritetaan järjestelmätilassa, mutta --disallow-exit ei ole asetettuna!" + +#: ../src/daemon/main.c:586 +msgid "Running in system mode, but --disallow-module-loading not set!" +msgstr "" +"Suoritetaan järjestelmätilassa, mutta -disallow-module-loading ei ole " +"asetettuna!" + +#: ../src/daemon/main.c:589 +msgid "Running in system mode, forcibly disabling SHM mode!" +msgstr "" +"Suoritetaan järjestelmätilassa, otetaan SHM-tila pakotetusti pois käytöstä." + +#: ../src/daemon/main.c:594 +msgid "Running in system mode, forcibly disabling exit idle time!" +msgstr "" +"Suoritetaan järjestelmätilassa, otetaan poistumisen joutenoloaika " +"pakotetusti pois käytöstä." + +#: ../src/daemon/main.c:621 +msgid "Failed to acquire stdio." +msgstr "stdio:n saaminen epäonnistui." + +#: ../src/daemon/main.c:627 +#, c-format +msgid "pipe failed: %s" +msgstr "putki epäonnistui: %s" + +#: ../src/daemon/main.c:632 +#, c-format +msgid "fork() failed: %s" +msgstr "fork() epäonnistui: %s" + +#: ../src/daemon/main.c:646 ../src/utils/pacat.c:508 +#, c-format +msgid "read() failed: %s" +msgstr "read() epäonnistui: %s" + +#: ../src/daemon/main.c:652 +msgid "Daemon startup failed." +msgstr "Taustaprosessin käynnistys epäonnistui." + +#: ../src/daemon/main.c:654 +msgid "Daemon startup successful." +msgstr "Taustaprosessin käynnistys onnistui." + +#: ../src/daemon/main.c:731 +#, c-format +msgid "This is PulseAudio %s" +msgstr "Tämä on PulseAudio %s" + +#: ../src/daemon/main.c:732 +#, c-format +msgid "Compilation host: %s" +msgstr "Käännöksen isäntäkone: %s" + +#: ../src/daemon/main.c:733 +#, c-format +msgid "Compilation CFLAGS: %s" +msgstr "Käännösaikaiset C-liput (CFLAGS): %s" + +#: ../src/daemon/main.c:736 +#, c-format +msgid "Running on host: %s" +msgstr "Käynnissä isäntäkoneella: %s" + +#: ../src/daemon/main.c:739 +#, c-format +msgid "Found %u CPUs." +msgstr "Löydettiin %u CPU:ta." + +#: ../src/daemon/main.c:741 +#, c-format +msgid "Page size is %lu bytes" +msgstr "Sivun koko on %lu tavua" + +#: ../src/daemon/main.c:744 +msgid "Compiled with Valgrind support: yes" +msgstr "Käännetty Valgrind-tuella: kyllä" + +#: ../src/daemon/main.c:746 +msgid "Compiled with Valgrind support: no" +msgstr "Käännetty Valgrind-tuella: ei" + +#: ../src/daemon/main.c:749 +#, c-format +msgid "Running in valgrind mode: %s" +msgstr "Käynnissä valgrind-tilassa: %s" + +#: ../src/daemon/main.c:752 +msgid "Optimized build: yes" +msgstr "Optimoitu rakentaminen: kyllä" + +#: ../src/daemon/main.c:754 +msgid "Optimized build: no" +msgstr "Optimoitu rakentaminen: ei" + +#: ../src/daemon/main.c:758 +msgid "NDEBUG defined, all asserts disabled." +msgstr "NDEBUG on määritelty, kaikki assertit ovat poissa käytöstä." + +#: ../src/daemon/main.c:760 +msgid "FASTPATH defined, only fast path asserts disabled." +msgstr "FASTPATH on määritelty, vain fast path -assertit ovat poissa käytöstä." + +#: ../src/daemon/main.c:762 +msgid "All asserts enabled." +msgstr "Kaikki assertit ovat käytössä." + +#: ../src/daemon/main.c:766 +msgid "Failed to get machine ID" +msgstr "Konetunnisteen nouto epäonnistui" + +#: ../src/daemon/main.c:769 +#, c-format +msgid "Machine ID is %s." +msgstr "Konetunniste on %s." + +#: ../src/daemon/main.c:773 +#, c-format +msgid "Session ID is %s." +msgstr "Istunnon tunniste on %s." + +#: ../src/daemon/main.c:779 +#, c-format +msgid "Using runtime directory %s." +msgstr "Käytetään ajonaikaista hakemistoa %s." + +#: ../src/daemon/main.c:784 +#, c-format +msgid "Using state directory %s." +msgstr "Käytetään tilahakemistoa %s." + +#: ../src/daemon/main.c:787 +#, c-format +msgid "Using modules directory %s." +msgstr "Käytetään moduulihakemistoa %s." + +#: ../src/daemon/main.c:789 +#, c-format +msgid "Running in system mode: %s" +msgstr "Suoritetaan järjestelmätilassa: %s" + +#: ../src/daemon/main.c:792 +msgid "" +"OK, so you are running PA in system mode. Please note that you most likely " +"shouldn't be doing that.\n" +"If you do it nonetheless then it's your own fault if things don't work as " +"expected.\n" +"Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an " +"explanation why system mode is usually a bad idea." +msgstr "" +"PA:ta suoritetaan järjestelmätilassa. Näin ei luultavasti pitäisi tehdä.\n" +"Jos silti teet näin, on sinun vikasi jos kaikki ei toimikaan odotetusti.\n" +"Lisätietoja siitä, miksi järjestelmätilan käyttäminen on yleensä huono " +"ajatus on osoitteessa http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode" + +#: ../src/daemon/main.c:809 +msgid "pa_pid_file_create() failed." +msgstr "pa_pid_file_create() epäonnistui." + +#: ../src/daemon/main.c:819 +msgid "Fresh high-resolution timers available! Bon appetit!" +msgstr "Korkean tarkkuuden ajastimet käytettävissä." + +#: ../src/daemon/main.c:821 +msgid "" +"Dude, your kernel stinks! The chef's recommendation today is Linux with high-" +"resolution timers enabled!" +msgstr "" +"Hei, ytimesi on kehno! Linux korkean tarkkuuden ajastimien tuella on hyvin " +"suositeltava!" + +#: ../src/daemon/main.c:844 +msgid "pa_core_new() failed." +msgstr "pa_core_new() epäonnistui." + +#: ../src/daemon/main.c:904 +msgid "Failed to initialize daemon." +msgstr "Taustaprosessin alustus epäonnistui." + +#: ../src/daemon/main.c:909 +msgid "Daemon startup without any loaded modules, refusing to work." +msgstr "" +"Taustaprosessin käynnistys ilman ladattavia moduuleita, kieltäydytään " +"toiminnasta." + +#: ../src/daemon/main.c:926 +msgid "Daemon startup complete." +msgstr "Taustaprosessin käynnistys valmis." + +#: ../src/daemon/main.c:932 +msgid "Daemon shutdown initiated." +msgstr "Taustaprosessin sulkeminen käynnistetty." + +#: ../src/daemon/main.c:954 +msgid "Daemon terminated." +msgstr "Taustaprosessi lopetettu." + +#: ../src/daemon/cmdline.c:115 +#, c-format +msgid "" +"%s [options]\n" +"\n" +"COMMANDS:\n" +" -h, --help Show this help\n" +" --version Show version\n" +" --dump-conf Dump default configuration\n" +" --dump-modules Dump list of available modules\n" +" --dump-resample-methods Dump available resample methods\n" +" --cleanup-shm Cleanup stale shared memory " +"segments\n" +" --start Start the daemon if it is not " +"running\n" +" -k --kill Kill a running daemon\n" +" --check Check for a running daemon (only " +"returns exit code)\n" +"\n" +"OPTIONS:\n" +" --system[=BOOL] Run as system-wide instance\n" +" -D, --daemonize[=BOOL] Daemonize after startup\n" +" --fail[=BOOL] Quit when startup fails\n" +" --high-priority[=BOOL] Try to set high nice level\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_NICE)\n" +" --realtime[=BOOL] Try to enable realtime scheduling\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_RTPRIO)\n" +" --disallow-module-loading[=BOOL] Disallow module user requested " +"module\n" +" loading/unloading after startup\n" +" --disallow-exit[=BOOL] Disallow user requested exit\n" +" --exit-idle-time=SECS Terminate the daemon when idle and " +"this\n" +" time passed\n" +" --module-idle-time=SECS Unload autoloaded modules when idle " +"and\n" +" this time passed\n" +" --scache-idle-time=SECS Unload autoloaded samples when idle " +"and\n" +" this time passed\n" +" --log-level[=LEVEL] Increase or set verbosity level\n" +" -v Increase the verbosity level\n" +" --log-target={auto,syslog,stderr} Specify the log target\n" +" --log-meta[=BOOL] Include code location in log " +"messages\n" +" --log-time[=BOOL] Include timestamps in log messages\n" +" --log-backtrace=FRAMES Include a backtrace in log messages\n" +" -p, --dl-search-path=PATH Set the search path for dynamic " +"shared\n" +" objects (plugins)\n" +" --resample-method=METHOD Use the specified resampling method\n" +" (See --dump-resample-methods for\n" +" possible values)\n" +" --use-pid-file[=BOOL] Create a PID file\n" +" --no-cpu-limit[=BOOL] Do not install CPU load limiter on\n" +" platforms that support it.\n" +" --disable-shm[=BOOL] Disable shared memory support.\n" +"\n" +"STARTUP SCRIPT:\n" +" -L, --load=\"MODULE ARGUMENTS\" Load the specified plugin module " +"with\n" +" the specified argument\n" +" -F, --file=FILENAME Run the specified script\n" +" -C Open a command line on the running " +"TTY\n" +" after startup\n" +"\n" +" -n Don't load default script file\n" +msgstr "" +"%s [valitsimet]\n" +"\n" +"KOMENNOT:\n" +" -h, --help Näytä tämä ohje\n" +" --version Näytä versio\n" +" --dump-conf Tulosta oletusasetukset\n" +" --dump-modules Tulosta saatavilla olevien\n" +" moduulien luettelo\n" +" --dump-resample-methods Tulosta saatavilla\n" +" olevat\n" +" uudelleennäytteistystavat\n" +" --cleanup-shm Puhdista vanhentuneet jaetun\n" +" muistin segmentit\n" +" --start Käynnistä taustaprosessi, jos se\n" +" ei ole käynnissä\n" +" -k --kill Tapa suoritettava taustaprosessi\n" +" --check Tarkista onko\n" +" taustaprosessi suoritettavana\n" +" (palauttaa vain lopetuskoodin)\n" +"\n" +"VALITSIMET:\n" +" --system[=BOOL] Suorita järjestelmänlaajuisena\n" +" -D, --daemonize[=BOOL] Vaihda\n" +" taustaprosessiksi käynnistyksen\n" +" jälkeen\n" +" --fail[=BOOL] Lopeta kun käynnistys epäonnistuu\n" +" --high-priority[=BOOL] Yritä asettaa korkea nice-taso\n" +" (käytettävissä vain root-\n" +" käyttäjänä, SUIDilla tai\n" +" kohotetulla RLIMIT_NICE-arvolla)\n" +" --realtime[=BOOL] Yritä asettaa reaaliaikainen\n" +" ajoitus (käytettävissä vain\n" +" root-käyttäjänä, SUIDilla tai\n" +" kohotetulla RLIMIT_RTPRIO-arvolla)\n" +" --disallow-module-loading[=BOOL] Kiellä käyttäjän pyytämä moduulin\n" +" lataus tai poisto käynnistyksen\n" +" jälkeen\n" +" --disallow-exit[=BOOL] Kiellä käyttäjän pyytämä\n" +" lopettaminen\n" +" --exit-idle-time=SEK Lopeta taustaprosessi, kun se on\n" +" toimettomana ja tämä aika on\n" +" kulunut\n" +" --module-idle-time=SEK Poista automaattisesti ladatut\n" +" moduulit, kun taustaprosessi on\n" +" toimettomana ja tämä aika on\n" +" kulunut\n" +" --scache-idle-time=SEK Poista automaattisesti ladatut\n" +" näytteet, kun taustaprosessi on\n" +" toimettomana ja tämä aika on\n" +" kulunut\n" +" --log-level[=TASO] Aseta tai kasvata\n" +" lokikirjoituksen tasoa\n" +" -v Kasvata tulosteiden\n" +" yksityiskohtaisuutta\n" +" --log-target={auto,syslog,stderr} Aseta lokikirjoituksen kohde\n" +" --log-meta[=BOOL] Lisää koodikohta\n" +" lokiviesteihin\n" +" --log-time[=BOOL] Lisää aikaleima lokiviesteihin\n" +" --log-backtrace=KEHYKSET Lisää pinolistaus lokiviesteihin\n" +" -p, --dl-search-path=POLKU Aseta dynaamisten jaettujen\n" +" objektien (liitännäisten)\n" +" hakupolku\n" +" --resample-method=TAPA Käytä määritettyä\n" +" uudelleennäytteistyksen tapaa\n" +" (--dump-resample-methods\n" +" luetteloi mahdolliset arvot)\n" +" --use-pid-file[=BOOL] Luo PID-tiedosto\n" +" --no-cpu-limit[=BOOL] Älä asenna suoritinkuorman\n" +" rajoitinta alustoilla, jotka\n" +" tukevat sitä\n" +" --disable-shm[=BOOL] Poista jaetun muistin tuki käytöstä\n" +"\n" +"ALOITUSKOMENTOSARJA:\n" +" -L, --load=\"MODUULIN ARGUMENTIT\" Lataa liitännäismoduuli annetulla\n" +" argumentilla\n" +" -F, --file=TIEDOSTO Suorita annettu komentosarja\n" +" -C Avaa komentokehote nykyiseen\n" +" päätteeseen käynnistyksen jälkeen\n" +"\n" +" -n Älä lataa oletuskomentosarja-\n" +" tiedostoa\n" + +#: ../src/daemon/cmdline.c:247 +msgid "--daemonize expects boolean argument" +msgstr "--daemonize vaatii totuusarvoisen argumentin" + +#: ../src/daemon/cmdline.c:254 +msgid "--fail expects boolean argument" +msgstr "--fail vaatii totuusarvoisen argumentin" + +#: ../src/daemon/cmdline.c:264 +msgid "" +"--log-level expects log level argument (either numeric in range 0..4 or one " +"of debug, info, notice, warn, error)." +msgstr "" +"--log-level vaatii lokikirjoituksen tason argumentiksi (joko numero väliltä " +"0..4 tai yksi seuraavista: debug, info, notice, warn, error)." + +#: ../src/daemon/cmdline.c:276 +msgid "--high-priority expects boolean argument" +msgstr "--high-priority vaatii totuusarvoisen argumentin" + +#: ../src/daemon/cmdline.c:283 +msgid "--realtime expects boolean argument" +msgstr "--realtime vaatii totuusarvoisen argumentin" + +#: ../src/daemon/cmdline.c:290 +msgid "--disallow-module-loading expects boolean argument" +msgstr "--disallow-module-loading vaatii totuusarvoisen argumentin" + +#: ../src/daemon/cmdline.c:297 +msgid "--disallow-exit expects boolean argument" +msgstr "--disallow-exit vaatii totuusarvoisen argumentin" + +#: ../src/daemon/cmdline.c:304 +msgid "--use-pid-file expects boolean argument" +msgstr "--use-pid-file vaatii totuusarvoisen argumentin" + +#: ../src/daemon/cmdline.c:321 +msgid "Invalid log target: use either 'syslog', 'stderr' or 'auto'." +msgstr "" +"Virheellinen lokikirjoituksen kohde: käytä jotain seuraavista: ”syslog”, " +"”stderr” tai ”auto”." + +#: ../src/daemon/cmdline.c:328 +msgid "--log-time expects boolean argument" +msgstr "--log-time vaatii totuusarvoisen argumentin" + +#: ../src/daemon/cmdline.c:335 +msgid "--log-meta expects boolean argument" +msgstr "--log-meta vaatii totuusarvoisen argumentin" + +#: ../src/daemon/cmdline.c:354 +#, c-format +msgid "Invalid resample method '%s'." +msgstr "Virheellinen uudelleennäytteistyksen tapa ”%s”." + +#: ../src/daemon/cmdline.c:361 +msgid "--system expects boolean argument" +msgstr "--system vaatii totuusarvoisen argumentin" + +#: ../src/daemon/cmdline.c:368 +msgid "--no-cpu-limit expects boolean argument" +msgstr "--no-cpu-limit vaatii totuusarvoisen argumentin" + +#: ../src/daemon/cmdline.c:375 +msgid "--disable-shm expects boolean argument" +msgstr "--disable-shm vaatii totuusarvoisen argumentin" + +#: ../src/daemon/dumpmodules.c:60 +#, c-format +msgid "Name: %s\n" +msgstr "Nimi: %s\n" + +#: ../src/daemon/dumpmodules.c:63 +#, c-format +msgid "No module information available\n" +msgstr "Moduulitietoja ei saatavilla\n" + +#: ../src/daemon/dumpmodules.c:66 +#, c-format +msgid "Version: %s\n" +msgstr "Versio: %s\n" + +#: ../src/daemon/dumpmodules.c:68 +#, c-format +msgid "Description: %s\n" +msgstr "Kuvaus: %s\n" + +#: ../src/daemon/dumpmodules.c:70 +#, c-format +msgid "Author: %s\n" +msgstr "Tekijä: %s\n" + +#: ../src/daemon/dumpmodules.c:72 +#, c-format +msgid "Usage: %s\n" +msgstr "Käyttö: %s\n" + +#: ../src/daemon/dumpmodules.c:73 +#, c-format +msgid "Load Once: %s\n" +msgstr "Lataa kerran: %s\n" + +#: ../src/daemon/dumpmodules.c:75 +#, c-format +msgid "DEPRECATION WARNING: %s\n" +msgstr "VAROITUS VANHENTUNEISUUDESTA: %s\n" + +#: ../src/daemon/dumpmodules.c:79 +#, c-format +msgid "Path: %s\n" +msgstr "Polku: %s\n" + +#: ../src/daemon/daemon-conf.c:232 +#, c-format +msgid "[%s:%u] Invalid log target '%s'." +msgstr "[%s:%u] Virheellinen lokikirjoituksen kohde ”%s”." + +#: ../src/daemon/daemon-conf.c:248 +#, c-format +msgid "[%s:%u] Invalid log level '%s'." +msgstr "[%s:%u] Virheellinen lokikirjoituksen taso ”%s”." + +#: ../src/daemon/daemon-conf.c:264 +#, c-format +msgid "[%s:%u] Invalid resample method '%s'." +msgstr "[%s:%u] Virheellinen uudelleennäytteistyksen tapa ”%s”." + +#: ../src/daemon/daemon-conf.c:287 +#, c-format +msgid "[%s:%u] Invalid rlimit '%s'." +msgstr "[%s:%u] Virheellinen rlimit ”%s”." + +#: ../src/daemon/daemon-conf.c:294 +#, c-format +msgid "[%s:%u] rlimit not supported on this platform." +msgstr "[%s:%u] rlimitiä ei tueta tällä alustalla." + +#: ../src/daemon/daemon-conf.c:310 +#, c-format +msgid "[%s:%u] Invalid sample format '%s'." +msgstr "[%s:%u] Virheellinen näytemuoto ”%s”." + +#: ../src/daemon/daemon-conf.c:328 +#, c-format +msgid "[%s:%u] Invalid sample rate '%s'." +msgstr "[%s:%u] Virheellinen näytteenottotaajuus ”%s”." + +#: ../src/daemon/daemon-conf.c:352 +#, c-format +msgid "[%s:%u] Invalid sample channels '%s'." +msgstr "[%s:%u] Virheelliset näytekanavat ”%s”." + +#: ../src/daemon/daemon-conf.c:370 +#, c-format +msgid "[%s:%u] Invalid channel map '%s'." +msgstr "[%s:%u] Virheellinen kanavakartta ”%s”." + +#: ../src/daemon/daemon-conf.c:388 +#, c-format +msgid "[%s:%u] Invalid number of fragments '%s'." +msgstr "[%s:%u] Virheellinen fragmenttimäärä ”%s”." + +#: ../src/daemon/daemon-conf.c:406 +#, c-format +msgid "[%s:%u] Invalid fragment size '%s'." +msgstr "[%s:%u] Virheellinen fragmenttikoko ”%s”." + +#: ../src/daemon/daemon-conf.c:424 +#, c-format +msgid "[%s:%u] Invalid nice level '%s'." +msgstr "[%s:%u] Virheellinen nice-taso ”%s”." + +#: ../src/daemon/daemon-conf.c:546 +#, c-format +msgid "Failed to open configuration file: %s" +msgstr "Asetustiedoston avaaminen epäonnistui: %s" + +#: ../src/daemon/daemon-conf.c:562 +msgid "" +"The specified default channel map has a different number of channels than " +"the specified default number of channels." +msgstr "" +"Kanavien oletusmäärä ja oletuskanavakartan kanavien määrä poikkeavat " +"toisistaan." + +#: ../src/daemon/daemon-conf.c:638 +#, c-format +msgid "### Read from configuration file: %s ###\n" +msgstr "### Luettu asetustiedostosta: %s ###\n" + +#: ../src/daemon/caps.c:62 +msgid "Cleaning up privileges." +msgstr "Luovutaan oikeuksista." + +#: ../src/daemon/pulseaudio.desktop.in.h:1 +msgid "PulseAudio Sound System" +msgstr "PulseAudio-äänijärjestelmä" + +#: ../src/daemon/pulseaudio.desktop.in.h:2 +msgid "Start the PulseAudio Sound System" +msgstr "Käynnistä PulseAudio-äänijärjestelmä" + +#: ../src/pulse/channelmap.c:105 ../src/pulse/channelmap.c:757 +msgid "Mono" +msgstr "Mono" + +#: ../src/pulse/channelmap.c:107 +msgid "Front Center" +msgstr "Keski" + +#: ../src/pulse/channelmap.c:108 +msgid "Front Left" +msgstr "Vasen etu" + +#: ../src/pulse/channelmap.c:109 +msgid "Front Right" +msgstr "Oikea etu" + +#: ../src/pulse/channelmap.c:111 +msgid "Rear Center" +msgstr "Takakeski" + +#: ../src/pulse/channelmap.c:112 +msgid "Rear Left" +msgstr "Vasen taka" + +#: ../src/pulse/channelmap.c:113 +msgid "Rear Right" +msgstr "Oikea taka" + +#: ../src/pulse/channelmap.c:115 +msgid "Low Frequency Emmiter" +msgstr "Alataajuus" + +#: ../src/pulse/channelmap.c:117 +msgid "Front Left-of-center" +msgstr "Vasemmalle keskeltä etu" + +#: ../src/pulse/channelmap.c:118 +msgid "Front Right-of-center" +msgstr "Oikealle keskeltä etu" + +#: ../src/pulse/channelmap.c:120 +msgid "Side Left" +msgstr "Vasen sivu" + +#: ../src/pulse/channelmap.c:121 +msgid "Side Right" +msgstr "Oikea sivu" + +#: ../src/pulse/channelmap.c:123 +msgid "Auxiliary 0" +msgstr "Avustava 0" + +#: ../src/pulse/channelmap.c:124 +msgid "Auxiliary 1" +msgstr "Avustava 1" + +#: ../src/pulse/channelmap.c:125 +msgid "Auxiliary 2" +msgstr "Avustava 2" + +#: ../src/pulse/channelmap.c:126 +msgid "Auxiliary 3" +msgstr "Avustava 3" + +#: ../src/pulse/channelmap.c:127 +msgid "Auxiliary 4" +msgstr "Avustava 4" + +#: ../src/pulse/channelmap.c:128 +msgid "Auxiliary 5" +msgstr "Avustava 5" + +#: ../src/pulse/channelmap.c:129 +msgid "Auxiliary 6" +msgstr "Avustava 6" + +#: ../src/pulse/channelmap.c:130 +msgid "Auxiliary 7" +msgstr "Avustava 7" + +#: ../src/pulse/channelmap.c:131 +msgid "Auxiliary 8" +msgstr "Avustava 8" + +#: ../src/pulse/channelmap.c:132 +msgid "Auxiliary 9" +msgstr "Avustava 9" + +#: ../src/pulse/channelmap.c:133 +msgid "Auxiliary 10" +msgstr "Avustava 10" + +#: ../src/pulse/channelmap.c:134 +msgid "Auxiliary 11" +msgstr "Avustava 11" + +#: ../src/pulse/channelmap.c:135 +msgid "Auxiliary 12" +msgstr "Avustava 12" + +#: ../src/pulse/channelmap.c:136 +msgid "Auxiliary 13" +msgstr "Avustava 13" + +#: ../src/pulse/channelmap.c:137 +msgid "Auxiliary 14" +msgstr "Avustava 14" + +#: ../src/pulse/channelmap.c:138 +msgid "Auxiliary 15" +msgstr "Avustava 15" + +#: ../src/pulse/channelmap.c:139 +msgid "Auxiliary 16" +msgstr "Avustava 16" + +#: ../src/pulse/channelmap.c:140 +msgid "Auxiliary 17" +msgstr "Avustava 17" + +#: ../src/pulse/channelmap.c:141 +msgid "Auxiliary 18" +msgstr "Avustava 18" + +#: ../src/pulse/channelmap.c:142 +msgid "Auxiliary 19" +msgstr "Avustava 19" + +#: ../src/pulse/channelmap.c:143 +msgid "Auxiliary 20" +msgstr "Avustava 20" + +#: ../src/pulse/channelmap.c:144 +msgid "Auxiliary 21" +msgstr "Avustava 21" + +#: ../src/pulse/channelmap.c:145 +msgid "Auxiliary 22" +msgstr "Avustava 22" + +#: ../src/pulse/channelmap.c:146 +msgid "Auxiliary 23" +msgstr "Avustava 23" + +#: ../src/pulse/channelmap.c:147 +msgid "Auxiliary 24" +msgstr "Avustava 24" + +#: ../src/pulse/channelmap.c:148 +msgid "Auxiliary 25" +msgstr "Avustava 25" + +#: ../src/pulse/channelmap.c:149 +msgid "Auxiliary 26" +msgstr "Avustava 26" + +#: ../src/pulse/channelmap.c:150 +msgid "Auxiliary 27" +msgstr "Avustava 27" + +#: ../src/pulse/channelmap.c:151 +msgid "Auxiliary 28" +msgstr "Avustava 28" + +#: ../src/pulse/channelmap.c:152 +msgid "Auxiliary 29" +msgstr "Avustava 29" + +#: ../src/pulse/channelmap.c:153 +msgid "Auxiliary 30" +msgstr "Avustava 30" + +#: ../src/pulse/channelmap.c:154 +msgid "Auxiliary 31" +msgstr "Avustava 31" + +#: ../src/pulse/channelmap.c:156 +msgid "Top Center" +msgstr "Keski ylä" + +#: ../src/pulse/channelmap.c:158 +msgid "Top Front Center" +msgstr "Keski ylä etu" + +#: ../src/pulse/channelmap.c:159 +msgid "Top Front Left" +msgstr "Vasen ylä etu" + +#: ../src/pulse/channelmap.c:160 +msgid "Top Front Right" +msgstr "Oikea ylä etu" + +#: ../src/pulse/channelmap.c:162 +msgid "Top Rear Center" +msgstr "Keski ylä taka" + +#: ../src/pulse/channelmap.c:163 +msgid "Top Rear Left" +msgstr "Vasen ylä taka" + +#: ../src/pulse/channelmap.c:164 +msgid "Top Rear Right" +msgstr "Oikea ylä taka" + +#: ../src/pulse/channelmap.c:484 ../src/pulse/sample.c:170 +#: ../src/pulse/volume.c:295 ../src/pulse/volume.c:321 +#: ../src/pulse/volume.c:341 ../src/pulse/volume.c:371 +msgid "(invalid)" +msgstr "(virheellinen)" + +#: ../src/pulse/channelmap.c:761 +msgid "Stereo" +msgstr "Stereo" + +#: ../src/pulse/channelmap.c:766 +msgid "Surround 4.0" +msgstr "4.0-tilaääni" + +#: ../src/pulse/channelmap.c:772 +msgid "Surround 4.1" +msgstr "4.1-tilaääni" + +#: ../src/pulse/channelmap.c:778 +msgid "Surround 5.0" +msgstr "5.0-tilaääni" + +#: ../src/pulse/channelmap.c:784 +msgid "Surround 5.1" +msgstr "5.1-tilaääni" + +#: ../src/pulse/channelmap.c:791 +msgid "Surround 7.1" +msgstr "7.1-tilaääni" + +#: ../src/pulse/error.c:43 +msgid "OK" +msgstr "OK" + +#: ../src/pulse/error.c:44 +msgid "Access denied" +msgstr "Pääsy evätty" + +#: ../src/pulse/error.c:45 +msgid "Unknown command" +msgstr "Tuntematon komento" + +#: ../src/pulse/error.c:46 +msgid "Invalid argument" +msgstr "Virheellinen argumentti" + +#: ../src/pulse/error.c:47 +msgid "Entity exists" +msgstr "Entiteetti on jo olemassa" + +#: ../src/pulse/error.c:48 +msgid "No such entity" +msgstr "Ei kyseisenlaista entiteettiä" + +#: ../src/pulse/error.c:49 +msgid "Connection refused" +msgstr "Yhteys hylätty" + +#: ../src/pulse/error.c:50 +msgid "Protocol error" +msgstr "Yhteyskäytäntövirhe" + +#: ../src/pulse/error.c:51 +msgid "Timeout" +msgstr "Aikakatkaisu" + +#: ../src/pulse/error.c:52 +msgid "No authorization key" +msgstr "Ei todentamisavainta" + +#: ../src/pulse/error.c:53 +msgid "Internal error" +msgstr "Sisäinen virhe" + +#: ../src/pulse/error.c:54 +msgid "Connection terminated" +msgstr "Yhteys katkennut" + +#: ../src/pulse/error.c:55 +msgid "Entity killed" +msgstr "Entiteetti lopetettu" + +#: ../src/pulse/error.c:56 +msgid "Invalid server" +msgstr "Virheellinen palvelin" + +#: ../src/pulse/error.c:57 +msgid "Module initalization failed" +msgstr "Moduulin alustus epäonnistui" + +#: ../src/pulse/error.c:58 +msgid "Bad state" +msgstr "Virheellinen tila" + +#: ../src/pulse/error.c:59 +msgid "No data" +msgstr "Ei dataa" + +#: ../src/pulse/error.c:60 +msgid "Incompatible protocol version" +msgstr "Epäyhteensopiva yhteyskäytännön versio" + +#: ../src/pulse/error.c:61 +msgid "Too large" +msgstr "Liian suuri" + +#: ../src/pulse/error.c:62 +msgid "Not supported" +msgstr "Ei tuettu" + +#: ../src/pulse/error.c:63 +msgid "Unknown error code" +msgstr "Tuntematon virhekoodi" + +#: ../src/pulse/error.c:64 +msgid "No such extension" +msgstr "Ei kyseisenlaista laajennusta" + +#: ../src/pulse/error.c:65 +msgid "Obsolete functionality" +msgstr "Puuttuva toiminnallisuus" + +#: ../src/pulse/error.c:66 +msgid "Missing implementation" +msgstr "Puuttuva toteutus" + +#: ../src/pulse/error.c:67 +msgid "Client forked" +msgstr "Asiakasohjelma haarautui" + +#: ../src/pulse/error.c:68 +msgid "Input/Output error" +msgstr "Siirräntävirhe" + +#: ../src/pulse/error.c:69 +msgid "Device or resource busy" +msgstr "Laite tai resurssi on varattu" + +#: ../src/pulse/sample.c:172 +#, c-format +msgid "%s %uch %uHz" +msgstr "%s %u kan. %uHz" + +#: ../src/pulse/sample.c:184 +#, c-format +msgid "%0.1f GiB" +msgstr "%0.1f GiB" + +#: ../src/pulse/sample.c:186 +#, c-format +msgid "%0.1f MiB" +msgstr "%0.1f MiB" + +#: ../src/pulse/sample.c:188 +#, c-format +msgid "%0.1f KiB" +msgstr "%0.1f KiB" + +#: ../src/pulse/sample.c:190 +#, c-format +msgid "%u B" +msgstr "%u B" + +#: ../src/pulse/client-conf-x11.c:55 ../src/utils/pax11publish.c:100 +msgid "XOpenDisplay() failed" +msgstr "XOpenDisplay() epäonnistui" + +#: ../src/pulse/client-conf-x11.c:93 +msgid "Failed to parse cookie data" +msgstr "Evästetietojen jäsennys epäonnistui" + +#: ../src/pulse/client-conf.c:111 +#, c-format +msgid "Failed to open configuration file '%s': %s" +msgstr "Asetustiedoston avaaminen epäonnistui: ”%s”: %s" + +#: ../src/pulse/context.c:550 +msgid "No cookie loaded. Attempting to connect without." +msgstr "Ei ladattua evästettä. Yritetään yhdistämistä ilman." + +#: ../src/pulse/context.c:693 +#, c-format +msgid "fork(): %s" +msgstr "fork(): %s" + +#: ../src/pulse/context.c:748 +#, c-format +msgid "waitpid(): %s" +msgstr "waitpid(): %s" + +#: ../src/pulse/context.c:1438 +#, c-format +msgid "Received message for unknown extension '%s'" +msgstr "Saatiin viesti tuntemattomalle laajennokselle ”%s”" + +#: ../src/utils/pacat.c:108 +#, c-format +msgid "Failed to drain stream: %s" +msgstr "Virran tyhjentäminen epäonnistui: %s" + +#: ../src/utils/pacat.c:113 +msgid "Playback stream drained." +msgstr "Toistovirta on tyhjennetty." + +#: ../src/utils/pacat.c:123 +msgid "Draining connection to server." +msgstr "Tyhjennetään yhteyttä palvelimelle." + +#: ../src/utils/pacat.c:136 +#, c-format +msgid "pa_stream_drain(): %s" +msgstr "pa_stream_drain(): %s" + +#: ../src/utils/pacat.c:159 +#, c-format +msgid "pa_stream_write() failed: %s" +msgstr "pa_stream_write() epäonnistui: %s" + +#: ../src/utils/pacat.c:197 +#, c-format +msgid "pa_stream_begin_write() failed: %s" +msgstr "pa_stream_write() epäonnistui: %s" + +#: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267 +#, c-format +msgid "pa_stream_peek() failed: %s" +msgstr "pa_stream_peek() epäonnistui: %s" + +#: ../src/utils/pacat.c:307 +msgid "Stream successfully created." +msgstr "Virran luonti onnistui." + +#: ../src/utils/pacat.c:310 +#, c-format +msgid "pa_stream_get_buffer_attr() failed: %s" +msgstr "pa_stream_get_buffer_attr() epäonnistui: %s" + +#: ../src/utils/pacat.c:314 +#, c-format +msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u" +msgstr "Puskuritiedot: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u" + +#: ../src/utils/pacat.c:317 +#, c-format +msgid "Buffer metrics: maxlength=%u, fragsize=%u" +msgstr "Puskuritiedot: maxlength=%u, fragsize=%u" + +#: ../src/utils/pacat.c:321 +#, c-format +msgid "Using sample spec '%s', channel map '%s'." +msgstr "Käytetään näytemäärittelyä ”%s”, kanavakarttaa ”%s”." + +#: ../src/utils/pacat.c:325 +#, c-format +msgid "Connected to device %s (%u, %ssuspended)." +msgstr "Yhdistetty laitteeseen %s (%u, %ssuspended)." + +#: ../src/utils/pacat.c:335 +#, c-format +msgid "Stream error: %s" +msgstr "Virtavirhe: %s" + +#: ../src/utils/pacat.c:345 +#, c-format +msgid "Stream device suspended.%s" +msgstr "Virtalaite keskeytetty.%s" + +#: ../src/utils/pacat.c:347 +#, c-format +msgid "Stream device resumed.%s" +msgstr "Virtalaite palautettu.%s" + +#: ../src/utils/pacat.c:355 +#, c-format +msgid "Stream underrun.%s" +msgstr "Virran alivuoto.%s" + +#: ../src/utils/pacat.c:362 +#, c-format +msgid "Stream overrun.%s" +msgstr "Virran ylivuoto.%s" + +#: ../src/utils/pacat.c:369 +#, c-format +msgid "Stream started.%s" +msgstr "Virta käynnistetty.%s" + +#: ../src/utils/pacat.c:376 +#, c-format +msgid "Stream moved to device %s (%u, %ssuspended).%s" +msgstr "Virta siirretty laitteelle %s (%u, %ssuspended).%s" + +#: ../src/utils/pacat.c:376 +msgid "not " +msgstr "ei " + +#: ../src/utils/pacat.c:383 +#, c-format +msgid "Stream buffer attributes changed.%s" +msgstr "Virran puskuriattribuutteja muutettu.%s" + +#: ../src/utils/pacat.c:415 +#, c-format +msgid "Connection established.%s" +msgstr "Yhteys muodostettu.%s" + +#: ../src/utils/pacat.c:418 +#, c-format +msgid "pa_stream_new() failed: %s" +msgstr "pa_stream_new() epäonnistui: %s" + +#: ../src/utils/pacat.c:450 +#, c-format +msgid "pa_stream_connect_playback() failed: %s" +msgstr "pa_stream_connect_playback() epäonnistui: %s" + +#: ../src/utils/pacat.c:456 +#, c-format +msgid "pa_stream_connect_record() failed: %s" +msgstr "pa_stream_connect_record() epäonnistui: %s" + +#: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857 +#, c-format +msgid "Connection failure: %s" +msgstr "Yhteysvirhe: %s" + +#: ../src/utils/pacat.c:503 +msgid "Got EOF." +msgstr "Saatiin EOF." + +#: ../src/utils/pacat.c:540 +#, c-format +msgid "write() failed: %s" +msgstr "write() epäonnistui: %s" + +#: ../src/utils/pacat.c:561 +msgid "Got signal, exiting." +msgstr "Saatiin signaali, lopetetaan." + +#: ../src/utils/pacat.c:575 +#, c-format +msgid "Failed to get latency: %s" +msgstr "Latenssin selvittäminen epäonnistui: %s" + +#: ../src/utils/pacat.c:580 +#, c-format +msgid "Time: %0.3f sec; Latency: %0.0f usec." +msgstr "Aika: %0.3f s; Latenssi: %0.0f μs." + +#: ../src/utils/pacat.c:599 +#, c-format +msgid "pa_stream_update_timing_info() failed: %s" +msgstr "pa_stream_update_timing_info() epäonnistui: %s" + +#: ../src/utils/pacat.c:609 +#, c-format +msgid "" +"%s [options]\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -r, --record Create a connection for recording\n" +" -p, --playback Create a connection for playback\n" +"\n" +" -v, --verbose Enable verbose operations\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -d, --device=DEVICE The name of the sink/source to " +"connect to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" +" --stream-name=NAME How to call this stream on the " +"server\n" +" --volume=VOLUME Specify the initial (linear) volume " +"in range 0...65536\n" +" --rate=SAMPLERATE The sample rate in Hz (defaults to " +"44100)\n" +" --format=SAMPLEFORMAT The sample type, one of s16le, " +"s16be, u8, float32le,\n" +" float32be, ulaw, alaw, s32le, s32be, " +"s24le, s24be,\n" +" s24-32le, s24-32be (defaults to " +"s16ne)\n" +" --channels=CHANNELS The number of channels, 1 for mono, " +"2 for stereo\n" +" (defaults to 2)\n" +" --channel-map=CHANNELMAP Channel map to use instead of the " +"default\n" +" --fix-format Take the sample format from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-rate Take the sampling rate from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-channels Take the number of channels and the " +"channel map\n" +" from the sink the stream is being " +"connected to.\n" +" --no-remix Don't upmix or downmix channels.\n" +" --no-remap Map channels by index instead of " +"name.\n" +" --latency=BYTES Request the specified latency in " +"bytes.\n" +" --process-time=BYTES Request the specified process time " +"per request in bytes.\n" +" --property=PROPERTY=VALUE Set the specified property to the " +"specified value.\n" +" --raw Record/play raw PCM data.\n" +" --file-format=FFORMAT Record/play formatted PCM data.\n" +" --list-file-formats List available file formats.\n" +msgstr "" +"%s [valitsimet]\n" +"\n" +" -h, --help Näytä tämä ohje\n" +" --version Näytä versio\n" +"\n" +" -r, --record Luo yhteys nauhoitukselle\n" +" -p, --playback Luo yhteys toistolle\n" +"\n" +" -v, --verbose Yksityiskohtaiset tulosteet\n" +"\n" +" -s, --server=PALVELIN Sen palvelimen nimi, johon " +"yhdistetään\n" +" -d, --device=LAITE Sen nielun/lähteen nimi, johon " +"yhdistetään\n" +" -n, --client-name=NIMI Kuinka tätä asiakasohjelmaa " +"kutsutaan palvelimella\n" +" --stream-name=NIMI Kuinka tätä virtaa kutsutaan " +"palvelimella\n" +" --volume=ÄÄNENVOIMAKKUUS Määritä (lineaarinen) " +"aloitusäänenvoimakkuus väliltä 0...65536\n" +" --rate=NÄYTTEENOTTOTAAJUUS Näytteenottotaajuus hertseinä" +"(oletus: 44100)\n" +" --format=NÄYTEMUOTO Näytteen tyyppi, yksi seuraavista:" +"s16le, s16be, u8, float32le,\n" +" float32be, ulaw, alaw, s32le, s32be\n" +"s24le, s24be,\n" +" s24-32le, s24-32be (oletus s16ne)\n" +" --channels=KANAVIA Kanavien määrä, 1=mono, 2=stereo\n" +" (oletus: 2)\n" +" --channel-map=KANAVAKARTTA Oletuksen sijasta käytettävä " +"kanavakartta\n" +" --fix-format Valitse näytemuoto nielusta, jossa " +"virta on\n" +" --fix-rate Valitse näytteenottotaajuus " +"nielusta, jossa virta on\n" +" --fix-channels Valitse kanavien määrä ja " +"kanavakartta nielusta, johon virtaa\n" +" yhdistetään.\n" +" --no-remix Älä yli- tai alimiksaa kanavia.\n" +" --no-remap Kartoita kanavat indeksin mukaan, " +"älä nimen mukaan.\n" +" --latency=TAVUA Pyydä määritettyä latenssia " +"tavuissa.\n" +" --process-time=TAVUA Pyydä määritettyä prosessiaikaa " +"pyyntöä kohti tavuissa.\n" +" --property=ASETUS=ARVO Anna määritetylle asetukselle " +"määritetty arvo.\n" +" --raw Tallenna/soita raakaa PCM-dataa.\n" +" --file-format=TMUOTO Tallenna/soita tietyn muotoista PCM-" +"dataa.\n" +" --list-file-formats Luettele käytettävissä olevat " +"tiedostomuodot.\n" + +#: ../src/utils/pacat.c:731 +#, c-format +msgid "" +"pacat %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pacat %s\n" +"Käännetty libpulsen versiolle %s\n" +"Linkitetty libpulsen versiolle %s\n" + +#: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953 +#, c-format +msgid "Invalid client name '%s'" +msgstr "Virheellinen asiakasohjelman nimi ”%s”" + +#: ../src/utils/pacat.c:779 +#, c-format +msgid "Invalid stream name '%s'" +msgstr "Virheellinen virran nimi ”%s”" + +#: ../src/utils/pacat.c:816 +#, c-format +msgid "Invalid channel map '%s'" +msgstr "Virheellinen kanavakartta ”%s”" + +#: ../src/utils/pacat.c:845 +#, c-format +msgid "Invalid latency specification '%s'" +msgstr "Virheellinen latenssimääritys ”%s”" + +#: ../src/utils/pacat.c:852 +#, c-format +msgid "Invalid process time specification '%s'" +msgstr "Virheellinen prosessiajan määritys ”%s”" + +#: ../src/utils/pacat.c:864 +#, c-format +msgid "Invalid property '%s'" +msgstr "Virheellinen asetus ”%s”" + +#: ../src/utils/pacat.c:881 +#, c-format +msgid "Unknown file format %s." +msgstr "Tuntematon tiedostomuoto %s." + +#: ../src/utils/pacat.c:900 +msgid "Invalid sample specification" +msgstr "Virheellinen näytemääritys" + +#: ../src/utils/pacat.c:910 +#, c-format +msgid "open(): %s" +msgstr "open(): %s" + +#: ../src/utils/pacat.c:915 +#, c-format +msgid "dup2(): %s" +msgstr "dup2(): %s" + +#: ../src/utils/pacat.c:922 +msgid "Too many arguments." +msgstr "Liian monta argumenttia." + +#: ../src/utils/pacat.c:933 +msgid "Failed to generate sample specification for file." +msgstr "Näytemäärityksen generointi tiedostolle epäonnistui." + +#: ../src/utils/pacat.c:953 +msgid "Failed to open audio file." +msgstr "Äänitiedoston avaaminen epäonnistui." + +#: ../src/utils/pacat.c:959 +msgid "" +"Warning: specified sample specification will be overwritten with " +"specification from file." +msgstr "" +"Varoitus: tiedostosta luettava näytemääritys korvaa annetun määrityksen." + +#: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997 +msgid "Failed to determine sample specification from file." +msgstr "Näytemäärityksen selvittäminen tiedostosta epäonnistui." + +#: ../src/utils/pacat.c:971 +msgid "Warning: Failed to determine channel map from file." +msgstr "Varoitus: Kanavakartan selvittäminen tiedostosta epäonnistui." + +#: ../src/utils/pacat.c:982 +msgid "Channel map doesn't match sample specification" +msgstr "Kanavakartta ei vastaa näytemääritystä" + +#: ../src/utils/pacat.c:993 +msgid "Warning: failed to write channel map to file." +msgstr "Varoitus: kanavakartan kirjoittaminen tiedostoon epäonnistui." + +#: ../src/utils/pacat.c:1008 +#, c-format +msgid "" +"Opening a %s stream with sample specification '%s' and channel map '%s'." +msgstr "Avataan %svirta näytemäärityksellä ”%s” ja kanavakartalla ”%s”." + +#: ../src/utils/pacat.c:1009 +msgid "recording" +msgstr "nauhoitus" + +#: ../src/utils/pacat.c:1009 +msgid "playback" +msgstr "toisto" + +#: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267 +msgid "pa_mainloop_new() failed." +msgstr "pa_mainloop_new() epäonnistui." + +#: ../src/utils/pacat.c:1054 +msgid "io_new() failed." +msgstr "io_new() epäonnistui." + +#: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279 +msgid "pa_context_new() failed." +msgstr "pa_context_new() epäonnistui." + +#: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285 +#, c-format +msgid "pa_context_connect() failed: %s" +msgstr "pa_context_connect() epäonnistui: %s" + +#: ../src/utils/pacat.c:1075 +msgid "pa_context_rttime_new() failed." +msgstr "pa_context_new() epäonnistui." + +#: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290 +msgid "pa_mainloop_run() failed." +msgstr "pa_mainloop_run() epäonnistui." + +#: ../src/utils/pasuspender.c:81 +#, c-format +msgid "fork(): %s\n" +msgstr "fork(): %s\n" + +#: ../src/utils/pasuspender.c:92 +#, c-format +msgid "execvp(): %s\n" +msgstr "execvp(): %s\n" + +#: ../src/utils/pasuspender.c:109 +#, c-format +msgid "Failure to suspend: %s\n" +msgstr "Keskeytys epäonnistui: %s\n" + +#: ../src/utils/pasuspender.c:124 +#, c-format +msgid "Failure to resume: %s\n" +msgstr "Palautus epäonnistui: %s\n" + +#: ../src/utils/pasuspender.c:147 +#, c-format +msgid "WARNING: Sound server is not local, not suspending.\n" +msgstr "VAROITUS: Äänipalvelin ei ole paikallinen, ei keskeytetä.\n" + +#: ../src/utils/pasuspender.c:159 +#, c-format +msgid "Connection failure: %s\n" +msgstr "Yhteysvirhe: %s\n" + +#: ../src/utils/pasuspender.c:176 +#, c-format +msgid "Got SIGINT, exiting.\n" +msgstr "Saatiin SIGINT, lopetetaan.\n" + +#: ../src/utils/pasuspender.c:194 +#, c-format +msgid "WARNING: Child process terminated by signal %u\n" +msgstr "VAROITUS: Lapsiprosessi lopetettiin signaalilla %u\n" + +#: ../src/utils/pasuspender.c:212 +#, c-format +msgid "" +"%s [options] ... \n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +"\n" +msgstr "" +"%s [valitsimet] ... \n" +"\n" +" -h, --help Näytä tämä ohje\n" +" --version Näytä versio\n" +" -s, --server=PALVELIN Sen palvelimen nimi, johon\n" +" yhdistetään\n" +"\n" + +#: ../src/utils/pasuspender.c:248 +#, c-format +msgid "" +"pasuspender %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pasuspender %s\n" +"Käännetty libpulsen versiolle %s\n" +"Linkitetty libpulsen versiolle %s\n" + +#: ../src/utils/pasuspender.c:277 +#, c-format +msgid "pa_mainloop_new() failed.\n" +msgstr "pa_mainloop_new() epäonnistui.\n" + +#: ../src/utils/pasuspender.c:290 +#, c-format +msgid "pa_context_new() failed.\n" +msgstr "pa_context_new() epäonnistui.\n" + +#: ../src/utils/pasuspender.c:298 +#, c-format +msgid "pa_mainloop_run() failed.\n" +msgstr "pa_mainloop_run() epäonnistui.\n" + +#: ../src/utils/pactl.c:135 +#, c-format +msgid "Failed to get statistics: %s" +msgstr "Tilastojen selvittäminen epäonnistui: %s" + +#: ../src/utils/pactl.c:141 +#, c-format +msgid "Currently in use: %u blocks containing %s bytes total.\n" +msgstr "Nyt käytössä: %u lohkoa sisältäen yhteensä %s tavua.\n" + +#: ../src/utils/pactl.c:144 +#, c-format +msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n" +msgstr "Koko käyttöaikana varattu: %u lohkoa sisältäen yhteensä %s tavua.\n" + +#: ../src/utils/pactl.c:147 +#, c-format +msgid "Sample cache size: %s\n" +msgstr "Näytevälimuistin koko: %s\n" + +#: ../src/utils/pactl.c:156 +#, c-format +msgid "Failed to get server information: %s" +msgstr "Palvelintietojen selvittäminen epäonnistui: %s" + +#: ../src/utils/pactl.c:164 +#, c-format +msgid "" +"User name: %s\n" +"Host Name: %s\n" +"Server Name: %s\n" +"Server Version: %s\n" +"Default Sample Specification: %s\n" +"Default Channel Map: %s\n" +"Default Sink: %s\n" +"Default Source: %s\n" +"Cookie: %08x\n" +msgstr "" +"Käyttäjänimi: %s\n" +"Konenimi: %s\n" +"Palvelimen nimi: %s\n" +"Palvelimen versio: %s\n" +"Oletusnäytemäärittely: %s\n" +"Oletuskanavakartta: %s\n" +"Oletusnielu: %s\n" +"Oletuslähde: %s\n" +"Eväste: %08x\n" + +#: ../src/utils/pactl.c:205 +#, c-format +msgid "Failed to get sink information: %s" +msgstr "Nielun tietojen nouto epäonnistui: %s" + +#: ../src/utils/pactl.c:221 +#, c-format +msgid "" +"Sink #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor Source: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Nielu #%u\n" +"\tTila: %s\n" +"\tNimi: %s\n" +"\tKuvaus: %s\n" +"\tAjuri: %s\n" +"\tNäytemäärittely: %s\n" +"\tKanavakartta: %s\n" +"\tOmistava moduuli: %u\n" +"\tVaimennus: %s\n" +"\tÄänenvoimakkuus: %s%s%s\n" +"\t balanssi %0.2f\n" +"\tPerusäänenvoimakkuus: %s%s%s\n" +"\tTarkkailulähde: %s\n" +"\tLatenssi: %0.0f μs, asetettu %0.0f μs\n" +"\tLiput: %s%s%s%s%s%s\n" +"\tOminaisuudet:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360 +#, c-format +msgid "\tPorts:\n" +msgstr "\tPortit:\n" + +#: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366 +#, c-format +msgid "\tActive Port: %s\n" +msgstr "\tAktiivinen portti: %s\n" + +#: ../src/utils/pactl.c:297 +#, c-format +msgid "Failed to get source information: %s" +msgstr "Lähteen tietojen nouto epäonnistui: %s" + +#: ../src/utils/pactl.c:313 +#, c-format +msgid "" +"Source #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor of Sink: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Lähde #%u\n" +"\tTila: %s\n" +"\tNimi: %s\n" +"\tKuvaus: %s\n" +"\tAjuri: %s\n" +"\tNäytemäärittely: %s\n" +"\tKanavakartta: %s\n" +"\tOmistava moduuli: %u\n" +"\tVaimennus: %s\n" +"\tÄänenvoimakkuus: %s%s%s\n" +"\t balanssi %0.2f\n" +"\tPerusäänenvoimakkuus: %s%s%s\n" +"\tTarkkailtava nielu: %s\n" +"\tLatenssi: %0.0f μs, asetettu %0.0f μs\n" +"\tLiput: %s%s%s%s%s%s\n" +"\tOminaisuudet:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:345 ../src/utils/pactl.c:401 ../src/utils/pactl.c:436 +#: ../src/utils/pactl.c:473 ../src/utils/pactl.c:532 ../src/utils/pactl.c:533 +#: ../src/utils/pactl.c:543 ../src/utils/pactl.c:587 ../src/utils/pactl.c:588 +#: ../src/utils/pactl.c:594 ../src/utils/pactl.c:637 ../src/utils/pactl.c:638 +#: ../src/utils/pactl.c:645 +msgid "n/a" +msgstr "-" + +#: ../src/utils/pactl.c:375 +#, c-format +msgid "Failed to get module information: %s" +msgstr "Moduulin tietojen nouto epäonnistui: %s" + +#: ../src/utils/pactl.c:393 +#, c-format +msgid "" +"Module #%u\n" +"\tName: %s\n" +"\tArgument: %s\n" +"\tUsage counter: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Moduuli #%u\n" +"\tNimi: %s\n" +"\tArgumentti: %s\n" +"\tKäyttölaskuri: %s\n" +"\tOminaisuudet:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:412 +#, c-format +msgid "Failed to get client information: %s" +msgstr "Asiakkaan tietojen nouto epäonnistui: %s" + +#: ../src/utils/pactl.c:430 +#, c-format +msgid "" +"Client #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Asiakas #%u\n" +"\tAjuri: %s\n" +"\tOmistava moduuli: %s\n" +"\tOminaisuudet:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:447 +#, c-format +msgid "Failed to get card information: %s" +msgstr "Kortin tietojen nouto epäonnistui: %s" + +#: ../src/utils/pactl.c:465 +#, c-format +msgid "" +"Card #%u\n" +"\tName: %s\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Kortti #%u\n" +"\tNimi: %s\n" +"\tAjuri: %s\n" +"\tOmistava moduuli: %s\n" +"\tOminaisuudet:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:479 +#, c-format +msgid "\tProfiles:\n" +msgstr "\tProfiilit:\n" + +#: ../src/utils/pactl.c:485 +#, c-format +msgid "\tActive Profile: %s\n" +msgstr "\tAktiivinen profiili: %s\n" + +#: ../src/utils/pactl.c:496 +#, c-format +msgid "Failed to get sink input information: %s" +msgstr "Nielun sisääntulon tietojen nouto epäonnistui: %s" + +#: ../src/utils/pactl.c:515 +#, c-format +msgid "" +"Sink Input #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSink: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tMute: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSink Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Nielun sisääntulo #%u\n" +"\tAjuri: %s\n" +"\tOmistava moduuli: %s\n" +"\tAsiakas: %s\n" +"\tNielu: %u\n" +"\tNäytemäärittely: %s\n" +"\tKanavakartta: %s\n" +"\tVaimennus: %s\n" +"\tÄänenvoimakkuus: %s\n" +"\t %s\n" +"\t balanssi %0.2f\n" +"\tPuskurin latenssi: %0.0f μs\n" +"\tNielun latenssi: %0.0f μs\n" +"\tUudelleennäytteistyksen tapa: %s\n" +"\tOminaisuudet:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:554 +#, c-format +msgid "Failed to get source output information: %s" +msgstr "Lähteen ulostulon tietojen nouto epäonnistui: %s" + +#: ../src/utils/pactl.c:574 +#, c-format +msgid "" +"Source Output #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSource: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSource Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Lähteen ulostulo #%u\n" +"\tAjuri: %s\n" +"\tOmistava moduuli: %s\n" +"\tAsiakas: %s\n" +"\tLähde: %u\n" +"\tNäytemäärittely: %s\n" +"\tKanavakartta: %s\n" +"\tPuskurin latenssi: %0.0f μs\n" +"\tLähteen latenssi: %0.0f μs\n" +"\tUudelleennäytteistyksen tapa: %s\n" +"\tOminaisuudet:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:605 +#, c-format +msgid "Failed to get sample information: %s" +msgstr "Näytetietojen nouto epäonnistui: %s" + +#: ../src/utils/pactl.c:623 +#, c-format +msgid "" +"Sample #%u\n" +"\tName: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tDuration: %0.1fs\n" +"\tSize: %s\n" +"\tLazy: %s\n" +"\tFilename: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Näyte #%u\n" +"\tNimi: %s\n" +"\tNäytemäärittely: %s\n" +"\tKanavakartta: %s\n" +"\tÄänenvoimakkuus: %s\n" +"\t %s\n" +"\t balanssi %0.2f\n" +"\tKesto: %0.1fs\n" +"\tKoko: %s\n" +"\tLaiska: %s\n" +"\tTiedostonimi: %s\n" +"\tOminaisuudet:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663 +#, c-format +msgid "Failure: %s" +msgstr "Epäonnistuminen: %s" + +#: ../src/utils/pactl.c:687 +#, c-format +msgid "Failed to upload sample: %s" +msgstr "Näytteen lähettäminen epäonnistui: %s" + +#: ../src/utils/pactl.c:704 +msgid "Premature end of file" +msgstr "Ennenaikainen tiedoston päättyminen" + +#: ../src/utils/pactl.c:863 +msgid "Got SIGINT, exiting." +msgstr "Saatiin SIGINT, lopetetaan." + +#: ../src/utils/pactl.c:869 +#, c-format +msgid "" +"%s [options] stat\n" +"%s [options] list\n" +"%s [options] exit\n" +"%s [options] upload-sample FILENAME [NAME]\n" +"%s [options] play-sample NAME [SINK]\n" +"%s [options] remove-sample NAME\n" +"%s [options] move-sink-input SINKINPUT SINK\n" +"%s [options] move-source-output SOURCEOUTPUT SOURCE\n" +"%s [options] load-module NAME [ARGS ...]\n" +"%s [options] unload-module MODULE\n" +"%s [options] suspend-sink SINK 1|0\n" +"%s [options] suspend-source SOURCE 1|0\n" +"%s [options] set-card-profile CARD PROFILE\n" +"%s [options] set-sink-port SINK PORT\n" +"%s [options] set-source-port SOURCE PORT\n" +"%s [options] set-sink-volume SINK VOLUME\n" +"%s [options] set-source-volume SOURCE VOLUME\n" +"%s [options] set-sink-input-volume SINKINPUT VOLUME\n" +"%s [options] set-sink-mute SINK 1|0\n" +"%s [options] set-source-mute SOURCE 1|0\n" +"%s [options] set-sink-input-mute SINKINPUT 1|0\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" +msgstr "" +"%s [valitsimet] stat\n" +"%s [valitsimet] list\n" +"%s [valitsimet] exit\n" +"%s [valitsimet] upload-sample TIEDOSTONIMI [NIMI]\n" +"%s [valitsimet] play-sample NIMI [NIELU]\n" +"%s [valitsimet] remove-sample NIMI\n" +"%s [valitsimet] move-sink-input NIELUSISÄÄNMENO NIELU\n" +"%s [valitsimet] move-source-output LÄHDEULOSTULO LÄHDE\n" +"%s [valitsimet] load-module NIMI [ARGUMENTIT ...]\n" +"%s [valitsimet] unload-module MODUULI\n" +"%s [valitsimet] suspend-sink NIELU 1|0\n" +"%s [valitsimet] suspend-source LÄHDE 1|0\n" +"%s [valitsimet] set-card-profile KORTTI PROFIILI\n" +"%s [valitsimet] set-sink-port NIELU PORTTI\n" +"%s [valitsimet] set-source-port LÄHDE PORTTI\n" +"%s [valitsimet] set-sink-volume NIELU VOIMAKKUUS\n" +"%s [valitsimet] set-source-volume LÄHDE VOIMAKKUUS\n" +"%s [valitsimet] set-sink-input-volume NIELUSISÄÄNMENO VOIMAKKUUS\n" +"%s [valitsimet] set-sink-mute NIELU 1|0\n" +"%s [valitsimet] set-source-mute LÄHDE 1|0\n" +"%s [valitsimet] set-sink-input-mute NIELUSISÄÄNMENO 1|0\n" +"\n" +" -h, --help Näytä tämä ohje\n" +" --version Näytä versio\n" +"\n" +" -s, --server=PALVELIN Sen palvelimen nimi, johon " +"yhdistetään\n" +" -n, --client-name=NIMI Kuinka tätä asiakasohjelmaa " +"kutsutaan palvelimella\n" + +#: ../src/utils/pactl.c:933 +#, c-format +msgid "" +"pactl %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pactl %s\n" +"Käännetty libpulsen versiolle %s\n" +"Linkitetty libpulsen versiolle %s\n" + +#: ../src/utils/pactl.c:979 +msgid "Please specify a sample file to load" +msgstr "Anna ladattava näytetiedosto" + +#: ../src/utils/pactl.c:992 +msgid "Failed to open sound file." +msgstr "Äänitiedoston avaaminen epäonnistui." + +#: ../src/utils/pactl.c:1004 +msgid "Warning: Failed to determine sample specification from file." +msgstr "Varoitus: näytemäärityksen selvitys tiedostosta epäonnistui." + +#: ../src/utils/pactl.c:1014 +msgid "You have to specify a sample name to play" +msgstr "Soitettavan näytteen nimi on annettava" + +#: ../src/utils/pactl.c:1026 +msgid "You have to specify a sample name to remove" +msgstr "Poistettavan näytteen nimi on annettava" + +#: ../src/utils/pactl.c:1035 +msgid "You have to specify a sink input index and a sink" +msgstr "Nielun syöteindeksi ja nielu on annettava" + +#: ../src/utils/pactl.c:1045 +msgid "You have to specify a source output index and a source" +msgstr "Lähteen ulostuloindeksi ja lähde on annettava" + +#: ../src/utils/pactl.c:1060 +msgid "You have to specify a module name and arguments." +msgstr "Moduulin nimi ja argumentit on annettava." + +#: ../src/utils/pactl.c:1080 +msgid "You have to specify a module index" +msgstr "Moduulin indeksi on annettava" + +#: ../src/utils/pactl.c:1090 +msgid "" +"You may not specify more than one sink. You have to specify a boolean value." +msgstr "Ei voi antaa enempää kuin yhden nielun. Totuusarvo on annettava." + +#: ../src/utils/pactl.c:1103 +msgid "" +"You may not specify more than one source. You have to specify a boolean " +"value." +msgstr "Ei voi antaa enempää kuin yhden lähteen. Totuusarvo on annettava." + +#: ../src/utils/pactl.c:1115 +msgid "You have to specify a card name/index and a profile name" +msgstr "Kortin nimi/indeksi ja profiilin nimi on annettava" + +#: ../src/utils/pactl.c:1126 +msgid "You have to specify a sink name/index and a port name" +msgstr "Nielun nimi/indeksi ja portin nimi on annettava" + +#: ../src/utils/pactl.c:1137 +msgid "You have to specify a source name/index and a port name" +msgstr "Lähteen nimi/indeksi ja portin nimi on annettava" + +#: ../src/utils/pactl.c:1149 +msgid "You have to specify a sink name/index and a volume" +msgstr "Nielun nimi/indeksi ja portin nimi on annettava" + +#: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171 +#: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209 +#: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248 +msgid "Invalid volume specification" +msgstr "Virheellinen äänenvoimakkuuden määritys" + +#: ../src/utils/pactl.c:1166 +msgid "You have to specify a source name/index and a volume" +msgstr "Lähteen nimi/indeksi ja äänenvoimakkuus on annettava" + +#: ../src/utils/pactl.c:1183 +msgid "You have to specify a sink input index and a volume" +msgstr "Nielun syöteindeksi ja äänenvoimakkuus on annettava" + +#: ../src/utils/pactl.c:1188 +msgid "Invalid sink input index" +msgstr "Virheellinen nielun syöteindeksi" + +#: ../src/utils/pactl.c:1204 +msgid "You have to specify a sink name/index and a mute boolean" +msgstr "Nielun nimi/indeksi ja vaimennuksen totuusarvo on annettava" + +#: ../src/utils/pactl.c:1221 +msgid "You have to specify a source name/index and a mute boolean" +msgstr "Lähteen nimi/indeksi ja vaimennuksen totuusarvo on annettava" + +#: ../src/utils/pactl.c:1238 +msgid "You have to specify a sink input index and a mute boolean" +msgstr "Nielun syöteindeksi ja vaimennuksen totuusarvo on annettava" + +#: ../src/utils/pactl.c:1243 +msgid "Invalid sink input index specification" +msgstr "Virheellinen nielun syöteindeksin määritys" + +#: ../src/utils/pactl.c:1262 +msgid "No valid command specified." +msgstr "Mitään kelvollista komentoa ei annettu." + +#: ../src/utils/pax11publish.c:61 +#, c-format +msgid "" +"%s [-D display] [-S server] [-O sink] [-I source] [-c file] [-d|-e|-i|-r]\n" +"\n" +" -d Show current PulseAudio data attached to X11 display (default)\n" +" -e Export local PulseAudio data to X11 display\n" +" -i Import PulseAudio data from X11 display to local environment " +"variables and cookie file.\n" +" -r Remove PulseAudio data from X11 display\n" +msgstr "" +"%s [-D näyttö] [-S palvelin] [-O nielu] [-I lähde] [-c tiedosto] [-d|-e|-i|-" +"r]\n" +"\n" +" -d Näytä nykyiseen X11-näyttöön yhdistetyn PulseAudion tiedot (oletus)\n" +" -e Vie paikalliset PulseAudio-tiedot X11-näytölle\n" +" -i Tuo PulseAudio-tiedot X11-näytöltä paikallisiin ympäristömuuttujiin " +"ja\n" +" evästetiedostoon.\n" +" -r Poista PulseAudio-tiedostot X11-näytöltä\n" + +#: ../src/utils/pax11publish.c:94 +#, c-format +msgid "Failed to parse command line.\n" +msgstr "Komentorivin jäsentäminen epäonnistui.\n" + +#: ../src/utils/pax11publish.c:108 +#, c-format +msgid "Server: %s\n" +msgstr "Palvelin: %s\n" + +#: ../src/utils/pax11publish.c:110 +#, c-format +msgid "Source: %s\n" +msgstr "Lähde: %s\n" + +#: ../src/utils/pax11publish.c:112 +#, c-format +msgid "Sink: %s\n" +msgstr "Nielu: %s\n" + +#: ../src/utils/pax11publish.c:114 +#, c-format +msgid "Cookie: %s\n" +msgstr "Eväste: %s\n" + +#: ../src/utils/pax11publish.c:132 +#, c-format +msgid "Failed to parse cookie data\n" +msgstr "Evästetietojen jäsennys epäonnistui\n" + +#: ../src/utils/pax11publish.c:137 +#, c-format +msgid "Failed to save cookie data\n" +msgstr "Evästetietojen tallennus epäonnistui\n" + +#: ../src/utils/pax11publish.c:152 +#, c-format +msgid "Failed to load client configuration file.\n" +msgstr "Asiakasohjelman asetustiedoston lataaminen epäonnistui.\n" + +#: ../src/utils/pax11publish.c:157 +#, c-format +msgid "Failed to read environment configuration data.\n" +msgstr "Ympäristön asetustietojen lukeminen epäonnistui.\n" + +#: ../src/utils/pax11publish.c:174 +#, c-format +msgid "Failed to get FQDN.\n" +msgstr "Verkkonimen saaminen epäonnistui.\n" + +#: ../src/utils/pax11publish.c:194 +#, c-format +msgid "Failed to load cookie data\n" +msgstr "Evästetietojen lataaminen epäonnistui\n" + +#: ../src/utils/pax11publish.c:211 +#, c-format +msgid "Not yet implemented.\n" +msgstr "Toteutusta ei vielä ole.\n" + +#: ../src/utils/pacmd.c:69 +msgid "No PulseAudio daemon running, or not running as session daemon." +msgstr "" +"PulseAudio-taustaprosessi ei ole käynnissä eikä PulseAudiota suoriteta " +"istunnon taustaprosessina." + +#: ../src/utils/pacmd.c:74 +#, c-format +msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s" +msgstr "socket(PF_UNIX, SOCK_STREAM, 0): %s" + +#: ../src/utils/pacmd.c:91 +#, c-format +msgid "connect(): %s" +msgstr "connect(): %s" + +#: ../src/utils/pacmd.c:99 +msgid "Failed to kill PulseAudio daemon." +msgstr "PulseAudio-taustaprosessin lopettaminen epäonnistui." + +#: ../src/utils/pacmd.c:107 +msgid "Daemon not responding." +msgstr "Taustaprosessi ei vastaa." + +#: ../src/utils/pacmd.c:161 +#, c-format +msgid "poll(): %s" +msgstr "poll(): %s" + +#: ../src/utils/pacmd.c:171 ../src/utils/pacmd.c:188 +#, c-format +msgid "read(): %s" +msgstr "read(): %s" + +#: ../src/utils/pacmd.c:207 ../src/utils/pacmd.c:223 +#, c-format +msgid "write(): %s" +msgstr "write(): %s" + +#: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:219 +msgid "Cannot access autospawn lock." +msgstr "Automaattisen käynnistyksen lukkoa ei voida käyttää." + +#: ../src/modules/alsa/alsa-sink.c:530 ../src/modules/alsa/alsa-sink.c:689 +#, c-format +msgid "" +"ALSA woke us up to write new data to the device, but there was actually " +"nothing to write!\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers.\n" +"We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() " +"returned 0 or another value < min_avail." +msgstr "" +"ALSA herätti taustaprosessin kirjoittamaan uutta dataa laitteelle, mutta " +"mitään kirjoitettavaa ei ollut!\n" +"Tämä on luultavasti ohjelmavirhe ALSA-ajurissa ”%s”. Raportoi tästä " +"ongelmasta ALSA-kehittäjille. Taustaprosessi herätettiin POLLOUT " +"asetettuna, snd_pcm_avail() palautti kuitenkin 0 tai jonkin muun arvon, " +"joka on < min_avail." + +#: ../src/modules/alsa/alsa-source.c:506 ../src/modules/alsa/alsa-source.c:656 +#, c-format +msgid "" +"ALSA woke us up to read new data from the device, but there was actually " +"nothing to read!\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers.\n" +"We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() " +"returned 0 or another value < min_avail." +msgstr "" +"ALSA herätti taustaprosessin lukemaan uutta dataa laitteelta, mutta mitään " +"luettavaa ei ollut!\n" +"Tämä on luultavasti ohjelmavirhe ALSA-ajurissa ”%s”. Raportoi tästä " +"ongelmasta ALSA-kehittäjille. Taustaprosessi herätettiin POLLIN asetettuna, " +"snd_pcm_avail() palautti kuitenkin 0 tai jonkin muun arvon, on < min_avail." + +#: ../src/modules/alsa/module-alsa-card.c:152 +#: ../src/modules/bluetooth/module-bluetooth-device.c:2228 +#: ../src/modules/alsa/alsa-mixer.c:2931 +msgid "Off" +msgstr "Poissa" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2184 +msgid "High Fidelity Playback (A2DP)" +msgstr "Korkean äänenlaadun toisto (A2DP)" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2198 +msgid "High Fidelity Capture (A2DP)" +msgstr "Korkean äänenlaadun tallennus (A2DP)" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2213 +msgid "Telephony Duplex (HSP/HFP)" +msgstr "" + +#: ../src/modules/reserve-wrap.c:151 +msgid "PulseAudio Sound Server" +msgstr "PulseAudio-äänipalvelin" + +#: ../src/modules/module-rygel-media-server.c:569 +#: ../src/modules/module-rygel-media-server.c:583 +msgid "Output Devices" +msgstr "Ulostulolaitteet" + +#: ../src/modules/module-rygel-media-server.c:570 +#: ../src/modules/module-rygel-media-server.c:584 +msgid "Input Devices" +msgstr "Sisääntulolaitteet" + +#: ../src/modules/module-rygel-media-server.c:774 +msgid "Audio on @HOSTNAME@" +msgstr "Ääni koneella @HOSTNAME@" + +#: ../src/modules/alsa/alsa-mixer.c:1701 +msgid "Input" +msgstr "Sisääntulo" + +#: ../src/modules/alsa/alsa-mixer.c:1702 +msgid "Docking Station Input" +msgstr "Telakan sisääntulo" + +#: ../src/modules/alsa/alsa-mixer.c:1703 +msgid "Docking Station Microphone" +msgstr "Telakan mikrofoni" + +#: ../src/modules/alsa/alsa-mixer.c:1704 +msgid "Line-In" +msgstr "Linjasisääntulo" + +#: ../src/modules/alsa/alsa-mixer.c:1705 +msgid "Microphone" +msgstr "Mikrofoni" + +#: ../src/modules/alsa/alsa-mixer.c:1706 +msgid "External Microphone" +msgstr "Ulkoinen mikrofoni" + +#: ../src/modules/alsa/alsa-mixer.c:1707 +msgid "Internal Microphone" +msgstr "Sisäinen mikrofoni" + +#: ../src/modules/alsa/alsa-mixer.c:1708 +msgid "Radio" +msgstr "Radio" + +#: ../src/modules/alsa/alsa-mixer.c:1709 +msgid "Video" +msgstr "Video" + +#: ../src/modules/alsa/alsa-mixer.c:1710 +msgid "Automatic Gain Control" +msgstr "Automaattinen äänenvoimakkuuden säätö" + +#: ../src/modules/alsa/alsa-mixer.c:1711 +msgid "No Automatic Gain Control" +msgstr "Ei automaattista äänenvoimakkuuden säätöä" + +#: ../src/modules/alsa/alsa-mixer.c:1712 +msgid "Boost" +msgstr "Vahvistus" + +#: ../src/modules/alsa/alsa-mixer.c:1713 +msgid "No Boost" +msgstr "Ei vahvistusta" + +#: ../src/modules/alsa/alsa-mixer.c:1714 +msgid "Amplifier" +msgstr "Vahvistin" + +#: ../src/modules/alsa/alsa-mixer.c:1715 +msgid "No Amplifier" +msgstr "Ei vahvistinta" + +#: ../src/modules/alsa/alsa-mixer.c:1773 +msgid "Analog Input" +msgstr "Analoginen sisääntulo" + +#: ../src/modules/alsa/alsa-mixer.c:1774 +msgid "Analog Microphone" +msgstr "Analoginen mikrofoni" + +#: ../src/modules/alsa/alsa-mixer.c:1775 +msgid "Analog Line-In" +msgstr "Analoginen linjasisääntulo" + +#: ../src/modules/alsa/alsa-mixer.c:1776 +msgid "Analog Radio" +msgstr "Analoginen radio" + +#: ../src/modules/alsa/alsa-mixer.c:1777 +msgid "Analog Video" +msgstr "Analoginen video" + +#: ../src/modules/alsa/alsa-mixer.c:1778 +msgid "Analog Output" +msgstr "Analoginen ulostulo" + +#: ../src/modules/alsa/alsa-mixer.c:1779 +msgid "Analog Headphones" +msgstr "Analoginen kuulokeliitäntä" + +#: ../src/modules/alsa/alsa-mixer.c:1780 +msgid "Analog Output (LFE)" +msgstr "Analoginen ulostulo (LFE)" + +#: ../src/modules/alsa/alsa-mixer.c:1781 +msgid "Analog Mono Output" +msgstr "Analoginen monoulostulo" + +#: ../src/modules/alsa/alsa-mixer.c:1981 +#, c-format +msgid "%s+%s" +msgstr "%s+%s" + +#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404 +#, c-format +msgid "%s / %s" +msgstr "%s / %s" + +#: ../src/modules/alsa/alsa-mixer.c:2790 +msgid "Analog Mono" +msgstr "Analoginen mono" + +#: ../src/modules/alsa/alsa-mixer.c:2791 +msgid "Analog Stereo" +msgstr "Analoginen stereo" + +#: ../src/modules/alsa/alsa-mixer.c:2792 +msgid "Analog Surround 2.1" +msgstr "Analoginen tilaääni 2.1" + +#: ../src/modules/alsa/alsa-mixer.c:2793 +msgid "Analog Surround 3.0" +msgstr "Analoginen tilaääni 3.0" + +#: ../src/modules/alsa/alsa-mixer.c:2794 +msgid "Analog Surround 3.1" +msgstr "Analoginen tilaääni 3.1" + +#: ../src/modules/alsa/alsa-mixer.c:2795 +msgid "Analog Surround 4.0" +msgstr "Analoginen tilaääni 4.0" + +#: ../src/modules/alsa/alsa-mixer.c:2796 +msgid "Analog Surround 4.1" +msgstr "Analoginen tilaääni 4.1" + +#: ../src/modules/alsa/alsa-mixer.c:2797 +msgid "Analog Surround 5.0" +msgstr "Analoginen tilaääni 5.0" + +#: ../src/modules/alsa/alsa-mixer.c:2798 +msgid "Analog Surround 5.1" +msgstr "Analoginen tilaääni 5.1" + +#: ../src/modules/alsa/alsa-mixer.c:2799 +msgid "Analog Surround 6.0" +msgstr "Analoginen tilaääni 6.0" + +#: ../src/modules/alsa/alsa-mixer.c:2800 +msgid "Analog Surround 6.1" +msgstr "Analoginen tilaääni 6.1" + +#: ../src/modules/alsa/alsa-mixer.c:2801 +msgid "Analog Surround 7.0" +msgstr "Analoginen tilaääni 7.0" + +#: ../src/modules/alsa/alsa-mixer.c:2802 +msgid "Analog Surround 7.1" +msgstr "Analoginen tilaääni 7.1" + +#: ../src/modules/alsa/alsa-mixer.c:2803 +msgid "Digital Stereo (IEC958)" +msgstr "Digitaalinen stereo (IEC958)" + +#: ../src/modules/alsa/alsa-mixer.c:2804 +msgid "Digital Surround 4.0 (IEC958)" +msgstr "Digitaalinen tilaääni 4.0 (IEC958)" + +#: ../src/modules/alsa/alsa-mixer.c:2805 +msgid "Digital Surround 4.0 (IEC958/AC3)" +msgstr "Digitaalinen tilaääni 4.0 (IEC958/AC3)" + +#: ../src/modules/alsa/alsa-mixer.c:2806 +msgid "Digital Surround 5.1 (IEC958/AC3)" +msgstr "Digitaalinen tilaääni 5.1 (IEC958/AC3)" + +#: ../src/modules/alsa/alsa-mixer.c:2807 +msgid "Digital Stereo (HDMI)" +msgstr "Digitaalinen stereo (HDMI)" + +#: ../src/modules/alsa/alsa-mixer.c:2928 +#, fuzzy +msgid "Analog Mono Duplex" +msgstr "Analoginen mono" + +#: ../src/modules/alsa/alsa-mixer.c:2929 +#, fuzzy +msgid "Analog Stereo Duplex" +msgstr "Analoginen stereo" + +#: ../src/modules/alsa/alsa-mixer.c:2930 +#, fuzzy +msgid "Digital Stereo Duplex (IEC958)" +msgstr "Digitaalinen stereo (IEC958)" + +#~ msgid "Invalid client name '%s'\n" +#~ msgstr "Virheellinen asiakasohjelman nimi ”%s”\n" + +#~ msgid "Failed to determine sample specification from file.\n" +#~ msgstr "Näytemäärityksen selvitys tiedostosta epäonnistui: %s\n" + +#~ msgid "select(): %s" +#~ msgstr "select(): %s" + +#~ msgid "Cannot connect to system bus: %s" +#~ msgstr "Järjestelmäväylään ei voida yhdistää: %s" + +#~ msgid "Cannot get caller from PID: %s" +#~ msgstr "Kutsujaa ei saada PID:stä: %s" + +#~ msgid "Cannot set UID on caller object." +#~ msgstr "UID:tä ei voida asettaa kutsujaobjektille." + +#~ msgid "Failed to get CK session." +#~ msgstr "CK-istunnon saaminen epäonnistui." + +#~ msgid "Cannot set UID on session object." +#~ msgstr "UID:tä ei voida asettaa istunto-objektille." + +#~ msgid "Cannot allocate PolKitAction." +#~ msgstr "Ei voida varata PolKitActionia." + +#~ msgid "Cannot set action_id" +#~ msgstr "Ei voida asettaa action_id:tä" + +#~ msgid "Cannot allocate PolKitContext." +#~ msgstr "Ei voida varata PolKitContextia." + +#~ msgid "Cannot initialize PolKitContext: %s" +#~ msgstr "Ei voida alustaa PolKitContextia: %s" + +#~ msgid "Could not determine whether caller is authorized: %s" +#~ msgstr "Ei voida päätellä onko kutsujalla käyttöoikeus: %s" + +#~ msgid "Cannot obtain auth: %s" +#~ msgstr "Tunnistautumista ei saada: %s" + +#~ msgid "PolicyKit responded with '%s'" +#~ msgstr "PolicyKit vastasi ”%s”" + +#~ msgid "" +#~ "High-priority scheduling (negative Unix nice level) for the PulseAudio " +#~ "daemon" +#~ msgstr "" +#~ "Korkean prioriteetin ajoitus (negatiivinen Unix-nice-taso) PulseAudio-" +#~ "taustajärjestelmälle" + +#~ msgid "Real-time scheduling for the PulseAudio daemon" +#~ msgstr "Reaaliaikainen ajoitus PulseAudio-taustajärjestelmälle" + +#~ msgid "" +#~ "System policy prevents PulseAudio from acquiring high-priority scheduling." +#~ msgstr "" +#~ "Järjestelmäkäytäntö estää PulseAudiota saamasta korkean prioriteetin " +#~ "ajoitusta." + +#~ msgid "" +#~ "System policy prevents PulseAudio from acquiring real-time scheduling." +#~ msgstr "" +#~ "Järjestelmäkäytäntö estää PulseAudiota saamasta reaaliaikaista ajoitusta." + +#~ msgid "read() failed: %s\n" +#~ msgstr "read() epäonnistui: %s\n" + +#, fuzzy +#~ msgid "pa_context_connect() failed: %s\n" +#~ msgstr "pa_context_connect() epäonnistui: %s" + +#~ msgid "We're in the group '%s', allowing high-priority scheduling." +#~ msgstr "Ollaan ryhmässä ”%s”, korkean prioriteetin ajoitus on sallittua." + +#~ msgid "We're in the group '%s', allowing real-time scheduling." +#~ msgstr "Ollaan ryhmässä ”%s”, tosiaikainen vuorottaminen on sallittua." + +#~ msgid "PolicyKit grants us acquire-high-priority privilege." +#~ msgstr "PolicyKit myöntää acquire-high-priority-oikeuden." + +#~ msgid "PolicyKit refuses acquire-high-priority privilege." +#~ msgstr "PolicyKit ei myönnä acquire-high-priority-oikeutta." + +#~ msgid "PolicyKit grants us acquire-real-time privilege." +#~ msgstr "PolicyKit myöntää acquire-real-time-oikeuden." + +#~ msgid "PolicyKit refuses acquire-real-time privilege." +#~ msgstr "PolicyKit ei myönnä acquire-real-time-oikeutta." + +#~ msgid "" +#~ "Called SUID root and real-time and/or high-priority scheduling was " +#~ "requested in the configuration. However, we lack the necessary " +#~ "privileges:\n" +#~ "We are not in group '%s', PolicyKit refuse to grant us the requested " +#~ "privileges and we have no increase RLIMIT_NICE/RLIMIT_RTPRIO resource " +#~ "limits.\n" +#~ "For enabling real-time/high-priority scheduling please acquire the " +#~ "appropriate PolicyKit privileges, or become a member of '%s', or increase " +#~ "the RLIMIT_NICE/RLIMIT_RTPRIO resource limits for this user." +#~ msgstr "" +#~ "Ohjelmaa kutsuttiin SUID-rootina ja reaaliaikaista ja/tai korkean " +#~ "prioriteetin ajoitusta pyydettiin asetuksissa. Tarvittavat oikeudet " +#~ "kuitenkin puuttuvat:\n" +#~ "Ei olla ryhmässä ”%s”, PolicyKit ei myönnä pyydettyjä oikeuksia ja " +#~ "RLIMIT_NICE/RLIMIT_RTPRIO-resurssirajoja ei ole kasvatettu.\n" +#~ "Hanki riittävät PolicyKit-oikeudet, liity ryhmään ”%s” tai kasvata tämän " +#~ "käyttäjän RLIMIT_NICE/RLIMIT_RTPRIO-resurssirajoja reaaliaikaisen ja/tai " +#~ "korkean prioriteetin ajoituksen ottamiseksi käyttöön." + +#~ msgid "" +#~ "High-priority scheduling enabled in configuration but not allowed by " +#~ "policy." +#~ msgstr "" +#~ "Korkean prioriteetin ajoitus otettu käyttöön asetuksissa, mutta käytännöt " +#~ "eivät salli sitä." + +#~ msgid "Successfully increased RLIMIT_RTPRIO" +#~ msgstr "RLIMIT_RTPRIO:n kasvatus onnistui" + +#~ msgid "RLIMIT_RTPRIO failed: %s" +#~ msgstr "RLIMIT_RTPRIO epäonnistui: %s" + +#~ msgid "Giving up CAP_NICE" +#~ msgstr "Luovutaan CAP_NICE:stä" + +#~ msgid "" +#~ "Real-time scheduling enabled in configuration but not allowed by policy." +#~ msgstr "" +#~ "Tosiaikainen ajoitus otettu käyttöön asetuksissa, mutta käytännöt eivät " +#~ "salli sitä." + +#~ msgid "Limited capabilities successfully to CAP_SYS_NICE." +#~ msgstr "Oikeuksien rajoittaminen CAP_SYS_NICEen onnistui." + +#~ msgid "time_new() failed.\n" +#~ msgstr "time_new() epäonnistui.\n" + +#~ msgid "Output %s + Input %s" +#~ msgstr "Ulostulo %s + Sisääntulo %s" + +#~ msgid "Stream successfully created\n" +#~ msgstr "Virran luonti onnistui\n" + +#~ msgid "Stream errror: %s\n" +#~ msgstr "Virtavirhe: %s\n" + +#~ msgid "Connection established.\n" +#~ msgstr "Yhteys muodostetettu.\n" + +#~ msgid "" +#~ "%s [options] [FILE]\n" +#~ "\n" +#~ " -h, --help Show this help\n" +#~ " --version Show version\n" +#~ "\n" +#~ " -v, --verbose Enable verbose operation\n" +#~ "\n" +#~ " -s, --server=SERVER The name of the server to connect " +#~ "to\n" +#~ " -d, --device=DEVICE The name of the sink to connect " +#~ "to\n" +#~ " -n, --client-name=NAME How to call this client on the " +#~ "server\n" +#~ " --stream-name=NAME How to call this stream on the " +#~ "server\n" +#~ " --volume=VOLUME Specify the initial (linear) " +#~ "volume in range 0...65536\n" +#~ " --channel-map=CHANNELMAP Set the channel map to the use\n" +#~ msgstr "" +#~ "%s [valitsimet] [TIEDOSTO]\n" +#~ "\n" +#~ " -h, --help Näytä tämä ohje\n" +#~ " --version Näytä tiedostot\n" +#~ "\n" +#~ " -v, --verbose Yksityiskohtaiset tulosteet\n" +#~ "\n" +#~ " -s, --server=PALVELIN Sen palvelimen nimi, johon\n" +#~ " yhdistetään\n" +#~ " -d, --device=LAITE Sen nielun nimi, johon " +#~ "yhdistetään\n" +#~ " -n, --client-name=NIMI Kuinka tätä asiakasohjelmaa " +#~ "kutsutaan\n" +#~ " palvelimella\n" +#~ " --stream-name=NIMI Kuinka tätä virtaa kutsutaan\n" +#~ " palvelimella\n" +#~ " --volume=ÄÄNENVOIMAKKUUS Määritä (lineaarinen) " +#~ "aloitusäänen-\n" +#~ " voimakkuus väliltä 0...65536\n" +#~ " --channel-map=KANAVAKARTTA Aseta käytettävä kanavakartta\n" + +#~ msgid "" +#~ "paplay %s\n" +#~ "Compiled with libpulse %s\n" +#~ "Linked with libpulse %s\n" +#~ msgstr "" +#~ "paplay %s\n" +#~ "Käännetty libpulsen versiolle %s\n" +#~ "Linkitetty libpulsen versiolle %s\n" + +#~ msgid "Invalid channel map\n" +#~ msgstr "Virheellinen kanavakartta\n" + +#~ msgid "Failed to open file '%s'\n" +#~ msgstr "Tiedoston ”%s” avaaminen epäonnistui\n" + +#~ msgid "Channel map doesn't match file.\n" +#~ msgstr "Kanavakartta ei täsmää tiedostoon.\n" + +#~ msgid "Using sample spec '%s'\n" +#~ msgstr "Käytetään näytemäärittelyä ”%s”\n" + +#~ msgid "muted" +#~ msgstr "vaimennettu" + +#~ msgid "" +#~ "*** Autoload Entry #%u ***\n" +#~ "Name: %s\n" +#~ "Type: %s\n" +#~ "Module: %s\n" +#~ "Argument: %s\n" +#~ msgstr "" +#~ "*** Automaattilataustietue #%u ***\n" +#~ "Nimi: %s\n" +#~ "Tyyppi: %s\n" +#~ "Moduuli: %s\n" +#~ "Argumentto: %s\n" + +#~ msgid "sink" +#~ msgstr "nielu" + +#~ msgid "source" +#~ msgstr "lähde" diff --git a/po/fr.po b/po/fr.po new file mode 100644 index 0000000..1cdea52 --- /dev/null +++ b/po/fr.po @@ -0,0 +1,2954 @@ +# French translation of pulseaudio. +# Copyright (C) 2006-2008 Lennart Poettering +# This file is distributed under the same license as the pulseaudio package. +# Robert-André Mauchin , 2008. +# Michaël Ughetto , 2008. +# Pablo Martin-Gomez , 2008. +# Corentin Perard , 2009. +# +# +msgid "" +msgstr "" +"Project-Id-Version: pulseaudio trunk\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-09-29 23:47+0200\n" +"PO-Revision-Date: 2009-04-26 17:22+0200\n" +"Last-Translator: Corentin Perard \n" +"Language-Team: French \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n>1;\n" + +#: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629 +#, c-format +msgid "%s %s" +msgstr "" + +#: ../src/modules/alsa/alsa-util.c:1106 +#, c-format +msgid "" +"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu " +"ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_avail() a retourné une valeur qui est exceptionnellement large : %lu " +"octets (%lu ms).\n" +"Il s'agit très probablement d'un bogue dans le pilote ALSA « %s ». Veuillez " +"rapporter ce problème aux développeurs d'ALSA." + +#: ../src/modules/alsa/alsa-util.c:1147 +#, c-format +msgid "" +"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%" +"lu ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_delay() a retourné une valeur qui est exceptionnellement large : %li " +"octets (%s%lu ms).\n" +"Il s'agit très probablement d'un bogue dans le pilote ALSA « %s ». Veuillez " +"rapporter ce problème aux développeurs d'ALSA." + +#: ../src/modules/alsa/alsa-util.c:1194 +#, c-format +msgid "" +"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes " +"(%lu ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_mmap_begin() a retourné une valeur qui est exceptionnellement " +"large : %lu octets (%lu·ms).\n" +"Il s'agit très probablement d'un bogue dans le pilote ALSA « %s ». Veuillez " +"rapporter ce problème aux développeurs d'ALSA." + +#: ../src/modules/module-always-sink.c:39 +msgid "Always keeps at least one sink loaded even if it's a null one" +msgstr "" + +#: ../src/modules/module-always-sink.c:83 +msgid "Dummy Output" +msgstr "" + +#: ../src/modules/module-ladspa-sink.c:49 +msgid "Virtual LADSPA sink" +msgstr "" + +#: ../src/modules/module-ladspa-sink.c:53 +msgid "" +"sink_name= sink_properties= " +"master= format= rate= " +"channels= channel_map= plugin= label= control=" +msgstr "" + +#: ../src/modules/module-null-sink.c:55 +msgid "Clocked NULL sink" +msgstr "" + +#: ../src/modules/module-null-sink.c:291 +#, fuzzy +msgid "Null Output" +msgstr "Sortie %s" + +#: ../src/pulsecore/sink.c:2613 +msgid "Internal Audio" +msgstr "Audio interne" + +#: ../src/pulsecore/sink.c:2618 +msgid "Modem" +msgstr "Modem" + +#: ../src/daemon/ltdl-bind-now.c:124 +msgid "Failed to find original lt_dlopen loader." +msgstr "Échec lors de la recherche du chargeur lt_dlopen original." + +#: ../src/daemon/ltdl-bind-now.c:129 +msgid "Failed to allocate new dl loader." +msgstr "Échec lors de l'allocation du nouveau chargeur dl." + +#: ../src/daemon/ltdl-bind-now.c:142 +msgid "Failed to add bind-now-loader." +msgstr "Échec lors de l'ajout du chargeur bind-now." + +#: ../src/daemon/main.c:141 +#, c-format +msgid "Got signal %s." +msgstr "Signal %s obtenu." + +#: ../src/daemon/main.c:168 +msgid "Exiting." +msgstr "Fermeture." + +#: ../src/daemon/main.c:186 +#, c-format +msgid "Failed to find user '%s'." +msgstr "Impossible de trouver l'utilisateur « %s »." + +#: ../src/daemon/main.c:191 +#, c-format +msgid "Failed to find group '%s'." +msgstr "Impossible de trouver le groupe « %s »." + +#: ../src/daemon/main.c:195 +#, c-format +msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)." +msgstr "Utilisateur « %s ” (UID %lu) et groupe « %s » (GID %lu) trouvé." + +#: ../src/daemon/main.c:200 +#, c-format +msgid "GID of user '%s' and of group '%s' don't match." +msgstr "" +"Le GID de l'utilisateur « %s » et du groupe « %s » ne sont pas identiques." + +#: ../src/daemon/main.c:205 +#, c-format +msgid "Home directory of user '%s' is not '%s', ignoring." +msgstr "Le dossier personnel de l'utilisateur « %s » n'est pas « %s », ignoré." + +#: ../src/daemon/main.c:208 ../src/daemon/main.c:213 +#, c-format +msgid "Failed to create '%s': %s" +msgstr "Échec lors de la création de « %s » : %s" + +#: ../src/daemon/main.c:220 +#, c-format +msgid "Failed to change group list: %s" +msgstr "Échec lors du changement de la liste du groupe : %s" + +#: ../src/daemon/main.c:236 +#, c-format +msgid "Failed to change GID: %s" +msgstr "Échec lors du changement de GID : %s" + +#: ../src/daemon/main.c:252 +#, c-format +msgid "Failed to change UID: %s" +msgstr "Échec lors du changement d'UID : %s" + +#: ../src/daemon/main.c:271 +msgid "Successfully dropped root privileges." +msgstr "Les privilèges root ont été correctement abandonnés." + +#: ../src/daemon/main.c:279 +msgid "System wide mode unsupported on this platform." +msgstr "Mode système étendu non pris en charge sur cette plateforme." + +#: ../src/daemon/main.c:297 +#, c-format +msgid "setrlimit(%s, (%u, %u)) failed: %s" +msgstr "setrlimit(%s, (%u, %u)) a échoué : %s" + +#: ../src/daemon/main.c:474 +msgid "Failed to parse command line." +msgstr "Échec lors de l'analyse de la ligne de commande" + +#: ../src/daemon/main.c:541 +msgid "Daemon not running" +msgstr "Lé démon n'est pas lancé" + +#: ../src/daemon/main.c:543 +#, c-format +msgid "Daemon running as PID %u" +msgstr "Le démon est lancé avec le PID %u" + +#: ../src/daemon/main.c:553 +#, c-format +msgid "Failed to kill daemon: %s" +msgstr "Impossible de tuer le démon : %s" + +#: ../src/daemon/main.c:571 +msgid "" +"This program is not intended to be run as root (unless --system is " +"specified)." +msgstr "" +"Le programme n'est pas conçu pour être lancé en tant que root (sauf si --" +"system est renseigné)." + +#: ../src/daemon/main.c:573 +msgid "Root privileges required." +msgstr "Les privilèges root sont nécessaires." + +#: ../src/daemon/main.c:578 +msgid "--start not supported for system instances." +msgstr "--start n'est pas pris en charge pour les instances système." + +#: ../src/daemon/main.c:583 +msgid "Running in system mode, but --disallow-exit not set!" +msgstr "" +"Le démon s'exécute en mode système, mais --disallow-exit n'est pas défini." + +#: ../src/daemon/main.c:586 +msgid "Running in system mode, but --disallow-module-loading not set!" +msgstr "" +"Le démon s'exécute en mode système, mais --disallow-module-loading n'est pas " +"défini." + +#: ../src/daemon/main.c:589 +msgid "Running in system mode, forcibly disabling SHM mode!" +msgstr "Le démon s'exécute en mode système, désactivation forcée du mode SHM." + +#: ../src/daemon/main.c:594 +msgid "Running in system mode, forcibly disabling exit idle time!" +msgstr "" +"Le démon s'exécute en mode système, désactivation forcée de la fermeture " +"après délai d'inactivité." + +#: ../src/daemon/main.c:621 +msgid "Failed to acquire stdio." +msgstr "Échec lors de l'acquisition de stdio." + +#: ../src/daemon/main.c:627 +#, c-format +msgid "pipe failed: %s" +msgstr "Échec du tube : %s" + +#: ../src/daemon/main.c:632 +#, c-format +msgid "fork() failed: %s" +msgstr "Échec de fork() : %s" + +#: ../src/daemon/main.c:646 ../src/utils/pacat.c:508 +#, c-format +msgid "read() failed: %s" +msgstr "Échec de read() : %s" + +#: ../src/daemon/main.c:652 +msgid "Daemon startup failed." +msgstr "Échec lors du démarrage du démon." + +#: ../src/daemon/main.c:654 +msgid "Daemon startup successful." +msgstr "Démarrage du démon réussi." + +#: ../src/daemon/main.c:731 +#, c-format +msgid "This is PulseAudio %s" +msgstr "Pulseaudio %s" + +#: ../src/daemon/main.c:732 +#, c-format +msgid "Compilation host: %s" +msgstr "Hôte de compilation : %s" + +#: ../src/daemon/main.c:733 +#, c-format +msgid "Compilation CFLAGS: %s" +msgstr "CFLAGS de compilation : %s" + +#: ../src/daemon/main.c:736 +#, c-format +msgid "Running on host: %s" +msgstr "Exécution sur l'hôte : %s" + +#: ../src/daemon/main.c:739 +#, c-format +msgid "Found %u CPUs." +msgstr "%u processeurs trouvés." + +#: ../src/daemon/main.c:741 +#, c-format +msgid "Page size is %lu bytes" +msgstr "La taille de la page est de %lu octets" + +#: ../src/daemon/main.c:744 +msgid "Compiled with Valgrind support: yes" +msgstr "Compilé avec la prise en charge Valgrind : oui" + +#: ../src/daemon/main.c:746 +msgid "Compiled with Valgrind support: no" +msgstr "Compilé avec la prise en charge Valgrind : non" + +#: ../src/daemon/main.c:749 +#, c-format +msgid "Running in valgrind mode: %s" +msgstr "Exécution en mode valgrind : %s" + +#: ../src/daemon/main.c:752 +msgid "Optimized build: yes" +msgstr "Construction optimisée : oui" + +#: ../src/daemon/main.c:754 +msgid "Optimized build: no" +msgstr "Construction optimisée : non" + +#: ../src/daemon/main.c:758 +msgid "NDEBUG defined, all asserts disabled." +msgstr "NDEBUG défini, tous les messages d'erreur sont désactivés." + +#: ../src/daemon/main.c:760 +msgid "FASTPATH defined, only fast path asserts disabled." +msgstr "" +"FASTPATH défini, seuls les messages d'erreur fastpath ont été désactivés." + +#: ../src/daemon/main.c:762 +msgid "All asserts enabled." +msgstr "Tous les messages d'erreur sont activés." + +#: ../src/daemon/main.c:766 +msgid "Failed to get machine ID" +msgstr "Échec lors de l'obtention de l'ID de la machine" + +#: ../src/daemon/main.c:769 +#, c-format +msgid "Machine ID is %s." +msgstr "L'ID de la machine est %s." + +#: ../src/daemon/main.c:773 +#, fuzzy, c-format +msgid "Session ID is %s." +msgstr "L'ID de la machine est %s." + +#: ../src/daemon/main.c:779 +#, c-format +msgid "Using runtime directory %s." +msgstr "Utilisation du répertoire d'exécution %s." + +#: ../src/daemon/main.c:784 +#, c-format +msgid "Using state directory %s." +msgstr "Utilisation du répertoire d'état %s." + +#: ../src/daemon/main.c:787 +#, fuzzy, c-format +msgid "Using modules directory %s." +msgstr "Utilisation du répertoire d'exécution %s." + +#: ../src/daemon/main.c:789 +#, c-format +msgid "Running in system mode: %s" +msgstr "Exécution en mode système : %s" + +#: ../src/daemon/main.c:792 +msgid "" +"OK, so you are running PA in system mode. Please note that you most likely " +"shouldn't be doing that.\n" +"If you do it nonetheless then it's your own fault if things don't work as " +"expected.\n" +"Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an " +"explanation why system mode is usually a bad idea." +msgstr "" + +#: ../src/daemon/main.c:809 +msgid "pa_pid_file_create() failed." +msgstr "Échec de pa_pid_file_create()." + +#: ../src/daemon/main.c:819 +msgid "Fresh high-resolution timers available! Bon appetit!" +msgstr "" +"De nouvelles horloges à haute résolution sont disponibles ! Bon appétit !" + +#: ../src/daemon/main.c:821 +msgid "" +"Dude, your kernel stinks! The chef's recommendation today is Linux with high-" +"resolution timers enabled!" +msgstr "" +"Eh mec, ton noyau il pue ! La recommandation d'aujourd'hui du patron est " +"d'activer les horloges à haute résolution sur ton Linux." + +#: ../src/daemon/main.c:844 +msgid "pa_core_new() failed." +msgstr "Échec de pa_core_new()." + +#: ../src/daemon/main.c:904 +msgid "Failed to initialize daemon." +msgstr "Échec lors de l'initialisation du démon" + +#: ../src/daemon/main.c:909 +msgid "Daemon startup without any loaded modules, refusing to work." +msgstr "Démarrage du démon sans aucun module chargé : refus de fonctionner." + +#: ../src/daemon/main.c:926 +msgid "Daemon startup complete." +msgstr "Démarrage du démon effectué." + +#: ../src/daemon/main.c:932 +msgid "Daemon shutdown initiated." +msgstr "Fermeture du démon initiée." + +#: ../src/daemon/main.c:954 +msgid "Daemon terminated." +msgstr "Démon terminé." + +#: ../src/daemon/cmdline.c:115 +#, c-format +msgid "" +"%s [options]\n" +"\n" +"COMMANDS:\n" +" -h, --help Show this help\n" +" --version Show version\n" +" --dump-conf Dump default configuration\n" +" --dump-modules Dump list of available modules\n" +" --dump-resample-methods Dump available resample methods\n" +" --cleanup-shm Cleanup stale shared memory " +"segments\n" +" --start Start the daemon if it is not " +"running\n" +" -k --kill Kill a running daemon\n" +" --check Check for a running daemon (only " +"returns exit code)\n" +"\n" +"OPTIONS:\n" +" --system[=BOOL] Run as system-wide instance\n" +" -D, --daemonize[=BOOL] Daemonize after startup\n" +" --fail[=BOOL] Quit when startup fails\n" +" --high-priority[=BOOL] Try to set high nice level\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_NICE)\n" +" --realtime[=BOOL] Try to enable realtime scheduling\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_RTPRIO)\n" +" --disallow-module-loading[=BOOL] Disallow module user requested " +"module\n" +" loading/unloading after startup\n" +" --disallow-exit[=BOOL] Disallow user requested exit\n" +" --exit-idle-time=SECS Terminate the daemon when idle and " +"this\n" +" time passed\n" +" --module-idle-time=SECS Unload autoloaded modules when idle " +"and\n" +" this time passed\n" +" --scache-idle-time=SECS Unload autoloaded samples when idle " +"and\n" +" this time passed\n" +" --log-level[=LEVEL] Increase or set verbosity level\n" +" -v Increase the verbosity level\n" +" --log-target={auto,syslog,stderr} Specify the log target\n" +" --log-meta[=BOOL] Include code location in log " +"messages\n" +" --log-time[=BOOL] Include timestamps in log messages\n" +" --log-backtrace=FRAMES Include a backtrace in log messages\n" +" -p, --dl-search-path=PATH Set the search path for dynamic " +"shared\n" +" objects (plugins)\n" +" --resample-method=METHOD Use the specified resampling method\n" +" (See --dump-resample-methods for\n" +" possible values)\n" +" --use-pid-file[=BOOL] Create a PID file\n" +" --no-cpu-limit[=BOOL] Do not install CPU load limiter on\n" +" platforms that support it.\n" +" --disable-shm[=BOOL] Disable shared memory support.\n" +"\n" +"STARTUP SCRIPT:\n" +" -L, --load=\"MODULE ARGUMENTS\" Load the specified plugin module " +"with\n" +" the specified argument\n" +" -F, --file=FILENAME Run the specified script\n" +" -C Open a command line on the running " +"TTY\n" +" after startup\n" +"\n" +" -n Don't load default script file\n" +msgstr "" +"%s [options]\n" +"\n" +"COMMANDES :\n" +" -h, --help Affiche cette aide\n" +" --version Affiche la version\n" +" --dump-conf Affiche la configuration par défaut\n" +" --dump-modules Affiche la liste des modules " +"disponibles\n" +" --dump-resample-methods Affiche la liste des méthodes " +"d'échantillonnage disponibles\n" +" --cleanup-shm Nettoie les segments de mémoire " +"partagée périmés\n" +" --start Démarre le démon s'il n'est pas " +"lancé\n" +" -k --kill Tue un démon en cours d'exécution\n" +" --check Vérifie s'il existe un démon en " +"cours d'exécution (ne retourne que le code de sortie)\n" +"\n" +"OPTIONS :\n" +" --system[=BOOL] Exécuter en tant qu'instance " +"système\n" +" -D, --daemonize[=BOOL] Définir en tant que démon après le " +"démarrage\n" +" --fail[=BOOL] Quitte quand le démarrage échoue\n" +" --high-priority[=BOOL] Tente de définir un niveau nice plus " +"élevé\n" +" (seulement disponible en tant que " +"root, avec le SUID ou\n" +" avec un RLIMIT_NICE élevé)\n" +" --realtime[=BOOL] Tente d'activer une planification en " +"temps réel\n" +" (seulement disponible en tant que " +"root, avec le SUID ou\n" +" ave un RLIMIT_RTPRIO élevé)\n" +" --disallow-module-loading[=BOOL] Empêche les chargements/" +"déchargements de module\n" +" demandés par l'utilisateur après le " +"démarrage\n" +" --disallow-exit[=BOOL] Empêche les fermetures demandées par " +"l'utilisateur\n" +" --exit-idle-time=SECS Termine le démon quand la durée " +"d'inactivité \n" +" et ce temps se sont écoulés\n" +" --module-idle-time=SECS Décharge les modules chargés " +"automatiquement \n" +" quand la durée d'inactivité et ce " +"temps se sont écoulés\n" +" --scache-idle-time=SECS Décharge les échantillons chargés " +"automatiquement \n" +" quand la durée d'inactivité et ce " +"temps se sont écoulés\n" +" --log-level[=NIVEAU] Augmente ou définit le niveau de " +"verbosité\n" +" -v Augmente le niveau de verbosité\n" +" --log-target={auto,syslog,stderr} Indique la cible du journal\n" +" --log-meta[=BOOL] Inclure la position du code dans les " +"messages ·du journal\n" +" --log-time[=BOOL] Inclure la date dans les messages du " +"journal\n" +" --log-backtrace=TRAMES Inclure un traçage de la pile dans " +"les messages du journal\n" +" -p, --dl-search-path=CHEMIN Définit le chemin de recherche pour " +"les objets dynamiques\n" +" partagés (extensions)\n" +" --resample-method=MÉTHODE Utilise la méthode de " +"rééchantillonnage indiquée\n" +" (Voir --dump-resample-methods pour\n" +" les valeurs possibles)\n" +" --use-pid-file[=BOOL] Crée un fichier PID\n" +" --no-cpu-limit[=BOOL] Ne pas installer de limiteur de " +"charge CPU\n" +" sur les plateformes qui le " +"supportent.\n" +" --disable-shm[=BOOL] Désactive la prise en charge de la " +"mémoire partagée.\n" +"\n" +"SCRIPT DE DÉMARRAGE :\n" +" -L, --load=\"PARAMÈTRES DU MODULE\" Charge le module d'extension indiqué " +"avec\n" +" le paramètre indiqué\n" +" -F, --file=NOMDEFICHIER Exécute le script indiqué\n" +" -C Ouvre une ligne de commande sur le " +"TTY en cours \n" +" après le démarrage\n" +"\n" +" -n Ne pas charger les fichiers de " +"scripts par défaut\n" + +#: ../src/daemon/cmdline.c:247 +msgid "--daemonize expects boolean argument" +msgstr "--daemonize requiert un paramètre booléen" + +#: ../src/daemon/cmdline.c:254 +msgid "--fail expects boolean argument" +msgstr "--fail requiert un paramètre booléen" + +#: ../src/daemon/cmdline.c:264 +msgid "" +"--log-level expects log level argument (either numeric in range 0..4 or one " +"of debug, info, notice, warn, error)." +msgstr "" +"--log-level requiert un paramètre de niveau de journal (soit numérique entre " +"0 et 4, soit de débogage : info, notice, warn , error)." + +#: ../src/daemon/cmdline.c:276 +msgid "--high-priority expects boolean argument" +msgstr "--high-priority requiert un paramètre booléen" + +#: ../src/daemon/cmdline.c:283 +msgid "--realtime expects boolean argument" +msgstr "--realtime requiert un paramètre booléen" + +#: ../src/daemon/cmdline.c:290 +msgid "--disallow-module-loading expects boolean argument" +msgstr "--disallow-module-loading requiert un paramètre booléen" + +#: ../src/daemon/cmdline.c:297 +msgid "--disallow-exit expects boolean argument" +msgstr "--disallow-exit requiert un paramètre booléen" + +#: ../src/daemon/cmdline.c:304 +msgid "--use-pid-file expects boolean argument" +msgstr "--use-pid-file requiert un paramètre booléen" + +#: ../src/daemon/cmdline.c:321 +msgid "Invalid log target: use either 'syslog', 'stderr' or 'auto'." +msgstr "Cible du journal invalide : utilisez « syslog », « stderr » ou « auto »." + +#: ../src/daemon/cmdline.c:328 +msgid "--log-time expects boolean argument" +msgstr "--log-time requiert un paramètre booléen" + +#: ../src/daemon/cmdline.c:335 +msgid "--log-meta expects boolean argument" +msgstr "--log-meta requiert un paramètre booléen" + +#: ../src/daemon/cmdline.c:354 +#, c-format +msgid "Invalid resample method '%s'." +msgstr "Méthode de rééchantillonnage invalide « %s »." + +#: ../src/daemon/cmdline.c:361 +msgid "--system expects boolean argument" +msgstr "--system requiert un paramètre booléen" + +#: ../src/daemon/cmdline.c:368 +msgid "--no-cpu-limit expects boolean argument" +msgstr "--no-cpu-limit requiert un paramètre booléen" + +#: ../src/daemon/cmdline.c:375 +msgid "--disable-shm expects boolean argument" +msgstr "--disable-shm requiert un paramètre booléen" + +#: ../src/daemon/dumpmodules.c:60 +#, c-format +msgid "Name: %s\n" +msgstr "Nom : %s\n" + +#: ../src/daemon/dumpmodules.c:63 +#, c-format +msgid "No module information available\n" +msgstr "Aucune information de module disponible\n" + +#: ../src/daemon/dumpmodules.c:66 +#, c-format +msgid "Version: %s\n" +msgstr "Version : %s\n" + +#: ../src/daemon/dumpmodules.c:68 +#, c-format +msgid "Description: %s\n" +msgstr "Description : %s\n" + +#: ../src/daemon/dumpmodules.c:70 +#, c-format +msgid "Author: %s\n" +msgstr "Auteur : %s\n" + +#: ../src/daemon/dumpmodules.c:72 +#, c-format +msgid "Usage: %s\n" +msgstr "Utilisation : %s\n" + +#: ../src/daemon/dumpmodules.c:73 +#, c-format +msgid "Load Once: %s\n" +msgstr "Chargement unique : %s\n" + +#: ../src/daemon/dumpmodules.c:75 +#, c-format +msgid "DEPRECATION WARNING: %s\n" +msgstr "" + +#: ../src/daemon/dumpmodules.c:79 +#, c-format +msgid "Path: %s\n" +msgstr "Chemin : %s\n" + +# dans les lignes suivantes [%s = nom de fichier: %u = ligne dans celui-ci] +#: ../src/daemon/daemon-conf.c:232 +#, c-format +msgid "[%s:%u] Invalid log target '%s'." +msgstr "[%s:%u] Cible du journal « %s » invalide." + +#: ../src/daemon/daemon-conf.c:248 +#, c-format +msgid "[%s:%u] Invalid log level '%s'." +msgstr "[%s:%u] Niveau du journal « %s » invalide." + +#: ../src/daemon/daemon-conf.c:264 +#, c-format +msgid "[%s:%u] Invalid resample method '%s'." +msgstr "[%s:%u] Méthode de rééchantillonnage « %s » invalide." + +#: ../src/daemon/daemon-conf.c:287 +#, c-format +msgid "[%s:%u] Invalid rlimit '%s'." +msgstr "[%s:%u] rlimit « %s » invalide." + +#: ../src/daemon/daemon-conf.c:294 +#, c-format +msgid "[%s:%u] rlimit not supported on this platform." +msgstr "[%s:%u] rlimit n'est pas pris en charge sur cette plateforme." + +#: ../src/daemon/daemon-conf.c:310 +#, c-format +msgid "[%s:%u] Invalid sample format '%s'." +msgstr "[%s:%u] Format d'échantillon « %s » invalide." + +#: ../src/daemon/daemon-conf.c:328 +#, c-format +msgid "[%s:%u] Invalid sample rate '%s'." +msgstr "[%s:%u] Taux d'échantillonnage « %s » invalide." + +#: ../src/daemon/daemon-conf.c:352 +#, c-format +msgid "[%s:%u] Invalid sample channels '%s'." +msgstr "[%s:%u] Canaux d'échantillonnage « %s » invalide." + +#: ../src/daemon/daemon-conf.c:370 +#, c-format +msgid "[%s:%u] Invalid channel map '%s'." +msgstr "[%s:%u] Plan de canaux « %s » invalide." + +#: ../src/daemon/daemon-conf.c:388 +#, c-format +msgid "[%s:%u] Invalid number of fragments '%s'." +msgstr "[%s:%u] Nombre de fragments « %s » invalide." + +#: ../src/daemon/daemon-conf.c:406 +#, c-format +msgid "[%s:%u] Invalid fragment size '%s'." +msgstr "[%s:%u] Taille du fragment « %s » invalide." + +#: ../src/daemon/daemon-conf.c:424 +#, c-format +msgid "[%s:%u] Invalid nice level '%s'." +msgstr "[%s:%u] Niveau de priorité (nice) « %s » invalide." + +#: ../src/daemon/daemon-conf.c:546 +#, c-format +msgid "Failed to open configuration file: %s" +msgstr "Échec lors de l'ouverture du fichier de configuration : %s" + +#: ../src/daemon/daemon-conf.c:562 +msgid "" +"The specified default channel map has a different number of channels than " +"the specified default number of channels." +msgstr "" +"Le plan de canaux spécifié par défaut a un nombre de canaux différent du " +"nombre spécifié par défaut." + +#: ../src/daemon/daemon-conf.c:638 +#, c-format +msgid "### Read from configuration file: %s ###\n" +msgstr "### Lecture à partir du fichier de configuration : %s ###\n" + +#: ../src/daemon/caps.c:62 +#, fuzzy +msgid "Cleaning up privileges." +msgstr "Abandon des privilèges root." + +#: ../src/daemon/pulseaudio.desktop.in.h:1 +msgid "PulseAudio Sound System" +msgstr "Système de son PulseAudio" + +#: ../src/daemon/pulseaudio.desktop.in.h:2 +msgid "Start the PulseAudio Sound System" +msgstr "Démarrer le système de son PulseAudio" + +#: ../src/pulse/channelmap.c:105 ../src/pulse/channelmap.c:757 +msgid "Mono" +msgstr "Mono" + +#: ../src/pulse/channelmap.c:107 +msgid "Front Center" +msgstr "Avant centre" + +#: ../src/pulse/channelmap.c:108 +msgid "Front Left" +msgstr "Avant gauche" + +#: ../src/pulse/channelmap.c:109 +msgid "Front Right" +msgstr "Avant droit" + +#: ../src/pulse/channelmap.c:111 +msgid "Rear Center" +msgstr "Arrière centre" + +#: ../src/pulse/channelmap.c:112 +msgid "Rear Left" +msgstr "Arrière gauche" + +#: ../src/pulse/channelmap.c:113 +msgid "Rear Right" +msgstr "Arrière droit" + +#: ../src/pulse/channelmap.c:115 +msgid "Low Frequency Emmiter" +msgstr "Émetteur à basse fréquence" + +#: ../src/pulse/channelmap.c:117 +msgid "Front Left-of-center" +msgstr "Avant à gauche du centre" + +#: ../src/pulse/channelmap.c:118 +msgid "Front Right-of-center" +msgstr "Avant à droite du centre" + +#: ../src/pulse/channelmap.c:120 +msgid "Side Left" +msgstr "Côté gauche" + +#: ../src/pulse/channelmap.c:121 +msgid "Side Right" +msgstr "Côté droit" + +#: ../src/pulse/channelmap.c:123 +msgid "Auxiliary 0" +msgstr "Auxiliaire 0" + +#: ../src/pulse/channelmap.c:124 +msgid "Auxiliary 1" +msgstr "Auxiliaire 1" + +#: ../src/pulse/channelmap.c:125 +msgid "Auxiliary 2" +msgstr "Auxiliaire 2" + +#: ../src/pulse/channelmap.c:126 +msgid "Auxiliary 3" +msgstr "Auxiliaire 3" + +#: ../src/pulse/channelmap.c:127 +msgid "Auxiliary 4" +msgstr "Auxiliaire 4" + +#: ../src/pulse/channelmap.c:128 +msgid "Auxiliary 5" +msgstr "Auxiliaire 5" + +#: ../src/pulse/channelmap.c:129 +msgid "Auxiliary 6" +msgstr "Auxiliaire 6" + +#: ../src/pulse/channelmap.c:130 +msgid "Auxiliary 7" +msgstr "Auxiliaire 7" + +#: ../src/pulse/channelmap.c:131 +msgid "Auxiliary 8" +msgstr "Auxiliaire 8" + +#: ../src/pulse/channelmap.c:132 +msgid "Auxiliary 9" +msgstr "Auxiliaire 9" + +#: ../src/pulse/channelmap.c:133 +msgid "Auxiliary 10" +msgstr "Auxiliaire 10" + +#: ../src/pulse/channelmap.c:134 +msgid "Auxiliary 11" +msgstr "Auxiliaire 11" + +#: ../src/pulse/channelmap.c:135 +msgid "Auxiliary 12" +msgstr "Auxiliaire 12" + +#: ../src/pulse/channelmap.c:136 +msgid "Auxiliary 13" +msgstr "Auxiliaire 13" + +#: ../src/pulse/channelmap.c:137 +msgid "Auxiliary 14" +msgstr "Auxiliaire 14" + +#: ../src/pulse/channelmap.c:138 +msgid "Auxiliary 15" +msgstr "Auxiliaire 15" + +#: ../src/pulse/channelmap.c:139 +msgid "Auxiliary 16" +msgstr "Auxiliaire 16" + +#: ../src/pulse/channelmap.c:140 +msgid "Auxiliary 17" +msgstr "Auxiliaire 17" + +#: ../src/pulse/channelmap.c:141 +msgid "Auxiliary 18" +msgstr "Auxiliaire 18" + +#: ../src/pulse/channelmap.c:142 +msgid "Auxiliary 19" +msgstr "Auxiliaire 19" + +#: ../src/pulse/channelmap.c:143 +msgid "Auxiliary 20" +msgstr "Auxiliaire 20" + +#: ../src/pulse/channelmap.c:144 +msgid "Auxiliary 21" +msgstr "Auxiliaire 21" + +#: ../src/pulse/channelmap.c:145 +msgid "Auxiliary 22" +msgstr "Auxiliaire 22" + +#: ../src/pulse/channelmap.c:146 +msgid "Auxiliary 23" +msgstr "Auxiliaire 23" + +#: ../src/pulse/channelmap.c:147 +msgid "Auxiliary 24" +msgstr "Auxiliaire 24" + +#: ../src/pulse/channelmap.c:148 +msgid "Auxiliary 25" +msgstr "Auxiliaire 25" + +#: ../src/pulse/channelmap.c:149 +msgid "Auxiliary 26" +msgstr "Auxiliaire 26" + +#: ../src/pulse/channelmap.c:150 +msgid "Auxiliary 27" +msgstr "Auxiliaire 27" + +#: ../src/pulse/channelmap.c:151 +msgid "Auxiliary 28" +msgstr "Auxiliaire 28" + +#: ../src/pulse/channelmap.c:152 +msgid "Auxiliary 29" +msgstr "Auxiliaire 29" + +#: ../src/pulse/channelmap.c:153 +msgid "Auxiliary 30" +msgstr "Auxiliaire 30" + +#: ../src/pulse/channelmap.c:154 +msgid "Auxiliary 31" +msgstr "Auxiliaire 31" + +#: ../src/pulse/channelmap.c:156 +msgid "Top Center" +msgstr "Centre haut" + +#: ../src/pulse/channelmap.c:158 +msgid "Top Front Center" +msgstr "Avant centre haut" + +#: ../src/pulse/channelmap.c:159 +msgid "Top Front Left" +msgstr "Avant gauche haut" + +#: ../src/pulse/channelmap.c:160 +msgid "Top Front Right" +msgstr "Avant droit haut" + +#: ../src/pulse/channelmap.c:162 +msgid "Top Rear Center" +msgstr "Arrière centre haut" + +#: ../src/pulse/channelmap.c:163 +msgid "Top Rear Left" +msgstr "Arrière gauche haut" + +#: ../src/pulse/channelmap.c:164 +msgid "Top Rear Right" +msgstr "Arrière droit haut" + +#: ../src/pulse/channelmap.c:484 ../src/pulse/sample.c:170 +#: ../src/pulse/volume.c:295 ../src/pulse/volume.c:321 +#: ../src/pulse/volume.c:341 ../src/pulse/volume.c:371 +msgid "(invalid)" +msgstr "(invalide)" + +#: ../src/pulse/channelmap.c:761 +msgid "Stereo" +msgstr "Stéréo" + +#: ../src/pulse/channelmap.c:766 +msgid "Surround 4.0" +msgstr "Surround 4.0" + +#: ../src/pulse/channelmap.c:772 +msgid "Surround 4.1" +msgstr "Surround 4.1" + +#: ../src/pulse/channelmap.c:778 +msgid "Surround 5.0" +msgstr "Surround 5.0" + +#: ../src/pulse/channelmap.c:784 +msgid "Surround 5.1" +msgstr "Surround 5.1" + +#: ../src/pulse/channelmap.c:791 +msgid "Surround 7.1" +msgstr "Surround 7.1" + +#: ../src/pulse/error.c:43 +msgid "OK" +msgstr "OK" + +#: ../src/pulse/error.c:44 +msgid "Access denied" +msgstr "Accès refusé" + +#: ../src/pulse/error.c:45 +msgid "Unknown command" +msgstr "Commande inconnue" + +#: ../src/pulse/error.c:46 +msgid "Invalid argument" +msgstr "Paramètre invalide" + +#: ../src/pulse/error.c:47 +msgid "Entity exists" +msgstr "L'entité existe" + +#: ../src/pulse/error.c:48 +msgid "No such entity" +msgstr "Aucune entité de ce type" + +#: ../src/pulse/error.c:49 +msgid "Connection refused" +msgstr "Connexion refusée" + +#: ../src/pulse/error.c:50 +msgid "Protocol error" +msgstr "Erreur du protocole" + +#: ../src/pulse/error.c:51 +msgid "Timeout" +msgstr "Délai dépassé" + +#: ../src/pulse/error.c:52 +msgid "No authorization key" +msgstr "Aucune clé d'autorisation" + +#: ../src/pulse/error.c:53 +msgid "Internal error" +msgstr "Erreur interne" + +#: ../src/pulse/error.c:54 +msgid "Connection terminated" +msgstr "Connexion terminée" + +#: ../src/pulse/error.c:55 +msgid "Entity killed" +msgstr "L'entité a été tuée" + +#: ../src/pulse/error.c:56 +msgid "Invalid server" +msgstr "Serveur invalide" + +#: ../src/pulse/error.c:57 +msgid "Module initalization failed" +msgstr "Échec lors de l'initialisation du module" + +#: ../src/pulse/error.c:58 +msgid "Bad state" +msgstr "État incorrect" + +#: ../src/pulse/error.c:59 +msgid "No data" +msgstr "Aucune donnée" + +#: ../src/pulse/error.c:60 +msgid "Incompatible protocol version" +msgstr "Version du protocole invalide" + +#: ../src/pulse/error.c:61 +msgid "Too large" +msgstr "Trop grand" + +#: ../src/pulse/error.c:62 +msgid "Not supported" +msgstr "Non pris en charge" + +#: ../src/pulse/error.c:63 +msgid "Unknown error code" +msgstr "Code d'erreur inconnu" + +#: ../src/pulse/error.c:64 +msgid "No such extension" +msgstr "Aucune extension de ce type" + +#: ../src/pulse/error.c:65 +msgid "Obsolete functionality" +msgstr "Fonctionnalité dépréciée" + +#: ../src/pulse/error.c:66 +msgid "Missing implementation" +msgstr "Implantation manquante" + +#: ../src/pulse/error.c:67 +msgid "Client forked" +msgstr "Le client s'est divisé (Client forked)" + +#: ../src/pulse/error.c:68 +msgid "Input/Output error" +msgstr "" + +#: ../src/pulse/error.c:69 +msgid "Device or resource busy" +msgstr "" + +#: ../src/pulse/sample.c:172 +#, c-format +msgid "%s %uch %uHz" +msgstr "%s %uch %uHz" + +#: ../src/pulse/sample.c:184 +#, c-format +msgid "%0.1f GiB" +msgstr "%0.1f Gio" + +#: ../src/pulse/sample.c:186 +#, c-format +msgid "%0.1f MiB" +msgstr "%0.1f Mio" + +#: ../src/pulse/sample.c:188 +#, c-format +msgid "%0.1f KiB" +msgstr "%0.1f Kio" + +#: ../src/pulse/sample.c:190 +#, c-format +msgid "%u B" +msgstr "%u B" + +#: ../src/pulse/client-conf-x11.c:55 ../src/utils/pax11publish.c:100 +msgid "XOpenDisplay() failed" +msgstr "Échec de XOpenDisplay()" + +#: ../src/pulse/client-conf-x11.c:93 +msgid "Failed to parse cookie data" +msgstr "Échec lors de l'analyse des données du cookie" + +#: ../src/pulse/client-conf.c:111 +#, c-format +msgid "Failed to open configuration file '%s': %s" +msgstr "Échec lors de l'ouverture du fichier de configuration « %s » :%s" + +#: ../src/pulse/context.c:550 +msgid "No cookie loaded. Attempting to connect without." +msgstr "Aucun cookie chargé. Tentative de connexion sans celui-ci." + +#: ../src/pulse/context.c:693 +#, c-format +msgid "fork(): %s" +msgstr "fork() : %s" + +#: ../src/pulse/context.c:748 +#, c-format +msgid "waitpid(): %s" +msgstr "waitpid() : %s" + +#: ../src/pulse/context.c:1438 +#, c-format +msgid "Received message for unknown extension '%s'" +msgstr "Message reçu pour une extension inconnue « %s »" + +#: ../src/utils/pacat.c:108 +#, fuzzy, c-format +msgid "Failed to drain stream: %s" +msgstr "Échec lors du vidage du flux : %s\n" + +#: ../src/utils/pacat.c:113 +#, fuzzy +msgid "Playback stream drained." +msgstr "Flux de lecture vidé.\n" + +#: ../src/utils/pacat.c:123 +#, fuzzy +msgid "Draining connection to server." +msgstr "Vidage de la connexion au serveur.\n" + +#: ../src/utils/pacat.c:136 +#, fuzzy, c-format +msgid "pa_stream_drain(): %s" +msgstr "pa_stream_drain() : %s\n" + +#: ../src/utils/pacat.c:159 +#, fuzzy, c-format +msgid "pa_stream_write() failed: %s" +msgstr "Échec de pa_stream_write() : %s\n" + +#: ../src/utils/pacat.c:197 +#, fuzzy, c-format +msgid "pa_stream_begin_write() failed: %s" +msgstr "Échec de pa_stream_write() : %s\n" + +#: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267 +#, fuzzy, c-format +msgid "pa_stream_peek() failed: %s" +msgstr "Échec de pa_stream_peek() : %s\n" + +#: ../src/utils/pacat.c:307 +#, fuzzy +msgid "Stream successfully created." +msgstr "Création du flux réussie.\n" + +#: ../src/utils/pacat.c:310 +#, fuzzy, c-format +msgid "pa_stream_get_buffer_attr() failed: %s" +msgstr "Échec de pa_stream_get_buffer_attr() : %s\n" + +#: ../src/utils/pacat.c:314 +#, fuzzy, c-format +msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u" +msgstr "Mesures du tampon : maxlength=%u, tlength=%u, prebuf=%u, minreq=%u\n" + +#: ../src/utils/pacat.c:317 +#, fuzzy, c-format +msgid "Buffer metrics: maxlength=%u, fragsize=%u" +msgstr "Mesures du tampon : maxlength=%u, fragsize=%u\n" + +#: ../src/utils/pacat.c:321 +#, fuzzy, c-format +msgid "Using sample spec '%s', channel map '%s'." +msgstr "" +"Utilisation de la spécification d'échantillon « %s », plan des canaux « %s ».\n" + +# l'espace manquant entre %s et suspended est voulu +#: ../src/utils/pacat.c:325 +#, fuzzy, c-format +msgid "Connected to device %s (%u, %ssuspended)." +msgstr "Connecté au périphérique %s (%u, %ssuspendu).\n" + +#: ../src/utils/pacat.c:335 +#, fuzzy, c-format +msgid "Stream error: %s" +msgstr "Erreur du flux : %s\n" + +#: ../src/utils/pacat.c:345 +#, fuzzy, c-format +msgid "Stream device suspended.%s" +msgstr "Périphérique de flux suspendu %s \n" + +#: ../src/utils/pacat.c:347 +#, fuzzy, c-format +msgid "Stream device resumed.%s" +msgstr "Périphérique de flux repris %s \n" + +#: ../src/utils/pacat.c:355 +#, fuzzy, c-format +msgid "Stream underrun.%s" +msgstr "Flux vide %s \n" + +#: ../src/utils/pacat.c:362 +#, fuzzy, c-format +msgid "Stream overrun.%s" +msgstr "Flux saturé %s \n" + +#: ../src/utils/pacat.c:369 +#, fuzzy, c-format +msgid "Stream started.%s" +msgstr "Flux démarré %s \n" + +#: ../src/utils/pacat.c:376 +#, fuzzy, c-format +msgid "Stream moved to device %s (%u, %ssuspended).%s" +msgstr "Flux déplacé vers le périphérique %s (%u, %ssuspendu).%s \n" + +# suspendu ou non suspendu +#: ../src/utils/pacat.c:376 +msgid "not " +msgstr "non " + +#: ../src/utils/pacat.c:383 +#, fuzzy, c-format +msgid "Stream buffer attributes changed.%s" +msgstr "Des attributs du tampon de flux ont changé. %s \n" + +#: ../src/utils/pacat.c:415 +#, fuzzy, c-format +msgid "Connection established.%s" +msgstr "Connection établie.%s \n" + +#: ../src/utils/pacat.c:418 +#, fuzzy, c-format +msgid "pa_stream_new() failed: %s" +msgstr "Échec de pa_stream_new() : %s\n" + +#: ../src/utils/pacat.c:450 +#, fuzzy, c-format +msgid "pa_stream_connect_playback() failed: %s" +msgstr "Échec de pa_stream_connect_playback() : %s\n" + +#: ../src/utils/pacat.c:456 +#, fuzzy, c-format +msgid "pa_stream_connect_record() failed: %s" +msgstr "Échec de pa_stream_connect_record() : %s\n" + +#: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857 +#, fuzzy, c-format +msgid "Connection failure: %s" +msgstr "Échec lors de la connexion : %s\n" + +#: ../src/utils/pacat.c:503 +#, fuzzy +msgid "Got EOF." +msgstr "EOF obtenu.\n" + +#: ../src/utils/pacat.c:540 +#, fuzzy, c-format +msgid "write() failed: %s" +msgstr "Échec de write() : %s\n" + +#: ../src/utils/pacat.c:561 +#, fuzzy +msgid "Got signal, exiting." +msgstr "Signal obtenu, fermeture.\n" + +#: ../src/utils/pacat.c:575 +#, fuzzy, c-format +msgid "Failed to get latency: %s" +msgstr "Échec lors de l'obtention de la latence : %s\n" + +#: ../src/utils/pacat.c:580 +#, fuzzy, c-format +msgid "Time: %0.3f sec; Latency: %0.0f usec." +msgstr "Durée : %0.3f s ; Latency : %0.0f µs. \r" + +#: ../src/utils/pacat.c:599 +#, fuzzy, c-format +msgid "pa_stream_update_timing_info() failed: %s" +msgstr "Échec de pa_stream_update_timing_info() : %s\n" + +# downmix = par ex. convertir 5 canaux en 2 canaux +# upmixer = par ex. convertir 2 canaux en 5 canaux +# https://bugzilla.redhat.com/show_bug.cgi?id=460798 +#: ../src/utils/pacat.c:609 +#, fuzzy, c-format +msgid "" +"%s [options]\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -r, --record Create a connection for recording\n" +" -p, --playback Create a connection for playback\n" +"\n" +" -v, --verbose Enable verbose operations\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -d, --device=DEVICE The name of the sink/source to " +"connect to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" +" --stream-name=NAME How to call this stream on the " +"server\n" +" --volume=VOLUME Specify the initial (linear) volume " +"in range 0...65536\n" +" --rate=SAMPLERATE The sample rate in Hz (defaults to " +"44100)\n" +" --format=SAMPLEFORMAT The sample type, one of s16le, " +"s16be, u8, float32le,\n" +" float32be, ulaw, alaw, s32le, s32be, " +"s24le, s24be,\n" +" s24-32le, s24-32be (defaults to " +"s16ne)\n" +" --channels=CHANNELS The number of channels, 1 for mono, " +"2 for stereo\n" +" (defaults to 2)\n" +" --channel-map=CHANNELMAP Channel map to use instead of the " +"default\n" +" --fix-format Take the sample format from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-rate Take the sampling rate from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-channels Take the number of channels and the " +"channel map\n" +" from the sink the stream is being " +"connected to.\n" +" --no-remix Don't upmix or downmix channels.\n" +" --no-remap Map channels by index instead of " +"name.\n" +" --latency=BYTES Request the specified latency in " +"bytes.\n" +" --process-time=BYTES Request the specified process time " +"per request in bytes.\n" +" --property=PROPERTY=VALUE Set the specified property to the " +"specified value.\n" +" --raw Record/play raw PCM data.\n" +" --file-format=FFORMAT Record/play formatted PCM data.\n" +" --list-file-formats List available file formats.\n" +msgstr "" +"%s [options]\n" +"\n" +" -h, --help Affiche cette aide\n" +" --version Affiche la version\n" +"\n" +" -r, --record Crée une connexion pour " +"l'enregistrement\n" +" -p, --playback Crée une connexion pour la " +"relecture\n" +"\n" +" -v, --verbose Active le mode verbeux\n" +"\n" +" -s, --server=SERVEUR Le nom du serveur auquel se " +"connecter\n" +" -d, --device=PÉRIPHÉRIQUE Le nom de la destination/source à " +"laquelle se connecter\n" +" -n, --client-name=NOM Définit le nom de ce client sur le " +"serveur\n" +" --stream-name=NOM Définit le nom de ce flux sur le " +"serveur\n" +" --volume=VOLUME Indique le volume initial (linéaire) " +"entre 0 et 65536\n" +" --rate=TAUXDÉCHANTILLONNAGE Le taux d'échantillonnage en Hz (par " +"défaut 44100)\n" +" --format=FORMATDELÉCHANTILLON Le type de l'échantillon, parmi : " +"s16le, s16be, u8, float32le,\n" +" float32be, ulaw, alaw (par défaut " +"s16ne)\n" +" --channels=CANAUX Le nombre de canaux, 1 pour mono, 2 " +"pour stéréo\n" +" (par défaut 2)\n" +" --channel-map=PLANDESCANAUX Plan des canaux à utiliser au lieu " +"de celui par défaut\n" +" --fix-format Prend le format de l'échantillon de " +"la destination où le flux\n" +" est en train de se connecter.\n" +" --fix-rate Prend le taux d'échantillonnage de " +"la destination où le flux\n" +" est en train de se connecter.\n" +" --fix-channels Prend le nombre et le plan des " +"canaux de la destination \n" +" où le flux est en train de se " +"connecter.\n" +" --no-remix Ne pas augmenter ou diminuer le " +"nombre de canaux par mixage.\n" +" --no-remap Créer le plan des canaux par index " +"et non par nom.\n" +" --latency=OCTETS Demande la latence indiquée en " +"octets.\n" +" --process-time=OCTETS Demande le temps de traitement " +"indiqué par requête en octets.\n" + +#: ../src/utils/pacat.c:731 +#, c-format +msgid "" +"pacat %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pacat %s\n" +"Compilé avec libpulse %s\n" +"Lié avec libpulse %s\n" + +#: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953 +#, fuzzy, c-format +msgid "Invalid client name '%s'" +msgstr "Plan des canaux invalide « %s »\n" + +#: ../src/utils/pacat.c:779 +#, fuzzy, c-format +msgid "Invalid stream name '%s'" +msgstr "Méthode de rééchantillonnage invalide « %s »." + +#: ../src/utils/pacat.c:816 +#, fuzzy, c-format +msgid "Invalid channel map '%s'" +msgstr "Plan des canaux invalide « %s »\n" + +#: ../src/utils/pacat.c:845 +#, fuzzy, c-format +msgid "Invalid latency specification '%s'" +msgstr "Spécification de latence invalide « %s »\n" + +#: ../src/utils/pacat.c:852 +#, fuzzy, c-format +msgid "Invalid process time specification '%s'" +msgstr "Spécification de temps de traitement invalide « %s »\n" + +#: ../src/utils/pacat.c:864 +#, fuzzy, c-format +msgid "Invalid property '%s'" +msgstr "Méthode de rééchantillonnage invalide « %s »." + +#: ../src/utils/pacat.c:881 +#, c-format +msgid "Unknown file format %s." +msgstr "" + +#: ../src/utils/pacat.c:900 +#, fuzzy +msgid "Invalid sample specification" +msgstr "Spécification d'échantillon invalide\n" + +#: ../src/utils/pacat.c:910 +#, fuzzy, c-format +msgid "open(): %s" +msgstr "open() : %s\n" + +#: ../src/utils/pacat.c:915 +#, fuzzy, c-format +msgid "dup2(): %s" +msgstr "dup2() : %s\n" + +#: ../src/utils/pacat.c:922 +#, fuzzy +msgid "Too many arguments." +msgstr "Trop de paramètres.\n" + +#: ../src/utils/pacat.c:933 +#, fuzzy +msgid "Failed to generate sample specification for file." +msgstr "Échec lors de l'obtention des informations de l'échantillon : %s\n" + +#: ../src/utils/pacat.c:953 +#, fuzzy +msgid "Failed to open audio file." +msgstr "Échec lors de l'ouverture du fichier audio.\n" + +#: ../src/utils/pacat.c:959 +#, fuzzy +msgid "" +"Warning: specified sample specification will be overwritten with " +"specification from file." +msgstr "Ouverture d'un flux %s avec une spécification d'échantillon « %s ».\n" + +#: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997 +#, fuzzy +msgid "Failed to determine sample specification from file." +msgstr "Échec lors de l'obtention des informations de l'échantillon : %s\n" + +#: ../src/utils/pacat.c:971 +#, fuzzy +msgid "Warning: Failed to determine channel map from file." +msgstr "Ouverture d'un flux %s avec une spécification d'échantillon « %s ».\n" + +#: ../src/utils/pacat.c:982 +#, fuzzy +msgid "Channel map doesn't match sample specification" +msgstr "" +"Le plan des canaux ne correspond pas à la spécification d'échantillon\n" + +#: ../src/utils/pacat.c:993 +#, fuzzy +msgid "Warning: failed to write channel map to file." +msgstr "Ouverture d'un flux %s avec une spécification d'échantillon « %s ».\n" + +#: ../src/utils/pacat.c:1008 +#, fuzzy, c-format +msgid "" +"Opening a %s stream with sample specification '%s' and channel map '%s'." +msgstr "Ouverture d'un flux %s avec une spécification d'échantillon « %s ».\n" + +#: ../src/utils/pacat.c:1009 +msgid "recording" +msgstr "enregistrement" + +#: ../src/utils/pacat.c:1009 +msgid "playback" +msgstr "lecture" + +#: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267 +#, fuzzy +msgid "pa_mainloop_new() failed." +msgstr "Échec de pa_mainloop_new().\n" + +#: ../src/utils/pacat.c:1054 +#, fuzzy +msgid "io_new() failed." +msgstr "Échec de io_new().\n" + +#: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279 +#, fuzzy +msgid "pa_context_new() failed." +msgstr "Échec de pa_context_new().\n" + +#: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285 +#, c-format +msgid "pa_context_connect() failed: %s" +msgstr "Échec de pa_context_connect() : %s" + +#: ../src/utils/pacat.c:1075 +#, fuzzy +msgid "pa_context_rttime_new() failed." +msgstr "Échec de pa_context_new().\n" + +#: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290 +#, fuzzy +msgid "pa_mainloop_run() failed." +msgstr "Échec de pa_mainloop_run().\n" + +#: ../src/utils/pasuspender.c:81 +#, c-format +msgid "fork(): %s\n" +msgstr "fork() : %s\n" + +#: ../src/utils/pasuspender.c:92 +#, c-format +msgid "execvp(): %s\n" +msgstr "execvp() : %s\n" + +#: ../src/utils/pasuspender.c:109 +#, c-format +msgid "Failure to suspend: %s\n" +msgstr "Échec lors de la suspension : %s\n" + +#: ../src/utils/pasuspender.c:124 +#, c-format +msgid "Failure to resume: %s\n" +msgstr "Échec lors de la reprise : %s\n" + +#: ../src/utils/pasuspender.c:147 +#, c-format +msgid "WARNING: Sound server is not local, not suspending.\n" +msgstr "" +"AVERTISSEMENT : le serveur de son n'est pas local, suspension annulée.\n" + +#: ../src/utils/pasuspender.c:159 +#, c-format +msgid "Connection failure: %s\n" +msgstr "Échec lors de la connexion : %s\n" + +#: ../src/utils/pasuspender.c:176 +#, c-format +msgid "Got SIGINT, exiting.\n" +msgstr "SIGINT reçu, fermeture.\n" + +#: ../src/utils/pasuspender.c:194 +#, c-format +msgid "WARNING: Child process terminated by signal %u\n" +msgstr "AVERTISSEMENT : le processus fils a été terminé par le signal %u\n" + +#: ../src/utils/pasuspender.c:212 +#, c-format +msgid "" +"%s [options] ... \n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +"\n" +msgstr "" +"%s [options] ... \n" +"\n" +" -h, --help Affiche cette aide\n" +" --version Affiche la version\n" +" -s, --server=SERVEUR Le nom du serveur auquel se " +"connecter\n" +"\n" + +#: ../src/utils/pasuspender.c:248 +#, c-format +msgid "" +"pasuspender %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pasuspender %s\n" +"Compilé avec libpulse %s\n" +"Lié avec libpulse %s\n" + +#: ../src/utils/pasuspender.c:277 +#, c-format +msgid "pa_mainloop_new() failed.\n" +msgstr "Échec de pa_mainloop_new().\n" + +#: ../src/utils/pasuspender.c:290 +#, c-format +msgid "pa_context_new() failed.\n" +msgstr "Échec de pa_context_new().\n" + +#: ../src/utils/pasuspender.c:298 +#, c-format +msgid "pa_mainloop_run() failed.\n" +msgstr "Échec de pa_mainloop_run().\n" + +#: ../src/utils/pactl.c:135 +#, fuzzy, c-format +msgid "Failed to get statistics: %s" +msgstr "Échec lors de l'obtention des statistiques : %s\n" + +#: ../src/utils/pactl.c:141 +#, c-format +msgid "Currently in use: %u blocks containing %s bytes total.\n" +msgstr "En cours d'utilisation : %u blocs contenant au total %s octets.\n" + +#: ../src/utils/pactl.c:144 +#, c-format +msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n" +msgstr "" +"Alloué pendant l'ensemble de la durée d'exécution : %u blocs contenant au " +"total %s octets.\n" + +#: ../src/utils/pactl.c:147 +#, c-format +msgid "Sample cache size: %s\n" +msgstr "Taille du cache de l'échantillon : %s\n" + +#: ../src/utils/pactl.c:156 +#, fuzzy, c-format +msgid "Failed to get server information: %s" +msgstr "Échec lors de l'obtention des informations du serveur : %s\n" + +#: ../src/utils/pactl.c:164 +#, c-format +msgid "" +"User name: %s\n" +"Host Name: %s\n" +"Server Name: %s\n" +"Server Version: %s\n" +"Default Sample Specification: %s\n" +"Default Channel Map: %s\n" +"Default Sink: %s\n" +"Default Source: %s\n" +"Cookie: %08x\n" +msgstr "" +"Nom d'utilisateur : %s\n" +"Nom d'hôte : %s\n" +"Nom du serveur : %s\n" +"Version du serveur : %s\n" +"Spécification d'échantillon par défaut : %s\n" +"Plan de canaux par défaut : %s\n" +"Destination par défaut : %s\n" +"Source par défaut : %s\n" +"Cookie : %08x\n" + +#: ../src/utils/pactl.c:205 +#, fuzzy, c-format +msgid "Failed to get sink information: %s" +msgstr "Échec lors de l'obtention des informations sur la destination : %s\n" + +# demander à Lennart s'il s'agit de monitor of source +#: ../src/utils/pactl.c:221 +#, c-format +msgid "" +"Sink #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor Source: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Destination #%u\n" +"\tÉtat : %s\n" +"\tNom : %s\n" +"\tDescription : %s\n" +"\tPilote : %s\n" +"\tSpécification de l'échantillon : %s\n" +"\tPlan des canaux : %s\n" +"\tModule propriétaire : %u\n" +"\tMuet : %s\n" +"\tVolume : %s%s%s\n" +"\t balance %0.2f\n" +"\tVolume de base : %s%s%s\n" +"\tMoniteur de la source : %s\n" +"\tLatence : %0.0f·µs, configurée %0.0f·µs\n" +"\tDrapeaux : %s%s%s%s%s%s\n" +"\tPropriétés :\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360 +#, fuzzy, c-format +msgid "\tPorts:\n" +msgstr "\tProfils :\n" + +#: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366 +#, fuzzy, c-format +msgid "\tActive Port: %s\n" +msgstr "\tProfil actif : %s\n" + +#: ../src/utils/pactl.c:297 +#, fuzzy, c-format +msgid "Failed to get source information: %s" +msgstr "Échec lors de l'obtention des informations sur la source : %s\n" + +#: ../src/utils/pactl.c:313 +#, c-format +msgid "" +"Source #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor of Sink: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Source #%u\n" +"\tÉtat : %s\n" +"\tNom : %s\n" +"\tDescription : %s\n" +"\tPilote : %s\n" +"\tSpécification de l'échantillon : %s\n" +"\tPlan des canaux : %s\n" +"\tModule propriétaire : %u\n" +"\tMuet : %s\n" +"\tVolume : %s%s%s\n" +"\t balance %0.2f\n" +"\tVolume de base : %s%s%s\n" +"\tMoniteur de la destination : %s\n" +"\tLatence : %0.0f µs, configurée %0.0f µs\n" +"\tDrapeaux : %s%s%s%s%s%s\n" +"\tPropriétés :\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:345 ../src/utils/pactl.c:401 ../src/utils/pactl.c:436 +#: ../src/utils/pactl.c:473 ../src/utils/pactl.c:532 ../src/utils/pactl.c:533 +#: ../src/utils/pactl.c:543 ../src/utils/pactl.c:587 ../src/utils/pactl.c:588 +#: ../src/utils/pactl.c:594 ../src/utils/pactl.c:637 ../src/utils/pactl.c:638 +#: ../src/utils/pactl.c:645 +msgid "n/a" +msgstr "n/d" + +#: ../src/utils/pactl.c:375 +#, fuzzy, c-format +msgid "Failed to get module information: %s" +msgstr "Échec lors de l'obtention des informations du module : %s\n" + +#: ../src/utils/pactl.c:393 +#, c-format +msgid "" +"Module #%u\n" +"\tName: %s\n" +"\tArgument: %s\n" +"\tUsage counter: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Module #%u\n" +"\tNom : %s\n" +"\tParamètre : %s\n" +"\tNombre d'utilisations : %s\n" +"\tPropriétés : \n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:412 +#, fuzzy, c-format +msgid "Failed to get client information: %s" +msgstr "Échec lors de l'obtention des informations du client : %s\n" + +#: ../src/utils/pactl.c:430 +#, c-format +msgid "" +"Client #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Client #%u\n" +"\tPilote : %s\n" +"\tModule propriétaire : %s\n" +"\tPropriétés :\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:447 +#, fuzzy, c-format +msgid "Failed to get card information: %s" +msgstr "Impossible d'obtenir des informations sur la carte : %s\n" + +#: ../src/utils/pactl.c:465 +#, c-format +msgid "" +"Card #%u\n" +"\tName: %s\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Carte #%u\n" +"\tNom : %s\n" +"\tPilote : %s\n" +"\tModule propriétaire : %s\n" +"\tPropriétés :\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:479 +#, c-format +msgid "\tProfiles:\n" +msgstr "\tProfils :\n" + +#: ../src/utils/pactl.c:485 +#, c-format +msgid "\tActive Profile: %s\n" +msgstr "\tProfil actif : %s\n" + +#: ../src/utils/pactl.c:496 +#, fuzzy, c-format +msgid "Failed to get sink input information: %s" +msgstr "" +"Échec lors de l'obtention des informations de l'entrée de la destination : %" +"s\n" + +#: ../src/utils/pactl.c:515 +#, c-format +msgid "" +"Sink Input #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSink: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tMute: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSink Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Entrée de la destination #%u\n" +"\tPilote : %s\n" +"\tModule propriétaire : %s\n" +"\tClient : %s\n" +"\tDestination : %u\n" +"\tSpécification de l'échantillon : %s\n" +"\tPlan des canaux : %s\n" +"\tMuet : %s\n" +"\tVolume : %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tLatence du tampon : %0.0f µs\n" +"\tLatence de la destination : %0.0f µs\n" +"\tMéthode de rééchantillonnage : %s\n" +"\tPropriétés :\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:554 +#, fuzzy, c-format +msgid "Failed to get source output information: %s" +msgstr "" +"Échec lors de l'obtention des informations de la sortie de la source : %s\n" + +#: ../src/utils/pactl.c:574 +#, c-format +msgid "" +"Source Output #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSource: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSource Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Sortie de la source #%u\n" +"\tPilote : %s\n" +"\tModule propriétaire : %s\n" +"\tClient : %s\n" +"\tSource : %u\n" +"\tSpécification de l'échantillon : %s\n" +"\tPlan des canaux : %s\n" +"\tLatence du tampon : %0.0f µs\n" +"\tLatence de la source : %0.0f µs\n" +"\tMéthode de rééchantillonnage : %s\n" +"\tPropriétés :\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:605 +#, fuzzy, c-format +msgid "Failed to get sample information: %s" +msgstr "Échec lors de l'obtention des informations de l'échantillon : %s\n" + +# Lazy ? +# load-sample-lazy = Create a new entry in the sample cache, but don't load +# the sample immediately. The sample is loaded only when it is first used +#: ../src/utils/pactl.c:623 +#, c-format +msgid "" +"Sample #%u\n" +"\tName: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tDuration: %0.1fs\n" +"\tSize: %s\n" +"\tLazy: %s\n" +"\tFilename: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Échantillon #%u\n" +"\tNom : %s\n" +"\tSpécification de l'échantillon : %s\n" +"\tPlan des canaux : %s\n" +"\tVolume : %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tDurée : %0.1f s\n" +"\tTaille : %s\n" +"\tCache retardé : %s\n" +"\tNom de fichier : %s\n" +"\tPropriétés :\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663 +#, fuzzy, c-format +msgid "Failure: %s" +msgstr "Échec : %s\n" + +#: ../src/utils/pactl.c:687 +#, fuzzy, c-format +msgid "Failed to upload sample: %s" +msgstr "Échec lors de l'envoi de l'échantillon : %s\n" + +#: ../src/utils/pactl.c:704 +#, fuzzy +msgid "Premature end of file" +msgstr "Fin prématurée du fichier\n" + +#: ../src/utils/pactl.c:863 +#, fuzzy +msgid "Got SIGINT, exiting." +msgstr "SIGINT reçu, fermeture.\n" + +#: ../src/utils/pactl.c:869 +#, fuzzy, c-format +msgid "" +"%s [options] stat\n" +"%s [options] list\n" +"%s [options] exit\n" +"%s [options] upload-sample FILENAME [NAME]\n" +"%s [options] play-sample NAME [SINK]\n" +"%s [options] remove-sample NAME\n" +"%s [options] move-sink-input SINKINPUT SINK\n" +"%s [options] move-source-output SOURCEOUTPUT SOURCE\n" +"%s [options] load-module NAME [ARGS ...]\n" +"%s [options] unload-module MODULE\n" +"%s [options] suspend-sink SINK 1|0\n" +"%s [options] suspend-source SOURCE 1|0\n" +"%s [options] set-card-profile CARD PROFILE\n" +"%s [options] set-sink-port SINK PORT\n" +"%s [options] set-source-port SOURCE PORT\n" +"%s [options] set-sink-volume SINK VOLUME\n" +"%s [options] set-source-volume SOURCE VOLUME\n" +"%s [options] set-sink-input-volume SINKINPUT VOLUME\n" +"%s [options] set-sink-mute SINK 1|0\n" +"%s [options] set-source-mute SOURCE 1|0\n" +"%s [options] set-sink-input-mute SINKINPUT 1|0\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" +msgstr "" +"%s [options] stat\n" +"%s [options] list\n" +"%s [options] exit\n" +"%s [options] upload-sample NOMDEFICHIER [NOM]\n" +"%s [options] play-sample NOM [DEST]\n" +"%s [options] remove-sample NOM\n" +"%s [options] move-sink-input ID DEST\n" +"%s [options] move-source-output ID SOURCE\n" +"%s [options] load-module NOM [PARAMS ...]\n" +"%s [options] unload-module ID\n" +"%s [options] suspend-sink [DEST] 1|0\n" +"%s [options] suspend-source [SOURCE] 1|0\n" +"%s·[options]·set-card-profile·[CARTE]·[PROFIL]·\n" +"\n" +" -h, --help Affiche cette aide\n" +" --version Affiche la version\n" +"\n" +" -s, --server=SERVEUR Le nom du serveur auquel se " +"connecter\n" +" -n, --client-name=NOM Définit le nom de ce client sur le " +"serveur\n" + +#: ../src/utils/pactl.c:933 +#, c-format +msgid "" +"pactl %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pactl %s\n" +"Compilé avec libpulse %s\n" +"Lié avec libpulse %s\n" + +#: ../src/utils/pactl.c:979 +#, fuzzy +msgid "Please specify a sample file to load" +msgstr "Veuillez indiquer un fichier d'échantillon à charger\n" + +#: ../src/utils/pactl.c:992 +#, fuzzy +msgid "Failed to open sound file." +msgstr "Échec lors de l'ouverture du fichier audio.\n" + +#: ../src/utils/pactl.c:1004 +#, fuzzy +msgid "Warning: Failed to determine sample specification from file." +msgstr "Ouverture d'un flux %s avec une spécification d'échantillon « %s ».\n" + +#: ../src/utils/pactl.c:1014 +#, fuzzy +msgid "You have to specify a sample name to play" +msgstr "Vous devez indiquer un nom d'échantillon à lire\n" + +#: ../src/utils/pactl.c:1026 +#, fuzzy +msgid "You have to specify a sample name to remove" +msgstr "Vous devez indiquer un nom d'échantillon à supprimer\n" + +#: ../src/utils/pactl.c:1035 +#, fuzzy +msgid "You have to specify a sink input index and a sink" +msgstr "" +"Vous devez indiquer un index de sortie de destination et une destination\n" + +#: ../src/utils/pactl.c:1045 +#, fuzzy +msgid "You have to specify a source output index and a source" +msgstr "Vous devez indiquer un index de sortie de source et une source\n" + +#: ../src/utils/pactl.c:1060 +#, fuzzy +msgid "You have to specify a module name and arguments." +msgstr "Vous devez indiquer un nom de module et des paramètres.\n" + +#: ../src/utils/pactl.c:1080 +#, fuzzy +msgid "You have to specify a module index" +msgstr "Vous devez indiquer un index de module\n" + +#: ../src/utils/pactl.c:1090 +#, fuzzy +msgid "" +"You may not specify more than one sink. You have to specify a boolean value." +msgstr "" +"Vous ne pouvez pas indiquer plus d'une destination. Vous devez indiquer une " +"valeur booléenne.\n" + +#: ../src/utils/pactl.c:1103 +#, fuzzy +msgid "" +"You may not specify more than one source. You have to specify a boolean " +"value." +msgstr "" +"Vous ne pouvez pas indiquer plus d'une source. Vous devez indiquer une " +"valeur booléenne.\n" + +#: ../src/utils/pactl.c:1115 +#, fuzzy +msgid "You have to specify a card name/index and a profile name" +msgstr "Vous devez indiquer un nom/un index de carte et un nom de profil\n" + +#: ../src/utils/pactl.c:1126 +#, fuzzy +msgid "You have to specify a sink name/index and a port name" +msgstr "Vous devez indiquer un nom/un index de carte et un nom de profil\n" + +#: ../src/utils/pactl.c:1137 +#, fuzzy +msgid "You have to specify a source name/index and a port name" +msgstr "Vous devez indiquer un nom/un index de carte et un nom de profil\n" + +#: ../src/utils/pactl.c:1149 +#, fuzzy +msgid "You have to specify a sink name/index and a volume" +msgstr "Vous devez indiquer un nom/un index de carte et un nom de profil\n" + +#: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171 +#: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209 +#: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248 +#, fuzzy +msgid "Invalid volume specification" +msgstr "Spécification d'échantillon invalide\n" + +#: ../src/utils/pactl.c:1166 +#, fuzzy +msgid "You have to specify a source name/index and a volume" +msgstr "Vous devez indiquer un nom/un index de carte et un nom de profil\n" + +#: ../src/utils/pactl.c:1183 +#, fuzzy +msgid "You have to specify a sink input index and a volume" +msgstr "" +"Vous devez indiquer un index de sortie de destination et une destination\n" + +#: ../src/utils/pactl.c:1188 +msgid "Invalid sink input index" +msgstr "" + +#: ../src/utils/pactl.c:1204 +#, fuzzy +msgid "You have to specify a sink name/index and a mute boolean" +msgstr "Vous devez indiquer un nom/un index de carte et un nom de profil\n" + +#: ../src/utils/pactl.c:1221 +#, fuzzy +msgid "You have to specify a source name/index and a mute boolean" +msgstr "Vous devez indiquer un nom/un index de carte et un nom de profil\n" + +#: ../src/utils/pactl.c:1238 +#, fuzzy +msgid "You have to specify a sink input index and a mute boolean" +msgstr "" +"Vous devez indiquer un index de sortie de destination et une destination\n" + +#: ../src/utils/pactl.c:1243 +#, fuzzy +msgid "Invalid sink input index specification" +msgstr "Spécification d'échantillon invalide\n" + +#: ../src/utils/pactl.c:1262 +#, fuzzy +msgid "No valid command specified." +msgstr "Aucune commande valide indiquée.\n" + +#: ../src/utils/pax11publish.c:61 +#, c-format +msgid "" +"%s [-D display] [-S server] [-O sink] [-I source] [-c file] [-d|-e|-i|-r]\n" +"\n" +" -d Show current PulseAudio data attached to X11 display (default)\n" +" -e Export local PulseAudio data to X11 display\n" +" -i Import PulseAudio data from X11 display to local environment " +"variables and cookie file.\n" +" -r Remove PulseAudio data from X11 display\n" +msgstr "" +"%s [-D visuel] [-S serveur] [-O destination] [-I source] [-c fichier] [-d|-" +"e|-i|-r]\n" +"\n" +" -d Affiche les données PulseAudio actuelles attachées au visuel X11 (par " +"défaut)\n" +" -e Exporte les données PulseAudio locales vers le visuel X11\n" +" -i Importe les données PulseAudio depuis le visuel X11 vers les " +"variables de l'environnement local et le fichier de cookie.\n" +" -r Enlève les données PulseAudio du visuel X11\n" + +#: ../src/utils/pax11publish.c:94 +#, c-format +msgid "Failed to parse command line.\n" +msgstr "Échec lors de l'analyse de la ligne de commande.\n" + +#: ../src/utils/pax11publish.c:108 +#, c-format +msgid "Server: %s\n" +msgstr "Serveur : %s\n" + +#: ../src/utils/pax11publish.c:110 +#, c-format +msgid "Source: %s\n" +msgstr "Source : %s\n" + +#: ../src/utils/pax11publish.c:112 +#, c-format +msgid "Sink: %s\n" +msgstr "Destination : %s\n" + +#: ../src/utils/pax11publish.c:114 +#, c-format +msgid "Cookie: %s\n" +msgstr "Cookie : %s\n" + +#: ../src/utils/pax11publish.c:132 +#, c-format +msgid "Failed to parse cookie data\n" +msgstr "Échec lors de l'analyse des données du cookie\n" + +#: ../src/utils/pax11publish.c:137 +#, c-format +msgid "Failed to save cookie data\n" +msgstr "Échec lors de l'enregistrement des données du cookie\n" + +#: ../src/utils/pax11publish.c:152 +#, c-format +msgid "Failed to load client configuration file.\n" +msgstr "Échec lors du chargement du fichier de configuration du client.\n" + +#: ../src/utils/pax11publish.c:157 +#, c-format +msgid "Failed to read environment configuration data.\n" +msgstr "" +"Échec lors de la lecture des données de configuration de l'environnement.\n" + +# Fully Qualified Domain Name +#: ../src/utils/pax11publish.c:174 +#, c-format +msgid "Failed to get FQDN.\n" +msgstr "Échec lors de l'obtention du FQDN (« nom de domaine complet »).\n" + +#: ../src/utils/pax11publish.c:194 +#, c-format +msgid "Failed to load cookie data\n" +msgstr "Échec lors du chargement des données du cookie\n" + +#: ../src/utils/pax11publish.c:211 +#, c-format +msgid "Not yet implemented.\n" +msgstr "Pas encore implémenté.\n" + +#: ../src/utils/pacmd.c:69 +msgid "No PulseAudio daemon running, or not running as session daemon." +msgstr "" + +#: ../src/utils/pacmd.c:74 +#, c-format +msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s" +msgstr "socket(PF_UNIX, SOCK_STREAM, 0) : %s" + +#: ../src/utils/pacmd.c:91 +#, c-format +msgid "connect(): %s" +msgstr "connect() : %s" + +#: ../src/utils/pacmd.c:99 +msgid "Failed to kill PulseAudio daemon." +msgstr "Impossible de tuer le démon PulseAudio." + +#: ../src/utils/pacmd.c:107 +msgid "Daemon not responding." +msgstr "Le démon ne répond pas." + +#: ../src/utils/pacmd.c:161 +#, fuzzy, c-format +msgid "poll(): %s" +msgstr "fork() : %s" + +#: ../src/utils/pacmd.c:171 ../src/utils/pacmd.c:188 +#, c-format +msgid "read(): %s" +msgstr "read() : %s" + +#: ../src/utils/pacmd.c:207 ../src/utils/pacmd.c:223 +#, c-format +msgid "write(): %s" +msgstr "write() : %s" + +#: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:219 +msgid "Cannot access autospawn lock." +msgstr "Impossible d'accèder au verrou autonome." + +#: ../src/modules/alsa/alsa-sink.c:530 ../src/modules/alsa/alsa-sink.c:689 +#, c-format +msgid "" +"ALSA woke us up to write new data to the device, but there was actually " +"nothing to write!\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers.\n" +"We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() " +"returned 0 or another value < min_avail." +msgstr "" +"ALSA nous a réveillé pour lire de nouvelles données à partir du " +"périphérique, mais il n'y avait en fait rien à écrire !\n" +"Il s'agit très probablement d'un bogue dans le pilote ALSA « %s ». Veuillez " +"rapporter ce problème aux développeurs d'ALSA.Nous avons été réveillés avec " +"le jeu POLLOUT -- cependant un snd_pcm_avail() ultérieur a retourné 0 ou une " +"autre valeur < min_avail." + +#: ../src/modules/alsa/alsa-source.c:506 ../src/modules/alsa/alsa-source.c:656 +#, c-format +msgid "" +"ALSA woke us up to read new data from the device, but there was actually " +"nothing to read!\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers.\n" +"We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() " +"returned 0 or another value < min_avail." +msgstr "" +"ALSA nous a réveillé pour lire de nouvelles données à partir du " +"périphérique, mais il n'y avait en fait rien à lire !\n" +"Il s'agit très probablement d'un bogue dans le pilote ALSA « %s ». Veuillez " +"rapporter ce problème aux développeurs d'ALSA.Nous avons été réveillés avec " +"le jeu POLLIN -- cependant un snd_pcm_avail() ultérieur a retourné 0 ou une " +"autre valeur < min_avail." + +#: ../src/modules/alsa/module-alsa-card.c:152 +#: ../src/modules/bluetooth/module-bluetooth-device.c:2228 +#: ../src/modules/alsa/alsa-mixer.c:2931 +msgid "Off" +msgstr "Éteint" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2184 +msgid "High Fidelity Playback (A2DP)" +msgstr "Lecture haute fidélité (A2DP)" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2198 +#, fuzzy +msgid "High Fidelity Capture (A2DP)" +msgstr "Lecture haute fidélité (A2DP)" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2213 +msgid "Telephony Duplex (HSP/HFP)" +msgstr "Telephonie en duplex (HSP/HFP)" + +#: ../src/modules/reserve-wrap.c:151 +msgid "PulseAudio Sound Server" +msgstr "Serveur de son PulseAudio" + +#: ../src/modules/module-rygel-media-server.c:569 +#: ../src/modules/module-rygel-media-server.c:583 +msgid "Output Devices" +msgstr "" + +#: ../src/modules/module-rygel-media-server.c:570 +#: ../src/modules/module-rygel-media-server.c:584 +#, fuzzy +msgid "Input Devices" +msgstr "Entrée %s" + +#: ../src/modules/module-rygel-media-server.c:774 +msgid "Audio on @HOSTNAME@" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1701 +#, fuzzy +msgid "Input" +msgstr "Entrée %s" + +#: ../src/modules/alsa/alsa-mixer.c:1702 +msgid "Docking Station Input" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1703 +msgid "Docking Station Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1704 +msgid "Line-In" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1705 +msgid "Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1706 +msgid "External Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1707 +#, fuzzy +msgid "Internal Microphone" +msgstr "Audio interne" + +#: ../src/modules/alsa/alsa-mixer.c:1708 +msgid "Radio" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1709 +msgid "Video" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1710 +msgid "Automatic Gain Control" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1711 +msgid "No Automatic Gain Control" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1712 +msgid "Boost" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1713 +msgid "No Boost" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1714 +msgid "Amplifier" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1715 +msgid "No Amplifier" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1773 +#, fuzzy +msgid "Analog Input" +msgstr "Mono analogique" + +#: ../src/modules/alsa/alsa-mixer.c:1774 +#, fuzzy +msgid "Analog Microphone" +msgstr "Mono analogique" + +#: ../src/modules/alsa/alsa-mixer.c:1775 +#, fuzzy +msgid "Analog Line-In" +msgstr "Mono analogique" + +#: ../src/modules/alsa/alsa-mixer.c:1776 +#, fuzzy +msgid "Analog Radio" +msgstr "Mono analogique" + +#: ../src/modules/alsa/alsa-mixer.c:1777 +#, fuzzy +msgid "Analog Video" +msgstr "Stéréo analogique" + +#: ../src/modules/alsa/alsa-mixer.c:1778 +#, fuzzy +msgid "Analog Output" +msgstr "Sortie %s" + +#: ../src/modules/alsa/alsa-mixer.c:1779 +#, fuzzy +msgid "Analog Headphones" +msgstr "Mono analogique" + +#: ../src/modules/alsa/alsa-mixer.c:1780 +msgid "Analog Output (LFE)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1781 +#, fuzzy +msgid "Analog Mono Output" +msgstr "Mono analogique" + +#: ../src/modules/alsa/alsa-mixer.c:1981 +#, c-format +msgid "%s+%s" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404 +#, c-format +msgid "%s / %s" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2790 +msgid "Analog Mono" +msgstr "Mono analogique" + +#: ../src/modules/alsa/alsa-mixer.c:2791 +msgid "Analog Stereo" +msgstr "Stéréo analogique" + +#: ../src/modules/alsa/alsa-mixer.c:2792 +#, fuzzy +msgid "Analog Surround 2.1" +msgstr "Surround analogique 4.1" + +#: ../src/modules/alsa/alsa-mixer.c:2793 +#, fuzzy +msgid "Analog Surround 3.0" +msgstr "Surround analogique 4.0" + +#: ../src/modules/alsa/alsa-mixer.c:2794 +#, fuzzy +msgid "Analog Surround 3.1" +msgstr "Surround analogique 4.1" + +#: ../src/modules/alsa/alsa-mixer.c:2795 +msgid "Analog Surround 4.0" +msgstr "Surround analogique 4.0" + +#: ../src/modules/alsa/alsa-mixer.c:2796 +msgid "Analog Surround 4.1" +msgstr "Surround analogique 4.1" + +#: ../src/modules/alsa/alsa-mixer.c:2797 +msgid "Analog Surround 5.0" +msgstr "Surround analogique 5.0" + +#: ../src/modules/alsa/alsa-mixer.c:2798 +msgid "Analog Surround 5.1" +msgstr "Surround analogique 5.1" + +#: ../src/modules/alsa/alsa-mixer.c:2799 +#, fuzzy +msgid "Analog Surround 6.0" +msgstr "Surround analogique 4.0" + +#: ../src/modules/alsa/alsa-mixer.c:2800 +#, fuzzy +msgid "Analog Surround 6.1" +msgstr "Surround analogique 4.1" + +#: ../src/modules/alsa/alsa-mixer.c:2801 +#, fuzzy +msgid "Analog Surround 7.0" +msgstr "Surround analogique 4.0" + +#: ../src/modules/alsa/alsa-mixer.c:2802 +msgid "Analog Surround 7.1" +msgstr "Surround analogique 7.1" + +#: ../src/modules/alsa/alsa-mixer.c:2803 +msgid "Digital Stereo (IEC958)" +msgstr "Stéréo numérique (IEC958)" + +#: ../src/modules/alsa/alsa-mixer.c:2804 +#, fuzzy +msgid "Digital Surround 4.0 (IEC958)" +msgstr "Surround numérique 4.0 (IEC958/AC3)" + +#: ../src/modules/alsa/alsa-mixer.c:2805 +msgid "Digital Surround 4.0 (IEC958/AC3)" +msgstr "Surround numérique 4.0 (IEC958/AC3)" + +#: ../src/modules/alsa/alsa-mixer.c:2806 +msgid "Digital Surround 5.1 (IEC958/AC3)" +msgstr "Surround numérique 5.1 (IEC958/AC3)" + +#: ../src/modules/alsa/alsa-mixer.c:2807 +msgid "Digital Stereo (HDMI)" +msgstr "Stéréo numérique (HDMI)" + +#: ../src/modules/alsa/alsa-mixer.c:2928 +#, fuzzy +msgid "Analog Mono Duplex" +msgstr "Mono analogique" + +#: ../src/modules/alsa/alsa-mixer.c:2929 +#, fuzzy +msgid "Analog Stereo Duplex" +msgstr "Stéréo analogique" + +#: ../src/modules/alsa/alsa-mixer.c:2930 +#, fuzzy +msgid "Digital Stereo Duplex (IEC958)" +msgstr "Stéréo numérique (IEC958)" + +#, fuzzy +#~ msgid "Invalid client name '%s'\n" +#~ msgstr "Plan des canaux invalide « %s »\n" + +#, fuzzy +#~ msgid "Failed to determine sample specification from file.\n" +#~ msgstr "Échec lors de l'obtention des informations de l'échantillon : %s\n" + +#~ msgid "select(): %s" +#~ msgstr "select() : %s" + +#~ msgid "Cannot connect to system bus: %s" +#~ msgstr "Impossible de se connecter au bus système : %s" + +#~ msgid "Cannot get caller from PID: %s" +#~ msgstr "Impossible d'obtenir le programme appelant à partir du PID : %s" + +#~ msgid "Cannot set UID on caller object." +#~ msgstr "Impossible de définir un UID sur l'objet appelant." + +#~ msgid "Failed to get CK session." +#~ msgstr "Échec lors de l'obtention de la session CK." + +#~ msgid "Cannot set UID on session object." +#~ msgstr "Impossible de définir l'UID sur l'objet de session." + +#~ msgid "Cannot allocate PolKitAction." +#~ msgstr "Impossible d'allouer PolKitAction." + +#~ msgid "Cannot set action_id" +#~ msgstr "Impossible de définir action_id." + +#~ msgid "Cannot allocate PolKitContext." +#~ msgstr "Impossible d'allouer PolKitContext." + +#~ msgid "Cannot initialize PolKitContext: %s" +#~ msgstr "Impossible d'initialiser PolKitContext : %s" + +#~ msgid "Could not determine whether caller is authorized: %s" +#~ msgstr "Impossible de déterminer si le programme appelant est autorisé : %s" + +#~ msgid "Cannot obtain auth: %s" +#~ msgstr "Impossible d'obtenir l'authentification : %s" + +#~ msgid "PolicyKit responded with '%s'" +#~ msgstr "PolicyKit a renvoyé « %s »" + +#~ msgid "" +#~ "High-priority scheduling (negative Unix nice level) for the PulseAudio " +#~ "daemon" +#~ msgstr "" +#~ "Ordonnancement haute priorité (niveau Unix « nice » négatif) pour le démon " +#~ "PulseAudio" + +#~ msgid "Real-time scheduling for the PulseAudio daemon" +#~ msgstr "Ordonnancement en temps réel pour le démon PulseAudio" + +#~ msgid "" +#~ "System policy prevents PulseAudio from acquiring high-priority scheduling." +#~ msgstr "" +#~ "La politique du système empêche PulseAudio d'acquérir un ordonnancement " +#~ "haute priorité" + +#~ msgid "" +#~ "System policy prevents PulseAudio from acquiring real-time scheduling." +#~ msgstr "" +#~ "La politique du système empêche PulseAudio d'acquérir un ordonnancement " +#~ "en temps réel" + +#~ msgid "read() failed: %s\n" +#~ msgstr "Échec de read() : %s\n" + +#, fuzzy +#~ msgid "pa_context_connect() failed: %s\n" +#~ msgstr "Échec de pa_context_connect() : %s" + +#~ msgid "We're in the group '%s', allowing high-priority scheduling." +#~ msgstr "" +#~ "Nous sommes dans le groupe « %s », permettant une planification à haute " +#~ "priorité." + +#~ msgid "We're in the group '%s', allowing real-time scheduling." +#~ msgstr "" +#~ "Nous sommes dans le groupe « %s », permettant un ordonnancement en temps " +#~ "réel." + +#~ msgid "PolicyKit grants us acquire-high-priority privilege." +#~ msgstr "" +#~ "PolicyKit a accordé l'acquisition des permissions de haute priorité." + +#~ msgid "PolicyKit refuses acquire-high-priority privilege." +#~ msgstr "PolicyKit a refusé l'acquisition des permissions de haute priorité." + +#~ msgid "PolicyKit grants us acquire-real-time privilege." +#~ msgstr "PolicyKit a accordé l'acquisition des permissions de temps réel." + +#~ msgid "PolicyKit refuses acquire-real-time privilege." +#~ msgstr "PolicyKit a refusé l'acquisition des permissions de temps réel." + +#~ msgid "" +#~ "Called SUID root and real-time and/or high-priority scheduling was " +#~ "requested in the configuration. However, we lack the necessary " +#~ "privileges:\n" +#~ "We are not in group '%s', PolicyKit refuse to grant us the requested " +#~ "privileges and we have no increase RLIMIT_NICE/RLIMIT_RTPRIO resource " +#~ "limits.\n" +#~ "For enabling real-time/high-priority scheduling please acquire the " +#~ "appropriate PolicyKit privileges, or become a member of '%s', or increase " +#~ "the RLIMIT_NICE/RLIMIT_RTPRIO resource limits for this user." +#~ msgstr "" +#~ "Le SUID root et l'ordonnancement en temps réel et/ou haute priorité ont " +#~ "été spécifiés dans la configuration. Cependant, il nous manque les " +#~ "privilèges nécessaires :\n" +#~ "Nous ne sommes pas dans le groupe « %s », PolicyKit refuse de nous " +#~ "accorder les privilèges demandés et nous devons augmenter les limites de " +#~ "ressources RLIMIT_NICE/RLIMIT_RTPRIO.\n" +#~ "Pour activer l'ordonnancement en temps réel/haute priorité, veuillez " +#~ "acquérir les privilèges PolicyKit apropriés, ou devenir membre de « %s », " +#~ "ou augmenter les limites de ressources RLIMIT_NICE/RLIMIT_RTPRIO pour cet " +#~ "utilisateur." + +#~ msgid "" +#~ "High-priority scheduling enabled in configuration but not allowed by " +#~ "policy." +#~ msgstr "" +#~ "La planification à haute priorité est activée dans la configuration mais " +#~ "n'est pas permise par la politique." + +#~ msgid "Successfully increased RLIMIT_RTPRIO" +#~ msgstr "Augmentation de RLIMIT_RTPRIO réussie" + +#~ msgid "RLIMIT_RTPRIO failed: %s" +#~ msgstr "RLIMIT_RTPRIO a échoué : %s" + +#~ msgid "Giving up CAP_NICE" +#~ msgstr "Abandon de CAP_NICE" + +#~ msgid "" +#~ "Real-time scheduling enabled in configuration but not allowed by policy." +#~ msgstr "" +#~ "La planification en temps réel est activée mais n'est pas permise par la " +#~ "politique." + +#~ msgid "Limited capabilities successfully to CAP_SYS_NICE." +#~ msgstr "Limitation des capacités à CAP_SYS_NICE réussie." + +#~ msgid "time_new() failed.\n" +#~ msgstr "Échec de time_new().\n" + +#~ msgid "Output %s + Input %s" +#~ msgstr "Sortie %s + Entrée %s" + +#~ msgid "Stream successfully created\n" +#~ msgstr "Création du flux réussie\n" + +#~ msgid "Stream errror: %s\n" +#~ msgstr "Erreur du flux : %s\n" + +#~ msgid "Connection established.\n" +#~ msgstr "Connexion établie.\n" + +#~ msgid "" +#~ "%s [options] [FILE]\n" +#~ "\n" +#~ " -h, --help Show this help\n" +#~ " --version Show version\n" +#~ "\n" +#~ " -v, --verbose Enable verbose operation\n" +#~ "\n" +#~ " -s, --server=SERVER The name of the server to connect " +#~ "to\n" +#~ " -d, --device=DEVICE The name of the sink to connect " +#~ "to\n" +#~ " -n, --client-name=NAME How to call this client on the " +#~ "server\n" +#~ " --stream-name=NAME How to call this stream on the " +#~ "server\n" +#~ " --volume=VOLUME Specify the initial (linear) " +#~ "volume in range 0...65536\n" +#~ " --channel-map=CHANNELMAP Set the channel map to the use\n" +#~ msgstr "" +#~ "%s [options] [FICHIER]\n" +#~ "\n" +#~ " -h, --help Affiche cette aide\n" +#~ " --version Affiche la version\n" +#~ "\n" +#~ " -v, --verbose Active le mode verbeux\n" +#~ "\n" +#~ " -s, --server=SERVEUR Le nom du serveur auquel se " +#~ "connecter\n" +#~ " -d, --device=PÉRIPHÉRIQUE Le nom de la destination à " +#~ "laquelle se connecter\n" +#~ " -n, --client-name=NOM Définit le nom de ce client sur " +#~ "le serveur\n" +#~ " --stream-name=NOM Définit le nom de ce flux sur le " +#~ "serveur\n" +#~ " --volume=VOLUME Définit le volume initial " +#~ "(linéaire) entre 0 et 65536\n" +#~ " --channel-map=PLANDESCANAUX Définit le plan des canaux à " +#~ "utiliser\n" + +#~ msgid "" +#~ "paplay %s\n" +#~ "Compiled with libpulse %s\n" +#~ "Linked with libpulse %s\n" +#~ msgstr "" +#~ "paplay %s\n" +#~ "Compilé avec libpulse %s\n" +#~ "Lié avec libpulse %s\n" + +#~ msgid "Invalid channel map\n" +#~ msgstr "Plan des canaux invalide\n" + +#~ msgid "Failed to open file '%s'\n" +#~ msgstr "Échec lors de l'ouverture du fichier « %s »\n" + +#~ msgid "Channel map doesn't match file.\n" +#~ msgstr "Le plan des canaux ne correspond pas au fichier.\n" + +#~ msgid "Using sample spec '%s'\n" +#~ msgstr "Utilisation de la spécification de l'échantillon « %s »\n" + +#, fuzzy +#~ msgid "" +#~ "Called SUID root and real-time and/or high-priority scheduling was " +#~ "requested in the configuration. However, we lack the necessary " +#~ "privileges:\n" +#~ "We are not in group '" +#~ msgstr "" +#~ "Le SUID root a été appelé et la planification à haute priorité/en temps " +#~ "réel demandée dans la configuration. Néanmoins nous n'avons pas les " +#~ "permissions nécessaires :\n" +#~ "nous ne somme pas dans le groupe " + +#, fuzzy +#~ msgid "--log-time boolean argument" +#~ msgstr "--disallow-exit requiert un paramètre booléen" + +#~ msgid "Default sink name (%s) does not exist in name register." +#~ msgstr "" +#~ "Le nom de la destination par défaut (%s) n'existe pas dans le registre " +#~ "des noms." + +#~ msgid "Buffer overrun, dropping incoming data\n" +#~ msgstr "Saturation du tampon, abandon des données entrantes\n" + +#~ msgid "pa_stream_drop() failed: %s\n" +#~ msgstr "Échec de pa_stream_drop() : %s\n" + +#~ msgid "muted" +#~ msgstr "en sourdine" + +#~ msgid "" +#~ "*** Autoload Entry #%u ***\n" +#~ "Name: %s\n" +#~ "Type: %s\n" +#~ "Module: %s\n" +#~ "Argument: %s\n" +#~ msgstr "" +#~ "*** Entrée de chargement automatique #%u ***\n" +#~ "Nom : %s\n" +#~ "Type : %s\n" +#~ "Module : %s\n" +#~ "Paramètre : %s\n" + +#~ msgid "sink" +#~ msgstr "destination" + +#~ msgid "source" +#~ msgstr "source" + +#~ msgid "" +#~ "' and PolicyKit refuse to grant us priviliges. Dropping SUID again.\n" +#~ "For enabling real-time scheduling please acquire the appropriate " +#~ "PolicyKit priviliges, or become a member of '" +#~ msgstr "" +#~ " et PolicyKit refuse de nous accorder les permissions. Abandon du SUID à " +#~ "nouveau.\n" +#~ "Pour activer la planification en temps réel, veuillez aquérir les " +#~ "permissions PolicyKit appropriées, ou devenez membre de " + +#~ msgid "" +#~ "', or increase the RLIMIT_NICE/RLIMIT_RTPRIO resource limits for this " +#~ "user." +#~ msgstr "" +#~ ", ou augmentez les limites de ressource RLIMIT_NICE/RLIMIT_RTPRIO pour " +#~ "cet utilisateur." + +#~ msgid "socketpair(): %s" +#~ msgstr "socketpair() : %s" diff --git a/po/gu.po b/po/gu.po new file mode 100644 index 0000000..e174451 --- /dev/null +++ b/po/gu.po @@ -0,0 +1,2562 @@ +# translation of PulseAudio-up.po to Gujarati +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Sweta Kothari , 2009. +msgid "" +msgstr "" +"Project-Id-Version: PulseAudio-up\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-09-29 23:47+0200\n" +"PO-Revision-Date: 2009-09-11 13:02+0530\n" +"Last-Translator: Sweta Kothari \n" +"Language-Team: Gujarati\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=2; plural=(n!=1);\n" + +#: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629 +#, c-format +msgid "%s %s" +msgstr "%s %s" + +#: ../src/modules/alsa/alsa-util.c:1106 +#, c-format +msgid "" +"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu " +"ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_avail() કિંમતને પાછુ મળેલ છે કે જે અપવાદ રીતે વિશાળ છે: %lu bytes (%lu ms).\n" +"ALSA ડ્રાઇવર '%s' માં મોટેભાગે આ ભૂલ જેવુ છે. ALSA ડેવલ્પરોમાં આ સમસ્યાને મહેરબાની કરીને " +"અહેવાલ કરો." + +#: ../src/modules/alsa/alsa-util.c:1147 +#, c-format +msgid "" +"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%" +"lu ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_delay() કિંમતને પાછુ મળેલ છે કે જે અપવાદ રીતે વિશાળ છે: %li bytes (%s%lu " +"ms).\n" +"ALSA ડ્રાઇવર '%s' માં મોટેભાગે આ ભૂલ જેવુ છે. ALSA ડેવલ્પરોમાં આ સમસ્યાને મહેરબાની કરીને " +"અહેવાલ કરો." + +#: ../src/modules/alsa/alsa-util.c:1194 +#, c-format +msgid "" +"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes " +"(%lu ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_mmap_begin() કિંમતને પાછુ મળેલ છે કે જે અપવાદ રીતે વિશાળ છે: %lu બાઇટો (%lu " +"ms).\n" +"ALSA ડ્રાઇવર '%s' માં મોટેભાગે આ ભૂલ જેવુ છે. ALSA ડેવલ્પરોમાં આ સમસ્યાને મહેરબાની કરીને " +"અહેવાલ કરો." + +#: ../src/modules/module-always-sink.c:39 +msgid "Always keeps at least one sink loaded even if it's a null one" +msgstr "હંમેશા ઓછામાં ઓછુ એક સિંક લોડ થયેલ રાખો જો તે શૂન્ય હોય તો પણ" + +#: ../src/modules/module-always-sink.c:83 +msgid "Dummy Output" +msgstr "ડમી આઉટપુટ" + +#: ../src/modules/module-ladspa-sink.c:49 +msgid "Virtual LADSPA sink" +msgstr "વર્ચ્યુઅલ LADSPA સિંક" + +#: ../src/modules/module-ladspa-sink.c:53 +msgid "" +"sink_name= sink_properties= " +"master= format= rate= " +"channels= channel_map= plugin= label= control=" +msgstr "" +"sink_name= sink_properties= " +"master= format= rate= " +"channels= channel_map= plugin= label= control=" + +#: ../src/modules/module-null-sink.c:55 +msgid "Clocked NULL sink" +msgstr "ક્લોક થયેલ NULL સિંક" + +#: ../src/modules/module-null-sink.c:291 +msgid "Null Output" +msgstr "શૂન્ય આઉટપુટ" + +#: ../src/pulsecore/sink.c:2613 +msgid "Internal Audio" +msgstr "આંતરિક ઓડિયો" + +#: ../src/pulsecore/sink.c:2618 +msgid "Modem" +msgstr "મોડેમ" + +#: ../src/daemon/ltdl-bind-now.c:124 +msgid "Failed to find original lt_dlopen loader." +msgstr "મૂળ lt_dlopen લોડરને શોધવામાં નિષ્ફળ." + +#: ../src/daemon/ltdl-bind-now.c:129 +msgid "Failed to allocate new dl loader." +msgstr "નવા dl લોડરને ફાળવવાનું નિષ્ફળ." + +#: ../src/daemon/ltdl-bind-now.c:142 +msgid "Failed to add bind-now-loader." +msgstr "bind-now-loader ને ઉમેરવાનું નિષ્ફળ." + +#: ../src/daemon/main.c:141 +#, c-format +msgid "Got signal %s." +msgstr "સંકેત %s મળ્યુ." + +#: ../src/daemon/main.c:168 +msgid "Exiting." +msgstr "બહાર નીકળી રહ્યા છે." + +#: ../src/daemon/main.c:186 +#, c-format +msgid "Failed to find user '%s'." +msgstr "વપરાશકર્તા '%s' ને શોધવામાં નિષ્ફળ." + +#: ../src/daemon/main.c:191 +#, c-format +msgid "Failed to find group '%s'." +msgstr "જૂથ '%s' ને શોધવામાં નિષ્ફળ." + +#: ../src/daemon/main.c:195 +#, c-format +msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)." +msgstr "વપરાશકર્તા '%s' (UID %lu) અને જૂથ '%s' (GID %lu) શોધાયુ." + +#: ../src/daemon/main.c:200 +#, c-format +msgid "GID of user '%s' and of group '%s' don't match." +msgstr "વપરાશકર્તા '%s' અને જૂથ '%s' ની GID બંધબેસતુ નથી." + +#: ../src/daemon/main.c:205 +#, c-format +msgid "Home directory of user '%s' is not '%s', ignoring." +msgstr "વપરાશકર્તાઓ '%s' ની ઘર ડિરેક્ટરી '%s' નથી, અવગણી રહ્યા છે." + +#: ../src/daemon/main.c:208 ../src/daemon/main.c:213 +#, c-format +msgid "Failed to create '%s': %s" +msgstr "'%s' ને બનાવવામાં નિષ્ફળ: %s" + +#: ../src/daemon/main.c:220 +#, c-format +msgid "Failed to change group list: %s" +msgstr "જૂથ યાદીને બદલવામાં નિષ્ફળ: %s" + +#: ../src/daemon/main.c:236 +#, c-format +msgid "Failed to change GID: %s" +msgstr "GID ને બદલવામાં નિષ્ફળ: %s" + +#: ../src/daemon/main.c:252 +#, c-format +msgid "Failed to change UID: %s" +msgstr "UID ને બદલવામાં નિષ્ફળ: %s" + +#: ../src/daemon/main.c:271 +msgid "Successfully dropped root privileges." +msgstr "સફળતાપૂર્વક છોડી દીધેલ રુટ અધિકારો." + +#: ../src/daemon/main.c:279 +msgid "System wide mode unsupported on this platform." +msgstr "આ પ્લેટફોર્મ પર બિનઆધારભૂત સિસ્ટમ વિશાળ સ્થિતિ." + +#: ../src/daemon/main.c:297 +#, c-format +msgid "setrlimit(%s, (%u, %u)) failed: %s" +msgstr "setrlimit(%s, (%u, %u)) નિષ્ફળ: %s" + +#: ../src/daemon/main.c:474 +msgid "Failed to parse command line." +msgstr "આદેશ વાક્યને પદચ્છેદન કરવામાં નિષ્ફળ." + +#: ../src/daemon/main.c:541 +msgid "Daemon not running" +msgstr "ડિમન ચાલી રહ્યુ નથી" + +#: ../src/daemon/main.c:543 +#, c-format +msgid "Daemon running as PID %u" +msgstr "PID %u તરીકે ડિમન ચાલી રહ્યુ છે" + +#: ../src/daemon/main.c:553 +#, c-format +msgid "Failed to kill daemon: %s" +msgstr "ડિમનને મારવાનું નિષ્ફળ: %s" + +#: ../src/daemon/main.c:571 +msgid "" +"This program is not intended to be run as root (unless --system is " +"specified)." +msgstr "" +"આ પ્રક્રિયાને રુટ તરીકે ચલાવવા માટે વિચાર થયેલ નથી (નહિં તો --system એ સ્પષ્ટ થયેલ છે)." + +#: ../src/daemon/main.c:573 +msgid "Root privileges required." +msgstr "રુટ અધિકારો જરૂરી છે." + +#: ../src/daemon/main.c:578 +msgid "--start not supported for system instances." +msgstr "--start એ સિસ્ટમ ઉદાહરણો માટે આધારભૂત નથી." + +#: ../src/daemon/main.c:583 +msgid "Running in system mode, but --disallow-exit not set!" +msgstr "સિસ્ટમ સ્થિતિમાં ચાલી રહ્યુ છે, પરંતુ --disallow-exit સુયોજિત નથી!" + +#: ../src/daemon/main.c:586 +msgid "Running in system mode, but --disallow-module-loading not set!" +msgstr "સિસ્ટમ સ્થિતિમાં ચાલી રહ્યુ છે, પરંતુ --disallow-module-loading એ સુયોજિત નથી!" + +#: ../src/daemon/main.c:589 +msgid "Running in system mode, forcibly disabling SHM mode!" +msgstr "સિસ્ટમ સ્થિતિમાં ચાલી રહ્યુ છે, SHM સ્થિતિને દબાણપૂર્વક નિષ્ક્રિય કરી રહ્યા છે!" + +#: ../src/daemon/main.c:594 +msgid "Running in system mode, forcibly disabling exit idle time!" +msgstr "" +"સિસ્ટમ સ્થિતિમાં ચાલી રહ્યુ છે, બહાર નીકળવનાં નિષ્કાર્ય સમયને દબાણપૂર્વક નિષ્ક્રિય કરી " +"રહ્યા છે!" + +#: ../src/daemon/main.c:621 +msgid "Failed to acquire stdio." +msgstr "stdio ને મેળવવામાં નિષ્ફળ." + +#: ../src/daemon/main.c:627 +#, c-format +msgid "pipe failed: %s" +msgstr "પાઇપ નિષ્ફળ: %s" + +#: ../src/daemon/main.c:632 +#, c-format +msgid "fork() failed: %s" +msgstr "fork() નિષ્ફળ: %s" + +#: ../src/daemon/main.c:646 ../src/utils/pacat.c:508 +#, c-format +msgid "read() failed: %s" +msgstr "read() નિષ્ફળ: %s" + +#: ../src/daemon/main.c:652 +msgid "Daemon startup failed." +msgstr "ડિમન શરૂઆત નિષ્ફળ." + +#: ../src/daemon/main.c:654 +msgid "Daemon startup successful." +msgstr "ડિમન શરૂઆત કરવુ સફળ છે." + +#: ../src/daemon/main.c:731 +#, c-format +msgid "This is PulseAudio %s" +msgstr "આ PulseAudio %s છે" + +#: ../src/daemon/main.c:732 +#, c-format +msgid "Compilation host: %s" +msgstr "કમ્પાઇલેશન યજમાન: %s" + +#: ../src/daemon/main.c:733 +#, c-format +msgid "Compilation CFLAGS: %s" +msgstr "કમ્પાઇલેશન CFLAGS: %s" + +#: ../src/daemon/main.c:736 +#, c-format +msgid "Running on host: %s" +msgstr "યજમાન પર ચાલી રહ્યુ છે: %s" + +#: ../src/daemon/main.c:739 +#, c-format +msgid "Found %u CPUs." +msgstr "%u CPUs શોધાયુ." + +#: ../src/daemon/main.c:741 +#, c-format +msgid "Page size is %lu bytes" +msgstr "પાનાંનુ માપ %lu બાઇટો છે" + +#: ../src/daemon/main.c:744 +msgid "Compiled with Valgrind support: yes" +msgstr "Valgrind આધાર સાથે કમ્પાઇલ થયેલ છે: હા" + +#: ../src/daemon/main.c:746 +msgid "Compiled with Valgrind support: no" +msgstr "Valgrind આધાર સાથે કમ્પાઇલ થયેલ છે: ના" + +#: ../src/daemon/main.c:749 +#, c-format +msgid "Running in valgrind mode: %s" +msgstr "valgrind સ્થિતિમાં ચાલી રહ્યુ છે: %s" + +#: ../src/daemon/main.c:752 +msgid "Optimized build: yes" +msgstr "શ્રેષ્ટ થયેલ બિલ્ડ: હા" + +#: ../src/daemon/main.c:754 +msgid "Optimized build: no" +msgstr "શ્રેષ્ટ થયેલ બિલ્ડ: ના" + +#: ../src/daemon/main.c:758 +msgid "NDEBUG defined, all asserts disabled." +msgstr "NDEBUG વ્યાખ્યાયિત થયેલ છે, બધા હકો નિષ્ક્રિય થયેલ છે." + +#: ../src/daemon/main.c:760 +msgid "FASTPATH defined, only fast path asserts disabled." +msgstr "FASTPATH વ્યાખ્યાયિત થયેલ છે, ફક્ત ઝડપી પાથનાં હકો નિષ્ક્રિય થયેલ છે." + +#: ../src/daemon/main.c:762 +msgid "All asserts enabled." +msgstr "બધા હકો સક્રિય થયેલ છે." + +#: ../src/daemon/main.c:766 +msgid "Failed to get machine ID" +msgstr "મશીન ID ને મેળવવામાં નિષ્ફળ" + +#: ../src/daemon/main.c:769 +#, c-format +msgid "Machine ID is %s." +msgstr "મશીન ID %s છે." + +#: ../src/daemon/main.c:773 +#, c-format +msgid "Session ID is %s." +msgstr "સત્ર ID %s છે." + +#: ../src/daemon/main.c:779 +#, c-format +msgid "Using runtime directory %s." +msgstr "રનટાઇમ ડિરેક્ટરી %s ને વાપરી રહ્યા છે." + +#: ../src/daemon/main.c:784 +#, c-format +msgid "Using state directory %s." +msgstr "સ્થિતિ ડિરેક્ટરી %s ને વાપરી રહ્યા છે." + +#: ../src/daemon/main.c:787 +#, c-format +msgid "Using modules directory %s." +msgstr "ઇોડ્યુલોમ ડિરેક્ટરી %s ને વાપરી રહ્યા છે." + +#: ../src/daemon/main.c:789 +#, c-format +msgid "Running in system mode: %s" +msgstr "સિસ્ટમ સ્થિતિમાં ચાલી રહ્યુ છે: %s" + +#: ../src/daemon/main.c:792 +msgid "" +"OK, so you are running PA in system mode. Please note that you most likely " +"shouldn't be doing that.\n" +"If you do it nonetheless then it's your own fault if things don't work as " +"expected.\n" +"Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an " +"explanation why system mode is usually a bad idea." +msgstr "" +"બરાબર, તેથી તમે સિસ્ટમ સ્થિતિમાં PA ચલાવી રહ્યા છો. મહેરબાની કરીને નોંધો કે જે તમારે " +"મોટેભાગે કરવુ જોઇએ નહિં.\n" +"જો તમે તેનાં વગર કરે તો પછી તે તમારી ભૂલ થે જો ઇચ્છિત રીતે તે કામ કરતુ ન હોય તો.\n" +"શા માટે સિસ્ટમ સ્થિતિ સામાન્ય રીતે ખરાબ વિચાર છે તે માટે વિગતવાર જાણકારી માટે મહેરબાની " +"કરીને http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode આને વાંચો." + +#: ../src/daemon/main.c:809 +msgid "pa_pid_file_create() failed." +msgstr "pa_pid_file_create() નિષ્ફળ." + +#: ../src/daemon/main.c:819 +msgid "Fresh high-resolution timers available! Bon appetit!" +msgstr "તાજુ high-resolution ટાઇમરો ઉપલ્બધ છે! બોન એપેટાઇટ!" + +#: ../src/daemon/main.c:821 +msgid "" +"Dude, your kernel stinks! The chef's recommendation today is Linux with high-" +"resolution timers enabled!" +msgstr "" +"મિત્ર, તમારુ કર્નલમાં ગડબડ છે! રસોઇયાનું આજે ભલામણ એ સક્રિય થયેલ high-resolution " +"ટાઇમરો સાથે Linux નું છે!" + +#: ../src/daemon/main.c:844 +msgid "pa_core_new() failed." +msgstr "pa_core_new() નિષ્ફળ." + +#: ../src/daemon/main.c:904 +msgid "Failed to initialize daemon." +msgstr "ડિમનને શરૂ કરવામાં નિષ્ફળ." + +#: ../src/daemon/main.c:909 +msgid "Daemon startup without any loaded modules, refusing to work." +msgstr "કોઇપણ લોડ થયેલ મોડ્યુલો વગર ડિમનને શરૂ કરો, કામ કરવા માટે ફરી શરૂ કરી રહ્યા છે." + +#: ../src/daemon/main.c:926 +msgid "Daemon startup complete." +msgstr "ડિમન પારંભ કરવાનું સમાપ્ત છે." + +#: ../src/daemon/main.c:932 +msgid "Daemon shutdown initiated." +msgstr "ડિમનને બંધ કરવાનું પ્રારંભ થયેલ છે." + +#: ../src/daemon/main.c:954 +msgid "Daemon terminated." +msgstr "ડિમનનો અંત આવેલ છે." + +#: ../src/daemon/cmdline.c:115 +#, c-format +msgid "" +"%s [options]\n" +"\n" +"COMMANDS:\n" +" -h, --help Show this help\n" +" --version Show version\n" +" --dump-conf Dump default configuration\n" +" --dump-modules Dump list of available modules\n" +" --dump-resample-methods Dump available resample methods\n" +" --cleanup-shm Cleanup stale shared memory " +"segments\n" +" --start Start the daemon if it is not " +"running\n" +" -k --kill Kill a running daemon\n" +" --check Check for a running daemon (only " +"returns exit code)\n" +"\n" +"OPTIONS:\n" +" --system[=BOOL] Run as system-wide instance\n" +" -D, --daemonize[=BOOL] Daemonize after startup\n" +" --fail[=BOOL] Quit when startup fails\n" +" --high-priority[=BOOL] Try to set high nice level\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_NICE)\n" +" --realtime[=BOOL] Try to enable realtime scheduling\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_RTPRIO)\n" +" --disallow-module-loading[=BOOL] Disallow module user requested " +"module\n" +" loading/unloading after startup\n" +" --disallow-exit[=BOOL] Disallow user requested exit\n" +" --exit-idle-time=SECS Terminate the daemon when idle and " +"this\n" +" time passed\n" +" --module-idle-time=SECS Unload autoloaded modules when idle " +"and\n" +" this time passed\n" +" --scache-idle-time=SECS Unload autoloaded samples when idle " +"and\n" +" this time passed\n" +" --log-level[=LEVEL] Increase or set verbosity level\n" +" -v Increase the verbosity level\n" +" --log-target={auto,syslog,stderr} Specify the log target\n" +" --log-meta[=BOOL] Include code location in log " +"messages\n" +" --log-time[=BOOL] Include timestamps in log messages\n" +" --log-backtrace=FRAMES Include a backtrace in log messages\n" +" -p, --dl-search-path=PATH Set the search path for dynamic " +"shared\n" +" objects (plugins)\n" +" --resample-method=METHOD Use the specified resampling method\n" +" (See --dump-resample-methods for\n" +" possible values)\n" +" --use-pid-file[=BOOL] Create a PID file\n" +" --no-cpu-limit[=BOOL] Do not install CPU load limiter on\n" +" platforms that support it.\n" +" --disable-shm[=BOOL] Disable shared memory support.\n" +"\n" +"STARTUP SCRIPT:\n" +" -L, --load=\"MODULE ARGUMENTS\" Load the specified plugin module " +"with\n" +" the specified argument\n" +" -F, --file=FILENAME Run the specified script\n" +" -C Open a command line on the running " +"TTY\n" +" after startup\n" +"\n" +" -n Don't load default script file\n" +msgstr "" +"%s [options]\n" +"\n" +"COMMANDS:\n" +" -h, --help આ મદદ બતાવો\n" +" --version આવૃત્તિ બતાવો\n" +" --dump-conf મૂળભૂત રૂપરેખાંકનને ડમ્પ કરો\n" +" --dump-modules ઉપલ્બધ મોડ્યુલોની યાદીને ડમ્પ કરો\n" +" --dump-resample-methods ઉપલ્બધ resample પદ્દતિઓને ડમ્પ કરો\n" +" --cleanup-shm વાપરેલ વહેંચાયેલ મેમરી સેગમેન્ટોને સાફ કરો\n" +" --start ડિમન ને શરૂ કરો જો તે ચાલી રહ્યુ ન હોય " +"તો\n" +" -k --kill ચાલી રહેલ ડિમનને મારો\n" +" --check ચાલતી ડિમન માટે ચકાસો (ફક્ત નીકાળેલ કોડ " +"પાછો મળે છે)\n" +"\n" +"OPTIONS:\n" +" --system[=BOOL] system-wide નમૂના તરીકે ચલાવો\n" +" -D, --daemonize[=BOOL] શરૂઆત પછી Daemonize\n" +" --fail[=BOOL] બહાર નીકળો જ્યારે શરૂઆત જ નિષ્ફળ થાય\n" +" --high-priority[=BOOL] ઊંચા સરસ સ્તરને સુયોજિત કરવાનો પ્રયત્ન " +"કરો\n" +" (ફક્ત રુટ તરીકે, જ્યારે SUID અથવા\n" +" ઉચ્ચસ્તર થયેલ RLIMIT_NICE સાથે)\n" +" --realtime[=BOOL] રીઅલટાઇમ ગોઠવવાનું સક્રિય કરવા માટે " +"પ્રયત્ન કરો\n" +" (ફક્ત રુટ તરીકે ઉપલ્બધ, જ્યારે SUID અથવા\n" +" ઉચ્ચસ્તર થયેલ RLIMIT_RTPRIO સાથે)\n" +" --disallow-module-loading[=BOOL] સૂચિત મોડ્યુલ લોડીંગ/અનલોડીંગ ને શરૂઆત પછી\n" +" મોડ્યુલ વપરાશકર્તાને પરવાનગી ન આપો\n" +" --disallow-exit[=BOOL] સૂચિત બહાર નીકળવા વપરાશકર્તાને પરવાનગી " +"ન આપો\n" +" --exit-idle-time=SECS ડિમનને બહાર કાઢો જ્યારે નિષ્ક્રિય હોય અને " +"આ\n" +" સમય સમાપ્ત થયેલ હોય તો\n" +" --module-idle-time=SECS આપમેળે લોડ થયેલ મોડ્યુલોને લોડ ન કરો જ્યારે " +"તે નિષ્ક્રિય હોય અને\n" +" આ સમય પસાર થયેલ હોય\n" +" --scache-idle-time=SECS આપમેળે લોડ થયેલ નમૂનાઓનો લોડ ન કરો જ્યારે " +"નિષ્ક્રિય હોય અને\n" +" આ સમય પસાર થયેલ હોય\n" +" --log-level[=LEVEL] વધારો અથવા વર્બોસીટી સ્તરને સુયોજિત કરો\n" +" -v વર્બોસીટી સ્તરને વધારો\n" +" --log-target={auto,syslog,stderr} લોગ લક્ષ્યને સ્પષ્ટ કરો\n" +" --log-meta[=BOOL] સંદેશાઓમાં કોડ સ્થાનને સમાવો\n" +" --log-time[=BOOL] લોગ સંદેશાઓમાં ટાઇમસ્ટેમ્પોને સમાવો\n" +" --log-backtrace=FRAMES લોગ સંદેશાઓમાં backtrace ને સમાવો\n" +" -p, --dl-search-path=PATH ડાયનેમિક વહેંચાયેલ માટે શોધ પાથને સુયોજિત " +"કરો\n" +" objects (plugins)\n" +" --resample-method=METHOD સ્પષ્ટ થયેલ resampling પદ્દતિને વાપરો\n" +" (શક્ય કિંમતો માટે --dump-resample-" +"methods\n" +" ને જુઓ)\n" +" --use-pid-file[=BOOL] PID ફાઇલને બનાવો\n" +" --no-cpu-limit[=BOOL] પ્લેટફોર્મો પર CPU લોડ મર્યાદા રાખનારને " +"સ્થાપિત ન કરો\n" +" કે જે તેને આધાર આપે છે.\n" +" --disable-shm[=BOOL] વહેંચાયેલ મેમરી આધારને નિષ્ક્રિય કરો.\n" +"\n" +"STARTUP SCRIPT:\n" +" -L, --load=\"MODULE ARGUMENTS\" સ્પષ્ટ થયેલ દલીલ સાથે સ્પષ્ટ થયેલ પલ્ગઇન " +"મોડ્યુલને લોડ\n" +" કરો\n" +" -F, --file=FILENAME સ્પષ્ટ થયેલ સ્ક્રિપ્ટને ચલાવો\n" +" -C શરૂઆત પછી TTY ચલાવવા પર આદેશ વાક્યને\n" +" ખોલો\n" +"\n" +" -n મૂળભૂત સ્ક્રિપ્ટ ફાઇલને લોડ કરો નહિં\n" + +#: ../src/daemon/cmdline.c:247 +msgid "--daemonize expects boolean argument" +msgstr "--daemonize એ બુલિયન દલીલની ઇચ્છા રાખે છે" + +#: ../src/daemon/cmdline.c:254 +msgid "--fail expects boolean argument" +msgstr "--fail એ બુલિયન દલીલની ઇચ્છા રાખે છે" + +#: ../src/daemon/cmdline.c:264 +msgid "" +"--log-level expects log level argument (either numeric in range 0..4 or one " +"of debug, info, notice, warn, error)." +msgstr "" +"--log-level એ લોગ સ્તર દલીલની ઇચ્છા રાખે છે (ક્યાંતો સીમા 0..4 માં પૂર્ણસંખ્યા છે અથવા " +"ડિબગ, જાણકારી, સૂચના, ચેતવણી, ભૂલ નું એક)." + +#: ../src/daemon/cmdline.c:276 +msgid "--high-priority expects boolean argument" +msgstr "--high-priority એ બુલિયન દલીલની ઇચ્છા રાખે છે" + +#: ../src/daemon/cmdline.c:283 +msgid "--realtime expects boolean argument" +msgstr "--realtime એ બુલિયન દલીલની ઇચ્છા રાખે છે" + +#: ../src/daemon/cmdline.c:290 +msgid "--disallow-module-loading expects boolean argument" +msgstr "--disallow-module-loading એ બુલિયન દલીલની ઇચ્છા રાખે છે" + +#: ../src/daemon/cmdline.c:297 +msgid "--disallow-exit expects boolean argument" +msgstr "--disallow-exit એ બુલિયન દલીલની ઇચ્છા રાખે છે" + +#: ../src/daemon/cmdline.c:304 +msgid "--use-pid-file expects boolean argument" +msgstr "--use-pid-file એ બુલિયન દલીલની ઇચ્છા રાખે છે" + +#: ../src/daemon/cmdline.c:321 +msgid "Invalid log target: use either 'syslog', 'stderr' or 'auto'." +msgstr "અયોગ્ય લોગ લક્ષ્ય: ક્યાંતો 'syslog', 'stderr' અથવા 'auto' ને વાપરો." + +#: ../src/daemon/cmdline.c:328 +msgid "--log-time expects boolean argument" +msgstr "--log-time એ બુલિયન દલીલની ઇચ્છા રાખે છે" + +#: ../src/daemon/cmdline.c:335 +msgid "--log-meta expects boolean argument" +msgstr "--log-meta એ બુલિયન દલીલની ઇચ્છા રાખે છે" + +#: ../src/daemon/cmdline.c:354 +#, c-format +msgid "Invalid resample method '%s'." +msgstr "અયોગ્ય resample પદ્દતિ '%s'." + +#: ../src/daemon/cmdline.c:361 +msgid "--system expects boolean argument" +msgstr "--system એ બુલિયન દલીલની ઇચ્છા રાખે છે" + +#: ../src/daemon/cmdline.c:368 +msgid "--no-cpu-limit expects boolean argument" +msgstr "--no-cpu-limit એ બુલિયન દલીલની ઇચ્છા રાખે છે" + +#: ../src/daemon/cmdline.c:375 +msgid "--disable-shm expects boolean argument" +msgstr "--disable-shm એ બુલિયન દલીલની ઇચ્છા રાખે છે" + +#: ../src/daemon/dumpmodules.c:60 +#, c-format +msgid "Name: %s\n" +msgstr "નામ: %s\n" + +#: ../src/daemon/dumpmodules.c:63 +#, c-format +msgid "No module information available\n" +msgstr "મોડ્યુલ જાણકારી ઉપલ્બધ નથી\n" + +#: ../src/daemon/dumpmodules.c:66 +#, c-format +msgid "Version: %s\n" +msgstr "આવૃત્તિ: %s\n" + +#: ../src/daemon/dumpmodules.c:68 +#, c-format +msgid "Description: %s\n" +msgstr "વર્ણન: %s\n" + +#: ../src/daemon/dumpmodules.c:70 +#, c-format +msgid "Author: %s\n" +msgstr "લેખક: %s\n" + +#: ../src/daemon/dumpmodules.c:72 +#, c-format +msgid "Usage: %s\n" +msgstr "વપરાશ: %s\n" + +#: ../src/daemon/dumpmodules.c:73 +#, c-format +msgid "Load Once: %s\n" +msgstr "એકવાર લોડ કરો: %s\n" + +#: ../src/daemon/dumpmodules.c:75 +#, c-format +msgid "DEPRECATION WARNING: %s\n" +msgstr "DEPRECATION WARNING: %s\n" + +#: ../src/daemon/dumpmodules.c:79 +#, c-format +msgid "Path: %s\n" +msgstr "પાથ: %s\n" + +#: ../src/daemon/daemon-conf.c:232 +#, c-format +msgid "[%s:%u] Invalid log target '%s'." +msgstr "[%s:%u] અયોગ્ય લોગ લક્ષ્ય '%s'." + +#: ../src/daemon/daemon-conf.c:248 +#, c-format +msgid "[%s:%u] Invalid log level '%s'." +msgstr "[%s:%u] અયોગ્ય લોગ સ્તર '%s'." + +#: ../src/daemon/daemon-conf.c:264 +#, c-format +msgid "[%s:%u] Invalid resample method '%s'." +msgstr "[%s:%u] અયોગ્ય resample પદ્દતિ '%s'." + +#: ../src/daemon/daemon-conf.c:287 +#, c-format +msgid "[%s:%u] Invalid rlimit '%s'." +msgstr "[%s:%u] અયોગ્ય rlimit '%s'." + +#: ../src/daemon/daemon-conf.c:294 +#, c-format +msgid "[%s:%u] rlimit not supported on this platform." +msgstr "[%s:%u] rlimit એ આ પ્લેટફોર્મ પર આધારભૂત નથી." + +#: ../src/daemon/daemon-conf.c:310 +#, c-format +msgid "[%s:%u] Invalid sample format '%s'." +msgstr "[%s:%u] અયોગ્ય નમૂના બંધારણ '%s'." + +#: ../src/daemon/daemon-conf.c:328 +#, c-format +msgid "[%s:%u] Invalid sample rate '%s'." +msgstr "[%s:%u] અયોગ્ય નમૂના દર '%s'." + +#: ../src/daemon/daemon-conf.c:352 +#, c-format +msgid "[%s:%u] Invalid sample channels '%s'." +msgstr "[%s:%u] અયોગ્ય નમૂના ચેનલો '%s'." + +#: ../src/daemon/daemon-conf.c:370 +#, c-format +msgid "[%s:%u] Invalid channel map '%s'." +msgstr "[%s:%u] અયોગ્ય ચેનલ મેપ '%s'." + +#: ../src/daemon/daemon-conf.c:388 +#, c-format +msgid "[%s:%u] Invalid number of fragments '%s'." +msgstr "[%s:%u] અયોગ્ય ફ્રેગમેન્ટોનાં નંબર '%s'." + +#: ../src/daemon/daemon-conf.c:406 +#, c-format +msgid "[%s:%u] Invalid fragment size '%s'." +msgstr "[%s:%u] અયોગ્ય ફ્રેગમેન્ટ માપ '%s'." + +#: ../src/daemon/daemon-conf.c:424 +#, c-format +msgid "[%s:%u] Invalid nice level '%s'." +msgstr "[%s:%u] અયોગ્ય સારુ સ્તર '%s'." + +#: ../src/daemon/daemon-conf.c:546 +#, c-format +msgid "Failed to open configuration file: %s" +msgstr "રૂપરેખાંકન ફાઇલને ખોલવાનું નિષ્ફળ: %s" + +#: ../src/daemon/daemon-conf.c:562 +msgid "" +"The specified default channel map has a different number of channels than " +"the specified default number of channels." +msgstr "" +"સ્પષ્ટ થયેલ મૂળભૂત ચેનલ મેપ પાસે સ્પષ્ટ થયેલ ચેનલોની મૂળભૂત સંખ્યા કરતા વિવિધ ચેનલોની સંખ્યા છે." + +#: ../src/daemon/daemon-conf.c:638 +#, c-format +msgid "### Read from configuration file: %s ###\n" +msgstr "### રૂપરેખાંકન ફાઇલમાંથી વાંચો: %s ###\n" + +#: ../src/daemon/caps.c:62 +msgid "Cleaning up privileges." +msgstr "અધિકારોને છોડી રહ્યા છે." + +#: ../src/daemon/pulseaudio.desktop.in.h:1 +msgid "PulseAudio Sound System" +msgstr "PulseAudio સાઉન્ડ સિસ્ટમ" + +#: ../src/daemon/pulseaudio.desktop.in.h:2 +msgid "Start the PulseAudio Sound System" +msgstr "PulseAudio સાઉન્ડ સિસ્ટમને શરૂ કરો" + +#: ../src/pulse/channelmap.c:105 ../src/pulse/channelmap.c:757 +msgid "Mono" +msgstr "મોનો" + +#: ../src/pulse/channelmap.c:107 +msgid "Front Center" +msgstr "આગળનું કેન્દ્ર" + +#: ../src/pulse/channelmap.c:108 +msgid "Front Left" +msgstr "આગળ ડાબે" + +#: ../src/pulse/channelmap.c:109 +msgid "Front Right" +msgstr "આગળ જમણે" + +#: ../src/pulse/channelmap.c:111 +msgid "Rear Center" +msgstr "રિઅર કેન્દ્ર" + +#: ../src/pulse/channelmap.c:112 +msgid "Rear Left" +msgstr "રિઅર ડાબે" + +#: ../src/pulse/channelmap.c:113 +msgid "Rear Right" +msgstr "રિઅર જમણે" + +#: ../src/pulse/channelmap.c:115 +msgid "Low Frequency Emmiter" +msgstr "Low Frequency Emmiter" + +#: ../src/pulse/channelmap.c:117 +msgid "Front Left-of-center" +msgstr "આગળ કેન્દ્રની ડાબે" + +#: ../src/pulse/channelmap.c:118 +msgid "Front Right-of-center" +msgstr "આગળ કેન્દ્રની જમણે" + +#: ../src/pulse/channelmap.c:120 +msgid "Side Left" +msgstr "ડાબી બાજુ" + +#: ../src/pulse/channelmap.c:121 +msgid "Side Right" +msgstr "જમણી બાજુ" + +#: ../src/pulse/channelmap.c:123 +msgid "Auxiliary 0" +msgstr "ઑગ્ઝિલિઅરિ 0" + +#: ../src/pulse/channelmap.c:124 +msgid "Auxiliary 1" +msgstr "ઑગ્ઝિલિઅરિ 1" + +#: ../src/pulse/channelmap.c:125 +msgid "Auxiliary 2" +msgstr "ઑગ્ઝિલિઅરિ 2" + +#: ../src/pulse/channelmap.c:126 +msgid "Auxiliary 3" +msgstr "ઑગ્ઝિલિઅરિ 3" + +#: ../src/pulse/channelmap.c:127 +msgid "Auxiliary 4" +msgstr "ઑગ્ઝિલિઅરિ 4" + +#: ../src/pulse/channelmap.c:128 +msgid "Auxiliary 5" +msgstr "ઑગ્ઝિલિઅરિ 5" + +#: ../src/pulse/channelmap.c:129 +msgid "Auxiliary 6" +msgstr "ઑગ્ઝિલિઅરિ 6" + +#: ../src/pulse/channelmap.c:130 +msgid "Auxiliary 7" +msgstr "ઑગ્ઝિલિઅરિ 7" + +#: ../src/pulse/channelmap.c:131 +msgid "Auxiliary 8" +msgstr "ઑગ્ઝિલિઅરિ 8" + +#: ../src/pulse/channelmap.c:132 +msgid "Auxiliary 9" +msgstr "ઑગ્ઝિલિઅરિ 9" + +#: ../src/pulse/channelmap.c:133 +msgid "Auxiliary 10" +msgstr "ઑગ્ઝિલિઅરિ 10" + +#: ../src/pulse/channelmap.c:134 +msgid "Auxiliary 11" +msgstr "ઑગ્ઝિલિઅરિ 11" + +#: ../src/pulse/channelmap.c:135 +msgid "Auxiliary 12" +msgstr "ઑગ્ઝિલિઅરિ 12" + +#: ../src/pulse/channelmap.c:136 +msgid "Auxiliary 13" +msgstr "ઑગ્ઝિલિઅરિ 13" + +#: ../src/pulse/channelmap.c:137 +msgid "Auxiliary 14" +msgstr "ઑગ્ઝિલિઅરિ 14" + +#: ../src/pulse/channelmap.c:138 +msgid "Auxiliary 15" +msgstr "ઑગ્ઝિલિઅરિ 15" + +#: ../src/pulse/channelmap.c:139 +msgid "Auxiliary 16" +msgstr "ઑગ્ઝિલિઅરિ 16" + +#: ../src/pulse/channelmap.c:140 +msgid "Auxiliary 17" +msgstr "ઑગ્ઝિલિઅરિ 17" + +#: ../src/pulse/channelmap.c:141 +msgid "Auxiliary 18" +msgstr "ઑગ્ઝિલિઅરિ 18" + +#: ../src/pulse/channelmap.c:142 +msgid "Auxiliary 19" +msgstr "ઑગ્ઝિલિઅરિ 19" + +#: ../src/pulse/channelmap.c:143 +msgid "Auxiliary 20" +msgstr "ઑગ્ઝિલિઅરિ 20" + +#: ../src/pulse/channelmap.c:144 +msgid "Auxiliary 21" +msgstr "ઑગ્ઝિલિઅરિ 21" + +#: ../src/pulse/channelmap.c:145 +msgid "Auxiliary 22" +msgstr "ઑગ્ઝિલિઅરિ 22" + +#: ../src/pulse/channelmap.c:146 +msgid "Auxiliary 23" +msgstr "ઑગ્ઝિલિઅરિ 23" + +#: ../src/pulse/channelmap.c:147 +msgid "Auxiliary 24" +msgstr "ઑગ્ઝિલિઅરિ 24" + +#: ../src/pulse/channelmap.c:148 +msgid "Auxiliary 25" +msgstr "ઑગ્ઝિલિઅરિ 25" + +#: ../src/pulse/channelmap.c:149 +msgid "Auxiliary 26" +msgstr "ઑગ્ઝિલિઅરિ 26" + +#: ../src/pulse/channelmap.c:150 +msgid "Auxiliary 27" +msgstr "ઑગ્ઝિલિઅરિ 27" + +#: ../src/pulse/channelmap.c:151 +msgid "Auxiliary 28" +msgstr "ઑગ્ઝિલિઅરિ 28" + +#: ../src/pulse/channelmap.c:152 +msgid "Auxiliary 29" +msgstr "ઑગ્ઝિલિઅરિ 29" + +#: ../src/pulse/channelmap.c:153 +msgid "Auxiliary 30" +msgstr "ઑગ્ઝિલિઅરિ 30" + +#: ../src/pulse/channelmap.c:154 +msgid "Auxiliary 31" +msgstr "ઑગ્ઝિલિઅરિ 31" + +#: ../src/pulse/channelmap.c:156 +msgid "Top Center" +msgstr "ઊંચે કેન્દ્ર" + +#: ../src/pulse/channelmap.c:158 +msgid "Top Front Center" +msgstr "ઊંચે આગળ કેન્દ્ર" + +#: ../src/pulse/channelmap.c:159 +msgid "Top Front Left" +msgstr "ઊંચે આગળ ડાબે" + +#: ../src/pulse/channelmap.c:160 +msgid "Top Front Right" +msgstr "ઊંચે આગળ જમણે" + +#: ../src/pulse/channelmap.c:162 +msgid "Top Rear Center" +msgstr "ઊંચે રિઅર કેન્દ્ર" + +#: ../src/pulse/channelmap.c:163 +msgid "Top Rear Left" +msgstr "ઉપર રિઅર ડાબે" + +#: ../src/pulse/channelmap.c:164 +msgid "Top Rear Right" +msgstr "ઉપર રિઅર જમણે" + +#: ../src/pulse/channelmap.c:484 ../src/pulse/sample.c:170 +#: ../src/pulse/volume.c:295 ../src/pulse/volume.c:321 +#: ../src/pulse/volume.c:341 ../src/pulse/volume.c:371 +msgid "(invalid)" +msgstr "(અયોગ્ય)" + +#: ../src/pulse/channelmap.c:761 +msgid "Stereo" +msgstr "સ્ટેરિઓ" + +#: ../src/pulse/channelmap.c:766 +msgid "Surround 4.0" +msgstr "સરાઉન્ડ 4.0" + +#: ../src/pulse/channelmap.c:772 +msgid "Surround 4.1" +msgstr "સરાઉન્ડ 4.1" + +#: ../src/pulse/channelmap.c:778 +msgid "Surround 5.0" +msgstr "સરાઉન્ડ 5.0" + +#: ../src/pulse/channelmap.c:784 +msgid "Surround 5.1" +msgstr "સરાઉન્ડ 5.1" + +#: ../src/pulse/channelmap.c:791 +msgid "Surround 7.1" +msgstr "સરાઉન્ડ 7.1" + +#: ../src/pulse/error.c:43 +msgid "OK" +msgstr "બરાબર" + +#: ../src/pulse/error.c:44 +msgid "Access denied" +msgstr "પ્રવેશનો સ્વીકાર કરેલ નથી" + +#: ../src/pulse/error.c:45 +msgid "Unknown command" +msgstr "અજ્ઞાત આદેશ" + +#: ../src/pulse/error.c:46 +msgid "Invalid argument" +msgstr "અયોગ્ય દલીલ" + +#: ../src/pulse/error.c:47 +msgid "Entity exists" +msgstr "વસ્તુ અસ્તિત્વ ધરાવે છે" + +#: ../src/pulse/error.c:48 +msgid "No such entity" +msgstr "આવી વસ્તુ નથી" + +#: ../src/pulse/error.c:49 +msgid "Connection refused" +msgstr "જોડાણને માન્ય ન કરવુ" + +#: ../src/pulse/error.c:50 +msgid "Protocol error" +msgstr "પ્રોટોકોલ ભૂલ" + +#: ../src/pulse/error.c:51 +msgid "Timeout" +msgstr "સમય સમાપ્ત" + +#: ../src/pulse/error.c:52 +msgid "No authorization key" +msgstr "સત્તાધિકરણ કી નથી" + +#: ../src/pulse/error.c:53 +msgid "Internal error" +msgstr "આંતરિક ભૂલ" + +#: ../src/pulse/error.c:54 +msgid "Connection terminated" +msgstr "જોડાણનો અંત થયેલ છે" + +#: ../src/pulse/error.c:55 +msgid "Entity killed" +msgstr "વસ્તુને મારી નંખાયેલ છે" + +#: ../src/pulse/error.c:56 +msgid "Invalid server" +msgstr "અયોગ્ય સર્વર" + +#: ../src/pulse/error.c:57 +msgid "Module initalization failed" +msgstr "મોડ્યુલ શરૂઆત કરવાનું નિષ્ફળ" + +#: ../src/pulse/error.c:58 +msgid "Bad state" +msgstr "ખરાબ સ્થિતિ" + +#: ../src/pulse/error.c:59 +msgid "No data" +msgstr "માહિતી નથી" + +#: ../src/pulse/error.c:60 +msgid "Incompatible protocol version" +msgstr "અસુસંગત પ્રોટોકોલ આવૃત્તિ" + +#: ../src/pulse/error.c:61 +msgid "Too large" +msgstr "ઘણું લાંબુ છે" + +#: ../src/pulse/error.c:62 +msgid "Not supported" +msgstr "આધારભૂત નથી" + +#: ../src/pulse/error.c:63 +msgid "Unknown error code" +msgstr "અજ્ઞાત ભૂલ કોડ" + +#: ../src/pulse/error.c:64 +msgid "No such extension" +msgstr "આવુ એક્સટેન્શન નથી" + +#: ../src/pulse/error.c:65 +msgid "Obsolete functionality" +msgstr "અપ્રચલિત કાર્યત્મકતા" + +#: ../src/pulse/error.c:66 +msgid "Missing implementation" +msgstr "ગુમ થયેલ અમલીકરણ" + +#: ../src/pulse/error.c:67 +msgid "Client forked" +msgstr "ક્લાઇન્ટમાં ફાટા પડેલ છે" + +#: ../src/pulse/error.c:68 +msgid "Input/Output error" +msgstr "ઇનપુટ/આઉટપુટ ભૂલ" + +#: ../src/pulse/error.c:69 +msgid "Device or resource busy" +msgstr "ઉપકરણ અથવા સ્ત્રોત વ્યસ્ત" + +#: ../src/pulse/sample.c:172 +#, c-format +msgid "%s %uch %uHz" +msgstr "%s %uch %uHz" + +#: ../src/pulse/sample.c:184 +#, c-format +msgid "%0.1f GiB" +msgstr "%0.1f GiB" + +#: ../src/pulse/sample.c:186 +#, c-format +msgid "%0.1f MiB" +msgstr "%0.1f MiB" + +#: ../src/pulse/sample.c:188 +#, c-format +msgid "%0.1f KiB" +msgstr "%0.1f KiB" + +#: ../src/pulse/sample.c:190 +#, c-format +msgid "%u B" +msgstr "%u B" + +#: ../src/pulse/client-conf-x11.c:55 ../src/utils/pax11publish.c:100 +msgid "XOpenDisplay() failed" +msgstr "XOpenDisplay() નિષ્ફળ" + +#: ../src/pulse/client-conf-x11.c:93 +msgid "Failed to parse cookie data" +msgstr "કુકીની માહિતીને પદચ્છેદન કરવામાં નિષ્ફળ" + +#: ../src/pulse/client-conf.c:111 +#, c-format +msgid "Failed to open configuration file '%s': %s" +msgstr "રૂપરેખાંકન ફાઇલ '%s' ને ખોલવામાં નિષ્ફળ: %s" + +#: ../src/pulse/context.c:550 +msgid "No cookie loaded. Attempting to connect without." +msgstr "કુકી લોડ થયેલ નથી. તેનાં વગર જોડવાનો પ્રયત્ન કરી રહ્યા છે." + +#: ../src/pulse/context.c:693 +#, c-format +msgid "fork(): %s" +msgstr "fork(): %s" + +#: ../src/pulse/context.c:748 +#, c-format +msgid "waitpid(): %s" +msgstr "waitpid(): %s" + +#: ../src/pulse/context.c:1438 +#, c-format +msgid "Received message for unknown extension '%s'" +msgstr "અજ્ઞાત એક્સટેન્શન '%s' માટે મળેલ સંદેશ" + +#: ../src/utils/pacat.c:108 +#, c-format +msgid "Failed to drain stream: %s" +msgstr "સ્ટ્રીમને નિકાલ કરવામાં નિષ્ફળ: %s" + +#: ../src/utils/pacat.c:113 +msgid "Playback stream drained." +msgstr "પ્લેબેક સ્ટ્રીમ ને નિકાલ કરેલ છે." + +#: ../src/utils/pacat.c:123 +msgid "Draining connection to server." +msgstr "સર્વરમાં જોડાણને નિકાલ કરી રહ્યા છે." + +#: ../src/utils/pacat.c:136 +#, c-format +msgid "pa_stream_drain(): %s" +msgstr "pa_stream_drain(): %s" + +#: ../src/utils/pacat.c:159 +#, c-format +msgid "pa_stream_write() failed: %s" +msgstr "pa_stream_write() નિષ્ફળ: %s" + +#: ../src/utils/pacat.c:197 +#, c-format +msgid "pa_stream_begin_write() failed: %s" +msgstr "pa_stream_begin_write() નિષ્ફળ: %s" + +#: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267 +#, c-format +msgid "pa_stream_peek() failed: %s" +msgstr "pa_stream_peek() નિષ્ફળ: %s" + +#: ../src/utils/pacat.c:307 +msgid "Stream successfully created." +msgstr "સ્ટ્રીમ સફળતાપૂર્વક બનાવેલ છે." + +#: ../src/utils/pacat.c:310 +#, c-format +msgid "pa_stream_get_buffer_attr() failed: %s" +msgstr "pa_stream_get_buffer_attr() નિષ્ફળ: %s" + +#: ../src/utils/pacat.c:314 +#, c-format +msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u" +msgstr "બફર મેટ્રિક્સ: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u" + +#: ../src/utils/pacat.c:317 +#, c-format +msgid "Buffer metrics: maxlength=%u, fragsize=%u" +msgstr "બફર મેટ્રિક્સ: maxlength=%u, fragsize=%u" + +#: ../src/utils/pacat.c:321 +#, c-format +msgid "Using sample spec '%s', channel map '%s'." +msgstr "નમૂનો spec '%s' ને વાપરી રહ્યા છે, ચેનલ મેપ '%s'." + +#: ../src/utils/pacat.c:325 +#, c-format +msgid "Connected to device %s (%u, %ssuspended)." +msgstr "ઉપકરણ %s (%u, %ssuspended) સાથે જોડાયેલ છે." + +#: ../src/utils/pacat.c:335 +#, c-format +msgid "Stream error: %s" +msgstr "સ્ટ્રીમ ભૂલ: %s" + +#: ../src/utils/pacat.c:345 +#, c-format +msgid "Stream device suspended.%s" +msgstr "સ્ટ્રીમ ઉપકરણ ને થોડા સમય માટે બંધ રાખેલ છે.%s" + +#: ../src/utils/pacat.c:347 +#, c-format +msgid "Stream device resumed.%s" +msgstr "સ્ટ્રીમ ઉપકરણને ફરી શરૂ કરેલ છે.%s" + +#: ../src/utils/pacat.c:355 +#, c-format +msgid "Stream underrun.%s" +msgstr "સ્ટ્રીમ ચલાવવા હેઠળ છે.%s" + +#: ../src/utils/pacat.c:362 +#, c-format +msgid "Stream overrun.%s" +msgstr "સ્ટ્રીમ ઉપર ચાલે છે.%s" + +#: ../src/utils/pacat.c:369 +#, c-format +msgid "Stream started.%s" +msgstr "સ્ટ્રીમ શરૂ થયેલ છે.%s" + +#: ../src/utils/pacat.c:376 +#, c-format +msgid "Stream moved to device %s (%u, %ssuspended).%s" +msgstr "સ્ટ્રીમ એ ઉપકરણ %s (%u, %ssuspended) માં ખસેડેલ છે.%s" + +#: ../src/utils/pacat.c:376 +msgid "not " +msgstr "નથી " + +#: ../src/utils/pacat.c:383 +#, c-format +msgid "Stream buffer attributes changed.%s" +msgstr "સ્ટ્રીમ બફર ગુણધર્મો બદલાયેલ છે.%s" + +#: ../src/utils/pacat.c:415 +#, c-format +msgid "Connection established.%s" +msgstr "જોડાણ સ્થાપિત થયેલ છે.%s" + +#: ../src/utils/pacat.c:418 +#, c-format +msgid "pa_stream_new() failed: %s" +msgstr "pa_stream_new() નિષ્ફળ: %s" + +#: ../src/utils/pacat.c:450 +#, c-format +msgid "pa_stream_connect_playback() failed: %s" +msgstr "pa_stream_connect_playback() નિષ્ફળ: %s" + +#: ../src/utils/pacat.c:456 +#, c-format +msgid "pa_stream_connect_record() failed: %s" +msgstr "pa_stream_connect_record() નિષ્ફળ: %s" + +#: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857 +#, c-format +msgid "Connection failure: %s" +msgstr "જોડાણ નિષ્ફળ: %s" + +#: ../src/utils/pacat.c:503 +msgid "Got EOF." +msgstr "EOF મળ્યુ." + +#: ../src/utils/pacat.c:540 +#, c-format +msgid "write() failed: %s" +msgstr "write() નિષ્ફળ: %s" + +#: ../src/utils/pacat.c:561 +msgid "Got signal, exiting." +msgstr "સંકેત મળ્યું, બહાર નીકળી રહ્યા છે." + +#: ../src/utils/pacat.c:575 +#, c-format +msgid "Failed to get latency: %s" +msgstr "ગુપ્તતા મેળવવામાં નિષ્ફળતા: %s" + +#: ../src/utils/pacat.c:580 +#, c-format +msgid "Time: %0.3f sec; Latency: %0.0f usec." +msgstr "Time: %0.3f sec; Latency: %0.0f usec." + +#: ../src/utils/pacat.c:599 +#, c-format +msgid "pa_stream_update_timing_info() failed: %s" +msgstr "pa_stream_update_timing_info() નિષ્ફળ: %s" + +#: ../src/utils/pacat.c:609 +#, c-format +msgid "" +"%s [options]\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -r, --record Create a connection for recording\n" +" -p, --playback Create a connection for playback\n" +"\n" +" -v, --verbose Enable verbose operations\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -d, --device=DEVICE The name of the sink/source to " +"connect to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" +" --stream-name=NAME How to call this stream on the " +"server\n" +" --volume=VOLUME Specify the initial (linear) volume " +"in range 0...65536\n" +" --rate=SAMPLERATE The sample rate in Hz (defaults to " +"44100)\n" +" --format=SAMPLEFORMAT The sample type, one of s16le, " +"s16be, u8, float32le,\n" +" float32be, ulaw, alaw, s32le, s32be, " +"s24le, s24be,\n" +" s24-32le, s24-32be (defaults to " +"s16ne)\n" +" --channels=CHANNELS The number of channels, 1 for mono, " +"2 for stereo\n" +" (defaults to 2)\n" +" --channel-map=CHANNELMAP Channel map to use instead of the " +"default\n" +" --fix-format Take the sample format from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-rate Take the sampling rate from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-channels Take the number of channels and the " +"channel map\n" +" from the sink the stream is being " +"connected to.\n" +" --no-remix Don't upmix or downmix channels.\n" +" --no-remap Map channels by index instead of " +"name.\n" +" --latency=BYTES Request the specified latency in " +"bytes.\n" +" --process-time=BYTES Request the specified process time " +"per request in bytes.\n" +" --property=PROPERTY=VALUE Set the specified property to the " +"specified value.\n" +" --raw Record/play raw PCM data.\n" +" --file-format=FFORMAT Record/play formatted PCM data.\n" +" --list-file-formats List available file formats.\n" +msgstr "" +"%s [options]\n" +"\n" +" -h, --help આ મદદને બતાવો\n" +" --version આવૃત્તિને બતાવો\n" +"\n" +" -r, --record રેકોર્ડીંગ માટે જોડાણને બનાવો\n" +" -p, --playback પ્લેબેક માટે જોડાણને બનાવો\n" +"\n" +" -v, --verbose વર્બોસ ક્રિયાઓ ને સક્રિય કરો\n" +"\n" +" -s, --server=SERVER તેમાં જોડાવા માટે સર્વરનું નામ\n" +" -d, --device=DEVICE તેમાં જોડાવા માટે સિંક/સ્ત્રોત નું નામ\n" +" -n, --client-name=NAME સર્વર પર આ ક્લાઇન્ટને કેવી રીતે કોલ કરવો\n" +" --stream-name=NAME સર્વર પર આ સ્ટ્રીમને કેવી રીતે કોલ કરવો\n" +" --volume=VOLUME સીમા 0...65536 માં પ્રારંભનાં (સીધા) " +"વોલ્યુમને સ્પષ્ટ કરો\n" +" --rate=SAMPLERATE Hz માં નમૂનો(44100 નાં મૂળભૂતો)\n" +" --format=SAMPLEFORMAT નમૂના પ્રકાર, s16le, s16be, u8, " +"float32le, માંનો એક\n" +" float32be, ulaw, alaw, s32le, s32be, " +"s24le, s24be,\n" +" s24-32le, s24-32be (defaults to " +"s16ne)\n" +" --channels=CHANNELS ચેનલોની સંખ્યા, mono માટે 1, stereo માટે " +"2\n" +" (2 એ મૂળભૂત છે)\n" +" --channel-map=CHANNELMAP મૂળભૂત ને બદલે વાપરવા માટે ચેનલ મેપ\n" +" --fix-format સ્ટ્રીમ તેમાં જોડાયેલ છે તે સિંક માંથી નમૂના " +"બંધારણને\n" +" લો.\n" +" --fix-rate સ્ટ્રીમ તેમાં જોડાયેલ છે તે સિંક માંથી નમૂના " +"દરને લો.\n" +" --fix-channels સ્ટ્રીમ તેમાં જોડાયેલ છે તે સિંક માંથી ચેનલો " +"અને ચેનલ માપને લો.\n" +" --no-remix ચેનલોને upmix અથવા downmix કરો નહિં.\n" +" --no-remap નામને બદલે અનુક્રમણિકા દ્દારા મેપ ચેનલો.\n" +" --latency=BYTES બાઇટોમાં સ્પષ્ટ થયેલ ગુપ્તતા ની માંગણી " +"કરો.\n" +" --process-time=BYTES બાઇટોમાં માંગણી ની સાથે સ્પષ્ટ થયેલ " +"પ્રક્રિયા સમયની માંગણી કરો.\n" +" --property=PROPERTY=VALUE સ્પષ્ટ થયેલ કિંમતમાં સ્પષ્ટ થયેલ ગુણધર્મને " +"સુયોજિત કરો.\n" +" --raw કાચી PCM માહિતીનો રેકોર્ડ કરો/વગાડો.\n" +" --file-format=FFORMAT બંધારણ થયેલ માહિતીનો રેકોર્ડ કરો/વગાડો.\n" +" --list-file-formats ઉપલ્બધ ફાઇલ બંધારણોની યાદી.\n" + +#: ../src/utils/pacat.c:731 +#, c-format +msgid "" +"pacat %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pacat %s\n" +"libpulse %s સાથે કમ્પાઇલ થયેલ છે\n" +"libpulse %s સાથે કડી થયેલ છે\n" + +#: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953 +#, c-format +msgid "Invalid client name '%s'" +msgstr "અયોગ્ય ક્લાઇન્ટ નામ '%s'" + +#: ../src/utils/pacat.c:779 +#, c-format +msgid "Invalid stream name '%s'" +msgstr "અયોગ્ય સ્ટ્રીમ નામ '%s'" + +#: ../src/utils/pacat.c:816 +#, c-format +msgid "Invalid channel map '%s'" +msgstr "અયોગ્ય ચેનલ મેપ '%s'" + +#: ../src/utils/pacat.c:845 +#, c-format +msgid "Invalid latency specification '%s'" +msgstr "અયોગ્ય ગુપ્તતા સ્પષ્ટીકરણ '%s'" + +#: ../src/utils/pacat.c:852 +#, c-format +msgid "Invalid process time specification '%s'" +msgstr "અયોગ્ય પ્રક્રિયા સમય સ્પષ્ટીકરણ '%s'" + +#: ../src/utils/pacat.c:864 +#, c-format +msgid "Invalid property '%s'" +msgstr "અયોગ્ય ગુણધર્મ '%s'" + +#: ../src/utils/pacat.c:881 +#, c-format +msgid "Unknown file format %s." +msgstr "અજ્ઞાત ફાઇલ બંધારણ %s." + +#: ../src/utils/pacat.c:900 +msgid "Invalid sample specification" +msgstr "અયોગ્ય નમૂના સ્પષ્ટીકરણ" + +#: ../src/utils/pacat.c:910 +#, c-format +msgid "open(): %s" +msgstr "open(): %s" + +#: ../src/utils/pacat.c:915 +#, c-format +msgid "dup2(): %s" +msgstr "dup2(): %s" + +#: ../src/utils/pacat.c:922 +msgid "Too many arguments." +msgstr "ઘણી બધી દલીલો છે." + +#: ../src/utils/pacat.c:933 +msgid "Failed to generate sample specification for file." +msgstr "ફાઇલ માટે નમૂના સ્પષ્ટીકરણ ને ઉત્પન્ન કરવામાં નિષ્ફળ." + +#: ../src/utils/pacat.c:953 +msgid "Failed to open audio file." +msgstr "સાઉન્ડ ફાઇલને ખોલવામાં નિષ્ફળતા." + +#: ../src/utils/pacat.c:959 +msgid "" +"Warning: specified sample specification will be overwritten with " +"specification from file." +msgstr "ચેતવણી: સ્પષ્ટ થયેલ નમૂના સ્પષ્ટીકરણ ફાઇલ માંથી સ્પષ્ટીકરણ સાથે ઉપર લખાયેલ હશે." + +#: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997 +msgid "Failed to determine sample specification from file." +msgstr "ફાઇલ માંથી નમૂના સ્પષ્ટીકરણને નક્કી કરવામાં નિષ્ફળતા." + +#: ../src/utils/pacat.c:971 +msgid "Warning: Failed to determine channel map from file." +msgstr "ચેતવણી: ફાઇલમાંથી ચેનલ મેપને નક્કી કરવામાં નિષ્ફળતા." + +#: ../src/utils/pacat.c:982 +msgid "Channel map doesn't match sample specification" +msgstr "ચેનલ મેપ એ સ્પષ્ટીકરણ નમૂનાને બંધબેસતુ નથી" + +#: ../src/utils/pacat.c:993 +msgid "Warning: failed to write channel map to file." +msgstr "ચેતણી: ફાઇલમાં ચેનલ મેપને લખવામાં નિષ્ફળતા." + +#: ../src/utils/pacat.c:1008 +#, c-format +msgid "" +"Opening a %s stream with sample specification '%s' and channel map '%s'." +msgstr "નમૂના સ્પષ્ટીકરણ '%s' અને ચેનલ નક્ષા '%s' સાથે %s સ્ટ્રીમને ખોલી રહ્યા છે." + +#: ../src/utils/pacat.c:1009 +msgid "recording" +msgstr "રેકોર્ડ કરી રહ્યા છે" + +#: ../src/utils/pacat.c:1009 +msgid "playback" +msgstr "પ્લેબેક" + +#: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267 +msgid "pa_mainloop_new() failed." +msgstr "pa_mainloop_new() નિષ્ફળ." + +#: ../src/utils/pacat.c:1054 +msgid "io_new() failed." +msgstr "io_new() નિષ્ફળ." + +#: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279 +msgid "pa_context_new() failed." +msgstr "pa_context_new() નિષ્ફળ." + +#: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285 +#, c-format +msgid "pa_context_connect() failed: %s" +msgstr "pa_context_connect() નિષ્ફળ: %s" + +#: ../src/utils/pacat.c:1075 +msgid "pa_context_rttime_new() failed." +msgstr "pa_context_new() નિષ્ફળ." + +#: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290 +msgid "pa_mainloop_run() failed." +msgstr "pa_mainloop_run() નિષ્ફળ." + +#: ../src/utils/pasuspender.c:81 +#, c-format +msgid "fork(): %s\n" +msgstr "fork(): %s\n" + +#: ../src/utils/pasuspender.c:92 +#, c-format +msgid "execvp(): %s\n" +msgstr "execvp(): %s\n" + +#: ../src/utils/pasuspender.c:109 +#, c-format +msgid "Failure to suspend: %s\n" +msgstr "થોડા સમય માટે બંધ કરવા માટે નિષ્ફળતા: %s\n" + +#: ../src/utils/pasuspender.c:124 +#, c-format +msgid "Failure to resume: %s\n" +msgstr "ફરી શરૂ કરવામાં નિષ્ફળતા: %s\n" + +#: ../src/utils/pasuspender.c:147 +#, c-format +msgid "WARNING: Sound server is not local, not suspending.\n" +msgstr "ચેતવણી: સાઉન્ડ સર્વર એ સ્થાનિક નથી, થોડા સમય માટે બંધ કરવામાં આવ્યુ નથી.\n" + +#: ../src/utils/pasuspender.c:159 +#, c-format +msgid "Connection failure: %s\n" +msgstr "જોડાણ નિષ્ફળ: %s\n" + +#: ../src/utils/pasuspender.c:176 +#, c-format +msgid "Got SIGINT, exiting.\n" +msgstr "SIGINT મળ્યુ, બહાર નીકળી રહ્યા છે.\n" + +#: ../src/utils/pasuspender.c:194 +#, c-format +msgid "WARNING: Child process terminated by signal %u\n" +msgstr "ચેતવણી: બાળ પ્રક્રિયાનો સંકેત %u દ્દારા અંત આવેલ છે\n" + +#: ../src/utils/pasuspender.c:212 +#, c-format +msgid "" +"%s [options] ... \n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +"\n" +msgstr "" +"%s [options] ... \n" +"\n" +" -h, --help આ મદદ ને બતાવો\n" +" --version આવૃત્તિને બતાવો\n" +" -s, --server=SERVER જોડાવવા માટે સર્વરનું નામ\n" +"\n" + +#: ../src/utils/pasuspender.c:248 +#, c-format +msgid "" +"pasuspender %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pasuspender %s\n" +"libpulse %s સાથે કમ્પાઇલ થયેલ છે\n" +"libpulse %s સાથે કડી થયેલ છે\n" + +#: ../src/utils/pasuspender.c:277 +#, c-format +msgid "pa_mainloop_new() failed.\n" +msgstr "pa_mainloop_new() નિષ્ફળ.\n" + +#: ../src/utils/pasuspender.c:290 +#, c-format +msgid "pa_context_new() failed.\n" +msgstr "pa_context_new() નિષ્ફળ.\n" + +#: ../src/utils/pasuspender.c:298 +#, c-format +msgid "pa_mainloop_run() failed.\n" +msgstr "pa_mainloop_run() નિષ્ફળ.\n" + +#: ../src/utils/pactl.c:135 +#, c-format +msgid "Failed to get statistics: %s" +msgstr "પરિસ્થિતિઓને મેળવવામાં નિષ્ફળતા: %s" + +#: ../src/utils/pactl.c:141 +#, c-format +msgid "Currently in use: %u blocks containing %s bytes total.\n" +msgstr "હાલમાં વપરાશમાં છે: %u બ્લોકો %s કુલ બાઇટોને સમાવી રહ્યા છે.\n" + +#: ../src/utils/pactl.c:144 +#, c-format +msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n" +msgstr "આખી જીંદગી દરમ્યાન ફાળવેલ છે: %u બ્લોકો %s કુલ બાઇટોને સમાવી રહ્યા છે.\n" + +#: ../src/utils/pactl.c:147 +#, c-format +msgid "Sample cache size: %s\n" +msgstr "નમૂના કેશ માપ: %s\n" + +#: ../src/utils/pactl.c:156 +#, c-format +msgid "Failed to get server information: %s" +msgstr "સર્વર જાણકારી મેળવવામાં નિષ્ફળતા: %s" + +#: ../src/utils/pactl.c:164 +#, c-format +msgid "" +"User name: %s\n" +"Host Name: %s\n" +"Server Name: %s\n" +"Server Version: %s\n" +"Default Sample Specification: %s\n" +"Default Channel Map: %s\n" +"Default Sink: %s\n" +"Default Source: %s\n" +"Cookie: %08x\n" +msgstr "" +"વપરાશકર્તા નામ: %s\n" +"યજમાન નામ: %s\n" +"સર્વર નામ: %s\n" +"સર્વર આવૃત્તિ: %s\n" +"મૂળભૂત નમૂના સ્પષ્ટીકરણ: %s\n" +"મૂળભૂત ચેનલ મેપ: %s\n" +"મૂળભૂત સિંક: %s\n" +"મૂળભૂત સ્ત્રોત: %s\n" +"કુકી: %08x\n" + +#: ../src/utils/pactl.c:205 +#, c-format +msgid "Failed to get sink information: %s" +msgstr "સિંક જાણકારી મેળવવામાં નિષ્ફળતા: %s" + +#: ../src/utils/pactl.c:221 +#, c-format +msgid "" +"Sink #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor Source: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"સિંક #%u\n" +"\tસ્થિતિ: %s\n" +"\tનામ: %s\n" +"\tવર્ણન: %s\n" +"\tડ્રાઇવર: %s\n" +"\tનમૂના સ્પષ્ટીકરણ: %s\n" +"\tચેનલ મેપ: %s\n" +"\tમાલિક મોડ્યુલ: %u\n" +"\tમૂંગુ: %s\n" +"\tવોલ્યુમ: %s%s%s\n" +"\t સમતુલન %0.2f\n" +"\tઆધાર વોલ્યુમ: %s%s%s\n" +"\tમોનિટર સ્ત્રોત: %s\n" +"\tગુપ્તતા: %0.0f usec, configured %0.0f usec\n" +"\tફ્લેગો: %s%s%s%s%s%s\n" +"\tગુણધર્મો:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360 +#, c-format +msgid "\tPorts:\n" +msgstr "\tપોર્ટો:\n" + +#: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366 +#, c-format +msgid "\tActive Port: %s\n" +msgstr "\tસક્રિય પોર્ટ: %s\n" + +#: ../src/utils/pactl.c:297 +#, c-format +msgid "Failed to get source information: %s" +msgstr "સ્ત્રોત જાણકારીને મેળવવામાં નિષ્ફળતા: %s" + +#: ../src/utils/pactl.c:313 +#, c-format +msgid "" +"Source #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor of Sink: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"સ્ત્રોત #%u\n" +"\tસ્થિતિ: %s\n" +"\tનામ: %s\n" +"\tવર્ણન: %s\n" +"\tડ્રાઇવર: %s\n" +"\tનમૂના સ્પષ્ટીકરણ: %s\n" +"\tચેનલ મેપ: %s\n" +"\tમાલિક મોડ્યુલ: %u\n" +"\tમૂંગુ: %s\n" +"\tવોલ્યુમ: %s%s%s\n" +"\t સમતુલન %0.2f\n" +"\tઆધાર વોલ્યુમ: %s%s%s\n" +"\tસિંકનું મોનિટર: %s\n" +"\tગુપ્તતા: %0.0f usec, configured %0.0f usec\n" +"\tફ્લેગો: %s%s%s%s%s%s\n" +"\tગુણધર્મો:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:345 ../src/utils/pactl.c:401 ../src/utils/pactl.c:436 +#: ../src/utils/pactl.c:473 ../src/utils/pactl.c:532 ../src/utils/pactl.c:533 +#: ../src/utils/pactl.c:543 ../src/utils/pactl.c:587 ../src/utils/pactl.c:588 +#: ../src/utils/pactl.c:594 ../src/utils/pactl.c:637 ../src/utils/pactl.c:638 +#: ../src/utils/pactl.c:645 +msgid "n/a" +msgstr "n/a" + +#: ../src/utils/pactl.c:375 +#, c-format +msgid "Failed to get module information: %s" +msgstr "મોડ્યુલની જાણકારી મેળવવામાં નિષ્ફળતા: %s" + +#: ../src/utils/pactl.c:393 +#, c-format +msgid "" +"Module #%u\n" +"\tName: %s\n" +"\tArgument: %s\n" +"\tUsage counter: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"મોડ્યુલ #%u\n" +"\tનામ: %s\n" +"\tદલીલ: %s\n" +"\tવપરાશ ગણતરી: %s\n" +"\tગુણધર્મો:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:412 +#, c-format +msgid "Failed to get client information: %s" +msgstr "ક્લાઇન્ટ જાણકારી મેળવવામાં નિષ્ફળતા: %s" + +#: ../src/utils/pactl.c:430 +#, c-format +msgid "" +"Client #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"ક્લાઇન્ટ #%u\n" +"\tડ્રાઇવર: %s\n" +"\tમાલિક મોડ્યુલ: %s\n" +"\tગુણધર્મો:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:447 +#, c-format +msgid "Failed to get card information: %s" +msgstr "કાર્ડ જાણકારી મેળવવામાં નિષ્ફળતા: %s" + +#: ../src/utils/pactl.c:465 +#, c-format +msgid "" +"Card #%u\n" +"\tName: %s\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"કાર્ડ #%u\n" +"\tનામ: %s\n" +"\tડ્રાઇવર: %s\n" +"\tમાલિક મોડ્યુલ: %s\n" +"\tગુણધર્મો:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:479 +#, c-format +msgid "\tProfiles:\n" +msgstr "\tરૂપરેખાઓ:\n" + +#: ../src/utils/pactl.c:485 +#, c-format +msgid "\tActive Profile: %s\n" +msgstr "\tસક્રિય રૂપરેખા: %s\n" + +#: ../src/utils/pactl.c:496 +#, c-format +msgid "Failed to get sink input information: %s" +msgstr "સિંક ઇનપુટ જાણકારી મેળવવામાં નિષ્ફળતા: %s" + +#: ../src/utils/pactl.c:515 +#, c-format +msgid "" +"Sink Input #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSink: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tMute: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSink Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"સિંક ઇનપુટ #%u\n" +"\tડ્રાઇવર: %s\n" +"\tમાલિક મોડ્યુલ: %s\n" +"\tક્લાઇન્ટ: %s\n" +"\tસિંક: %u\n" +"\tનમૂના સ્પષ્ટીકરણ: %s\n" +"\tચેનલ મેપ %s\n" +"\tમૂંગુ: %s\n" +"\tવોલ્યુમ: %s\n" +"\t %s\n" +"\t સમતુલન %0.2f\n" +"\tબફર ગુપ્તતા: %0.0f usec\n" +"\tસિંક ગુપ્તતા: %0.0f usec\n" +"\tResampl પદ્દતિ: %s\n" +"\tગુણધર્મો:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:554 +#, c-format +msgid "Failed to get source output information: %s" +msgstr "સ્ત્રોત આઉટપુટ જાણકારી મેળવવામાં નિષ્ફળ: %s" + +#: ../src/utils/pactl.c:574 +#, c-format +msgid "" +"Source Output #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSource: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSource Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"સ્ત્રોત આઉટપુટ #%u\n" +"\tડ્રાઇવર: %s\n" +"\tમાલિક મોડ્યુલ: %s\n" +"\tક્લાઇન્ટ: %s\n" +"\tસ્ત્રોત: %u\n" +"\tનમૂના સ્પષ્ટીકરણ: %s\n" +"\tચેનલ મેપ %s\n" +"\tબફર ગુપ્તતા: %0.0f usec\n" +"\tસિંક ગુપ્તતા: %0.0f usec\n" +"\tResampl પદ્દતિ: %s\n" +"\tગુણધર્મો:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:605 +#, c-format +msgid "Failed to get sample information: %s" +msgstr "નમૂના જાણકારી મેળવવામાં નિષ્ફળ: %s" + +#: ../src/utils/pactl.c:623 +#, c-format +msgid "" +"Sample #%u\n" +"\tName: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tDuration: %0.1fs\n" +"\tSize: %s\n" +"\tLazy: %s\n" +"\tFilename: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"નમૂના #%u\n" +"\tનામ: %s\n" +"\tનમૂના સ્પષ્ટીકરણ: %s\n" +"\tચેનલ મેપ: %s\n" +"\tવોલ્યુમ: %s\n" +"\t %s\n" +"\t સમતુલન %0.2f\n" +"\tસમયગાળો: %0.1fs\n" +"\tમાપ: %s\n" +"\tઆળસુ: %s\n" +"\tફાઇલનામ: %s\n" +"\tગુણધર્મો:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663 +#, c-format +msgid "Failure: %s" +msgstr "નિષ્ફળતા: %s" + +#: ../src/utils/pactl.c:687 +#, c-format +msgid "Failed to upload sample: %s" +msgstr "નમૂનાને અપલોડ કરવામાં નિષ્ફળ: %s" + +#: ../src/utils/pactl.c:704 +msgid "Premature end of file" +msgstr "ફાઇલનો નિયત સમય પહેલા અંત" + +#: ../src/utils/pactl.c:863 +msgid "Got SIGINT, exiting." +msgstr "SIGINT મળ્યુ, બહાર નીકળી રહ્યા છે." + +#: ../src/utils/pactl.c:869 +#, c-format +msgid "" +"%s [options] stat\n" +"%s [options] list\n" +"%s [options] exit\n" +"%s [options] upload-sample FILENAME [NAME]\n" +"%s [options] play-sample NAME [SINK]\n" +"%s [options] remove-sample NAME\n" +"%s [options] move-sink-input SINKINPUT SINK\n" +"%s [options] move-source-output SOURCEOUTPUT SOURCE\n" +"%s [options] load-module NAME [ARGS ...]\n" +"%s [options] unload-module MODULE\n" +"%s [options] suspend-sink SINK 1|0\n" +"%s [options] suspend-source SOURCE 1|0\n" +"%s [options] set-card-profile CARD PROFILE\n" +"%s [options] set-sink-port SINK PORT\n" +"%s [options] set-source-port SOURCE PORT\n" +"%s [options] set-sink-volume SINK VOLUME\n" +"%s [options] set-source-volume SOURCE VOLUME\n" +"%s [options] set-sink-input-volume SINKINPUT VOLUME\n" +"%s [options] set-sink-mute SINK 1|0\n" +"%s [options] set-source-mute SOURCE 1|0\n" +"%s [options] set-sink-input-mute SINKINPUT 1|0\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" +msgstr "" +"%s [options] stat\n" +"%s [options] list\n" +"%s [options] exit\n" +"%s [options] upload-sample FILENAME [NAME]\n" +"%s [options] play-sample NAME [SINK]\n" +"%s [options] remove-sample NAME\n" +"%s [options] move-sink-input SINKINPUT SINK\n" +"%s [options] move-source-output SOURCEOUTPUT SOURCE\n" +"%s [options] load-module NAME [ARGS ...]\n" +"%s [options] unload-module MODULE\n" +"%s [options] suspend-sink SINK 1|0\n" +"%s [options] suspend-source SOURCE 1|0\n" +"%s [options] set-card-profile CARD PROFILE\n" +"%s [options] set-sink-port SINK PORT\n" +"%s [options] set-source-port SOURCE PORT\n" +"%s [options] set-sink-volume SINK VOLUME\n" +"%s [options] set-source-volume SOURCE VOLUME\n" +"%s [options] set-sink-input-volume SINKINPUT VOLUME\n" +"%s [options] set-sink-mute SINK 1|0\n" +"%s [options] set-source-mute SOURCE 1|0\n" +"%s [options] set-sink-input-mute SINKINPUT 1|0\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" + +#: ../src/utils/pactl.c:933 +#, c-format +msgid "" +"pactl %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pactl %s\n" +"libpulse %s સાથે કમ્પાઇલ થયેલ છે\n" +"libpulse %s સાથે કડી થયેલ છે\n" + +#: ../src/utils/pactl.c:979 +msgid "Please specify a sample file to load" +msgstr "મહેરબાની કરીને લોડ કરવા માટે નમૂના ફાઇલને સ્પષ્ટ કરો" + +#: ../src/utils/pactl.c:992 +msgid "Failed to open sound file." +msgstr "સાઉન્ડ ફાઇલને ખોલવામાં નિષ્ફળ." + +#: ../src/utils/pactl.c:1004 +msgid "Warning: Failed to determine sample specification from file." +msgstr "ચેતવણી: ફાઇલ માંથી નમૂના સ્પષ્ટીકરણ કરવાનું નક્કી કરવામાં નિષ્ફળ." + +#: ../src/utils/pactl.c:1014 +msgid "You have to specify a sample name to play" +msgstr "વગાડવા માટે તમારે નમૂના નામને સ્પષ્ટ કરવુ જ પડશે" + +#: ../src/utils/pactl.c:1026 +msgid "You have to specify a sample name to remove" +msgstr "દૂર કરવા માટે તમારે નમૂના નામને સ્પષ્ટ કરવુ જ પડશે" + +#: ../src/utils/pactl.c:1035 +msgid "You have to specify a sink input index and a sink" +msgstr "સિંક ઇનપુટ અનુક્રમણિકા અને સિંકને તમારે સ્પષ્ટ કરવુ જ પડશે" + +#: ../src/utils/pactl.c:1045 +msgid "You have to specify a source output index and a source" +msgstr "તમારે સ્ત્રોત આઉટપુટ અનુક્રમણિકા અને સ્ત્રોતને સ્પષ્ટ કરવુ જ પડશે" + +#: ../src/utils/pactl.c:1060 +msgid "You have to specify a module name and arguments." +msgstr "તમારે મોડ્યુલ નામ અને દલીલોને સ્પષ્ટ કરવુ જ પડશે." + +#: ../src/utils/pactl.c:1080 +msgid "You have to specify a module index" +msgstr "તમારે મોડ્યુલ અનુક્રમણિકાને સ્પષ્ટ કરવુ જ પડશે" + +#: ../src/utils/pactl.c:1090 +msgid "" +"You may not specify more than one sink. You have to specify a boolean value." +msgstr "" +"તમે એક સિંક કરતા વધારે સ્પષ્ટ કરી શકશો નહિં. તમારે બુલિયન કિંમતને સ્પષ્ટ કરવુ જ પડશે." + +#: ../src/utils/pactl.c:1103 +msgid "" +"You may not specify more than one source. You have to specify a boolean " +"value." +msgstr "" +"તમે એક સ્ત્રોત કરતા વધારે સ્પષ્ટ કરી શકશો નહિં. તમારે બુલિયન કિંમતને સ્પષ્ટ કરવુ જ પડશે." + +#: ../src/utils/pactl.c:1115 +msgid "You have to specify a card name/index and a profile name" +msgstr "તમારે કાર્ડ નામ/અનુક્રમણિકા અને પોર્ટ નામને સ્પષ્ટ કરવુ જ પડશે" + +#: ../src/utils/pactl.c:1126 +msgid "You have to specify a sink name/index and a port name" +msgstr "તમારે કાર્ડ નામ/અનુક્રમણિકા અને પોર્ટ નામને સ્પષ્ટ કરવુ જ પડશે" + +#: ../src/utils/pactl.c:1137 +msgid "You have to specify a source name/index and a port name" +msgstr "તમારે કાર્ડ નામ/અનુક્રમણિકા અને પોર્ટ નામને સ્પષ્ટ કરવુ જ પડશે" + +#: ../src/utils/pactl.c:1149 +msgid "You have to specify a sink name/index and a volume" +msgstr "તમારે કાર્ડ નામ/અનુક્રમણિકા અને વોલ્યુમને સ્પષ્ટ કરવુ જ પડશે" + +#: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171 +#: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209 +#: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248 +msgid "Invalid volume specification" +msgstr "અયોગ્ય નમૂના સ્પષ્ટીકરણ" + +#: ../src/utils/pactl.c:1166 +msgid "You have to specify a source name/index and a volume" +msgstr "તમારે કાર્ડ નામ/અનુક્રમણિકા અને વોલ્યુમ સ્પષ્ટ કરવુ જ પડશે" + +#: ../src/utils/pactl.c:1183 +msgid "You have to specify a sink input index and a volume" +msgstr "સિંક ઇનપુટ અનુક્રમણિકા અને વોલ્યુમને તમારે સ્પષ્ટ કરવુ જ પડશે" + +#: ../src/utils/pactl.c:1188 +msgid "Invalid sink input index" +msgstr "અયોગ્ય સિંક ઇનપુટ અનુક્રમણિકા" + +#: ../src/utils/pactl.c:1204 +msgid "You have to specify a sink name/index and a mute boolean" +msgstr "તમારે સિંક નામ/અનુક્રમણિકા અને મૂંગા બુલિયનને સ્પષ્ટ કરવુ જ પડશે" + +#: ../src/utils/pactl.c:1221 +msgid "You have to specify a source name/index and a mute boolean" +msgstr "તમારે સિંક નામ/અનુક્રમણિકા અને મૂંગા બુલિયનને સ્પષ્ટ કરવુ જ પડશે" + +#: ../src/utils/pactl.c:1238 +msgid "You have to specify a sink input index and a mute boolean" +msgstr "સિંક ઇનપુટ અનુક્રમણિકા અને મૂંગા બુલિયનને તમારે સ્પષ્ટ કરવુ જ પડશે" + +#: ../src/utils/pactl.c:1243 +msgid "Invalid sink input index specification" +msgstr "અયોગ્ય ઇનપુટ અનુક્રમણિકા સ્પષ્ટીકરણ" + +#: ../src/utils/pactl.c:1262 +msgid "No valid command specified." +msgstr "યોગ્ય આદેશ સ્પષ્ટ થયેલ નથી." + +#: ../src/utils/pax11publish.c:61 +#, c-format +msgid "" +"%s [-D display] [-S server] [-O sink] [-I source] [-c file] [-d|-e|-i|-r]\n" +"\n" +" -d Show current PulseAudio data attached to X11 display (default)\n" +" -e Export local PulseAudio data to X11 display\n" +" -i Import PulseAudio data from X11 display to local environment " +"variables and cookie file.\n" +" -r Remove PulseAudio data from X11 display\n" +msgstr "" +"%s [-D display] [-S server] [-O sink] [-I source] [-c file] [-d|-e|-i|-r]\n" +"\n" +" -d X11 દેખાવ (મૂળભૂત) માં જોડાયેલ હાલની PulseAudio માહિતીને બતાવો\n" +" -e X11 દેખાવમાં સ્થાનિય PulseAudio માહિતીની નિકાસ કરો\n" +" -i સ્થાનિક પર્યાવરણ ચલો અને કુકી ફાઇલમાં X11 દેખાવમાંથી PulseAudio માહિતીને આયાત " +"કરો.\n" +" -r X11 દેખાવમાંથી PulseAudio માહિતીને દૂર કરો\n" + +#: ../src/utils/pax11publish.c:94 +#, c-format +msgid "Failed to parse command line.\n" +msgstr "આદેશ વાક્યને પદચ્છેદન કરવામાં નિષ્ફળ.\n" + +#: ../src/utils/pax11publish.c:108 +#, c-format +msgid "Server: %s\n" +msgstr "સર્વર: %s\n" + +#: ../src/utils/pax11publish.c:110 +#, c-format +msgid "Source: %s\n" +msgstr "સ્ત્રોત: %s\n" + +#: ../src/utils/pax11publish.c:112 +#, c-format +msgid "Sink: %s\n" +msgstr "સિંક: %s\n" + +#: ../src/utils/pax11publish.c:114 +#, c-format +msgid "Cookie: %s\n" +msgstr "કુકી: %s\n" + +#: ../src/utils/pax11publish.c:132 +#, c-format +msgid "Failed to parse cookie data\n" +msgstr "કુકી માહિતીને પદચ્છેદન કરવામાં નિષ્ફળ\n" + +#: ../src/utils/pax11publish.c:137 +#, c-format +msgid "Failed to save cookie data\n" +msgstr "કુકી માહિતીને સંગ્રહ કરવામાં નિષ્ફળ\n" + +#: ../src/utils/pax11publish.c:152 +#, c-format +msgid "Failed to load client configuration file.\n" +msgstr "ક્લાઇન્ટ રૂપરેખાંકન ફાઇલને લોડ કરવામાં નિષ્ફળ.\n" + +#: ../src/utils/pax11publish.c:157 +#, c-format +msgid "Failed to read environment configuration data.\n" +msgstr "પર્યાવરણ રૂપરેખાંકન માહિતીને વાંચવામાં નિષ્ફળ.\n" + +#: ../src/utils/pax11publish.c:174 +#, c-format +msgid "Failed to get FQDN.\n" +msgstr "FQDN ને મેળવવામાં નિષ્ફળ.\n" + +#: ../src/utils/pax11publish.c:194 +#, c-format +msgid "Failed to load cookie data\n" +msgstr "કુકી માહિતીને લોડ કરવામાં નિષ્ફળ\n" + +#: ../src/utils/pax11publish.c:211 +#, c-format +msgid "Not yet implemented.\n" +msgstr "હજુ અમલીકરણ થયેલ નથી.\n" + +#: ../src/utils/pacmd.c:69 +msgid "No PulseAudio daemon running, or not running as session daemon." +msgstr "PulseAudio ડિમન ચાલી રહ્યુ નથી, અથવા સત્ર ડિમન તરીકે ચાલી રહ્યુ નથી." + +#: ../src/utils/pacmd.c:74 +#, c-format +msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s" +msgstr "socket(PF_UNIX, SOCK_STREAM, 0): %s" + +#: ../src/utils/pacmd.c:91 +#, c-format +msgid "connect(): %s" +msgstr "connect(): %s" + +#: ../src/utils/pacmd.c:99 +msgid "Failed to kill PulseAudio daemon." +msgstr "PulseAudio ડિમનને મારવામાં નિષ્ફળ." + +#: ../src/utils/pacmd.c:107 +msgid "Daemon not responding." +msgstr "ડિમન એ જવાબ આપતુ નથી." + +#: ../src/utils/pacmd.c:161 +#, c-format +msgid "poll(): %s" +msgstr "poll(): %s" + +#: ../src/utils/pacmd.c:171 ../src/utils/pacmd.c:188 +#, c-format +msgid "read(): %s" +msgstr "read(): %s" + +#: ../src/utils/pacmd.c:207 ../src/utils/pacmd.c:223 +#, c-format +msgid "write(): %s" +msgstr "write(): %s" + +#: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:219 +msgid "Cannot access autospawn lock." +msgstr "autospawn તાળાને દાખલ કરી શકાતુ નથી." + +#: ../src/modules/alsa/alsa-sink.c:530 ../src/modules/alsa/alsa-sink.c:689 +#, c-format +msgid "" +"ALSA woke us up to write new data to the device, but there was actually " +"nothing to write!\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers.\n" +"We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() " +"returned 0 or another value < min_avail." +msgstr "" +"ALSA એ ઉપકરણમાં નવી માહિતીને લખવા માટે આપણને જગાડતુ હતુ, પરંતુ ત્યાં વાસ્તવમાં કંઇ જ લખાયુ " +"ન હતુ!\n" +"મોટેભાગે આ ALSA ડ્રાઇવર '%s' માં ભૂલ જેવુ છે. મહેરબાની કરીને આ મુદ્દાને ALSA ડેવલપરોમાં " +"અહેવાલ કરો.\n" +"POLLOUT સુયોજન સાથે આપણે જાગેલ હતા -- છતાંપણ ના પછીનું snd_pcm_avail() ને 0 પાછો મળે " +"છે અથવા બીજી કિંમત < min_avail." + +#: ../src/modules/alsa/alsa-source.c:506 ../src/modules/alsa/alsa-source.c:656 +#, c-format +msgid "" +"ALSA woke us up to read new data from the device, but there was actually " +"nothing to read!\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers.\n" +"We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() " +"returned 0 or another value < min_avail." +msgstr "" +"ALSA એ ઉપકરણમાં નવી માહિતીને વાંચવા માટે આપણને જગાડતુ હતુ, પરંતુ ત્યાં વાસ્તવમાં કંઇ જ " +"વંચાયુ ન હતુ!\n" +"મોટેભાગે આ ALSA ડ્રાઇવર '%s' માં ભૂલ જેવુ છે. મહેરબાની કરીને આ મુદ્દાને ALSA ડેવલપરોમાં " +"અહેવાલ કરો.\n" +"POLLOUT સુયોજન સાથે આપણે જાગેલ હતા -- છતાંપણ ના પછીનું snd_pcm_avail() ને 0 પાછો મળે " +"છે અથવા બીજી કિંમત < min_avail." + +#: ../src/modules/alsa/module-alsa-card.c:152 +#: ../src/modules/bluetooth/module-bluetooth-device.c:2228 +#: ../src/modules/alsa/alsa-mixer.c:2931 +msgid "Off" +msgstr "બંધ" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2184 +msgid "High Fidelity Playback (A2DP)" +msgstr "High Fidelity Playback (A2DP)" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2198 +msgid "High Fidelity Capture (A2DP)" +msgstr "High Fidelity Capture (A2DP)" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2213 +msgid "Telephony Duplex (HSP/HFP)" +msgstr "Telephony Duplex (HSP/HFP)" + +#: ../src/modules/reserve-wrap.c:151 +msgid "PulseAudio Sound Server" +msgstr "PulseAudio સાઉન્ડ સર્વર" + +#: ../src/modules/module-rygel-media-server.c:569 +#: ../src/modules/module-rygel-media-server.c:583 +msgid "Output Devices" +msgstr "" + +#: ../src/modules/module-rygel-media-server.c:570 +#: ../src/modules/module-rygel-media-server.c:584 +msgid "Input Devices" +msgstr "" + +#: ../src/modules/module-rygel-media-server.c:774 +msgid "Audio on @HOSTNAME@" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1701 +msgid "Input" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1702 +msgid "Docking Station Input" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1703 +msgid "Docking Station Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1704 +msgid "Line-In" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1705 +msgid "Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1706 +msgid "External Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1707 +#, fuzzy +msgid "Internal Microphone" +msgstr "આંતરિક ઓડિયો" + +#: ../src/modules/alsa/alsa-mixer.c:1708 +msgid "Radio" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1709 +msgid "Video" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1710 +msgid "Automatic Gain Control" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1711 +msgid "No Automatic Gain Control" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1712 +msgid "Boost" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1713 +msgid "No Boost" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1714 +msgid "Amplifier" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1715 +msgid "No Amplifier" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1773 +msgid "Analog Input" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1774 +msgid "Analog Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1775 +msgid "Analog Line-In" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1776 +msgid "Analog Radio" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1777 +msgid "Analog Video" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1778 +#, fuzzy +msgid "Analog Output" +msgstr "શૂન્ય આઉટપુટ" + +#: ../src/modules/alsa/alsa-mixer.c:1779 +msgid "Analog Headphones" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1780 +msgid "Analog Output (LFE)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1781 +msgid "Analog Mono Output" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1981 +#, fuzzy, c-format +msgid "%s+%s" +msgstr "%s %s" + +#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404 +#, fuzzy, c-format +msgid "%s / %s" +msgstr "%s %s" + +#: ../src/modules/alsa/alsa-mixer.c:2790 +msgid "Analog Mono" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2791 +#, fuzzy +msgid "Analog Stereo" +msgstr "સ્ટેરિઓ" + +#: ../src/modules/alsa/alsa-mixer.c:2792 +#, fuzzy +msgid "Analog Surround 2.1" +msgstr "સરાઉન્ડ 4.1" + +#: ../src/modules/alsa/alsa-mixer.c:2793 +#, fuzzy +msgid "Analog Surround 3.0" +msgstr "સરાઉન્ડ 4.0" + +#: ../src/modules/alsa/alsa-mixer.c:2794 +#, fuzzy +msgid "Analog Surround 3.1" +msgstr "સરાઉન્ડ 4.1" + +#: ../src/modules/alsa/alsa-mixer.c:2795 +#, fuzzy +msgid "Analog Surround 4.0" +msgstr "સરાઉન્ડ 4.0" + +#: ../src/modules/alsa/alsa-mixer.c:2796 +#, fuzzy +msgid "Analog Surround 4.1" +msgstr "સરાઉન્ડ 4.1" + +#: ../src/modules/alsa/alsa-mixer.c:2797 +#, fuzzy +msgid "Analog Surround 5.0" +msgstr "સરાઉન્ડ 5.0" + +#: ../src/modules/alsa/alsa-mixer.c:2798 +#, fuzzy +msgid "Analog Surround 5.1" +msgstr "સરાઉન્ડ 5.1" + +#: ../src/modules/alsa/alsa-mixer.c:2799 +#, fuzzy +msgid "Analog Surround 6.0" +msgstr "સરાઉન્ડ 4.0" + +#: ../src/modules/alsa/alsa-mixer.c:2800 +#, fuzzy +msgid "Analog Surround 6.1" +msgstr "સરાઉન્ડ 4.1" + +#: ../src/modules/alsa/alsa-mixer.c:2801 +#, fuzzy +msgid "Analog Surround 7.0" +msgstr "સરાઉન્ડ 4.0" + +#: ../src/modules/alsa/alsa-mixer.c:2802 +#, fuzzy +msgid "Analog Surround 7.1" +msgstr "સરાઉન્ડ 7.1" + +#: ../src/modules/alsa/alsa-mixer.c:2803 +msgid "Digital Stereo (IEC958)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2804 +msgid "Digital Surround 4.0 (IEC958)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2805 +msgid "Digital Surround 4.0 (IEC958/AC3)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2806 +msgid "Digital Surround 5.1 (IEC958/AC3)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2807 +msgid "Digital Stereo (HDMI)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2928 +msgid "Analog Mono Duplex" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2929 +msgid "Analog Stereo Duplex" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2930 +msgid "Digital Stereo Duplex (IEC958)" +msgstr "" diff --git a/po/hi.po b/po/hi.po new file mode 100644 index 0000000..2e313ba --- /dev/null +++ b/po/hi.po @@ -0,0 +1,2577 @@ +# translation of pulseaudio.master-tx.po to Hindi +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Rajesh Ranjan , 2009. +msgid "" +msgstr "" +"Project-Id-Version: pulseaudio.master-tx\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-09-29 23:47+0200\n" +"PO-Revision-Date: 2009-09-21 16:29+0530\n" +"Last-Translator: Rajesh Ranjan \n" +"Language-Team: Hindi \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=2; plural=(n!=1);\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" + +#: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629 +#, c-format +msgid "%s %s" +msgstr "%s %s" + +#: ../src/modules/alsa/alsa-util.c:1106 +#, c-format +msgid "" +"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu " +"ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_avail() ने एक मान दिया जो अप्रत्याशित रूप से बड़ा है: %lu बाइट (%lu ms).\n" +"अधिक संभव है कि यह ALSA ड्राइवर '%s' में एक बग है. इस मुद्दे को ALSA डेवलेपर को रिपोर्ट " +"करें." + +#: ../src/modules/alsa/alsa-util.c:1147 +#, c-format +msgid "" +"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%" +"lu ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_delay() ने एक मान दिया जो अप्रत्याशित रूप से बड़ा है: %li बाइट (%s%lu ms).\n" +"अधिक संभव है कि यह ALSA ड्राइवर '%s' में एक बग है. इस मुद्दे को ALSA डेवलेपर को रिपोर्ट " +"करें." + +#: ../src/modules/alsa/alsa-util.c:1194 +#, c-format +msgid "" +"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes " +"(%lu ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_mmap_begin() ने एक मान दिया जो अप्रत्याशित रूप से बड़ा है: %lu बाइट (%lu " +"ms).\n" +"अधिक संभव है कि यह ALSA ड्राइवर '%s' में एक बग है. इस मुद्दे को ALSA डेवलेपर को रिपोर्ट " +"करें." + +#: ../src/modules/module-always-sink.c:39 +msgid "Always keeps at least one sink loaded even if it's a null one" +msgstr "हमेशा कम से मक एक सिंक को लोडेड रखें हालांकि यह एक रिक्त है" + +#: ../src/modules/module-always-sink.c:83 +msgid "Dummy Output" +msgstr "डमी आउटपुट" + +#: ../src/modules/module-ladspa-sink.c:49 +msgid "Virtual LADSPA sink" +msgstr "वर्चुअल LADSPA सिंक" + +#: ../src/modules/module-ladspa-sink.c:53 +msgid "" +"sink_name= sink_properties= " +"master= format= rate= " +"channels= channel_map= plugin= label= control=" +msgstr "" +"sink_name= sink_properties= " +"master= format= rate= " +"channels= channel_map= plugin= label= control=" + +#: ../src/modules/module-null-sink.c:55 +msgid "Clocked NULL sink" +msgstr "क्लॉक्ड रिक्त सिंक" + +#: ../src/modules/module-null-sink.c:291 +msgid "Null Output" +msgstr "रिक्त आउटपुट" + +#: ../src/pulsecore/sink.c:2613 +msgid "Internal Audio" +msgstr "आंतरिक ऑडियो" + +#: ../src/pulsecore/sink.c:2618 +msgid "Modem" +msgstr "मॉडेम" + +#: ../src/daemon/ltdl-bind-now.c:124 +msgid "Failed to find original lt_dlopen loader." +msgstr "मौलिक ltdlopen लोडर ढूँढ़ने में विफल (_d)." + +#: ../src/daemon/ltdl-bind-now.c:129 +msgid "Failed to allocate new dl loader." +msgstr "नया dl लोडर आबंटित करने में विफल." + +#: ../src/daemon/ltdl-bind-now.c:142 +msgid "Failed to add bind-now-loader." +msgstr "bind-now-loader जोड़ने में विफल." + +#: ../src/daemon/main.c:141 +#, c-format +msgid "Got signal %s." +msgstr "%s संकेत पाया." + +#: ../src/daemon/main.c:168 +msgid "Exiting." +msgstr "बाहर हो रहा है." + +#: ../src/daemon/main.c:186 +#, c-format +msgid "Failed to find user '%s'." +msgstr "'%s' उपयोक्ता ढूंढ़ने में विफल." + +#: ../src/daemon/main.c:191 +#, c-format +msgid "Failed to find group '%s'." +msgstr "'%s' समूह ढूंढ़ने में विफल." + +#: ../src/daemon/main.c:195 +#, c-format +msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)." +msgstr "'%s' (UID %lu) उपयोक्ता व '%s' (GID %lu) समूह पाया." + +#: ../src/daemon/main.c:200 +#, c-format +msgid "GID of user '%s' and of group '%s' don't match." +msgstr "'%s' उपयोक्ता और '%s' समूह का GID मेल नहीं खाता है" + +#: ../src/daemon/main.c:205 +#, c-format +msgid "Home directory of user '%s' is not '%s', ignoring." +msgstr "'%s' उपयोक्ता की घर निर्देशिका '%s' नहीं है, अनदेखा कर रहा है." + +#: ../src/daemon/main.c:208 ../src/daemon/main.c:213 +#, c-format +msgid "Failed to create '%s': %s" +msgstr "'%s' बनाने में विफल: %s" + +#: ../src/daemon/main.c:220 +#, c-format +msgid "Failed to change group list: %s" +msgstr "समूह सूची पाने में विफल: %s" + +#: ../src/daemon/main.c:236 +#, c-format +msgid "Failed to change GID: %s" +msgstr "GID बदलने में विफल: %s" + +#: ../src/daemon/main.c:252 +#, c-format +msgid "Failed to change UID: %s" +msgstr "UID बदलने में विफल: %s" + +#: ../src/daemon/main.c:271 +msgid "Successfully dropped root privileges." +msgstr "रूट अधिकार सफलतापूर्वक छोड़ा." + +#: ../src/daemon/main.c:279 +msgid "System wide mode unsupported on this platform." +msgstr "इस प्लैटफॉर्म पर असमर्थित तंत्र व्यापक विधि." + +#: ../src/daemon/main.c:297 +#, c-format +msgid "setrlimit(%s, (%u, %u)) failed: %s" +msgstr "setrlimit(%s, (%u, %u)) विफल: %s" + +#: ../src/daemon/main.c:474 +msgid "Failed to parse command line." +msgstr "कमांड लाइन विश्लेषण में विफल." + +#: ../src/daemon/main.c:541 +msgid "Daemon not running" +msgstr "डेमॉन नहीं कार्यशील" + +#: ../src/daemon/main.c:543 +#, c-format +msgid "Daemon running as PID %u" +msgstr "डेमॉन बतौर PID %u चल रहा है" + +#: ../src/daemon/main.c:553 +#, c-format +msgid "Failed to kill daemon: %s" +msgstr "डेमॉन हटाने में विफल: %s" + +#: ../src/daemon/main.c:571 +msgid "" +"This program is not intended to be run as root (unless --system is " +"specified)." +msgstr "" +"यह प्रोग्राम बतौर रूट चलाने के लिए इच्छित नहीं है (unless --system is specified)." + +#: ../src/daemon/main.c:573 +msgid "Root privileges required." +msgstr "रूट अधिकार जरूरी." + +#: ../src/daemon/main.c:578 +msgid "--start not supported for system instances." +msgstr "--start not supported for system instances." + +#: ../src/daemon/main.c:583 +msgid "Running in system mode, but --disallow-exit not set!" +msgstr "तंत्र मोड में चल रहा है, लेकिन --disallow-exit सेट नहीं!" + +#: ../src/daemon/main.c:586 +msgid "Running in system mode, but --disallow-module-loading not set!" +msgstr "तंत्र मोड में चल रहा है, लेकिन --disallow-module-loading सेट नहीं!" + +#: ../src/daemon/main.c:589 +msgid "Running in system mode, forcibly disabling SHM mode!" +msgstr "तंत्र मोड में चल रहा है, SHM मोड बाध्य रूप से निष्क्रिय!" + +#: ../src/daemon/main.c:594 +msgid "Running in system mode, forcibly disabling exit idle time!" +msgstr "तंत्र मोड में चल रहा है, निकास निष्क्रिय समय बाध्य रूप से निष्क्रिय!" + +#: ../src/daemon/main.c:621 +msgid "Failed to acquire stdio." +msgstr "stdio पाने में विफल." + +#: ../src/daemon/main.c:627 +#, c-format +msgid "pipe failed: %s" +msgstr "पाइप विफल: %s" + +#: ../src/daemon/main.c:632 +#, c-format +msgid "fork() failed: %s" +msgstr "fork() विफल: %s" + +#: ../src/daemon/main.c:646 ../src/utils/pacat.c:508 +#, c-format +msgid "read() failed: %s" +msgstr "read() विफल: %s" + +#: ../src/daemon/main.c:652 +msgid "Daemon startup failed." +msgstr "डेमॉन आरंभ विफल." + +#: ../src/daemon/main.c:654 +msgid "Daemon startup successful." +msgstr "डेमॉन आरंभ सफल." + +#: ../src/daemon/main.c:731 +#, c-format +msgid "This is PulseAudio %s" +msgstr "यह पल्सऑडियो %s है." + +#: ../src/daemon/main.c:732 +#, c-format +msgid "Compilation host: %s" +msgstr "Compilation host: %s" + +#: ../src/daemon/main.c:733 +#, c-format +msgid "Compilation CFLAGS: %s" +msgstr "Compilation CFLAGS: %s" + +#: ../src/daemon/main.c:736 +#, c-format +msgid "Running on host: %s" +msgstr "मेजबान पर चल रहा है: %s" + +#: ../src/daemon/main.c:739 +#, c-format +msgid "Found %u CPUs." +msgstr "%u CPU पाया." + +#: ../src/daemon/main.c:741 +#, c-format +msgid "Page size is %lu bytes" +msgstr "पृष्ठ आकार %lu बाइट है." + +#: ../src/daemon/main.c:744 +msgid "Compiled with Valgrind support: yes" +msgstr "वेलग्रिंड समर्थन से कंपाइल: हाँ" + +#: ../src/daemon/main.c:746 +msgid "Compiled with Valgrind support: no" +msgstr "वेलग्रिंड समर्थन से कंपाइल: नहीं" + +#: ../src/daemon/main.c:749 +#, c-format +msgid "Running in valgrind mode: %s" +msgstr "वेलग्रिंड विधि में चल रहा है: %s" + +#: ../src/daemon/main.c:752 +msgid "Optimized build: yes" +msgstr "अनुकूलित बिल्ड: हाँ" + +#: ../src/daemon/main.c:754 +msgid "Optimized build: no" +msgstr "अनुकूलित बिल्ड: नहीं" + +#: ../src/daemon/main.c:758 +msgid "NDEBUG defined, all asserts disabled." +msgstr "NDEBUG परिभाषित, सभी निष्क्रिय." + +#: ../src/daemon/main.c:760 +msgid "FASTPATH defined, only fast path asserts disabled." +msgstr "FASTPATH परिभाषित, केव तेज पथ एसर्ट निष्क्रिय." + +#: ../src/daemon/main.c:762 +msgid "All asserts enabled." +msgstr "सभी एसर्ट सक्षम." + +#: ../src/daemon/main.c:766 +msgid "Failed to get machine ID" +msgstr "मशीन ID पाने में विफल" + +#: ../src/daemon/main.c:769 +#, c-format +msgid "Machine ID is %s." +msgstr "मशीन ID %s है." + +#: ../src/daemon/main.c:773 +#, c-format +msgid "Session ID is %s." +msgstr "सत्र ID %s है." + +#: ../src/daemon/main.c:779 +#, c-format +msgid "Using runtime directory %s." +msgstr "रनटाइम निर्देशिका %s का प्रयोग कर रहा है." + +#: ../src/daemon/main.c:784 +#, c-format +msgid "Using state directory %s." +msgstr "स्टेट निर्देशिका %s का प्रयोग कर रहा है." + +#: ../src/daemon/main.c:787 +#, c-format +msgid "Using modules directory %s." +msgstr "मॉड्यूल निर्देशिका %s का प्रयोग कर रहा है." + +#: ../src/daemon/main.c:789 +#, c-format +msgid "Running in system mode: %s" +msgstr "तंत्र मोड में चल रहा है: %s" + +#: ../src/daemon/main.c:792 +msgid "" +"OK, so you are running PA in system mode. Please note that you most likely " +"shouldn't be doing that.\n" +"If you do it nonetheless then it's your own fault if things don't work as " +"expected.\n" +"Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an " +"explanation why system mode is usually a bad idea." +msgstr "" +"तो आप PA तंत्र मोड में चला रहे हैं. कृपया नोट करें कि आपको ऐसा नहीं करना चाहिए.\n" +"यदि आप इसे करते हैं तो यह आपकी गलती है यदि कुछ अप्रत्याशित होता है.\n" +"कृपया http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode को पढ़ें जानने के लिए " +"कि क्यों तंत्र मोड एक बढ़िया विचार नहीं है." + +#: ../src/daemon/main.c:809 +msgid "pa_pid_file_create() failed." +msgstr "pa_pid_file_create() विफल." + +#: ../src/daemon/main.c:819 +msgid "Fresh high-resolution timers available! Bon appetit!" +msgstr "ताज़ा उच्च विभेदन टाइमर उपलब्ध! आनंद लें!" + +#: ../src/daemon/main.c:821 +msgid "" +"Dude, your kernel stinks! The chef's recommendation today is Linux with high-" +"resolution timers enabled!" +msgstr "" +"आपका कर्नेल बुरी स्थिति में है! सलाह है कि उच्च विभेदन युक्त लिनक्स सक्रिय किया जाना चाहिए!" + +#: ../src/daemon/main.c:844 +msgid "pa_core_new() failed." +msgstr "pa_core_new() विफल." + +#: ../src/daemon/main.c:904 +msgid "Failed to initialize daemon." +msgstr "डेमॉन आरंभ करने में विफल." + +#: ../src/daemon/main.c:909 +msgid "Daemon startup without any loaded modules, refusing to work." +msgstr "बिना लोड मॉड्यूल के डेमॉन आरंभ, काम करने से अस्वीकार कर रहा है." + +#: ../src/daemon/main.c:926 +msgid "Daemon startup complete." +msgstr "डेमॉन आरंभन पूर्ण." + +#: ../src/daemon/main.c:932 +msgid "Daemon shutdown initiated." +msgstr "डेमॉन बन्द किया जाना आरंभ." + +#: ../src/daemon/main.c:954 +msgid "Daemon terminated." +msgstr "डेमॉन अवरोधित." + +#: ../src/daemon/cmdline.c:115 +#, c-format +msgid "" +"%s [options]\n" +"\n" +"COMMANDS:\n" +" -h, --help Show this help\n" +" --version Show version\n" +" --dump-conf Dump default configuration\n" +" --dump-modules Dump list of available modules\n" +" --dump-resample-methods Dump available resample methods\n" +" --cleanup-shm Cleanup stale shared memory " +"segments\n" +" --start Start the daemon if it is not " +"running\n" +" -k --kill Kill a running daemon\n" +" --check Check for a running daemon (only " +"returns exit code)\n" +"\n" +"OPTIONS:\n" +" --system[=BOOL] Run as system-wide instance\n" +" -D, --daemonize[=BOOL] Daemonize after startup\n" +" --fail[=BOOL] Quit when startup fails\n" +" --high-priority[=BOOL] Try to set high nice level\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_NICE)\n" +" --realtime[=BOOL] Try to enable realtime scheduling\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_RTPRIO)\n" +" --disallow-module-loading[=BOOL] Disallow module user requested " +"module\n" +" loading/unloading after startup\n" +" --disallow-exit[=BOOL] Disallow user requested exit\n" +" --exit-idle-time=SECS Terminate the daemon when idle and " +"this\n" +" time passed\n" +" --module-idle-time=SECS Unload autoloaded modules when idle " +"and\n" +" this time passed\n" +" --scache-idle-time=SECS Unload autoloaded samples when idle " +"and\n" +" this time passed\n" +" --log-level[=LEVEL] Increase or set verbosity level\n" +" -v Increase the verbosity level\n" +" --log-target={auto,syslog,stderr} Specify the log target\n" +" --log-meta[=BOOL] Include code location in log " +"messages\n" +" --log-time[=BOOL] Include timestamps in log messages\n" +" --log-backtrace=FRAMES Include a backtrace in log messages\n" +" -p, --dl-search-path=PATH Set the search path for dynamic " +"shared\n" +" objects (plugins)\n" +" --resample-method=METHOD Use the specified resampling method\n" +" (See --dump-resample-methods for\n" +" possible values)\n" +" --use-pid-file[=BOOL] Create a PID file\n" +" --no-cpu-limit[=BOOL] Do not install CPU load limiter on\n" +" platforms that support it.\n" +" --disable-shm[=BOOL] Disable shared memory support.\n" +"\n" +"STARTUP SCRIPT:\n" +" -L, --load=\"MODULE ARGUMENTS\" Load the specified plugin module " +"with\n" +" the specified argument\n" +" -F, --file=FILENAME Run the specified script\n" +" -C Open a command line on the running " +"TTY\n" +" after startup\n" +"\n" +" -n Don't load default script file\n" +msgstr "" +"%s [options]\n" +"\n" +"COMMANDS:\n" +" -h, --help Show this help\n" +" --version Show version\n" +" --dump-conf Dump default configuration\n" +" --dump-modules Dump list of available modules\n" +" --dump-resample-methods Dump available resample methods\n" +" --cleanup-shm Cleanup stale shared memory " +"segments\n" +" --start Start the daemon if it is not " +"running\n" +" -k --kill Kill a running daemon\n" +" --check Check for a running daemon (only " +"returns exit code)\n" +"\n" +"OPTIONS:\n" +" --system[=BOOL] Run as system-wide instance\n" +" -D, --daemonize[=BOOL] Daemonize after startup\n" +" --fail[=BOOL] Quit when startup fails\n" +" --high-priority[=BOOL] Try to set high nice level\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_NICE)\n" +" --realtime[=BOOL] Try to enable realtime scheduling\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_RTPRIO)\n" +" --disallow-module-loading[=BOOL] Disallow module user requested " +"module\n" +" loading/unloading after startup\n" +" --disallow-exit[=BOOL] Disallow user requested exit\n" +" --exit-idle-time=SECS Terminate the daemon when idle and " +"this\n" +" time passed\n" +" --module-idle-time=SECS Unload autoloaded modules when idle " +"and\n" +" this time passed\n" +" --scache-idle-time=SECS Unload autoloaded samples when idle " +"and\n" +" this time passed\n" +" --log-level[=LEVEL] Increase or set verbosity level\n" +" -v Increase the verbosity level\n" +" --log-target={auto,syslog,stderr} Specify the log target\n" +" --log-meta[=BOOL] Include code location in log " +"messages\n" +" --log-time[=BOOL] Include timestamps in log messages\n" +" --log-backtrace=FRAMES Include a backtrace in log messages\n" +" -p, --dl-search-path=PATH Set the search path for dynamic " +"shared\n" +" objects (plugins)\n" +" --resample-method=METHOD Use the specified resampling method\n" +" (See --dump-resample-methods for\n" +" possible values)\n" +" --use-pid-file[=BOOL] Create a PID file\n" +" --no-cpu-limit[=BOOL] Do not install CPU load limiter on\n" +" platforms that support it.\n" +" --disable-shm[=BOOL] Disable shared memory support.\n" +"\n" +"STARTUP SCRIPT:\n" +" -L, --load=\"MODULE ARGUMENTS\" Load the specified plugin module " +"with\n" +" the specified argument\n" +" -F, --file=FILENAME Run the specified script\n" +" -C Open a command line on the running " +"TTY\n" +" after startup\n" +"\n" +" -n Don't load default script file\n" + +#: ../src/daemon/cmdline.c:247 +msgid "--daemonize expects boolean argument" +msgstr "--daemonize के लिए बुलियन तर्क की आशा है" + +#: ../src/daemon/cmdline.c:254 +msgid "--fail expects boolean argument" +msgstr "--fail के लिए बुलियन तर्क की आशा है" + +#: ../src/daemon/cmdline.c:264 +msgid "" +"--log-level expects log level argument (either numeric in range 0..4 or one " +"of debug, info, notice, warn, error)." +msgstr "" +"--log-level expects log level argument (either numeric in range 0..4 or one " +"of debug, info, notice, warn, error)." + +#: ../src/daemon/cmdline.c:276 +msgid "--high-priority expects boolean argument" +msgstr "--high-priority के लिए बुलियन तर्क की आशा है" + +#: ../src/daemon/cmdline.c:283 +msgid "--realtime expects boolean argument" +msgstr "--realtime के लिए बुलियन तर्क की आशा है" + +#: ../src/daemon/cmdline.c:290 +msgid "--disallow-module-loading expects boolean argument" +msgstr "--disallow-module-loading के लिए बुलियन तर्क की आशा है" + +#: ../src/daemon/cmdline.c:297 +msgid "--disallow-exit expects boolean argument" +msgstr "--disallow-exit के लिए बुलियन तर्क की आशा है" + +#: ../src/daemon/cmdline.c:304 +msgid "--use-pid-file expects boolean argument" +msgstr "--use-pid-file के लिए बुलियन तर्क की आशा है" + +#: ../src/daemon/cmdline.c:321 +msgid "Invalid log target: use either 'syslog', 'stderr' or 'auto'." +msgstr "अवैध लॉग लक्ष्य: use either 'syslog', 'stderr' or 'auto'." + +#: ../src/daemon/cmdline.c:328 +msgid "--log-time expects boolean argument" +msgstr "--log-time के लिए बुलियन तर्क की आशा है" + +#: ../src/daemon/cmdline.c:335 +msgid "--log-meta expects boolean argument" +msgstr "--log-meta के लिए बुलियन तर्क की आशा है" + +#: ../src/daemon/cmdline.c:354 +#, c-format +msgid "Invalid resample method '%s'." +msgstr "अवैध पुनः प्रतिदर्श विधि '%s'." + +#: ../src/daemon/cmdline.c:361 +msgid "--system expects boolean argument" +msgstr "--system के लिए बुलियन तर्क की आशा है" + +#: ../src/daemon/cmdline.c:368 +msgid "--no-cpu-limit expects boolean argument" +msgstr "--no-cpu-limit के लिए बुलियन तर्क की आशा है" + +#: ../src/daemon/cmdline.c:375 +msgid "--disable-shm expects boolean argument" +msgstr "--disable-shm के लिए बुलियन तर्क की आशा है" + +#: ../src/daemon/dumpmodules.c:60 +#, c-format +msgid "Name: %s\n" +msgstr "नाम: %s\n" + +#: ../src/daemon/dumpmodules.c:63 +#, c-format +msgid "No module information available\n" +msgstr "कोई मॉड्यूल सूचना उपलब्ध नहीं\n" + +#: ../src/daemon/dumpmodules.c:66 +#, c-format +msgid "Version: %s\n" +msgstr "संस्करण: %s\n" + +#: ../src/daemon/dumpmodules.c:68 +#, c-format +msgid "Description: %s\n" +msgstr "विवरण: %s\n" + +#: ../src/daemon/dumpmodules.c:70 +#, c-format +msgid "Author: %s\n" +msgstr "लेखक: %s\n" + +#: ../src/daemon/dumpmodules.c:72 +#, c-format +msgid "Usage: %s\n" +msgstr "उपयोग: %s\n" + +#: ../src/daemon/dumpmodules.c:73 +#, c-format +msgid "Load Once: %s\n" +msgstr "एक बार लोड करें: %s\n" + +#: ../src/daemon/dumpmodules.c:75 +#, c-format +msgid "DEPRECATION WARNING: %s\n" +msgstr "अवमूल्यन चेतावनी: %s\n" + +#: ../src/daemon/dumpmodules.c:79 +#, c-format +msgid "Path: %s\n" +msgstr "पथ: %s\n" + +#: ../src/daemon/daemon-conf.c:232 +#, c-format +msgid "[%s:%u] Invalid log target '%s'." +msgstr "[%s:%u] अवैध लॉग लक्ष्य '%s'." + +#: ../src/daemon/daemon-conf.c:248 +#, c-format +msgid "[%s:%u] Invalid log level '%s'." +msgstr "[%s:%u] अवैध लॉग स्तर '%s'." + +#: ../src/daemon/daemon-conf.c:264 +#, c-format +msgid "[%s:%u] Invalid resample method '%s'." +msgstr "[%s:%u] अवैध पुनः नमूना विधि '%s'." + +#: ../src/daemon/daemon-conf.c:287 +#, c-format +msgid "[%s:%u] Invalid rlimit '%s'." +msgstr "[%s:%u] अवैध rlimit '%s'." + +#: ../src/daemon/daemon-conf.c:294 +#, c-format +msgid "[%s:%u] rlimit not supported on this platform." +msgstr "[%s:%u] rlimit इस प्लेटफॉर्म पर समर्थित नहीं." + +#: ../src/daemon/daemon-conf.c:310 +#, c-format +msgid "[%s:%u] Invalid sample format '%s'." +msgstr "[%s:%u] अवैध प्रतिदर्श प्रारूप '%s'." + +#: ../src/daemon/daemon-conf.c:328 +#, c-format +msgid "[%s:%u] Invalid sample rate '%s'." +msgstr "[%s:%u] अवैध प्रतिदर्श दर '%s'." + +#: ../src/daemon/daemon-conf.c:352 +#, c-format +msgid "[%s:%u] Invalid sample channels '%s'." +msgstr "[%s:%u] अवैध प्रतिदर्श चैनल '%s'." + +#: ../src/daemon/daemon-conf.c:370 +#, c-format +msgid "[%s:%u] Invalid channel map '%s'." +msgstr "[%s:%u] अवैध चैनल मानचित्र '%s'." + +#: ../src/daemon/daemon-conf.c:388 +#, c-format +msgid "[%s:%u] Invalid number of fragments '%s'." +msgstr "[%s:%u] टुकड़े '%s' की अवैध संख्या." + +#: ../src/daemon/daemon-conf.c:406 +#, c-format +msgid "[%s:%u] Invalid fragment size '%s'." +msgstr "[%s:%u] अवैध खंड आकार '%s'." + +#: ../src/daemon/daemon-conf.c:424 +#, c-format +msgid "[%s:%u] Invalid nice level '%s'." +msgstr "[%s:%u] अवैध नाइस स्तर '%s'." + +#: ../src/daemon/daemon-conf.c:546 +#, c-format +msgid "Failed to open configuration file: %s" +msgstr "विन्यास फ़ाइल खोलने में विफल: %s" + +#: ../src/daemon/daemon-conf.c:562 +msgid "" +"The specified default channel map has a different number of channels than " +"the specified default number of channels." +msgstr "" +"निर्दिष्ट तयशुदा चैनल मानचित्र के पास चैनल की भिन्न संख्या है चैनल की तयशुदा निर्दिष्ट संख्या " +"के बनिस्पत." + +#: ../src/daemon/daemon-conf.c:638 +#, c-format +msgid "### Read from configuration file: %s ###\n" +msgstr "### विन्यास फ़ाइल से पढ़ें: %s ###\n" + +#: ../src/daemon/caps.c:62 +msgid "Cleaning up privileges." +msgstr "अधिकार छोड़ रहा है." + +#: ../src/daemon/pulseaudio.desktop.in.h:1 +msgid "PulseAudio Sound System" +msgstr "पल्सऑडियो ध्वनि तंत्र" + +#: ../src/daemon/pulseaudio.desktop.in.h:2 +msgid "Start the PulseAudio Sound System" +msgstr "पल्सऑडियो ध्वनि तंत्र प्रारंभ करें" + +#: ../src/pulse/channelmap.c:105 ../src/pulse/channelmap.c:757 +msgid "Mono" +msgstr "मोनो" + +#: ../src/pulse/channelmap.c:107 +msgid "Front Center" +msgstr "अग्र केंद्र" + +#: ../src/pulse/channelmap.c:108 +msgid "Front Left" +msgstr "अग्र बायाँ" + +#: ../src/pulse/channelmap.c:109 +msgid "Front Right" +msgstr "अग्र दाहिना" + +#: ../src/pulse/channelmap.c:111 +msgid "Rear Center" +msgstr "पश्च केंद्र" + +#: ../src/pulse/channelmap.c:112 +msgid "Rear Left" +msgstr "पश्च बायां" + +#: ../src/pulse/channelmap.c:113 +msgid "Rear Right" +msgstr "पश्च दाहिना" + +#: ../src/pulse/channelmap.c:115 +msgid "Low Frequency Emmiter" +msgstr "निम्न आवृत्ति निकासकर्ता" + +#: ../src/pulse/channelmap.c:117 +msgid "Front Left-of-center" +msgstr "केंद्र का अग्र वाम" + +#: ../src/pulse/channelmap.c:118 +msgid "Front Right-of-center" +msgstr "केंद्र का अग्र दक्षिण" + +#: ../src/pulse/channelmap.c:120 +msgid "Side Left" +msgstr "किनारा वाम" + +#: ../src/pulse/channelmap.c:121 +msgid "Side Right" +msgstr "किनारा दायाँ" + +#: ../src/pulse/channelmap.c:123 +msgid "Auxiliary 0" +msgstr "सहायक 0" + +#: ../src/pulse/channelmap.c:124 +msgid "Auxiliary 1" +msgstr "सहायक 1" + +#: ../src/pulse/channelmap.c:125 +msgid "Auxiliary 2" +msgstr "सहायक 2" + +#: ../src/pulse/channelmap.c:126 +msgid "Auxiliary 3" +msgstr "सहायक 3" + +#: ../src/pulse/channelmap.c:127 +msgid "Auxiliary 4" +msgstr "सहायक 4" + +#: ../src/pulse/channelmap.c:128 +msgid "Auxiliary 5" +msgstr "सहायक 5" + +#: ../src/pulse/channelmap.c:129 +msgid "Auxiliary 6" +msgstr "सहायक 6" + +#: ../src/pulse/channelmap.c:130 +msgid "Auxiliary 7" +msgstr "सहायक 7" + +#: ../src/pulse/channelmap.c:131 +msgid "Auxiliary 8" +msgstr "सहायक 8" + +#: ../src/pulse/channelmap.c:132 +msgid "Auxiliary 9" +msgstr "सहायक 9" + +#: ../src/pulse/channelmap.c:133 +msgid "Auxiliary 10" +msgstr "सहायक 10" + +#: ../src/pulse/channelmap.c:134 +msgid "Auxiliary 11" +msgstr "सहायक 11" + +#: ../src/pulse/channelmap.c:135 +msgid "Auxiliary 12" +msgstr "सहायक 12" + +#: ../src/pulse/channelmap.c:136 +msgid "Auxiliary 13" +msgstr "सहायक 13" + +#: ../src/pulse/channelmap.c:137 +msgid "Auxiliary 14" +msgstr "सहायक 14" + +#: ../src/pulse/channelmap.c:138 +msgid "Auxiliary 15" +msgstr "सहायक 15" + +#: ../src/pulse/channelmap.c:139 +msgid "Auxiliary 16" +msgstr "सहायक 16" + +#: ../src/pulse/channelmap.c:140 +msgid "Auxiliary 17" +msgstr "सहायक 17" + +#: ../src/pulse/channelmap.c:141 +msgid "Auxiliary 18" +msgstr "सहायक 18" + +#: ../src/pulse/channelmap.c:142 +msgid "Auxiliary 19" +msgstr "सहायक 19" + +#: ../src/pulse/channelmap.c:143 +msgid "Auxiliary 20" +msgstr "सहायक 20" + +#: ../src/pulse/channelmap.c:144 +msgid "Auxiliary 21" +msgstr "सहायक 21" + +#: ../src/pulse/channelmap.c:145 +msgid "Auxiliary 22" +msgstr "सहायक 22" + +#: ../src/pulse/channelmap.c:146 +msgid "Auxiliary 23" +msgstr "सहायक 23" + +#: ../src/pulse/channelmap.c:147 +msgid "Auxiliary 24" +msgstr "सहायक 24" + +#: ../src/pulse/channelmap.c:148 +msgid "Auxiliary 25" +msgstr "सहायक 25" + +#: ../src/pulse/channelmap.c:149 +msgid "Auxiliary 26" +msgstr "सहायक 26" + +#: ../src/pulse/channelmap.c:150 +msgid "Auxiliary 27" +msgstr "सहायक 27" + +#: ../src/pulse/channelmap.c:151 +msgid "Auxiliary 28" +msgstr "सहायक 28" + +#: ../src/pulse/channelmap.c:152 +msgid "Auxiliary 29" +msgstr "सहायक 29" + +#: ../src/pulse/channelmap.c:153 +msgid "Auxiliary 30" +msgstr "सहायक 30" + +#: ../src/pulse/channelmap.c:154 +msgid "Auxiliary 31" +msgstr "सहायक 31" + +#: ../src/pulse/channelmap.c:156 +msgid "Top Center" +msgstr "शीर्ष केंद्र" + +#: ../src/pulse/channelmap.c:158 +msgid "Top Front Center" +msgstr "शीर्ष अग्र केंद्र" + +#: ../src/pulse/channelmap.c:159 +msgid "Top Front Left" +msgstr "शीर्ष अग्र वाम" + +#: ../src/pulse/channelmap.c:160 +msgid "Top Front Right" +msgstr "ऊपर अग्र दायाँ" + +#: ../src/pulse/channelmap.c:162 +msgid "Top Rear Center" +msgstr "ऊपर पश्च केंद्र" + +#: ../src/pulse/channelmap.c:163 +msgid "Top Rear Left" +msgstr "ऊपर पश्च बायाँ" + +#: ../src/pulse/channelmap.c:164 +msgid "Top Rear Right" +msgstr "ऊपर पश्च दायाँ" + +#: ../src/pulse/channelmap.c:484 ../src/pulse/sample.c:170 +#: ../src/pulse/volume.c:295 ../src/pulse/volume.c:321 +#: ../src/pulse/volume.c:341 ../src/pulse/volume.c:371 +msgid "(invalid)" +msgstr "(अवैध)" + +#: ../src/pulse/channelmap.c:761 +msgid "Stereo" +msgstr "स्टीरियो" + +#: ../src/pulse/channelmap.c:766 +msgid "Surround 4.0" +msgstr "सर्राउंड 4.0" + +#: ../src/pulse/channelmap.c:772 +msgid "Surround 4.1" +msgstr "सर्राउंड 4.1" + +#: ../src/pulse/channelmap.c:778 +msgid "Surround 5.0" +msgstr "सर्राउंड 5.0" + +#: ../src/pulse/channelmap.c:784 +msgid "Surround 5.1" +msgstr "सर्राउंड 5.1" + +#: ../src/pulse/channelmap.c:791 +msgid "Surround 7.1" +msgstr "सर्राउंड 7.1" + +#: ../src/pulse/error.c:43 +msgid "OK" +msgstr "ठीक" + +#: ../src/pulse/error.c:44 +msgid "Access denied" +msgstr "पहुँच मनाही" + +#: ../src/pulse/error.c:45 +msgid "Unknown command" +msgstr "अनजान कमांड" + +#: ../src/pulse/error.c:46 +msgid "Invalid argument" +msgstr "अवैध तर्क" + +#: ../src/pulse/error.c:47 +msgid "Entity exists" +msgstr "एंटिटी मौजूद" + +#: ../src/pulse/error.c:48 +msgid "No such entity" +msgstr "कोई ऐसी एंटिटी नहीं" + +#: ../src/pulse/error.c:49 +msgid "Connection refused" +msgstr "कनेक्शन अस्वीकृत" + +#: ../src/pulse/error.c:50 +msgid "Protocol error" +msgstr "प्रोटोकाल त्रुटि" + +#: ../src/pulse/error.c:51 +msgid "Timeout" +msgstr "समय ख़त्म" + +#: ../src/pulse/error.c:52 +msgid "No authorization key" +msgstr "कोई प्राधिकरण कुंजी नहीं" + +#: ../src/pulse/error.c:53 +msgid "Internal error" +msgstr "आंतरिक त्रुटि" + +#: ../src/pulse/error.c:54 +msgid "Connection terminated" +msgstr "कनेक्शन समाप्त" + +#: ../src/pulse/error.c:55 +msgid "Entity killed" +msgstr "एंटिटी मृत" + +#: ../src/pulse/error.c:56 +msgid "Invalid server" +msgstr "अवैध सर्वर" + +#: ../src/pulse/error.c:57 +msgid "Module initalization failed" +msgstr "मॉडयूल आरंभीकरण असफल" + +#: ../src/pulse/error.c:58 +msgid "Bad state" +msgstr "बुरी स्थिति" + +#: ../src/pulse/error.c:59 +msgid "No data" +msgstr "कोई आँकड़ा नहीं" + +#: ../src/pulse/error.c:60 +msgid "Incompatible protocol version" +msgstr "बेमेल प्रोटोकॉल संस्करण" + +#: ../src/pulse/error.c:61 +msgid "Too large" +msgstr "काफी बड़ा" + +#: ../src/pulse/error.c:62 +msgid "Not supported" +msgstr "समर्थित नहीं है" + +#: ../src/pulse/error.c:63 +msgid "Unknown error code" +msgstr "अज्ञात त्रुटि कोड" + +#: ../src/pulse/error.c:64 +msgid "No such extension" +msgstr "कोई ऐसा विस्तार नहीं" + +#: ../src/pulse/error.c:65 +msgid "Obsolete functionality" +msgstr "पुरानी प्रकार्यात्मकता" + +#: ../src/pulse/error.c:66 +msgid "Missing implementation" +msgstr "अनुपस्थित कार्यान्वयन" + +#: ../src/pulse/error.c:67 +msgid "Client forked" +msgstr "क्लाएंट विभाजित" + +#: ../src/pulse/error.c:68 +msgid "Input/Output error" +msgstr "इनपुट/आउटपुट त्रुटि" + +#: ../src/pulse/error.c:69 +msgid "Device or resource busy" +msgstr "युक्ति या संसाधन व्यस्त" + +#: ../src/pulse/sample.c:172 +#, c-format +msgid "%s %uch %uHz" +msgstr "%s %uch %uHz" + +#: ../src/pulse/sample.c:184 +#, c-format +msgid "%0.1f GiB" +msgstr "%0.1f GiB" + +#: ../src/pulse/sample.c:186 +#, c-format +msgid "%0.1f MiB" +msgstr "%0.1f MiB" + +#: ../src/pulse/sample.c:188 +#, c-format +msgid "%0.1f KiB" +msgstr "%0.1f KiB" + +#: ../src/pulse/sample.c:190 +#, c-format +msgid "%u B" +msgstr "%u B" + +#: ../src/pulse/client-conf-x11.c:55 ../src/utils/pax11publish.c:100 +msgid "XOpenDisplay() failed" +msgstr "XOpenDisplay() विफल" + +#: ../src/pulse/client-conf-x11.c:93 +msgid "Failed to parse cookie data" +msgstr "कुकी आंकड़ा के विश्लेषण में विफल" + +#: ../src/pulse/client-conf.c:111 +#, c-format +msgid "Failed to open configuration file '%s': %s" +msgstr "विन्यास फ़ाइल '%s' खोलने में विफल: %s" + +#: ../src/pulse/context.c:550 +msgid "No cookie loaded. Attempting to connect without." +msgstr "कोई कुकी नहीं लोड किया गया. इसके बिना कनेक्ट करने की कोशिश कर रहा हूँ." + +#: ../src/pulse/context.c:693 +#, c-format +msgid "fork(): %s" +msgstr "fork(): %s" + +#: ../src/pulse/context.c:748 +#, c-format +msgid "waitpid(): %s" +msgstr "waitpid(): %s" + +#: ../src/pulse/context.c:1438 +#, c-format +msgid "Received message for unknown extension '%s'" +msgstr "अज्ञात विस्तार '%s' के लिए संदेश प्राप्त" + +#: ../src/utils/pacat.c:108 +#, c-format +msgid "Failed to drain stream: %s" +msgstr "स्ट्रीम से खींचने में विफल: %s" + +#: ../src/utils/pacat.c:113 +msgid "Playback stream drained." +msgstr "प्लेबैक स्ट्रीम खत्म." + +#: ../src/utils/pacat.c:123 +msgid "Draining connection to server." +msgstr "सर्वर में कनेक्शन ले जा रहा है." + +#: ../src/utils/pacat.c:136 +#, c-format +msgid "pa_stream_drain(): %s" +msgstr "pa_stream_drain(): %s" + +#: ../src/utils/pacat.c:159 +#, c-format +msgid "pa_stream_write() failed: %s" +msgstr "pa_stream_write() विफल: %s" + +#: ../src/utils/pacat.c:197 +#, c-format +msgid "pa_stream_begin_write() failed: %s" +msgstr "pa_stream_begin_write() विफल: %s" + +#: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267 +#, c-format +msgid "pa_stream_peek() failed: %s" +msgstr "pa_stream_peek() विफल: %s" + +#: ../src/utils/pacat.c:307 +msgid "Stream successfully created." +msgstr "स्ट्रीम सफलतापूर्वक निर्मित." + +#: ../src/utils/pacat.c:310 +#, c-format +msgid "pa_stream_get_buffer_attr() failed: %s" +msgstr "pa_stream_get_buffer_attr() विफल: %s" + +#: ../src/utils/pacat.c:314 +#, c-format +msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u" +msgstr "बफ़र मेट्रिक्स: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u" + +#: ../src/utils/pacat.c:317 +#, c-format +msgid "Buffer metrics: maxlength=%u, fragsize=%u" +msgstr "बफ़र मेट्रिक्स: maxlength=%u, fragsize=%u" + +#: ../src/utils/pacat.c:321 +#, c-format +msgid "Using sample spec '%s', channel map '%s'." +msgstr "नमूना स्पेक '%s' का प्रयोग, चैनल मैप '%s'." + +#: ../src/utils/pacat.c:325 +#, c-format +msgid "Connected to device %s (%u, %ssuspended)." +msgstr "युक्ति %s (%u, %ssuspended) से कनेक्टेड." + +#: ../src/utils/pacat.c:335 +#, c-format +msgid "Stream error: %s" +msgstr "स्ट्रीम त्रुटि: %s" + +#: ../src/utils/pacat.c:345 +#, c-format +msgid "Stream device suspended.%s" +msgstr "स्ट्रीम युक्ति स्थगित.%s " + +#: ../src/utils/pacat.c:347 +#, c-format +msgid "Stream device resumed.%s" +msgstr "स्ट्रीम युक्ति पुनर्बहाल.%s " + +#: ../src/utils/pacat.c:355 +#, c-format +msgid "Stream underrun.%s" +msgstr "स्ट्रीम अंडररन.%s " + +#: ../src/utils/pacat.c:362 +#, c-format +msgid "Stream overrun.%s" +msgstr "स्ट्रीम ओवररन.%s" + +#: ../src/utils/pacat.c:369 +#, c-format +msgid "Stream started.%s" +msgstr "स्ट्रीम आरंभ.%s" + +#: ../src/utils/pacat.c:376 +#, c-format +msgid "Stream moved to device %s (%u, %ssuspended).%s" +msgstr "स्ट्रीम युक्ति %s (%u, %ssuspended).%s में खिसकाया गया" + +#: ../src/utils/pacat.c:376 +msgid "not " +msgstr "नहीं " + +#: ../src/utils/pacat.c:383 +#, c-format +msgid "Stream buffer attributes changed.%s" +msgstr "स्ट्रीम बफ़र गुण परिवर्तित.%s " + +#: ../src/utils/pacat.c:415 +#, c-format +msgid "Connection established.%s" +msgstr "कनेक्शन स्थापित.%s " + +#: ../src/utils/pacat.c:418 +#, c-format +msgid "pa_stream_new() failed: %s" +msgstr "pa_stream_new() विफल: %s" + +#: ../src/utils/pacat.c:450 +#, c-format +msgid "pa_stream_connect_playback() failed: %s" +msgstr "pa_stream_connect_playback() विफल: %s" + +#: ../src/utils/pacat.c:456 +#, c-format +msgid "pa_stream_connect_record() failed: %s" +msgstr "pa_stream_connect_record() विफल: %s" + +#: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857 +#, c-format +msgid "Connection failure: %s" +msgstr "कनेक्शन विफल.%s" + +#: ../src/utils/pacat.c:503 +msgid "Got EOF." +msgstr "EOF पाया." + +#: ../src/utils/pacat.c:540 +#, c-format +msgid "write() failed: %s" +msgstr "write() विफल: %s" + +#: ../src/utils/pacat.c:561 +msgid "Got signal, exiting." +msgstr "संकेत पाया, निकल रहा है." + +#: ../src/utils/pacat.c:575 +#, c-format +msgid "Failed to get latency: %s" +msgstr "लेटेंसी पाने में विफल: %s" + +#: ../src/utils/pacat.c:580 +#, c-format +msgid "Time: %0.3f sec; Latency: %0.0f usec." +msgstr "समय: %0.3f सेकेंड; लैटेंसी: %0.0f usec." + +#: ../src/utils/pacat.c:599 +#, c-format +msgid "pa_stream_update_timing_info() failed: %s" +msgstr "pa_stream_update_timing_info() विफल: %s" + +#: ../src/utils/pacat.c:609 +#, c-format +msgid "" +"%s [options]\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -r, --record Create a connection for recording\n" +" -p, --playback Create a connection for playback\n" +"\n" +" -v, --verbose Enable verbose operations\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -d, --device=DEVICE The name of the sink/source to " +"connect to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" +" --stream-name=NAME How to call this stream on the " +"server\n" +" --volume=VOLUME Specify the initial (linear) volume " +"in range 0...65536\n" +" --rate=SAMPLERATE The sample rate in Hz (defaults to " +"44100)\n" +" --format=SAMPLEFORMAT The sample type, one of s16le, " +"s16be, u8, float32le,\n" +" float32be, ulaw, alaw, s32le, s32be, " +"s24le, s24be,\n" +" s24-32le, s24-32be (defaults to " +"s16ne)\n" +" --channels=CHANNELS The number of channels, 1 for mono, " +"2 for stereo\n" +" (defaults to 2)\n" +" --channel-map=CHANNELMAP Channel map to use instead of the " +"default\n" +" --fix-format Take the sample format from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-rate Take the sampling rate from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-channels Take the number of channels and the " +"channel map\n" +" from the sink the stream is being " +"connected to.\n" +" --no-remix Don't upmix or downmix channels.\n" +" --no-remap Map channels by index instead of " +"name.\n" +" --latency=BYTES Request the specified latency in " +"bytes.\n" +" --process-time=BYTES Request the specified process time " +"per request in bytes.\n" +" --property=PROPERTY=VALUE Set the specified property to the " +"specified value.\n" +" --raw Record/play raw PCM data.\n" +" --file-format=FFORMAT Record/play formatted PCM data.\n" +" --list-file-formats List available file formats.\n" +msgstr "" +"%s [options]\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -r, --record Create a connection for recording\n" +" -p, --playback Create a connection for playback\n" +"\n" +" -v, --verbose Enable verbose operations\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -d, --device=DEVICE The name of the sink/source to " +"connect to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" +" --stream-name=NAME How to call this stream on the " +"server\n" +" --volume=VOLUME Specify the initial (linear) volume " +"in range 0...65536\n" +" --rate=SAMPLERATE The sample rate in Hz (defaults to " +"44100)\n" +" --format=SAMPLEFORMAT The sample type, one of s16le, " +"s16be, u8, float32le,\n" +" float32be, ulaw, alaw, s32le, s32be, " +"s24le, s24be,\n" +" s24-32le, s24-32be (defaults to " +"s16ne)\n" +" --channels=CHANNELS The number of channels, 1 for mono, " +"2 for stereo\n" +" (defaults to 2)\n" +" --channel-map=CHANNELMAP Channel map to use instead of the " +"default\n" +" --fix-format Take the sample format from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-rate Take the sampling rate from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-channels Take the number of channels and the " +"channel map\n" +" from the sink the stream is being " +"connected to.\n" +" --no-remix Don't upmix or downmix channels.\n" +" --no-remap Map channels by index instead of " +"name.\n" +" --latency=BYTES Request the specified latency in " +"bytes.\n" +" --process-time=BYTES Request the specified process time " +"per request in bytes.\n" +" --property=PROPERTY=VALUE Set the specified property to the " +"specified value.\n" +" --raw Record/play raw PCM data.\n" +" --file-format=FFORMAT Record/play formatted PCM data.\n" +" --list-file-formats List available file formats.\n" + +#: ../src/utils/pacat.c:731 +#, c-format +msgid "" +"pacat %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pacat %s\n" +"लिबपल्स %s के साथ कंपाइल\n" +"लिबपल्स %s के साथ लिंक\n" + +#: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953 +#, c-format +msgid "Invalid client name '%s'" +msgstr "अवैध क्लाइंट नाम '%s'" + +#: ../src/utils/pacat.c:779 +#, c-format +msgid "Invalid stream name '%s'" +msgstr "अवैध स्ट्रीम नाम '%s'" + +#: ../src/utils/pacat.c:816 +#, c-format +msgid "Invalid channel map '%s'" +msgstr "अवैध चैनल मानचित्र '%s'" + +#: ../src/utils/pacat.c:845 +#, c-format +msgid "Invalid latency specification '%s'" +msgstr "अवैध लैटेंसी विनिर्दिष्टता '%s'" + +#: ../src/utils/pacat.c:852 +#, c-format +msgid "Invalid process time specification '%s'" +msgstr "अवैध प्रक्रिया समय विनिर्दिष्टता '%s'" + +#: ../src/utils/pacat.c:864 +#, c-format +msgid "Invalid property '%s'" +msgstr "अवैध गुण '%s'" + +#: ../src/utils/pacat.c:881 +#, c-format +msgid "Unknown file format %s." +msgstr "अज्ञात फ़ाइल प्रारूप %s." + +#: ../src/utils/pacat.c:900 +msgid "Invalid sample specification" +msgstr "अवैध नमूना विनिर्दिष्टता" + +#: ../src/utils/pacat.c:910 +#, c-format +msgid "open(): %s" +msgstr "open(): %s" + +#: ../src/utils/pacat.c:915 +#, c-format +msgid "dup2(): %s" +msgstr "dup2(): %s" + +#: ../src/utils/pacat.c:922 +msgid "Too many arguments." +msgstr "कई वितर्क." + +#: ../src/utils/pacat.c:933 +msgid "Failed to generate sample specification for file." +msgstr "फ़ाइल के लिए नमूना विनिर्दिष्टता पाने में विफल." + +#: ../src/utils/pacat.c:953 +msgid "Failed to open audio file." +msgstr "ध्वनि फ़ाइल खोलने में विफल." + +#: ../src/utils/pacat.c:959 +msgid "" +"Warning: specified sample specification will be overwritten with " +"specification from file." +msgstr "चेतावनी: निर्दिष्ट नमूना विनिर्दिष्टता को फ़ाइल की विनिर्दिष्टता से लिखा जाएगा." + +#: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997 +msgid "Failed to determine sample specification from file." +msgstr "फ़ाइल से नमूना विनिर्दिष्टता निर्धारित करने में विफल." + +#: ../src/utils/pacat.c:971 +msgid "Warning: Failed to determine channel map from file." +msgstr "चेतावनी: फ़ाइल से चैनल मैप पाने में विफल." + +#: ../src/utils/pacat.c:982 +msgid "Channel map doesn't match sample specification" +msgstr "चैनल मैप नमूना विनिर्दिष्टता से मेल नहीं खाता है" + +#: ../src/utils/pacat.c:993 +msgid "Warning: failed to write channel map to file." +msgstr "चेतावनी: फ़ाइल में चैनल मैप लिखने में विफल." + +#: ../src/utils/pacat.c:1008 +#, c-format +msgid "" +"Opening a %s stream with sample specification '%s' and channel map '%s'." +msgstr "किसी %s स्ट्रीम को किसी नमूना विनिर्दिष्ता '%s' और चैनल मैप '%s' से खोल रहा है." + +#: ../src/utils/pacat.c:1009 +msgid "recording" +msgstr "रिकार्डिंग" + +#: ../src/utils/pacat.c:1009 +msgid "playback" +msgstr "प्लेबैक" + +#: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267 +msgid "pa_mainloop_new() failed." +msgstr "pa_mainloop_new() विफल." + +#: ../src/utils/pacat.c:1054 +msgid "io_new() failed." +msgstr "io_new() विफल." + +#: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279 +msgid "pa_context_new() failed." +msgstr "pa_context_new() विफल." + +#: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285 +#, c-format +msgid "pa_context_connect() failed: %s" +msgstr "pa_context_connect() विफल: %s" + +#: ../src/utils/pacat.c:1075 +msgid "pa_context_rttime_new() failed." +msgstr "pa_context_rttime_new() विफल." + +#: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290 +msgid "pa_mainloop_run() failed." +msgstr "pa_mainloop_run() विफल." + +#: ../src/utils/pasuspender.c:81 +#, c-format +msgid "fork(): %s\n" +msgstr "fork(): %s\n" + +#: ../src/utils/pasuspender.c:92 +#, c-format +msgid "execvp(): %s\n" +msgstr "execvp(): %s\n" + +#: ../src/utils/pasuspender.c:109 +#, c-format +msgid "Failure to suspend: %s\n" +msgstr "स्थगन में विफल: %s\n" + +#: ../src/utils/pasuspender.c:124 +#, c-format +msgid "Failure to resume: %s\n" +msgstr "पुनर्बहाली में विफल: %s\n" + +#: ../src/utils/pasuspender.c:147 +#, c-format +msgid "WARNING: Sound server is not local, not suspending.\n" +msgstr "चेतावनी: ध्वनि सर्वर स्थानीय नहीं है, स्थगित नहीं कर रहा है.\n" + +#: ../src/utils/pasuspender.c:159 +#, c-format +msgid "Connection failure: %s\n" +msgstr "कनेक्शन विफल.%s \n" + +#: ../src/utils/pasuspender.c:176 +#, c-format +msgid "Got SIGINT, exiting.\n" +msgstr "SIGINT पाया, निकल रहा है.\n" + +#: ../src/utils/pasuspender.c:194 +#, c-format +msgid "WARNING: Child process terminated by signal %u\n" +msgstr "चेतावनी: संतति प्रक्रिया %u संकेत से रूका\n" + +#: ../src/utils/pasuspender.c:212 +#, c-format +msgid "" +"%s [options] ... \n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +"\n" +msgstr "" +"%s [options] ... \n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +"\n" + +#: ../src/utils/pasuspender.c:248 +#, c-format +msgid "" +"pasuspender %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pasuspender %s\n" +"लिबपल्स %s से कंपाइल\n" +"लिबपल्स %s से कड़ीबद्ध\n" + +#: ../src/utils/pasuspender.c:277 +#, c-format +msgid "pa_mainloop_new() failed.\n" +msgstr "pa_mainloop_new() विफल.\n" + +#: ../src/utils/pasuspender.c:290 +#, c-format +msgid "pa_context_new() failed.\n" +msgstr "pa_context_new() विफल.\n" + +#: ../src/utils/pasuspender.c:298 +#, c-format +msgid "pa_mainloop_run() failed.\n" +msgstr "pa_mainloop_run() विफल.\n" + +#: ../src/utils/pactl.c:135 +#, c-format +msgid "Failed to get statistics: %s" +msgstr "आंकड़े पाने में विफल: %s" + +#: ../src/utils/pactl.c:141 +#, c-format +msgid "Currently in use: %u blocks containing %s bytes total.\n" +msgstr "प्रयोग में मुद्रा: %u ब्लॉक %s बाइट कुल समाहित करता है.\n" + +#: ../src/utils/pactl.c:144 +#, c-format +msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n" +msgstr "संपूर्ण जीवनचक्र के दौरान आबंटित: %u ब्लॉक %s बाइट कुल को समाहित करता है.\n" + +#: ../src/utils/pactl.c:147 +#, c-format +msgid "Sample cache size: %s\n" +msgstr "नमूना कैश आकार: %s\n" + +#: ../src/utils/pactl.c:156 +#, c-format +msgid "Failed to get server information: %s" +msgstr "सर्वर सूचना पाने में विफल: %s" + +#: ../src/utils/pactl.c:164 +#, c-format +msgid "" +"User name: %s\n" +"Host Name: %s\n" +"Server Name: %s\n" +"Server Version: %s\n" +"Default Sample Specification: %s\n" +"Default Channel Map: %s\n" +"Default Sink: %s\n" +"Default Source: %s\n" +"Cookie: %08x\n" +msgstr "" +"उपयोक्ता नाम: %s\n" +"मेजबान नाम: %s\n" +"सर्वर नाम: %s\n" +"सर्वर संस्करण: %s\n" +"तयशुदा नमूना विनिर्दिष्टता: %s\n" +"तयशुदा चैनल मानचित्र: %s\n" +"तयशुदा सिंक: %s\n" +"तयशुदा स्रोत: %s\n" +"कुकी: %08x\n" + +#: ../src/utils/pactl.c:205 +#, c-format +msgid "Failed to get sink information: %s" +msgstr "सिंक सूचना पाने में विफल: %s" + +#: ../src/utils/pactl.c:221 +#, c-format +msgid "" +"Sink #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor Source: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Sink #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor Source: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360 +#, c-format +msgid "\tPorts:\n" +msgstr "\tPorts:\n" + +#: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366 +#, c-format +msgid "\tActive Port: %s\n" +msgstr "\tActive Port: %s\n" + +#: ../src/utils/pactl.c:297 +#, c-format +msgid "Failed to get source information: %s" +msgstr "स्रोत सूचना पाने में विफल: %s" + +#: ../src/utils/pactl.c:313 +#, c-format +msgid "" +"Source #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor of Sink: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Source #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor of Sink: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:345 ../src/utils/pactl.c:401 ../src/utils/pactl.c:436 +#: ../src/utils/pactl.c:473 ../src/utils/pactl.c:532 ../src/utils/pactl.c:533 +#: ../src/utils/pactl.c:543 ../src/utils/pactl.c:587 ../src/utils/pactl.c:588 +#: ../src/utils/pactl.c:594 ../src/utils/pactl.c:637 ../src/utils/pactl.c:638 +#: ../src/utils/pactl.c:645 +msgid "n/a" +msgstr "n/a" + +#: ../src/utils/pactl.c:375 +#, c-format +msgid "Failed to get module information: %s" +msgstr "मॉड्यूल सूचना पाने में विफल: %s" + +#: ../src/utils/pactl.c:393 +#, c-format +msgid "" +"Module #%u\n" +"\tName: %s\n" +"\tArgument: %s\n" +"\tUsage counter: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Module #%u\n" +"\tName: %s\n" +"\tArgument: %s\n" +"\tUsage counter: %s\n" +"\tProperties:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:412 +#, c-format +msgid "Failed to get client information: %s" +msgstr "क्लाइंट सूचना पाने में विफल: %s" + +#: ../src/utils/pactl.c:430 +#, c-format +msgid "" +"Client #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Client #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:447 +#, c-format +msgid "Failed to get card information: %s" +msgstr "कार्ड सूचना पाने में विफल: %s" + +#: ../src/utils/pactl.c:465 +#, c-format +msgid "" +"Card #%u\n" +"\tName: %s\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Card #%u\n" +"\tName: %s\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:479 +#, c-format +msgid "\tProfiles:\n" +msgstr "\tProfiles:\n" + +#: ../src/utils/pactl.c:485 +#, c-format +msgid "\tActive Profile: %s\n" +msgstr "\tActive Profile: %s\n" + +#: ../src/utils/pactl.c:496 +#, c-format +msgid "Failed to get sink input information: %s" +msgstr "सिंक इनपुट सूचना पाने में विफल: %s" + +#: ../src/utils/pactl.c:515 +#, c-format +msgid "" +"Sink Input #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSink: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tMute: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSink Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Sink Input #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSink: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tMute: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSink Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:554 +#, c-format +msgid "Failed to get source output information: %s" +msgstr "स्रोत आउटपुट सूचना पाने में विफल: %s" + +#: ../src/utils/pactl.c:574 +#, c-format +msgid "" +"Source Output #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSource: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSource Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Source Output #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSource: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSource Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:605 +#, c-format +msgid "Failed to get sample information: %s" +msgstr "नमूना सूचना पाने में विफल: %s" + +#: ../src/utils/pactl.c:623 +#, c-format +msgid "" +"Sample #%u\n" +"\tName: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tDuration: %0.1fs\n" +"\tSize: %s\n" +"\tLazy: %s\n" +"\tFilename: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Sample #%u\n" +"\tName: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tDuration: %0.1fs\n" +"\tSize: %s\n" +"\tLazy: %s\n" +"\tFilename: %s\n" +"\tProperties:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663 +#, c-format +msgid "Failure: %s" +msgstr "विफलता: %s" + +#: ../src/utils/pactl.c:687 +#, c-format +msgid "Failed to upload sample: %s" +msgstr "नमूना अफलोड करने में विफल: %s" + +#: ../src/utils/pactl.c:704 +msgid "Premature end of file" +msgstr "फ़ाइल का असामयिक अंत" + +#: ../src/utils/pactl.c:863 +msgid "Got SIGINT, exiting." +msgstr "SIGINT पाया, निकल रहा है." + +#: ../src/utils/pactl.c:869 +#, c-format +msgid "" +"%s [options] stat\n" +"%s [options] list\n" +"%s [options] exit\n" +"%s [options] upload-sample FILENAME [NAME]\n" +"%s [options] play-sample NAME [SINK]\n" +"%s [options] remove-sample NAME\n" +"%s [options] move-sink-input SINKINPUT SINK\n" +"%s [options] move-source-output SOURCEOUTPUT SOURCE\n" +"%s [options] load-module NAME [ARGS ...]\n" +"%s [options] unload-module MODULE\n" +"%s [options] suspend-sink SINK 1|0\n" +"%s [options] suspend-source SOURCE 1|0\n" +"%s [options] set-card-profile CARD PROFILE\n" +"%s [options] set-sink-port SINK PORT\n" +"%s [options] set-source-port SOURCE PORT\n" +"%s [options] set-sink-volume SINK VOLUME\n" +"%s [options] set-source-volume SOURCE VOLUME\n" +"%s [options] set-sink-input-volume SINKINPUT VOLUME\n" +"%s [options] set-sink-mute SINK 1|0\n" +"%s [options] set-source-mute SOURCE 1|0\n" +"%s [options] set-sink-input-mute SINKINPUT 1|0\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" +msgstr "" +"%s [options] stat\n" +"%s [options] list\n" +"%s [options] exit\n" +"%s [options] upload-sample FILENAME [NAME]\n" +"%s [options] play-sample NAME [SINK]\n" +"%s [options] remove-sample NAME\n" +"%s [options] move-sink-input SINKINPUT SINK\n" +"%s [options] move-source-output SOURCEOUTPUT SOURCE\n" +"%s [options] load-module NAME [ARGS ...]\n" +"%s [options] unload-module MODULE\n" +"%s [options] suspend-sink SINK 1|0\n" +"%s [options] suspend-source SOURCE 1|0\n" +"%s [options] set-card-profile CARD PROFILE\n" +"%s [options] set-sink-port SINK PORT\n" +"%s [options] set-source-port SOURCE PORT\n" +"%s [options] set-sink-volume SINK VOLUME\n" +"%s [options] set-source-volume SOURCE VOLUME\n" +"%s [options] set-sink-input-volume SINKINPUT VOLUME\n" +"%s [options] set-sink-mute SINK 1|0\n" +"%s [options] set-source-mute SOURCE 1|0\n" +"%s [options] set-sink-input-mute SINKINPUT 1|0\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" + +#: ../src/utils/pactl.c:933 +#, c-format +msgid "" +"pactl %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pactl %s\n" +"लिबपल्स %s से कंपाइल\n" +"लिबपल्स %s से कड़ीबद्ध\n" + +#: ../src/utils/pactl.c:979 +msgid "Please specify a sample file to load" +msgstr "लोड करने के लिए किसी नमूना फ़ाइल निर्दिष्ट करें" + +#: ../src/utils/pactl.c:992 +msgid "Failed to open sound file." +msgstr "ध्वनि फ़ाइल खोलने में विफल." + +#: ../src/utils/pactl.c:1004 +msgid "Warning: Failed to determine sample specification from file." +msgstr "%s स्ट्रीम को किसी नमूना विनिर्दिष्टता '%s' के साथ खोल रहा है." + +#: ../src/utils/pactl.c:1014 +msgid "You have to specify a sample name to play" +msgstr "आपको किसी नमूना नाम को बजाने के लिए निर्दिष्ट करना है" + +#: ../src/utils/pactl.c:1026 +msgid "You have to specify a sample name to remove" +msgstr "आपको किसी नमूना नाम को हटाने के लिए निर्दिष्ट करना है" + +#: ../src/utils/pactl.c:1035 +msgid "You have to specify a sink input index and a sink" +msgstr "आपको किसी सिंक इनपुट सूची और सिंक को निर्दिष्ट करना है" + +#: ../src/utils/pactl.c:1045 +msgid "You have to specify a source output index and a source" +msgstr "आपको किसी सिंक स्रोत आउटपुट और स्रोत को निर्दिष्ट करना है" + +#: ../src/utils/pactl.c:1060 +msgid "You have to specify a module name and arguments." +msgstr "आपको किसी मॉड्यूल नाम और वितर्क को निर्दिष्ट करना है" + +#: ../src/utils/pactl.c:1080 +msgid "You have to specify a module index" +msgstr "आपको किसी मॉड्यूल सूची को निर्दिष्ट करना है" + +#: ../src/utils/pactl.c:1090 +msgid "" +"You may not specify more than one sink. You have to specify a boolean value." +msgstr "" +"आप एक सिंक से अधिक निर्दिष्ट नहीं कर सकते हैं. आपको किसी बुलियन मान को निर्दिष्ट करना है." + +#: ../src/utils/pactl.c:1103 +msgid "" +"You may not specify more than one source. You have to specify a boolean " +"value." +msgstr "" +"आप एक स्रोत से अधिक निर्दिष्ट नहीं कर सकते हैं. आपको किसी बुलियन मान को निर्दिष्ट करना " +"है." + +#: ../src/utils/pactl.c:1115 +msgid "You have to specify a card name/index and a profile name" +msgstr "आपको किसी कार्ड नाम/सूची और प्रोफ़ाइल नाम को निर्दिष्ट करना है." + +#: ../src/utils/pactl.c:1126 +msgid "You have to specify a sink name/index and a port name" +msgstr "आपको किसी कार्ड नाम/सूची और पोर्ट नाम को निर्दिष्ट करना है." + +#: ../src/utils/pactl.c:1137 +msgid "You have to specify a source name/index and a port name" +msgstr "आपको किसी स्रोत नाम/सूची और पोर्ट नाम को निर्दिष्ट करना है." + +#: ../src/utils/pactl.c:1149 +msgid "You have to specify a sink name/index and a volume" +msgstr "आपको किसी सिंक नाम/सूची और वाल्यूम को निर्दिष्ट करना है." + +#: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171 +#: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209 +#: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248 +msgid "Invalid volume specification" +msgstr "अवैध आयतन विनिर्दिष्टता" + +#: ../src/utils/pactl.c:1166 +msgid "You have to specify a source name/index and a volume" +msgstr "आपको किसी स्रोत नाम/सूची और आयतन को निर्दिष्ट करना है." + +#: ../src/utils/pactl.c:1183 +msgid "You have to specify a sink input index and a volume" +msgstr "आपने किसी सिंक इनपुट सूची और आयतन को निर्दिष्ट किया है" + +#: ../src/utils/pactl.c:1188 +msgid "Invalid sink input index" +msgstr "अवैध सिंक इनपुट सूची" + +#: ../src/utils/pactl.c:1204 +msgid "You have to specify a sink name/index and a mute boolean" +msgstr "आपको किसी कार्ड नाम/सूची और मूक बुलियन नाम को निर्दिष्ट करना है." + +#: ../src/utils/pactl.c:1221 +msgid "You have to specify a source name/index and a mute boolean" +msgstr "आपको किसी स्रोत नाम/सूची और मूल बुलियन को निर्दिष्ट करना है." + +#: ../src/utils/pactl.c:1238 +msgid "You have to specify a sink input index and a mute boolean" +msgstr "आपने किसी सिंक इनपुट सूची और मूल बुलियन को निर्दिष्ट किया है" + +#: ../src/utils/pactl.c:1243 +msgid "Invalid sink input index specification" +msgstr "अवैध सिंक इनपुट सूची विनिर्दिष्टता" + +#: ../src/utils/pactl.c:1262 +msgid "No valid command specified." +msgstr "कोई वैध कमांड निर्दिष्ट नहीं." + +#: ../src/utils/pax11publish.c:61 +#, c-format +msgid "" +"%s [-D display] [-S server] [-O sink] [-I source] [-c file] [-d|-e|-i|-r]\n" +"\n" +" -d Show current PulseAudio data attached to X11 display (default)\n" +" -e Export local PulseAudio data to X11 display\n" +" -i Import PulseAudio data from X11 display to local environment " +"variables and cookie file.\n" +" -r Remove PulseAudio data from X11 display\n" +msgstr "" +"%s [-D display] [-S server] [-O sink] [-I source] [-c file] [-d|-e|-i|-r]\n" +"\n" +" -d Show current PulseAudio data attached to X11 display (default)\n" +" -e Export local PulseAudio data to X11 display\n" +" -i Import PulseAudio data from X11 display to local environment " +"variables and cookie file.\n" +" -r Remove PulseAudio data from X11 display\n" + +#: ../src/utils/pax11publish.c:94 +#, c-format +msgid "Failed to parse command line.\n" +msgstr "कमांड लाइन के विश्लेषण में असमर्थ.\n" + +#: ../src/utils/pax11publish.c:108 +#, c-format +msgid "Server: %s\n" +msgstr "सर्वर: %s\n" + +#: ../src/utils/pax11publish.c:110 +#, c-format +msgid "Source: %s\n" +msgstr "स्रोत: %s\n" + +#: ../src/utils/pax11publish.c:112 +#, c-format +msgid "Sink: %s\n" +msgstr "सिंक: %s\n" + +#: ../src/utils/pax11publish.c:114 +#, c-format +msgid "Cookie: %s\n" +msgstr "कुकी: %s\n" + +#: ../src/utils/pax11publish.c:132 +#, c-format +msgid "Failed to parse cookie data\n" +msgstr "कुकी आंकड़ा के विश्लेषण में विफल\n" + +#: ../src/utils/pax11publish.c:137 +#, c-format +msgid "Failed to save cookie data\n" +msgstr "कुकी आंकड़ा के सहेजने में विफल\n" + +#: ../src/utils/pax11publish.c:152 +#, c-format +msgid "Failed to load client configuration file.\n" +msgstr "क्लाइंट विन्यास फ़ाइल लोड करने में विफल\n" + +#: ../src/utils/pax11publish.c:157 +#, c-format +msgid "Failed to read environment configuration data.\n" +msgstr "वातावरण विन्यास आंकड़ा को पढ़ने में विफल.\n" + +#: ../src/utils/pax11publish.c:174 +#, c-format +msgid "Failed to get FQDN.\n" +msgstr "FQDN पाने में विफल.\n" + +#: ../src/utils/pax11publish.c:194 +#, c-format +msgid "Failed to load cookie data\n" +msgstr "कुकी आंकड़ा लोड करने में विफल\n" + +#: ../src/utils/pax11publish.c:211 +#, c-format +msgid "Not yet implemented.\n" +msgstr "अभी तक कार्यान्वित नहीं.\n" + +#: ../src/utils/pacmd.c:69 +msgid "No PulseAudio daemon running, or not running as session daemon." +msgstr "कोई पल्सऑडियो डेमॉन चल रहा है, या चयन डेमॉन के तहत चल रहा है." + +#: ../src/utils/pacmd.c:74 +#, c-format +msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s" +msgstr "socket(PF_UNIX, SOCK_STREAM, 0): %s" + +#: ../src/utils/pacmd.c:91 +#, c-format +msgid "connect(): %s" +msgstr "connect(): %s" + +#: ../src/utils/pacmd.c:99 +msgid "Failed to kill PulseAudio daemon." +msgstr "PulseAudio डेमॉन को मारने में विफल." + +#: ../src/utils/pacmd.c:107 +msgid "Daemon not responding." +msgstr "डेमॉन प्रतिक्रिया नहीं दे रहा है." + +#: ../src/utils/pacmd.c:161 +#, c-format +msgid "poll(): %s" +msgstr "poll(): %s" + +#: ../src/utils/pacmd.c:171 ../src/utils/pacmd.c:188 +#, c-format +msgid "read(): %s" +msgstr "read(): %s" + +#: ../src/utils/pacmd.c:207 ../src/utils/pacmd.c:223 +#, c-format +msgid "write(): %s" +msgstr "write(): %s" + +#: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:219 +msgid "Cannot access autospawn lock." +msgstr "autospawn लॉक की पहुँच नहीं ले सकता है." + +#: ../src/modules/alsa/alsa-sink.c:530 ../src/modules/alsa/alsa-sink.c:689 +#, c-format +msgid "" +"ALSA woke us up to write new data to the device, but there was actually " +"nothing to write!\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers.\n" +"We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() " +"returned 0 or another value < min_avail." +msgstr "" +"ALSA ने युक्ति में नया आंकड़ा लिखने के लिए हमें तैयार किया, लेकिन वहाँ वास्तव में लिखने के लिए " +"कुछ नहीं था!\n" +"अधिक संभव है कि यह ALSA ड्राइवर '%s' में एक बग है. कृपया इस मुद्दे को ALSA डेवलेपर को " +"रिपोर्ट करें.\n" +"हमें POLLOUT सेट के साथ तैयार किया गया है -- हालांकि परवर्ती snd_pcm_avail() ने 0 या " +"दूसरा मान < min_avail दिया." + +#: ../src/modules/alsa/alsa-source.c:506 ../src/modules/alsa/alsa-source.c:656 +#, c-format +msgid "" +"ALSA woke us up to read new data from the device, but there was actually " +"nothing to read!\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers.\n" +"We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() " +"returned 0 or another value < min_avail." +msgstr "" +"ALSA ने युक्ति में नया आंकड़ा पढ़ने के लिए हमें तैयार किया, लेकिन वहाँ वास्तव में पढ़ने के लिए कुछ " +"नहीं था!\n" +"अधिक संभव है कि यह ALSA ड्राइवर '%s' में एक बग है. कृपया इस मुद्दे को ALSA डेवलेपर को " +"रिपोर्ट करें.\n" +"हमें POLLIN सेट के साथ तैयार किया गया है -- हालांकि परवर्ती snd_pcm_avail() ने 0 या " +"दूसरा मान < min_avail दिया." + +#: ../src/modules/alsa/module-alsa-card.c:152 +#: ../src/modules/bluetooth/module-bluetooth-device.c:2228 +#: ../src/modules/alsa/alsa-mixer.c:2931 +msgid "Off" +msgstr "बंद" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2184 +msgid "High Fidelity Playback (A2DP)" +msgstr "उच्च विश्वसनीयतायुक्ति प्लेबैक (A2DP)" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2198 +msgid "High Fidelity Capture (A2DP)" +msgstr "उच्च विश्वसनीयता कैप्चर (A2DP)" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2213 +msgid "Telephony Duplex (HSP/HFP)" +msgstr "टेलिफोनी ड्यूप्लेक्स (HSP/HFP)" + +#: ../src/modules/reserve-wrap.c:151 +msgid "PulseAudio Sound Server" +msgstr "पल्सऑडियो ध्वनि सर्वर" + +#: ../src/modules/module-rygel-media-server.c:569 +#: ../src/modules/module-rygel-media-server.c:583 +msgid "Output Devices" +msgstr "" + +#: ../src/modules/module-rygel-media-server.c:570 +#: ../src/modules/module-rygel-media-server.c:584 +msgid "Input Devices" +msgstr "" + +#: ../src/modules/module-rygel-media-server.c:774 +msgid "Audio on @HOSTNAME@" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1701 +msgid "Input" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1702 +msgid "Docking Station Input" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1703 +msgid "Docking Station Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1704 +msgid "Line-In" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1705 +msgid "Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1706 +msgid "External Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1707 +#, fuzzy +msgid "Internal Microphone" +msgstr "आंतरिक ऑडियो" + +#: ../src/modules/alsa/alsa-mixer.c:1708 +msgid "Radio" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1709 +msgid "Video" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1710 +msgid "Automatic Gain Control" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1711 +msgid "No Automatic Gain Control" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1712 +msgid "Boost" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1713 +msgid "No Boost" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1714 +msgid "Amplifier" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1715 +msgid "No Amplifier" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1773 +msgid "Analog Input" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1774 +msgid "Analog Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1775 +msgid "Analog Line-In" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1776 +msgid "Analog Radio" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1777 +msgid "Analog Video" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1778 +#, fuzzy +msgid "Analog Output" +msgstr "रिक्त आउटपुट" + +#: ../src/modules/alsa/alsa-mixer.c:1779 +msgid "Analog Headphones" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1780 +msgid "Analog Output (LFE)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1781 +msgid "Analog Mono Output" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1981 +#, fuzzy, c-format +msgid "%s+%s" +msgstr "%s %s" + +#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404 +#, fuzzy, c-format +msgid "%s / %s" +msgstr "%s %s" + +#: ../src/modules/alsa/alsa-mixer.c:2790 +msgid "Analog Mono" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2791 +#, fuzzy +msgid "Analog Stereo" +msgstr "स्टीरियो" + +#: ../src/modules/alsa/alsa-mixer.c:2792 +#, fuzzy +msgid "Analog Surround 2.1" +msgstr "सर्राउंड 4.1" + +#: ../src/modules/alsa/alsa-mixer.c:2793 +#, fuzzy +msgid "Analog Surround 3.0" +msgstr "सर्राउंड 4.0" + +#: ../src/modules/alsa/alsa-mixer.c:2794 +#, fuzzy +msgid "Analog Surround 3.1" +msgstr "सर्राउंड 4.1" + +#: ../src/modules/alsa/alsa-mixer.c:2795 +#, fuzzy +msgid "Analog Surround 4.0" +msgstr "सर्राउंड 4.0" + +#: ../src/modules/alsa/alsa-mixer.c:2796 +#, fuzzy +msgid "Analog Surround 4.1" +msgstr "सर्राउंड 4.1" + +#: ../src/modules/alsa/alsa-mixer.c:2797 +#, fuzzy +msgid "Analog Surround 5.0" +msgstr "सर्राउंड 5.0" + +#: ../src/modules/alsa/alsa-mixer.c:2798 +#, fuzzy +msgid "Analog Surround 5.1" +msgstr "सर्राउंड 5.1" + +#: ../src/modules/alsa/alsa-mixer.c:2799 +#, fuzzy +msgid "Analog Surround 6.0" +msgstr "सर्राउंड 4.0" + +#: ../src/modules/alsa/alsa-mixer.c:2800 +#, fuzzy +msgid "Analog Surround 6.1" +msgstr "सर्राउंड 4.1" + +#: ../src/modules/alsa/alsa-mixer.c:2801 +#, fuzzy +msgid "Analog Surround 7.0" +msgstr "सर्राउंड 4.0" + +#: ../src/modules/alsa/alsa-mixer.c:2802 +#, fuzzy +msgid "Analog Surround 7.1" +msgstr "सर्राउंड 7.1" + +#: ../src/modules/alsa/alsa-mixer.c:2803 +msgid "Digital Stereo (IEC958)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2804 +msgid "Digital Surround 4.0 (IEC958)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2805 +msgid "Digital Surround 4.0 (IEC958/AC3)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2806 +msgid "Digital Surround 5.1 (IEC958/AC3)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2807 +msgid "Digital Stereo (HDMI)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2928 +msgid "Analog Mono Duplex" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2929 +msgid "Analog Stereo Duplex" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2930 +msgid "Digital Stereo Duplex (IEC958)" +msgstr "" diff --git a/po/hu.po b/po/hu.po new file mode 100644 index 0000000..a6d059e --- /dev/null +++ b/po/hu.po @@ -0,0 +1,2403 @@ +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-10-17 04:45+0000\n" +"PO-Revision-Date: \n" +"Last-Translator: KAMI \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Hungarian\n" +"X-Poedit-Country: HUNGARY\n" +"X-Poedit-SourceCharset: utf-8\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: ../src/modules/alsa/alsa-util.c:858 +#: ../src/pulsecore/sink.c:2629 +#, c-format +msgid "%s %s" +msgstr "%s %s" + +#: ../src/modules/alsa/alsa-util.c:1106 +#, c-format +msgid "" +"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers." +msgstr "" +"A „snd_pcm_avail()” függvény visszatérési értéke váratlanul nagy értékű: %lu bájt (%lu ms).\n" +"Ez egy hiba lehet az ALSA „%s” eszközmeghajtóban. Kérem jelentse ezt a problémát az ALSA fejlesztői felé." + +#: ../src/modules/alsa/alsa-util.c:1147 +#, c-format +msgid "" +"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%lu ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers." +msgstr "" +"A „snd_pcm_delay()” függvény visszatérési értéke váratlanul nagy értékű: %li bájt (%s%lu ms).\n" +"Ez egy hiba lehet az ALSA „%s” eszközmeghajtóban. Kérem jelentse ezt a problémát az ALSA fejlesztői felé." + +#: ../src/modules/alsa/alsa-util.c:1194 +#, c-format +msgid "" +"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes (%lu ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers." +msgstr "" +"A „snd_pcm_mmap_begin()” függvény visszatérési értéke váratlanul nagy értékű: %lu bájt (%lu ms).\n" +"Ez egy hiba lehet az ALSA „%s” eszközmeghajtóban. Kérem jelentse ezt a problémát az ALSA fejlesztői felé." + +#: ../src/modules/module-always-sink.c:39 +msgid "Always keeps at least one sink loaded even if it's a null one" +msgstr "Mindig maradjon meg legalább egy nyelőt, még ha az csak az üres nyelő." + +#: ../src/modules/module-always-sink.c:83 +msgid "Dummy Output" +msgstr "Látszólagos kimenet" + +#: ../src/modules/module-ladspa-sink.c:49 +msgid "Virtual LADSPA sink" +msgstr "Látszólagos LADSPA nyelő" + +#: ../src/modules/module-ladspa-sink.c:53 +msgid "sink_name= sink_properties= master= format= rate= channels= channel_map= plugin= label= control=" +msgstr "sink_name= sink_properties= master= format= rate= channels= channel_map= plugin= label= control=" + +#: ../src/modules/module-null-sink.c:55 +msgid "Clocked NULL sink" +msgstr "Órajelezett semmis nyelő" + +#: ../src/modules/module-null-sink.c:291 +msgid "Null Output" +msgstr "Semmis kimenet" + +#: ../src/pulsecore/sink.c:2613 +msgid "Internal Audio" +msgstr "Belső hangforrás" + +#: ../src/pulsecore/sink.c:2618 +msgid "Modem" +msgstr "Modem" + +#: ../src/daemon/ltdl-bind-now.c:124 +msgid "Failed to find original lt_dlopen loader." +msgstr "Nem található az eredeti „lt_dlopen” betöltő." + +#: ../src/daemon/ltdl-bind-now.c:129 +msgid "Failed to allocate new dl loader." +msgstr "Nem foglalható le hely az új dl betöltő számára." + +#: ../src/daemon/ltdl-bind-now.c:142 +msgid "Failed to add bind-now-loader." +msgstr "Nem sikerült hozzáadni az azonnali betöltés csatolást." + +#: ../src/daemon/main.c:141 +#, c-format +msgid "Got signal %s." +msgstr "Szignál: %s." + +#: ../src/daemon/main.c:168 +msgid "Exiting." +msgstr "Kilépés." + +#: ../src/daemon/main.c:186 +#, c-format +msgid "Failed to find user '%s'." +msgstr "Nem található a(z) „%s” felhasználó." + +#: ../src/daemon/main.c:191 +#, c-format +msgid "Failed to find group '%s'." +msgstr "Nem található a(z) „%s” csoport." + +#: ../src/daemon/main.c:195 +#, c-format +msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)." +msgstr "Létező felhasználó „%s” (UID: %lu) és csoport „%s” (GID: %lu)." + +#: ../src/daemon/main.c:200 +#, c-format +msgid "GID of user '%s' and of group '%s' don't match." +msgstr "A(z) „%s” felhasználó GID azonosítója és „%s” csoportja nem egyezik meg." + +#: ../src/daemon/main.c:205 +#, c-format +msgid "Home directory of user '%s' is not '%s', ignoring." +msgstr "A(z) „%s” felhasználó Saját mappája nem „%s”. Kihagyás." + +#: ../src/daemon/main.c:208 +#: ../src/daemon/main.c:213 +#, c-format +msgid "Failed to create '%s': %s" +msgstr "Nem sikerült létrehozni a(z) „%s” fájlt: %s" + +#: ../src/daemon/main.c:220 +#, c-format +msgid "Failed to change group list: %s" +msgstr "Nem sikerült megváltoztatni a csoportlistát: %s" + +#: ../src/daemon/main.c:236 +#, c-format +msgid "Failed to change GID: %s" +msgstr "Nem sikerült megváltoztatni az GID azonosítót: %s" + +#: ../src/daemon/main.c:252 +#, c-format +msgid "Failed to change UID: %s" +msgstr "Nem sikerült megváltoztatni az UID azonosítót: %s" + +#: ../src/daemon/main.c:271 +msgid "Successfully dropped root privileges." +msgstr "A rendszergazdai jogosultságok sikeresen visszaadva." + +#: ../src/daemon/main.c:279 +msgid "System wide mode unsupported on this platform." +msgstr "A rendszer üzemmód nem támogatott ezen az operációs rendszeren." + +#: ../src/daemon/main.c:297 +#, c-format +msgid "setrlimit(%s, (%u, %u)) failed: %s" +msgstr "setrlimit(%s, (%u, %u)) meghiúsult: %s" + +#: ../src/daemon/main.c:474 +msgid "Failed to parse command line." +msgstr "Nem sikerült feldolgozni a parancssort." + +#: ../src/daemon/main.c:541 +msgid "Daemon not running" +msgstr "A démon nem fut." + +#: ../src/daemon/main.c:543 +#, c-format +msgid "Daemon running as PID %u" +msgstr "A démon a következő PID azonosítóval fut: %u" + +#: ../src/daemon/main.c:553 +#, c-format +msgid "Failed to kill daemon: %s" +msgstr "A démon kilövése nem sikerült: %s" + +#: ../src/daemon/main.c:571 +msgid "This program is not intended to be run as root (unless --system is specified)." +msgstr "Ez a program nincsen felkészítve arra, hogy rendszergazdai jogosultságokkal fusson (kivéve, ha a --system paraméter megadásra kerül)." + +#: ../src/daemon/main.c:573 +msgid "Root privileges required." +msgstr "Rendszergazdai jogosultságok szükségesek." + +#: ../src/daemon/main.c:578 +msgid "--start not supported for system instances." +msgstr "--start nem támogatott rendszer üzemmód használata esetén." + +#: ../src/daemon/main.c:583 +msgid "Running in system mode, but --disallow-exit not set!" +msgstr "Futtatás rendszer üzemmódban, de a --disallow-exit paraméter nincs beállítva." + +#: ../src/daemon/main.c:586 +msgid "Running in system mode, but --disallow-module-loading not set!" +msgstr "Futtatás rendszer üzemmódban, de a --disallow-module-loading paraméter nincs beállítva." + +#: ../src/daemon/main.c:589 +msgid "Running in system mode, forcibly disabling SHM mode!" +msgstr "Futtatás rendszer üzemmódban, az SHM üzemmód forszírozott letiltása." + +#: ../src/daemon/main.c:594 +msgid "Running in system mode, forcibly disabling exit idle time!" +msgstr "Futtatás rendszer üzemmódban, kilépés üresjárati időtúllépés esetén beállítás forszírozott letiltása." + +#: ../src/daemon/main.c:621 +msgid "Failed to acquire stdio." +msgstr "Nem sikerült jogot szerezni az alapértelmezett ki- és bemenetre (stdio)." + +#: ../src/daemon/main.c:627 +#, c-format +msgid "pipe failed: %s" +msgstr "Cső létrehozás meghiúsult: %s" + +#: ../src/daemon/main.c:632 +#, c-format +msgid "fork() failed: %s" +msgstr "Programindítás meghiúsult: %s" + +#: ../src/daemon/main.c:646 +#: ../src/utils/pacat.c:508 +#, c-format +msgid "read() failed: %s" +msgstr "Olvasás meghiúsult: %s" + +#: ../src/daemon/main.c:652 +msgid "Daemon startup failed." +msgstr "A démon elindítása nem sikerült." + +#: ../src/daemon/main.c:654 +msgid "Daemon startup successful." +msgstr "A démon sikeresen elindult." + +#: ../src/daemon/main.c:731 +#, c-format +msgid "This is PulseAudio %s" +msgstr "PulseAudio %s" + +#: ../src/daemon/main.c:732 +#, c-format +msgid "Compilation host: %s" +msgstr "Összeépítő számítógép: %s" + +#: ../src/daemon/main.c:733 +#, c-format +msgid "Compilation CFLAGS: %s" +msgstr "Összeépítési CFLAGS jelzők: %s" + +#: ../src/daemon/main.c:736 +#, c-format +msgid "Running on host: %s" +msgstr "Kiszolgáló: %s" + +#: ../src/daemon/main.c:739 +#, c-format +msgid "Found %u CPUs." +msgstr "%u CPU található a rendszerben." + +#: ../src/daemon/main.c:741 +#, c-format +msgid "Page size is %lu bytes" +msgstr "Oldalméret: %lu bájt" + +#: ../src/daemon/main.c:744 +msgid "Compiled with Valgrind support: yes" +msgstr "Összeépítés Valgrind támogatással: Igen" + +#: ../src/daemon/main.c:746 +msgid "Compiled with Valgrind support: no" +msgstr "Összeépítés Valgrind támogatással: Nem" + +#: ../src/daemon/main.c:749 +#, c-format +msgid "Running in valgrind mode: %s" +msgstr "Futás Valgrind üzemmódban: %s" + +#: ../src/daemon/main.c:752 +msgid "Optimized build: yes" +msgstr "Optimalizált összeépítés: Igen" + +#: ../src/daemon/main.c:754 +msgid "Optimized build: no" +msgstr "Optimalizált összeépítés: Nem" + +#: ../src/daemon/main.c:758 +msgid "NDEBUG defined, all asserts disabled." +msgstr "NDEBUG megadva, minden érvényesítés letiltva." + +#: ../src/daemon/main.c:760 +msgid "FASTPATH defined, only fast path asserts disabled." +msgstr "FASTPATH megadva, így csak a gyors útvonal-érvényesítés lesz letiltva." + +#: ../src/daemon/main.c:762 +msgid "All asserts enabled." +msgstr "Minden érvényesítés engedélyezve." + +#: ../src/daemon/main.c:766 +msgid "Failed to get machine ID" +msgstr "Nem sikerült lekérdezni a számítógép azonosítóját" + +#: ../src/daemon/main.c:769 +#, c-format +msgid "Machine ID is %s." +msgstr "Számítógép-azonosító: %s." + +#: ../src/daemon/main.c:773 +#, c-format +msgid "Session ID is %s." +msgstr "Munkamenet-azonosító: %s." + +#: ../src/daemon/main.c:779 +#, c-format +msgid "Using runtime directory %s." +msgstr "A futásidőben használt mappa: %s." + +#: ../src/daemon/main.c:784 +#, c-format +msgid "Using state directory %s." +msgstr "Az állapottároló mappa: %s." + +#: ../src/daemon/main.c:787 +#, c-format +msgid "Using modules directory %s." +msgstr "A modulok mappája: %s." + +#: ../src/daemon/main.c:789 +#, c-format +msgid "Running in system mode: %s" +msgstr "Futás rendszer üzemmódban: %s" + +#: ../src/daemon/main.c:792 +msgid "" +"OK, so you are running PA in system mode. Please note that you most likely shouldn't be doing that.\n" +"If you do it nonetheless then it's your own fault if things don't work as expected.\n" +"Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an explanation why system mode is usually a bad idea." +msgstr "" +"A PulseAudio rendszer üzemmódban fut. Általánosságban ezen üzemmód használata nem ajánlott.\n" +"Ha mindenképpen ilyen üzemmódban kívánja futtatni a PulseAudio rendszert, ne lepődjön meg, ha egyes funkciók esetleg nem az elvárások szerint működnek.\n" +"További tájékoztatás: http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode amelyből megtudhatja miért nem tanácsos a rendszer üzemmód használata." + +#: ../src/daemon/main.c:809 +msgid "pa_pid_file_create() failed." +msgstr "A „pa_pid_file_create()” függvényhívás meghiúsult: %s" + +#: ../src/daemon/main.c:819 +msgid "Fresh high-resolution timers available! Bon appetit!" +msgstr "A nagypontosságú időzítők elérhetőek." + +#: ../src/daemon/main.c:821 +msgid "Dude, your kernel stinks! The chef's recommendation today is Linux with high-resolution timers enabled!" +msgstr "A nagypontosságú időzítők nem érhetőek el. Napjaink Linux rendszereiben érdemes engedélyezni a nagypontosságú időzítőket." + +#: ../src/daemon/main.c:844 +msgid "pa_core_new() failed." +msgstr "A „pa_core_new()” függvényhívás meghiúsult: %s" + +#: ../src/daemon/main.c:904 +msgid "Failed to initialize daemon." +msgstr "Nem sikerült előkészíteni a démont." + +#: ../src/daemon/main.c:909 +msgid "Daemon startup without any loaded modules, refusing to work." +msgstr "A démont noha elindult, de nem töltött be modulokat, így a hangrendszer nem üzemképes." + +#: ../src/daemon/main.c:926 +msgid "Daemon startup complete." +msgstr "A démon elindítása sikeres." + +#: ../src/daemon/main.c:932 +msgid "Daemon shutdown initiated." +msgstr "A démon leállítása kezdeményezve." + +#: ../src/daemon/main.c:954 +msgid "Daemon terminated." +msgstr "A démon leállítva." + +#: ../src/daemon/cmdline.c:115 +#, c-format +msgid "" +"%s [options]\n" +"\n" +"COMMANDS:\n" +" -h, --help Show this help\n" +" --version Show version\n" +" --dump-conf Dump default configuration\n" +" --dump-modules Dump list of available modules\n" +" --dump-resample-methods Dump available resample methods\n" +" --cleanup-shm Cleanup stale shared memory segments\n" +" --start Start the daemon if it is not running\n" +" -k --kill Kill a running daemon\n" +" --check Check for a running daemon (only returns exit code)\n" +"\n" +"OPTIONS:\n" +" --system[=BOOL] Run as system-wide instance\n" +" -D, --daemonize[=BOOL] Daemonize after startup\n" +" --fail[=BOOL] Quit when startup fails\n" +" --high-priority[=BOOL] Try to set high nice level\n" +" (only available as root, when SUID or\n" +" with elevated RLIMIT_NICE)\n" +" --realtime[=BOOL] Try to enable realtime scheduling\n" +" (only available as root, when SUID or\n" +" with elevated RLIMIT_RTPRIO)\n" +" --disallow-module-loading[=BOOL] Disallow module user requested module\n" +" loading/unloading after startup\n" +" --disallow-exit[=BOOL] Disallow user requested exit\n" +" --exit-idle-time=SECS Terminate the daemon when idle and this\n" +" time passed\n" +" --module-idle-time=SECS Unload autoloaded modules when idle and\n" +" this time passed\n" +" --scache-idle-time=SECS Unload autoloaded samples when idle and\n" +" this time passed\n" +" --log-level[=LEVEL] Increase or set verbosity level\n" +" -v Increase the verbosity level\n" +" --log-target={auto,syslog,stderr} Specify the log target\n" +" --log-meta[=BOOL] Include code location in log messages\n" +" --log-time[=BOOL] Include timestamps in log messages\n" +" --log-backtrace=FRAMES Include a backtrace in log messages\n" +" -p, --dl-search-path=PATH Set the search path for dynamic shared\n" +" objects (plugins)\n" +" --resample-method=METHOD Use the specified resampling method\n" +" (See --dump-resample-methods for\n" +" possible values)\n" +" --use-pid-file[=BOOL] Create a PID file\n" +" --no-cpu-limit[=BOOL] Do not install CPU load limiter on\n" +" platforms that support it.\n" +" --disable-shm[=BOOL] Disable shared memory support.\n" +"\n" +"STARTUP SCRIPT:\n" +" -L, --load=\"MODULE ARGUMENTS\" Load the specified plugin module with\n" +" the specified argument\n" +" -F, --file=FILENAME Run the specified script\n" +" -C Open a command line on the running TTY\n" +" after startup\n" +"\n" +" -n Don't load default script file\n" +msgstr "" + +#: ../src/daemon/cmdline.c:247 +msgid "--daemonize expects boolean argument" +msgstr "--daemonize paraméter logikai értéket vár el" + +#: ../src/daemon/cmdline.c:254 +msgid "--fail expects boolean argument" +msgstr "--fail paraméter logikai értéket vár el" + +#: ../src/daemon/cmdline.c:264 +msgid "--log-level expects log level argument (either numeric in range 0..4 or one of debug, info, notice, warn, error)." +msgstr "--log-level paraméter a naplózás szintjének értékét várja el (Ez lehet a 0..4 számtartomány, vagy a következők egyike: debug, info, notice, warn, error)." + +#: ../src/daemon/cmdline.c:276 +msgid "--high-priority expects boolean argument" +msgstr "--high-priority paraméter logikai értéket vár el" + +#: ../src/daemon/cmdline.c:283 +msgid "--realtime expects boolean argument" +msgstr "--realtime paraméter logikai értéket vár el" + +#: ../src/daemon/cmdline.c:290 +msgid "--disallow-module-loading expects boolean argument" +msgstr "--disallow-module-loading paraméter logikai értéket vár el" + +#: ../src/daemon/cmdline.c:297 +msgid "--disallow-exit expects boolean argument" +msgstr "--disallow-exit paraméter logikai értéket vár el" + +#: ../src/daemon/cmdline.c:304 +msgid "--use-pid-file expects boolean argument" +msgstr "--use-pid-file paraméter logikai értéket vár el" + +#: ../src/daemon/cmdline.c:321 +msgid "Invalid log target: use either 'syslog', 'stderr' or 'auto'." +msgstr "Érvénytelen naplózási cél: használja a „syslog”, a „stderr” vagy az „auto” értéket." + +#: ../src/daemon/cmdline.c:328 +msgid "--log-time expects boolean argument" +msgstr "--log-time paraméter logikai értéket vár el" + +#: ../src/daemon/cmdline.c:335 +msgid "--log-meta expects boolean argument" +msgstr "--log-meta paraméter logikai értéket vár el" + +#: ../src/daemon/cmdline.c:354 +#, c-format +msgid "Invalid resample method '%s'." +msgstr "Érvénytelen újramintavételezési eljárás: „%s”." + +#: ../src/daemon/cmdline.c:361 +msgid "--system expects boolean argument" +msgstr "--system paraméter logikai értéket vár el" + +#: ../src/daemon/cmdline.c:368 +msgid "--no-cpu-limit expects boolean argument" +msgstr "--no-cpu-limit paraméter logikai értéket vár el" + +#: ../src/daemon/cmdline.c:375 +msgid "--disable-shm expects boolean argument" +msgstr "--disable-shm paraméter logikai értéket vár el" + +#: ../src/daemon/dumpmodules.c:60 +#, c-format +msgid "Name: %s\n" +msgstr "Név: %s\n" + +#: ../src/daemon/dumpmodules.c:63 +#, c-format +msgid "No module information available\n" +msgstr "Nem áll rendelkezésre modul információ.\n" + +#: ../src/daemon/dumpmodules.c:66 +#, c-format +msgid "Version: %s\n" +msgstr "Verzió: %s\n" + +#: ../src/daemon/dumpmodules.c:68 +#, c-format +msgid "Description: %s\n" +msgstr "Leírás: %s\n" + +#: ../src/daemon/dumpmodules.c:70 +#, c-format +msgid "Author: %s\n" +msgstr "Szerző: %s\n" + +#: ../src/daemon/dumpmodules.c:72 +#, c-format +msgid "Usage: %s\n" +msgstr "Használat: %s\n" + +#: ../src/daemon/dumpmodules.c:73 +#, c-format +msgid "Load Once: %s\n" +msgstr "Betöltve: %s\n" + +#: ../src/daemon/dumpmodules.c:75 +#, c-format +msgid "DEPRECATION WARNING: %s\n" +msgstr "VISSZAVONÁSI FIGYELMEZTETÉS: %s\n" + +#: ../src/daemon/dumpmodules.c:79 +#, c-format +msgid "Path: %s\n" +msgstr "Elérési útvonal: %s\n" + +#: ../src/daemon/daemon-conf.c:232 +#, c-format +msgid "[%s:%u] Invalid log target '%s'." +msgstr "[%s:%u] Érvénytelen naplózási cél: „%s”." + +#: ../src/daemon/daemon-conf.c:248 +#, c-format +msgid "[%s:%u] Invalid log level '%s'." +msgstr "[%s:%u] Érvénytelen naplózási szint: „%s”." + +#: ../src/daemon/daemon-conf.c:264 +#, c-format +msgid "[%s:%u] Invalid resample method '%s'." +msgstr "[%s:%u] Érvénytelen újramintavételezési eljárás: „%s”." + +#: ../src/daemon/daemon-conf.c:287 +#, c-format +msgid "[%s:%u] Invalid rlimit '%s'." +msgstr "[%s:%u] Érvénytelen rlimit érték: „%s”." + +#: ../src/daemon/daemon-conf.c:294 +#, c-format +msgid "[%s:%u] rlimit not supported on this platform." +msgstr "[%s:%u] Az rlimit nem támogatott ezen az operációs rendszeren." + +#: ../src/daemon/daemon-conf.c:310 +#, c-format +msgid "[%s:%u] Invalid sample format '%s'." +msgstr "[%s:%u] Érvénytelen mintavételi formátum: „%s”." + +#: ../src/daemon/daemon-conf.c:328 +#, c-format +msgid "[%s:%u] Invalid sample rate '%s'." +msgstr "[%s:%u] Érvénytelen mintavételi ráta: „%s”." + +#: ../src/daemon/daemon-conf.c:352 +#, c-format +msgid "[%s:%u] Invalid sample channels '%s'." +msgstr "[%s:%u] Érvénytelen minta csatornák: „%s”." + +#: ../src/daemon/daemon-conf.c:370 +#, c-format +msgid "[%s:%u] Invalid channel map '%s'." +msgstr "[%s:%u] Érvénytelen csatornaleképzés: „%s”." + +#: ../src/daemon/daemon-conf.c:388 +#, c-format +msgid "[%s:%u] Invalid number of fragments '%s'." +msgstr "[%s:%u] Érvénytelen a részek száma: „%s”." + +#: ../src/daemon/daemon-conf.c:406 +#, c-format +msgid "[%s:%u] Invalid fragment size '%s'." +msgstr "[%s:%u] Érvénytelen a részek mérete: „%s”." + +#: ../src/daemon/daemon-conf.c:424 +#, c-format +msgid "[%s:%u] Invalid nice level '%s'." +msgstr "[%s:%u] Érvénytelen a prioritási érték: „%s”." + +#: ../src/daemon/daemon-conf.c:546 +#, c-format +msgid "Failed to open configuration file: %s" +msgstr "Nem sikerült megnyitni a konfigurációs fájlt: %s" + +#: ../src/daemon/daemon-conf.c:562 +msgid "The specified default channel map has a different number of channels than the specified default number of channels." +msgstr "Az alapértelmezetten megadott mintavételi leírás csatornáinak száma eltér az alapértelmezetten megadott csatornaszámtól." + +#: ../src/daemon/daemon-conf.c:638 +#, c-format +msgid "### Read from configuration file: %s ###\n" +msgstr "### Olvasás a következő konfigurációs fájlból: %s ###\n" + +#: ../src/daemon/caps.c:62 +msgid "Cleaning up privileges." +msgstr "Jogosultságok letisztázása." + +#: ../src/daemon/pulseaudio.desktop.in.h:1 +msgid "PulseAudio Sound System" +msgstr "PulseAudio hangrendszer" + +#: ../src/daemon/pulseaudio.desktop.in.h:2 +msgid "Start the PulseAudio Sound System" +msgstr "A PulseAudio hangrendszer elindítása" + +#: ../src/pulse/channelmap.c:105 +#: ../src/pulse/channelmap.c:757 +msgid "Mono" +msgstr "Mono" + +#: ../src/pulse/channelmap.c:107 +msgid "Front Center" +msgstr "Első középső" + +#: ../src/pulse/channelmap.c:108 +msgid "Front Left" +msgstr "Első bal" + +#: ../src/pulse/channelmap.c:109 +msgid "Front Right" +msgstr "Első jobb" + +#: ../src/pulse/channelmap.c:111 +msgid "Rear Center" +msgstr "Hátsó középső" + +#: ../src/pulse/channelmap.c:112 +msgid "Rear Left" +msgstr "Hátsó bal" + +#: ../src/pulse/channelmap.c:113 +msgid "Rear Right" +msgstr "Hátsó jobb" + +#: ../src/pulse/channelmap.c:115 +msgid "Low Frequency Emmiter" +msgstr "Mély-hangszóró (LFE)" + +#: ../src/pulse/channelmap.c:117 +msgid "Front Left-of-center" +msgstr "Első közép-bal" + +#: ../src/pulse/channelmap.c:118 +msgid "Front Right-of-center" +msgstr "Első közép-jobb" + +#: ../src/pulse/channelmap.c:120 +msgid "Side Left" +msgstr "Bal oldalsó" + +#: ../src/pulse/channelmap.c:121 +msgid "Side Right" +msgstr "Jobb oldalsó" + +#: ../src/pulse/channelmap.c:123 +msgid "Auxiliary 0" +msgstr "Külső 0" + +#: ../src/pulse/channelmap.c:124 +msgid "Auxiliary 1" +msgstr "Külső 1" + +#: ../src/pulse/channelmap.c:125 +msgid "Auxiliary 2" +msgstr "Külső 2" + +#: ../src/pulse/channelmap.c:126 +msgid "Auxiliary 3" +msgstr "Külső 3" + +#: ../src/pulse/channelmap.c:127 +msgid "Auxiliary 4" +msgstr "Külső 4" + +#: ../src/pulse/channelmap.c:128 +msgid "Auxiliary 5" +msgstr "Külső 5" + +#: ../src/pulse/channelmap.c:129 +msgid "Auxiliary 6" +msgstr "Külső 6" + +#: ../src/pulse/channelmap.c:130 +msgid "Auxiliary 7" +msgstr "Külső 7" + +#: ../src/pulse/channelmap.c:131 +msgid "Auxiliary 8" +msgstr "Külső 8" + +#: ../src/pulse/channelmap.c:132 +msgid "Auxiliary 9" +msgstr "Külső 9" + +#: ../src/pulse/channelmap.c:133 +msgid "Auxiliary 10" +msgstr "Külső 10" + +#: ../src/pulse/channelmap.c:134 +msgid "Auxiliary 11" +msgstr "Külső 11" + +#: ../src/pulse/channelmap.c:135 +msgid "Auxiliary 12" +msgstr "Külső 12" + +#: ../src/pulse/channelmap.c:136 +msgid "Auxiliary 13" +msgstr "Külső 13" + +#: ../src/pulse/channelmap.c:137 +msgid "Auxiliary 14" +msgstr "Külső 14" + +#: ../src/pulse/channelmap.c:138 +msgid "Auxiliary 15" +msgstr "Külső 15" + +#: ../src/pulse/channelmap.c:139 +msgid "Auxiliary 16" +msgstr "Külső 16" + +#: ../src/pulse/channelmap.c:140 +msgid "Auxiliary 17" +msgstr "Külső 17" + +#: ../src/pulse/channelmap.c:141 +msgid "Auxiliary 18" +msgstr "Külső 18" + +#: ../src/pulse/channelmap.c:142 +msgid "Auxiliary 19" +msgstr "Külső 19" + +#: ../src/pulse/channelmap.c:143 +msgid "Auxiliary 20" +msgstr "Külső 20" + +#: ../src/pulse/channelmap.c:144 +msgid "Auxiliary 21" +msgstr "Külső 21" + +#: ../src/pulse/channelmap.c:145 +msgid "Auxiliary 22" +msgstr "Külső 22" + +#: ../src/pulse/channelmap.c:146 +msgid "Auxiliary 23" +msgstr "Külső 23" + +#: ../src/pulse/channelmap.c:147 +msgid "Auxiliary 24" +msgstr "Külső 24" + +#: ../src/pulse/channelmap.c:148 +msgid "Auxiliary 25" +msgstr "Külső 25" + +#: ../src/pulse/channelmap.c:149 +msgid "Auxiliary 26" +msgstr "Külső 26" + +#: ../src/pulse/channelmap.c:150 +msgid "Auxiliary 27" +msgstr "Külső 27" + +#: ../src/pulse/channelmap.c:151 +msgid "Auxiliary 28" +msgstr "Külső 28" + +#: ../src/pulse/channelmap.c:152 +msgid "Auxiliary 29" +msgstr "Külső 29" + +#: ../src/pulse/channelmap.c:153 +msgid "Auxiliary 30" +msgstr "Külső 30" + +#: ../src/pulse/channelmap.c:154 +msgid "Auxiliary 31" +msgstr "Külső 31" + +#: ../src/pulse/channelmap.c:156 +msgid "Top Center" +msgstr "Felső középső" + +#: ../src/pulse/channelmap.c:158 +msgid "Top Front Center" +msgstr "Felső első középső" + +#: ../src/pulse/channelmap.c:159 +msgid "Top Front Left" +msgstr "Felső első bal" + +#: ../src/pulse/channelmap.c:160 +msgid "Top Front Right" +msgstr "Felső első jobb" + +#: ../src/pulse/channelmap.c:162 +msgid "Top Rear Center" +msgstr "Felső hátsó középső" + +#: ../src/pulse/channelmap.c:163 +msgid "Top Rear Left" +msgstr "Felső hátsó bal" + +#: ../src/pulse/channelmap.c:164 +msgid "Top Rear Right" +msgstr "Felső hátsó jobb" + +#: ../src/pulse/channelmap.c:484 +#: ../src/pulse/sample.c:170 +#: ../src/pulse/volume.c:295 +#: ../src/pulse/volume.c:321 +#: ../src/pulse/volume.c:341 +#: ../src/pulse/volume.c:371 +msgid "(invalid)" +msgstr "(Érvénytelen)" + +#: ../src/pulse/channelmap.c:761 +msgid "Stereo" +msgstr "Sztereó" + +#: ../src/pulse/channelmap.c:766 +msgid "Surround 4.0" +msgstr "Térhatású 4.0" + +#: ../src/pulse/channelmap.c:772 +msgid "Surround 4.1" +msgstr "Térhatású 4.1" + +#: ../src/pulse/channelmap.c:778 +msgid "Surround 5.0" +msgstr "Térhatású 5.0" + +#: ../src/pulse/channelmap.c:784 +msgid "Surround 5.1" +msgstr "Térhatású 5.1" + +#: ../src/pulse/channelmap.c:791 +msgid "Surround 7.1" +msgstr "Térhatású 7.1" + +#: ../src/pulse/error.c:43 +msgid "OK" +msgstr "OK" + +#: ../src/pulse/error.c:44 +msgid "Access denied" +msgstr "Hozzáférés megtagadva" + +#: ../src/pulse/error.c:45 +msgid "Unknown command" +msgstr "Ismeretlen parancs" + +#: ../src/pulse/error.c:46 +msgid "Invalid argument" +msgstr "Érvénytelen paraméter" + +#: ../src/pulse/error.c:47 +msgid "Entity exists" +msgstr "Az egység létezik" + +#: ../src/pulse/error.c:48 +msgid "No such entity" +msgstr "Nincs ilyen egység" + +#: ../src/pulse/error.c:49 +msgid "Connection refused" +msgstr "Kapcsolat elutasítva" + +#: ../src/pulse/error.c:50 +msgid "Protocol error" +msgstr "Protokollhiba" + +#: ../src/pulse/error.c:51 +msgid "Timeout" +msgstr "Időtúllépés" + +#: ../src/pulse/error.c:52 +msgid "No authorization key" +msgstr "Nem érhető el hitelesítőkulcs" + +#: ../src/pulse/error.c:53 +msgid "Internal error" +msgstr "Belső hiba" + +#: ../src/pulse/error.c:54 +msgid "Connection terminated" +msgstr "A kapcsolat megszakadt." + +#: ../src/pulse/error.c:55 +msgid "Entity killed" +msgstr "Egység kilőve" + +#: ../src/pulse/error.c:56 +msgid "Invalid server" +msgstr "Érvénytelen kiszolgáló" + +#: ../src/pulse/error.c:57 +msgid "Module initalization failed" +msgstr "A modul előkészítése meghiúsult." + +#: ../src/pulse/error.c:58 +msgid "Bad state" +msgstr "Hibás állapot" + +#: ../src/pulse/error.c:59 +msgid "No data" +msgstr "Nincs adat" + +#: ../src/pulse/error.c:60 +msgid "Incompatible protocol version" +msgstr "Inkompatibilis protokollverzió" + +#: ../src/pulse/error.c:61 +msgid "Too large" +msgstr "Túl nagy" + +#: ../src/pulse/error.c:62 +msgid "Not supported" +msgstr "Nem támogatott" + +#: ../src/pulse/error.c:63 +msgid "Unknown error code" +msgstr "Ismeretlen hibakód" + +#: ../src/pulse/error.c:64 +msgid "No such extension" +msgstr "Nincs ilyen kiterjesztés" + +#: ../src/pulse/error.c:65 +msgid "Obsolete functionality" +msgstr "Elavult funkcionalitás" + +#: ../src/pulse/error.c:66 +msgid "Missing implementation" +msgstr "Nincs megvalósítva" + +#: ../src/pulse/error.c:67 +msgid "Client forked" +msgstr "Kliens elindítva" + +#: ../src/pulse/error.c:68 +msgid "Input/Output error" +msgstr "Kimeneti/bemeneti hiba" + +#: ../src/pulse/error.c:69 +msgid "Device or resource busy" +msgstr "Az eszköz vagy erőforrás foglalt" + +#: ../src/pulse/sample.c:172 +#, c-format +msgid "%s %uch %uHz" +msgstr "%s %uch %uHz" + +#: ../src/pulse/sample.c:184 +#, c-format +msgid "%0.1f GiB" +msgstr "%0.1f GiB" + +#: ../src/pulse/sample.c:186 +#, c-format +msgid "%0.1f MiB" +msgstr "%0.1f MiB" + +#: ../src/pulse/sample.c:188 +#, c-format +msgid "%0.1f KiB" +msgstr "%0.1f KiB" + +#: ../src/pulse/sample.c:190 +#, c-format +msgid "%u B" +msgstr "%u B" + +#: ../src/pulse/client-conf-x11.c:55 +#: ../src/utils/pax11publish.c:100 +msgid "XOpenDisplay() failed" +msgstr "Az XOpenDisplay() függvényhívás meghiúsult." + +#: ../src/pulse/client-conf-x11.c:93 +msgid "Failed to parse cookie data" +msgstr "Nem sikerült feldolgozni a süti adatokat." + +#: ../src/pulse/client-conf.c:111 +#, c-format +msgid "Failed to open configuration file '%s': %s" +msgstr "Nem sikerült megnyitni a(z) „%s” konfigurációs fájlt: %s" + +#: ../src/pulse/context.c:550 +msgid "No cookie loaded. Attempting to connect without." +msgstr "Nincs betölthető süti. Kísérlet a kapcsolat felvételére sütik használata nélkül." + +#: ../src/pulse/context.c:693 +#, c-format +msgid "fork(): %s" +msgstr "Programindítás: %s" + +#: ../src/pulse/context.c:748 +#, c-format +msgid "waitpid(): %s" +msgstr "waitpid(): %s" + +#: ../src/pulse/context.c:1438 +#, c-format +msgid "Received message for unknown extension '%s'" +msgstr "Üzenet érkezett az ismeretlen „%s” kiterjesztéstől" + +#: ../src/utils/pacat.c:108 +#, c-format +msgid "Failed to drain stream: %s" +msgstr "Nem sikerült csatlakozni a következő adatfolyamhoz: %s" + +#: ../src/utils/pacat.c:113 +msgid "Playback stream drained." +msgstr "A lejátszás adatfolyamához csatlakozva." + +#: ../src/utils/pacat.c:123 +msgid "Draining connection to server." +msgstr "Csatlakozás a kiszolgálóhoz kapcsolathoz." + +#: ../src/utils/pacat.c:136 +#, c-format +msgid "pa_stream_drain(): %s" +msgstr "pa_stream_drain(): %s" + +#: ../src/utils/pacat.c:159 +#, c-format +msgid "pa_stream_write() failed: %s" +msgstr "A „pa_stream_write()” függvényhívás meghiúsult: %s" + +#: ../src/utils/pacat.c:197 +#, c-format +msgid "pa_stream_begin_write() failed: %s" +msgstr "A „pa_stream_begin_write()” függvényhívás meghiúsult: %s" + +#: ../src/utils/pacat.c:237 +#: ../src/utils/pacat.c:267 +#, c-format +msgid "pa_stream_peek() failed: %s" +msgstr "A „pa_stream_peek()” függvényhívás meghiúsult: %s" + +#: ../src/utils/pacat.c:307 +msgid "Stream successfully created." +msgstr "Az adatfolyam sikeresen létrejött." + +#: ../src/utils/pacat.c:310 +#, c-format +msgid "pa_stream_get_buffer_attr() failed: %s" +msgstr "A „pa_stream_get_buffer_attr()” függvényhívás meghiúsult: %s" + +#: ../src/utils/pacat.c:314 +#, c-format +msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u" +msgstr "Pufferméretek: maximális nagyság: %u, hossz: %u, előpufferelés: %u, minimum: %u" + +#: ../src/utils/pacat.c:317 +#, c-format +msgid "Buffer metrics: maxlength=%u, fragsize=%u" +msgstr "Pufferméretek: maximális nagyság: %u, részek mérete: %u" + +#: ../src/utils/pacat.c:321 +#, c-format +msgid "Using sample spec '%s', channel map '%s'." +msgstr "Mintavételi leírás: „%s” és csatornaleképzés: „%s” használata." + +#: ../src/utils/pacat.c:325 +#, c-format +msgid "Connected to device %s (%u, %ssuspended)." +msgstr "Csatlakozva a következő eszközhöz: „%s” (%u, %ssuspended)." + +#: ../src/utils/pacat.c:335 +#, c-format +msgid "Stream error: %s" +msgstr "Adatfolyam hiba: %s" + +#: ../src/utils/pacat.c:345 +#, c-format +msgid "Stream device suspended.%s" +msgstr "Adatfolyam-eszköz készenléti állapotban: %s" + +#: ../src/utils/pacat.c:347 +#, c-format +msgid "Stream device resumed.%s" +msgstr "Adatfolyam-eszköz visszatért a készenléti állapotból: %s" + +#: ../src/utils/pacat.c:355 +#, c-format +msgid "Stream underrun.%s" +msgstr "%s adatfolyam alulcsordulás." + +#: ../src/utils/pacat.c:362 +#, c-format +msgid "Stream overrun.%s" +msgstr "%s adatfolyam túlcsordulás." + +#: ../src/utils/pacat.c:369 +#, c-format +msgid "Stream started.%s" +msgstr "%s adatfolyam elindítva." + +#: ../src/utils/pacat.c:376 +#, c-format +msgid "Stream moved to device %s (%u, %ssuspended).%s" +msgstr "Az adatfolyam áthelyezve a következő eszközre: „%s” (%u, %ssuspended). %s" + +#: ../src/utils/pacat.c:376 +msgid "not " +msgstr "nem" + +#: ../src/utils/pacat.c:383 +#, c-format +msgid "Stream buffer attributes changed.%s" +msgstr "Az adatfolyam-puffer beállításai megváltoztak: %s" + +#: ../src/utils/pacat.c:415 +#, c-format +msgid "Connection established.%s" +msgstr "Kapcsolat létrehozva. %s" + +#: ../src/utils/pacat.c:418 +#, c-format +msgid "pa_stream_new() failed: %s" +msgstr "A „pa_stream_new()” függvényhívás meghiúsult: %s" + +#: ../src/utils/pacat.c:450 +#, c-format +msgid "pa_stream_connect_playback() failed: %s" +msgstr "A „pa_stream_connect_playback()” függvényhívás meghiúsult: %s" + +#: ../src/utils/pacat.c:456 +#, c-format +msgid "pa_stream_connect_record() failed: %s" +msgstr "A „pa_stream_connect_record()” függvényhívás meghiúsult: %s" + +#: ../src/utils/pacat.c:470 +#: ../src/utils/pactl.c:857 +#, c-format +msgid "Connection failure: %s" +msgstr "Kapcsolódási hiba: %s" + +#: ../src/utils/pacat.c:503 +msgid "Got EOF." +msgstr "A fájl vége elérve." + +#: ../src/utils/pacat.c:540 +#, c-format +msgid "write() failed: %s" +msgstr "Az írás sikertelen: %s" + +#: ../src/utils/pacat.c:561 +msgid "Got signal, exiting." +msgstr "Kilépés, szignál hatására…" + +#: ../src/utils/pacat.c:575 +#, c-format +msgid "Failed to get latency: %s" +msgstr "Nem sikerült lekérdezni a késleltetést: %s" + +#: ../src/utils/pacat.c:580 +#, c-format +msgid "Time: %0.3f sec; Latency: %0.0f usec." +msgstr "Idő: %0.3f másodperc, késleltetés: %0.0f ezredmásodperc." + +#: ../src/utils/pacat.c:599 +#, c-format +msgid "pa_stream_update_timing_info() failed: %s" +msgstr "A „pa_stream_update_timing_info()” függvényhívás meghiúsult: %s" + +#: ../src/utils/pacat.c:609 +#, c-format +msgid "" +"%s [options]\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -r, --record Create a connection for recording\n" +" -p, --playback Create a connection for playback\n" +"\n" +" -v, --verbose Enable verbose operations\n" +"\n" +" -s, --server=SERVER The name of the server to connect to\n" +" -d, --device=DEVICE The name of the sink/source to connect to\n" +" -n, --client-name=NAME How to call this client on the server\n" +" --stream-name=NAME How to call this stream on the server\n" +" --volume=VOLUME Specify the initial (linear) volume in range 0...65536\n" +" --rate=SAMPLERATE The sample rate in Hz (defaults to 44100)\n" +" --format=SAMPLEFORMAT The sample type, one of s16le, s16be, u8, float32le,\n" +" float32be, ulaw, alaw, s32le, s32be, s24le, s24be,\n" +" s24-32le, s24-32be (defaults to s16ne)\n" +" --channels=CHANNELS The number of channels, 1 for mono, 2 for stereo\n" +" (defaults to 2)\n" +" --channel-map=CHANNELMAP Channel map to use instead of the default\n" +" --fix-format Take the sample format from the sink the stream is\n" +" being connected to.\n" +" --fix-rate Take the sampling rate from the sink the stream is\n" +" being connected to.\n" +" --fix-channels Take the number of channels and the channel map\n" +" from the sink the stream is being connected to.\n" +" --no-remix Don't upmix or downmix channels.\n" +" --no-remap Map channels by index instead of name.\n" +" --latency=BYTES Request the specified latency in bytes.\n" +" --process-time=BYTES Request the specified process time per request in bytes.\n" +" --property=PROPERTY=VALUE Set the specified property to the specified value.\n" +" --raw Record/play raw PCM data.\n" +" --file-format=FFORMAT Record/play formatted PCM data.\n" +" --list-file-formats List available file formats.\n" +msgstr "" +"%s [KAPCSOLÓ]\n" +"\n" +" -h, --help Ezen súgó megjelenítése\n" +" --version Az alkalmazás verziószámának megjelenítése\n" +"\n" +" -r, --record Kapcsolat létrehozása felvételhez\n" +" -p, --playback Kapcsolat létrehozása lejátszáshoz\n" +"\n" +" -v, --verbose Történések részletezése\n" +"\n" +" -s, --server=KISZOLGÁLÓ Kapcsolódás a megadott KISZOLGÁLÓ kiszolgálóhoz\n" +" -d, --device=ESZKÖZ Kapcsolódás az ESZKÖZ nevű nyelőhöz vagy forráshoz\n" +" -n, --client-name=NÉV A kliens neve ezen a szerveren\n" +" --stream-name=NÉV Adatfolyam neve a kiszolgálón\n" +" --volume=HANGERŐ Kezdeti (lineáris) hangerő megadása a következő tartományban: 0...65536\n" +" --rate=MINTAVÉTEL Mintavételezés érzéke Hz-ben (alapértelmezés: 44100)\n" +" --format=MINTAFORMÁTUM A mintavétel típusa a következőkből: s16le, s16be, u8, float32le,\n" +" float32be, ulaw, alaw, s32le, s32be, s24le, s24be,\n" +" s24-32le, s24-32be (alapértelmezés: s16ne)\n" +" --channels=CSATORNÁK Csatornák száma: 1 - mono, 2 - sztereó\n" +" (defaults to 2)\n" +" --channel-map=CSATORNALEKÉPZÉS Az alapértelmezés helyett használandó csatornaleképzés\n" +" --fix-format Take the sample format from the sink the stream is\n" +" being connected to.\n" +" --fix-rate Take the sampling rate from the sink the stream is\n" +" being connected to.\n" +" --fix-channels Take the number of channels and the channel map\n" +" from the sink the stream is being connected to.\n" +" --no-remix Don't upmix or downmix channels.\n" +" --no-remap Map channels by index instead of name.\n" +" --latency=BYTES Request the specified latency in bytes.\n" +" --process-time=BYTES Request the specified process time per request in bytes.\n" +" --property=PROPERTY=VALUE Set the specified property to the specified value.\n" +" --raw Nyers PCM adatok felvétele vagy lejátszása.\n" +" --file-format=FORMÁTUM FORMÁTUM alakú PCM adatok felvétele vagy lejátszása.\n" +" --list-file-formats Elérhető fájlformátumok listája.\n" + +#: ../src/utils/pacat.c:731 +#, c-format +msgid "" +"pacat %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pacat %s\n" +"Összeépítve a libpulse %s programkönyvtárral\n" +"Csatolva a libpulse %s programkönyvtárhoz\n" + +#: ../src/utils/pacat.c:764 +#: ../src/utils/pactl.c:953 +#, c-format +msgid "Invalid client name '%s'" +msgstr "Érvénytelen kliensnév: „%s”" + +#: ../src/utils/pacat.c:779 +#, c-format +msgid "Invalid stream name '%s'" +msgstr "Érvénytelen adatfolyam-név: „%s”" + +#: ../src/utils/pacat.c:816 +#, c-format +msgid "Invalid channel map '%s'" +msgstr "Érvénytelen csatornaleképzés: „%s”" + +#: ../src/utils/pacat.c:845 +#, c-format +msgid "Invalid latency specification '%s'" +msgstr "Érvénytelen késleltetés leírás: „%s”" + +#: ../src/utils/pacat.c:852 +#, c-format +msgid "Invalid process time specification '%s'" +msgstr "Érvénytelen műveleti idő leírás: „%s”" + +#: ../src/utils/pacat.c:864 +#, c-format +msgid "Invalid property '%s'" +msgstr "Érvénytelen tulajdonság: „%s”" + +#: ../src/utils/pacat.c:881 +#, c-format +msgid "Unknown file format %s." +msgstr "Ismeretlen fájlformátum: „%s”" + +#: ../src/utils/pacat.c:900 +msgid "Invalid sample specification" +msgstr "Érvénytelen mintavételi leírás." + +#: ../src/utils/pacat.c:910 +#, c-format +msgid "open(): %s" +msgstr "Megnyitás: %s" + +#: ../src/utils/pacat.c:915 +#, c-format +msgid "dup2(): %s" +msgstr "dup2(): %s" + +#: ../src/utils/pacat.c:922 +msgid "Too many arguments." +msgstr "Túl sok paraméter." + +#: ../src/utils/pacat.c:933 +msgid "Failed to generate sample specification for file." +msgstr "Nem sikerült létrehozni a mintavételi leírást a fájlhoz." + +#: ../src/utils/pacat.c:953 +msgid "Failed to open audio file." +msgstr "Nem sikerült megnyitni a hangfájlt." + +#: ../src/utils/pacat.c:959 +msgid "Warning: specified sample specification will be overwritten with specification from file." +msgstr "Figyelmeztetés: a megadott mintavételi leírás felül lesz írva a fájlból származó mintavételi leírással." + +#: ../src/utils/pacat.c:962 +#: ../src/utils/pactl.c:997 +msgid "Failed to determine sample specification from file." +msgstr "Nem sikerült meghatározni a mintavételi leírást a fájlból." + +#: ../src/utils/pacat.c:971 +msgid "Warning: Failed to determine channel map from file." +msgstr "Figyelmeztetés: Nem sikerült meghatározni a csatornaleképzést a fájlból." + +#: ../src/utils/pacat.c:982 +msgid "Channel map doesn't match sample specification" +msgstr "A csatornaleképzés nem feleltethető meg a mintavételi leírásnak." + +#: ../src/utils/pacat.c:993 +msgid "Warning: failed to write channel map to file." +msgstr "Hiba történt a csatornaleképzés fájlba írása közben." + +#: ../src/utils/pacat.c:1008 +#, c-format +msgid "Opening a %s stream with sample specification '%s' and channel map '%s'." +msgstr "A(z) „%s” adatfolyam megnyitása a következő mintavételi leírás: „%s” és csatornaleképzés: „%s” használatával." + +#: ../src/utils/pacat.c:1009 +msgid "recording" +msgstr "Felvétel" + +#: ../src/utils/pacat.c:1009 +msgid "playback" +msgstr "Lejátszás" + +#: ../src/utils/pacat.c:1035 +#: ../src/utils/pactl.c:1267 +msgid "pa_mainloop_new() failed." +msgstr "A „pa_mainloop_new()” függvényhívás meghiúsult." + +#: ../src/utils/pacat.c:1054 +msgid "io_new() failed." +msgstr "A „io_new()” függvényhívás meghiúsult." + +#: ../src/utils/pacat.c:1061 +#: ../src/utils/pactl.c:1279 +msgid "pa_context_new() failed." +msgstr "A „pa_context_new()” függvényhívás meghiúsult." + +#: ../src/utils/pacat.c:1069 +#: ../src/utils/pactl.c:1285 +#, c-format +msgid "pa_context_connect() failed: %s" +msgstr "A „pa_context_connect()” függvényhívás meghiúsult: %s" + +#: ../src/utils/pacat.c:1075 +msgid "pa_context_rttime_new() failed." +msgstr "A „pa_context_rttime_new()” függvényhívás meghiúsult." + +#: ../src/utils/pacat.c:1082 +#: ../src/utils/pactl.c:1290 +msgid "pa_mainloop_run() failed." +msgstr "A „pa_mainloop_run()” függvényhívás meghiúsult." + +#: ../src/utils/pasuspender.c:81 +#, c-format +msgid "fork(): %s\n" +msgstr "Programindítás: %s\n" + +#: ../src/utils/pasuspender.c:92 +#, c-format +msgid "execvp(): %s\n" +msgstr "execvp(): %s\n" + +#: ../src/utils/pasuspender.c:109 +#, c-format +msgid "Failure to suspend: %s\n" +msgstr "Hiba lépett fel a készenléti állapotba térés közben: %s\n" + +#: ../src/utils/pasuspender.c:124 +#, c-format +msgid "Failure to resume: %s\n" +msgstr "Hiba lépett fel a készenléti állapotból visszatérés közben: %s\n" + +#: ../src/utils/pasuspender.c:147 +#, c-format +msgid "WARNING: Sound server is not local, not suspending.\n" +msgstr "FIGYELMEZTETÉS: A hangkiszolgáló nem helyi és nincs is felfüggesztve.\n" + +#: ../src/utils/pasuspender.c:159 +#, c-format +msgid "Connection failure: %s\n" +msgstr "Kapcsolódási hiba: %s\n" + +#: ../src/utils/pasuspender.c:176 +#, c-format +msgid "Got SIGINT, exiting.\n" +msgstr "Kilépés, SIGINT szignál hatására…\n" + +#: ../src/utils/pasuspender.c:194 +#, c-format +msgid "WARNING: Child process terminated by signal %u\n" +msgstr "FIGYELMEZTETÉS: A gyermek folyamat a következő szignállal fejeződött be: %u\n" + +#: ../src/utils/pasuspender.c:212 +#, c-format +msgid "" +"%s [options] ... \n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +" -s, --server=SERVER The name of the server to connect to\n" +"\n" +msgstr "" +"%s [KAPCSOLÓ] ... \n" +"\n" +" -h, --help Megjeleníti ezt a súgót\n" +" --version Az alkalmazás verziószámának megjelenítése\n" +"\n" + +#: ../src/utils/pasuspender.c:248 +#, c-format +msgid "" +"pasuspender %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pasuspender %s\n" +"Összeépítve a libpulse %s programkönyvtárral\n" +"Csatolva a libpulse %s programkönyvtárhoz\n" + +#: ../src/utils/pasuspender.c:277 +#, c-format +msgid "pa_mainloop_new() failed.\n" +msgstr "A „pa_mainloop_new()” függvényhívás meghiúsult.\n" + +#: ../src/utils/pasuspender.c:290 +#, c-format +msgid "pa_context_new() failed.\n" +msgstr "A „pa_context_new()” függvényhívás meghiúsult.\n" + +#: ../src/utils/pasuspender.c:298 +#, c-format +msgid "pa_mainloop_run() failed.\n" +msgstr "A „pa_mainloop_run()” függvényhívás meghiúsult.\n" + +#: ../src/utils/pactl.c:135 +#, c-format +msgid "Failed to get statistics: %s" +msgstr "Nem sikerült a statisztika lekérdezése: %s" + +#: ../src/utils/pactl.c:141 +#, c-format +msgid "Currently in use: %u blocks containing %s bytes total.\n" +msgstr "Jelenleg lefoglalt blokkok száma: %u, amely összesen %s bájtot jelent.\n" + +#: ../src/utils/pactl.c:144 +#, c-format +msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n" +msgstr "A futás során összesen lefoglalt blokkok száma: %u, amely összesen %s bájtot jelent.\n" + +#: ../src/utils/pactl.c:147 +#, c-format +msgid "Sample cache size: %s\n" +msgstr "Minta-gyorsítótár mérete: %s\n" + +#: ../src/utils/pactl.c:156 +#, c-format +msgid "Failed to get server information: %s" +msgstr "Nem sikerült lekérdezni a kiszolgáló adatait: „%s”" + +#: ../src/utils/pactl.c:164 +#, c-format +msgid "" +"User name: %s\n" +"Host Name: %s\n" +"Server Name: %s\n" +"Server Version: %s\n" +"Default Sample Specification: %s\n" +"Default Channel Map: %s\n" +"Default Sink: %s\n" +"Default Source: %s\n" +"Cookie: %08x\n" +msgstr "" +"Felhasználónév: %s\n" +"Számítógépnév: %s\n" +"Kiszolgálónév: %s\n" +"Kiszolgáló verzió: %s\n" +"Alapértelmezett mintavételi leírás: %s\n" +"Alapértelmezett csatornaleképzés: %s\n" +"Alapértelmezett nyelő: %s\n" +"Alapértelmezett forrás: %s\n" +"Süti: %08x\n" + +#: ../src/utils/pactl.c:205 +#, c-format +msgid "Failed to get sink information: %s" +msgstr "Nem sikerült lekérdezni a nyelő adatait: „%s”" + +#: ../src/utils/pactl.c:221 +#, c-format +msgid "" +"Sink #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor Source: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Nyelő #%u\n" +"\tÁllapot: %s\n" +"\tNév: %s\n" +"\tLeírás: %s\n" +"\tEszközmeghajtó: %s\n" +"\tMintavételi leírás: %s\n" +"\tCsatornaleképzés: %s\n" +"\tTulajdonos modul: %u\n" +"\tNémítás: %s\n" +"\tHangerő: %s%s%s\n" +"\t egyensúly %0.2f\n" +"\tAlap hangerő: %s%s%s\n" +"\tMonitor forrás: %s\n" +"\tKésleltetés: %0.0f ezredmásodperc, beállítva %0.0f ezredmásodperc\n" +"\tJelzők: %s%s%s%s%s%s\n" +"\tTulajdonságok:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:268 +#: ../src/utils/pactl.c:360 +#, c-format +msgid "\tPorts:\n" +msgstr "\tPort:\n" + +#: ../src/utils/pactl.c:274 +#: ../src/utils/pactl.c:366 +#, c-format +msgid "\tActive Port: %s\n" +msgstr "\tAktív Port: %s\n" + +#: ../src/utils/pactl.c:297 +#, c-format +msgid "Failed to get source information: %s" +msgstr "Nem sikerült lekérdezni a forrás adatait: „%s”" + +#: ../src/utils/pactl.c:313 +#, c-format +msgid "" +"Source #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor of Sink: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Forrás #%u\n" +"\tÁllapot: %s\n" +"\tNév: %s\n" +"\tLeírás: %s\n" +"\tEszközmeghajtó: %s\n" +"\tMintavételi leírás: %s\n" +"\tCsatornaleképzés: %s\n" +"\tTulajdonos modul: %u\n" +"\tNémítás: %s\n" +"\tHangerő: %s%s%s\n" +"\t egyensúly %0.2f\n" +"\tAlap hangerő: %s%s%s\n" +"\tNyelő monitora: %s\n" +"\tKésleltetés: %0.0f ezredmásodperc, beállítva %0.0f ezredmásodperc\n" +"\tJelzők: %s%s%s%s%s%s\n" +"\tTulajdonságok:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:345 +#: ../src/utils/pactl.c:401 +#: ../src/utils/pactl.c:436 +#: ../src/utils/pactl.c:473 +#: ../src/utils/pactl.c:532 +#: ../src/utils/pactl.c:533 +#: ../src/utils/pactl.c:543 +#: ../src/utils/pactl.c:587 +#: ../src/utils/pactl.c:588 +#: ../src/utils/pactl.c:594 +#: ../src/utils/pactl.c:637 +#: ../src/utils/pactl.c:638 +#: ../src/utils/pactl.c:645 +msgid "n/a" +msgstr "ismeretlen" + +#: ../src/utils/pactl.c:375 +#, c-format +msgid "Failed to get module information: %s" +msgstr "Nem sikerült lekérdezni a modul adatait: „%s”" + +#: ../src/utils/pactl.c:393 +#, c-format +msgid "" +"Module #%u\n" +"\tName: %s\n" +"\tArgument: %s\n" +"\tUsage counter: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Modul #%u\n" +"\tNév: %s\n" +"\tParaméter: %s\n" +"\tHasználva: %s\n" +"\tTulajdonságok:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:412 +#, c-format +msgid "Failed to get client information: %s" +msgstr "Nem sikerült lekérdezni a kliens adatait: „%s”" + +#: ../src/utils/pactl.c:430 +#, c-format +msgid "" +"Client #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Kliens #%u\n" +"\tEszközmeghajtó: %s\n" +"\tTulajdonos modul: %s\n" +"\tTulajdonságok:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:447 +#, c-format +msgid "Failed to get card information: %s" +msgstr "Nem sikerült lekérdezni a kártya adatait: „%s”" + +#: ../src/utils/pactl.c:465 +#, c-format +msgid "" +"Card #%u\n" +"\tName: %s\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Kártya #%u\n" +"\tNév: %s\n" +"\tEszközmeghajtó: %s\n" +"\tTulajdonos modul: %s\n" +"\tTulajdonságok:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:479 +#, c-format +msgid "\tProfiles:\n" +msgstr "\tProfil:\n" + +#: ../src/utils/pactl.c:485 +#, c-format +msgid "\tActive Profile: %s\n" +msgstr "\tAktív profil: %s\n" + +#: ../src/utils/pactl.c:496 +#, c-format +msgid "Failed to get sink input information: %s" +msgstr "Nem sikerült lekérdezni a nyelő bemeneti adatait: „%s”" + +#: ../src/utils/pactl.c:515 +#, c-format +msgid "" +"Sink Input #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSink: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tMute: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSink Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Nyelő bemenet #%u\n" +"\tEszközmeghajtó: %s\n" +"\tTulajdonos modul: %s\n" +"\tKliens: %s\n" +"\tNyelő: %u\n" +"\tMintavételi leírás: %s\n" +"\tCsatornaleképzés: %s\n" +"\tNémítás: %s\n" +"\tHangerő: %s\n" +"\t %s\n" +"\t egyensúly %0.2f\n" +"\tPuffer késleltetés: %0.0f usec\n" +"\tNyelő késleltetés: %0.0f usec\n" +"\tÚjramintavételezési eljárás: %s\n" +"\tTulajdonságok:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:554 +#, c-format +msgid "Failed to get source output information: %s" +msgstr "Nem sikerült lekérdezni a forrás kimeneti adatait: „%s”" + +#: ../src/utils/pactl.c:574 +#, c-format +msgid "" +"Source Output #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSource: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSource Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Forrás kimenet #%u\n" +"\tEszközmeghajtó: %s\n" +"\tTulajdonos modul: %s\n" +"\tKliens: %s\n" +"\tForrás: %u\n" +"\tMintavételi leírás: %s\n" +"\tCsatornaleképzés: %s\n" +"\tPuffer késleltetés: %0.0f usec\n" +"\tForrás késleltetés: %0.0f usec\n" +"\tÚjramintavételezési eljárás: %s\n" +"\tTulajdonságok:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:605 +#, c-format +msgid "Failed to get sample information: %s" +msgstr "Nem sikerült lekérdezni a mintavétel adatait: „%s”" + +#: ../src/utils/pactl.c:623 +#, c-format +msgid "" +"Sample #%u\n" +"\tName: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tDuration: %0.1fs\n" +"\tSize: %s\n" +"\tLazy: %s\n" +"\tFilename: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Minta #%u\n" +"\tNév: %s\n" +"\tMintavételi leírás: %s\n" +"\tCsatornaleképzés: %s\n" +"\tHangerő: %s\n" +"\t %s\n" +"\t egyensúly %0.2f\n" +"\tIdőtartam: %0.1fs\n" +"\tMéret: %s\n" +"\tLassú: %s\n" +"\tFájlnév: %s\n" +"\tTulajdonságok:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:653 +#: ../src/utils/pactl.c:663 +#, c-format +msgid "Failure: %s" +msgstr "Hiba: %s" + +#: ../src/utils/pactl.c:687 +#, c-format +msgid "Failed to upload sample: %s" +msgstr "Nem sikerült feltölteni a mintát: %s" + +#: ../src/utils/pactl.c:704 +msgid "Premature end of file" +msgstr "Idő előtti fájlvége" + +#: ../src/utils/pactl.c:863 +msgid "Got SIGINT, exiting." +msgstr "Kilépés, SIGINT szignál hatására…" + +#: ../src/utils/pactl.c:869 +#, c-format +msgid "" +"%s [options] stat\n" +"%s [options] list\n" +"%s [options] exit\n" +"%s [options] upload-sample FILENAME [NAME]\n" +"%s [options] play-sample NAME [SINK]\n" +"%s [options] remove-sample NAME\n" +"%s [options] move-sink-input SINKINPUT SINK\n" +"%s [options] move-source-output SOURCEOUTPUT SOURCE\n" +"%s [options] load-module NAME [ARGS ...]\n" +"%s [options] unload-module MODULE\n" +"%s [options] suspend-sink SINK 1|0\n" +"%s [options] suspend-source SOURCE 1|0\n" +"%s [options] set-card-profile CARD PROFILE\n" +"%s [options] set-sink-port SINK PORT\n" +"%s [options] set-source-port SOURCE PORT\n" +"%s [options] set-sink-volume SINK VOLUME\n" +"%s [options] set-source-volume SOURCE VOLUME\n" +"%s [options] set-sink-input-volume SINKINPUT VOLUME\n" +"%s [options] set-sink-mute SINK 1|0\n" +"%s [options] set-source-mute SOURCE 1|0\n" +"%s [options] set-sink-input-mute SINKINPUT 1|0\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -s, --server=SERVER The name of the server to connect to\n" +" -n, --client-name=NAME How to call this client on the server\n" +msgstr "" +"%s [options] stat\n" +"%s [options] list\n" +"%s [options] exit\n" +"%s [options] upload-sample FÁJLNÉV [NÉV]\n" +"%s [options] play-sample NÉV [NYELŐ]\n" +"%s [options] remove-sample NÉV\n" +"%s [options] move-sink-input NYELŐBEMENET NYELŐ\n" +"%s [options] move-source-output FORRÁSKIMENET FORRÁS\n" +"%s [options] load-module NÉV [PARAMÉTEREK ...]\n" +"%s [options] unload-module MODUL\n" +"%s [options] suspend-sink NYELŐ 1|0\n" +"%s [options] suspend-source FORRÁS 1|0\n" +"%s [options] set-card-profile KÁRTYA PROFIL\n" +"%s [options] set-sink-port NYELŐ PORT\n" +"%s [options] set-source-port FORRÁS PORT\n" +"%s [options] set-sink-volume NYELŐ HANGERŐ\n" +"%s [options] set-source-volume FORRÁS HANGERŐ\n" +"%s [options] set-sink-input-volume NYELŐBEMENET HANGERŐ\n" +"%s [options] set-sink-mute NYELŐ 1|0\n" +"%s [options] set-source-mute FORRÁS 1|0\n" +"%s [options] set-sink-input-mute NYELŐBEMENET 1|0\n" +"\n" +" -h, --help Megjeleníti ezt a súgót\n" +" --version Az alkalmazás verziószámának megjelenítése\n" +"\n" +" -s, --server=KISZOLGÁLÓ Kapcsolódás a megadott KISZOLGÁLÓ kiszolgálóhoz\n" +" -n, --client-name=NÉV A kliens neve ezen a szerveren\n" + +#: ../src/utils/pactl.c:933 +#, c-format +msgid "" +"pactl %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pactl %s\n" +"Összeépítve a libpulse %s programkönyvtárral\n" +"Csatolva a libpulse %s programkönyvtárhoz\n" + +#: ../src/utils/pactl.c:979 +msgid "Please specify a sample file to load" +msgstr "Adja meg a betöltendő mintafájlt" + +#: ../src/utils/pactl.c:992 +msgid "Failed to open sound file." +msgstr "Nem sikerült megnyitni az hangfájlt." + +#: ../src/utils/pactl.c:1004 +msgid "Warning: Failed to determine sample specification from file." +msgstr "Figyelmeztetés: Nem sikerült meghatározni a mintavételi leírást a fájlból." + +#: ../src/utils/pactl.c:1014 +msgid "You have to specify a sample name to play" +msgstr "Meg kell adnia lejátszandó minta nevét." + +#: ../src/utils/pactl.c:1026 +msgid "You have to specify a sample name to remove" +msgstr "Meg kell adnia az eltávolítandó minta nevét." + +#: ../src/utils/pactl.c:1035 +msgid "You have to specify a sink input index and a sink" +msgstr "Meg kell adnia a nyelő bemeneti azonosítóját és a nyelőt." + +#: ../src/utils/pactl.c:1045 +msgid "You have to specify a source output index and a source" +msgstr "Meg kell adnia a forrás kimeneti azonosítóját és a forrást." + +#: ../src/utils/pactl.c:1060 +msgid "You have to specify a module name and arguments." +msgstr "Meg kell adnia a modul nevét és a paramétereit." + +#: ../src/utils/pactl.c:1080 +msgid "You have to specify a module index" +msgstr "Meg kell adnia a modul azonosítóját." + +#: ../src/utils/pactl.c:1090 +msgid "You may not specify more than one sink. You have to specify a boolean value." +msgstr "Nem adhat meg egynél több nyelőt. Egy logikai értéket kell megadnia." + +#: ../src/utils/pactl.c:1103 +msgid "You may not specify more than one source. You have to specify a boolean value." +msgstr "Nem adhat meg egynél több forrást. Egy logikai értéket kell megadnia." + +#: ../src/utils/pactl.c:1115 +msgid "You have to specify a card name/index and a profile name" +msgstr "Meg kell adnia a kártya nevét vagy azonosítóját és a profil nevét" + +#: ../src/utils/pactl.c:1126 +msgid "You have to specify a sink name/index and a port name" +msgstr "Meg kell adnia a nyelő nevét vagy azonosítóját és a port nevét." + +#: ../src/utils/pactl.c:1137 +msgid "You have to specify a source name/index and a port name" +msgstr "Meg kell adnia a forrás nevét vagy azonosítóját és a port nevét" + +#: ../src/utils/pactl.c:1149 +msgid "You have to specify a sink name/index and a volume" +msgstr "Meg kell adnia a nyelő nevét vagy azonosítóját és a hangerejét." + +#: ../src/utils/pactl.c:1154 +#: ../src/utils/pactl.c:1171 +#: ../src/utils/pactl.c:1193 +#: ../src/utils/pactl.c:1209 +#: ../src/utils/pactl.c:1226 +#: ../src/utils/pactl.c:1248 +msgid "Invalid volume specification" +msgstr "A hangerő megadása érvénytelen." + +#: ../src/utils/pactl.c:1166 +msgid "You have to specify a source name/index and a volume" +msgstr "Meg kell adnia a forrás nevét vagy azonosítóját és a hangerejét" + +#: ../src/utils/pactl.c:1183 +msgid "You have to specify a sink input index and a volume" +msgstr "Meg kell adnia a nyelő bemenet azonosítóját és a hangerejét" + +#: ../src/utils/pactl.c:1188 +msgid "Invalid sink input index" +msgstr "A nyelő bemeneti azonosítója érvénytelen." + +#: ../src/utils/pactl.c:1204 +msgid "You have to specify a sink name/index and a mute boolean" +msgstr "Meg kell adnia a nyelő nevét vagy azonosítóját és a némítás logikai változóját." + +#: ../src/utils/pactl.c:1221 +msgid "You have to specify a source name/index and a mute boolean" +msgstr "Meg kell adnia a forrás nevét vagy azonosítóját és a némítás logikai változóját" + +#: ../src/utils/pactl.c:1238 +msgid "You have to specify a sink input index and a mute boolean" +msgstr "Meg kell adnia a nyelő bemenet azonosítóját és a némítás logikai változóját" + +#: ../src/utils/pactl.c:1243 +msgid "Invalid sink input index specification" +msgstr "A nyelő bemeneti azonosítójának megadása érvénytelen." + +#: ../src/utils/pactl.c:1262 +msgid "No valid command specified." +msgstr "Érvénytelen parancs lett megadva." + +#: ../src/utils/pax11publish.c:61 +#, c-format +msgid "" +"%s [-D display] [-S server] [-O sink] [-I source] [-c file] [-d|-e|-i|-r]\n" +"\n" +" -d Show current PulseAudio data attached to X11 display (default)\n" +" -e Export local PulseAudio data to X11 display\n" +" -i Import PulseAudio data from X11 display to local environment variables and cookie file.\n" +" -r Remove PulseAudio data from X11 display\n" +msgstr "" +"%s [-D megjelenítő] [-S kiszolgáló] [-O nyelő] [-I forrás] [-c fájl] [-d|-e|-i|-r]\n" +"\n" +" -d Megjeleníti az aktuális X11 megjelenítőhöz csatlakoztatott PulseAudio adatokat (alapértelmezés)\n" +" -e Helyi PulseAudio adatok exportálása az X11 megjelenítőre\n" +" -i Helyi PulseAudio adatok importálása az X11 megjelenítőről helyi környezeti változókba és süti fájlokba\n" +" -r Eltávolítja a PulseAudio adatokat z X11 megjelenítőről\n" + +#: ../src/utils/pax11publish.c:94 +#, c-format +msgid "Failed to parse command line.\n" +msgstr "Nem sikerült feldolgozni a parancssort.\n" + +#: ../src/utils/pax11publish.c:108 +#, c-format +msgid "Server: %s\n" +msgstr "Kiszolgáló: %s\n" + +#: ../src/utils/pax11publish.c:110 +#, c-format +msgid "Source: %s\n" +msgstr "Forrás: %s\n" + +#: ../src/utils/pax11publish.c:112 +#, c-format +msgid "Sink: %s\n" +msgstr "Nyelő: %s\n" + +#: ../src/utils/pax11publish.c:114 +#, c-format +msgid "Cookie: %s\n" +msgstr "Süti: %s\n" + +#: ../src/utils/pax11publish.c:132 +#, c-format +msgid "Failed to parse cookie data\n" +msgstr "Nem sikerült feldolgozni a süti adatokat.\n" + +#: ../src/utils/pax11publish.c:137 +#, c-format +msgid "Failed to save cookie data\n" +msgstr "Nem sikerült elmenteni a süti adatokat.\n" + +#: ../src/utils/pax11publish.c:152 +#, c-format +msgid "Failed to load client configuration file.\n" +msgstr "Nem sikerült betölteni a kliens konfigurációs fájlt.\n" + +#: ../src/utils/pax11publish.c:157 +#, c-format +msgid "Failed to read environment configuration data.\n" +msgstr "Nem sikerült elolvasni a környezetváltozó konfigurációs adatokat.\n" + +#: ../src/utils/pax11publish.c:174 +#, c-format +msgid "Failed to get FQDN.\n" +msgstr "Nem sikerült lekérdezni a teljes tartománynevet (FQDN).\n" + +#: ../src/utils/pax11publish.c:194 +#, c-format +msgid "Failed to load cookie data\n" +msgstr "Nem sikerült betölteni a süti adatokat.\n" + +#: ../src/utils/pax11publish.c:211 +#, c-format +msgid "Not yet implemented.\n" +msgstr "Még nincs elkészítve.\n" + +#: ../src/utils/pacmd.c:69 +msgid "No PulseAudio daemon running, or not running as session daemon." +msgstr "Nem fut a PulseAudio démon vagy nem fut munkamenet démonként sem." + +#: ../src/utils/pacmd.c:74 +#, c-format +msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s" +msgstr "socket(PF_UNIX, SOCK_STREAM, 0): %s" + +#: ../src/utils/pacmd.c:91 +#, c-format +msgid "connect(): %s" +msgstr "Kapcsolódás: %s" + +#: ../src/utils/pacmd.c:99 +msgid "Failed to kill PulseAudio daemon." +msgstr "A PulseAudio démon kilövése nem sikerült." + +#: ../src/utils/pacmd.c:107 +msgid "Daemon not responding." +msgstr "A démon nem válaszol." + +#: ../src/utils/pacmd.c:161 +#, c-format +msgid "poll(): %s" +msgstr "Lekérdezés: %s" + +#: ../src/utils/pacmd.c:171 +#: ../src/utils/pacmd.c:188 +#, c-format +msgid "read(): %s" +msgstr "Olvasás: %s" + +#: ../src/utils/pacmd.c:207 +#: ../src/utils/pacmd.c:223 +#, c-format +msgid "write(): %s" +msgstr "Írás: %s" + +#: ../src/pulsecore/lock-autospawn.c:136 +#: ../src/pulsecore/lock-autospawn.c:219 +msgid "Cannot access autospawn lock." +msgstr "Nem érhető zárolás az automatikus indításhoz." + +#: ../src/modules/alsa/alsa-sink.c:530 +#: ../src/modules/alsa/alsa-sink.c:689 +#, c-format +msgid "" +"ALSA woke us up to write new data to the device, but there was actually nothing to write!\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.\n" +"We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() returned 0 or another value < min_avail." +msgstr "" +"Az ALSA modul értesítése nyomán új adatokat kellett volna írni az eszközre, de jelenleg semmilyen írandó adat nincsen.\n" +"Ez egy hiba lehet az ALSA „%s” eszközmeghajtóban. Kérem jelentse ezt a problémát az ALSA fejlesztői felé.\n" +"Az értesítés a POLLOUT jelzésen keresztül érkezett – viszont a „snd_pcm_avail()” függvény visszatérési értéke 0 volt vagy a második érték kisebb volt, mint a minimum." + +#: ../src/modules/alsa/alsa-source.c:506 +#: ../src/modules/alsa/alsa-source.c:656 +#, c-format +msgid "" +"ALSA woke us up to read new data from the device, but there was actually nothing to read!\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.\n" +"We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() returned 0 or another value < min_avail." +msgstr "" +"Az ALSA modul értesítése nyomán új adatokat kellett volna olvasni az eszközről, de jelenleg semmilyen olvasandó adat nincsen.\n" +"Ez egy hiba lehet az ALSA „%s” eszközmeghajtóban. Kérem jelentse ezt a problémát az ALSA fejlesztői felé.\n" +"Az értesítés a POLLIN jelzésen keresztül érkezett – viszont a „snd_pcm_avail()” függvény visszatérési értéke 0 volt vagy a második érték kisebb volt, mint a minimum." + +#: ../src/modules/alsa/module-alsa-card.c:152 +#: ../src/modules/bluetooth/module-bluetooth-device.c:2228 +#: ../src/modules/alsa/alsa-mixer.c:2931 +msgid "Off" +msgstr "Kikapcsolva" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2184 +msgid "High Fidelity Playback (A2DP)" +msgstr "HiFi lejátszás (A2DP)" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2198 +msgid "High Fidelity Capture (A2DP)" +msgstr "HiFi felvétel (A2DP)" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2213 +msgid "Telephony Duplex (HSP/HFP)" +msgstr "Telefon duplex (HSP/HFP)" + +#: ../src/modules/reserve-wrap.c:151 +msgid "PulseAudio Sound Server" +msgstr "PulseAudio hangkiszolgáló" + +#: ../src/modules/module-rygel-media-server.c:569 +#: ../src/modules/module-rygel-media-server.c:583 +msgid "Output Devices" +msgstr "Kimeneti eszközök" + +#: ../src/modules/module-rygel-media-server.c:570 +#: ../src/modules/module-rygel-media-server.c:584 +msgid "Input Devices" +msgstr "Bemeneti eszközök" + +#: ../src/modules/module-rygel-media-server.c:774 +msgid "Audio on @HOSTNAME@" +msgstr "Hangforrások a(z) @HOSTNAME@ számítógépen" + +#: ../src/modules/alsa/alsa-mixer.c:1701 +msgid "Input" +msgstr "Bemenet" + +#: ../src/modules/alsa/alsa-mixer.c:1702 +msgid "Docking Station Input" +msgstr "Dokkolóállomás bemenet" + +#: ../src/modules/alsa/alsa-mixer.c:1703 +msgid "Docking Station Microphone" +msgstr "Dokkolóállomás mikrofon" + +#: ../src/modules/alsa/alsa-mixer.c:1704 +msgid "Line-In" +msgstr "Vonalbemenet" + +#: ../src/modules/alsa/alsa-mixer.c:1705 +msgid "Microphone" +msgstr "Mikrofon" + +#: ../src/modules/alsa/alsa-mixer.c:1706 +msgid "External Microphone" +msgstr "Külső mikrofon" + +#: ../src/modules/alsa/alsa-mixer.c:1707 +msgid "Internal Microphone" +msgstr "Belső mikrofon" + +#: ../src/modules/alsa/alsa-mixer.c:1708 +msgid "Radio" +msgstr "Rádió" + +#: ../src/modules/alsa/alsa-mixer.c:1709 +msgid "Video" +msgstr "Videó" + +#: ../src/modules/alsa/alsa-mixer.c:1710 +msgid "Automatic Gain Control" +msgstr "Automatikus erősítésszabályzás" + +#: ../src/modules/alsa/alsa-mixer.c:1711 +msgid "No Automatic Gain Control" +msgstr "Nincs automatikus erősítésszabályzás" + +#: ../src/modules/alsa/alsa-mixer.c:1712 +msgid "Boost" +msgstr "Erősítés" + +#: ../src/modules/alsa/alsa-mixer.c:1713 +msgid "No Boost" +msgstr "Nincs erősítés" + +#: ../src/modules/alsa/alsa-mixer.c:1714 +msgid "Amplifier" +msgstr "Erősítő" + +#: ../src/modules/alsa/alsa-mixer.c:1715 +msgid "No Amplifier" +msgstr "Nincs erősítő" + +#: ../src/modules/alsa/alsa-mixer.c:1773 +msgid "Analog Input" +msgstr "Analóg bemenet" + +#: ../src/modules/alsa/alsa-mixer.c:1774 +msgid "Analog Microphone" +msgstr "Analóg mikrofon" + +#: ../src/modules/alsa/alsa-mixer.c:1775 +msgid "Analog Line-In" +msgstr "Analóg vonalbemenet" + +#: ../src/modules/alsa/alsa-mixer.c:1776 +msgid "Analog Radio" +msgstr "Analóg rádió" + +#: ../src/modules/alsa/alsa-mixer.c:1777 +msgid "Analog Video" +msgstr "Analóg videó" + +#: ../src/modules/alsa/alsa-mixer.c:1778 +msgid "Analog Output" +msgstr "Analóg kimenet" + +#: ../src/modules/alsa/alsa-mixer.c:1779 +msgid "Analog Headphones" +msgstr "Analóg fejhallgató" + +#: ../src/modules/alsa/alsa-mixer.c:1780 +msgid "Analog Output (LFE)" +msgstr "Analóg kimenet (mély)" + +#: ../src/modules/alsa/alsa-mixer.c:1781 +msgid "Analog Mono Output" +msgstr "Analóg mono kimenet" + +#: ../src/modules/alsa/alsa-mixer.c:1981 +#, c-format +msgid "%s+%s" +msgstr "%s+%s" + +#: ../src/modules/alsa/alsa-mixer.c:1984 +#: ../src/modules/alsa/alsa-mixer.c:3404 +#, c-format +msgid "%s / %s" +msgstr "%s / %s" + +#: ../src/modules/alsa/alsa-mixer.c:2790 +msgid "Analog Mono" +msgstr "Analóg mono" + +#: ../src/modules/alsa/alsa-mixer.c:2791 +msgid "Analog Stereo" +msgstr "Analóg sztereó" + +#: ../src/modules/alsa/alsa-mixer.c:2792 +msgid "Analog Surround 2.1" +msgstr "Analóg térhatású 2.1" + +#: ../src/modules/alsa/alsa-mixer.c:2793 +msgid "Analog Surround 3.0" +msgstr "Analóg térhatású 3.0" + +#: ../src/modules/alsa/alsa-mixer.c:2794 +msgid "Analog Surround 3.1" +msgstr "Analóg térhatású 3.1" + +#: ../src/modules/alsa/alsa-mixer.c:2795 +msgid "Analog Surround 4.0" +msgstr "Analóg térhatású 4.0" + +#: ../src/modules/alsa/alsa-mixer.c:2796 +msgid "Analog Surround 4.1" +msgstr "Analóg térhatású 4.1" + +#: ../src/modules/alsa/alsa-mixer.c:2797 +msgid "Analog Surround 5.0" +msgstr "Analóg térhatású 5.0" + +#: ../src/modules/alsa/alsa-mixer.c:2798 +msgid "Analog Surround 5.1" +msgstr "Analóg térhatású 5.1" + +#: ../src/modules/alsa/alsa-mixer.c:2799 +msgid "Analog Surround 6.0" +msgstr "Analóg térhatású 6.0" + +#: ../src/modules/alsa/alsa-mixer.c:2800 +msgid "Analog Surround 6.1" +msgstr "Analóg térhatású 6.1" + +#: ../src/modules/alsa/alsa-mixer.c:2801 +msgid "Analog Surround 7.0" +msgstr "Analóg térhatású 7.0" + +#: ../src/modules/alsa/alsa-mixer.c:2802 +msgid "Analog Surround 7.1" +msgstr "Analóg térhatású 7.1" + +#: ../src/modules/alsa/alsa-mixer.c:2803 +msgid "Digital Stereo (IEC958)" +msgstr "Digitális sztereó (IEC958)" + +#: ../src/modules/alsa/alsa-mixer.c:2804 +msgid "Digital Surround 4.0 (IEC958)" +msgstr "Digitális térhatású 4.0 (IEC958)" + +#: ../src/modules/alsa/alsa-mixer.c:2805 +msgid "Digital Surround 4.0 (IEC958/AC3)" +msgstr "Digitális térhatású 4.0 (IEC958/AC3)" + +#: ../src/modules/alsa/alsa-mixer.c:2806 +msgid "Digital Surround 5.1 (IEC958/AC3)" +msgstr "Digitális térhatású 5.1 (IEC958/AC3)" + +#: ../src/modules/alsa/alsa-mixer.c:2807 +msgid "Digital Stereo (HDMI)" +msgstr "Digitális térhatású (HDMI)" + +#: ../src/modules/alsa/alsa-mixer.c:2928 +msgid "Analog Mono Duplex" +msgstr "Analóg mono duplex" + +#: ../src/modules/alsa/alsa-mixer.c:2929 +msgid "Analog Stereo Duplex" +msgstr "Analóg sztereó duplex" + +#: ../src/modules/alsa/alsa-mixer.c:2930 +msgid "Digital Stereo Duplex (IEC958)" +msgstr "Analóg sztereó duplex (IEC958)" + diff --git a/po/it.po b/po/it.po new file mode 100644 index 0000000..c0c70e4 --- /dev/null +++ b/po/it.po @@ -0,0 +1,2653 @@ +# Italian translation for PulseAudio. +# Copyright (C) 2008, 2009 The Free Software Foundation, Inc +# This file is distributed under the same license as the pulseaudio package. +# +# Luca Ferretti , 2008, 2009. +# mario_santagiuliana , 2009. +# Milo Casagrande , 2009. +msgid "" +msgstr "" +"Project-Id-Version: pulseaudio\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-10-18 05:22+0000\n" +"PO-Revision-Date: 2009-10-18 11:46+0200\n" +"Last-Translator: Milo Casagrande \n" +"Language-Team: Italian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629 +#, c-format +msgid "%s %s" +msgstr "%s %s" + +#: ../src/modules/alsa/alsa-util.c:1106 +#, c-format +msgid "" +"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu " +"ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_avail() ha restituito un valore molto grande: %lu byte (%lu ms).\n" +"Molto probabilmente si tratta di un bug nel driver ALSA \"%s\". Segnalare " +"questo problema agli sviluppatori ALSA." + +#: ../src/modules/alsa/alsa-util.c:1147 +#, c-format +msgid "" +"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%" +"lu ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_delay() ha restituito un valore molto grande: %li byte (%s%lu ms).\n" +"Molto probabilmente si tratta di un bug nel driver ALSA \"%s\". Segnalare " +"questo problema agli sviluppatori ALSA." + +#: ../src/modules/alsa/alsa-util.c:1194 +#, c-format +msgid "" +"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes " +"(%lu ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_mmap_begin() ha restituito un valore molto grande: %lu byte (%lu " +"ms).\n" +"Molto probabilmente si tratta di un bug nel driver ALSA \"%s\". Segnalare " +"questo problema agli sviluppatori ALSA." + +#: ../src/modules/module-always-sink.c:39 +msgid "Always keeps at least one sink loaded even if it's a null one" +msgstr "Mantiene sempre almeno un sink caricato anche se è nullo" + +#: ../src/modules/module-always-sink.c:83 +msgid "Dummy Output" +msgstr "Output dummy" + +#: ../src/modules/module-ladspa-sink.c:49 +msgid "Virtual LADSPA sink" +msgstr "Sink LADSPA virtuale" + +#: ../src/modules/module-ladspa-sink.c:53 +msgid "" +"sink_name= sink_properties= " +"master= format= rate= " +"channels= channel_map= plugin= label= control=" +msgstr "" +"sink_name= sink_properties= master= format= rate= channels= channel_map= " +"plugin= label= control=" + +#: ../src/modules/module-null-sink.c:55 +msgid "Clocked NULL sink" +msgstr "Sink NULL temporizzato" + +#: ../src/modules/module-null-sink.c:291 +msgid "Null Output" +msgstr "Output nullo" + +#: ../src/pulsecore/sink.c:2613 +msgid "Internal Audio" +msgstr "Audio interno" + +#: ../src/pulsecore/sink.c:2618 +msgid "Modem" +msgstr "Modem" + +#: ../src/daemon/ltdl-bind-now.c:124 +msgid "Failed to find original lt_dlopen loader." +msgstr "Ricerca del loader lt_dlopen originale non riuscita." + +#: ../src/daemon/ltdl-bind-now.c:129 +msgid "Failed to allocate new dl loader." +msgstr "Allocazione del nuovo loader dl non riuscita." + +#: ../src/daemon/ltdl-bind-now.c:142 +msgid "Failed to add bind-now-loader." +msgstr "Aggiunta di bind-now-loader non riuscita." + +#: ../src/daemon/main.c:141 +#, c-format +msgid "Got signal %s." +msgstr "Ottenuto il segnale %s." + +#: ../src/daemon/main.c:168 +msgid "Exiting." +msgstr "Uscita." + +#: ../src/daemon/main.c:186 +#, c-format +msgid "Failed to find user '%s'." +msgstr "Ricerca dell'utente \"%s\" non riuscita." + +#: ../src/daemon/main.c:191 +#, c-format +msgid "Failed to find group '%s'." +msgstr "Ricerca del gruppo \"%s\" non riuscita." + +#: ../src/daemon/main.c:195 +#, c-format +msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)." +msgstr "Trovato l'utente \"%s\" (UID %lu) e il gruppo \"%s\" (GID %lu)." + +#: ../src/daemon/main.c:200 +#, c-format +msgid "GID of user '%s' and of group '%s' don't match." +msgstr "Il GID dell'utente \"%s\" e del gruppo \"%s\" non corrispondono." + +#: ../src/daemon/main.c:205 +#, c-format +msgid "Home directory of user '%s' is not '%s', ignoring." +msgstr "La directory home dell'utente \"%s\" non è \"%s\", ignorato." + +#: ../src/daemon/main.c:208 ../src/daemon/main.c:213 +#, c-format +msgid "Failed to create '%s': %s" +msgstr "Creazione di \"%s\" non riuscita: %s" + +# group list ???? +#: ../src/daemon/main.c:220 +#, c-format +msgid "Failed to change group list: %s" +msgstr "Cambio dell'elenco di gruppo non riuscito: %s" + +#: ../src/daemon/main.c:236 +#, c-format +msgid "Failed to change GID: %s" +msgstr "Cambio di GID non riuscito: %s" + +#: ../src/daemon/main.c:252 +#, c-format +msgid "Failed to change UID: %s" +msgstr "Cambio di UID non riuscito: %s" + +#: ../src/daemon/main.c:271 +msgid "Successfully dropped root privileges." +msgstr "Privilegi di root abbandonati con successo." + +#: ../src/daemon/main.c:279 +msgid "System wide mode unsupported on this platform." +msgstr "Modalità di sistema non supportata su questa piattaforma." + +#: ../src/daemon/main.c:297 +#, c-format +msgid "setrlimit(%s, (%u, %u)) failed: %s" +msgstr "setrlimit(%s, (%u, %u)) non riuscita: %s" + +#: ../src/daemon/main.c:474 +msgid "Failed to parse command line." +msgstr "Analisi della riga di comando non riuscita." + +#: ../src/daemon/main.c:541 +msgid "Daemon not running" +msgstr "Demone non in esecuzione" + +#: ../src/daemon/main.c:543 +#, c-format +msgid "Daemon running as PID %u" +msgstr "Demone in esecuzione con PID %u" + +#: ../src/daemon/main.c:553 +#, c-format +msgid "Failed to kill daemon: %s" +msgstr "Terminazione del demone non riuscita: %s" + +#: ../src/daemon/main.c:571 +msgid "" +"This program is not intended to be run as root (unless --system is " +"specified)." +msgstr "" +"Questo programma non è pensato per essere eseguito come root (a meno di " +"specificare --system)." + +#: ../src/daemon/main.c:573 +msgid "Root privileges required." +msgstr "Richiesti privilegi di root." + +#: ../src/daemon/main.c:578 +msgid "--start not supported for system instances." +msgstr "--start non supportato per le istanze di sistema." + +#: ../src/daemon/main.c:583 +msgid "Running in system mode, but --disallow-exit not set!" +msgstr "In esecuzione in modalità sistema, ma --disallow-exit non impostato." + +#: ../src/daemon/main.c:586 +msgid "Running in system mode, but --disallow-module-loading not set!" +msgstr "" +"In esecuzione in modalità sistema, ma --disallow-module-loading non " +"impostato." + +#: ../src/daemon/main.c:589 +msgid "Running in system mode, forcibly disabling SHM mode!" +msgstr "" +"In esecuzione in modalità sistema, disabilitata in modo forzoso la modalità " +"SHM." + +#: ../src/daemon/main.c:594 +msgid "Running in system mode, forcibly disabling exit idle time!" +msgstr "" +"In esecuzione in modalità sistema, disabilitato in modo forzoso il tempo di " +"uscita per inattività." + +#: ../src/daemon/main.c:621 +msgid "Failed to acquire stdio." +msgstr "Acquisizione di STDIO non riuscita." + +#: ../src/daemon/main.c:627 +#, c-format +msgid "pipe failed: %s" +msgstr "pipe non riuscita: %s" + +#: ../src/daemon/main.c:632 +#, c-format +msgid "fork() failed: %s" +msgstr "fork() non riuscita: %s" + +#: ../src/daemon/main.c:646 ../src/utils/pacat.c:508 +#, c-format +msgid "read() failed: %s" +msgstr "read() non riuscita: %s" + +#: ../src/daemon/main.c:652 +msgid "Daemon startup failed." +msgstr "Avvio del demone non riuscito." + +#: ../src/daemon/main.c:654 +msgid "Daemon startup successful." +msgstr "Avvio del demone riuscito." + +#: ../src/daemon/main.c:731 +#, c-format +msgid "This is PulseAudio %s" +msgstr "Questo è PulseAudio %s" + +#: ../src/daemon/main.c:732 +#, c-format +msgid "Compilation host: %s" +msgstr "Host di compilazione: %s" + +#: ../src/daemon/main.c:733 +#, c-format +msgid "Compilation CFLAGS: %s" +msgstr "CFLAGS di compilazione: %s" + +#: ../src/daemon/main.c:736 +#, c-format +msgid "Running on host: %s" +msgstr "In esecuzione sull'host: %s" + +# evviva il rispetto della l10n!!! +#: ../src/daemon/main.c:739 +#, c-format +msgid "Found %u CPUs." +msgstr "Trovate %u CPU." + +#: ../src/daemon/main.c:741 +#, c-format +msgid "Page size is %lu bytes" +msgstr "La dimensione di pagina è %lu byte" + +#: ../src/daemon/main.c:744 +msgid "Compiled with Valgrind support: yes" +msgstr "Compilato con supporto a Valgrind: sì" + +#: ../src/daemon/main.c:746 +msgid "Compiled with Valgrind support: no" +msgstr "Compilato con supporto a Valgrind: no" + +#: ../src/daemon/main.c:749 +#, c-format +msgid "Running in valgrind mode: %s" +msgstr "In esecuzione in modalità valgrind: %s" + +#: ../src/daemon/main.c:752 +msgid "Optimized build: yes" +msgstr "Build ottimizzata: sì" + +#: ../src/daemon/main.c:754 +msgid "Optimized build: no" +msgstr "Build ottimizzata: no" + +#: ../src/daemon/main.c:758 +msgid "NDEBUG defined, all asserts disabled." +msgstr "NDEBUG definito, tutte le dichiarazioni sono disabilitate." + +#: ../src/daemon/main.c:760 +msgid "FASTPATH defined, only fast path asserts disabled." +msgstr "" +"FASTPATH definito, solo le dichiarazioni veloci di path sono disabilitate." + +#: ../src/daemon/main.c:762 +msgid "All asserts enabled." +msgstr "Tutte le dichiarazioni sono abilitate." + +#: ../src/daemon/main.c:766 +msgid "Failed to get machine ID" +msgstr "Recupero dell'ID della macchina non riuscito" + +#: ../src/daemon/main.c:769 +#, c-format +msgid "Machine ID is %s." +msgstr "L'ID della macchina è %s" + +#: ../src/daemon/main.c:773 +#, c-format +msgid "Session ID is %s." +msgstr "L'ID della sessione è %s" + +#: ../src/daemon/main.c:779 +#, c-format +msgid "Using runtime directory %s." +msgstr "In uso directory di runtime %s." + +#: ../src/daemon/main.c:784 +#, c-format +msgid "Using state directory %s." +msgstr "In uso directory di stato %s." + +#: ../src/daemon/main.c:787 +#, c-format +msgid "Using modules directory %s." +msgstr "In uso directory dei moduli %s." + +#: ../src/daemon/main.c:789 +#, c-format +msgid "Running in system mode: %s" +msgstr "In esecuzione in modalità sistema: %s" + +#: ../src/daemon/main.c:792 +msgid "" +"OK, so you are running PA in system mode. Please note that you most likely " +"shouldn't be doing that.\n" +"If you do it nonetheless then it's your own fault if things don't work as " +"expected.\n" +"Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an " +"explanation why system mode is usually a bad idea." +msgstr "" +"PulseAudio è in esecuzione in modalità sistema. È sconsigliato eseguire " +"PulseAudio in questa modalità.\n" +"Continuando a usarlo in questo modo molte cose potrebbero non funzionare " +"come atteso.\n" +"Consultare http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode per maggiori " +"informazioni sul perché la modalità sistema è una pessima idea." + +#: ../src/daemon/main.c:809 +msgid "pa_pid_file_create() failed." +msgstr "pa_pid_file_create() non riuscita." + +# io mi domando e dico..... mah! +#: ../src/daemon/main.c:819 +msgid "Fresh high-resolution timers available! Bon appetit!" +msgstr "Disponibili timer high-resolution freschi freschi! Buon appetito!" + +# $REPEAT_PREVIOUS_COMMENT_HERE +#: ../src/daemon/main.c:821 +msgid "" +"Dude, your kernel stinks! The chef's recommendation today is Linux with high-" +"resolution timers enabled!" +msgstr "" +"Hey, questo kernel è andato a male! Lo chef oggi raccomanda Linux con i " +"timer high-resolution abilitati!" + +#: ../src/daemon/main.c:844 +msgid "pa_core_new() failed." +msgstr "pa_core_new() non riuscita." + +#: ../src/daemon/main.c:904 +msgid "Failed to initialize daemon." +msgstr "Inizializzazione del demone non riuscita." + +#: ../src/daemon/main.c:909 +msgid "Daemon startup without any loaded modules, refusing to work." +msgstr "Avvio del demone senza alcun modulo caricato, rifiuta di lavorare." + +#: ../src/daemon/main.c:926 +msgid "Daemon startup complete." +msgstr "Completato l'avvio del demone." + +#: ../src/daemon/main.c:932 +msgid "Daemon shutdown initiated." +msgstr "Iniziato l'arresto del demone." + +#: ../src/daemon/main.c:954 +msgid "Daemon terminated." +msgstr "Demone terminato." + +# mamma mia che impressione +#: ../src/daemon/cmdline.c:115 +#, c-format +msgid "" +"%s [options]\n" +"\n" +"COMMANDS:\n" +" -h, --help Show this help\n" +" --version Show version\n" +" --dump-conf Dump default configuration\n" +" --dump-modules Dump list of available modules\n" +" --dump-resample-methods Dump available resample methods\n" +" --cleanup-shm Cleanup stale shared memory " +"segments\n" +" --start Start the daemon if it is not " +"running\n" +" -k --kill Kill a running daemon\n" +" --check Check for a running daemon (only " +"returns exit code)\n" +"\n" +"OPTIONS:\n" +" --system[=BOOL] Run as system-wide instance\n" +" -D, --daemonize[=BOOL] Daemonize after startup\n" +" --fail[=BOOL] Quit when startup fails\n" +" --high-priority[=BOOL] Try to set high nice level\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_NICE)\n" +" --realtime[=BOOL] Try to enable realtime scheduling\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_RTPRIO)\n" +" --disallow-module-loading[=BOOL] Disallow module user requested " +"module\n" +" loading/unloading after startup\n" +" --disallow-exit[=BOOL] Disallow user requested exit\n" +" --exit-idle-time=SECS Terminate the daemon when idle and " +"this\n" +" time passed\n" +" --module-idle-time=SECS Unload autoloaded modules when idle " +"and\n" +" this time passed\n" +" --scache-idle-time=SECS Unload autoloaded samples when idle " +"and\n" +" this time passed\n" +" --log-level[=LEVEL] Increase or set verbosity level\n" +" -v Increase the verbosity level\n" +" --log-target={auto,syslog,stderr} Specify the log target\n" +" --log-meta[=BOOL] Include code location in log " +"messages\n" +" --log-time[=BOOL] Include timestamps in log messages\n" +" --log-backtrace=FRAMES Include a backtrace in log messages\n" +" -p, --dl-search-path=PATH Set the search path for dynamic " +"shared\n" +" objects (plugins)\n" +" --resample-method=METHOD Use the specified resampling method\n" +" (See --dump-resample-methods for\n" +" possible values)\n" +" --use-pid-file[=BOOL] Create a PID file\n" +" --no-cpu-limit[=BOOL] Do not install CPU load limiter on\n" +" platforms that support it.\n" +" --disable-shm[=BOOL] Disable shared memory support.\n" +"\n" +"STARTUP SCRIPT:\n" +" -L, --load=\"MODULE ARGUMENTS\" Load the specified plugin module " +"with\n" +" the specified argument\n" +" -F, --file=FILENAME Run the specified script\n" +" -C Open a command line on the running " +"TTY\n" +" after startup\n" +"\n" +" -n Don't load default script file\n" +msgstr "" +"%s [OPZIONI]\n" +"\n" +"COMANDI:\n" +" -h, --help Mostra questo aiuto\n" +" --version Mostra la versione\n" +" --dump-conf Riversa la configurazione " +"predefinita\n" +" --dump-modules Riversa l'elenco dei moduli " +"disponibili\n" +" --dump-resample-methods Riversa i metodi di ricampionamento\n" +" disponibili\n" +" --cleanup-shm Pulisce i segmenti di memoria " +"condivisa\n" +" esauriti\n" +" --start Avvia il demone se non è in " +"esecuzione\n" +" -k --kill Uccide un demone in esecuzione\n" +" --check Controlla la presenza di un demone " +"in\n" +" esecuzione (restituisce solo il " +"codice\n" +" di uscita)\n" +"\n" +"OPZIONI:\n" +" --system[=BOOL] Esegue un'istanza di sistema\n" +" -D, --daemonize[=BOOL] Rende demone dopo l'avvio\n" +" --fail[=BOOL] Esce quando l'avvio non riesce\n" +" --high-priority[=BOOL] Tenta di impostare un livello di " +"nice\n" +" elevato (disponibile solo come " +"root,\n" +" quando SUID o con RLIMIT_NICE " +"elevato)\n" +" --realtime[=BOOL] Tenta di abilitare lo scheduling\n" +" realtime (disponibile solo come " +"root,\n" +" quando SUID o con RLIMIT_RTPRIO " +"elevato)\n" +" --disallow-module-loading[=BOOL] Rifiuta il caricamento/rimozione " +"dei\n" +" moduli richiesti dall'utente dopo \n" +" l'avvio\n" +" --disallow-exit[=BOOL] Rifiuta le richieste utente di " +"uscita\n" +" --exit-idle-time=SECONDI Termina il demone quando inattivo e " +"una\n" +" volta trascorso questo tempo\n" +" --module-idle-time=SECONDI Rimuove i moduli caricati in modo\n" +" automatico quando inattivo e una " +"volta\n" +" trascorso questo tempo\n" +" --scache-idle-time=SECONDI Rimuove i campioni caricati in modo\n" +" automatico quando inattivo e una " +"volta\n" +" trascorso questo tempo\n" +" --log-level[=LIVELLO] Incrementa o imposta il livello di \n" +" verbosità\n" +" -v Incrementa il livello di verbosità\n" +" --log-target={auto,syslog,stderr} Specifica la destinazione del " +"registro\n" +" --log-meta[=BOOL] Include la posizione del codice " +"nei \n" +" messaggi di registro\n" +" --log-time[=BOOL] Include i marcatempo nei messaggi " +"di\n" +" registro\n" +" --log-backtrace=FRAME Include un backtrace nei messaggi " +"di \n" +" registro\n" +" -p, --dl-search-path=PERCORSO Imposta il percorso di ricerca per " +"gli \n" +" oggetti condivisi dinamici " +"(plugin)\n" +" --resample-method=METODO Usa il metodo di ricampionamento " +"indicato\n" +" (vedere --dump-resample-methods per " +"i\n" +" valori ammessi)\n" +" --use-pid-file[=BOOL] Crea un file PID\n" +" --no-cpu-limit[=BOOL] Non installa un limitatore di " +"carico\n" +" della CPU sulle piattaforme che " +"lo \n" +" supportano.\n" +" --disable-shm[=BOOL] Disabilita il supporto alla memoria\n" +" condivisa.\n" +"\n" +"SCRIPT DI AVVIO:\n" +" -L, --load=\"MODULO ARGOMENTI\" Carica il modulo di plugin " +"specificato\n" +" con gli argomenti specificati\n" +" -F, --file=NOME_FILE Esegue lo script specificato\n" +" -C Apre una riga di comando sulla TTY " +"in \n" +" esecuzione dopo l'avvio\n" +"\n" +" -n Non carica il file script " +"predefinito\n" + +#: ../src/daemon/cmdline.c:247 +msgid "--daemonize expects boolean argument" +msgstr "--daemonize richiede un argomento booleano" + +#: ../src/daemon/cmdline.c:254 +msgid "--fail expects boolean argument" +msgstr "--fail richiede un argomento booleano" + +#: ../src/daemon/cmdline.c:264 +msgid "" +"--log-level expects log level argument (either numeric in range 0..4 or one " +"of debug, info, notice, warn, error)." +msgstr "" +"--log-level richiede il livello di registro come argomento (sia " +"nell'intervallo numerico 0..4 oppure uno tra debug, info, notice, warn, " +"error)." + +#: ../src/daemon/cmdline.c:276 +msgid "--high-priority expects boolean argument" +msgstr "--high-priority richiede un argomento booleano" + +#: ../src/daemon/cmdline.c:283 +msgid "--realtime expects boolean argument" +msgstr "--realtime richiede un argomento booleano" + +#: ../src/daemon/cmdline.c:290 +msgid "--disallow-module-loading expects boolean argument" +msgstr "--disallow-module-loading richiede un argomento booleano" + +#: ../src/daemon/cmdline.c:297 +msgid "--disallow-exit expects boolean argument" +msgstr "--disallow-exit richiede un argomento booleano" + +#: ../src/daemon/cmdline.c:304 +msgid "--use-pid-file expects boolean argument" +msgstr "--use-pid-file richiede un argomento booleano" + +#: ../src/daemon/cmdline.c:321 +msgid "Invalid log target: use either 'syslog', 'stderr' or 'auto'." +msgstr "" +"Destinazione del registro non valida: usare \"syslog\", \"stderr\" o \"auto" +"\"." + +#: ../src/daemon/cmdline.c:328 +msgid "--log-time expects boolean argument" +msgstr "--log-time richiede un argomento booleano" + +#: ../src/daemon/cmdline.c:335 +msgid "--log-meta expects boolean argument" +msgstr "--log-meta richiede un argomento booleano" + +#: ../src/daemon/cmdline.c:354 +#, c-format +msgid "Invalid resample method '%s'." +msgstr "Metodo di ricampionamento \"%s\" non valido." + +#: ../src/daemon/cmdline.c:361 +msgid "--system expects boolean argument" +msgstr "--system richiede un argomento booleano" + +#: ../src/daemon/cmdline.c:368 +msgid "--no-cpu-limit expects boolean argument" +msgstr "--no-cpu-limit richiede un argomento booleano" + +#: ../src/daemon/cmdline.c:375 +msgid "--disable-shm expects boolean argument" +msgstr "--disable-shm richiede un argomento booleano" + +#: ../src/daemon/dumpmodules.c:60 +#, c-format +msgid "Name: %s\n" +msgstr "Nome: %s\n" + +#: ../src/daemon/dumpmodules.c:63 +#, c-format +msgid "No module information available\n" +msgstr "Nessuna informazione disponibile sul modulo\n" + +#: ../src/daemon/dumpmodules.c:66 +#, c-format +msgid "Version: %s\n" +msgstr "Versione: %s\n" + +#: ../src/daemon/dumpmodules.c:68 +#, c-format +msgid "Description: %s\n" +msgstr "Descrizione: %s\n" + +#: ../src/daemon/dumpmodules.c:70 +#, c-format +msgid "Author: %s\n" +msgstr "Autore: %s\n" + +#: ../src/daemon/dumpmodules.c:72 +#, c-format +msgid "Usage: %s\n" +msgstr "Uso: %s\n" + +# %s è sì/no +#: ../src/daemon/dumpmodules.c:73 +#, c-format +msgid "Load Once: %s\n" +msgstr "Caricato una sola volta: %s\n" + +#: ../src/daemon/dumpmodules.c:75 +#, c-format +msgid "DEPRECATION WARNING: %s\n" +msgstr "ATTENZIONE, DEPRECATI: %s\n" + +#: ../src/daemon/dumpmodules.c:79 +#, c-format +msgid "Path: %s\n" +msgstr "Percorso: %s\n" + +#: ../src/daemon/daemon-conf.c:232 +#, c-format +msgid "[%s:%u] Invalid log target '%s'." +msgstr "[%s:%u] Destinazione di registro \"%s\" non valida." + +#: ../src/daemon/daemon-conf.c:248 +#, c-format +msgid "[%s:%u] Invalid log level '%s'." +msgstr "[%s:%u] Livello di registro \"%s\" non valido." + +#: ../src/daemon/daemon-conf.c:264 +#, c-format +msgid "[%s:%u] Invalid resample method '%s'." +msgstr "[%s:%u] Metodo di ricampionamento \"%s\" non valido." + +#: ../src/daemon/daemon-conf.c:287 +#, c-format +msgid "[%s:%u] Invalid rlimit '%s'." +msgstr "[%s:%u] rlimit \"%s\" non valido." + +#: ../src/daemon/daemon-conf.c:294 +#, c-format +msgid "[%s:%u] rlimit not supported on this platform." +msgstr "[%s:%u] rlimit non supportato su questa piattaforma." + +# o campionamento?? ma campionamento non è sampling? +#: ../src/daemon/daemon-conf.c:310 +#, c-format +msgid "[%s:%u] Invalid sample format '%s'." +msgstr "[%s:%u] Formato di campionamento \"%s\" non valido." + +#: ../src/daemon/daemon-conf.c:328 +#, c-format +msgid "[%s:%u] Invalid sample rate '%s'." +msgstr "[%s:%u] Frequenza di campionamento '%s' non valida." + +#: ../src/daemon/daemon-conf.c:352 +#, c-format +msgid "[%s:%u] Invalid sample channels '%s'." +msgstr "[%s:%u] Canali di campionamento \"%s\" non validi." + +#: ../src/daemon/daemon-conf.c:370 +#, c-format +msgid "[%s:%u] Invalid channel map '%s'." +msgstr "[%s:%u] Mappa del canale \"%s\" non valida." + +#: ../src/daemon/daemon-conf.c:388 +#, c-format +msgid "[%s:%u] Invalid number of fragments '%s'." +msgstr "[%s:%u] Numero di frammenti \"%s\" non valido." + +#: ../src/daemon/daemon-conf.c:406 +#, c-format +msgid "[%s:%u] Invalid fragment size '%s'." +msgstr "[%s:%u] Dimensione dei frammenti \"%s\" non valida." + +#: ../src/daemon/daemon-conf.c:424 +#, c-format +msgid "[%s:%u] Invalid nice level '%s'." +msgstr "[%s:%u] Livello di nice \"%s\" non valido." + +#: ../src/daemon/daemon-conf.c:546 +#, c-format +msgid "Failed to open configuration file: %s" +msgstr "Apertura del file di configurazione non riuscita: %s" + +#: ../src/daemon/daemon-conf.c:562 +msgid "" +"The specified default channel map has a different number of channels than " +"the specified default number of channels." +msgstr "" +"La mappa del canale predefinita specificata presenta un numero diverso di " +"canali rispetto a quello predefinito specificato." + +#: ../src/daemon/daemon-conf.c:638 +#, c-format +msgid "### Read from configuration file: %s ###\n" +msgstr "### Lettura dal file di configurazione: %s ###\n" + +#: ../src/daemon/caps.c:62 +msgid "Cleaning up privileges." +msgstr "Abbandono dei privilegi." + +#: ../src/daemon/pulseaudio.desktop.in.h:1 +msgid "PulseAudio Sound System" +msgstr "Sistema sonoro PulseAudio" + +#: ../src/daemon/pulseaudio.desktop.in.h:2 +msgid "Start the PulseAudio Sound System" +msgstr "Avvia il sistema sonoro PulseAudio" + +#: ../src/pulse/channelmap.c:105 ../src/pulse/channelmap.c:757 +msgid "Mono" +msgstr "Mono" + +# frontale centrale non si usa in HiFi +# solo centrale. +#: ../src/pulse/channelmap.c:107 +msgid "Front Center" +msgstr "Centrale" + +#: ../src/pulse/channelmap.c:108 +msgid "Front Left" +msgstr "Frontale sinistro" + +#: ../src/pulse/channelmap.c:109 +msgid "Front Right" +msgstr "Frontale destro" + +#: ../src/pulse/channelmap.c:111 +msgid "Rear Center" +msgstr "Centrale posteriore" + +#: ../src/pulse/channelmap.c:112 +msgid "Rear Left" +msgstr "Posteriore sinistro" + +#: ../src/pulse/channelmap.c:113 +msgid "Rear Right" +msgstr "Posteriore destro" + +#: ../src/pulse/channelmap.c:115 +msgid "Low Frequency Emmiter" +msgstr "Emettitore basse frequenze" + +#: ../src/pulse/channelmap.c:117 +msgid "Front Left-of-center" +msgstr "Frontale sinistra-del-centro" + +#: ../src/pulse/channelmap.c:118 +msgid "Front Right-of-center" +msgstr "Frontale destra-del-centro" + +#: ../src/pulse/channelmap.c:120 +msgid "Side Left" +msgstr "Laterale sinistro" + +#: ../src/pulse/channelmap.c:121 +msgid "Side Right" +msgstr "Laterale destro" + +#: ../src/pulse/channelmap.c:123 +msgid "Auxiliary 0" +msgstr "Ausiliario 0" + +#: ../src/pulse/channelmap.c:124 +msgid "Auxiliary 1" +msgstr "Ausiliario 1" + +#: ../src/pulse/channelmap.c:125 +msgid "Auxiliary 2" +msgstr "Ausiliario 2" + +#: ../src/pulse/channelmap.c:126 +msgid "Auxiliary 3" +msgstr "Ausiliario 3" + +#: ../src/pulse/channelmap.c:127 +msgid "Auxiliary 4" +msgstr "Ausiliario 4" + +#: ../src/pulse/channelmap.c:128 +msgid "Auxiliary 5" +msgstr "Ausiliario 5" + +#: ../src/pulse/channelmap.c:129 +msgid "Auxiliary 6" +msgstr "Ausiliario 6" + +#: ../src/pulse/channelmap.c:130 +msgid "Auxiliary 7" +msgstr "Ausiliario 7" + +#: ../src/pulse/channelmap.c:131 +msgid "Auxiliary 8" +msgstr "Ausiliario 8" + +#: ../src/pulse/channelmap.c:132 +msgid "Auxiliary 9" +msgstr "Ausiliario 9" + +#: ../src/pulse/channelmap.c:133 +msgid "Auxiliary 10" +msgstr "Ausiliario 10" + +#: ../src/pulse/channelmap.c:134 +msgid "Auxiliary 11" +msgstr "Ausiliario 11" + +#: ../src/pulse/channelmap.c:135 +msgid "Auxiliary 12" +msgstr "Ausiliario 12" + +#: ../src/pulse/channelmap.c:136 +msgid "Auxiliary 13" +msgstr "Ausiliario 13" + +#: ../src/pulse/channelmap.c:137 +msgid "Auxiliary 14" +msgstr "Ausiliario 14" + +#: ../src/pulse/channelmap.c:138 +msgid "Auxiliary 15" +msgstr "Ausiliario 15" + +#: ../src/pulse/channelmap.c:139 +msgid "Auxiliary 16" +msgstr "Ausiliario 16" + +#: ../src/pulse/channelmap.c:140 +msgid "Auxiliary 17" +msgstr "Ausiliario 17" + +#: ../src/pulse/channelmap.c:141 +msgid "Auxiliary 18" +msgstr "Ausiliario 18" + +#: ../src/pulse/channelmap.c:142 +msgid "Auxiliary 19" +msgstr "Ausiliario 19" + +#: ../src/pulse/channelmap.c:143 +msgid "Auxiliary 20" +msgstr "Ausiliario 20" + +#: ../src/pulse/channelmap.c:144 +msgid "Auxiliary 21" +msgstr "Ausiliario 21" + +#: ../src/pulse/channelmap.c:145 +msgid "Auxiliary 22" +msgstr "Ausiliario 22" + +#: ../src/pulse/channelmap.c:146 +msgid "Auxiliary 23" +msgstr "Ausiliario 23" + +#: ../src/pulse/channelmap.c:147 +msgid "Auxiliary 24" +msgstr "Ausiliario 24" + +#: ../src/pulse/channelmap.c:148 +msgid "Auxiliary 25" +msgstr "Ausiliario 25" + +#: ../src/pulse/channelmap.c:149 +msgid "Auxiliary 26" +msgstr "Ausiliario 26" + +#: ../src/pulse/channelmap.c:150 +msgid "Auxiliary 27" +msgstr "Ausiliario 27" + +#: ../src/pulse/channelmap.c:151 +msgid "Auxiliary 28" +msgstr "Ausiliario 28" + +#: ../src/pulse/channelmap.c:152 +msgid "Auxiliary 29" +msgstr "Ausiliario 29" + +#: ../src/pulse/channelmap.c:153 +msgid "Auxiliary 30" +msgstr "Ausiliario 30" + +#: ../src/pulse/channelmap.c:154 +msgid "Auxiliary 31" +msgstr "Ausiliario 31" + +#: ../src/pulse/channelmap.c:156 +msgid "Top Center" +msgstr "Centrale superiore" + +#: ../src/pulse/channelmap.c:158 +msgid "Top Front Center" +msgstr "Superiore frontale centrale" + +#: ../src/pulse/channelmap.c:159 +msgid "Top Front Left" +msgstr "Superiore frontale sinistro" + +#: ../src/pulse/channelmap.c:160 +msgid "Top Front Right" +msgstr "Superiore frontale destro" + +#: ../src/pulse/channelmap.c:162 +msgid "Top Rear Center" +msgstr "Superiore posteriore centrale" + +#: ../src/pulse/channelmap.c:163 +msgid "Top Rear Left" +msgstr "Superiore posteriore sinistro" + +#: ../src/pulse/channelmap.c:164 +msgid "Top Rear Right" +msgstr "Superiore posteriore destro" + +#: ../src/pulse/channelmap.c:484 ../src/pulse/sample.c:170 +#: ../src/pulse/volume.c:295 ../src/pulse/volume.c:321 +#: ../src/pulse/volume.c:341 ../src/pulse/volume.c:371 +msgid "(invalid)" +msgstr "(non valido)" + +#: ../src/pulse/channelmap.c:761 +msgid "Stereo" +msgstr "Stereo" + +#: ../src/pulse/channelmap.c:766 +msgid "Surround 4.0" +msgstr "Surround 4.0" + +#: ../src/pulse/channelmap.c:772 +msgid "Surround 4.1" +msgstr "Surround 4.1" + +#: ../src/pulse/channelmap.c:778 +msgid "Surround 5.0" +msgstr "Surround 5.0" + +#: ../src/pulse/channelmap.c:784 +msgid "Surround 5.1" +msgstr "Surround 5.1" + +#: ../src/pulse/channelmap.c:791 +msgid "Surround 7.1" +msgstr "Surround 7.1" + +#: ../src/pulse/error.c:43 +msgid "OK" +msgstr "OK" + +#: ../src/pulse/error.c:44 +msgid "Access denied" +msgstr "Accesso negato" + +#: ../src/pulse/error.c:45 +msgid "Unknown command" +msgstr "Comando sconosciuto" + +#: ../src/pulse/error.c:46 +msgid "Invalid argument" +msgstr "Argomento non valido" + +#: ../src/pulse/error.c:47 +msgid "Entity exists" +msgstr "L'entità esiste" + +#: ../src/pulse/error.c:48 +msgid "No such entity" +msgstr "Entità inesistente" + +#: ../src/pulse/error.c:49 +msgid "Connection refused" +msgstr "Connessione rifiutata" + +#: ../src/pulse/error.c:50 +msgid "Protocol error" +msgstr "Errore di protocollo" + +#: ../src/pulse/error.c:51 +msgid "Timeout" +msgstr "Timeout" + +#: ../src/pulse/error.c:52 +msgid "No authorization key" +msgstr "Nessuna chiave di autorizzazione" + +#: ../src/pulse/error.c:53 +msgid "Internal error" +msgstr "Errore interno" + +#: ../src/pulse/error.c:54 +msgid "Connection terminated" +msgstr "Connessione terminata" + +#: ../src/pulse/error.c:55 +msgid "Entity killed" +msgstr "Entità uccisa" + +#: ../src/pulse/error.c:56 +msgid "Invalid server" +msgstr "Server non valido" + +#: ../src/pulse/error.c:57 +msgid "Module initalization failed" +msgstr "Inizializzazione del modulo non riuscita" + +#: ../src/pulse/error.c:58 +msgid "Bad state" +msgstr "Stato errato" + +#: ../src/pulse/error.c:59 +msgid "No data" +msgstr "Nessun dato" + +#: ../src/pulse/error.c:60 +msgid "Incompatible protocol version" +msgstr "Versione di protocollo incompatibile" + +#: ../src/pulse/error.c:61 +msgid "Too large" +msgstr "Troppo grande" + +#: ../src/pulse/error.c:62 +msgid "Not supported" +msgstr "Non supportato" + +#: ../src/pulse/error.c:63 +msgid "Unknown error code" +msgstr "Codice d'errore sconosciuto" + +#: ../src/pulse/error.c:64 +msgid "No such extension" +msgstr "Estensione inesistente" + +#: ../src/pulse/error.c:65 +msgid "Obsolete functionality" +msgstr "Funzionalità obsoleta" + +#: ../src/pulse/error.c:66 +msgid "Missing implementation" +msgstr "Implementazione mancante" + +#: ../src/pulse/error.c:67 +msgid "Client forked" +msgstr "Fork del client" + +#: ../src/pulse/error.c:68 +msgid "Input/Output error" +msgstr "Errore di input/output" + +#: ../src/pulse/error.c:69 +msgid "Device or resource busy" +msgstr "Dispositivo o risorsa occupata" + +#: ../src/pulse/sample.c:172 +#, c-format +msgid "%s %uch %uHz" +msgstr "%s ch %u %u Hz" + +#: ../src/pulse/sample.c:184 +#, c-format +msgid "%0.1f GiB" +msgstr "%0.1f GiB" + +#: ../src/pulse/sample.c:186 +#, c-format +msgid "%0.1f MiB" +msgstr "%0.1f MiB" + +#: ../src/pulse/sample.c:188 +#, c-format +msgid "%0.1f KiB" +msgstr "%0.1f KiB" + +#: ../src/pulse/sample.c:190 +#, c-format +msgid "%u B" +msgstr "%u B" + +#: ../src/pulse/client-conf-x11.c:55 ../src/utils/pax11publish.c:100 +msgid "XOpenDisplay() failed" +msgstr "XOpenDisplay() non riuscita" + +#: ../src/pulse/client-conf-x11.c:93 +msgid "Failed to parse cookie data" +msgstr "Analisi dei dati cookie non riuscita" + +#: ../src/pulse/client-conf.c:111 +#, c-format +msgid "Failed to open configuration file '%s': %s" +msgstr "Apertura del file di configurazione \"%s\" non riuscita: %s" + +#: ../src/pulse/context.c:550 +msgid "No cookie loaded. Attempting to connect without." +msgstr "Nessun cookie caricato. Tentativo di connettersi senza." + +#: ../src/pulse/context.c:693 +#, c-format +msgid "fork(): %s" +msgstr "fork(): %s" + +#: ../src/pulse/context.c:748 +#, c-format +msgid "waitpid(): %s" +msgstr "waitpid(): %s" + +#: ../src/pulse/context.c:1438 +#, c-format +msgid "Received message for unknown extension '%s'" +msgstr "Ricevuto messaggio per l'estensione sconosciuta \"%s\"" + +#: ../src/utils/pacat.c:108 +#, c-format +msgid "Failed to drain stream: %s" +msgstr "Svuotamento dello stream non riuscito: %s" + +#: ../src/utils/pacat.c:113 +msgid "Playback stream drained." +msgstr "Stream di riproduzione svuotato." + +#: ../src/utils/pacat.c:123 +msgid "Draining connection to server." +msgstr "Svuotamento della connessione sul server." + +#: ../src/utils/pacat.c:136 +#, c-format +msgid "pa_stream_drain(): %s" +msgstr "pa_stream_drain(): %s" + +#: ../src/utils/pacat.c:159 +#, c-format +msgid "pa_stream_write() failed: %s" +msgstr "pa_stream_write() non riuscita: %s" + +#: ../src/utils/pacat.c:197 +#, c-format +msgid "pa_stream_begin_write() failed: %s" +msgstr "pa_stream_begin_write() non riuscita: %s" + +#: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267 +#, c-format +msgid "pa_stream_peek() failed: %s" +msgstr "pa_stream_peek() non riuscita: %s" + +#: ../src/utils/pacat.c:307 +msgid "Stream successfully created." +msgstr "Creazione dello stream riuscita." + +#: ../src/utils/pacat.c:310 +#, c-format +msgid "pa_stream_get_buffer_attr() failed: %s" +msgstr "pa_stream_get_buffer_attr() non riuscita: %s" + +# maxlength, fragsize e gli altri non so se vanno tradotti... +#: ../src/utils/pacat.c:314 +#, c-format +msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u" +msgstr "Metriche del buffer: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u" + +# maxlength e fragsize non so se vanno tradotti... +#: ../src/utils/pacat.c:317 +#, c-format +msgid "Buffer metrics: maxlength=%u, fragsize=%u" +msgstr "Metriche del buffer: maxlength=%u, fragsize=%u" + +#: ../src/utils/pacat.c:321 +#, c-format +msgid "Using sample spec '%s', channel map '%s'." +msgstr "In uso specifica di campionamento \"%s\", mappa dei canali \"%s\"." + +#: ../src/utils/pacat.c:325 +#, c-format +msgid "Connected to device %s (%u, %ssuspended)." +msgstr "Connesso al device %s (%u, %ssospeso)." + +#: ../src/utils/pacat.c:335 +#, c-format +msgid "Stream error: %s" +msgstr "Errore di stream: %s" + +#: ../src/utils/pacat.c:345 +#, c-format +msgid "Stream device suspended.%s" +msgstr "Device stream sospeso.%s " + +#: ../src/utils/pacat.c:347 +#, c-format +msgid "Stream device resumed.%s" +msgstr "Device stream ripristinato.%s " + +#: ../src/utils/pacat.c:355 +#, c-format +msgid "Stream underrun.%s" +msgstr "Underrun dello stream.%s" + +#: ../src/utils/pacat.c:362 +#, c-format +msgid "Stream overrun.%s" +msgstr "Overrun dello stream.%s" + +#: ../src/utils/pacat.c:369 +#, c-format +msgid "Stream started.%s" +msgstr "Stream avviato.%s" + +#: ../src/utils/pacat.c:376 +#, c-format +msgid "Stream moved to device %s (%u, %ssuspended).%s" +msgstr "Stream spostato sul device %s (%u, %ssospeso).%s" + +#: ../src/utils/pacat.c:376 +msgid "not " +msgstr "non " + +#: ../src/utils/pacat.c:383 +#, c-format +msgid "Stream buffer attributes changed.%s" +msgstr "Attributi del buffer di stream cambiati.%s" + +#: ../src/utils/pacat.c:415 +#, c-format +msgid "Connection established.%s" +msgstr "Connessione stabilita.%s" + +#: ../src/utils/pacat.c:418 +#, c-format +msgid "pa_stream_new() failed: %s" +msgstr "pa_stream_new() non riuscita: %s" + +#: ../src/utils/pacat.c:450 +#, c-format +msgid "pa_stream_connect_playback() failed: %s" +msgstr "pa_stream_connect_playback() non riuscita: %s" + +#: ../src/utils/pacat.c:456 +#, c-format +msgid "pa_stream_connect_record() failed: %s" +msgstr "pa_stream_connect_record() non riuscita: %s" + +#: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857 +#, c-format +msgid "Connection failure: %s" +msgstr "Connessione non riuscita: %s" + +#: ../src/utils/pacat.c:503 +msgid "Got EOF." +msgstr "Ricevuto EOF." + +#: ../src/utils/pacat.c:540 +#, c-format +msgid "write() failed: %s" +msgstr "write() non riuscita: %s" + +#: ../src/utils/pacat.c:561 +msgid "Got signal, exiting." +msgstr "Ricevuto il segnale, uscita." + +#: ../src/utils/pacat.c:575 +#, c-format +msgid "Failed to get latency: %s" +msgstr "Recupero della latenza non riuscito: %s" + +# dubbio: tempo o durata?? +#: ../src/utils/pacat.c:580 +#, c-format +msgid "Time: %0.3f sec; Latency: %0.0f usec." +msgstr "Tempo: %0.3f sec; Latenza: %0.0f microsec." + +#: ../src/utils/pacat.c:599 +#, c-format +msgid "pa_stream_update_timing_info() failed: %s" +msgstr "pa_stream_update_timing_info() non riuscita: %s" + +#: ../src/utils/pacat.c:609 +#, c-format +msgid "" +"%s [options]\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -r, --record Create a connection for recording\n" +" -p, --playback Create a connection for playback\n" +"\n" +" -v, --verbose Enable verbose operations\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -d, --device=DEVICE The name of the sink/source to " +"connect to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" +" --stream-name=NAME How to call this stream on the " +"server\n" +" --volume=VOLUME Specify the initial (linear) volume " +"in range 0...65536\n" +" --rate=SAMPLERATE The sample rate in Hz (defaults to " +"44100)\n" +" --format=SAMPLEFORMAT The sample type, one of s16le, " +"s16be, u8, float32le,\n" +" float32be, ulaw, alaw, s32le, s32be, " +"s24le, s24be,\n" +" s24-32le, s24-32be (defaults to " +"s16ne)\n" +" --channels=CHANNELS The number of channels, 1 for mono, " +"2 for stereo\n" +" (defaults to 2)\n" +" --channel-map=CHANNELMAP Channel map to use instead of the " +"default\n" +" --fix-format Take the sample format from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-rate Take the sampling rate from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-channels Take the number of channels and the " +"channel map\n" +" from the sink the stream is being " +"connected to.\n" +" --no-remix Don't upmix or downmix channels.\n" +" --no-remap Map channels by index instead of " +"name.\n" +" --latency=BYTES Request the specified latency in " +"bytes.\n" +" --process-time=BYTES Request the specified process time " +"per request in bytes.\n" +" --property=PROPERTY=VALUE Set the specified property to the " +"specified value.\n" +" --raw Record/play raw PCM data.\n" +" --file-format=FFORMAT Record/play formatted PCM data.\n" +" --list-file-formats List available file formats.\n" +msgstr "" +"%s [OPZIONI]\n" +"\n" +" -h, --help Mostra questo aiuto\n" +" --version Mostra la versione\n" +"\n" +" -r, --record Crea una connessione per registrare\n" +" -p, --playback Crea una connessione per riprodurre\n" +"\n" +" -v, --verbose Abilita la modalità prolissa\n" +"\n" +" -s, --server=SERVER Il nome del server a cui " +"connettersi\n" +" -d, --device=DEVICE Il nome del sink/sorgente a cui\n" +" connettersi\n" +" -n, --client-name=NOME Come chiamare questo client sul " +"server\n" +" --stream-name=NOME Come chiamare questo stream sul " +"server\n" +" --volume=VOLUME Specifica il volume iniziale " +"(lineare) \n" +" nell'intervallo 0...65536\n" +" --rate=FREQ_CAMP La frequenza di campionamento in Hz\n" +" (44100 come predefinita)\n" +" --format=FORM_CAMP Il tipo di campionamento. Valori " +"ammessi\n" +" sono: s16le, s16be, u8, float32le,\n" +" float32be, ulaw, alaw, s32le, " +"s32be\n" +" (s16ne come predefinito)\n" +" --channels=CANALI Il numero di canali, 1 per mono, 2 " +"per\n" +" stereo (2 come predefinito)\n" +" --channel-map=MAP_CANALI La mappa dei canali da usare al " +"posto di\n" +" quella predefinita\n" +" --fix-format Recupera il formato di " +"campionamento\n" +" dal sink a cui lo stream sta per " +"essere\n" +" connesso\n" +" --fix-rate Recupera la frequenza di " +"campionamento\n" +" dal sink a cui lo stream sta per " +"essere\n" +" connesso\n" +" --fix-channels Recupera il numero di canali e la " +"mappa\n" +" dei canali dal sink a cui lo " +"stream \n" +" sta per essere connesso\n" +" --no-remix Non esegue l'upmix o il downmix \n" +" dei canali\n" +" --no-remap Mappa i canali per indice invece " +"che \n" +" per nome\n" +" --latency=BYTE Richiede la latenza specificata in " +"byte\n" +" --process-time=BYTE Richiede il tempo di elaborazione " +"per\n" +" richiesta specificato in byte\n" +" --property=PROPRIETÀ=VAL Imposta la proprietà al valore " +"specificato\n" +" --raw Registra/riproduce dati PCM grezzi\n" +" --file-format=FFORMAT Registra/riproduce dati PCM " +"formattati\n" +" --list-file-FORMATI Elenca i formati disponibili.\n" + +#: ../src/utils/pacat.c:731 +#, c-format +msgid "" +"pacat %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pacat %s\n" +"Compilato con libpulse %s\n" +"Link eseguito con libpulse %s\n" + +#: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953 +#, c-format +msgid "Invalid client name '%s'" +msgstr "Nome del client \"%s\" non valido" + +#: ../src/utils/pacat.c:779 +#, c-format +msgid "Invalid stream name '%s'" +msgstr "Nome dello stream \"%s\" non valido" + +#: ../src/utils/pacat.c:816 +#, c-format +msgid "Invalid channel map '%s'" +msgstr "Mappa dei canali \"%s\" non valida" + +#: ../src/utils/pacat.c:845 +#, c-format +msgid "Invalid latency specification '%s'" +msgstr "Specifica di latenza \"%s\" non valida" + +# esecuzione??? +#: ../src/utils/pacat.c:852 +#, c-format +msgid "Invalid process time specification '%s'" +msgstr "Specifica di tempo di elaborazione \"%s\" non valida" + +#: ../src/utils/pacat.c:864 +#, c-format +msgid "Invalid property '%s'" +msgstr "Proprietà \"%s\" non valida" + +#: ../src/utils/pacat.c:881 +#, c-format +msgid "Unknown file format %s." +msgstr "Formato file %s sconosciuto." + +#: ../src/utils/pacat.c:900 +msgid "Invalid sample specification" +msgstr "Specifica di campionamento non valida" + +#: ../src/utils/pacat.c:910 +#, c-format +msgid "open(): %s" +msgstr "open(): %s" + +#: ../src/utils/pacat.c:915 +#, c-format +msgid "dup2(): %s" +msgstr "dup2(): %s" + +#: ../src/utils/pacat.c:922 +msgid "Too many arguments." +msgstr "Troppi argomenti." + +#: ../src/utils/pacat.c:933 +msgid "Failed to generate sample specification for file." +msgstr "Generazione della specifica di campionamento per il file non riuscita." + +#: ../src/utils/pacat.c:953 +msgid "Failed to open audio file." +msgstr "Apertura del file audio non riuscita." + +#: ../src/utils/pacat.c:959 +msgid "" +"Warning: specified sample specification will be overwritten with " +"specification from file." +msgstr "" +"Attenzione: la specifica di campionamento indicata verrà soprascritta con " +"quella dal file." + +#: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997 +msgid "Failed to determine sample specification from file." +msgstr "Determinazione della specifica di campionamento dal file non riuscita." + +#: ../src/utils/pacat.c:971 +msgid "Warning: Failed to determine channel map from file." +msgstr "" +"Attenzione: determinazione della mappa dei canali dal file non riuscita." + +#: ../src/utils/pacat.c:982 +msgid "Channel map doesn't match sample specification" +msgstr "La mappa dei canali non corrisponde alla specifica di campionamento" + +#: ../src/utils/pacat.c:993 +msgid "Warning: failed to write channel map to file." +msgstr "Attenzione: scrittura della mappa dei canali su file non riuscita." + +#: ../src/utils/pacat.c:1008 +#, c-format +msgid "" +"Opening a %s stream with sample specification '%s' and channel map '%s'." +msgstr "" +"Apertura di uno stream %s con specifica di campionamento \"%s\" e mappa dei " +"canali \"%s\"." + +#: ../src/utils/pacat.c:1009 +msgid "recording" +msgstr "registrazione" + +#: ../src/utils/pacat.c:1009 +msgid "playback" +msgstr "riproduzione" + +#: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267 +msgid "pa_mainloop_new() failed." +msgstr "pa_mainloop_new() non riuscita." + +#: ../src/utils/pacat.c:1054 +msgid "io_new() failed." +msgstr "io_new() non riuscita." + +#: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279 +msgid "pa_context_new() failed." +msgstr "pa_context_new() non riuscita." + +#: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285 +#, c-format +msgid "pa_context_connect() failed: %s" +msgstr "pa_context_connect() non riuscita: %s" + +#: ../src/utils/pacat.c:1075 +msgid "pa_context_rttime_new() failed." +msgstr "pa_context_rttime_new() non riuscita." + +#: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290 +msgid "pa_mainloop_run() failed." +msgstr "pa_mainloop_run() non riuscita." + +#: ../src/utils/pasuspender.c:81 +#, c-format +msgid "fork(): %s\n" +msgstr "fork(): %s\n" + +#: ../src/utils/pasuspender.c:92 +#, c-format +msgid "execvp(): %s\n" +msgstr "execvp(): %s\n" + +#: ../src/utils/pasuspender.c:109 +#, c-format +msgid "Failure to suspend: %s\n" +msgstr "Sospensione non riuscita: %s\n" + +#: ../src/utils/pasuspender.c:124 +#, c-format +msgid "Failure to resume: %s\n" +msgstr "Ripristino non riuscito: %s\n" + +# cambiato un po' la parte finale... +#: ../src/utils/pasuspender.c:147 +#, c-format +msgid "WARNING: Sound server is not local, not suspending.\n" +msgstr "ATTENZIONE: server audio non locale, impossibile sospendere.\n" + +#: ../src/utils/pasuspender.c:159 +#, c-format +msgid "Connection failure: %s\n" +msgstr "Connessione non riuscita: %s\n" + +#: ../src/utils/pasuspender.c:176 +#, c-format +msgid "Got SIGINT, exiting.\n" +msgstr "Ricevuto SIGINT, in uscita.\n" + +#: ../src/utils/pasuspender.c:194 +#, c-format +msgid "WARNING: Child process terminated by signal %u\n" +msgstr "ATTENZIONE: processo figlio terminato dal segnale %u\n" + +#: ../src/utils/pasuspender.c:212 +#, c-format +msgid "" +"%s [options] ... \n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +"\n" +msgstr "" +"%s [OPZIONI] ... \n" +"\n" +" -h, --help Mostra questo aiuto\n" +" --version Mostra la versione\n" +" -s, --server=SERVER Il nome del server a cui " +"connettersi\n" +"\n" + +#: ../src/utils/pasuspender.c:248 +#, c-format +msgid "" +"pasuspender %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pasuspender %s\n" +"Compilato con libpulse %s\n" +"Link eseguito con libpulse %s\n" + +#: ../src/utils/pasuspender.c:277 +#, c-format +msgid "pa_mainloop_new() failed.\n" +msgstr "pa_mainloop_new() non riuscita.\n" + +#: ../src/utils/pasuspender.c:290 +#, c-format +msgid "pa_context_new() failed.\n" +msgstr "pa_context_new() non riuscita.\n" + +#: ../src/utils/pasuspender.c:298 +#, c-format +msgid "pa_mainloop_run() failed.\n" +msgstr "pa_mainloop_run() non riuscita.\n" + +#: ../src/utils/pactl.c:135 +#, c-format +msgid "Failed to get statistics: %s" +msgstr "Recupero delle statistiche non riuscito: %s" + +#: ../src/utils/pactl.c:141 +#, c-format +msgid "Currently in use: %u blocks containing %s bytes total.\n" +msgstr "Attualmente in uso: %u blocchi contenenti %s byte in totale.\n" + +#: ../src/utils/pactl.c:144 +#, c-format +msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n" +msgstr "" +"Allocati durante l'intera esecuzione: %u blocchi contenenti %s byte in " +"totale.\n" + +#: ../src/utils/pactl.c:147 +#, c-format +msgid "Sample cache size: %s\n" +msgstr "Dimensione della cache dei campioni: %s\n" + +#: ../src/utils/pactl.c:156 +#, c-format +msgid "Failed to get server information: %s" +msgstr "Recupero delle informazioni del server non riuscito: %s" + +#: ../src/utils/pactl.c:164 +#, c-format +msgid "" +"User name: %s\n" +"Host Name: %s\n" +"Server Name: %s\n" +"Server Version: %s\n" +"Default Sample Specification: %s\n" +"Default Channel Map: %s\n" +"Default Sink: %s\n" +"Default Source: %s\n" +"Cookie: %08x\n" +msgstr "" +"Nome utente: %s\n" +"Nome host: %s\n" +"Nome server: %s\n" +"Versione server: %s\n" +"Specifica campionamento predefinita: %s\n" +"Mappa canale predefinita: %s\n" +"Sink predefinito: %s\n" +"Sorgente predefinita: %s\n" +"Cookie: %08x\n" + +#: ../src/utils/pactl.c:205 +#, c-format +msgid "Failed to get sink information: %s" +msgstr "Recupero delle informazioni del sink non riuscito: %s" + +# nel relativo messaggio per il source +# c'è "monitor of sink", quindi assumo che +# qui dovesse essere "monitor of source" +#: ../src/utils/pactl.c:221 +#, c-format +msgid "" +"Sink #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor Source: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Sink #%u\n" +"\tStato: %s\n" +"\tNome: %s\n" +"\tDescrizione: %s\n" +"\tDriver: %s\n" +"\tSpecifica di campionamento: %s\n" +"\tMappa dei canali: %s\n" +"\tModulo di appartenenza: %u\n" +"\tMuto: %s\n" +"\tVolume: %s%s%s\n" +"\t bilanciamento %0.2f\n" +"\tVolume base: %s%s%s\n" +"\tMonitor della sorgente: %s\n" +"\tLatenza: %0.0f microsec, configurata %0.0f microsec\n" +"\tFlag: %s%s%s%s%s%s\n" +"\tProprietà:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360 +#, c-format +msgid "\tPorts:\n" +msgstr "\tPorte:\n" + +#: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366 +#, c-format +msgid "\tActive Port: %s\n" +msgstr "\tPorta attiva: %s\n" + +#: ../src/utils/pactl.c:297 +#, c-format +msgid "Failed to get source information: %s" +msgstr "Recupero delle informazioni della sorgente non riuscito: %s" + +#: ../src/utils/pactl.c:313 +#, c-format +msgid "" +"Source #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor of Sink: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Sorgente #%u\n" +"\tStato: %s\n" +"\tNome: %s\n" +"\tDescrizione: %s\n" +"\tDriver: %s\n" +"\tSpecifica di campionamento: %s\n" +"\tMappa dei canali: %s\n" +"\tModulo di appartenenza: %u\n" +"\tMuto: %s\n" +"\tVolume: %s%s%s\n" +"\t bilanciamento %0.2f\n" +"\tVolume base: %s%s%s\n" +"\tMonitor del sink: %s\n" +"\tLatenza: %0.0f microsec, configurata %0.0f microsec\n" +"\tFlag: %s%s%s%s%s%s\n" +"\tProprietà:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:345 ../src/utils/pactl.c:401 ../src/utils/pactl.c:436 +#: ../src/utils/pactl.c:473 ../src/utils/pactl.c:532 ../src/utils/pactl.c:533 +#: ../src/utils/pactl.c:543 ../src/utils/pactl.c:587 ../src/utils/pactl.c:588 +#: ../src/utils/pactl.c:594 ../src/utils/pactl.c:637 ../src/utils/pactl.c:638 +#: ../src/utils/pactl.c:645 +msgid "n/a" +msgstr "N/D" + +#: ../src/utils/pactl.c:375 +#, c-format +msgid "Failed to get module information: %s" +msgstr "Recupero delle informazioni del modulo non riuscito: %s" + +#: ../src/utils/pactl.c:393 +#, c-format +msgid "" +"Module #%u\n" +"\tName: %s\n" +"\tArgument: %s\n" +"\tUsage counter: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Modulo #%u\n" +"\tNome: %s\n" +"\tArgomento: %s\n" +"\tContatore utilizzi: %s\n" +"\tProprietà:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:412 +#, c-format +msgid "Failed to get client information: %s" +msgstr "Recupero delle informazioni del client non riuscito: %s" + +#: ../src/utils/pactl.c:430 +#, c-format +msgid "" +"Client #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Client #%u\n" +"\tDriver: %s\n" +"\tModulo di appartenenza: %s\n" +"\tProprietà:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:447 +#, c-format +msgid "Failed to get card information: %s" +msgstr "Recupero delle informazioni della scheda non riuscito: %s" + +#: ../src/utils/pactl.c:465 +#, c-format +msgid "" +"Card #%u\n" +"\tName: %s\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Scheda #%u\n" +"\tNome: %s\n" +"\tDriver: %s\n" +"\tModulo di appartenenza: %s\n" +"\tProprietà:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:479 +#, c-format +msgid "\tProfiles:\n" +msgstr "\tProfili:\n" + +#: ../src/utils/pactl.c:485 +#, c-format +msgid "\tActive Profile: %s\n" +msgstr "\tProfilo attivo: %s\n" + +# Sink input +# A stream that is connected to an output device, i.e. an input for a sink. +# +# from http://pulseaudio.org/wiki/WritingVolumeControlUIs +#: ../src/utils/pactl.c:496 +#, c-format +msgid "Failed to get sink input information: %s" +msgstr "Recupero delle informazioni dell'ingresso per il sink non riuscito: %s" + +#: ../src/utils/pactl.c:515 +#, c-format +msgid "" +"Sink Input #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSink: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tMute: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSink Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Ingresso per sink #%u\n" +"\tDriver: %s\n" +"\tModulo di appartenenza: %s\n" +"\tClient: %s\n" +"\tSink: %u\n" +"\tSpecifica di campionamento: %s\n" +"\tMappa dei canali: %s\n" +"\tMuto: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t bilanciamento %0.2f\n" +"\tLatenza del buffer: %0.0f microsec\n" +"\tLatenza del sink: %0.0f microsec\n" +"\tMetodo di ricampionamento: %s\n" +"\tProprietà:\n" +"\t\t%s\n" + +# Source output +# A stream that is connected to an input device, i.e. an output of a source. +# +# from http://pulseaudio.org/wiki/WritingVolumeControlUIs +#: ../src/utils/pactl.c:554 +#, c-format +msgid "Failed to get source output information: %s" +msgstr "" +"Recupero delle informazioni dell'uscita per la sorgente non riuscito: %s" + +#: ../src/utils/pactl.c:574 +#, c-format +msgid "" +"Source Output #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSource: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSource Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Uscita per sorgente #%u\n" +"\tDriver: %s\n" +"\tModulo di appartenenza: %s\n" +"\tClient: %s\n" +"\tSorgente: %u\n" +"\tSpecifica di campionamento: %s\n" +"\tMappa dei canali: %s\n" +"\tLatenza del buffer: %0.0f microsec\n" +"\tLatenza della sorgente: %0.0f microsec\n" +"\tMetodo di ricampionamento: %s\n" +"\tProprietà:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:605 +#, c-format +msgid "Failed to get sample information: %s" +msgstr "Recupero delle informazioni del campione non riuscito: %s" + +# campiona lazy?? +#: ../src/utils/pactl.c:623 +#, c-format +msgid "" +"Sample #%u\n" +"\tName: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tDuration: %0.1fs\n" +"\tSize: %s\n" +"\tLazy: %s\n" +"\tFilename: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Campione #%u\n" +"\tNome: %s\n" +"\tSpecifica di campionamento: %s\n" +"\tMappa dei canali: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t bilanciamento %0.2f\n" +"\tDurata: %0.1f s\n" +"\tDimensione: %s\n" +"\tLazy: %s\n" +"\tNome file: %s\n" +"\tProprietà:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663 +#, c-format +msgid "Failure: %s" +msgstr "Fallimento: %s" + +#: ../src/utils/pactl.c:687 +#, c-format +msgid "Failed to upload sample: %s" +msgstr "Caricamento del campione non riuscito: %s" + +#: ../src/utils/pactl.c:704 +msgid "Premature end of file" +msgstr "Fine del file prematura" + +#: ../src/utils/pactl.c:863 +msgid "Got SIGINT, exiting." +msgstr "Ricevuto SIGINT, uscita." + +#: ../src/utils/pactl.c:869 +#, c-format +msgid "" +"%s [options] stat\n" +"%s [options] list\n" +"%s [options] exit\n" +"%s [options] upload-sample FILENAME [NAME]\n" +"%s [options] play-sample NAME [SINK]\n" +"%s [options] remove-sample NAME\n" +"%s [options] move-sink-input SINKINPUT SINK\n" +"%s [options] move-source-output SOURCEOUTPUT SOURCE\n" +"%s [options] load-module NAME [ARGS ...]\n" +"%s [options] unload-module MODULE\n" +"%s [options] suspend-sink SINK 1|0\n" +"%s [options] suspend-source SOURCE 1|0\n" +"%s [options] set-card-profile CARD PROFILE\n" +"%s [options] set-sink-port SINK PORT\n" +"%s [options] set-source-port SOURCE PORT\n" +"%s [options] set-sink-volume SINK VOLUME\n" +"%s [options] set-source-volume SOURCE VOLUME\n" +"%s [options] set-sink-input-volume SINKINPUT VOLUME\n" +"%s [options] set-sink-mute SINK 1|0\n" +"%s [options] set-source-mute SOURCE 1|0\n" +"%s [options] set-sink-input-mute SINKINPUT 1|0\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" +msgstr "" +"%s [OPZIONI] stat\n" +"%s [OPZIONI] list\n" +"%s [OPZIONI] exit\n" +"%s [OPZIONI] upload-sample NOMEFILE [NOME]\n" +"%s [OPZIONI] play-sample NOME [SINK]\n" +"%s [OPZIONI] remove-sample NOME\n" +"%s [OPZIONI] move-sink-input SINKINPUT SINK\n" +"%s [OPZIONI] move-source-output SOURCEOUTPUT SORGENTE\n" +"%s [OPZIONI] load-module NOME [ARGOMENTI...]\n" +"%s [OPZIONI] unload-module MODULO\n" +"%s [OPZIONI] suspend-sink SINK 1|0\n" +"%s [OPZIONI] suspend-source SORGENTE 1|0\n" +"%s [OPZIONI] set-card-profile SCHEDA PROFILO\n" +"%s [OPZIONI] set-sink-port SINK PORTA\n" +"%s [OPZIONI] set-source-port SORGENTE PORTA\n" +"%s [OPZIONI] set-sink-volume SINK VOLUME\n" +"%s [OPZIONI] set-source-volume SORGENTE VOLUME\n" +"%s [OPZIONI] set-sink-input-volume SINKINPUT VOLUME\n" +"%s [OPZIONI] set-sink-mute SINK 1|0\n" +"%s [OPZIONI] set-source-mute SORGENTE 1|0\n" +"%s [OPZIONI] set-sink-input-mute SINKINPUT 1|0\n" +"\n" +" -h, --help Mostra questo aiuto\n" +" --version Mostra la versione\n" +"\n" +" -s, --server=SERVER Il nome del server a cui connettersi\n" +" -n, --client-name=NOME Come chiamare questo client sul server\n" + +#: ../src/utils/pactl.c:933 +#, c-format +msgid "" +"pactl %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pactl %s\n" +"Compilato con libpulse %s\n" +"Link eseguito con libpulse %s\n" + +#: ../src/utils/pactl.c:979 +msgid "Please specify a sample file to load" +msgstr "Specificare un file campione da caricare" + +#: ../src/utils/pactl.c:992 +msgid "Failed to open sound file." +msgstr "Apertura del file audio non riuscita." + +#: ../src/utils/pactl.c:1004 +msgid "Warning: Failed to determine sample specification from file." +msgstr "" +"Attenzione: determinazione della specifica di campionamento dal file non " +"riuscita." + +#: ../src/utils/pactl.c:1014 +msgid "You have to specify a sample name to play" +msgstr "È necessario specificare un nome di campione da riprodurre" + +#: ../src/utils/pactl.c:1026 +msgid "You have to specify a sample name to remove" +msgstr "È necessario specificare un nome di campione da rimuovere" + +#: ../src/utils/pactl.c:1035 +msgid "You have to specify a sink input index and a sink" +msgstr "È necessario specificare un indice di ingresso per sink e un sink" + +#: ../src/utils/pactl.c:1045 +msgid "You have to specify a source output index and a source" +msgstr "" +"È necessario specificare una indice di uscita per sorgente e una sorgente" + +#: ../src/utils/pactl.c:1060 +msgid "You have to specify a module name and arguments." +msgstr "È necessario specificare un nome di modulo e gli argomenti." + +#: ../src/utils/pactl.c:1080 +msgid "You have to specify a module index" +msgstr "È necessario specificare un indice di modulo" + +#: ../src/utils/pactl.c:1090 +msgid "" +"You may not specify more than one sink. You have to specify a boolean value." +msgstr "" +"Non è possibile specificare più di un sink. È necessario specificare un " +"valore booleano." + +#: ../src/utils/pactl.c:1103 +msgid "" +"You may not specify more than one source. You have to specify a boolean " +"value." +msgstr "" +"Non è possibile specificare più di una sorgente. È necessario specificare un " +"valore booleano." + +#: ../src/utils/pactl.c:1115 +msgid "You have to specify a card name/index and a profile name" +msgstr "" +"È necessario specificare un nome/indice di scheda e un nome di profilo." + +#: ../src/utils/pactl.c:1126 +msgid "You have to specify a sink name/index and a port name" +msgstr "È necessario specificare un nome/indice di sink e un nome di porta" + +#: ../src/utils/pactl.c:1137 +msgid "You have to specify a source name/index and a port name" +msgstr "È necessario specificare un nome/indice di sorgente e un nome di porta" + +#: ../src/utils/pactl.c:1149 +msgid "You have to specify a sink name/index and a volume" +msgstr "È necessario specificare un nome/indice di sink e un nome di porta" + +#: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171 +#: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209 +#: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248 +msgid "Invalid volume specification" +msgstr "Specifica di volume non valida" + +#: ../src/utils/pactl.c:1166 +msgid "You have to specify a source name/index and a volume" +msgstr "È necessario specificare un nome/indice di sorgente e un nome di porta" + +#: ../src/utils/pactl.c:1183 +msgid "You have to specify a sink input index and a volume" +msgstr "È necessario specificare un indice di ingresso per sink e un sink" + +#: ../src/utils/pactl.c:1188 +msgid "Invalid sink input index" +msgstr "Indice dell'input del sink non valido" + +#: ../src/utils/pactl.c:1204 +msgid "You have to specify a sink name/index and a mute boolean" +msgstr "È necessario specificare un nome/indice di sink e un nome di porta" + +#: ../src/utils/pactl.c:1221 +msgid "You have to specify a source name/index and a mute boolean" +msgstr "È necessario specificare un nome/indice di sorgente e un nome di porta" + +#: ../src/utils/pactl.c:1238 +msgid "You have to specify a sink input index and a mute boolean" +msgstr "È necessario specificare un indice di ingresso per sink e un sink" + +#: ../src/utils/pactl.c:1243 +msgid "Invalid sink input index specification" +msgstr "Specifica dell'indice di input del sink non valida" + +#: ../src/utils/pactl.c:1262 +msgid "No valid command specified." +msgstr "Nessun comando valido specificato." + +#: ../src/utils/pax11publish.c:61 +#, c-format +msgid "" +"%s [-D display] [-S server] [-O sink] [-I source] [-c file] [-d|-e|-i|-r]\n" +"\n" +" -d Show current PulseAudio data attached to X11 display (default)\n" +" -e Export local PulseAudio data to X11 display\n" +" -i Import PulseAudio data from X11 display to local environment " +"variables and cookie file.\n" +" -r Remove PulseAudio data from X11 display\n" +msgstr "" +"%s [-D DISPLAY] [-S SERVER] [-O SINK] [-I SORGENTE] [-c FILE] [-d|-e|-i|-" +"r]\n" +"\n" +" -d Mostra i dati PulseAudio attuali collegati al display X11 (predef)\n" +" -e Esporta i dati PulseAudio locali sul display X11\n" +" -i Importa i dati PulseAudio dal display X11 alle variabili d'ambiente " +"e\n" +" al file cookie locali \n" +" -r Rimuove i dati PulseAudio dal display X11\n" + +#: ../src/utils/pax11publish.c:94 +#, c-format +msgid "Failed to parse command line.\n" +msgstr "Analisi della riga di comando non riuscita.\n" + +#: ../src/utils/pax11publish.c:108 +#, c-format +msgid "Server: %s\n" +msgstr "Server: %s\n" + +#: ../src/utils/pax11publish.c:110 +#, c-format +msgid "Source: %s\n" +msgstr "Sorgente: %s\n" + +#: ../src/utils/pax11publish.c:112 +#, c-format +msgid "Sink: %s\n" +msgstr "Sink: %s\n" + +#: ../src/utils/pax11publish.c:114 +#, c-format +msgid "Cookie: %s\n" +msgstr "Cookie: %s\n" + +#: ../src/utils/pax11publish.c:132 +#, c-format +msgid "Failed to parse cookie data\n" +msgstr "Analisi dei dati cookie non riuscita\n" + +#: ../src/utils/pax11publish.c:137 +#, c-format +msgid "Failed to save cookie data\n" +msgstr "Salvataggio dei dati cookie non riuscito\n" + +#: ../src/utils/pax11publish.c:152 +#, c-format +msgid "Failed to load client configuration file.\n" +msgstr "Caricamento del file di configurazione del client non riuscito.\n" + +#: ../src/utils/pax11publish.c:157 +#, c-format +msgid "Failed to read environment configuration data.\n" +msgstr "Lettura dei dati di configurazione dell'ambiente non riuscita.\n" + +#: ../src/utils/pax11publish.c:174 +#, c-format +msgid "Failed to get FQDN.\n" +msgstr "Recupero del FQDN non riuscito.\n" + +#: ../src/utils/pax11publish.c:194 +#, c-format +msgid "Failed to load cookie data\n" +msgstr "Caricamento dei dati cookie non riuscito\n" + +#: ../src/utils/pax11publish.c:211 +#, c-format +msgid "Not yet implemented.\n" +msgstr "Non ancora implementato.\n" + +#: ../src/utils/pacmd.c:69 +msgid "No PulseAudio daemon running, or not running as session daemon." +msgstr "" +"Nessun demone PulseAudio in esecuzione o non in esecuzione come demone di " +"sessione." + +#: ../src/utils/pacmd.c:74 +#, c-format +msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s" +msgstr "socket(PF_UNIX, SOCK_STREAM, 0): %s" + +#: ../src/utils/pacmd.c:91 +#, c-format +msgid "connect(): %s" +msgstr "connect(): %s" + +#: ../src/utils/pacmd.c:99 +msgid "Failed to kill PulseAudio daemon." +msgstr "Uccisione del demone PulseAudio non riuscita." + +#: ../src/utils/pacmd.c:107 +msgid "Daemon not responding." +msgstr "Il demone non sta rispondendo." + +#: ../src/utils/pacmd.c:161 +#, c-format +msgid "poll(): %s" +msgstr "poll(): %s" + +#: ../src/utils/pacmd.c:171 ../src/utils/pacmd.c:188 +#, c-format +msgid "read(): %s" +msgstr "read(): %s" + +#: ../src/utils/pacmd.c:207 ../src/utils/pacmd.c:223 +#, c-format +msgid "write(): %s" +msgstr "write(): %s" + +#: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:219 +msgid "Cannot access autospawn lock." +msgstr "Impossibile accedere al lock di autospawn." + +#: ../src/modules/alsa/alsa-sink.c:530 ../src/modules/alsa/alsa-sink.c:689 +#, c-format +msgid "" +"ALSA woke us up to write new data to the device, but there was actually " +"nothing to write!\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers.\n" +"We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() " +"returned 0 or another value < min_avail." +msgstr "" +"Attivazione da parte di ALSA per scrivere nuovi dati sul dispositivo, ma non " +"c'era nulla da scrivere.\n" +"Molto probabilmente si tratta di un bug nei driver ALSA \"%s\". Segnalare " +"questo problema agli sviluppatori di ALSA.\n" +"Attivazione avvenuta con POLLOUT impostato -- tuttavia, una successiva " +"snd_pcm_avail() ha ritornato 0 o un altro valore < min_avail." + +#: ../src/modules/alsa/alsa-source.c:506 ../src/modules/alsa/alsa-source.c:656 +#, c-format +msgid "" +"ALSA woke us up to read new data from the device, but there was actually " +"nothing to read!\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers.\n" +"We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() " +"returned 0 or another value < min_avail." +msgstr "" +"Attivazione da parte di ALSA per leggere nuovi dati dal dispositivo, ma non " +"c'era nulla da leggere.\n" +"Molto probabilmente si tratta di un bug nei driver ALSA \"%s\". Segnalare " +"questo problema agli sviluppatori di ALSA.\n" +"Attivazione avvenuta con POLLIN impostato -- tuttavia, una successiva " +"snd_pcm_avail() ha ritornato 0 o un altro valore < min_avail." + +#: ../src/modules/alsa/module-alsa-card.c:152 +#: ../src/modules/bluetooth/module-bluetooth-device.c:2228 +#: ../src/modules/alsa/alsa-mixer.c:2931 +msgid "Off" +msgstr "Spento" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2184 +msgid "High Fidelity Playback (A2DP)" +msgstr "Riproduzione ad alta fedeltà (A2DP)" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2198 +msgid "High Fidelity Capture (A2DP)" +msgstr "Cattura ad alta fedeltà (A2DP)" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2213 +msgid "Telephony Duplex (HSP/HFP)" +msgstr "Doppino telefonico (HSP/HFP)" + +#: ../src/modules/reserve-wrap.c:151 +msgid "PulseAudio Sound Server" +msgstr "Server sonoro PulseAudio" + +#: ../src/modules/module-rygel-media-server.c:569 +#: ../src/modules/module-rygel-media-server.c:583 +msgid "Output Devices" +msgstr "Dispositivi di uscita" + +#: ../src/modules/module-rygel-media-server.c:570 +#: ../src/modules/module-rygel-media-server.c:584 +msgid "Input Devices" +msgstr "Dispositivi di ingresso" + +#: ../src/modules/module-rygel-media-server.c:774 +msgid "Audio on @HOSTNAME@" +msgstr "Audio su @HOSTNAME@" + +#: ../src/modules/alsa/alsa-mixer.c:1701 +msgid "Input" +msgstr "Ingresso" + +#: ../src/modules/alsa/alsa-mixer.c:1702 +msgid "Docking Station Input" +msgstr "Ingresso docking station" + +#: ../src/modules/alsa/alsa-mixer.c:1703 +msgid "Docking Station Microphone" +msgstr "Microfono docking station" + +#: ../src/modules/alsa/alsa-mixer.c:1704 +msgid "Line-In" +msgstr "Line-In" + +#: ../src/modules/alsa/alsa-mixer.c:1705 +msgid "Microphone" +msgstr "Microfono" + +#: ../src/modules/alsa/alsa-mixer.c:1706 +msgid "External Microphone" +msgstr "Microfono esterno" + +#: ../src/modules/alsa/alsa-mixer.c:1707 +msgid "Internal Microphone" +msgstr "Microfono interno" + +#: ../src/modules/alsa/alsa-mixer.c:1708 +msgid "Radio" +msgstr "Radio" + +#: ../src/modules/alsa/alsa-mixer.c:1709 +msgid "Video" +msgstr "Video" + +#: ../src/modules/alsa/alsa-mixer.c:1710 +msgid "Automatic Gain Control" +msgstr "Controllo automatico del guadagno" + +#: ../src/modules/alsa/alsa-mixer.c:1711 +msgid "No Automatic Gain Control" +msgstr "Nessun controllo automatico del guadagno" + +#: ../src/modules/alsa/alsa-mixer.c:1712 +msgid "Boost" +msgstr "Boost" + +#: ../src/modules/alsa/alsa-mixer.c:1713 +msgid "No Boost" +msgstr "Nessun boost" + +#: ../src/modules/alsa/alsa-mixer.c:1714 +msgid "Amplifier" +msgstr "Amplificatore" + +#: ../src/modules/alsa/alsa-mixer.c:1715 +msgid "No Amplifier" +msgstr "Nessun amplificatore" + +#: ../src/modules/alsa/alsa-mixer.c:1773 +msgid "Analog Input" +msgstr "Ingresso analogico" + +#: ../src/modules/alsa/alsa-mixer.c:1774 +msgid "Analog Microphone" +msgstr "Microfono analogico" + +#: ../src/modules/alsa/alsa-mixer.c:1775 +msgid "Analog Line-In" +msgstr "Line-in analogico" + +#: ../src/modules/alsa/alsa-mixer.c:1776 +msgid "Analog Radio" +msgstr "Radio analogica" + +#: ../src/modules/alsa/alsa-mixer.c:1777 +msgid "Analog Video" +msgstr "Video analogico" + +#: ../src/modules/alsa/alsa-mixer.c:1778 +msgid "Analog Output" +msgstr "Uscita analogica" + +#: ../src/modules/alsa/alsa-mixer.c:1779 +msgid "Analog Headphones" +msgstr "Cuffie analogiche" + +#: ../src/modules/alsa/alsa-mixer.c:1780 +msgid "Analog Output (LFE)" +msgstr "Uscita analogica (LFE)" + +#: ../src/modules/alsa/alsa-mixer.c:1781 +msgid "Analog Mono Output" +msgstr "Uscita mono analogica" + +#: ../src/modules/alsa/alsa-mixer.c:1981 +#, c-format +msgid "%s+%s" +msgstr "%s+%s" + +#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404 +#, c-format +msgid "%s / %s" +msgstr "%s / %s" + +#: ../src/modules/alsa/alsa-mixer.c:2790 +msgid "Analog Mono" +msgstr "Mono analogico" + +#: ../src/modules/alsa/alsa-mixer.c:2791 +msgid "Analog Stereo" +msgstr "Stereo analogico" + +#: ../src/modules/alsa/alsa-mixer.c:2792 +msgid "Analog Surround 2.1" +msgstr "Surround analogico 2.1" + +#: ../src/modules/alsa/alsa-mixer.c:2793 +msgid "Analog Surround 3.0" +msgstr "Surround analogico 3.0" + +#: ../src/modules/alsa/alsa-mixer.c:2794 +msgid "Analog Surround 3.1" +msgstr "Surround analogico 3.1" + +#: ../src/modules/alsa/alsa-mixer.c:2795 +msgid "Analog Surround 4.0" +msgstr "Surround analogico 4.0" + +#: ../src/modules/alsa/alsa-mixer.c:2796 +msgid "Analog Surround 4.1" +msgstr "Surround analogico 4.1" + +#: ../src/modules/alsa/alsa-mixer.c:2797 +msgid "Analog Surround 5.0" +msgstr "Surround analogico 5.0" + +#: ../src/modules/alsa/alsa-mixer.c:2798 +msgid "Analog Surround 5.1" +msgstr "Surround analogico 5.1" + +#: ../src/modules/alsa/alsa-mixer.c:2799 +msgid "Analog Surround 6.0" +msgstr "Surround analogico 6.0" + +#: ../src/modules/alsa/alsa-mixer.c:2800 +msgid "Analog Surround 6.1" +msgstr "Surround analogico 6.1" + +#: ../src/modules/alsa/alsa-mixer.c:2801 +msgid "Analog Surround 7.0" +msgstr "Surround analogico 7.0" + +#: ../src/modules/alsa/alsa-mixer.c:2802 +msgid "Analog Surround 7.1" +msgstr "Surround analogico 7.1" + +#: ../src/modules/alsa/alsa-mixer.c:2803 +msgid "Digital Stereo (IEC958)" +msgstr "Stereo digitale (IEC958)" + +#: ../src/modules/alsa/alsa-mixer.c:2804 +msgid "Digital Surround 4.0 (IEC958)" +msgstr "Surround digitale 4.0 (IEC958)" + +#: ../src/modules/alsa/alsa-mixer.c:2805 +msgid "Digital Surround 4.0 (IEC958/AC3)" +msgstr "Surround digitale 4.0 (IEC958/AC3)" + +#: ../src/modules/alsa/alsa-mixer.c:2806 +msgid "Digital Surround 5.1 (IEC958/AC3)" +msgstr "Surround digitale 5.1 (IEC958/AC3)" + +#: ../src/modules/alsa/alsa-mixer.c:2807 +msgid "Digital Stereo (HDMI)" +msgstr "Stereo digitale (HDMI)" + +#: ../src/modules/alsa/alsa-mixer.c:2928 +msgid "Analog Mono Duplex" +msgstr "Duplex mono analogico" + +#: ../src/modules/alsa/alsa-mixer.c:2929 +msgid "Analog Stereo Duplex" +msgstr "Duplex stereo analogico" + +#: ../src/modules/alsa/alsa-mixer.c:2930 +msgid "Digital Stereo Duplex (IEC958)" +msgstr "Duplex stereo digitale (IEC958)" diff --git a/po/ja.po b/po/ja.po new file mode 100644 index 0000000..de7f605 --- /dev/null +++ b/po/ja.po @@ -0,0 +1,2238 @@ +# PulseAudio +# Copyright (C) 2009. +# This file is distributed under the same license as the PACKAGE package. +# Hyu_gabaru Ryu_ichi , 2009. +# +msgid "" +msgstr "" +"Project-Id-Version: 1.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-09-29 23:47+0200\n" +"PO-Revision-Date: 2009-09-10 21:05+0900\n" +"Last-Translator: Hyu_gabaru Ryu_ichi \n" +"Language-Team: Japanese \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629 +#, c-format +msgid "%s %s" +msgstr "%s %s" + +#: ../src/modules/alsa/alsa-util.c:1106 +#, c-format +msgid "" +"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu " +"ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" + +#: ../src/modules/alsa/alsa-util.c:1147 +#, c-format +msgid "" +"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%" +"lu ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" + +#: ../src/modules/alsa/alsa-util.c:1194 +#, c-format +msgid "" +"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes " +"(%lu ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" + +#: ../src/modules/module-always-sink.c:39 +msgid "Always keeps at least one sink loaded even if it's a null one" +msgstr "" + +#: ../src/modules/module-always-sink.c:83 +msgid "Dummy Output" +msgstr "" + +#: ../src/modules/module-ladspa-sink.c:49 +msgid "Virtual LADSPA sink" +msgstr "" + +#: ../src/modules/module-ladspa-sink.c:53 +msgid "" +"sink_name= sink_properties= " +"master= format= rate= " +"channels= channel_map= plugin= label= control=" +msgstr "" + +#: ../src/modules/module-null-sink.c:55 +msgid "Clocked NULL sink" +msgstr "" + +#: ../src/modules/module-null-sink.c:291 +msgid "Null Output" +msgstr "" + +#: ../src/pulsecore/sink.c:2613 +msgid "Internal Audio" +msgstr "" + +#: ../src/pulsecore/sink.c:2618 +msgid "Modem" +msgstr "" + +#: ../src/daemon/ltdl-bind-now.c:124 +msgid "Failed to find original lt_dlopen loader." +msgstr "" + +#: ../src/daemon/ltdl-bind-now.c:129 +msgid "Failed to allocate new dl loader." +msgstr "" + +#: ../src/daemon/ltdl-bind-now.c:142 +msgid "Failed to add bind-now-loader." +msgstr "" + +#: ../src/daemon/main.c:141 +#, c-format +msgid "Got signal %s." +msgstr "" + +#: ../src/daemon/main.c:168 +msgid "Exiting." +msgstr "" + +#: ../src/daemon/main.c:186 +#, c-format +msgid "Failed to find user '%s'." +msgstr "" + +#: ../src/daemon/main.c:191 +#, c-format +msgid "Failed to find group '%s'." +msgstr "" + +#: ../src/daemon/main.c:195 +#, c-format +msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)." +msgstr "" + +#: ../src/daemon/main.c:200 +#, c-format +msgid "GID of user '%s' and of group '%s' don't match." +msgstr "" + +#: ../src/daemon/main.c:205 +#, c-format +msgid "Home directory of user '%s' is not '%s', ignoring." +msgstr "" + +#: ../src/daemon/main.c:208 ../src/daemon/main.c:213 +#, c-format +msgid "Failed to create '%s': %s" +msgstr "" + +#: ../src/daemon/main.c:220 +#, c-format +msgid "Failed to change group list: %s" +msgstr "" + +#: ../src/daemon/main.c:236 +#, c-format +msgid "Failed to change GID: %s" +msgstr "" + +#: ../src/daemon/main.c:252 +#, c-format +msgid "Failed to change UID: %s" +msgstr "" + +#: ../src/daemon/main.c:271 +msgid "Successfully dropped root privileges." +msgstr "" + +#: ../src/daemon/main.c:279 +msgid "System wide mode unsupported on this platform." +msgstr "" + +#: ../src/daemon/main.c:297 +#, c-format +msgid "setrlimit(%s, (%u, %u)) failed: %s" +msgstr "" + +#: ../src/daemon/main.c:474 +msgid "Failed to parse command line." +msgstr "" + +#: ../src/daemon/main.c:541 +msgid "Daemon not running" +msgstr "" + +#: ../src/daemon/main.c:543 +#, c-format +msgid "Daemon running as PID %u" +msgstr "" + +#: ../src/daemon/main.c:553 +#, c-format +msgid "Failed to kill daemon: %s" +msgstr "" + +#: ../src/daemon/main.c:571 +msgid "" +"This program is not intended to be run as root (unless --system is " +"specified)." +msgstr "" + +#: ../src/daemon/main.c:573 +msgid "Root privileges required." +msgstr "" + +#: ../src/daemon/main.c:578 +msgid "--start not supported for system instances." +msgstr "" + +#: ../src/daemon/main.c:583 +msgid "Running in system mode, but --disallow-exit not set!" +msgstr "" + +#: ../src/daemon/main.c:586 +msgid "Running in system mode, but --disallow-module-loading not set!" +msgstr "" + +#: ../src/daemon/main.c:589 +msgid "Running in system mode, forcibly disabling SHM mode!" +msgstr "" + +#: ../src/daemon/main.c:594 +msgid "Running in system mode, forcibly disabling exit idle time!" +msgstr "" + +#: ../src/daemon/main.c:621 +msgid "Failed to acquire stdio." +msgstr "" + +#: ../src/daemon/main.c:627 +#, c-format +msgid "pipe failed: %s" +msgstr "" + +#: ../src/daemon/main.c:632 +#, c-format +msgid "fork() failed: %s" +msgstr "" + +#: ../src/daemon/main.c:646 ../src/utils/pacat.c:508 +#, c-format +msgid "read() failed: %s" +msgstr "" + +#: ../src/daemon/main.c:652 +msgid "Daemon startup failed." +msgstr "" + +#: ../src/daemon/main.c:654 +msgid "Daemon startup successful." +msgstr "" + +#: ../src/daemon/main.c:731 +#, c-format +msgid "This is PulseAudio %s" +msgstr "" + +#: ../src/daemon/main.c:732 +#, c-format +msgid "Compilation host: %s" +msgstr "" + +#: ../src/daemon/main.c:733 +#, c-format +msgid "Compilation CFLAGS: %s" +msgstr "" + +#: ../src/daemon/main.c:736 +#, c-format +msgid "Running on host: %s" +msgstr "" + +#: ../src/daemon/main.c:739 +#, c-format +msgid "Found %u CPUs." +msgstr "" + +#: ../src/daemon/main.c:741 +#, c-format +msgid "Page size is %lu bytes" +msgstr "" + +#: ../src/daemon/main.c:744 +msgid "Compiled with Valgrind support: yes" +msgstr "" + +#: ../src/daemon/main.c:746 +msgid "Compiled with Valgrind support: no" +msgstr "" + +#: ../src/daemon/main.c:749 +#, c-format +msgid "Running in valgrind mode: %s" +msgstr "" + +#: ../src/daemon/main.c:752 +msgid "Optimized build: yes" +msgstr "" + +#: ../src/daemon/main.c:754 +msgid "Optimized build: no" +msgstr "" + +#: ../src/daemon/main.c:758 +msgid "NDEBUG defined, all asserts disabled." +msgstr "" + +#: ../src/daemon/main.c:760 +msgid "FASTPATH defined, only fast path asserts disabled." +msgstr "" + +#: ../src/daemon/main.c:762 +msgid "All asserts enabled." +msgstr "" + +#: ../src/daemon/main.c:766 +msgid "Failed to get machine ID" +msgstr "" + +#: ../src/daemon/main.c:769 +#, c-format +msgid "Machine ID is %s." +msgstr "" + +#: ../src/daemon/main.c:773 +#, c-format +msgid "Session ID is %s." +msgstr "" + +#: ../src/daemon/main.c:779 +#, c-format +msgid "Using runtime directory %s." +msgstr "" + +#: ../src/daemon/main.c:784 +#, c-format +msgid "Using state directory %s." +msgstr "" + +#: ../src/daemon/main.c:787 +#, c-format +msgid "Using modules directory %s." +msgstr "" + +#: ../src/daemon/main.c:789 +#, c-format +msgid "Running in system mode: %s" +msgstr "" + +#: ../src/daemon/main.c:792 +msgid "" +"OK, so you are running PA in system mode. Please note that you most likely " +"shouldn't be doing that.\n" +"If you do it nonetheless then it's your own fault if things don't work as " +"expected.\n" +"Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an " +"explanation why system mode is usually a bad idea." +msgstr "" + +#: ../src/daemon/main.c:809 +msgid "pa_pid_file_create() failed." +msgstr "" + +#: ../src/daemon/main.c:819 +msgid "Fresh high-resolution timers available! Bon appetit!" +msgstr "" + +#: ../src/daemon/main.c:821 +msgid "" +"Dude, your kernel stinks! The chef's recommendation today is Linux with high-" +"resolution timers enabled!" +msgstr "" + +#: ../src/daemon/main.c:844 +msgid "pa_core_new() failed." +msgstr "" + +#: ../src/daemon/main.c:904 +msgid "Failed to initialize daemon." +msgstr "" + +#: ../src/daemon/main.c:909 +msgid "Daemon startup without any loaded modules, refusing to work." +msgstr "" + +#: ../src/daemon/main.c:926 +msgid "Daemon startup complete." +msgstr "" + +#: ../src/daemon/main.c:932 +msgid "Daemon shutdown initiated." +msgstr "" + +#: ../src/daemon/main.c:954 +msgid "Daemon terminated." +msgstr "" + +#: ../src/daemon/cmdline.c:115 +#, c-format +msgid "" +"%s [options]\n" +"\n" +"COMMANDS:\n" +" -h, --help Show this help\n" +" --version Show version\n" +" --dump-conf Dump default configuration\n" +" --dump-modules Dump list of available modules\n" +" --dump-resample-methods Dump available resample methods\n" +" --cleanup-shm Cleanup stale shared memory " +"segments\n" +" --start Start the daemon if it is not " +"running\n" +" -k --kill Kill a running daemon\n" +" --check Check for a running daemon (only " +"returns exit code)\n" +"\n" +"OPTIONS:\n" +" --system[=BOOL] Run as system-wide instance\n" +" -D, --daemonize[=BOOL] Daemonize after startup\n" +" --fail[=BOOL] Quit when startup fails\n" +" --high-priority[=BOOL] Try to set high nice level\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_NICE)\n" +" --realtime[=BOOL] Try to enable realtime scheduling\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_RTPRIO)\n" +" --disallow-module-loading[=BOOL] Disallow module user requested " +"module\n" +" loading/unloading after startup\n" +" --disallow-exit[=BOOL] Disallow user requested exit\n" +" --exit-idle-time=SECS Terminate the daemon when idle and " +"this\n" +" time passed\n" +" --module-idle-time=SECS Unload autoloaded modules when idle " +"and\n" +" this time passed\n" +" --scache-idle-time=SECS Unload autoloaded samples when idle " +"and\n" +" this time passed\n" +" --log-level[=LEVEL] Increase or set verbosity level\n" +" -v Increase the verbosity level\n" +" --log-target={auto,syslog,stderr} Specify the log target\n" +" --log-meta[=BOOL] Include code location in log " +"messages\n" +" --log-time[=BOOL] Include timestamps in log messages\n" +" --log-backtrace=FRAMES Include a backtrace in log messages\n" +" -p, --dl-search-path=PATH Set the search path for dynamic " +"shared\n" +" objects (plugins)\n" +" --resample-method=METHOD Use the specified resampling method\n" +" (See --dump-resample-methods for\n" +" possible values)\n" +" --use-pid-file[=BOOL] Create a PID file\n" +" --no-cpu-limit[=BOOL] Do not install CPU load limiter on\n" +" platforms that support it.\n" +" --disable-shm[=BOOL] Disable shared memory support.\n" +"\n" +"STARTUP SCRIPT:\n" +" -L, --load=\"MODULE ARGUMENTS\" Load the specified plugin module " +"with\n" +" the specified argument\n" +" -F, --file=FILENAME Run the specified script\n" +" -C Open a command line on the running " +"TTY\n" +" after startup\n" +"\n" +" -n Don't load default script file\n" +msgstr "" + +#: ../src/daemon/cmdline.c:247 +msgid "--daemonize expects boolean argument" +msgstr "" + +#: ../src/daemon/cmdline.c:254 +msgid "--fail expects boolean argument" +msgstr "" + +#: ../src/daemon/cmdline.c:264 +msgid "" +"--log-level expects log level argument (either numeric in range 0..4 or one " +"of debug, info, notice, warn, error)." +msgstr "" + +#: ../src/daemon/cmdline.c:276 +msgid "--high-priority expects boolean argument" +msgstr "" + +#: ../src/daemon/cmdline.c:283 +msgid "--realtime expects boolean argument" +msgstr "" + +#: ../src/daemon/cmdline.c:290 +msgid "--disallow-module-loading expects boolean argument" +msgstr "" + +#: ../src/daemon/cmdline.c:297 +msgid "--disallow-exit expects boolean argument" +msgstr "" + +#: ../src/daemon/cmdline.c:304 +msgid "--use-pid-file expects boolean argument" +msgstr "" + +#: ../src/daemon/cmdline.c:321 +msgid "Invalid log target: use either 'syslog', 'stderr' or 'auto'." +msgstr "" + +#: ../src/daemon/cmdline.c:328 +msgid "--log-time expects boolean argument" +msgstr "" + +#: ../src/daemon/cmdline.c:335 +msgid "--log-meta expects boolean argument" +msgstr "" + +#: ../src/daemon/cmdline.c:354 +#, c-format +msgid "Invalid resample method '%s'." +msgstr "" + +#: ../src/daemon/cmdline.c:361 +msgid "--system expects boolean argument" +msgstr "" + +#: ../src/daemon/cmdline.c:368 +msgid "--no-cpu-limit expects boolean argument" +msgstr "" + +#: ../src/daemon/cmdline.c:375 +msgid "--disable-shm expects boolean argument" +msgstr "" + +#: ../src/daemon/dumpmodules.c:60 +#, c-format +msgid "Name: %s\n" +msgstr "" + +#: ../src/daemon/dumpmodules.c:63 +#, c-format +msgid "No module information available\n" +msgstr "" + +#: ../src/daemon/dumpmodules.c:66 +#, c-format +msgid "Version: %s\n" +msgstr "" + +#: ../src/daemon/dumpmodules.c:68 +#, c-format +msgid "Description: %s\n" +msgstr "" + +#: ../src/daemon/dumpmodules.c:70 +#, c-format +msgid "Author: %s\n" +msgstr "" + +#: ../src/daemon/dumpmodules.c:72 +#, c-format +msgid "Usage: %s\n" +msgstr "" + +#: ../src/daemon/dumpmodules.c:73 +#, c-format +msgid "Load Once: %s\n" +msgstr "" + +#: ../src/daemon/dumpmodules.c:75 +#, c-format +msgid "DEPRECATION WARNING: %s\n" +msgstr "" + +#: ../src/daemon/dumpmodules.c:79 +#, c-format +msgid "Path: %s\n" +msgstr "" + +#: ../src/daemon/daemon-conf.c:232 +#, c-format +msgid "[%s:%u] Invalid log target '%s'." +msgstr "" + +#: ../src/daemon/daemon-conf.c:248 +#, c-format +msgid "[%s:%u] Invalid log level '%s'." +msgstr "" + +#: ../src/daemon/daemon-conf.c:264 +#, c-format +msgid "[%s:%u] Invalid resample method '%s'." +msgstr "" + +#: ../src/daemon/daemon-conf.c:287 +#, c-format +msgid "[%s:%u] Invalid rlimit '%s'." +msgstr "" + +#: ../src/daemon/daemon-conf.c:294 +#, c-format +msgid "[%s:%u] rlimit not supported on this platform." +msgstr "" + +#: ../src/daemon/daemon-conf.c:310 +#, c-format +msgid "[%s:%u] Invalid sample format '%s'." +msgstr "" + +#: ../src/daemon/daemon-conf.c:328 +#, c-format +msgid "[%s:%u] Invalid sample rate '%s'." +msgstr "" + +#: ../src/daemon/daemon-conf.c:352 +#, c-format +msgid "[%s:%u] Invalid sample channels '%s'." +msgstr "" + +#: ../src/daemon/daemon-conf.c:370 +#, c-format +msgid "[%s:%u] Invalid channel map '%s'." +msgstr "" + +#: ../src/daemon/daemon-conf.c:388 +#, c-format +msgid "[%s:%u] Invalid number of fragments '%s'." +msgstr "" + +#: ../src/daemon/daemon-conf.c:406 +#, c-format +msgid "[%s:%u] Invalid fragment size '%s'." +msgstr "" + +#: ../src/daemon/daemon-conf.c:424 +#, c-format +msgid "[%s:%u] Invalid nice level '%s'." +msgstr "" + +#: ../src/daemon/daemon-conf.c:546 +#, c-format +msgid "Failed to open configuration file: %s" +msgstr "" + +#: ../src/daemon/daemon-conf.c:562 +msgid "" +"The specified default channel map has a different number of channels than " +"the specified default number of channels." +msgstr "" + +#: ../src/daemon/daemon-conf.c:638 +#, c-format +msgid "### Read from configuration file: %s ###\n" +msgstr "" + +#: ../src/daemon/caps.c:62 +msgid "Cleaning up privileges." +msgstr "" + +#: ../src/daemon/pulseaudio.desktop.in.h:1 +msgid "PulseAudio Sound System" +msgstr "" + +#: ../src/daemon/pulseaudio.desktop.in.h:2 +msgid "Start the PulseAudio Sound System" +msgstr "" + +#: ../src/pulse/channelmap.c:105 ../src/pulse/channelmap.c:757 +msgid "Mono" +msgstr "" + +#: ../src/pulse/channelmap.c:107 +msgid "Front Center" +msgstr "" + +#: ../src/pulse/channelmap.c:108 +msgid "Front Left" +msgstr "" + +#: ../src/pulse/channelmap.c:109 +msgid "Front Right" +msgstr "" + +#: ../src/pulse/channelmap.c:111 +msgid "Rear Center" +msgstr "" + +#: ../src/pulse/channelmap.c:112 +msgid "Rear Left" +msgstr "" + +#: ../src/pulse/channelmap.c:113 +msgid "Rear Right" +msgstr "" + +#: ../src/pulse/channelmap.c:115 +msgid "Low Frequency Emmiter" +msgstr "" + +#: ../src/pulse/channelmap.c:117 +msgid "Front Left-of-center" +msgstr "" + +#: ../src/pulse/channelmap.c:118 +msgid "Front Right-of-center" +msgstr "" + +#: ../src/pulse/channelmap.c:120 +msgid "Side Left" +msgstr "" + +#: ../src/pulse/channelmap.c:121 +msgid "Side Right" +msgstr "" + +#: ../src/pulse/channelmap.c:123 +msgid "Auxiliary 0" +msgstr "" + +#: ../src/pulse/channelmap.c:124 +msgid "Auxiliary 1" +msgstr "" + +#: ../src/pulse/channelmap.c:125 +msgid "Auxiliary 2" +msgstr "" + +#: ../src/pulse/channelmap.c:126 +msgid "Auxiliary 3" +msgstr "" + +#: ../src/pulse/channelmap.c:127 +msgid "Auxiliary 4" +msgstr "" + +#: ../src/pulse/channelmap.c:128 +msgid "Auxiliary 5" +msgstr "" + +#: ../src/pulse/channelmap.c:129 +msgid "Auxiliary 6" +msgstr "" + +#: ../src/pulse/channelmap.c:130 +msgid "Auxiliary 7" +msgstr "" + +#: ../src/pulse/channelmap.c:131 +msgid "Auxiliary 8" +msgstr "" + +#: ../src/pulse/channelmap.c:132 +msgid "Auxiliary 9" +msgstr "" + +#: ../src/pulse/channelmap.c:133 +msgid "Auxiliary 10" +msgstr "" + +#: ../src/pulse/channelmap.c:134 +msgid "Auxiliary 11" +msgstr "" + +#: ../src/pulse/channelmap.c:135 +msgid "Auxiliary 12" +msgstr "" + +#: ../src/pulse/channelmap.c:136 +msgid "Auxiliary 13" +msgstr "" + +#: ../src/pulse/channelmap.c:137 +msgid "Auxiliary 14" +msgstr "" + +#: ../src/pulse/channelmap.c:138 +msgid "Auxiliary 15" +msgstr "" + +#: ../src/pulse/channelmap.c:139 +msgid "Auxiliary 16" +msgstr "" + +#: ../src/pulse/channelmap.c:140 +msgid "Auxiliary 17" +msgstr "" + +#: ../src/pulse/channelmap.c:141 +msgid "Auxiliary 18" +msgstr "" + +#: ../src/pulse/channelmap.c:142 +msgid "Auxiliary 19" +msgstr "" + +#: ../src/pulse/channelmap.c:143 +msgid "Auxiliary 20" +msgstr "" + +#: ../src/pulse/channelmap.c:144 +msgid "Auxiliary 21" +msgstr "" + +#: ../src/pulse/channelmap.c:145 +msgid "Auxiliary 22" +msgstr "" + +#: ../src/pulse/channelmap.c:146 +msgid "Auxiliary 23" +msgstr "" + +#: ../src/pulse/channelmap.c:147 +msgid "Auxiliary 24" +msgstr "" + +#: ../src/pulse/channelmap.c:148 +msgid "Auxiliary 25" +msgstr "" + +#: ../src/pulse/channelmap.c:149 +msgid "Auxiliary 26" +msgstr "" + +#: ../src/pulse/channelmap.c:150 +msgid "Auxiliary 27" +msgstr "" + +#: ../src/pulse/channelmap.c:151 +msgid "Auxiliary 28" +msgstr "" + +#: ../src/pulse/channelmap.c:152 +msgid "Auxiliary 29" +msgstr "" + +#: ../src/pulse/channelmap.c:153 +msgid "Auxiliary 30" +msgstr "" + +#: ../src/pulse/channelmap.c:154 +msgid "Auxiliary 31" +msgstr "" + +#: ../src/pulse/channelmap.c:156 +msgid "Top Center" +msgstr "" + +#: ../src/pulse/channelmap.c:158 +msgid "Top Front Center" +msgstr "" + +#: ../src/pulse/channelmap.c:159 +msgid "Top Front Left" +msgstr "" + +#: ../src/pulse/channelmap.c:160 +msgid "Top Front Right" +msgstr "" + +#: ../src/pulse/channelmap.c:162 +msgid "Top Rear Center" +msgstr "" + +#: ../src/pulse/channelmap.c:163 +msgid "Top Rear Left" +msgstr "" + +#: ../src/pulse/channelmap.c:164 +msgid "Top Rear Right" +msgstr "" + +#: ../src/pulse/channelmap.c:484 ../src/pulse/sample.c:170 +#: ../src/pulse/volume.c:295 ../src/pulse/volume.c:321 +#: ../src/pulse/volume.c:341 ../src/pulse/volume.c:371 +msgid "(invalid)" +msgstr "" + +#: ../src/pulse/channelmap.c:761 +msgid "Stereo" +msgstr "" + +#: ../src/pulse/channelmap.c:766 +msgid "Surround 4.0" +msgstr "" + +#: ../src/pulse/channelmap.c:772 +msgid "Surround 4.1" +msgstr "" + +#: ../src/pulse/channelmap.c:778 +msgid "Surround 5.0" +msgstr "" + +#: ../src/pulse/channelmap.c:784 +msgid "Surround 5.1" +msgstr "" + +#: ../src/pulse/channelmap.c:791 +msgid "Surround 7.1" +msgstr "" + +#: ../src/pulse/error.c:43 +msgid "OK" +msgstr "" + +#: ../src/pulse/error.c:44 +msgid "Access denied" +msgstr "" + +#: ../src/pulse/error.c:45 +msgid "Unknown command" +msgstr "" + +#: ../src/pulse/error.c:46 +msgid "Invalid argument" +msgstr "" + +#: ../src/pulse/error.c:47 +msgid "Entity exists" +msgstr "" + +#: ../src/pulse/error.c:48 +msgid "No such entity" +msgstr "" + +#: ../src/pulse/error.c:49 +msgid "Connection refused" +msgstr "" + +#: ../src/pulse/error.c:50 +msgid "Protocol error" +msgstr "" + +#: ../src/pulse/error.c:51 +msgid "Timeout" +msgstr "" + +#: ../src/pulse/error.c:52 +msgid "No authorization key" +msgstr "" + +#: ../src/pulse/error.c:53 +msgid "Internal error" +msgstr "" + +#: ../src/pulse/error.c:54 +msgid "Connection terminated" +msgstr "" + +#: ../src/pulse/error.c:55 +msgid "Entity killed" +msgstr "" + +#: ../src/pulse/error.c:56 +msgid "Invalid server" +msgstr "" + +#: ../src/pulse/error.c:57 +msgid "Module initalization failed" +msgstr "" + +#: ../src/pulse/error.c:58 +msgid "Bad state" +msgstr "" + +#: ../src/pulse/error.c:59 +msgid "No data" +msgstr "" + +#: ../src/pulse/error.c:60 +msgid "Incompatible protocol version" +msgstr "" + +#: ../src/pulse/error.c:61 +msgid "Too large" +msgstr "" + +#: ../src/pulse/error.c:62 +msgid "Not supported" +msgstr "" + +#: ../src/pulse/error.c:63 +msgid "Unknown error code" +msgstr "" + +#: ../src/pulse/error.c:64 +msgid "No such extension" +msgstr "" + +#: ../src/pulse/error.c:65 +msgid "Obsolete functionality" +msgstr "" + +#: ../src/pulse/error.c:66 +msgid "Missing implementation" +msgstr "" + +#: ../src/pulse/error.c:67 +msgid "Client forked" +msgstr "" + +#: ../src/pulse/error.c:68 +msgid "Input/Output error" +msgstr "" + +#: ../src/pulse/error.c:69 +msgid "Device or resource busy" +msgstr "" + +#: ../src/pulse/sample.c:172 +#, c-format +msgid "%s %uch %uHz" +msgstr "" + +#: ../src/pulse/sample.c:184 +#, c-format +msgid "%0.1f GiB" +msgstr "" + +#: ../src/pulse/sample.c:186 +#, c-format +msgid "%0.1f MiB" +msgstr "" + +#: ../src/pulse/sample.c:188 +#, c-format +msgid "%0.1f KiB" +msgstr "" + +#: ../src/pulse/sample.c:190 +#, c-format +msgid "%u B" +msgstr "" + +#: ../src/pulse/client-conf-x11.c:55 ../src/utils/pax11publish.c:100 +msgid "XOpenDisplay() failed" +msgstr "" + +#: ../src/pulse/client-conf-x11.c:93 +msgid "Failed to parse cookie data" +msgstr "" + +#: ../src/pulse/client-conf.c:111 +#, c-format +msgid "Failed to open configuration file '%s': %s" +msgstr "" + +#: ../src/pulse/context.c:550 +msgid "No cookie loaded. Attempting to connect without." +msgstr "" + +#: ../src/pulse/context.c:693 +#, c-format +msgid "fork(): %s" +msgstr "" + +#: ../src/pulse/context.c:748 +#, c-format +msgid "waitpid(): %s" +msgstr "" + +#: ../src/pulse/context.c:1438 +#, c-format +msgid "Received message for unknown extension '%s'" +msgstr "" + +#: ../src/utils/pacat.c:108 +#, c-format +msgid "Failed to drain stream: %s" +msgstr "" + +#: ../src/utils/pacat.c:113 +msgid "Playback stream drained." +msgstr "" + +#: ../src/utils/pacat.c:123 +msgid "Draining connection to server." +msgstr "" + +#: ../src/utils/pacat.c:136 +#, c-format +msgid "pa_stream_drain(): %s" +msgstr "" + +#: ../src/utils/pacat.c:159 +#, c-format +msgid "pa_stream_write() failed: %s" +msgstr "" + +#: ../src/utils/pacat.c:197 +#, c-format +msgid "pa_stream_begin_write() failed: %s" +msgstr "" + +#: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267 +#, c-format +msgid "pa_stream_peek() failed: %s" +msgstr "" + +#: ../src/utils/pacat.c:307 +msgid "Stream successfully created." +msgstr "" + +#: ../src/utils/pacat.c:310 +#, c-format +msgid "pa_stream_get_buffer_attr() failed: %s" +msgstr "" + +#: ../src/utils/pacat.c:314 +#, c-format +msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u" +msgstr "" + +#: ../src/utils/pacat.c:317 +#, c-format +msgid "Buffer metrics: maxlength=%u, fragsize=%u" +msgstr "" + +#: ../src/utils/pacat.c:321 +#, c-format +msgid "Using sample spec '%s', channel map '%s'." +msgstr "" + +#: ../src/utils/pacat.c:325 +#, c-format +msgid "Connected to device %s (%u, %ssuspended)." +msgstr "" + +#: ../src/utils/pacat.c:335 +#, c-format +msgid "Stream error: %s" +msgstr "" + +#: ../src/utils/pacat.c:345 +#, c-format +msgid "Stream device suspended.%s" +msgstr "" + +#: ../src/utils/pacat.c:347 +#, c-format +msgid "Stream device resumed.%s" +msgstr "" + +#: ../src/utils/pacat.c:355 +#, c-format +msgid "Stream underrun.%s" +msgstr "" + +#: ../src/utils/pacat.c:362 +#, c-format +msgid "Stream overrun.%s" +msgstr "" + +#: ../src/utils/pacat.c:369 +#, c-format +msgid "Stream started.%s" +msgstr "" + +#: ../src/utils/pacat.c:376 +#, c-format +msgid "Stream moved to device %s (%u, %ssuspended).%s" +msgstr "" + +#: ../src/utils/pacat.c:376 +msgid "not " +msgstr "" + +#: ../src/utils/pacat.c:383 +#, c-format +msgid "Stream buffer attributes changed.%s" +msgstr "" + +#: ../src/utils/pacat.c:415 +#, c-format +msgid "Connection established.%s" +msgstr "" + +#: ../src/utils/pacat.c:418 +#, c-format +msgid "pa_stream_new() failed: %s" +msgstr "" + +#: ../src/utils/pacat.c:450 +#, c-format +msgid "pa_stream_connect_playback() failed: %s" +msgstr "" + +#: ../src/utils/pacat.c:456 +#, c-format +msgid "pa_stream_connect_record() failed: %s" +msgstr "" + +#: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857 +#, c-format +msgid "Connection failure: %s" +msgstr "" + +#: ../src/utils/pacat.c:503 +msgid "Got EOF." +msgstr "" + +#: ../src/utils/pacat.c:540 +#, c-format +msgid "write() failed: %s" +msgstr "" + +#: ../src/utils/pacat.c:561 +msgid "Got signal, exiting." +msgstr "" + +#: ../src/utils/pacat.c:575 +#, c-format +msgid "Failed to get latency: %s" +msgstr "" + +#: ../src/utils/pacat.c:580 +#, c-format +msgid "Time: %0.3f sec; Latency: %0.0f usec." +msgstr "" + +#: ../src/utils/pacat.c:599 +#, c-format +msgid "pa_stream_update_timing_info() failed: %s" +msgstr "" + +#: ../src/utils/pacat.c:609 +#, c-format +msgid "" +"%s [options]\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -r, --record Create a connection for recording\n" +" -p, --playback Create a connection for playback\n" +"\n" +" -v, --verbose Enable verbose operations\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -d, --device=DEVICE The name of the sink/source to " +"connect to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" +" --stream-name=NAME How to call this stream on the " +"server\n" +" --volume=VOLUME Specify the initial (linear) volume " +"in range 0...65536\n" +" --rate=SAMPLERATE The sample rate in Hz (defaults to " +"44100)\n" +" --format=SAMPLEFORMAT The sample type, one of s16le, " +"s16be, u8, float32le,\n" +" float32be, ulaw, alaw, s32le, s32be, " +"s24le, s24be,\n" +" s24-32le, s24-32be (defaults to " +"s16ne)\n" +" --channels=CHANNELS The number of channels, 1 for mono, " +"2 for stereo\n" +" (defaults to 2)\n" +" --channel-map=CHANNELMAP Channel map to use instead of the " +"default\n" +" --fix-format Take the sample format from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-rate Take the sampling rate from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-channels Take the number of channels and the " +"channel map\n" +" from the sink the stream is being " +"connected to.\n" +" --no-remix Don't upmix or downmix channels.\n" +" --no-remap Map channels by index instead of " +"name.\n" +" --latency=BYTES Request the specified latency in " +"bytes.\n" +" --process-time=BYTES Request the specified process time " +"per request in bytes.\n" +" --property=PROPERTY=VALUE Set the specified property to the " +"specified value.\n" +" --raw Record/play raw PCM data.\n" +" --file-format=FFORMAT Record/play formatted PCM data.\n" +" --list-file-formats List available file formats.\n" +msgstr "" + +#: ../src/utils/pacat.c:731 +#, c-format +msgid "" +"pacat %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" + +#: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953 +#, c-format +msgid "Invalid client name '%s'" +msgstr "" + +#: ../src/utils/pacat.c:779 +#, c-format +msgid "Invalid stream name '%s'" +msgstr "" + +#: ../src/utils/pacat.c:816 +#, c-format +msgid "Invalid channel map '%s'" +msgstr "" + +#: ../src/utils/pacat.c:845 +#, c-format +msgid "Invalid latency specification '%s'" +msgstr "" + +#: ../src/utils/pacat.c:852 +#, c-format +msgid "Invalid process time specification '%s'" +msgstr "" + +#: ../src/utils/pacat.c:864 +#, c-format +msgid "Invalid property '%s'" +msgstr "" + +#: ../src/utils/pacat.c:881 +#, c-format +msgid "Unknown file format %s." +msgstr "" + +#: ../src/utils/pacat.c:900 +msgid "Invalid sample specification" +msgstr "" + +#: ../src/utils/pacat.c:910 +#, c-format +msgid "open(): %s" +msgstr "" + +#: ../src/utils/pacat.c:915 +#, c-format +msgid "dup2(): %s" +msgstr "" + +#: ../src/utils/pacat.c:922 +msgid "Too many arguments." +msgstr "" + +#: ../src/utils/pacat.c:933 +msgid "Failed to generate sample specification for file." +msgstr "" + +#: ../src/utils/pacat.c:953 +msgid "Failed to open audio file." +msgstr "" + +#: ../src/utils/pacat.c:959 +msgid "" +"Warning: specified sample specification will be overwritten with " +"specification from file." +msgstr "" + +#: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997 +msgid "Failed to determine sample specification from file." +msgstr "" + +#: ../src/utils/pacat.c:971 +msgid "Warning: Failed to determine channel map from file." +msgstr "" + +#: ../src/utils/pacat.c:982 +msgid "Channel map doesn't match sample specification" +msgstr "" + +#: ../src/utils/pacat.c:993 +msgid "Warning: failed to write channel map to file." +msgstr "" + +#: ../src/utils/pacat.c:1008 +#, c-format +msgid "" +"Opening a %s stream with sample specification '%s' and channel map '%s'." +msgstr "" + +#: ../src/utils/pacat.c:1009 +msgid "recording" +msgstr "" + +#: ../src/utils/pacat.c:1009 +msgid "playback" +msgstr "" + +#: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267 +msgid "pa_mainloop_new() failed." +msgstr "" + +#: ../src/utils/pacat.c:1054 +msgid "io_new() failed." +msgstr "" + +#: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279 +msgid "pa_context_new() failed." +msgstr "" + +#: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285 +#, c-format +msgid "pa_context_connect() failed: %s" +msgstr "" + +#: ../src/utils/pacat.c:1075 +msgid "pa_context_rttime_new() failed." +msgstr "" + +#: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290 +msgid "pa_mainloop_run() failed." +msgstr "" + +#: ../src/utils/pasuspender.c:81 +#, c-format +msgid "fork(): %s\n" +msgstr "" + +#: ../src/utils/pasuspender.c:92 +#, c-format +msgid "execvp(): %s\n" +msgstr "" + +#: ../src/utils/pasuspender.c:109 +#, c-format +msgid "Failure to suspend: %s\n" +msgstr "" + +#: ../src/utils/pasuspender.c:124 +#, c-format +msgid "Failure to resume: %s\n" +msgstr "" + +#: ../src/utils/pasuspender.c:147 +#, c-format +msgid "WARNING: Sound server is not local, not suspending.\n" +msgstr "" + +#: ../src/utils/pasuspender.c:159 +#, c-format +msgid "Connection failure: %s\n" +msgstr "" + +#: ../src/utils/pasuspender.c:176 +#, c-format +msgid "Got SIGINT, exiting.\n" +msgstr "" + +#: ../src/utils/pasuspender.c:194 +#, c-format +msgid "WARNING: Child process terminated by signal %u\n" +msgstr "" + +#: ../src/utils/pasuspender.c:212 +#, c-format +msgid "" +"%s [options] ... \n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +"\n" +msgstr "" + +#: ../src/utils/pasuspender.c:248 +#, c-format +msgid "" +"pasuspender %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" + +#: ../src/utils/pasuspender.c:277 +#, c-format +msgid "pa_mainloop_new() failed.\n" +msgstr "" + +#: ../src/utils/pasuspender.c:290 +#, c-format +msgid "pa_context_new() failed.\n" +msgstr "" + +#: ../src/utils/pasuspender.c:298 +#, c-format +msgid "pa_mainloop_run() failed.\n" +msgstr "" + +#: ../src/utils/pactl.c:135 +#, c-format +msgid "Failed to get statistics: %s" +msgstr "" + +#: ../src/utils/pactl.c:141 +#, c-format +msgid "Currently in use: %u blocks containing %s bytes total.\n" +msgstr "" + +#: ../src/utils/pactl.c:144 +#, c-format +msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n" +msgstr "" + +#: ../src/utils/pactl.c:147 +#, c-format +msgid "Sample cache size: %s\n" +msgstr "" + +#: ../src/utils/pactl.c:156 +#, c-format +msgid "Failed to get server information: %s" +msgstr "" + +#: ../src/utils/pactl.c:164 +#, c-format +msgid "" +"User name: %s\n" +"Host Name: %s\n" +"Server Name: %s\n" +"Server Version: %s\n" +"Default Sample Specification: %s\n" +"Default Channel Map: %s\n" +"Default Sink: %s\n" +"Default Source: %s\n" +"Cookie: %08x\n" +msgstr "" + +#: ../src/utils/pactl.c:205 +#, c-format +msgid "Failed to get sink information: %s" +msgstr "" + +#: ../src/utils/pactl.c:221 +#, c-format +msgid "" +"Sink #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor Source: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" + +#: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360 +#, c-format +msgid "\tPorts:\n" +msgstr "" + +#: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366 +#, c-format +msgid "\tActive Port: %s\n" +msgstr "" + +#: ../src/utils/pactl.c:297 +#, c-format +msgid "Failed to get source information: %s" +msgstr "" + +#: ../src/utils/pactl.c:313 +#, c-format +msgid "" +"Source #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor of Sink: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" + +#: ../src/utils/pactl.c:345 ../src/utils/pactl.c:401 ../src/utils/pactl.c:436 +#: ../src/utils/pactl.c:473 ../src/utils/pactl.c:532 ../src/utils/pactl.c:533 +#: ../src/utils/pactl.c:543 ../src/utils/pactl.c:587 ../src/utils/pactl.c:588 +#: ../src/utils/pactl.c:594 ../src/utils/pactl.c:637 ../src/utils/pactl.c:638 +#: ../src/utils/pactl.c:645 +msgid "n/a" +msgstr "" + +#: ../src/utils/pactl.c:375 +#, c-format +msgid "Failed to get module information: %s" +msgstr "" + +#: ../src/utils/pactl.c:393 +#, c-format +msgid "" +"Module #%u\n" +"\tName: %s\n" +"\tArgument: %s\n" +"\tUsage counter: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" + +#: ../src/utils/pactl.c:412 +#, c-format +msgid "Failed to get client information: %s" +msgstr "" + +#: ../src/utils/pactl.c:430 +#, c-format +msgid "" +"Client #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" + +#: ../src/utils/pactl.c:447 +#, c-format +msgid "Failed to get card information: %s" +msgstr "" + +#: ../src/utils/pactl.c:465 +#, c-format +msgid "" +"Card #%u\n" +"\tName: %s\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" + +#: ../src/utils/pactl.c:479 +#, c-format +msgid "\tProfiles:\n" +msgstr "" + +#: ../src/utils/pactl.c:485 +#, c-format +msgid "\tActive Profile: %s\n" +msgstr "" + +#: ../src/utils/pactl.c:496 +#, c-format +msgid "Failed to get sink input information: %s" +msgstr "" + +#: ../src/utils/pactl.c:515 +#, c-format +msgid "" +"Sink Input #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSink: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tMute: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSink Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" + +#: ../src/utils/pactl.c:554 +#, c-format +msgid "Failed to get source output information: %s" +msgstr "" + +#: ../src/utils/pactl.c:574 +#, c-format +msgid "" +"Source Output #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSource: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSource Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" + +#: ../src/utils/pactl.c:605 +#, c-format +msgid "Failed to get sample information: %s" +msgstr "" + +#: ../src/utils/pactl.c:623 +#, c-format +msgid "" +"Sample #%u\n" +"\tName: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tDuration: %0.1fs\n" +"\tSize: %s\n" +"\tLazy: %s\n" +"\tFilename: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" + +#: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663 +#, c-format +msgid "Failure: %s" +msgstr "" + +#: ../src/utils/pactl.c:687 +#, c-format +msgid "Failed to upload sample: %s" +msgstr "" + +#: ../src/utils/pactl.c:704 +msgid "Premature end of file" +msgstr "" + +#: ../src/utils/pactl.c:863 +msgid "Got SIGINT, exiting." +msgstr "" + +#: ../src/utils/pactl.c:869 +#, c-format +msgid "" +"%s [options] stat\n" +"%s [options] list\n" +"%s [options] exit\n" +"%s [options] upload-sample FILENAME [NAME]\n" +"%s [options] play-sample NAME [SINK]\n" +"%s [options] remove-sample NAME\n" +"%s [options] move-sink-input SINKINPUT SINK\n" +"%s [options] move-source-output SOURCEOUTPUT SOURCE\n" +"%s [options] load-module NAME [ARGS ...]\n" +"%s [options] unload-module MODULE\n" +"%s [options] suspend-sink SINK 1|0\n" +"%s [options] suspend-source SOURCE 1|0\n" +"%s [options] set-card-profile CARD PROFILE\n" +"%s [options] set-sink-port SINK PORT\n" +"%s [options] set-source-port SOURCE PORT\n" +"%s [options] set-sink-volume SINK VOLUME\n" +"%s [options] set-source-volume SOURCE VOLUME\n" +"%s [options] set-sink-input-volume SINKINPUT VOLUME\n" +"%s [options] set-sink-mute SINK 1|0\n" +"%s [options] set-source-mute SOURCE 1|0\n" +"%s [options] set-sink-input-mute SINKINPUT 1|0\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" +msgstr "" + +#: ../src/utils/pactl.c:933 +#, c-format +msgid "" +"pactl %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" + +#: ../src/utils/pactl.c:979 +msgid "Please specify a sample file to load" +msgstr "" + +#: ../src/utils/pactl.c:992 +msgid "Failed to open sound file." +msgstr "" + +#: ../src/utils/pactl.c:1004 +msgid "Warning: Failed to determine sample specification from file." +msgstr "" + +#: ../src/utils/pactl.c:1014 +msgid "You have to specify a sample name to play" +msgstr "" + +#: ../src/utils/pactl.c:1026 +msgid "You have to specify a sample name to remove" +msgstr "" + +#: ../src/utils/pactl.c:1035 +msgid "You have to specify a sink input index and a sink" +msgstr "" + +#: ../src/utils/pactl.c:1045 +msgid "You have to specify a source output index and a source" +msgstr "" + +#: ../src/utils/pactl.c:1060 +msgid "You have to specify a module name and arguments." +msgstr "" + +#: ../src/utils/pactl.c:1080 +msgid "You have to specify a module index" +msgstr "" + +#: ../src/utils/pactl.c:1090 +msgid "" +"You may not specify more than one sink. You have to specify a boolean value." +msgstr "" + +#: ../src/utils/pactl.c:1103 +msgid "" +"You may not specify more than one source. You have to specify a boolean " +"value." +msgstr "" + +#: ../src/utils/pactl.c:1115 +msgid "You have to specify a card name/index and a profile name" +msgstr "" + +#: ../src/utils/pactl.c:1126 +msgid "You have to specify a sink name/index and a port name" +msgstr "" + +#: ../src/utils/pactl.c:1137 +msgid "You have to specify a source name/index and a port name" +msgstr "" + +#: ../src/utils/pactl.c:1149 +msgid "You have to specify a sink name/index and a volume" +msgstr "" + +#: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171 +#: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209 +#: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248 +msgid "Invalid volume specification" +msgstr "" + +#: ../src/utils/pactl.c:1166 +msgid "You have to specify a source name/index and a volume" +msgstr "" + +#: ../src/utils/pactl.c:1183 +msgid "You have to specify a sink input index and a volume" +msgstr "" + +#: ../src/utils/pactl.c:1188 +msgid "Invalid sink input index" +msgstr "" + +#: ../src/utils/pactl.c:1204 +msgid "You have to specify a sink name/index and a mute boolean" +msgstr "" + +#: ../src/utils/pactl.c:1221 +msgid "You have to specify a source name/index and a mute boolean" +msgstr "" + +#: ../src/utils/pactl.c:1238 +msgid "You have to specify a sink input index and a mute boolean" +msgstr "" + +#: ../src/utils/pactl.c:1243 +msgid "Invalid sink input index specification" +msgstr "" + +#: ../src/utils/pactl.c:1262 +msgid "No valid command specified." +msgstr "" + +#: ../src/utils/pax11publish.c:61 +#, c-format +msgid "" +"%s [-D display] [-S server] [-O sink] [-I source] [-c file] [-d|-e|-i|-r]\n" +"\n" +" -d Show current PulseAudio data attached to X11 display (default)\n" +" -e Export local PulseAudio data to X11 display\n" +" -i Import PulseAudio data from X11 display to local environment " +"variables and cookie file.\n" +" -r Remove PulseAudio data from X11 display\n" +msgstr "" + +#: ../src/utils/pax11publish.c:94 +#, c-format +msgid "Failed to parse command line.\n" +msgstr "" + +#: ../src/utils/pax11publish.c:108 +#, c-format +msgid "Server: %s\n" +msgstr "" + +#: ../src/utils/pax11publish.c:110 +#, c-format +msgid "Source: %s\n" +msgstr "" + +#: ../src/utils/pax11publish.c:112 +#, c-format +msgid "Sink: %s\n" +msgstr "" + +#: ../src/utils/pax11publish.c:114 +#, c-format +msgid "Cookie: %s\n" +msgstr "" + +#: ../src/utils/pax11publish.c:132 +#, c-format +msgid "Failed to parse cookie data\n" +msgstr "" + +#: ../src/utils/pax11publish.c:137 +#, c-format +msgid "Failed to save cookie data\n" +msgstr "" + +#: ../src/utils/pax11publish.c:152 +#, c-format +msgid "Failed to load client configuration file.\n" +msgstr "" + +#: ../src/utils/pax11publish.c:157 +#, c-format +msgid "Failed to read environment configuration data.\n" +msgstr "" + +#: ../src/utils/pax11publish.c:174 +#, c-format +msgid "Failed to get FQDN.\n" +msgstr "" + +#: ../src/utils/pax11publish.c:194 +#, c-format +msgid "Failed to load cookie data\n" +msgstr "" + +#: ../src/utils/pax11publish.c:211 +#, c-format +msgid "Not yet implemented.\n" +msgstr "" + +#: ../src/utils/pacmd.c:69 +msgid "No PulseAudio daemon running, or not running as session daemon." +msgstr "" + +#: ../src/utils/pacmd.c:74 +#, c-format +msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s" +msgstr "" + +#: ../src/utils/pacmd.c:91 +#, c-format +msgid "connect(): %s" +msgstr "connect(): %s" + +#: ../src/utils/pacmd.c:99 +msgid "Failed to kill PulseAudio daemon." +msgstr "" + +#: ../src/utils/pacmd.c:107 +msgid "Daemon not responding." +msgstr "" + +#: ../src/utils/pacmd.c:161 +#, c-format +msgid "poll(): %s" +msgstr "poll(): %s" + +#: ../src/utils/pacmd.c:171 ../src/utils/pacmd.c:188 +#, c-format +msgid "read(): %s" +msgstr "read(): %s" + +#: ../src/utils/pacmd.c:207 ../src/utils/pacmd.c:223 +#, c-format +msgid "write(): %s" +msgstr "write(): %s" + +#: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:219 +msgid "Cannot access autospawn lock." +msgstr "" + +#: ../src/modules/alsa/alsa-sink.c:530 ../src/modules/alsa/alsa-sink.c:689 +#, c-format +msgid "" +"ALSA woke us up to write new data to the device, but there was actually " +"nothing to write!\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers.\n" +"We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() " +"returned 0 or another value < min_avail." +msgstr "" + +#: ../src/modules/alsa/alsa-source.c:506 ../src/modules/alsa/alsa-source.c:656 +#, c-format +msgid "" +"ALSA woke us up to read new data from the device, but there was actually " +"nothing to read!\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers.\n" +"We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() " +"returned 0 or another value < min_avail." +msgstr "" + +#: ../src/modules/alsa/module-alsa-card.c:152 +#: ../src/modules/bluetooth/module-bluetooth-device.c:2228 +#: ../src/modules/alsa/alsa-mixer.c:2931 +msgid "Off" +msgstr "オフ" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2184 +msgid "High Fidelity Playback (A2DP)" +msgstr "" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2198 +msgid "High Fidelity Capture (A2DP)" +msgstr "" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2213 +msgid "Telephony Duplex (HSP/HFP)" +msgstr "" + +#: ../src/modules/reserve-wrap.c:151 +msgid "PulseAudio Sound Server" +msgstr "" + +#: ../src/modules/module-rygel-media-server.c:569 +#: ../src/modules/module-rygel-media-server.c:583 +msgid "Output Devices" +msgstr "" + +#: ../src/modules/module-rygel-media-server.c:570 +#: ../src/modules/module-rygel-media-server.c:584 +msgid "Input Devices" +msgstr "" + +#: ../src/modules/module-rygel-media-server.c:774 +msgid "Audio on @HOSTNAME@" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1701 +msgid "Input" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1702 +msgid "Docking Station Input" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1703 +msgid "Docking Station Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1704 +msgid "Line-In" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1705 +msgid "Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1706 +msgid "External Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1707 +msgid "Internal Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1708 +msgid "Radio" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1709 +msgid "Video" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1710 +msgid "Automatic Gain Control" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1711 +msgid "No Automatic Gain Control" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1712 +msgid "Boost" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1713 +msgid "No Boost" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1714 +msgid "Amplifier" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1715 +msgid "No Amplifier" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1773 +msgid "Analog Input" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1774 +msgid "Analog Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1775 +msgid "Analog Line-In" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1776 +msgid "Analog Radio" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1777 +msgid "Analog Video" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1778 +msgid "Analog Output" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1779 +msgid "Analog Headphones" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1780 +msgid "Analog Output (LFE)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1781 +msgid "Analog Mono Output" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1981 +#, fuzzy, c-format +msgid "%s+%s" +msgstr "%s %s" + +#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404 +#, fuzzy, c-format +msgid "%s / %s" +msgstr "%s %s" + +#: ../src/modules/alsa/alsa-mixer.c:2790 +msgid "Analog Mono" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2791 +msgid "Analog Stereo" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2792 +msgid "Analog Surround 2.1" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2793 +msgid "Analog Surround 3.0" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2794 +msgid "Analog Surround 3.1" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2795 +msgid "Analog Surround 4.0" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2796 +msgid "Analog Surround 4.1" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2797 +msgid "Analog Surround 5.0" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2798 +msgid "Analog Surround 5.1" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2799 +msgid "Analog Surround 6.0" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2800 +msgid "Analog Surround 6.1" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2801 +msgid "Analog Surround 7.0" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2802 +msgid "Analog Surround 7.1" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2803 +msgid "Digital Stereo (IEC958)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2804 +msgid "Digital Surround 4.0 (IEC958)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2805 +msgid "Digital Surround 4.0 (IEC958/AC3)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2806 +msgid "Digital Surround 5.1 (IEC958/AC3)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2807 +msgid "Digital Stereo (HDMI)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2928 +msgid "Analog Mono Duplex" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2929 +msgid "Analog Stereo Duplex" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2930 +msgid "Digital Stereo Duplex (IEC958)" +msgstr "" diff --git a/po/kn.po b/po/kn.po new file mode 100644 index 0000000..4b2750a --- /dev/null +++ b/po/kn.po @@ -0,0 +1,2587 @@ +# translation of pulseaudio.master-tx.kn.po to Kannada +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Shankar Prasad , 2009. +msgid "" +msgstr "" +"Project-Id-Version: pulseaudio.master-tx.kn\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-09-29 23:47+0200\n" +"PO-Revision-Date: 2009-09-22 15:32+0530\n" +"Last-Translator: Shankar Prasad \n" +"Language-Team: Kannada \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629 +#, c-format +msgid "%s %s" +msgstr "%s %s" + +#: ../src/modules/alsa/alsa-util.c:1106 +#, c-format +msgid "" +"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu " +"ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_avail() ದಿಂದ ಅತ್ಯಂತ ದೊಡ್ಡದಾದ ಮೌಲ್ಯವು ಮರಳಿದೆ: %lu ಬೈಟ್‌ಗಳು (%lu ms).\n" +"ಇದಕ್ಕೆ ALSA ಚಾಲಕ '%s' ದಲ್ಲಿನ ಒಂದು ದೋಷದ ಕಾರಣವಿರಬಹುದು. ದಯವಿಟ್ಟುಈ ತೊಂದರೆಯನ್ನು ALSA " +"ವಿಕಸನಗಾರರ ಗಮನಕ್ಕೆ ತನ್ನಿ." + +#: ../src/modules/alsa/alsa-util.c:1147 +#, c-format +msgid "" +"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%" +"lu ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_delay() ದಿಂದ ಅತ್ಯಂತ ದೊಡ್ಡದಾದ ಮೌಲ್ಯವು ಮರಳಿದೆ: %li ಬೈಟ್‌ಗಳು (%s%lu ms).\n" +"ಇದಕ್ಕೆ ALSA ಚಾಲಕ '%s' ದಲ್ಲಿನ ಒಂದು ದೋಷದ ಕಾರಣವಿರಬಹುದು. ದಯವಿಟ್ಟುಈ ತೊಂದರೆಯನ್ನು ALSA " +"ವಿಕಸನಗಾರರ ಗಮನಕ್ಕೆ ತನ್ನಿ." + +#: ../src/modules/alsa/alsa-util.c:1194 +#, c-format +msgid "" +"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes " +"(%lu ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_mmap_begin() ದಿಂದ ಅತ್ಯಂತ ದೊಡ್ಡದಾದ ಮೌಲ್ಯವು ಮರಳಿದೆ: %lu ಬೈಟ್‌ಗಳು (%lu ms).\n" +"ಇದಕ್ಕೆ ALSA ಚಾಲಕ '%s' ದಲ್ಲಿನ ಒಂದು ದೋಷದ ಕಾರಣವಿರಬಹುದು. ದಯವಿಟ್ಟುಈ ತೊಂದರೆಯನ್ನು ALSA " +"ವಿಕಸನಗಾರರ ಗಮನಕ್ಕೆ ತನ್ನಿ." + +#: ../src/modules/module-always-sink.c:39 +msgid "Always keeps at least one sink loaded even if it's a null one" +msgstr "ಯಾವಾಗಲೂ ಒಂದು ಸಿಂಕ್‌ ಅನ್ನು ಲೋಡ್ ಮಾಡಿರುತ್ತದೆ, ಅದು ಶೂನ್ಯವಾಗಿದ್ದರೂ ಸಹ" + +#: ../src/modules/module-always-sink.c:83 +msgid "Dummy Output" +msgstr "ಡಮ್ಮಿ ಔಟ್‌ಪುಟ್" + +#: ../src/modules/module-ladspa-sink.c:49 +msgid "Virtual LADSPA sink" +msgstr "ವರ್ಚುವಲ್ LADSPA ಸಿಂಕ್" + +#: ../src/modules/module-ladspa-sink.c:53 +msgid "" +"sink_name= sink_properties= " +"master= format= rate= " +"channels= channel_map= plugin= label= control=" +msgstr "" +"sink_name=<ಸಿಂಕ್‌ನ ಹೆಸರು> sink_properties=<ಸಿಂಕ್‌ನ ಗುಣಗಳು> master=<ಫಿಲ್ಟರ್ " +"ಮಾಡಬೇಕಿರುವ ಸಿಂಕ್‌ನ ಹೆಸರು> format=<ನಮೂನೆ ವಿನ್ಯಾಸ> rate=<ನಮೂನೆ ದರ> " +"channels=<ಚಾನಲ್‌ಗಳ ಸಂಖ್ಯೆ> channel_map=<ಚಾನಲ್ ನಕ್ಷೆ> plugin= " +"label= control=<ವಿರಾಮ ಚಿಹ್ನೆಗಳನ್ನು ಹೊಂದಿರುವ ಇನ್‌ಪುಟ್ ನಿಯಂತ್ರಣ " +"ಮೌಲ್ಯಗಳ ಪಟ್ಟಿ>" + +#: ../src/modules/module-null-sink.c:55 +msgid "Clocked NULL sink" +msgstr "ಕ್ಲಾಕ್‌ ಮಾಡಲಾದ NULL ಸಿಂಕ್" + +#: ../src/modules/module-null-sink.c:291 +msgid "Null Output" +msgstr "ಶೂನ್ಯ ಔಟ್‌ಪುಟ್" + +#: ../src/pulsecore/sink.c:2613 +msgid "Internal Audio" +msgstr "ಆಂತರಿಕ ಆಡಿಯೊ" + +#: ../src/pulsecore/sink.c:2618 +msgid "Modem" +msgstr "ಮಾಡೆಮ್" + +#: ../src/daemon/ltdl-bind-now.c:124 +msgid "Failed to find original lt_dlopen loader." +msgstr "ಮೂಲ lt_dlopen loader ಅನ್ನು ಲೋಡ್ ಮಾಡುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ." + +#: ../src/daemon/ltdl-bind-now.c:129 +msgid "Failed to allocate new dl loader." +msgstr "ಹೊಸ dl ಲೋಡರ್ ಅನ್ನು ನಿಯೋಜಿಸುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ." + +#: ../src/daemon/ltdl-bind-now.c:142 +msgid "Failed to add bind-now-loader." +msgstr "bind-now-ಲೋಡರ್ ಅನ್ನು ಸೇರಿಸಲಾಗಿಲ್ಲ." + +#: ../src/daemon/main.c:141 +#, c-format +msgid "Got signal %s." +msgstr "%s ನಿಂದ ಸಂಕೇತವು ದೊರೆತಿದೆ." + +#: ../src/daemon/main.c:168 +msgid "Exiting." +msgstr "ನಿರ್ಗಮಿಸುತ್ತಿದೆ." + +#: ../src/daemon/main.c:186 +#, c-format +msgid "Failed to find user '%s'." +msgstr "ಬಳಕೆದಾರ '%s' ಅನ್ನು ಪತ್ತೆ ಮಾಡಲು ವಿಫಲಗೊಂಡಿದೆ." + +#: ../src/daemon/main.c:191 +#, c-format +msgid "Failed to find group '%s'." +msgstr "ಗುಂಪು '%s' ಅನ್ನು ಪತ್ತೆ ಮಾಡಲು ವಿಫಲಗೊಂಡಿದೆ." + +#: ../src/daemon/main.c:195 +#, c-format +msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)." +msgstr "ಬಳಕೆದಾರ '%s' (UID %lu) ಹಾಗು ಗುಂಪು '%s' (GID %lu) ಕಂಡುಬಂದಿದೆ." + +#: ../src/daemon/main.c:200 +#, c-format +msgid "GID of user '%s' and of group '%s' don't match." +msgstr "ಬಳಕೆದಾರ '%s' ರ GID ಹಾಗು ಗುಂಪು '%s' ತಾಳೆಯಾಗುತ್ತಿಲ್ಲ." + +#: ../src/daemon/main.c:205 +#, c-format +msgid "Home directory of user '%s' is not '%s', ignoring." +msgstr "ಬಳಕೆದಾರ '%s' ರ ನೆಲೆ ಕೋಶವು '%s' ಆಗಿಲ್ಲ, ಆಲಕ್ಷಿಸಲಾಗುತ್ತಿದೆ." + +#: ../src/daemon/main.c:208 ../src/daemon/main.c:213 +#, c-format +msgid "Failed to create '%s': %s" +msgstr "'%s' ಅನ್ನು ರಚಿಸುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ: %s" + +#: ../src/daemon/main.c:220 +#, c-format +msgid "Failed to change group list: %s" +msgstr "ಗುಂಪಿನ ಪಟ್ಟಿಯನ್ನು ಬದಲಾಯಿಸಲು ವಿಫಲಗೊಂಡಿದೆ: %s" + +#: ../src/daemon/main.c:236 +#, c-format +msgid "Failed to change GID: %s" +msgstr "GID ಅನ್ನು ಬದಲಾಯಿಸಲು ವಿಫಲಗೊಂಡಿದೆ: %s" + +#: ../src/daemon/main.c:252 +#, c-format +msgid "Failed to change UID: %s" +msgstr "UID ಅನ್ನು ಬದಲಾಯಿಸಲು ವಿಫಲಗೊಂಡಿದೆ: %s" + +#: ../src/daemon/main.c:271 +msgid "Successfully dropped root privileges." +msgstr "ರೂಟ್ ಸವಲತ್ತುಗಳನ್ನು ಯಶಸ್ವಿಯಾಗಿ ಬಿಡಲಾಗಿದೆ." + +#: ../src/daemon/main.c:279 +msgid "System wide mode unsupported on this platform." +msgstr "ವ್ಯವಸ್ಥೆಯಾದ್ಯಂತದ ಕ್ರಮಕ್ಕೆ ಈ ಪ್ಲಾಟ್‌ಫಾರ್ಮಿನಲ್ಲಿ ಬೆಂಬಲವಿಲ್ಲ." + +#: ../src/daemon/main.c:297 +#, c-format +msgid "setrlimit(%s, (%u, %u)) failed: %s" +msgstr "setrlimit(%s, (%u, %u)) ವಿಫಲಗೊಂಡಿದೆ: %s" + +#: ../src/daemon/main.c:474 +msgid "Failed to parse command line." +msgstr "ಆಜ್ಞಾ ಸಾಲನ್ನು ಪಾರ್ಸ್ ಮಾಡುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ." + +#: ../src/daemon/main.c:541 +msgid "Daemon not running" +msgstr "ಡೀಮನ್ ಚಲಾಯಿತಗೊಳ್ಳುತ್ತಿದೆ" + +#: ../src/daemon/main.c:543 +#, c-format +msgid "Daemon running as PID %u" +msgstr "ಡೀಮನ್ PID %u ಯಾಗಿ ಚಲಾಯಿಗೊಳ್ಳುತ್ತಿದೆ" + +#: ../src/daemon/main.c:553 +#, c-format +msgid "Failed to kill daemon: %s" +msgstr "ಡೀಮನ್ ಅನ್ನು ಕೊಲ್ಲಲು ವಿಫಲಗೊಂಡಿದೆ: %s" + +#: ../src/daemon/main.c:571 +msgid "" +"This program is not intended to be run as root (unless --system is " +"specified)." +msgstr "" +"ಈ ಪ್ರೋಗ್ರಾಮನ್ನು ರೂಟ್‌ ಆಗಿ ಚಲಾಯಿಸುವ ಉದ್ಧೇಶವನ್ನು ಹೊಂದಿಲ್ಲ (--system ಅನ್ನು ಸೂಚಿಸದೆ " +"ಇದ್ದಲ್ಲಿ ಮಾತ್ರ)." + +#: ../src/daemon/main.c:573 +msgid "Root privileges required." +msgstr "ನಿರ್ವಾಹಕ ಸವಲತ್ತುಗಳ ಅಗತ್ಯವಿದೆ." + +#: ../src/daemon/main.c:578 +msgid "--start not supported for system instances." +msgstr "ವ್ಯವಸ್ಥೆಯ ಸನ್ನಿವೇಶದಿಂದ --start ಬೆಂಬಲಿತವಾಗಿಲ್ಲ." + +#: ../src/daemon/main.c:583 +msgid "Running in system mode, but --disallow-exit not set!" +msgstr "" +"ವ್ಯವಸ್ಥೆಯ ಕ್ರಮದಲ್ಲಿ ಚಲಾಯಿತಗೊಳ್ಳುತ್ತಿದೆ, ಆದರೆ --disallow-exit ಅನ್ನು ಹೊಂದಿಸಲಾಗಿಲ್ಲ!" + +#: ../src/daemon/main.c:586 +msgid "Running in system mode, but --disallow-module-loading not set!" +msgstr "" +"ವ್ಯವಸ್ಥೆಯ ಕ್ರಮದಲ್ಲಿ ಚಲಾಯಿತಗೊಳ್ಳುತ್ತಿದೆ, ಆದರೆ --disallow-module-loading ಅನ್ನು " +"ಹೊಂದಿಸಲಾಗಿಲ್ಲ!" + +#: ../src/daemon/main.c:589 +msgid "Running in system mode, forcibly disabling SHM mode!" +msgstr "" +"ವ್ಯವಸ್ಥೆಯ ಕ್ರಮದಲ್ಲಿ ಚಲಾಯಿತಗೊಳ್ಳುತ್ತಿದ್ದು, SHM ಕ್ರಮವನ್ನು ಒತ್ತಾಯಪೂರ್ವಕವಾಗಿ " +"ಅಶಕ್ತಗೊಳಿಸುತ್ತಿದೆ!" + +#: ../src/daemon/main.c:594 +msgid "Running in system mode, forcibly disabling exit idle time!" +msgstr "" +"ವ್ಯವಸ್ಥೆಯ ಕ್ರಮದಲ್ಲಿ ಚಲಾಯಿತಗೊಳ್ಳುತ್ತಿದ್ದು, ನಿರ್ಗಮಿಸುವ ಜಡ ಸಮಯವನ್ನು ಒತ್ತಾಯಪೂರ್ವಕವಾಗಿ " +"ಅಶಕ್ತಗೊಳಿಸುತ್ತಿದೆ!" + +#: ../src/daemon/main.c:621 +msgid "Failed to acquire stdio." +msgstr "stdio ಅನ್ನು ಪಡೆದುಕೊಳ್ಳುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ." + +#: ../src/daemon/main.c:627 +#, c-format +msgid "pipe failed: %s" +msgstr "ಪೈಪ್‌ ವಿಫಲಗೊಂಡಿದೆ: %s" + +#: ../src/daemon/main.c:632 +#, c-format +msgid "fork() failed: %s" +msgstr "fork() ವಿಫಲಗೊಂಡಿದೆ: %s" + +#: ../src/daemon/main.c:646 ../src/utils/pacat.c:508 +#, c-format +msgid "read() failed: %s" +msgstr "read() ವಿಫಲಗೊಂಡಿದೆ: %s" + +#: ../src/daemon/main.c:652 +msgid "Daemon startup failed." +msgstr "ಡೀಮನ್ ಆರಂಭಗೊಳ್ಳುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ." + +#: ../src/daemon/main.c:654 +msgid "Daemon startup successful." +msgstr "ಡೀಮನ್ ಅನ್ನು ಯಶಸ್ವಿಯಾಗಿ ಆರಂಭಿಸಲಾಗಿದೆ." + +#: ../src/daemon/main.c:731 +#, c-format +msgid "This is PulseAudio %s" +msgstr "ಇದು PulseAudio %s" + +#: ../src/daemon/main.c:732 +#, c-format +msgid "Compilation host: %s" +msgstr "ಕಂಪೈಲ್ ಮಾಡುವ ಅತಿಥೇಯ: %s" + +#: ../src/daemon/main.c:733 +#, c-format +msgid "Compilation CFLAGS: %s" +msgstr "ಕಂಪೈಲ್ ಮಾಡುವ CFLAGS: %s" + +#: ../src/daemon/main.c:736 +#, c-format +msgid "Running on host: %s" +msgstr "ಅತಿಥೇಯದಲ್ಲಿ ಚಲಾಯಿತಗೊಳ್ಳುತ್ತಿದೆ: %s" + +#: ../src/daemon/main.c:739 +#, c-format +msgid "Found %u CPUs." +msgstr "%u CPUಗಳು ಕಂಡುಬಂದಿವೆ." + +#: ../src/daemon/main.c:741 +#, c-format +msgid "Page size is %lu bytes" +msgstr "ಪುಟದ ಗಾತ್ರವು %lu ಬೈಟ್‌ಗಳಾಗಿವೆ" + +#: ../src/daemon/main.c:744 +msgid "Compiled with Valgrind support: yes" +msgstr "Valgrind ಬೆಂಬಲದೊಂದಿಗೆ ಕಂಪೈಲ್ ಮಾಡಲಾಗಿದೆ: ಹೌದು" + +#: ../src/daemon/main.c:746 +msgid "Compiled with Valgrind support: no" +msgstr "Valgrind ಬೆಂಬಲದೊಂದಿಗೆ ಕಂಪೈಲ್ ಮಾಡಲಾಗಿದೆ: ಇಲ್ಲ" + +#: ../src/daemon/main.c:749 +#, c-format +msgid "Running in valgrind mode: %s" +msgstr "valgrind ಕ್ರಮದಲ್ಲಿ ಚಲಾಯಿಸಲಾಗುತ್ತಿದೆ: %s" + +#: ../src/daemon/main.c:752 +msgid "Optimized build: yes" +msgstr "ಪ್ರಶಸ್ತವಾದ ನಿರ್ಮಾಣ: ಹೌದು" + +#: ../src/daemon/main.c:754 +msgid "Optimized build: no" +msgstr "ಪ್ರಶಸ್ತವಾದ ನಿರ್ಮಾಣ: ಇಲ್ಲ" + +#: ../src/daemon/main.c:758 +msgid "NDEBUG defined, all asserts disabled." +msgstr "NDEBUG ಅನ್ನು ಸೂಚಿಸಲಾಗಿದೆ, ಎಲ್ಲಾ ಪ್ರತಿಪಾದನೆಗಳನ್ನೂ ಅಶಕ್ತಗೊಳಿಸಲಾಗಿದೆ." + +#: ../src/daemon/main.c:760 +msgid "FASTPATH defined, only fast path asserts disabled." +msgstr "" +"FASTPATH ಅನ್ನು ಸೂಚಿಸಲಾಗಿದೆ, ಕೇವಲ ವೇಗ ಮಾರ್ಗದ ಪ್ರತಿಪಾದನೆಗಳನ್ನೂ ಅಶಕ್ತಗೊಳಿಸಲಾಗಿದೆ." + +#: ../src/daemon/main.c:762 +msgid "All asserts enabled." +msgstr "ಎಲ್ಲಾ ಪ್ರತಿಪಾದನೆಗಳನ್ನೂ ಶಕ್ತಗೊಳಿಸಲಾಗಿದೆ." + +#: ../src/daemon/main.c:766 +msgid "Failed to get machine ID" +msgstr "ಮೆಶೀನ್ ID ಯನ್ನು ಪಡೆದುಕೊಳ್ಳುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ" + +#: ../src/daemon/main.c:769 +#, c-format +msgid "Machine ID is %s." +msgstr "ಮೆಶೀನ್ ID ಯು %s ಆಗಿದೆ." + +#: ../src/daemon/main.c:773 +#, c-format +msgid "Session ID is %s." +msgstr "ಅಧಿವೇಶನ ID ಯು %s ಆಗಿದೆ." + +#: ../src/daemon/main.c:779 +#, c-format +msgid "Using runtime directory %s." +msgstr "ಚಲಾವಣಾಸಮಯ(ರನ್‌ಟೈಮ್) ಕೋಶ %s ಅನ್ನು ಬಳಸಿಕೊಂಡು." + +#: ../src/daemon/main.c:784 +#, c-format +msgid "Using state directory %s." +msgstr "ಸ್ಥಿತಿ ಕೋಶ %s ಅನ್ನು ಬಳಸಿಕೊಂಡು." + +#: ../src/daemon/main.c:787 +#, c-format +msgid "Using modules directory %s." +msgstr "ಘಟಕಗಳ ಕೋಶ %s ಅನ್ನು ಬಳಸಿಕೊಂಡು." + +#: ../src/daemon/main.c:789 +#, c-format +msgid "Running in system mode: %s" +msgstr "ವ್ಯವಸ್ಥೆಯ ಕ್ರಮದಲ್ಲಿ ಚಲಾಯಿಸಲಾಗುತ್ತಿದೆ: %s" + +#: ../src/daemon/main.c:792 +msgid "" +"OK, so you are running PA in system mode. Please note that you most likely " +"shouldn't be doing that.\n" +"If you do it nonetheless then it's your own fault if things don't work as " +"expected.\n" +"Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an " +"explanation why system mode is usually a bad idea." +msgstr "" +"ಸರಿ, ನೀವು PA ಅನ್ನು ವ್ಯವಸ್ಥೆಯ ಕ್ರಮದಲ್ಲಿ (ಸಿಸ್ಟಮ್ ಮೋಡ್) ಚಲಾಯಿಸುತ್ತಿದ್ದೀರಿ. ಸಾಮಾನ್ಯವಾಗಿ " +"ನೀವು ಹಾಗೆ ಮಾಡಬಾರದು ಎನ್ನುವುದನ್ನು ದಯವಿಟ್ಟು ನೆನಪಿಡಿ.\n" +"ನೀವು ಹಾಗೆ ಮಾಡಿದಲ್ಲಿ, ಮುಂದೆ ಏನಾದರೂ ತೊಂದರೆ ಆದಲ್ಲಿ ಅದು ನಿಮ್ಮದೆ ತಪ್ಪಿನ " +"ಕಾರಣದಿಂದಾಗಿರುತ್ತದೆ.\n" +"ವ್ಯವಸ್ಥೆಯ ಕ್ರಮವು (ಸಿಸ್ಟಮ್ ಮೋಡ್) ಏಕೆ ಒಂದು ಸರಿಯಲ್ಲದ ಬಳಕೆ ಎಂದು ಅರಿಯಲು ದಯವಿಟ್ಟು http://" +"pulseaudio.org/wiki/WhatIsWrongWithSystemMode ಅನ್ನು ನೋಡಿ." + +#: ../src/daemon/main.c:809 +msgid "pa_pid_file_create() failed." +msgstr "pa_pid_file_create() ವಿಫಲಗೊಂಡಿದೆ." + +#: ../src/daemon/main.c:819 +msgid "Fresh high-resolution timers available! Bon appetit!" +msgstr "ತಾಜಾ ರೆಸಲ್ಯೂಶನ್ ಟೈಮರ್ ಲಭ್ಯವಿದೆ! Bon appetit!" + +#: ../src/daemon/main.c:821 +msgid "" +"Dude, your kernel stinks! The chef's recommendation today is Linux with high-" +"resolution timers enabled!" +msgstr "" +"ಮಹಾಶಯರೆ, ನಿಮ್ಮ ಕರ್ನಲ್ ಕೊಳೆತುಹೋಗಿದೆ! ಅತ್ಯುತ್ತಮ ರೆಸಲ್ಯೂಶನ್ ಟೈಮರ್ ಅನ್ನು ಶಕ್ತಗೊಳಿಸಲಾದ " +"ಲಿನಕ್ಸನ್ನು ಬಳಸುವಂತೆ ಅಡುಗೆಯವರು ಸಲಹೆ ಮಾಡುತ್ತಿದ್ದಾರೆ!" + +#: ../src/daemon/main.c:844 +msgid "pa_core_new() failed." +msgstr "pa_core_new() ವಿಫಲಗೊಂಡಿದೆ." + +#: ../src/daemon/main.c:904 +msgid "Failed to initialize daemon." +msgstr "ಡೀಮನ್ ಅನ್ನು ಆರಂಭಿಸಲು ವಿಫಲಗೊಂಡಿದೆ." + +#: ../src/daemon/main.c:909 +msgid "Daemon startup without any loaded modules, refusing to work." +msgstr "ಲೋಡ್ ಮಾಡಲಾದ ಯಾವುದೆ ಡೀಮನ್ ಇಲ್ಲದೆ ಆರಂಭಗೊಂಡಿದೆ, ಕೆಲಸ ಮಾಡಲು ನಿರಾಕರಿಸಿದೆ." + +#: ../src/daemon/main.c:926 +msgid "Daemon startup complete." +msgstr "ಡೀಮನ್ ಆರಂಭಗೊಳಿಕೆ ಪೂರ್ಣಗೊಂಡಿದೆ." + +#: ../src/daemon/main.c:932 +msgid "Daemon shutdown initiated." +msgstr "ಡೀಮನ್ ಸ್ಥಗಿತಗೊಳಿಕೆಯನ್ನು ಆರಂಭಿಸಲಾಗಿದೆ." + +#: ../src/daemon/main.c:954 +msgid "Daemon terminated." +msgstr "ಡೀಮನ್ ಅನ್ನು ಅಂತ್ಯಗೊಳಿಸಲಾಗಿದೆ." + +#: ../src/daemon/cmdline.c:115 +#, c-format +msgid "" +"%s [options]\n" +"\n" +"COMMANDS:\n" +" -h, --help Show this help\n" +" --version Show version\n" +" --dump-conf Dump default configuration\n" +" --dump-modules Dump list of available modules\n" +" --dump-resample-methods Dump available resample methods\n" +" --cleanup-shm Cleanup stale shared memory " +"segments\n" +" --start Start the daemon if it is not " +"running\n" +" -k --kill Kill a running daemon\n" +" --check Check for a running daemon (only " +"returns exit code)\n" +"\n" +"OPTIONS:\n" +" --system[=BOOL] Run as system-wide instance\n" +" -D, --daemonize[=BOOL] Daemonize after startup\n" +" --fail[=BOOL] Quit when startup fails\n" +" --high-priority[=BOOL] Try to set high nice level\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_NICE)\n" +" --realtime[=BOOL] Try to enable realtime scheduling\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_RTPRIO)\n" +" --disallow-module-loading[=BOOL] Disallow module user requested " +"module\n" +" loading/unloading after startup\n" +" --disallow-exit[=BOOL] Disallow user requested exit\n" +" --exit-idle-time=SECS Terminate the daemon when idle and " +"this\n" +" time passed\n" +" --module-idle-time=SECS Unload autoloaded modules when idle " +"and\n" +" this time passed\n" +" --scache-idle-time=SECS Unload autoloaded samples when idle " +"and\n" +" this time passed\n" +" --log-level[=LEVEL] Increase or set verbosity level\n" +" -v Increase the verbosity level\n" +" --log-target={auto,syslog,stderr} Specify the log target\n" +" --log-meta[=BOOL] Include code location in log " +"messages\n" +" --log-time[=BOOL] Include timestamps in log messages\n" +" --log-backtrace=FRAMES Include a backtrace in log messages\n" +" -p, --dl-search-path=PATH Set the search path for dynamic " +"shared\n" +" objects (plugins)\n" +" --resample-method=METHOD Use the specified resampling method\n" +" (See --dump-resample-methods for\n" +" possible values)\n" +" --use-pid-file[=BOOL] Create a PID file\n" +" --no-cpu-limit[=BOOL] Do not install CPU load limiter on\n" +" platforms that support it.\n" +" --disable-shm[=BOOL] Disable shared memory support.\n" +"\n" +"STARTUP SCRIPT:\n" +" -L, --load=\"MODULE ARGUMENTS\" Load the specified plugin module " +"with\n" +" the specified argument\n" +" -F, --file=FILENAME Run the specified script\n" +" -C Open a command line on the running " +"TTY\n" +" after startup\n" +"\n" +" -n Don't load default script file\n" +msgstr "" +"%s [ಆಯ್ಕೆಗಳು]\n" +"\n" +"COMMANDS:\n" +" -h, --help ಈ ನೆರವನ್ನು ತೋರಿಸು\n" +" --version ಆವೃತ್ತಿಯನ್ನು ತೋರಿಸು\n" +" --dump-conf ಪೂರ್ವನಿಯೋಜಿತ ಸಂರಚನೆಯನ್ನು ಬಿಸುಡು\n" +" --dump-modules ಲಭ್ಯವಿರುವ ಘಟಕಗಳನ್ನು ಬಿಸುಡು\n" +" --dump-resample-methods ಲಭ್ಯವಿರುವ ಮರುನಮೂನೆ ವಿಧಾನಗಳನ್ನು ಬಿಸುಡು\n" +" --cleanup-shm ಇಕ್ಕಟ್ಟಿನಲ್ಲಿ ಹಂಚಲಾದ ಮೆಮೊರಿ ಖಂಡಗಳನ್ನು " +"ಸ್ವಚ್ಛಗೊಳಿಸು\n" +" --start ಡೀಮನ್ ಚಾಲನೆಯಲ್ಲಿಲ್ಲದೆ ಇದ್ದಲ್ಲಿ ಆರಂಭಿಸು\n" +" -k --kill ಚಾಲನೆಯಲ್ಲಿರು ಡೀಮನ್ ಅನ್ನು ಕೊಲ್ಲು\n" +" --check ಚಾಲನೆಯಲ್ಲಿರುವ ಡೀಮನ್‌ಗಾಗಿ ಪರಿಶೀಲಿಸು " +"(ನಿರ್ಗಮನಾ ಸಂಜ್ಞೆಯನ್ನು ಮಾತ್ರ ಮರಳಿಸುತ್ತದೆ)\n" +"\n" +"ಆಯ್ಕೆಗಳು:\n" +" --system[=BOOL] ವ್ಯವಸ್ಥೆಯಾದ್ಯಂತದ ಸನ್ನಿವೇಶವಾಗಿ ಚಲಾಯಿಸು\n" +" -D, --daemonize[=BOOL] ಆರಂಭಗೊಂಡ ನಂತರ ಡೀಮನ್ ಆಗಿ ಮಾಡು\n" +" --fail[=BOOL] ಆರಂಭಗೊಳಿಕೆಯು ವಿಫಲಗೊಂಡಾಗ ನಿರ್ಗಮಿಸು\n" +" --high-priority[=BOOL] ಹೆಚ್ಚಿನ ನೈಸ್‌ ಮಟ್ಟವನ್ನು ಹೊಂದಿಸಲು " +"ಪ್ರಯತ್ನಿಸು\n" +" (SUID ಅಥವ ಓರೆಯಾದ RLIMIT_NICE ಇದ್ದಾಗ, " +"ಕೇವಲ\n" +" ರೂಟ್ ಆಗಿ ಮಾತ್ರವೆ ಲಭ್ಯವಿರುತ್ತದೆ)\n" +" --realtime[=BOOL] ರಿಯಲ್ ಟೈಮ್ ಶೆಡ್ಯೂಲಿಂಗ್ ಅನ್ನು " +"ಶಕ್ತಗೊಳಿಸಲಾಗುತ್ತಿದೆ\n" +" (SUID ಅಥವ ಓರೆಯಾದ RLIMIT_RTPRIO " +"ಇದ್ದಾಗ, ಕೇವಲ\n" +" ರೂಟ್ ಆಗಿ ಮಾತ್ರವೆ ಲಭ್ಯವಿರುತ್ತದೆ)\n" +" --disallow-module-loading[=BOOL] ಆರಂಭಗೊಂಡ ನಂತರ ಬಳಕೆದಾರರು ಮನವಿ " +"ಸಲ್ಲಿಸಿದಂತಹ ಘಟಕವನ್ನು\n" +" ಲೋಡ್‌/ಅನ್‌ಲೋಡ್ ಮಾಡುವುದನ್ನು ಅನುಮತಿಸದಿರು\n" +" --disallow-exit[=BOOL] ಬಳಕೆದಾರರು ಮನವಿ ಸಲ್ಲಿಸಿದ ನಿರ್ಗಮಿಸು " +"ಮನವಿಯನ್ನು ಅನುಮತಿಸದಿರು\n" +" --exit-idle-time=SECS ಡೀಮನ್ ಜಡಗೊಂಡು ಇಷ್ಟು ಸಮಯ ಕಳೆದಿದ್ದಲ್ಲಿ \n" +" ಅದನ್ನು ಅಂತ್ಯಗೊಳಿಸು\n" +" --module-idle-time=SECS ತಾನಾಗಿಯೆ ಲೋಡ್‌ ಆದ ಘಟಕಗಳು ಜಡಗೊಂಡು ಇಷ್ಟು " +"ಸಮಯ\n" +" ಕಳೆದೆದಿದ್ದಲ್ಲಿ ಅನ್‌ಲೋಡ್ ಮಾಡು\n" +" --scache-idle-time=SECS ತಾನಾಗಿಯೆ ಲೋಡ್‌ ಆದ ನಮೂನೆಗಳು ಜಡಗೊಂಡು " +"ಇಷ್ಟು ಸಮಯ\n" +" ಕಳೆದೆದಿದ್ದಲ್ಲಿ ಅನ್‌ಲೋಡ್ ಮಾಡು\n" +" --log-level[=LEVEL] ವರ್ಬೋಸ್ ಮಟ್ಟವನ್ನು ಹೆಚ್ಚಿಸು ಅಥವ ಹೊಂದಿಸು\n" +" -v ವರ್ಬೋಸ್ ಮಟ್ಟವನ್ನು ಹೆಚ್ಚಿಸು\n" +" --log-target={auto,syslog,stderr} ದಾಖಲೆಯ ಗುರಿಯನ್ನು ಸೂಚಿಸು\n" +" --log-meta[=BOOL] ದಾಖಲೆಯ ಸಂದೇಶಗಳಲ್ಲಿ ಸಂಜ್ಞೆಯು ಇರುವ " +"ಸ್ಥಳವನ್ನು ಸೇರಿಸು\n" +" --log-time[=BOOL] ದಾಖಲೆಯ ಸಂದೇಶಗಳಲ್ಲಿ ಸಮಯದ ಮುದ್ರೆಯನ್ನು " +"ಸೇರಿಸು\n" +" --log-backtrace=FRAMES ದಾಖಲೆಯ ಸಂದೇಶಗಳಲ್ಲಿ ಹಿಂದಕ್ಕೆ " +"ಹುಡುಕುವುದನ್ನು ಸೇರಿಸು\n" +" -p, --dl-search-path=PATH ಡೈನಮಿಕ್ ಹಂಚಲಾದ ವಸ್ತುಗಳಿಗಾಗಿ (ಪ್ಲಗ್‌ಇನ್‌ಗಳು)" +"ಹುಡುಕು\n" +" ಮಾರ್ಗವನ್ನು ಸೂಚಿಸು\n" +" --resample-method=METHOD ಸೂಚಿಸಲಾದ ಮರು-ನಮೂನಾ ವಿಧಾನವನ್ನು ಬಳಸಿ\n" +" (ಸಾಧ್ಯವಿರುವ ಮೌಲ್ಯಗಳಿಗಾಗಿ --dump-" +"resample-methods ಅನ್ನು\n" +" ನೋಡಿ)\n" +" --use-pid-file[=BOOL] ಒಂದು PID ಕಡತವನ್ನು ರಚಿಸು\n" +" --no-cpu-limit[=BOOL] CPU ಲೋಡ್ ಅನ್ನು ಮಿತಿಗೊಳಿಸುವುದನ್ನು " +"ಬೆಂಬಲಿಸುವ ಪ್ಲಾಟ್‌ಫಾರ್ಮಿನ \n" +" ಮೇಲೆ ಅದನ್ನು ಅನುಸ್ಥಾಪಿಸಬೇಡ..\n" +" --disable-shm[=BOOL] ಹಂಚಲಾದ ಮೆಮೊರಿ ಅಶಕ್ತಗೊಳಿಸು.\n" +"\n" +"STARTUP SCRIPT:\n" +" -L, --load=\"MODULE ARGUMENTS\" ಸೂಚಿಸಲಾದ ಪ್ಲಗ್‌ಇನ್ ಘಟಕವನ್ನು ಸೂಚಿತ\n" +" ಆರ್ಗುಮೆಂಟುಗಳೊಂದಿಗೆ ಲೋಡ್ ಮಾಡು\n" +" -F, --file=FILENAME ಸೂಚಿಸಲಾದ ಸ್ಕ್ರಿಪ್ಟನ್ನು ಚಲಾಯಿಸು\n" +" -C ಆರಂಭಗೊಂಡ ನಂತರ TTY ಅನ್ನು ಚಲಾಯಿಸಿದ ನಂತರ " +"ಒಂದು \n" +" ಆಜ್ಞಾ ಸಾಲನ್ನು ತೆರೆ\n" +"\n" +" -n ಪೂರ್ವನಿಯೋಜಿತ ಸ್ಕ್ರಿಪ್ಟಿನ ಕಡತವನ್ನು ಲೋಡ್ " +"ಮಾಡಬೇಡ\n" + +#: ../src/daemon/cmdline.c:247 +msgid "--daemonize expects boolean argument" +msgstr "--daemonize ಬೂಲಿಯನ್ ಆರ್ಗುಮೆಂಟನ್ನು ನಿರೀಕ್ಷಿಸುತ್ತದೆ" + +#: ../src/daemon/cmdline.c:254 +msgid "--fail expects boolean argument" +msgstr "--fail ಬೂಲಿಯನ್ ಆರ್ಗುಮೆಂಟನ್ನು ನಿರೀಕ್ಷಿಸುತ್ತದೆ" + +#: ../src/daemon/cmdline.c:264 +msgid "" +"--log-level expects log level argument (either numeric in range 0..4 or one " +"of debug, info, notice, warn, error)." +msgstr "" +"--log-level ದಾಖಲೆ ಮಟ್ಟದ ಆರ್ಗುಮೆಂಟನ್ನು ನಿರೀಕ್ಷಿಸುತ್ತದೆ (0..4 ವ್ಯಾಪ್ತಿಯಲ್ಲಿನ ಅಂಕೆಯನ್ನು " +"ಅಥವ debug, info, notice, warn, error ಅನ್ನು)." + +#: ../src/daemon/cmdline.c:276 +msgid "--high-priority expects boolean argument" +msgstr "--high-priority ಬೂಲಿಯನ್ ಆರ್ಗುಮೆಂಟನ್ನು ನಿರೀಕ್ಷಿಸುತ್ತದೆ" + +#: ../src/daemon/cmdline.c:283 +msgid "--realtime expects boolean argument" +msgstr "--realtime ಬೂಲಿಯನ್ ಆರ್ಗುಮೆಂಟನ್ನು ನಿರೀಕ್ಷಿಸುತ್ತದೆ" + +#: ../src/daemon/cmdline.c:290 +msgid "--disallow-module-loading expects boolean argument" +msgstr "--disallow-module-loading ಬೂಲಿಯನ್ ಆರ್ಗುಮೆಂಟನ್ನು ನಿರೀಕ್ಷಿಸುತ್ತದೆ" + +#: ../src/daemon/cmdline.c:297 +msgid "--disallow-exit expects boolean argument" +msgstr "--disallow-exit ಬೂಲಿಯನ್ ಆರ್ಗುಮೆಂಟನ್ನು ನಿರೀಕ್ಷಿಸುತ್ತದೆ" + +#: ../src/daemon/cmdline.c:304 +msgid "--use-pid-file expects boolean argument" +msgstr "--use-pid-file ಬೂಲಿಯನ್ ಆರ್ಗುಮೆಂಟನ್ನು ನಿರೀಕ್ಷಿಸುತ್ತದೆ" + +#: ../src/daemon/cmdline.c:321 +msgid "Invalid log target: use either 'syslog', 'stderr' or 'auto'." +msgstr "ಅಮಾನ್ಯವಾದ ದಾಖಲೆ ಗುರಿ: 'syslog', 'stderr' ಅಥವ 'auto' ಅನ್ನು ಬಳಸಿ." + +#: ../src/daemon/cmdline.c:328 +msgid "--log-time expects boolean argument" +msgstr "--log-time ಬೂಲಿಯನ್ ಆರ್ಗುಮೆಂಟನ್ನು ನಿರೀಕ್ಷಿಸುತ್ತದೆ" + +#: ../src/daemon/cmdline.c:335 +msgid "--log-meta expects boolean argument" +msgstr "--log-meta ಬೂಲಿಯನ್ ಆರ್ಗುಮೆಂಟನ್ನು ನಿರೀಕ್ಷಿಸುತ್ತದೆ" + +#: ../src/daemon/cmdline.c:354 +#, c-format +msgid "Invalid resample method '%s'." +msgstr "ಅಮಾನ್ಯವಾದ ಮರುನಮೂನೆ ವಿಧಾನ '%s'." + +#: ../src/daemon/cmdline.c:361 +msgid "--system expects boolean argument" +msgstr "--system ಬೂಲಿಯನ್ ಆರ್ಗುಮೆಂಟನ್ನು ನಿರೀಕ್ಷಿಸುತ್ತದೆ" + +#: ../src/daemon/cmdline.c:368 +msgid "--no-cpu-limit expects boolean argument" +msgstr "--no-cpu-limit ಬೂಲಿಯನ್ ಆರ್ಗುಮೆಂಟನ್ನು ನಿರೀಕ್ಷಿಸುತ್ತದೆ" + +#: ../src/daemon/cmdline.c:375 +msgid "--disable-shm expects boolean argument" +msgstr "--disable-shm ಬೂಲಿಯನ್ ಆರ್ಗುಮೆಂಟನ್ನು ನಿರೀಕ್ಷಿಸುತ್ತದೆ" + +#: ../src/daemon/dumpmodules.c:60 +#, c-format +msgid "Name: %s\n" +msgstr "ಹೆಸರು: %s\n" + +#: ../src/daemon/dumpmodules.c:63 +#, c-format +msgid "No module information available\n" +msgstr "ಯಾವುದೆ ಘಟಕ ಮಾಹಿತಿಯು ಲಭ್ಯವಿಲ್ಲ\n" + +#: ../src/daemon/dumpmodules.c:66 +#, c-format +msgid "Version: %s\n" +msgstr "ಆವೃತ್ತಿ: %s\n" + +#: ../src/daemon/dumpmodules.c:68 +#, c-format +msgid "Description: %s\n" +msgstr "ವಿವರಣೆ: %s\n" + +#: ../src/daemon/dumpmodules.c:70 +#, c-format +msgid "Author: %s\n" +msgstr "ಕತೃ: %s\n" + +#: ../src/daemon/dumpmodules.c:72 +#, c-format +msgid "Usage: %s\n" +msgstr "ಬಳಕೆ: %s\n" + +#: ../src/daemon/dumpmodules.c:73 +#, c-format +msgid "Load Once: %s\n" +msgstr "ಒಮ್ಮೆ ಲೋಡ್ ಮಾಡು: %s\n" + +#: ../src/daemon/dumpmodules.c:75 +#, c-format +msgid "DEPRECATION WARNING: %s\n" +msgstr "DEPRECATION WARNING: %s\n" + +#: ../src/daemon/dumpmodules.c:79 +#, c-format +msgid "Path: %s\n" +msgstr "ಮಾರ್ಗ: %s\n" + +#: ../src/daemon/daemon-conf.c:232 +#, c-format +msgid "[%s:%u] Invalid log target '%s'." +msgstr "[%s:%u] ಅಮಾನ್ಯವಾದ ದಾಖಲೆ ಗುರಿ '%s'." + +#: ../src/daemon/daemon-conf.c:248 +#, c-format +msgid "[%s:%u] Invalid log level '%s'." +msgstr "[%s:%u] ಅಮಾನ್ಯವಾದ ದಾಖಲೆ ಮಟ್ಟ '%s'." + +#: ../src/daemon/daemon-conf.c:264 +#, c-format +msgid "[%s:%u] Invalid resample method '%s'." +msgstr "[%s:%u] ಅಮಾನ್ಯವಾದ ಮರುನಮೂನೆ ವಿಧಾನ '%s'." + +#: ../src/daemon/daemon-conf.c:287 +#, c-format +msgid "[%s:%u] Invalid rlimit '%s'." +msgstr "[%s:%u] ಅಮಾನ್ಯವಾದ rlimit '%s'." + +#: ../src/daemon/daemon-conf.c:294 +#, c-format +msgid "[%s:%u] rlimit not supported on this platform." +msgstr "[%s:%u] rlimit ಗೆ ಈ ಪ್ಲಾಟ್‌ಫಾರ್ಮಿನಲ್ಲಿ ಬೆಂಬಲವಿಲ್ಲ." + +#: ../src/daemon/daemon-conf.c:310 +#, c-format +msgid "[%s:%u] Invalid sample format '%s'." +msgstr "[%s:%u] ಅಮಾನ್ಯವಾದ ನಮೂನೆ ರಚನೆ '%s'." + +#: ../src/daemon/daemon-conf.c:328 +#, c-format +msgid "[%s:%u] Invalid sample rate '%s'." +msgstr "[%s:%u] ಅಮಾನ್ಯವಾದ ನಮೂನೆ ದರ '%s'." + +#: ../src/daemon/daemon-conf.c:352 +#, c-format +msgid "[%s:%u] Invalid sample channels '%s'." +msgstr "[%s:%u] ಅಮಾನ್ಯವಾದ ನಮೂನೆ ಚಾನಲ್‌ಗಳು '%s'." + +#: ../src/daemon/daemon-conf.c:370 +#, c-format +msgid "[%s:%u] Invalid channel map '%s'." +msgstr "[%s:%u] ಅಮಾನ್ಯವಾದ ಚಾನಲ್ ನಕ್ಷೆ '%s'." + +#: ../src/daemon/daemon-conf.c:388 +#, c-format +msgid "[%s:%u] Invalid number of fragments '%s'." +msgstr "[%s:%u] ಅಮಾನ್ತವಾದ ಫ್ರಾಗ್ಮೆಂಟುಗಳ ಸಂಖ್ಯೆ '%s'." + +#: ../src/daemon/daemon-conf.c:406 +#, c-format +msgid "[%s:%u] Invalid fragment size '%s'." +msgstr "[%s:%u] ಅಮಾನ್ಯವಾದ ಫ್ರಾಗ್ಮೆಂಟ್ ಗಾತ್ರ '%s'." + +#: ../src/daemon/daemon-conf.c:424 +#, c-format +msgid "[%s:%u] Invalid nice level '%s'." +msgstr "[%s:%u] ಅಮಾನ್ಯವಾದ ನೈಸ್‌ ಹಂತ '%s'." + +#: ../src/daemon/daemon-conf.c:546 +#, c-format +msgid "Failed to open configuration file: %s" +msgstr "ಸಂರಚನಾ ಕಡತವನ್ನು ತೆರೆಯಲು ವಿಫಲಗೊಂಡಿದೆ: %s" + +#: ../src/daemon/daemon-conf.c:562 +msgid "" +"The specified default channel map has a different number of channels than " +"the specified default number of channels." +msgstr "" +"ಸೂಚಿಸಲಾದ ಪೂರ್ವನಿಯೋಜಿತ ಚಾನಲ್ ನಕ್ಷೆಯು ಪೂರ್ವನಿಯೋಜಿತ ಚಾನಲ್‌ಗಳ ಸಂಖ್ಯೆಗಳಿಗಿಂತ ವಿಭಿನ್ನವಾದ " +"ಮಾರ್ಗಗಳ ಸಂಖ್ಯೆಯನ್ನು ಹೊಂದಿದೆ." + +#: ../src/daemon/daemon-conf.c:638 +#, c-format +msgid "### Read from configuration file: %s ###\n" +msgstr "### ಸಂರಚನಾ ಕಡತದಿಂದ ಓದು: %s ###\n" + +#: ../src/daemon/caps.c:62 +msgid "Cleaning up privileges." +msgstr "ಸವಲತ್ತುಗಳನ್ನು ಸ್ವಚ್ಛಗೊಳಿಸಲಾಗುತ್ತಿದೆ." + +#: ../src/daemon/pulseaudio.desktop.in.h:1 +msgid "PulseAudio Sound System" +msgstr "PulseAudio ಧ್ವನಿ ವ್ಯವಸ್ಥೆ" + +#: ../src/daemon/pulseaudio.desktop.in.h:2 +msgid "Start the PulseAudio Sound System" +msgstr "PulseAudio ಧ್ವನಿ ವ್ಯವಸ್ಥೆಯನ್ನು ಆರಂಭಿಸಿ" + +#: ../src/pulse/channelmap.c:105 ../src/pulse/channelmap.c:757 +msgid "Mono" +msgstr "ಮೊನೊ" + +#: ../src/pulse/channelmap.c:107 +msgid "Front Center" +msgstr "ಎದುರಿನ ಮಧ್ಯಭಾಗ" + +#: ../src/pulse/channelmap.c:108 +msgid "Front Left" +msgstr "ಎದುರಿನ ಎಡಭಾಗ" + +#: ../src/pulse/channelmap.c:109 +msgid "Front Right" +msgstr "ಎದುರಿನ ಬಲಭಾಗ" + +#: ../src/pulse/channelmap.c:111 +msgid "Rear Center" +msgstr "ಹಿಂಬದಿಯ ಮಧ್ಯಭಾಗ" + +#: ../src/pulse/channelmap.c:112 +msgid "Rear Left" +msgstr "ಹಿಂಬದಿಯ ಎಡಭಾಗ" + +#: ../src/pulse/channelmap.c:113 +msgid "Rear Right" +msgstr "ಹಿಂಬದಿಯ ಬಲಭಾಗ" + +#: ../src/pulse/channelmap.c:115 +msgid "Low Frequency Emmiter" +msgstr "ಕೆಳಮಟ್ಟದ ಫ್ರೀಕ್ವೆನ್ಸಿ ಉತ್ಪಾದಕ" + +#: ../src/pulse/channelmap.c:117 +msgid "Front Left-of-center" +msgstr "ಮಧ್ಯದ ಎಡಭಾಗದ ಎದುರುಭಾಗ" + +#: ../src/pulse/channelmap.c:118 +msgid "Front Right-of-center" +msgstr "ಮಧ್ಯದ ಬಲಭಾಗದ ಎದುರುಭಾಗ" + +#: ../src/pulse/channelmap.c:120 +msgid "Side Left" +msgstr "ಬದಿಯ ಎಡಭಾಗ" + +#: ../src/pulse/channelmap.c:121 +msgid "Side Right" +msgstr "ಬದಿಯ ಬಲಭಾಗ" + +#: ../src/pulse/channelmap.c:123 +msgid "Auxiliary 0" +msgstr "ಸಹಾಯಕ 0" + +#: ../src/pulse/channelmap.c:124 +msgid "Auxiliary 1" +msgstr "ಸಹಾಯಕ 1" + +#: ../src/pulse/channelmap.c:125 +msgid "Auxiliary 2" +msgstr "ಸಹಾಯಕ 2" + +#: ../src/pulse/channelmap.c:126 +msgid "Auxiliary 3" +msgstr "ಸಹಾಯಕ 3" + +#: ../src/pulse/channelmap.c:127 +msgid "Auxiliary 4" +msgstr "ಸಹಾಯಕ 4" + +#: ../src/pulse/channelmap.c:128 +msgid "Auxiliary 5" +msgstr "ಸಹಾಯಕ 5" + +#: ../src/pulse/channelmap.c:129 +msgid "Auxiliary 6" +msgstr "ಸಹಾಯಕ 6" + +#: ../src/pulse/channelmap.c:130 +msgid "Auxiliary 7" +msgstr "ಸಹಾಯಕ 7" + +#: ../src/pulse/channelmap.c:131 +msgid "Auxiliary 8" +msgstr "ಸಹಾಯಕ 8" + +#: ../src/pulse/channelmap.c:132 +msgid "Auxiliary 9" +msgstr "ಸಹಾಯಕ 9" + +#: ../src/pulse/channelmap.c:133 +msgid "Auxiliary 10" +msgstr "ಸಹಾಯಕ 10" + +#: ../src/pulse/channelmap.c:134 +msgid "Auxiliary 11" +msgstr "ಸಹಾಯಕ 11" + +#: ../src/pulse/channelmap.c:135 +msgid "Auxiliary 12" +msgstr "ಸಹಾಯಕ 12" + +#: ../src/pulse/channelmap.c:136 +msgid "Auxiliary 13" +msgstr "ಸಹಾಯಕ 13" + +#: ../src/pulse/channelmap.c:137 +msgid "Auxiliary 14" +msgstr "ಸಹಾಯಕ 14" + +#: ../src/pulse/channelmap.c:138 +msgid "Auxiliary 15" +msgstr "ಸಹಾಯಕ 15" + +#: ../src/pulse/channelmap.c:139 +msgid "Auxiliary 16" +msgstr "ಸಹಾಯಕ 16" + +#: ../src/pulse/channelmap.c:140 +msgid "Auxiliary 17" +msgstr "ಸಹಾಯಕ 17" + +#: ../src/pulse/channelmap.c:141 +msgid "Auxiliary 18" +msgstr "ಸಹಾಯಕ 18" + +#: ../src/pulse/channelmap.c:142 +msgid "Auxiliary 19" +msgstr "ಸಹಾಯಕ 19" + +#: ../src/pulse/channelmap.c:143 +msgid "Auxiliary 20" +msgstr "ಸಹಾಯಕ 20" + +#: ../src/pulse/channelmap.c:144 +msgid "Auxiliary 21" +msgstr "ಸಹಾಯಕ 21" + +#: ../src/pulse/channelmap.c:145 +msgid "Auxiliary 22" +msgstr "ಸಹಾಯಕ 22" + +#: ../src/pulse/channelmap.c:146 +msgid "Auxiliary 23" +msgstr "ಸಹಾಯಕ 23" + +#: ../src/pulse/channelmap.c:147 +msgid "Auxiliary 24" +msgstr "ಸಹಾಯಕ 24" + +#: ../src/pulse/channelmap.c:148 +msgid "Auxiliary 25" +msgstr "ಸಹಾಯಕ 25" + +#: ../src/pulse/channelmap.c:149 +msgid "Auxiliary 26" +msgstr "ಸಹಾಯಕ 26" + +#: ../src/pulse/channelmap.c:150 +msgid "Auxiliary 27" +msgstr "ಸಹಾಯಕ 27" + +#: ../src/pulse/channelmap.c:151 +msgid "Auxiliary 28" +msgstr "ಸಹಾಯಕ 28" + +#: ../src/pulse/channelmap.c:152 +msgid "Auxiliary 29" +msgstr "ಸಹಾಯಕ 29" + +#: ../src/pulse/channelmap.c:153 +msgid "Auxiliary 30" +msgstr "ಸಹಾಯಕ 30" + +#: ../src/pulse/channelmap.c:154 +msgid "Auxiliary 31" +msgstr "ಸಹಾಯಕ 31" + +#: ../src/pulse/channelmap.c:156 +msgid "Top Center" +msgstr "ಮೇಲಿನ ಮಧ್ಯಭಾಗ" + +#: ../src/pulse/channelmap.c:158 +msgid "Top Front Center" +msgstr "ಮೇಲಿನ ಎದುರಿನ ಮಧ್ಯಭಾಗ" + +#: ../src/pulse/channelmap.c:159 +msgid "Top Front Left" +msgstr "ಮೇಲಿನ ಎದುರಿನ ಎಡಭಾಗ" + +#: ../src/pulse/channelmap.c:160 +msgid "Top Front Right" +msgstr "ಮೇಲಿನ ಎದುರಿನ ಬಲಭಾಗ" + +#: ../src/pulse/channelmap.c:162 +msgid "Top Rear Center" +msgstr "ಮೇಲಿನ ಹಿಂಬದಿಯ ಮಧ್ಯಭಾಗ" + +#: ../src/pulse/channelmap.c:163 +msgid "Top Rear Left" +msgstr "ಮೇಲಿನ ಹಿಂಬದಿಯ ಎಡಭಾಗ" + +#: ../src/pulse/channelmap.c:164 +msgid "Top Rear Right" +msgstr "ಮೇಲಿನ ಹಿಂಬದಿಯ ಬಲಭಾಗ" + +#: ../src/pulse/channelmap.c:484 ../src/pulse/sample.c:170 +#: ../src/pulse/volume.c:295 ../src/pulse/volume.c:321 +#: ../src/pulse/volume.c:341 ../src/pulse/volume.c:371 +msgid "(invalid)" +msgstr "(ಅಮಾನ್ಯ)" + +#: ../src/pulse/channelmap.c:761 +msgid "Stereo" +msgstr "ಸ್ಟೀರಿಯೋ" + +#: ../src/pulse/channelmap.c:766 +msgid "Surround 4.0" +msgstr "ಸರೌಂಡ್‌ 4.0" + +#: ../src/pulse/channelmap.c:772 +msgid "Surround 4.1" +msgstr "ಸರೌಂಡ್‌ 4.1" + +#: ../src/pulse/channelmap.c:778 +msgid "Surround 5.0" +msgstr "ಸರೌಂಡ್‌ 5.0" + +#: ../src/pulse/channelmap.c:784 +msgid "Surround 5.1" +msgstr "ಸರೌಂಡ್‌ 5.1" + +#: ../src/pulse/channelmap.c:791 +msgid "Surround 7.1" +msgstr "ಸರೌಂಡ್‌ 7.1" + +#: ../src/pulse/error.c:43 +msgid "OK" +msgstr "ಸರಿ" + +#: ../src/pulse/error.c:44 +msgid "Access denied" +msgstr "ನಿಲುಕಣೆಯನ್ನು ತಿರಸ್ಕರಿಸಲಾಗಿದೆ" + +#: ../src/pulse/error.c:45 +msgid "Unknown command" +msgstr "ಅಜ್ಞಾತ ಆಜ್ಞೆ" + +#: ../src/pulse/error.c:46 +msgid "Invalid argument" +msgstr "ಅಮಾನ್ಯವಾದ ಆರ್ಗ್ಯುಮೆಂಟ್" + +#: ../src/pulse/error.c:47 +msgid "Entity exists" +msgstr "ನಮೂದು ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ" + +#: ../src/pulse/error.c:48 +msgid "No such entity" +msgstr "ಅಂತಹ ಯಾವುದೆ ನಮೂದು ಇಲ್ಲ" + +#: ../src/pulse/error.c:49 +msgid "Connection refused" +msgstr "ಸಂಪರ್ಕವನ್ನು ತಿರಸ್ಕರಿಸಲಾಗಿದೆ" + +#: ../src/pulse/error.c:50 +msgid "Protocol error" +msgstr "ಪ್ರೊಟೊಕಾಲ್ ದೋಷ" + +#: ../src/pulse/error.c:51 +msgid "Timeout" +msgstr "ಕಾಲಾವಕಾಶ ಮುಗಿದಿದೆ" + +#: ../src/pulse/error.c:52 +msgid "No authorization key" +msgstr "ಯಾವುದೆ ದೃಢೀಕರಣ ಕೀಲಿ ಇಲ್ಲ" + +#: ../src/pulse/error.c:53 +msgid "Internal error" +msgstr "ಆಂತರಿಕ ದೋಷ" + +#: ../src/pulse/error.c:54 +msgid "Connection terminated" +msgstr "ಸಂಪರ್ಕವನ್ನು ಅಂತ್ಯಗೊಳಿಸಲಾಗಿದೆ" + +#: ../src/pulse/error.c:55 +msgid "Entity killed" +msgstr "ನಮೂದನ್ನು ಕೊಲ್ಲಲಾಗಿದೆ" + +#: ../src/pulse/error.c:56 +msgid "Invalid server" +msgstr "ಅಮಾನ್ಯವಾದ ಪರಿಚಾರಕ" + +#: ../src/pulse/error.c:57 +msgid "Module initalization failed" +msgstr "ಘಟಕವನ್ನು ಆರಂಭಿಸುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ" + +#: ../src/pulse/error.c:58 +msgid "Bad state" +msgstr "ಸರಿಯಲ್ಲದ ಸ್ಥಿತಿ" + +#: ../src/pulse/error.c:59 +msgid "No data" +msgstr "ದತ್ತಾಂಶ ಇಲ್ಲ" + +#: ../src/pulse/error.c:60 +msgid "Incompatible protocol version" +msgstr "ಸಹವರ್ತನೀಯವಲ್ಲದ ಪ್ರೊಟೋಕಾಲ್ ಆವೃತ್ತಿ" + +#: ../src/pulse/error.c:61 +msgid "Too large" +msgstr "ಬಹಳ ದೊಡ್ಡದಾಗಿದೆ" + +#: ../src/pulse/error.c:62 +msgid "Not supported" +msgstr "ಬೆಂಬಲವಿಲ್ಲ" + +#: ../src/pulse/error.c:63 +msgid "Unknown error code" +msgstr "ಅಜ್ಞಾತ ದೋಷ ಸಂಜ್ಞೆ" + +#: ../src/pulse/error.c:64 +msgid "No such extension" +msgstr "ಅಂತಹ ಯಾವುದೆ ವಿಸ್ತರಣೆ ಇಲ್ಲ" + +#: ../src/pulse/error.c:65 +msgid "Obsolete functionality" +msgstr "ಪರಿಪೂರ್ಣ ಕ್ರಿಯಾಶೀಲತೆ" + +#: ../src/pulse/error.c:66 +msgid "Missing implementation" +msgstr "ಅನ್ವಯಿಸುವಿಕೆಯು ಕಾಣಿಸುತ್ತಿಲ್ಲ" + +#: ../src/pulse/error.c:67 +msgid "Client forked" +msgstr "ಕ್ಲೈಂಟ್ ಅನ್ನು ಫೋರ್ಕ್ ಮಾಡಲಾಗಿದೆ" + +#: ../src/pulse/error.c:68 +msgid "Input/Output error" +msgstr "ಇನ್‌ಪುಟ್/ಔಟ್‌ಪುಟ್ ದೋಷ" + +#: ../src/pulse/error.c:69 +msgid "Device or resource busy" +msgstr "ಸಾಧನ ಅಥವ ಸಂಪನ್ಮೂಲವು ಕಾರ್ಯನಿರತವಾಗಿದೆ" + +#: ../src/pulse/sample.c:172 +#, c-format +msgid "%s %uch %uHz" +msgstr "%s %uch %uHz" + +#: ../src/pulse/sample.c:184 +#, c-format +msgid "%0.1f GiB" +msgstr "%0.1f GiB" + +#: ../src/pulse/sample.c:186 +#, c-format +msgid "%0.1f MiB" +msgstr "%0.1f MiB" + +#: ../src/pulse/sample.c:188 +#, c-format +msgid "%0.1f KiB" +msgstr "%0.1f KiB" + +#: ../src/pulse/sample.c:190 +#, c-format +msgid "%u B" +msgstr "%u B" + +#: ../src/pulse/client-conf-x11.c:55 ../src/utils/pax11publish.c:100 +msgid "XOpenDisplay() failed" +msgstr "XOpenDisplay() ವಿಫಲಗೊಂಡಿದೆ" + +#: ../src/pulse/client-conf-x11.c:93 +msgid "Failed to parse cookie data" +msgstr "ಕುಕಿ ದತ್ತಾಂಶವನ್ನು ಪಾರ್ಸ್ ಮಾಡುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ" + +#: ../src/pulse/client-conf.c:111 +#, c-format +msgid "Failed to open configuration file '%s': %s" +msgstr "ಸಂರಚನಾ ಕಡತ '%s' ಅನ್ನು ಲೋಡ್ ಮಾಡುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ: %s" + +#: ../src/pulse/context.c:550 +msgid "No cookie loaded. Attempting to connect without." +msgstr "" +"ಯಾವುದೆ ಕುಕಿಯನ್ನು ಲೋಡ್ ಮಾಡಲಾಗಿಲ್ಲ. ಕುಕಿ ಇಲ್ಲದೆ ಸಂಪರ್ಕಸಾಧಿಸಲು ಪ್ರಯತ್ನಿಸಲಾಗುತ್ತಿದೆ." + +#: ../src/pulse/context.c:693 +#, c-format +msgid "fork(): %s" +msgstr "ಫೋರ್ಕ್(): %s" + +#: ../src/pulse/context.c:748 +#, c-format +msgid "waitpid(): %s" +msgstr "waitpid(): %s" + +#: ../src/pulse/context.c:1438 +#, c-format +msgid "Received message for unknown extension '%s'" +msgstr "ಅಜ್ಞಾತ ವಿಸ್ತರಣೆ '%s' ಇಂದ ಸಂದೇಶವನ್ನು ಪಡೆದುಕೊಳ್ಳಲಾಗಿದೆ" + +#: ../src/utils/pacat.c:108 +#, c-format +msgid "Failed to drain stream: %s" +msgstr "ಸ್ಟ್ರೀಮನ್ನು ಬರಿದಾಗಿಸುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ: %s" + +#: ../src/utils/pacat.c:113 +msgid "Playback stream drained." +msgstr "ಪ್ಲೇಬ್ಯಾಕ್ ಸ್ಟ್ರೀಮನ್ನು ಬರಿದಾಗಿಸಲಾಗಿದೆ." + +#: ../src/utils/pacat.c:123 +msgid "Draining connection to server." +msgstr "ಪರಿಚಾರಕಕ್ಕೆ ಬರಿದಾಗಿಸುವ ಸಂಪರ್ಕ." + +#: ../src/utils/pacat.c:136 +#, c-format +msgid "pa_stream_drain(): %s" +msgstr "pa_stream_drain(): %s" + +#: ../src/utils/pacat.c:159 +#, c-format +msgid "pa_stream_write() failed: %s" +msgstr "pa_stream_write() ವಿಫಲಗೊಂಡಿದೆ: %s" + +#: ../src/utils/pacat.c:197 +#, c-format +msgid "pa_stream_begin_write() failed: %s" +msgstr "pa_stream_begin_write() ವಿಫಲಗೊಂಡಿದೆ: %s" + +#: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267 +#, c-format +msgid "pa_stream_peek() failed: %s" +msgstr "pa_stream_peek() ವಿಫಲಗೊಂಡಿದೆ: %s" + +#: ../src/utils/pacat.c:307 +msgid "Stream successfully created." +msgstr "ಸ್ಟ್ರೀಮನ್ನು ಯಶಸ್ವಿಯಾಗಿ ನಿರ್ಮಿಸಲಾಗಿದೆ." + +#: ../src/utils/pacat.c:310 +#, c-format +msgid "pa_stream_get_buffer_attr() failed: %s" +msgstr "pa_stream_get_buffer_attr() ವಿಫಲಗೊಂಡಿದೆ: %s" + +#: ../src/utils/pacat.c:314 +#, c-format +msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u" +msgstr "ಬಫರ್ ಮೆಟ್ರಿಕ್‌ಗಳು: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u" + +#: ../src/utils/pacat.c:317 +#, c-format +msgid "Buffer metrics: maxlength=%u, fragsize=%u" +msgstr "ಬಫರ್ ಮೆಟ್ರಿಕ್‌ಗಳು: maxlength=%u, fragsize=%u" + +#: ../src/utils/pacat.c:321 +#, c-format +msgid "Using sample spec '%s', channel map '%s'." +msgstr "ನಮೂನೆಯ ವಿವರ '%s' ಅನ್ನು, ಚಾನಲ್‌ ನಕ್ಷೆ '%s' ಅನ್ನು ಬಳಸಿಕೊಂಡು." + +#: ../src/utils/pacat.c:325 +#, c-format +msgid "Connected to device %s (%u, %ssuspended)." +msgstr "ಸಾಧನ %s ಕ್ಕೆ ಸಂಪರ್ಕ ಜೋಡಿಸಲಾಗಿದೆ (%u, %ssuspended)." + +#: ../src/utils/pacat.c:335 +#, c-format +msgid "Stream error: %s" +msgstr "ಸ್ಟ್ರೀಮ್ ದೋಷ: %s" + +#: ../src/utils/pacat.c:345 +#, c-format +msgid "Stream device suspended.%s" +msgstr "ಸ್ಟ್ರೀಮ್ ಸಾಧನವನ್ನು ತಾತ್ಕಾಲಿಕವಾಗಿ ತಡೆಹಿಡಿಯಲಾಗಿದೆ.%s" + +#: ../src/utils/pacat.c:347 +#, c-format +msgid "Stream device resumed.%s" +msgstr "ಸ್ಟ್ರೀಮ್ ಸಾಧನವನ್ನು ಮರಳಿ ಆರಂಭಿಸಲಾಗಿದೆ.%s" + +#: ../src/utils/pacat.c:355 +#, c-format +msgid "Stream underrun.%s" +msgstr "ಸ್ಟ್ರೀಮ್ ಅನ್ನು ಕಡಿಮೆ ಚಲಾಯಿಸಲಾಗಿದೆ.%s" + +#: ../src/utils/pacat.c:362 +#, c-format +msgid "Stream overrun.%s" +msgstr "ಸ್ಟ್ರೀಮ್ ಅನ್ನು ಹೆಚ್ಚು ಚಲಾಯಿಸಲಾಗಿದೆ.%s" + +#: ../src/utils/pacat.c:369 +#, c-format +msgid "Stream started.%s" +msgstr "ಸ್ಟ್ರೀಮ್ ಅನ್ನು ಆರಂಭಿಸಲಾಗಿದೆ.%s " + +#: ../src/utils/pacat.c:376 +#, c-format +msgid "Stream moved to device %s (%u, %ssuspended).%s" +msgstr "ಸಾಧನ %s ಕ್ಕೆ ಸ್ಟ್ರೀಮ್‌ ಅನ್ನು ಸ್ಥಳಾಂತರಿಸಲಾಗಿದೆ (%u, %ssuspended).%s" + +#: ../src/utils/pacat.c:376 +msgid "not " +msgstr "ಇಲ್ಲ " + +#: ../src/utils/pacat.c:383 +#, c-format +msgid "Stream buffer attributes changed.%s" +msgstr "ಸ್ಟ್ರೀಮ್ ಬಫರ್ ಗುಣವಿಶೇಷತೆಗಳನ್ನು ಬದಲಾಯಿಸಲಾಗಿದೆ.%s" + +#: ../src/utils/pacat.c:415 +#, c-format +msgid "Connection established.%s" +msgstr "ಸಂಪರ್ಕವನ್ನು ಸಾಧಿಸಲಾಗಿದೆ.%s" + +#: ../src/utils/pacat.c:418 +#, c-format +msgid "pa_stream_new() failed: %s" +msgstr "pa_stream_new() ವಿಫಲಗೊಂಡಿದೆ: %s" + +#: ../src/utils/pacat.c:450 +#, c-format +msgid "pa_stream_connect_playback() failed: %s" +msgstr "pa_stream_connect_playback() ವಿಫಲಗೊಂಡಿದೆ: %s" + +#: ../src/utils/pacat.c:456 +#, c-format +msgid "pa_stream_connect_record() failed: %s" +msgstr "pa_stream_connect_record() ವಿಫಲಗೊಂಡಿದೆ: %s" + +#: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857 +#, c-format +msgid "Connection failure: %s" +msgstr "ಸಂಪರ್ಕದ ವಿಫಲತೆ: %s" + +#: ../src/utils/pacat.c:503 +msgid "Got EOF." +msgstr "EOF ಅನ್ನು ಪಡೆಯಲಾಗಿದೆ." + +#: ../src/utils/pacat.c:540 +#, c-format +msgid "write() failed: %s" +msgstr "write() ವಿಫಲಗೊಂಡಿದೆ: %s" + +#: ../src/utils/pacat.c:561 +msgid "Got signal, exiting." +msgstr "ಸಂಕೇತ ದೊರೆತಿದೆ, ನಿರ್ಗಮಿಸುತ್ತಿದೆ." + +#: ../src/utils/pacat.c:575 +#, c-format +msgid "Failed to get latency: %s" +msgstr "ಅಗೋಚರತೆಯನ್ನು ಪಡೆದುಕೊಳ್ಳುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ: %s" + +#: ../src/utils/pacat.c:580 +#, c-format +msgid "Time: %0.3f sec; Latency: %0.0f usec." +msgstr "ಸಮಯ: %0.3f sec; ಅಗೋಚರತೆ: %0.0f usec." + +#: ../src/utils/pacat.c:599 +#, c-format +msgid "pa_stream_update_timing_info() failed: %s" +msgstr "pa_stream_update_timing_info() ವಿಫಲಗೊಂಡಿದೆ: %s" + +#: ../src/utils/pacat.c:609 +#, c-format +msgid "" +"%s [options]\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -r, --record Create a connection for recording\n" +" -p, --playback Create a connection for playback\n" +"\n" +" -v, --verbose Enable verbose operations\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -d, --device=DEVICE The name of the sink/source to " +"connect to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" +" --stream-name=NAME How to call this stream on the " +"server\n" +" --volume=VOLUME Specify the initial (linear) volume " +"in range 0...65536\n" +" --rate=SAMPLERATE The sample rate in Hz (defaults to " +"44100)\n" +" --format=SAMPLEFORMAT The sample type, one of s16le, " +"s16be, u8, float32le,\n" +" float32be, ulaw, alaw, s32le, s32be, " +"s24le, s24be,\n" +" s24-32le, s24-32be (defaults to " +"s16ne)\n" +" --channels=CHANNELS The number of channels, 1 for mono, " +"2 for stereo\n" +" (defaults to 2)\n" +" --channel-map=CHANNELMAP Channel map to use instead of the " +"default\n" +" --fix-format Take the sample format from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-rate Take the sampling rate from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-channels Take the number of channels and the " +"channel map\n" +" from the sink the stream is being " +"connected to.\n" +" --no-remix Don't upmix or downmix channels.\n" +" --no-remap Map channels by index instead of " +"name.\n" +" --latency=BYTES Request the specified latency in " +"bytes.\n" +" --process-time=BYTES Request the specified process time " +"per request in bytes.\n" +" --property=PROPERTY=VALUE Set the specified property to the " +"specified value.\n" +" --raw Record/play raw PCM data.\n" +" --file-format=FFORMAT Record/play formatted PCM data.\n" +" --list-file-formats List available file formats.\n" +msgstr "" +"%s [ಆಯ್ಕೆಗಳು]\n" +"\n" +" -h, --help ಈ ನೆರವನ್ನು ತೋರಿಸು\n" +" --version ಆವೃತ್ತಿಯನ್ನು ತೋರಿಸು\n" +"\n" +" -r, --record ರೆಕಾರ್ಡಿಂಗಿಗಾಗಿ ಒಂದು ಸಂಪರ್ಕವನ್ನು ರಚಿಸು\n" +" -p, --playback ಪ್ಲೇಬ್ಯಾಕಿಗಾಗಿ ಒಂದು ಸಂಪರ್ಕವನ್ನು ರಚಿಸು\n" +"\n" +" -v, --verbose ವರ್ಬೋಸ್ ಕಾರ್ಯವನ್ನು ಶಕ್ತಗೊಳಿಸು\n" +"\n" +" -s, --server=SERVER ಸಂಪರ್ಕಸಾಧಿಸಬೇಕಿರುವ ಪರಿಚಾರಕದ ಹೆಸರು\n" +" -d, --device=DEVICE ಸಂಪರ್ಕಸಾಧಿಸಬೇಕಿರುವ ಸಿಂಕಿನ/ಆಕರದ ಹೆಸರು\n" +" -n, --client-name=NAME ಪರಿಚಾರಕದಲ್ಲಿ ಈ ಕ್ಲೈಂಟಿನಲ್ಲಿ ಏನೆಂದು " +"ಕರೆಯಬೇಕು\n" +" --stream-name=NAME ಪರಿಚಾರಕದಲ್ಲಿ ಈ ಸ್ಟ್ರೀಮ್ ಅನ್ನು ಏನೆಂದು " +"ಕರೆಯಬೇಕು\n" +" --volume=VOLUME ಆರಂಭಿಕ (ರೇಖೀಯ) ಪರಿಮಾಣವನ್ನು 0...65536 " +"ವ್ಯಾಪ್ತಿಯಲ್ಲಿ ತೋರಿಸು\n" +" --rate=SAMPLERATE ನಮೂನೆಯ ದರ Hz ನಲ್ಲಿ (ಪೂರ್ವನಿಯೊಜಿತವು " +"44100 ಆಗಿರುತ್ತದೆ)\n" +" --format=SAMPLEFORMAT ನಮೂನೆಯ ಬಗೆ, s16le, s16be, u8, " +"float32le ಗಳಲ್ಲಿ ಒಂದು,\n" +" float32be, ulaw, alaw, s32le, s32be " +"(ಪೂರ್ವನಿಯೋಜಿತವು s16ne ಆಗಿರುತ್ತದೆ)\n" +" --channels=CHANNELS ಚಾನಲ್‌ಗಳ ಸಂಖ್ಯೆ, ಮೋನೊಗಾಗಿ 1, " +"ಸ್ಟೀರಿಯೋಗಾಗಿ 2 ಆಗಿರುತ್ತದೆ\n" +" (ಪೂರ್ವನಿಯೊಜಿತವು 2 ಆಗಿರುತ್ತದೆ)\n" +" --channel-map=CHANNELMAP ಪೂರ್ವನಿಯೋಜಿತದ ಬದಲಿಗೆ ಬಳಸಬೇಕಿರುವ ಚಾನಲ್ " +"ನಕ್ಷೆ\n" +" --fix-format ಸ್ಟ್ರೀಮ್ ಸಂಪರ್ಕಿತಗೊಳ್ಳಲಿರುವ ಸಿಂಕಿನಿಂದ " +"ನಮೂನೆಯ\n" +" ರಚನೆಯನ್ನು ತೆಗೆದುಕೊ.\n" +" --fix-rate ಸ್ಟ್ರೀಮ್ ಸಂಪರ್ಕಿತಗೊಳ್ಳಲಿರುವ ಸಿಂಕಿನಿಂದ " +"ನಮೂನೆಯ\n" +" ದರವನ್ನು ತೆಗೆದುಕೊ.\n" +" --fix-channels ಸ್ಟ್ರೀಮ್ ಸಂಪರ್ಕಿತಗೊಳ್ಳಲಿರುವ ಸಿಂಕಿನಿಂದ " +"ಚಾನಲ್‌ಗಳ ಸಂಖ್ಯೆ\n" +" ಹಾಗು ಚಾನಲ್‌ನ ನಕ್ಷೆಯನ್ನು ತೆಗೆದುಕೊ.\n" +" --no-remix ಚಾನಲ್‌ಗಳನ್ನು upmix ಅಥವ downmix ಮಾಡಬೇಡ.\n" +" --no-remap ಚಾನಲ್‌ಗಳನ್ನು ಹೆಸರುಗಳ ಬದಲಿಗೆ ಸೂಚಿಯಿಂದ " +"ಮ್ಯಾಪ್ ಮಾಡು.\n" +" --latency=BYTES ಸೂಚಿಸಲಾದ ಅಗೋಚರತೆಯನ್ನು ಬೈಟ್‌ಗಳಲ್ಲಿ ಮನವಿ " +"ಮಾಡು.\n" +" --process-time=BYTES ಸೂಚಿಸಲಾದ ಪ್ರತಿ ಮನವಿಯ ಪ್ರಕ್ರಿಯೆಯ ಸಮಯವನ್ನು " +"ಬೈಟ್‌ಗಳಲ್ಲಿ ಮನವಿ ಮಾಡು.\n" +" --property=PROPERTY=VALUE ನಿಶ್ಚಿತ ಗುಣಲಕ್ಷಣವನ್ನು ನಿಶ್ಚಿತ ಮೌಲ್ಯವನ್ನು " +"ಹೊಂದಿಸಿ.\n" +" --raw ಕಚ್ಛಾ PCM ದತ್ತಾಂಶವನ್ನು ರೆಕಾರ್ಡು ಮಾಡು/" +"ಚಲಾಯಿಸು.\n" +" --file-format=FFORMAT ಫಾರ್ಮಾಟ್ ಮಾಡಲಾದ PCM ದತ್ತಾಂಶವನ್ನು ರೆಕಾರ್ಡು " +"ಮಾಡು/ಚಲಾಯಿಸು.\n" +" --list-file-formats ಲಭ್ಯವಿರುವ ಕಡತ ವಿನ್ಯಾಸಗಳ ಪಟ್ಟಿ.\n" + +#: ../src/utils/pacat.c:731 +#, c-format +msgid "" +"pacat %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pacat %s\n" +"libpulse %s ನೊಂದಿಗೆ ಕಂಪೈಲ್ ಮಾಡಲಾಗಿದೆ\n" +"libpulse %s ನೊಂದಿಗೆ ಜೋಡಿಸಲಾಗಿದೆ\n" + +#: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953 +#, c-format +msgid "Invalid client name '%s'" +msgstr "ಅಮಾನ್ಯವಾದ ಕ್ಲೈಂಟಿನ ಹೆಸರು '%s'" + +#: ../src/utils/pacat.c:779 +#, c-format +msgid "Invalid stream name '%s'" +msgstr "ಅಮಾನ್ಯವಾದ ಸ್ಟ್ರೀಮ್‌ನ ಹೆಸರು '%s'" + +#: ../src/utils/pacat.c:816 +#, c-format +msgid "Invalid channel map '%s'" +msgstr "ಅಮಾನ್ಯವಾದ ಚಾನಲ್ ನಕ್ಷೆ '%s'" + +#: ../src/utils/pacat.c:845 +#, c-format +msgid "Invalid latency specification '%s'" +msgstr "ಅಮಾನ್ಯವಾದ ಅಗೋಚರತೆ ವಿವರಣೆ '%s'" + +#: ../src/utils/pacat.c:852 +#, c-format +msgid "Invalid process time specification '%s'" +msgstr "ಅಮಾನ್ಯವಾದ ಪ್ರಕ್ರಿಯೆ ಸಮಯದ ವಿವರಣೆ '%s'" + +#: ../src/utils/pacat.c:864 +#, c-format +msgid "Invalid property '%s'" +msgstr "ಅಮಾನ್ಯವಾದ ಗುಣಲಕ್ಷಣ '%s'" + +#: ../src/utils/pacat.c:881 +#, c-format +msgid "Unknown file format %s." +msgstr "ಅಮಾನ್ಯವಾದ ಕಡತ ವಿನ್ಯಾಸ %s." + +#: ../src/utils/pacat.c:900 +msgid "Invalid sample specification" +msgstr "ಅಮಾನ್ಯವಾದ ನಮೂನೆ ವಿವರ" + +#: ../src/utils/pacat.c:910 +#, c-format +msgid "open(): %s" +msgstr "open(): %s" + +#: ../src/utils/pacat.c:915 +#, c-format +msgid "dup2(): %s" +msgstr "dup2(): %s" + +#: ../src/utils/pacat.c:922 +msgid "Too many arguments." +msgstr "ಬಹಳಷ್ಟು ಆರ್ಗುಮೆಂಟ್‌ಗಳು." + +#: ../src/utils/pacat.c:933 +msgid "Failed to generate sample specification for file." +msgstr "ನಮೂನೆಯ ಮಾಹಿತಿಯನ್ನು ಪಡೆದುಕೊಳ್ಳುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ." + +#: ../src/utils/pacat.c:953 +msgid "Failed to open audio file." +msgstr "ಧ್ವನಿ ಕಡತವನ್ನು ತೆರೆಯುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ." + +#: ../src/utils/pacat.c:959 +msgid "" +"Warning: specified sample specification will be overwritten with " +"specification from file." +msgstr "" +"ಎಚ್ಚರಿಕೆ: ಸೂಚಿಸಲಾದ ನಮೂನೆ ವಿವರಣೆಯನ್ನು ಕಡತದಲ್ಲಿನ ವಿವರಣೆಯಿಂದ ತಿದ್ದಿಬರೆಯಲಾಗುತ್ತದೆ." + +#: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997 +msgid "Failed to determine sample specification from file." +msgstr "ಕಡತದಿಂದ ನಮೂನೆಯ ವಿವರಣೆಯನ್ನು ನಿರ್ಧರಿಸುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ." + +#: ../src/utils/pacat.c:971 +msgid "Warning: Failed to determine channel map from file." +msgstr "ಎಚ್ಚರಿಕೆ: ಕಡತದಿಂದ ಚಾನಲ್ ನಕ್ಷೆಯನ್ನು ನಿರ್ಧರಿಸುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ." + +#: ../src/utils/pacat.c:982 +msgid "Channel map doesn't match sample specification" +msgstr "ಚಾನಲ್ ನಕ್ಷೆಯು ನಮೂನೆಯ ವಿವರಣೆಯೊಂದಿಗೆ ತಾಳೆಯಾಗುತ್ತಿಲ್ಲ" + +#: ../src/utils/pacat.c:993 +msgid "Warning: failed to write channel map to file." +msgstr "ಎಚ್ಚರಿಕೆ: ಕಡತಕ್ಕೆ ಚಾನಲ್ ನಕ್ಷೆಯನ್ನು ಬರೆಯುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ." + +#: ../src/utils/pacat.c:1008 +#, c-format +msgid "" +"Opening a %s stream with sample specification '%s' and channel map '%s'." +msgstr "" +"ಒಂದು %s ಸ್ಟ್ರೀಮ್‌ ಅನ್ನು ನಮೂನೆ ವಿವರಣೆ '%s' ಯೊಂದಿಗೆ ಹಾಗು ಚಾನಲ್ ನಕ್ಷೆ '%s' ಯೊಂದಿಗೆ " +"ತೆರೆಯಲಾಗುತ್ತಿದೆ." + +#: ../src/utils/pacat.c:1009 +msgid "recording" +msgstr "ರೆಕಾರ್ಡಿಂಗ್" + +#: ../src/utils/pacat.c:1009 +msgid "playback" +msgstr "ಪ್ಲೇಬ್ಯಾಕ್‌" + +#: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267 +msgid "pa_mainloop_new() failed." +msgstr "pa_mainloop_new() ವಿಫಲಗೊಂಡಿದೆ." + +#: ../src/utils/pacat.c:1054 +msgid "io_new() failed." +msgstr "io_new() ವಿಫಲಗೊಂಡಿದೆ." + +#: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279 +msgid "pa_context_new() failed." +msgstr "pa_context_new() ವಿಫಲಗೊಂಡಿದೆ." + +#: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285 +#, c-format +msgid "pa_context_connect() failed: %s" +msgstr "pa_context_connect() ವಿಫಲಗೊಂಡಿದೆ: %s" + +#: ../src/utils/pacat.c:1075 +msgid "pa_context_rttime_new() failed." +msgstr "pa_context_rttime_new() ವಿಫಲಗೊಂಡಿದೆ." + +#: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290 +msgid "pa_mainloop_run() failed." +msgstr "pa_mainloop_run() ವಿಫಲಗೊಂಡಿದೆ." + +#: ../src/utils/pasuspender.c:81 +#, c-format +msgid "fork(): %s\n" +msgstr "ಫೋರ್ಕ್(): %s\n" + +#: ../src/utils/pasuspender.c:92 +#, c-format +msgid "execvp(): %s\n" +msgstr "execvp(): %s\n" + +#: ../src/utils/pasuspender.c:109 +#, c-format +msgid "Failure to suspend: %s\n" +msgstr "ಸ್ಥಗಿತಗೊಳಿಸಲು ವಿಫಲಗೊಂಡಿದೆ: %s\n" + +#: ../src/utils/pasuspender.c:124 +#, c-format +msgid "Failure to resume: %s\n" +msgstr "ಮರಳಿ ಆರಂಭಿಸಲು ವಿಫಲಗೊಂಡಿದೆ: %s\n" + +#: ../src/utils/pasuspender.c:147 +#, c-format +msgid "WARNING: Sound server is not local, not suspending.\n" +msgstr "ಎಚ್ಚರಿಕೆ: ಧ್ವನಿ ಪರಿಚಾರಕವು ಸ್ಥಳೀಯವಾಗಿಲ್ಲ, ತಾತ್ಕಾಲಿಕವಾಗಿ ತಡೆಹಿಡಿಯಲಾಗುತ್ತಿಲ್ಲ.\n" + +#: ../src/utils/pasuspender.c:159 +#, c-format +msgid "Connection failure: %s\n" +msgstr "ಸಂಪರ್ಕದ ವಿಫಲತೆ: %s\n" + +#: ../src/utils/pasuspender.c:176 +#, c-format +msgid "Got SIGINT, exiting.\n" +msgstr "SIGINT ದೊರೆತಿದೆ, ನಿರ್ಗಮಿಸುತ್ತಿದೆ.\n" + +#: ../src/utils/pasuspender.c:194 +#, c-format +msgid "WARNING: Child process terminated by signal %u\n" +msgstr "ಎಚ್ಚರಿಕೆ: ಉಪ ಪ್ರಕ್ರಿಯೆಯು %u ಸಂಕೇತದೊಂದಿಗೆ ಅಂತ್ಯಗೊಂಡಿದೆ\n" + +#: ../src/utils/pasuspender.c:212 +#, c-format +msgid "" +"%s [options] ... \n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +"\n" +msgstr "" +"%s [ಆಯ್ಕೆಗಳು] ... \n" +"\n" +" -h, --help ಈ ನೆರವನ್ನು ತೋರಿಸು\n" +" --version ಆವೃತ್ತಿಯನ್ನು ತೋರಿಸು\n" +" -s, --server=SERVER ಸಂಪರ್ಕಸಾಧಿಸಬೇಕಿರುವ ಪರಿಚಾರಕದ ಹೆಸರು\n" +"\n" + +#: ../src/utils/pasuspender.c:248 +#, c-format +msgid "" +"pasuspender %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pasuspender %s\n" +"libpulse %s ನೊಂದಿಗೆ ಕಂಪೈಲ್ ಮಾಡಲಾಗಿದೆ\n" +"libpulse %s ನೊಂದಿಗೆ ಜೋಡಿಸಲಾಗಿದೆ\n" + +#: ../src/utils/pasuspender.c:277 +#, c-format +msgid "pa_mainloop_new() failed.\n" +msgstr "pa_mainloop_new() ವಿಫಲಗೊಂಡಿದೆ.\n" + +#: ../src/utils/pasuspender.c:290 +#, c-format +msgid "pa_context_new() failed.\n" +msgstr "pa_context_new() ವಿಫಲಗೊಂಡಿದೆ.\n" + +#: ../src/utils/pasuspender.c:298 +#, c-format +msgid "pa_mainloop_run() failed.\n" +msgstr "pa_mainloop_run() ವಿಫಲಗೊಂಡಿದೆ.\n" + +#: ../src/utils/pactl.c:135 +#, c-format +msgid "Failed to get statistics: %s" +msgstr "ಅಂಕಿಅಂಶಗಳನ್ನು ಪಡೆದುಕೊಳ್ಳುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ: %s" + +#: ../src/utils/pactl.c:141 +#, c-format +msgid "Currently in use: %u blocks containing %s bytes total.\n" +msgstr "ಪ್ರಸಕ್ತ ಬಳಕೆಯಲ್ಲಿರುವುದು: %u ಖಂಡಗಳು ಒಟ್ಟು %s ಬೈಟ್‌ಗಳನ್ನು ಹೊಂದಿದೆ.\n" + +#: ../src/utils/pactl.c:144 +#, c-format +msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n" +msgstr "" +"ಸಂಪೂರ್ಣ ಜೀವಿತಾವಧಿಯ ಸಮಯದಲ್ಲಿ ನಿಯೋಜಿಸಲಾಗಿದ್ದು: %u ಖಂಡಗಳು ಒಟ್ಟು %s ಬೈಟ್‌ಗಳನ್ನು " +"ಹೊಂದಿದೆ.\n" + +#: ../src/utils/pactl.c:147 +#, c-format +msgid "Sample cache size: %s\n" +msgstr "ನಮೂನೆಯ ಕ್ಯಾಶೆ ಗಾತ್ರ: %s\n" + +#: ../src/utils/pactl.c:156 +#, c-format +msgid "Failed to get server information: %s" +msgstr "ಪರಿಚಾರಕದ ಮಾಹಿತಿಯನ್ನು ಪಡೆದುಕೊಳ್ಳುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ: %s" + +#: ../src/utils/pactl.c:164 +#, c-format +msgid "" +"User name: %s\n" +"Host Name: %s\n" +"Server Name: %s\n" +"Server Version: %s\n" +"Default Sample Specification: %s\n" +"Default Channel Map: %s\n" +"Default Sink: %s\n" +"Default Source: %s\n" +"Cookie: %08x\n" +msgstr "" +"ಬಳಕೆದಾರ ಹೆಸರು: %s\n" +"ಅತಿಥೇಯದ ಹೆಸರು: %s\n" +"ಪರಿಚಾರಕದ ಹೆಸರು: %s\n" +"ಪರಿಚಾರಕ ಆವೃತ್ತಿ: %s\n" +"ಪೂರ್ವನಿಯೋಜಿತ ನಮೂನೆ ವಿವರಣೆ: %s\n" +"ಪೂರ್ವನಿಯೋಜಿತ ಚಾನಲ್‌ ನಕ್ಷೆ: %s\n" +"ಪೂರ್ವನಿಯೋಜಿತ ಸಿಂಕ್: %s\n" +"ಪೂರ್ವನಿಯೋಜಿತ ಆಕರ: %s\n" +"ಕುಕಿ: %08x\n" + +#: ../src/utils/pactl.c:205 +#, c-format +msgid "Failed to get sink information: %s" +msgstr "ಸಿಂಕ್‌ ಮಾಹಿತಿಯನ್ನು ಪಡೆದುಕೊಳ್ಳುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ: %s" + +#: ../src/utils/pactl.c:221 +#, c-format +msgid "" +"Sink #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor Source: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"ಸಿಂಕ್ #%u\n" +"\tಸ್ಥಿತಿ: %s\n" +"\tಹೆಸರು: %s\n" +"\tವಿವರಣೆ: %s\n" +"\tಚಾಲಕ: %s\n" +"\tನಮೂನೆ ವಿವರಣೆ: %s\n" +"\tಚಾನಲ್‌ ನಕ್ಷೆ: %s\n" +"\tಮಾಲಿಕ ಘಟಕ: %u\n" +"\tಮೂಕ: %s\n" +"\tಧ್ವನಿ ಪ್ರಮಾಣ: %s%s%s\n" +"\t ಸಮತೋಲನ %0.2f\n" +"\tಮೂಲ ಧ್ವನಿ ಪ್ರಮಾಣ: %s%s%s\n" +"\tಮೇಲ್ವಿಚಾರಕ ಆಕರ: %s\n" +"\tಅಗೋಚರತೆ: %0.0f usec, ಸಂರಚಿತ %0.0f usec\n" +"\tಗುರುತುಗಳು: %s%s%s%s%s%s\n" +"\tಗುಣಗಳು:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360 +#, c-format +msgid "\tPorts:\n" +msgstr "\tಸಂಪರ್ಕಸ್ಥಾನಗಳು:\n" + +#: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366 +#, c-format +msgid "\tActive Port: %s\n" +msgstr "\tಸಕ್ರಿಯ ಸಂಪರ್ಕಸ್ಥಾನ: %s\n" + +#: ../src/utils/pactl.c:297 +#, c-format +msgid "Failed to get source information: %s" +msgstr "ಆಕರದ ಮಾಹಿತಿಯನ್ನು ಪಡೆದುಕೊಳ್ಳುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ: %s" + +#: ../src/utils/pactl.c:313 +#, c-format +msgid "" +"Source #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor of Sink: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"ಆಕರ #%u\n" +"\tಸ್ಥಿತಿ: %s\n" +"\tಹೆಸರು: %s\n" +"\tವಿವರಣೆ: %s\n" +"\tಚಾಲಕ: %s\n" +"\tನಮೂನೆ ವಿವರಣೆ: %s\n" +"\tಚಾನಲ್‌ ನಕ್ಷೆ: %s\n" +"\tಮಾಲಿಕ ಘಟಕ: %u\n" +"\tಮೂಕ: %s\n" +"\tಧ್ವನಿ ಪ್ರಮಾಣ: %s%s%s\n" +"\t ಸಮತೋಲನ %0.2f\n" +"\tಮೂಲ ಧ್ವನಿ ಪ್ರಮಾಣ: %s%s%s\n" +"\tಸಿಂಕ್‌ನ ಮೇಲ್ವಿಚಾರಣೆ: %s\n" +"\tಅಗೋಚರತೆ: %0.0f usec, ಸಂರಚಿತ %0.0f usec\n" +"\tಗುರುತುಗಳು: %s%s%s%s%s%s\n" +"\tಗುಣಗಳು:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:345 ../src/utils/pactl.c:401 ../src/utils/pactl.c:436 +#: ../src/utils/pactl.c:473 ../src/utils/pactl.c:532 ../src/utils/pactl.c:533 +#: ../src/utils/pactl.c:543 ../src/utils/pactl.c:587 ../src/utils/pactl.c:588 +#: ../src/utils/pactl.c:594 ../src/utils/pactl.c:637 ../src/utils/pactl.c:638 +#: ../src/utils/pactl.c:645 +msgid "n/a" +msgstr "ಅನ್ವಯಿಸುವುದಿಲ್ಲ" + +#: ../src/utils/pactl.c:375 +#, c-format +msgid "Failed to get module information: %s" +msgstr "ಘಟಕದ ಮಾಹಿತಿಯನ್ನು ಪಡೆದುಕೊಳ್ಳುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ: %s" + +#: ../src/utils/pactl.c:393 +#, c-format +msgid "" +"Module #%u\n" +"\tName: %s\n" +"\tArgument: %s\n" +"\tUsage counter: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"ಘಟಕ #%u\n" +"\tಹೆಸರು: %s\n" +"\tಆರ್ಗುಮೆಂಟ್‌: %s\n" +"\tಬಳಕೆಯ ಲೆಕ್ಕಿಗ: %s\n" +"\tಗುಣಗಳು:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:412 +#, c-format +msgid "Failed to get client information: %s" +msgstr "ಕ್ಲೈಂಟಿನ ಮಾಹಿತಿಯನ್ನು ಪಡೆದುಕೊಳ್ಳುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ: %s" + +#: ../src/utils/pactl.c:430 +#, c-format +msgid "" +"Client #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"ಕ್ಲೈಂಟ್‌ #%u\n" +"\tಚಾಲಕ: %s\n" +"\tಮಾಲಿಕ ಘಟಕ: %s\n" +"\tಗುಣಗಳು:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:447 +#, c-format +msgid "Failed to get card information: %s" +msgstr "ಕಾರ್ಡಿನ ಮಾಹಿತಿಯನ್ನು ಪಡೆದುಕೊಳ್ಳುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ: %s" + +#: ../src/utils/pactl.c:465 +#, c-format +msgid "" +"Card #%u\n" +"\tName: %s\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"ಕಾರ್ಡ್ #%u\n" +"\tಹೆಸರು: %s\n" +"\tಚಾಲಕ: %s\n" +"\tಮಾಲಿಕ ಘಟಕ: %s\n" +"\tಗುಣಗಳು:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:479 +#, c-format +msgid "\tProfiles:\n" +msgstr "\tಪ್ರೊಫೈಲುಗಳು:\n" + +#: ../src/utils/pactl.c:485 +#, c-format +msgid "\tActive Profile: %s\n" +msgstr "\tಸಕ್ರಿಯ ಪ್ರೊಫೈಲುಗಳು: %s\n" + +#: ../src/utils/pactl.c:496 +#, c-format +msgid "Failed to get sink input information: %s" +msgstr "ಸಿಂಕ್‌ ಇನ್‌ಪುಟ್ ಮಾಹಿತಿಯನ್ನು ಪಡೆದುಕೊಳ್ಳುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ: %s" + +#: ../src/utils/pactl.c:515 +#, c-format +msgid "" +"Sink Input #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSink: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tMute: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSink Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"ಸಿಂಕ್ ಇನ್‌ಪುಟ್‌ #%u\n" +"\tಚಾಲಕ: %s\n" +"\tಮಾಲಿಕ ಘಟಕ: %s\n" +"\tಕ್ಲೈಂಟ್‌: %s\n" +"\tಸಿಂಕ್: %u\n" +"\tನಮೂನೆ ವಿವರಣೆ: %s\n" +"\tಚಾನಲ್‌ ನಕ್ಷೆ: %s\n" +"\tಮೂಕ: %s\n" +"\tಧ್ವನಿ ಪ್ರಮಾಣ: %s\n" +"\t %s\n" +"\t ಸಮತೋಲನ %0.2f\n" +"\tಬಫರಿನ ಅಗೋಚರತೆ: %0.0f usec\n" +"\tಸಿಂಕ್‌ನ ಅಗೋಚರತೆ: %0.0f usec\n" +"\tಮರುನಮೂನೆ ವಿಧಾನ: %s\n" +"\tಗುಣಗಳು:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:554 +#, c-format +msgid "Failed to get source output information: %s" +msgstr "ಆಕರದ ಔಟ್‌ಪುಟ್ ಮಾಹಿತಿಯನ್ನು ಪಡೆದುಕೊಳ್ಳುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ: %s" + +#: ../src/utils/pactl.c:574 +#, c-format +msgid "" +"Source Output #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSource: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSource Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"ಆಕರ ಔಟ್‌ಪುಟ್‌ #%u\n" +"\tಚಾಲಕ: %s\n" +"\tಮಾಲಿಕ ಘಟಕ: %s\n" +"\tಕ್ಲೈಂಟ್‌: %s\n" +"\tಆಕರ: %u\n" +"\tನಮೂನೆ ವಿವರಣೆ: %s\n" +"\tಚಾನಲ್‌ ನಕ್ಷೆ: %s\n" +"\tಬಫರಿನ ಅಗೋಚರತೆ: %0.0f usec\n" +"\tಆಕರದ ಅಗೋಚರತೆ: %0.0f usec\n" +"\tಮರುನಮೂನೆ ವಿಧಾನ: %s\n" +"\tಗುಣಗಳು:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:605 +#, c-format +msgid "Failed to get sample information: %s" +msgstr "ನಮೂನೆಯ ಮಾಹಿತಿಯನ್ನು ಪಡೆದುಕೊಳ್ಳುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ: %s" + +#: ../src/utils/pactl.c:623 +#, c-format +msgid "" +"Sample #%u\n" +"\tName: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tDuration: %0.1fs\n" +"\tSize: %s\n" +"\tLazy: %s\n" +"\tFilename: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"ನಮೂನೆ #%u\n" +"\tಹೆಸರು: %s\n" +"\tನಮೂನೆ ವಿವರಣೆ: %s\n" +"\tಚಾನಲ್‌ ನಕ್ಷೆ: %s\n" +"\tಧ್ವನಿ ಪ್ರಮಾಣ: %s\n" +"\t %s\n" +"\t ಸಮತೋಲನ %0.2f\n" +"\tಕಾಲಾವಧಿ: %0.1fs\n" +"\tಗಾತ್ರ: %s\n" +"\tಜಡ: %s\n" +"\tಕಡತಹೆಸರು: %s\n" +"\tಗುಣಗಳು:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663 +#, c-format +msgid "Failure: %s" +msgstr "ವಿಫಲತೆ: %s" + +#: ../src/utils/pactl.c:687 +#, c-format +msgid "Failed to upload sample: %s" +msgstr "ನಮೂನೆಯನ್ನು ಅಪ್‌ಲೋಡ್ ಮಾಡುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ: %s" + +#: ../src/utils/pactl.c:704 +msgid "Premature end of file" +msgstr "ಕಡತದ ಅಪ್ರಾಪ್ತ ಸಮಯದಲ್ಲಿ ಅಂತ್ಯ" + +#: ../src/utils/pactl.c:863 +msgid "Got SIGINT, exiting." +msgstr "SIGINT ದೊರೆತಿದೆ, ನಿರ್ಗಮಿಸುತ್ತಿದೆ." + +#: ../src/utils/pactl.c:869 +#, c-format +msgid "" +"%s [options] stat\n" +"%s [options] list\n" +"%s [options] exit\n" +"%s [options] upload-sample FILENAME [NAME]\n" +"%s [options] play-sample NAME [SINK]\n" +"%s [options] remove-sample NAME\n" +"%s [options] move-sink-input SINKINPUT SINK\n" +"%s [options] move-source-output SOURCEOUTPUT SOURCE\n" +"%s [options] load-module NAME [ARGS ...]\n" +"%s [options] unload-module MODULE\n" +"%s [options] suspend-sink SINK 1|0\n" +"%s [options] suspend-source SOURCE 1|0\n" +"%s [options] set-card-profile CARD PROFILE\n" +"%s [options] set-sink-port SINK PORT\n" +"%s [options] set-source-port SOURCE PORT\n" +"%s [options] set-sink-volume SINK VOLUME\n" +"%s [options] set-source-volume SOURCE VOLUME\n" +"%s [options] set-sink-input-volume SINKINPUT VOLUME\n" +"%s [options] set-sink-mute SINK 1|0\n" +"%s [options] set-source-mute SOURCE 1|0\n" +"%s [options] set-sink-input-mute SINKINPUT 1|0\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" +msgstr "" +"%s [ಆಯ್ಕೆಗಳು] stat\n" +"%s [ಆಯ್ಕೆಗಳು] list\n" +"%s [ಆಯ್ಕೆಗಳು] exit\n" +"%s [ಆಯ್ಕೆಗಳು] upload-sample FILENAME [NAME]\n" +"%s [ಆಯ್ಕೆಗಳು] play-sample NAME [SINK]\n" +"%s [ಆಯ್ಕೆಗಳು] remove-sample NAME\n" +"%s [ಆಯ್ಕೆಗಳು] move-sink-input SINKINPUT SINK\n" +"%s [ಆಯ್ಕೆಗಳು] move-source-output SOURCEOUTPUT SOURCE\n" +"%s [ಆಯ್ಕೆಗಳು] load-module NAME [ARGS ...]\n" +"%s [ಆಯ್ಕೆಗಳು] unload-module MODULE\n" +"%s [ಆಯ್ಕೆಗಳು] suspend-sink SINK 1|0\n" +"%s [ಆಯ್ಕೆಗಳು] suspend-source SOURCE 1|0\n" +"%s [ಆಯ್ಕೆಗಳು] set-card-profile CARD PROFILE\n" +"%s [ಆಯ್ಕೆಗಳು] set-sink-port SINK PORT\n" +"%s [ಆಯ್ಕೆಗಳು] set-source-port SOURCE PORT\n" +"%s [ಆಯ್ಕೆಗಳು] set-sink-volume SINK VOLUME\n" +"%s [ಆಯ್ಕೆಗಳು] set-source-volume SOURCE VOLUME\n" +"%s [ಆಯ್ಕೆಗಳು] set-sink-input-volume SINKINPUT VOLUME\n" +"%s [ಆಯ್ಕೆಗಳು] set-sink-mute SINK 1|0\n" +"%s [ಆಯ್ಕೆಗಳು] set-source-mute SOURCE 1|0\n" +"%s [ಆಯ್ಕೆಗಳು] set-sink-input-mute SINKINPUT 1|0\n" +"\n" +" -h, --help ಈ ನೆರವನ್ನು ತೋರಿಸು\n" +" --version ಆವೃತ್ತಿಯನ್ನು ತೋರಿಸು\n" +"\n" +" -s, --server=SERVER ಸಂಪರ್ಕಸಾಧಿಸಬೇಕಿರುವ ಪರಿಚಾರಕದ ಹೆಸರು\n" +" -n, --client-name=NAME ಪರಿಚಾರಕದಲ್ಲಿ ಈ ಕ್ಲೈಂಟಿನಲ್ಲಿ ಏನೆಂದು " +"ಕರೆಯಬೇಕು\n" + +#: ../src/utils/pactl.c:933 +#, c-format +msgid "" +"pactl %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pactl %s\n" +"libpulse %s ನೊಂದಿಗೆ ಕಂಪೈಲ್ ಮಾಡಲಾಗಿದೆ\n" +"libpulse %s ನೊಂದಿಗೆ ಜೋಡಿಸಲಾಗಿದೆ\n" + +#: ../src/utils/pactl.c:979 +msgid "Please specify a sample file to load" +msgstr "ಲೋಡ್ ಮಾಡಬೇಕಿರುವ ಒಂದು ಕಡತದ ನಮೂನೆಯನ್ನು ಸೂಚಿಸಿ" + +#: ../src/utils/pactl.c:992 +msgid "Failed to open sound file." +msgstr "ಧ್ವನಿ ಕಡತವನ್ನು ತೆರೆಯುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ." + +#: ../src/utils/pactl.c:1004 +msgid "Warning: Failed to determine sample specification from file." +msgstr "ಎಚ್ಚರಿಕೆ: ಕಡತದಿಂದ ನಮೂನೆಯ ವಿವರವನ್ನು ನಿರ್ಧರಿಸುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ." + +#: ../src/utils/pactl.c:1014 +msgid "You have to specify a sample name to play" +msgstr "ಚಲಾಯಿಸಲು ನೀವು ಒಂದು ನಮೂನೆಯ ಹೆಸರನ್ನು ಸೂಚಿಸಬೇಕಾಗುತ್ತದೆ" + +#: ../src/utils/pactl.c:1026 +msgid "You have to specify a sample name to remove" +msgstr "ತೆಗೆದು ಹಾಕಲು ನೀವು ಒಂದು ನಮೂನೆಯ ಹೆಸರನ್ನು ಸೂಚಿಸಬೇಕು" + +#: ../src/utils/pactl.c:1035 +msgid "You have to specify a sink input index and a sink" +msgstr "ನೀವು ಒಂದು ಸಿಂಕ್ ಇನ್‌ಪುಟ್ ಸೂಚಿಯನ್ನು ಹಾಗು ಒಂದು ಸಿಂಕ್‌ ಅನ್ನು ಸೂಚಿಸಬೇಕು." + +#: ../src/utils/pactl.c:1045 +msgid "You have to specify a source output index and a source" +msgstr "ನೀವು ಒಂದು ಆಕರ ಔಟ್‌ಪುಟ್ ಸೂಚಿಯನ್ನು ಹಾಗು ಒಂದು ಆಕರವನ್ನು ಸೂಚಿಸಬೇಕು." + +#: ../src/utils/pactl.c:1060 +msgid "You have to specify a module name and arguments." +msgstr "ನೀವು ಒಂದು ಘಟಕದ ಹೆಸರನ್ನು ಹಾಗು ಆರ್ಗುಮೆಂಟುಗಳನ್ನು ಸೂಚಿಸಬೇಕು." + +#: ../src/utils/pactl.c:1080 +msgid "You have to specify a module index" +msgstr "ನೀವು ಒಂದು ಘಟಕ ಸೂಚಿಯನ್ನು ಸೂಚಿಸಬೇಕು" + +#: ../src/utils/pactl.c:1090 +msgid "" +"You may not specify more than one sink. You have to specify a boolean value." +msgstr "" +"ನೀವು ಒಂದಕ್ಕಿಂತ ಹೆಚ್ಚಿನ ಸಿಂಕನ್ನು ಸೂಚಿಸಲಾಗುವುದಿಲ್ಲ. ನೀವು ಒಂದು ಬೂಲಿಯನ್‌ ಮೌಲ್ಯವನ್ನು " +"ಸೂಚಿಸಬೇಕಾಗುತ್ತದೆ." + +#: ../src/utils/pactl.c:1103 +msgid "" +"You may not specify more than one source. You have to specify a boolean " +"value." +msgstr "" +"ನೀವು ಒಂದಕ್ಕಿಂತ ಹೆಚ್ಚಿನ ಆಕರವನ್ನು ಸೂಚಿಸಲಾಗುವುದಿಲ್ಲ. ನೀವು ಒಂದು ಬೂಲಿಯನ್‌ ಮೌಲ್ಯವನ್ನು " +"ಸೂಚಿಸಬೇಕಾಗುತ್ತದೆ." + +#: ../src/utils/pactl.c:1115 +msgid "You have to specify a card name/index and a profile name" +msgstr "ಒಂದು ಕಾರ್ಡಿನ ಹೆಸರು/ಸೂಚಿಯನ್ನು ಹಾಗು ಪ್ರೊಫೈಲ್‌ ಹೆಸರನ್ನು ಸೂಚಿಸಬೇಕು" + +#: ../src/utils/pactl.c:1126 +msgid "You have to specify a sink name/index and a port name" +msgstr "ನೀವು ಒಂದು ಸಿಂಕಿನ ಹೆಸರು/ಸೂಚಿಯನ್ನು ಹಾಗು ಸಂಪರ್ಕಸ್ಥಾನದ ಹೆಸರನ್ನು ಸೂಚಿಸಬೇಕು" + +#: ../src/utils/pactl.c:1137 +msgid "You have to specify a source name/index and a port name" +msgstr "ನೀವು ಒಂದು ಆಕರದ ಹೆಸರು/ಸೂಚಿಯನ್ನು ಹಾಗು ಸಂಪರ್ಕಸ್ಥಾನದ ಹೆಸರನ್ನು ಸೂಚಿಸಬೇಕು" + +#: ../src/utils/pactl.c:1149 +msgid "You have to specify a sink name/index and a volume" +msgstr "ನೀವು ಒಂದು ಸಿಂಕಿನ ಹೆಸರು/ಸೂಚಿಯನ್ನು ಹಾಗು ಸಂಪರ್ಕಸ್ಥಾನದ ಹೆಸರನ್ನು ಸೂಚಿಸಬೇಕು" + +#: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171 +#: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209 +#: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248 +msgid "Invalid volume specification" +msgstr "ಅಮಾನ್ಯವಾದ ಧ್ವನಿ ಪ್ರಮಾಣದ ವಿವರ" + +#: ../src/utils/pactl.c:1166 +msgid "You have to specify a source name/index and a volume" +msgstr "ನೀವು ಒಂದು ಆಕರದ ಹೆಸರು/ಸೂಚಿಯನ್ನು ಹಾಗು ಸಂಪರ್ಕಸ್ಥಾನದ ಹೆಸರನ್ನು ಸೂಚಿಸಬೇಕು" + +#: ../src/utils/pactl.c:1183 +msgid "You have to specify a sink input index and a volume" +msgstr "ನೀವು ಒಂದು ಸಿಂಕ್ ಇನ್‌ಪುಟ್ ಸೂಚಿಯನ್ನು ಹಾಗು ಒಂದು ಸಿಂಕ್‌ ಅನ್ನು ಸೂಚಿಸಬೇಕು" + +#: ../src/utils/pactl.c:1188 +msgid "Invalid sink input index" +msgstr "ಅಮಾನ್ಯವಾದ ಸಿಂಕ್ ಇನ್‌ಪುಟ್ ಸೂಚಿ" + +#: ../src/utils/pactl.c:1204 +msgid "You have to specify a sink name/index and a mute boolean" +msgstr "ನೀವು ಒಂದು ಸಿಂಕಿನ ಹೆಸರು/ಸೂಚಿಯನ್ನು ಹಾಗು ಸಂಪರ್ಕಸ್ಥಾನದ ಹೆಸರನ್ನು ಸೂಚಿಸಬೇಕು" + +#: ../src/utils/pactl.c:1221 +msgid "You have to specify a source name/index and a mute boolean" +msgstr "ನೀವು ಒಂದು ಆಕರದ ಹೆಸರು/ಸೂಚಿಯನ್ನು ಹಾಗು ಸಂಪರ್ಕಸ್ಥಾನದ ಹೆಸರನ್ನು ಸೂಚಿಸಬೇಕು" + +#: ../src/utils/pactl.c:1238 +msgid "You have to specify a sink input index and a mute boolean" +msgstr "ನೀವು ಒಂದು ಸಿಂಕ್ ಇನ್‌ಪುಟ್ ಸೂಚಿಯನ್ನು ಹಾಗು ಒಂದು ಸಿಂಕ್‌ ಅನ್ನು ಸೂಚಿಸಬೇಕು" + +#: ../src/utils/pactl.c:1243 +msgid "Invalid sink input index specification" +msgstr "ಅಮಾನ್ಯವಾದ ಸಿಂಕ್ ಇನ್‌ಪುಟ್ ಸೂಚಿ ವಿವರ" + +#: ../src/utils/pactl.c:1262 +msgid "No valid command specified." +msgstr "ಮಾನ್ಯವಾದ ಯಾವುದೆ ಆಜ್ಞೆಯನ್ನು ಸೂಚಿಸಲಾಗಿಲ್ಲ." + +#: ../src/utils/pax11publish.c:61 +#, c-format +msgid "" +"%s [-D display] [-S server] [-O sink] [-I source] [-c file] [-d|-e|-i|-r]\n" +"\n" +" -d Show current PulseAudio data attached to X11 display (default)\n" +" -e Export local PulseAudio data to X11 display\n" +" -i Import PulseAudio data from X11 display to local environment " +"variables and cookie file.\n" +" -r Remove PulseAudio data from X11 display\n" +msgstr "" +"%s [-D display] [-S server] [-O sink] [-I source] [-c file] [-d|-e|-i|-r]\n" +"\n" +" -d X11 ಪ್ರದರ್ಶಕಕ್ಕೆ ಲಗತ್ತಿಸಲಾದ ಈಗಿನ PulseAudio ದತ್ತಾಂಶವನ್ನು ತೋರಿಸು " +"(ಪೂರ್ವನಿಯೋಜಿತ)\n" +" -e ಸ್ಥಳೀಯ PulseAudio ದತ್ತಾಂಶವನ್ನು X11 ಪ್ರದರ್ಶಕಕ್ಕೆ ರಫ್ತು ಮಾಡು\n" +" -i PulseAudio ದತ್ತಾಂಶವನ್ನು X11 ಪ್ರದರ್ಶಕದಿಂದ ಸ್ಥಳೀಯ ಪರಿಸರ ವೇರಿಯೇಬಲ್‌ಗಳಿಗೆ ಹಾಗು " +"ಕುಕಿ ಕಡತಗಳಿಗೆ ಆಮದು ಮಾಡಿಕೊ.\n" +" -r PulseAudio ದತ್ತಾಂಶವನ್ನು X11 ಪ್ರದರ್ಶಕದಿಂದ ತೆಗೆದು ಹಾಕು\n" + +#: ../src/utils/pax11publish.c:94 +#, c-format +msgid "Failed to parse command line.\n" +msgstr "ಆಜ್ಞಾ ಸಾಲನ್ನು ಪಾರ್ಸ್ ಮಾಡುವಲ್ಲಿ ವಿಫಲತೆ.\n" + +#: ../src/utils/pax11publish.c:108 +#, c-format +msgid "Server: %s\n" +msgstr "ಪರಿಚಾರಕ: %s\n" + +#: ../src/utils/pax11publish.c:110 +#, c-format +msgid "Source: %s\n" +msgstr "ಆಕರ: %s\n" + +#: ../src/utils/pax11publish.c:112 +#, c-format +msgid "Sink: %s\n" +msgstr "ಸಿಂಕ್: %s\n" + +#: ../src/utils/pax11publish.c:114 +#, c-format +msgid "Cookie: %s\n" +msgstr "ಕುಕಿ: %s\n" + +#: ../src/utils/pax11publish.c:132 +#, c-format +msgid "Failed to parse cookie data\n" +msgstr "ಕುಕಿ ದತ್ತಾಂಶವನ್ನು ಪಾರ್ಸ್ ಮಾಡುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ\n" + +#: ../src/utils/pax11publish.c:137 +#, c-format +msgid "Failed to save cookie data\n" +msgstr "ಕುಕಿ ದತ್ತಾಂಶವನ್ನು ಉಳಿಸುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ\n" + +#: ../src/utils/pax11publish.c:152 +#, c-format +msgid "Failed to load client configuration file.\n" +msgstr "ಕ್ಲೈಂಟ್ ಸಂರಚನಾ ಕಡತವನ್ನು ಲೋಡ್ ಮಾಡುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ.\n" + +#: ../src/utils/pax11publish.c:157 +#, c-format +msgid "Failed to read environment configuration data.\n" +msgstr "ಪರಿಸರ ಸಂರಚನಾ ದತ್ತಾಂಶವನ್ನು ಓದುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ\n" + +#: ../src/utils/pax11publish.c:174 +#, c-format +msgid "Failed to get FQDN.\n" +msgstr "FQDN ಅನ್ನು ಪಡೆಯಲು ವಿಫಲಗೊಂಡಿದೆ.\n" + +#: ../src/utils/pax11publish.c:194 +#, c-format +msgid "Failed to load cookie data\n" +msgstr "ಕುಕಿ ದತ್ತಾಂಶವನ್ನು ಲೋಡ್ ಮಾಡುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ\n" + +#: ../src/utils/pax11publish.c:211 +#, c-format +msgid "Not yet implemented.\n" +msgstr "ಇನ್ನೂ ಸಹ ಅನ್ವಯಿಸಲಾಗಿಲ್ಲ.\n" + +#: ../src/utils/pacmd.c:69 +msgid "No PulseAudio daemon running, or not running as session daemon." +msgstr "" +"ಯಾವುದೆ PulseAudio ಡೆಮನ್ ಚಾಲಿತಗೊಳ್ಳುತ್ತಿಲ್ಲ, ಅಥವ ಅಧಿವೇಶನ ಡೆಮನ್ ಆಗಿ ಚಾಲಿತಗೊಳ್ಳುತ್ತಿಲ್ಲ." + +#: ../src/utils/pacmd.c:74 +#, c-format +msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s" +msgstr "ಸಾಕೆಟ್(PF_UNIX, SOCK_STREAM, 0): %s" + +#: ../src/utils/pacmd.c:91 +#, c-format +msgid "connect(): %s" +msgstr "ಸಂಪರ್ಕಿಸು(): %s" + +#: ../src/utils/pacmd.c:99 +msgid "Failed to kill PulseAudio daemon." +msgstr "PulseAudio ಡೀಮನ್ ಅನ್ನು ಕೊಲ್ಲುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ." + +#: ../src/utils/pacmd.c:107 +msgid "Daemon not responding." +msgstr "ಡೀಮನ್ ಪ್ರತಿಕ್ರಿಯಿಸುತ್ತಿಲ್ಲ." + +#: ../src/utils/pacmd.c:161 +#, c-format +msgid "poll(): %s" +msgstr "ಪೋಲ್(): %s" + +#: ../src/utils/pacmd.c:171 ../src/utils/pacmd.c:188 +#, c-format +msgid "read(): %s" +msgstr "ಓದು(): %s" + +#: ../src/utils/pacmd.c:207 ../src/utils/pacmd.c:223 +#, c-format +msgid "write(): %s" +msgstr "ಬರೆ(): %s" + +#: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:219 +msgid "Cannot access autospawn lock." +msgstr "ಸ್ವಯಂಹೆಚ್ಚಿಸುವಿಕೆಯ ಲಾಕ್ ಅನ್ನು ನಿಲುಕಿಸಿಕೊಳ್ಳಲು ಸಾಧ್ಯವಿಲ್ಲ." + +#: ../src/modules/alsa/alsa-sink.c:530 ../src/modules/alsa/alsa-sink.c:689 +#, c-format +msgid "" +"ALSA woke us up to write new data to the device, but there was actually " +"nothing to write!\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers.\n" +"We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() " +"returned 0 or another value < min_avail." +msgstr "" +"ಸಾಧನಕ್ಕೆ ಹೊಸ ದತ್ತಾಂಶವನ್ನು ಬರೆಯುವಂತೆ ALSA ತಿಳಿಸಿದೆ, ಆದರೆ ಅಲ್ಲಿ ಬರೆಯಲು ಏನೂ ಇಲ್ಲ!\n" +"ಇದಕ್ಕೆ ALSA ಚಾಲಕ '%s' ದಲ್ಲಿನ ಒಂದು ದೋಷದ ಕಾರಣವಿರಬಹುದು. ದಯವಿಟ್ಟುಈ ತೊಂದರೆಯನ್ನು ALSA " +"ವಿಕಸನಗಾರರ ಗಮನಕ್ಕೆ ತನ್ನಿ.POLLOUT ಸೆಟ್‌ನಿಂದ ನಾವು ಎಚ್ಚೆತ್ತುಗೊಂಡಿದ್ದೇವೆ -- ಆದರೆ ನಂತರದ " +"snd_pcm_avail() 0 ಅಥವ min_avail ಕ್ಕಿಂತ ಚಿಕ್ಕದಾದ ಇನ್ನೊಂದು ಮೌಲ್ಯವನ್ನು ಮರಳಿಸಿದೆ." + +#: ../src/modules/alsa/alsa-source.c:506 ../src/modules/alsa/alsa-source.c:656 +#, c-format +msgid "" +"ALSA woke us up to read new data from the device, but there was actually " +"nothing to read!\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers.\n" +"We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() " +"returned 0 or another value < min_avail." +msgstr "" +"ಸಾಧನಕ್ಕೆ ಹೊಸ ದತ್ತಾಂಶವನ್ನು ಓದುವಂತೆ ALSA ತಿಳಿಸಿದೆ, ಆದರೆ ಅಲ್ಲಿ ಓದಲು ಏನೂ ಇಲ್ಲ!\n" +"ಇದಕ್ಕೆ ALSA ಚಾಲಕ '%s' ದಲ್ಲಿನ ಒಂದು ದೋಷದ ಕಾರಣವಿರಬಹುದು. ದಯವಿಟ್ಟುಈ ತೊಂದರೆಯನ್ನು ALSA " +"ವಿಕಸನಗಾರರ ಗಮನಕ್ಕೆ ತನ್ನಿ.POLLIN ಸೆಟ್‌ನಿಂದ ನಾವು ಎಚ್ಚೆತ್ತುಗೊಂಡಿದ್ದೇವೆ -- ಆದರೆ ನಂತರದ " +"snd_pcm_avail() 0 ಅಥವ min_avail ಕ್ಕಿಂತ ಚಿಕ್ಕದಾದ ಇನ್ನೊಂದು ಮೌಲ್ಯವನ್ನು ಮರಳಿಸಿದೆ." + +#: ../src/modules/alsa/module-alsa-card.c:152 +#: ../src/modules/bluetooth/module-bluetooth-device.c:2228 +#: ../src/modules/alsa/alsa-mixer.c:2931 +msgid "Off" +msgstr "ಜಡ" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2184 +msgid "High Fidelity Playback (A2DP)" +msgstr "ಹೈ ಫಿಡಿಲಿಟಿ ಪ್ಲೇಬ್ಯಾಕ್ (A2DP)" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2198 +msgid "High Fidelity Capture (A2DP)" +msgstr "ಹೈ ಫಿಡಿಲಿಟಿ ಕ್ಯಾಪ್ಚರ್ (A2DP)" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2213 +msgid "Telephony Duplex (HSP/HFP)" +msgstr "ಟೆಲಿಫೋನಿ ಡ್ಯೂಪ್ಲೆಕ್ಸ್‌ (HSP/HFP)" + +#: ../src/modules/reserve-wrap.c:151 +msgid "PulseAudio Sound Server" +msgstr "PulseAudio ಧ್ವನಿ ಪರಿಚಾರಕ" + +#: ../src/modules/module-rygel-media-server.c:569 +#: ../src/modules/module-rygel-media-server.c:583 +msgid "Output Devices" +msgstr "" + +#: ../src/modules/module-rygel-media-server.c:570 +#: ../src/modules/module-rygel-media-server.c:584 +msgid "Input Devices" +msgstr "" + +#: ../src/modules/module-rygel-media-server.c:774 +msgid "Audio on @HOSTNAME@" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1701 +msgid "Input" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1702 +msgid "Docking Station Input" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1703 +msgid "Docking Station Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1704 +msgid "Line-In" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1705 +msgid "Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1706 +msgid "External Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1707 +#, fuzzy +msgid "Internal Microphone" +msgstr "ಆಂತರಿಕ ಆಡಿಯೊ" + +#: ../src/modules/alsa/alsa-mixer.c:1708 +msgid "Radio" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1709 +msgid "Video" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1710 +msgid "Automatic Gain Control" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1711 +msgid "No Automatic Gain Control" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1712 +msgid "Boost" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1713 +msgid "No Boost" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1714 +msgid "Amplifier" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1715 +msgid "No Amplifier" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1773 +msgid "Analog Input" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1774 +msgid "Analog Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1775 +msgid "Analog Line-In" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1776 +msgid "Analog Radio" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1777 +msgid "Analog Video" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1778 +#, fuzzy +msgid "Analog Output" +msgstr "ಶೂನ್ಯ ಔಟ್‌ಪುಟ್" + +#: ../src/modules/alsa/alsa-mixer.c:1779 +msgid "Analog Headphones" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1780 +msgid "Analog Output (LFE)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1781 +msgid "Analog Mono Output" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1981 +#, fuzzy, c-format +msgid "%s+%s" +msgstr "%s %s" + +#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404 +#, fuzzy, c-format +msgid "%s / %s" +msgstr "%s %s" + +#: ../src/modules/alsa/alsa-mixer.c:2790 +msgid "Analog Mono" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2791 +#, fuzzy +msgid "Analog Stereo" +msgstr "ಸ್ಟೀರಿಯೋ" + +#: ../src/modules/alsa/alsa-mixer.c:2792 +#, fuzzy +msgid "Analog Surround 2.1" +msgstr "ಸರೌಂಡ್‌ 4.1" + +#: ../src/modules/alsa/alsa-mixer.c:2793 +#, fuzzy +msgid "Analog Surround 3.0" +msgstr "ಸರೌಂಡ್‌ 4.0" + +#: ../src/modules/alsa/alsa-mixer.c:2794 +#, fuzzy +msgid "Analog Surround 3.1" +msgstr "ಸರೌಂಡ್‌ 4.1" + +#: ../src/modules/alsa/alsa-mixer.c:2795 +#, fuzzy +msgid "Analog Surround 4.0" +msgstr "ಸರೌಂಡ್‌ 4.0" + +#: ../src/modules/alsa/alsa-mixer.c:2796 +#, fuzzy +msgid "Analog Surround 4.1" +msgstr "ಸರೌಂಡ್‌ 4.1" + +#: ../src/modules/alsa/alsa-mixer.c:2797 +#, fuzzy +msgid "Analog Surround 5.0" +msgstr "ಸರೌಂಡ್‌ 5.0" + +#: ../src/modules/alsa/alsa-mixer.c:2798 +#, fuzzy +msgid "Analog Surround 5.1" +msgstr "ಸರೌಂಡ್‌ 5.1" + +#: ../src/modules/alsa/alsa-mixer.c:2799 +#, fuzzy +msgid "Analog Surround 6.0" +msgstr "ಸರೌಂಡ್‌ 4.0" + +#: ../src/modules/alsa/alsa-mixer.c:2800 +#, fuzzy +msgid "Analog Surround 6.1" +msgstr "ಸರೌಂಡ್‌ 4.1" + +#: ../src/modules/alsa/alsa-mixer.c:2801 +#, fuzzy +msgid "Analog Surround 7.0" +msgstr "ಸರೌಂಡ್‌ 4.0" + +#: ../src/modules/alsa/alsa-mixer.c:2802 +#, fuzzy +msgid "Analog Surround 7.1" +msgstr "ಸರೌಂಡ್‌ 7.1" + +#: ../src/modules/alsa/alsa-mixer.c:2803 +msgid "Digital Stereo (IEC958)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2804 +msgid "Digital Surround 4.0 (IEC958)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2805 +msgid "Digital Surround 4.0 (IEC958/AC3)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2806 +msgid "Digital Surround 5.1 (IEC958/AC3)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2807 +msgid "Digital Stereo (HDMI)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2928 +msgid "Analog Mono Duplex" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2929 +msgid "Analog Stereo Duplex" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2930 +msgid "Digital Stereo Duplex (IEC958)" +msgstr "" diff --git a/po/ml.po b/po/ml.po new file mode 100644 index 0000000..4a5cbf9 --- /dev/null +++ b/po/ml.po @@ -0,0 +1,2569 @@ +# translation of pulseaudio.master-tx.ml.po to +# translation of pulseaudio.master-tx.pulseaudio.ml.po to +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: pulseaudio.master-tx.ml\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-09-29 23:47+0200\n" +"PO-Revision-Date: 2009-09-21 20:54+0530\n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" + +#: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629 +#, c-format +msgid "%s %s" +msgstr "%s %s" + +#: ../src/modules/alsa/alsa-util.c:1106 +#, c-format +msgid "" +"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu " +"ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_avail() നല്‍കിയ മൂല്ല്യം വളരെ വലുതാണു്: %lu ബൈറ്റുകള്‍ (%lu ms).\n" +"ഇതു് ALSA ഡ്രൈവര്‍ '%s'-ലുള്ള ഒരു ബഗാവാം. ദയവായി ഈ പ്രശ്നം ALSA ഡവലപ്പര്‍സിനെ അറിയിക്കുക." + +#: ../src/modules/alsa/alsa-util.c:1147 +#, c-format +msgid "" +"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%" +"lu ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_delay() നല്‍കിയ മൂല്ല്യം വളരെ വലുതാണു്: %li ബൈറ്റുകള്‍ (%s%lu ms).\n" +"ഇതു് ALSA ഡ്രൈവര്‍ '%s'-ലുള്ള ഒരു ബഗാവാം. ദയവായി ഈ പ്രശ്നം ALSA ഡവലപ്പര്‍സിനെ അറിയിക്കുക." + +#: ../src/modules/alsa/alsa-util.c:1194 +#, c-format +msgid "" +"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes " +"(%lu ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_mmap_begin() നല്‍കിയ മൂല്ല്യം വളരെ വലുതാണു്: %lu ബൈറ്റുകള്‍(%lu ms).\n" +"ഇതു് ALSA ഡ്രൈവര്‍ '%s'-ലുള്ള ഒരു ബഗാവാം. ദയവായി ഈ പ്രശ്നം ALSA ഡവലപ്പര്‍സിനെ അറിയിക്കുക." + +#: ../src/modules/module-always-sink.c:39 +msgid "Always keeps at least one sink loaded even if it's a null one" +msgstr "നള്‍ ആണെങ്കിലും ഒരു സിങ്കെങ്കിലും എപ്പോഴും ലഭ്യമാക്കുക" + +#: ../src/modules/module-always-sink.c:83 +msgid "Dummy Output" +msgstr "ഡമ്മി ഔട്ട്പുട്ട്" + +#: ../src/modules/module-ladspa-sink.c:49 +msgid "Virtual LADSPA sink" +msgstr "വിര്‍ച്ച്വല്‍ LADSPA സിങ്ക്" + +#: ../src/modules/module-ladspa-sink.c:53 +msgid "" +"sink_name= sink_properties= " +"master= format= rate= " +"channels= channel_map= plugin= label= control=" +msgstr "" +"sink_name= sink_properties= " +"master= format= rate= " +"channels= channel_map= plugin= label= control=" + +#: ../src/modules/module-null-sink.c:55 +msgid "Clocked NULL sink" +msgstr "ക്ലോക്കഡ് NULL സിങ്ക്" + +#: ../src/modules/module-null-sink.c:291 +msgid "Null Output" +msgstr "നള്‍ ഔട്ട്പുട്ട്" + +#: ../src/pulsecore/sink.c:2613 +msgid "Internal Audio" +msgstr "ഇന്റേര്‍ണല്‍ ഓഡിയോ" + +#: ../src/pulsecore/sink.c:2618 +msgid "Modem" +msgstr "മോഡം" + +#: ../src/daemon/ltdl-bind-now.c:124 +msgid "Failed to find original lt_dlopen loader." +msgstr "യഥാര്‍ത്ഥ lt_dlopen ലോഡര്‍ ലഭ്യമാക്കുന്നതില്‍ പരാജയപ്പെട്ടു." + +#: ../src/daemon/ltdl-bind-now.c:129 +msgid "Failed to allocate new dl loader." +msgstr "പുതിയ dl ലോഡര്‍ അനുവദിക്കുന്നതില്‍ പരാജയപ്പെട്ടു." + +#: ../src/daemon/ltdl-bind-now.c:142 +msgid "Failed to add bind-now-loader." +msgstr "bind-now-loader ചേര്‍ക്കുന്നതില്‍ പരാജയപ്പെട്ടു." + +#: ../src/daemon/main.c:141 +#, c-format +msgid "Got signal %s." +msgstr "%s സിഗ്നല്‍ ലഭ്യമായി." + +#: ../src/daemon/main.c:168 +msgid "Exiting." +msgstr "പുറത്തു് കടക്കുന്നു." + +#: ../src/daemon/main.c:186 +#, c-format +msgid "Failed to find user '%s'." +msgstr "'%s' എന്ന ഉപയോക്താവു് ലഭ്യമാക്കുന്നതില്‍ പരാജയപ്പെട്ടു." + +#: ../src/daemon/main.c:191 +#, c-format +msgid "Failed to find group '%s'." +msgstr "'%s' എന്ന ഗ്രൂപ്പ് ലഭ്യമാക്കുന്നതില്‍ പരാജയപ്പെട്ടു." + +#: ../src/daemon/main.c:195 +#, c-format +msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)." +msgstr "ഉപയോക്താവു് '%s' (UID %lu) , ഗ്രൂപ്പ് '%s' (GID %lu) ലഭ്യമായി." + +#: ../src/daemon/main.c:200 +#, c-format +msgid "GID of user '%s' and of group '%s' don't match." +msgstr "ഉപയോക്താവു് '%s'-ന്റെയും ഗ്രൂപ്പ് '%s'-ന്റെയും GID ചേരുന്നില്ല." + +#: ../src/daemon/main.c:205 +#, c-format +msgid "Home directory of user '%s' is not '%s', ignoring." +msgstr "ഉപയോക്താവു് '%s'-ന്റെ ഹോം ഡയറക്ടറി '%s' അല്ല, ഉപേക്ഷിക്കുന്നു." + +#: ../src/daemon/main.c:208 ../src/daemon/main.c:213 +#, c-format +msgid "Failed to create '%s': %s" +msgstr "'%s' ഉണ്ടാക്കുന്നതില്‍ പരാജയപ്പെട്ടു: %s" + +#: ../src/daemon/main.c:220 +#, c-format +msgid "Failed to change group list: %s" +msgstr "ഗ്രൂപ്പ് ലിസ്റ്റ് മാറ്റുന്നതില്‍ പരാജയപ്പെട്ടു: %s" + +#: ../src/daemon/main.c:236 +#, c-format +msgid "Failed to change GID: %s" +msgstr "GID മാറ്റുന്നതില്‍ പരാജയപ്പെട്ടു: %s" + +#: ../src/daemon/main.c:252 +#, c-format +msgid "Failed to change UID: %s" +msgstr "UID മാറ്റുന്നതില്‍ പരാജയപ്പെട്ടു: %s" + +#: ../src/daemon/main.c:271 +msgid "Successfully dropped root privileges." +msgstr "റൂട്ട് ആനുകൂല്യങ്ങള്‍ വിജയകരമായി ഉപേക്ഷിച്ചിരിക്കുന്നു." + +#: ../src/daemon/main.c:279 +msgid "System wide mode unsupported on this platform." +msgstr "ഈ പ്ലാറ്റ്ഫോമില്‍ സിസ്റ്റം വൈഡ് മോഡ് പിന്തുണയ്ക്കുന്നില്ല." + +#: ../src/daemon/main.c:297 +#, c-format +msgid "setrlimit(%s, (%u, %u)) failed: %s" +msgstr "setrlimit(%s, (%u, %u)) പരാജയപ്പെട്ടു: %s" + +#: ../src/daemon/main.c:474 +msgid "Failed to parse command line." +msgstr "കമാന്‍ഡ് ലൈന്‍ പാഴ്സ് ചെയ്യുന്നതില്‍ പരാജയപ്പെട്ടു." + +#: ../src/daemon/main.c:541 +msgid "Daemon not running" +msgstr "ഡെമണ്‍ പ്രവര്‍ത്തനത്തിലില്ല" + +#: ../src/daemon/main.c:543 +#, c-format +msgid "Daemon running as PID %u" +msgstr "ഡെമണ്‍ PID %u ആയി പ്രവര്‍ത്തിക്കുന്നു" + +#: ../src/daemon/main.c:553 +#, c-format +msgid "Failed to kill daemon: %s" +msgstr "ഡെമണ്‍ നശിപ്പിക്കുന്നതില്‍ പരാജയപ്പെട്ടു: %s" + +#: ../src/daemon/main.c:571 +msgid "" +"This program is not intended to be run as root (unless --system is " +"specified)." +msgstr "" +"ഈ പ്രോഗ്രാം റൂട്ടായി പ്രവര്‍ത്തിപ്പിക്കേണ്ടതല്ല (--system എന്നു് പറഞ്ഞിട്ടുണ്ടെങ്കില്‍ മാത്രം റൂട്ട് " +"ആവശ്യമുണ്ടു്)." + +#: ../src/daemon/main.c:573 +msgid "Root privileges required." +msgstr "റൂട്ട് ആനുകൂല്യങ്ങള്‍ ആവശ്യമുണ്ടു്." + +#: ../src/daemon/main.c:578 +msgid "--start not supported for system instances." +msgstr "സിസ്റ്റം ഇന്‍സ്റ്റന്‍സുകള്‍ക്ക് --start പിന്തുണയ്ക്കുന്നില്ല." + +#: ../src/daemon/main.c:583 +msgid "Running in system mode, but --disallow-exit not set!" +msgstr "സിസ്റ്റം മോഡില്‍ പ്രവര്‍ത്തിക്കുന്നു, പക്ഷേ --disallow-exit സജ്ജമാക്കിയിട്ടില്ല!" + +#: ../src/daemon/main.c:586 +msgid "Running in system mode, but --disallow-module-loading not set!" +msgstr "" +"സിസ്റ്റം മോഡില്‍ പ്രവര്‍ത്തിക്കുന്നു, പക്ഷേ --disallow-module-loading സജ്ജമാക്കിയിട്ടില്ല!" + +#: ../src/daemon/main.c:589 +msgid "Running in system mode, forcibly disabling SHM mode!" +msgstr "സിസ്റ്റം മോഡില്‍ പ്രവര്‍ത്തിക്കുന്നു, നിര്‍ബന്ധമായും SHM മോഡ് പ്രവര്‍ത്ത രഹിതമാക്കുന്നു!" + +#: ../src/daemon/main.c:594 +msgid "Running in system mode, forcibly disabling exit idle time!" +msgstr "" +"സിസ്റ്റം മോഡില്‍ പ്രവര്‍ത്തിക്കുന്നു, നിര്‍ബന്ധമായും എക്സിറ്റ് ഐഡില്‍ സമയം പ്രവര്‍ത്ത രഹിതമാക്കുന്നു!" + +#: ../src/daemon/main.c:621 +msgid "Failed to acquire stdio." +msgstr "stdio ലഭിക്കുന്നതില്‍ പരാജയപ്പെട്ടു." + +#: ../src/daemon/main.c:627 +#, c-format +msgid "pipe failed: %s" +msgstr "pipe പരാജയപ്പെട്ടു: %s" + +#: ../src/daemon/main.c:632 +#, c-format +msgid "fork() failed: %s" +msgstr "fork() പരാജയപ്പെട്ടു: %s" + +#: ../src/daemon/main.c:646 ../src/utils/pacat.c:508 +#, c-format +msgid "read() failed: %s" +msgstr "read() പരാജയപ്പെട്ടു: %s" + +#: ../src/daemon/main.c:652 +msgid "Daemon startup failed." +msgstr "ഡെമണിന്റെ തുടക്കം പരാജയപ്പെട്ടു." + +#: ../src/daemon/main.c:654 +msgid "Daemon startup successful." +msgstr "ഡെമണിന്റെ തുടക്കം വിജയിച്ചു." + +#: ../src/daemon/main.c:731 +#, c-format +msgid "This is PulseAudio %s" +msgstr "ഇതു് PulseAudio %s ആണു്" + +#: ../src/daemon/main.c:732 +#, c-format +msgid "Compilation host: %s" +msgstr "കംപൈലേഷന്‍ ഹോസ്റ്റ്: %s" + +#: ../src/daemon/main.c:733 +#, c-format +msgid "Compilation CFLAGS: %s" +msgstr "കംപൈലേഷന്‍ CFLAGS: %s" + +#: ../src/daemon/main.c:736 +#, c-format +msgid "Running on host: %s" +msgstr "ഹോസ്റ്റില്‍ പ്രവര്‍ത്തിക്കുന്നു: %s" + +#: ../src/daemon/main.c:739 +#, c-format +msgid "Found %u CPUs." +msgstr "%u സിപിയു ലഭ്യമായി." + +#: ../src/daemon/main.c:741 +#, c-format +msgid "Page size is %lu bytes" +msgstr "താളിന്റെ വ്യാപ്തി %lu ബൈറ്റുകളാണു്" + +#: ../src/daemon/main.c:744 +msgid "Compiled with Valgrind support: yes" +msgstr "Valgrind പിന്തുണയോടെ കംപൈല്‍ ചെയ്തിരിക്കുന്നു: ഉവ്വു്" + +#: ../src/daemon/main.c:746 +msgid "Compiled with Valgrind support: no" +msgstr "Valgrind പിന്തുണയോടെ കംപൈല്‍ ചെയ്തിരിക്കുന്നു: ഇല്ല" + +#: ../src/daemon/main.c:749 +#, c-format +msgid "Running in valgrind mode: %s" +msgstr "valgrind മോഡില്‍ പ്രവര്‍ത്തിപ്പിക്കുന്നു: %s" + +#: ../src/daemon/main.c:752 +msgid "Optimized build: yes" +msgstr "ഒപ്ടിമൈസ്ഡ് ബിള്‍ഡ്: ഉവ്വു്" + +#: ../src/daemon/main.c:754 +msgid "Optimized build: no" +msgstr "ഒപ്ടിമൈസ്ഡ് ബിള്‍ഡ്: ഇല്ല" + +#: ../src/daemon/main.c:758 +msgid "NDEBUG defined, all asserts disabled." +msgstr "NDEBUG നിഷ്കര്‍ഷിച്ചിരിക്കുന്നു, എല്ലാ asserts-ഉം പ്രവര്‍‌ത്ത രഹിതം." + +#: ../src/daemon/main.c:760 +msgid "FASTPATH defined, only fast path asserts disabled." +msgstr "FASTPATH നിഷ്കര്‍ഷിച്ചിരിക്കുന്നു, fast path asserts മാത്രം പ്രവര്‍‌ത്ത രഹിതം." + +#: ../src/daemon/main.c:762 +msgid "All asserts enabled." +msgstr "എല്ലാ asserts-ഉം പ്രവര്‍‌ത്ത സജ്ജം" + +#: ../src/daemon/main.c:766 +msgid "Failed to get machine ID" +msgstr "മഷീന്‍ ID ലഭ്യമാക്കുവാന്‍ സാധ്യമായില്ല" + +#: ../src/daemon/main.c:769 +#, c-format +msgid "Machine ID is %s." +msgstr "മഷീന്‍ ID %s ആണു്." + +#: ../src/daemon/main.c:773 +#, c-format +msgid "Session ID is %s." +msgstr "സെഷന്‍ ID %s ആണു്." + +#: ../src/daemon/main.c:779 +#, c-format +msgid "Using runtime directory %s." +msgstr "റണ്‍ടൈം ഡയറക്ടറി %s ഉപയോഗിക്കുന്നു." + +#: ../src/daemon/main.c:784 +#, c-format +msgid "Using state directory %s." +msgstr "സ്റ്റേറ്റ് ഡയറക്ടറി %s ഉപയോഗിക്കുന്നു." + +#: ../src/daemon/main.c:787 +#, c-format +msgid "Using modules directory %s." +msgstr "മൊഡ്യൂള്‍സ് ഡയറക്ടറി %s ഉപയോഗിക്കുന്നു." + +#: ../src/daemon/main.c:789 +#, c-format +msgid "Running in system mode: %s" +msgstr "സിസ്റ്റം മോഡില്‍ പ്രവര്‍ത്തിക്കുന്നു: %s" + +#: ../src/daemon/main.c:792 +msgid "" +"OK, so you are running PA in system mode. Please note that you most likely " +"shouldn't be doing that.\n" +"If you do it nonetheless then it's your own fault if things don't work as " +"expected.\n" +"Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an " +"explanation why system mode is usually a bad idea." +msgstr "" +"ശരി, അപ്പോള്‍ നിങ്ങള്‍ പിഎ സിസ്റ്റം മോഡിലാണു് പ്രവര്‍ത്തിപ്പിക്കുന്നതു്. ദയവായി ഇതുപേക്ഷിക്കുക.\n" +"ഇങ്ങനെ ചെയ്തുണ്ടാകുന്ന സകല തകരാറുകളുടേയും ഉത്തരവാദി നിങ്ങള്‍ സ്വയമാകുന്നു.\n" +"സിസ്റ്റം മോഡിലുള്ള പ്രവര്‍ത്തനം ഉത്തമമല്ലാത്തതിന്റെ കാരണങ്ങള്‍ക്കായിhttp://pulseaudio.org/" +"wiki/WhatIsWrongWithSystemMode കാണുക." + +#: ../src/daemon/main.c:809 +msgid "pa_pid_file_create() failed." +msgstr "pa_pid_file_create() പരാജയപ്പെട്ടു." + +#: ../src/daemon/main.c:819 +msgid "Fresh high-resolution timers available! Bon appetit!" +msgstr "Fresh high-resolution timers available! Bon appetit!" + +#: ../src/daemon/main.c:821 +msgid "" +"Dude, your kernel stinks! The chef's recommendation today is Linux with high-" +"resolution timers enabled!" +msgstr "" +"Dude, your kernel stinks! The chef's recommendation today is Linux with high-" +"resolution timers enabled!" + +#: ../src/daemon/main.c:844 +msgid "pa_core_new() failed." +msgstr "pa_core_new() പരാജയപ്പെട്ടു." + +#: ../src/daemon/main.c:904 +msgid "Failed to initialize daemon." +msgstr "ഡെമണ്‍ ആരംഭിക്കുന്നതില്‍ പരാജയപ്പെട്ടു." + +#: ../src/daemon/main.c:909 +msgid "Daemon startup without any loaded modules, refusing to work." +msgstr "ഒരു ഘടകങ്ങളും ലഭ്യമാകാതെ ഡെമണ്‍ ആരംഭിച്ചിരിക്കുന്നു, പ്രവര്‍ത്തനം നിഷേധിച്ചിരിക്കുന്നു." + +#: ../src/daemon/main.c:926 +msgid "Daemon startup complete." +msgstr "ഡെമണിന്റെ തുടക്കം പൂര്‍ണ്ണമായി." + +#: ../src/daemon/main.c:932 +msgid "Daemon shutdown initiated." +msgstr "ഡെമണ്‍ അടച്ചുപൂട്ടുന്നതു് ആരംഭിച്ചിരിക്കുന്നു." + +#: ../src/daemon/main.c:954 +msgid "Daemon terminated." +msgstr "ഡെമണ്‍ നിര്‍ത്തിയിരിക്കുന്നു." + +#: ../src/daemon/cmdline.c:115 +#, c-format +msgid "" +"%s [options]\n" +"\n" +"COMMANDS:\n" +" -h, --help Show this help\n" +" --version Show version\n" +" --dump-conf Dump default configuration\n" +" --dump-modules Dump list of available modules\n" +" --dump-resample-methods Dump available resample methods\n" +" --cleanup-shm Cleanup stale shared memory " +"segments\n" +" --start Start the daemon if it is not " +"running\n" +" -k --kill Kill a running daemon\n" +" --check Check for a running daemon (only " +"returns exit code)\n" +"\n" +"OPTIONS:\n" +" --system[=BOOL] Run as system-wide instance\n" +" -D, --daemonize[=BOOL] Daemonize after startup\n" +" --fail[=BOOL] Quit when startup fails\n" +" --high-priority[=BOOL] Try to set high nice level\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_NICE)\n" +" --realtime[=BOOL] Try to enable realtime scheduling\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_RTPRIO)\n" +" --disallow-module-loading[=BOOL] Disallow module user requested " +"module\n" +" loading/unloading after startup\n" +" --disallow-exit[=BOOL] Disallow user requested exit\n" +" --exit-idle-time=SECS Terminate the daemon when idle and " +"this\n" +" time passed\n" +" --module-idle-time=SECS Unload autoloaded modules when idle " +"and\n" +" this time passed\n" +" --scache-idle-time=SECS Unload autoloaded samples when idle " +"and\n" +" this time passed\n" +" --log-level[=LEVEL] Increase or set verbosity level\n" +" -v Increase the verbosity level\n" +" --log-target={auto,syslog,stderr} Specify the log target\n" +" --log-meta[=BOOL] Include code location in log " +"messages\n" +" --log-time[=BOOL] Include timestamps in log messages\n" +" --log-backtrace=FRAMES Include a backtrace in log messages\n" +" -p, --dl-search-path=PATH Set the search path for dynamic " +"shared\n" +" objects (plugins)\n" +" --resample-method=METHOD Use the specified resampling method\n" +" (See --dump-resample-methods for\n" +" possible values)\n" +" --use-pid-file[=BOOL] Create a PID file\n" +" --no-cpu-limit[=BOOL] Do not install CPU load limiter on\n" +" platforms that support it.\n" +" --disable-shm[=BOOL] Disable shared memory support.\n" +"\n" +"STARTUP SCRIPT:\n" +" -L, --load=\"MODULE ARGUMENTS\" Load the specified plugin module " +"with\n" +" the specified argument\n" +" -F, --file=FILENAME Run the specified script\n" +" -C Open a command line on the running " +"TTY\n" +" after startup\n" +"\n" +" -n Don't load default script file\n" +msgstr "" +"%s [options]\n" +"\n" +"COMMANDS:\n" +" -h, --help Show this help\n" +" --version Show version\n" +" --dump-conf Dump default configuration\n" +" --dump-modules Dump list of available modules\n" +" --dump-resample-methods Dump available resample methods\n" +" --cleanup-shm Cleanup stale shared memory " +"segments\n" +" --start Start the daemon if it is not " +"running\n" +" -k --kill Kill a running daemon\n" +" --check Check for a running daemon (only " +"returns exit code)\n" +"\n" +"OPTIONS:\n" +" --system[=BOOL] Run as system-wide instance\n" +" -D, --daemonize[=BOOL] Daemonize after startup\n" +" --fail[=BOOL] Quit when startup fails\n" +" --high-priority[=BOOL] Try to set high nice level\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_NICE)\n" +" --realtime[=BOOL] Try to enable realtime scheduling\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_RTPRIO)\n" +" --disallow-module-loading[=BOOL] Disallow module user requested " +"module\n" +" loading/unloading after startup\n" +" --disallow-exit[=BOOL] Disallow user requested exit\n" +" --exit-idle-time=SECS Terminate the daemon when idle and " +"this\n" +" time passed\n" +" --module-idle-time=SECS Unload autoloaded modules when idle " +"and\n" +" this time passed\n" +" --scache-idle-time=SECS Unload autoloaded samples when idle " +"and\n" +" this time passed\n" +" --log-level[=LEVEL] Increase or set verbosity level\n" +" -v Increase the verbosity level\n" +" --log-target={auto,syslog,stderr} Specify the log target\n" +" --log-meta[=BOOL] Include code location in log " +"messages\n" +" --log-time[=BOOL] Include timestamps in log messages\n" +" --log-backtrace=FRAMES Include a backtrace in log messages\n" +" -p, --dl-search-path=PATH Set the search path for dynamic " +"shared\n" +" objects (plugins)\n" +" --resample-method=METHOD Use the specified resampling method\n" +" (See --dump-resample-methods for\n" +" possible values)\n" +" --use-pid-file[=BOOL] Create a PID file\n" +" --no-cpu-limit[=BOOL] Do not install CPU load limiter on\n" +" platforms that support it.\n" +" --disable-shm[=BOOL] Disable shared memory support.\n" +"\n" +"STARTUP SCRIPT:\n" +" -L, --load=\"MODULE ARGUMENTS\" Load the specified plugin module " +"with\n" +" the specified argument\n" +" -F, --file=FILENAME Run the specified script\n" +" -C Open a command line on the running " +"TTY\n" +" after startup\n" +"\n" +" -n Don't load default script file\n" + +#: ../src/daemon/cmdline.c:247 +msgid "--daemonize expects boolean argument" +msgstr "--daemonize-നു് ബൂളിയന്‍ ആര്‍ഗ്യുമെന്റ് ആവശ്യമുണ്ടു്" + +#: ../src/daemon/cmdline.c:254 +msgid "--fail expects boolean argument" +msgstr "--fail-നു് ബൂളിയന്‍ ആര്‍ഗ്യുമെന്റ് ആവശ്യമുണ്ടു്" + +#: ../src/daemon/cmdline.c:264 +msgid "" +"--log-level expects log level argument (either numeric in range 0..4 or one " +"of debug, info, notice, warn, error)." +msgstr "" +"--log-level-നു് ലോഗ് ലവല്‍ ആര്‍ഗ്യുമെന്റ് ആവശ്യമുണ്ടു് (ഒന്നുകില്‍ 0..4 വരെയുള്ള ന്യൂമറിക് പരിധി " +"അല്ലെങ്കില്‍ debug, info, notice, warn, error എന്നിവയില്‍ ഒന്നു്)." + +#: ../src/daemon/cmdline.c:276 +msgid "--high-priority expects boolean argument" +msgstr "--high-priority-നു് ബൂളിയന്‍ ആര്‍ഗ്യുമെന്റ് ആവശ്യമുണ്ടു്" + +#: ../src/daemon/cmdline.c:283 +msgid "--realtime expects boolean argument" +msgstr "--realtime-നു് ബൂളിയന്‍ ആര്‍ഗ്യുമെന്റ് ആവശ്യമുണ്ടു്" + +#: ../src/daemon/cmdline.c:290 +msgid "--disallow-module-loading expects boolean argument" +msgstr "--disallow-module-loading-നു് ബൂളിയന്‍ ആര്‍ഗ്യുമെന്റ് ആവശ്യമുണ്ടു്" + +#: ../src/daemon/cmdline.c:297 +msgid "--disallow-exit expects boolean argument" +msgstr "--disallow-exit-നു് ബൂളിയന്‍ ആര്‍ഗ്യുമെന്റ് ആവശ്യമുണ്ടു്" + +#: ../src/daemon/cmdline.c:304 +msgid "--use-pid-file expects boolean argument" +msgstr "--use-pid-file-നു് ബൂളിയന്‍ ആര്‍ഗ്യുമെന്റ് ആവശ്യമുണ്ടു്" + +#: ../src/daemon/cmdline.c:321 +msgid "Invalid log target: use either 'syslog', 'stderr' or 'auto'." +msgstr "തെറ്റായ ലോഗ് ടാര്‍ഗറ്റ്: 'syslog', 'stderr' അല്ലെങ്കില്‍ 'auto' ഉപയോഗിക്കുക." + +#: ../src/daemon/cmdline.c:328 +msgid "--log-time expects boolean argument" +msgstr "--log-time-നു് ബൂളിയന്‍ ആര്‍ഗ്യുമെന്റ് ആവശ്യമുണ്ടു്" + +#: ../src/daemon/cmdline.c:335 +msgid "--log-meta expects boolean argument" +msgstr "--log-meta-നു് ബൂളിയന്‍ ആര്‍ഗ്യുമെന്റ് ആവശ്യമുണ്ടു്" + +#: ../src/daemon/cmdline.c:354 +#, c-format +msgid "Invalid resample method '%s'." +msgstr "തെറ്റായ റീസാംപിള്‍ മാര്‍ഗ്ഗം '%s'." + +#: ../src/daemon/cmdline.c:361 +msgid "--system expects boolean argument" +msgstr "--system-നു് ബൂളിയന്‍ ആര്‍ഗ്യുമെന്റ് ആവശ്യമുണ്ടു്" + +#: ../src/daemon/cmdline.c:368 +msgid "--no-cpu-limit expects boolean argument" +msgstr "--no-cpu-limit-നു് ബൂളിയന്‍ ആര്‍ഗ്യുമെന്റ് ആവശ്യമുണ്ടു്" + +#: ../src/daemon/cmdline.c:375 +msgid "--disable-shm expects boolean argument" +msgstr "--disable-shm-നു് ബൂളിയന്‍ ആര്‍ഗ്യുമെന്റ് ആവശ്യമുണ്ടു്" + +#: ../src/daemon/dumpmodules.c:60 +#, c-format +msgid "Name: %s\n" +msgstr "പേരു്: %s\n" + +#: ../src/daemon/dumpmodules.c:63 +#, c-format +msgid "No module information available\n" +msgstr "ഘടകത്തെപ്പറ്റിയുള്ള വിവരം ലഭ്യമല്ല\n" + +#: ../src/daemon/dumpmodules.c:66 +#, c-format +msgid "Version: %s\n" +msgstr "പതിപ്പു്: %s\n" + +#: ../src/daemon/dumpmodules.c:68 +#, c-format +msgid "Description: %s\n" +msgstr "വിവരണം: %s\n" + +#: ../src/daemon/dumpmodules.c:70 +#, c-format +msgid "Author: %s\n" +msgstr "രചയിതാവു്: %s\n" + +#: ../src/daemon/dumpmodules.c:72 +#, c-format +msgid "Usage: %s\n" +msgstr "ഉപയോഗം: %s\n" + +#: ../src/daemon/dumpmodules.c:73 +#, c-format +msgid "Load Once: %s\n" +msgstr "ഒരിക്കല്‍ ലഭ്യമാക്കുക: %s\n" + +#: ../src/daemon/dumpmodules.c:75 +#, c-format +msgid "DEPRECATION WARNING: %s\n" +msgstr "DEPRECATION WARNING: %s\n" + +#: ../src/daemon/dumpmodules.c:79 +#, c-format +msgid "Path: %s\n" +msgstr "പാഥ്: %s\n" + +#: ../src/daemon/daemon-conf.c:232 +#, c-format +msgid "[%s:%u] Invalid log target '%s'." +msgstr "[%s:%u] തെറ്റായ ലോഗ് ടാര്‍ഗറ്റ് '%s'." + +#: ../src/daemon/daemon-conf.c:248 +#, c-format +msgid "[%s:%u] Invalid log level '%s'." +msgstr "[%s:%u] തെറ്റായ ലോഗ് ലവല്‍ '%s'." + +#: ../src/daemon/daemon-conf.c:264 +#, c-format +msgid "[%s:%u] Invalid resample method '%s'." +msgstr "[%s:%u] തെറ്റായ റീസാംപിള്‍ മാര്‍ഗ്ഗം '%s'." + +#: ../src/daemon/daemon-conf.c:287 +#, c-format +msgid "[%s:%u] Invalid rlimit '%s'." +msgstr "[%s:%u] അസാധുവായ rlimit '%s'." + +#: ../src/daemon/daemon-conf.c:294 +#, c-format +msgid "[%s:%u] rlimit not supported on this platform." +msgstr "[%s:%u] ഈ പ്ലാറ്റ്ഫോമില്‍ rlimit-നുള്ള പിന്തുണ ലഭ്യമല്ല." + +#: ../src/daemon/daemon-conf.c:310 +#, c-format +msgid "[%s:%u] Invalid sample format '%s'." +msgstr "[%s:%u] തെറ്റായ സാംപിള്‍ മാതൃക '%s'." + +#: ../src/daemon/daemon-conf.c:328 +#, c-format +msgid "[%s:%u] Invalid sample rate '%s'." +msgstr "[%s:%u] തെറ്റായ സാംപിള്‍ റേറ്റ് '%s'." + +#: ../src/daemon/daemon-conf.c:352 +#, c-format +msgid "[%s:%u] Invalid sample channels '%s'." +msgstr "[%s:%u] തെറ്റായ സാംപിള്‍ ചാനലുകള്‍ '%s'." + +#: ../src/daemon/daemon-conf.c:370 +#, c-format +msgid "[%s:%u] Invalid channel map '%s'." +msgstr "[%s:%u] അസാധുവായ ചാനല്‍ മാപ്പ് '%s'." + +#: ../src/daemon/daemon-conf.c:388 +#, c-format +msgid "[%s:%u] Invalid number of fragments '%s'." +msgstr "[%s:%u] '%s' ഫ്രാഗ്മെന്റുകളുടെ തെറ്റായ എണ്ണം." + +#: ../src/daemon/daemon-conf.c:406 +#, c-format +msgid "[%s:%u] Invalid fragment size '%s'." +msgstr "[%s:%u] തെറ്റായ ഫ്രാഗ്മെന്റ് വ്യാപ്തി '%s'." + +#: ../src/daemon/daemon-conf.c:424 +#, c-format +msgid "[%s:%u] Invalid nice level '%s'." +msgstr "[%s:%u] അസാധുവായ nice സ്ഥാനം '%s'." + +#: ../src/daemon/daemon-conf.c:546 +#, c-format +msgid "Failed to open configuration file: %s" +msgstr "ക്രമീകരണ ഫയല്‍ തുറക്കുന്നതില്‍ പരാജയപ്പെട്ടു: %s" + +#: ../src/daemon/daemon-conf.c:562 +msgid "" +"The specified default channel map has a different number of channels than " +"the specified default number of channels." +msgstr "" +"വ്യക്തമാക്കിയിട്ടുള്ള സ്വതവേയുള്ള ചാനല്‍ മാപ്പിനുള്ള ചാനലുകളുടെ എണ്ണം നല്‍കിയിരിക്കുന്ന സ്വതവേയുള്ള " +"ചാനലുകളുടെ എണ്ണത്തേക്കാള്‍ വ്യത്യസ്ഥമാണു്." + +#: ../src/daemon/daemon-conf.c:638 +#, c-format +msgid "### Read from configuration file: %s ###\n" +msgstr "### ക്രമീകരണ ഫയലില്‍ നിന്നും ലഭ്യമാക്കുക: %s ###\n" + +#: ../src/daemon/caps.c:62 +msgid "Cleaning up privileges." +msgstr "അനുമതികള്‍ വെടിപ്പാക്കുന്നു." + +#: ../src/daemon/pulseaudio.desktop.in.h:1 +msgid "PulseAudio Sound System" +msgstr "PulseAudio സൌണ്ട് സിസ്റ്റം" + +#: ../src/daemon/pulseaudio.desktop.in.h:2 +msgid "Start the PulseAudio Sound System" +msgstr "PulseAudio സൌണ്ട് സിസ്റ്റം ആരംഭിക്കുക" + +#: ../src/pulse/channelmap.c:105 ../src/pulse/channelmap.c:757 +msgid "Mono" +msgstr "മോണോ" + +#: ../src/pulse/channelmap.c:107 +msgid "Front Center" +msgstr "മദ്ധ്യം മുന്നില്‍" + +#: ../src/pulse/channelmap.c:108 +msgid "Front Left" +msgstr "ഇടതു്് മുന്നില്‍" + +#: ../src/pulse/channelmap.c:109 +msgid "Front Right" +msgstr "വലതു് മുന്നില്‍" + +#: ../src/pulse/channelmap.c:111 +msgid "Rear Center" +msgstr "മദ്ധ്യം അവസാനം" + +#: ../src/pulse/channelmap.c:112 +msgid "Rear Left" +msgstr "ഇടതു് അവസാനം" + +#: ../src/pulse/channelmap.c:113 +msgid "Rear Right" +msgstr "വലതു് അവസാനം" + +#: ../src/pulse/channelmap.c:115 +msgid "Low Frequency Emmiter" +msgstr "ലോ ഫ്രീക്വന്‍സി എമ്മിറ്റര്‍" + +#: ../src/pulse/channelmap.c:117 +msgid "Front Left-of-center" +msgstr "മുമ്പില്‍ ഇടതു് മദ്ധ്യം" + +#: ../src/pulse/channelmap.c:118 +msgid "Front Right-of-center" +msgstr "മുമ്പില്‍ വലതു് മദ്ധ്യം" + +#: ../src/pulse/channelmap.c:120 +msgid "Side Left" +msgstr "ഇടത്തു് വശം" + +#: ../src/pulse/channelmap.c:121 +msgid "Side Right" +msgstr "വലത്തു് വശം" + +#: ../src/pulse/channelmap.c:123 +msgid "Auxiliary 0" +msgstr "ഓക്സിലറി 0" + +#: ../src/pulse/channelmap.c:124 +msgid "Auxiliary 1" +msgstr "ഓക്സിലറി 1" + +#: ../src/pulse/channelmap.c:125 +msgid "Auxiliary 2" +msgstr "ഓക്സിലറി 2" + +#: ../src/pulse/channelmap.c:126 +msgid "Auxiliary 3" +msgstr "ഓക്സിലറി 3" + +#: ../src/pulse/channelmap.c:127 +msgid "Auxiliary 4" +msgstr "ഓക്സിലറി 4" + +#: ../src/pulse/channelmap.c:128 +msgid "Auxiliary 5" +msgstr "ഓക്സിലറി 5" + +#: ../src/pulse/channelmap.c:129 +msgid "Auxiliary 6" +msgstr "ഓക്സിലറി 6" + +#: ../src/pulse/channelmap.c:130 +msgid "Auxiliary 7" +msgstr "ഓക്സിലറി 7" + +#: ../src/pulse/channelmap.c:131 +msgid "Auxiliary 8" +msgstr "ഓക്സിലറി 8" + +#: ../src/pulse/channelmap.c:132 +msgid "Auxiliary 9" +msgstr "ഓക്സിലറി 9" + +#: ../src/pulse/channelmap.c:133 +msgid "Auxiliary 10" +msgstr "ഓക്സിലറി 10" + +#: ../src/pulse/channelmap.c:134 +msgid "Auxiliary 11" +msgstr "ഓക്സിലറി 11" + +#: ../src/pulse/channelmap.c:135 +msgid "Auxiliary 12" +msgstr "ഓക്സിലറി 12" + +#: ../src/pulse/channelmap.c:136 +msgid "Auxiliary 13" +msgstr "ഓക്സിലറി 13" + +#: ../src/pulse/channelmap.c:137 +msgid "Auxiliary 14" +msgstr "ഓക്സിലറി 14" + +#: ../src/pulse/channelmap.c:138 +msgid "Auxiliary 15" +msgstr "ഓക്സിലറി 15" + +#: ../src/pulse/channelmap.c:139 +msgid "Auxiliary 16" +msgstr "ഓക്സിലറി 16" + +#: ../src/pulse/channelmap.c:140 +msgid "Auxiliary 17" +msgstr "ഓക്സിലറി 17" + +#: ../src/pulse/channelmap.c:141 +msgid "Auxiliary 18" +msgstr "ഓക്സിലറി 18" + +#: ../src/pulse/channelmap.c:142 +msgid "Auxiliary 19" +msgstr "ഓക്സിലറി 19" + +#: ../src/pulse/channelmap.c:143 +msgid "Auxiliary 20" +msgstr "ഓക്സിലറി 20" + +#: ../src/pulse/channelmap.c:144 +msgid "Auxiliary 21" +msgstr "ഓക്സിലറി 21" + +#: ../src/pulse/channelmap.c:145 +msgid "Auxiliary 22" +msgstr "ഓക്സിലറി 22" + +#: ../src/pulse/channelmap.c:146 +msgid "Auxiliary 23" +msgstr "ഓക്സിലറി 23" + +#: ../src/pulse/channelmap.c:147 +msgid "Auxiliary 24" +msgstr "ഓക്സിലറി 24" + +#: ../src/pulse/channelmap.c:148 +msgid "Auxiliary 25" +msgstr "ഓക്സിലറി 25" + +#: ../src/pulse/channelmap.c:149 +msgid "Auxiliary 26" +msgstr "ഓക്സിലറി 26" + +#: ../src/pulse/channelmap.c:150 +msgid "Auxiliary 27" +msgstr "ഓക്സിലറി 27" + +#: ../src/pulse/channelmap.c:151 +msgid "Auxiliary 28" +msgstr "ഓക്സിലറി 28" + +#: ../src/pulse/channelmap.c:152 +msgid "Auxiliary 29" +msgstr "ഓക്സിലറി 29" + +#: ../src/pulse/channelmap.c:153 +msgid "Auxiliary 30" +msgstr "ഓക്സിലറി 30" + +#: ../src/pulse/channelmap.c:154 +msgid "Auxiliary 31" +msgstr "ഓക്സിലറി 31" + +#: ../src/pulse/channelmap.c:156 +msgid "Top Center" +msgstr "മുകളില്‍ മുമ്പില്‍" + +#: ../src/pulse/channelmap.c:158 +msgid "Top Front Center" +msgstr "മുകളില്‍ മുമ്പില്‍ മദ്ധ്യം" + +#: ../src/pulse/channelmap.c:159 +msgid "Top Front Left" +msgstr "മുകളില്‍ മുമ്പില്‍ ഇടത്തു്" + +#: ../src/pulse/channelmap.c:160 +msgid "Top Front Right" +msgstr "മുകളില്‍ മുമ്പില്‍ വലത്തു്" + +#: ../src/pulse/channelmap.c:162 +msgid "Top Rear Center" +msgstr "മുകളില്‍ അവസാനം മദ്ധ്യം" + +#: ../src/pulse/channelmap.c:163 +msgid "Top Rear Left" +msgstr "മുകളില്‍ അവസാനം ഇടത്തു്" + +#: ../src/pulse/channelmap.c:164 +msgid "Top Rear Right" +msgstr "മുകളില്‍ അവസാനം വലത്തു്" + +#: ../src/pulse/channelmap.c:484 ../src/pulse/sample.c:170 +#: ../src/pulse/volume.c:295 ../src/pulse/volume.c:321 +#: ../src/pulse/volume.c:341 ../src/pulse/volume.c:371 +msgid "(invalid)" +msgstr "(അസാധു)" + +#: ../src/pulse/channelmap.c:761 +msgid "Stereo" +msgstr "സ്റ്റീരിയോ" + +#: ../src/pulse/channelmap.c:766 +msgid "Surround 4.0" +msgstr "സറൌണ്ട് 4.0" + +#: ../src/pulse/channelmap.c:772 +msgid "Surround 4.1" +msgstr "സറൌണ്ട് 4.1" + +#: ../src/pulse/channelmap.c:778 +msgid "Surround 5.0" +msgstr "സറൌണ്ട് 5.0" + +#: ../src/pulse/channelmap.c:784 +msgid "Surround 5.1" +msgstr "സറൌണ്ട് 5.1" + +#: ../src/pulse/channelmap.c:791 +msgid "Surround 7.1" +msgstr "സറൌണ്ട് 7.1" + +#: ../src/pulse/error.c:43 +msgid "OK" +msgstr "ശരി" + +#: ../src/pulse/error.c:44 +msgid "Access denied" +msgstr "അനുമതി നിഷേധിച്ചിരിക്കുന്നു" + +#: ../src/pulse/error.c:45 +msgid "Unknown command" +msgstr "അപരിചിതമായ കമാന്‍ഡ്" + +#: ../src/pulse/error.c:46 +msgid "Invalid argument" +msgstr "തെറ്റായ ആര്‍ഗ്യുമെന്റ്" + +#: ../src/pulse/error.c:47 +msgid "Entity exists" +msgstr "എന്റിറ്റി നിലവിലുണ്ടു്" + +#: ../src/pulse/error.c:48 +msgid "No such entity" +msgstr "അത്തരം എന്റിറ്റിയില്ല" + +#: ../src/pulse/error.c:49 +msgid "Connection refused" +msgstr "കണക്ഷന്‍ നിഷേധിച്ചിരിക്കുന്നു" + +#: ../src/pulse/error.c:50 +msgid "Protocol error" +msgstr "പ്രോട്ടോക്കോളില്‍ പിശക്" + +#: ../src/pulse/error.c:51 +msgid "Timeout" +msgstr "സമയം കഴിഞ്ഞിരിക്കുന്നു" + +#: ../src/pulse/error.c:52 +msgid "No authorization key" +msgstr "ഓഥറൈസേഷന്‍ കീ നിലവിലില്ല" + +#: ../src/pulse/error.c:53 +msgid "Internal error" +msgstr "ആന്തരിക പിശക്" + +#: ../src/pulse/error.c:54 +msgid "Connection terminated" +msgstr "കണക്ഷന്‍ വിഛേദിച്ചിരിക്കുന്നു" + +#: ../src/pulse/error.c:55 +msgid "Entity killed" +msgstr "എന്റിറ്റി ഇല്ലാതാക്കിയിരിക്കുന്നു" + +#: ../src/pulse/error.c:56 +msgid "Invalid server" +msgstr "തെറ്റായ സര്‍വര്‍" + +#: ../src/pulse/error.c:57 +msgid "Module initalization failed" +msgstr "ഘടകം ആരംഭിക്കുന്നതില്‍ പരാജയപ്പെട്ടു" + +#: ../src/pulse/error.c:58 +msgid "Bad state" +msgstr "തെറ്റായ അവസ്ഥ" + +#: ../src/pulse/error.c:59 +msgid "No data" +msgstr "ഡേറ്റാ ലഭ്യമല്ല" + +#: ../src/pulse/error.c:60 +msgid "Incompatible protocol version" +msgstr "പൊരുത്തപ്പെടാത്ത പ്രോട്ടോക്കോള്‍ പതിപ്പു്" + +#: ../src/pulse/error.c:61 +msgid "Too large" +msgstr "വളരെ വലുതു്" + +#: ../src/pulse/error.c:62 +msgid "Not supported" +msgstr "പിന്തുണ ലഭ്യമല്ല" + +#: ../src/pulse/error.c:63 +msgid "Unknown error code" +msgstr "അപരിചിതമായ പിശക് കോഡ്" + +#: ../src/pulse/error.c:64 +msgid "No such extension" +msgstr "അത്തരം എക്സ്റ്റെന്‍ഷന്‍ ലഭ്യമല്ല" + +#: ../src/pulse/error.c:65 +msgid "Obsolete functionality" +msgstr "ഇല്ലാതാക്കിയ വിശേഷത" + +#: ../src/pulse/error.c:66 +msgid "Missing implementation" +msgstr "പ്രവര്‍ത്തനം ലഭ്യമല്ല" + +#: ../src/pulse/error.c:67 +msgid "Client forked" +msgstr "ക്ലൈന്റ് ഫോര്‍ക്ക് ചെയ്തിരിക്കുന്നു" + +#: ../src/pulse/error.c:68 +msgid "Input/Output error" +msgstr "ഇന്‍പുട്ട്/ഔട്ട്പുട്ട് പിശക്" + +#: ../src/pulse/error.c:69 +msgid "Device or resource busy" +msgstr "ഉപകരണം അല്ലെങ്കില്‍ ഉറവിടം ഉപയോഗത്തില്‍" + +#: ../src/pulse/sample.c:172 +#, c-format +msgid "%s %uch %uHz" +msgstr "%s %uch %uHz" + +#: ../src/pulse/sample.c:184 +#, c-format +msgid "%0.1f GiB" +msgstr "%0.1f GiB" + +#: ../src/pulse/sample.c:186 +#, c-format +msgid "%0.1f MiB" +msgstr "%0.1f MiB" + +#: ../src/pulse/sample.c:188 +#, c-format +msgid "%0.1f KiB" +msgstr "%0.1f KiB" + +#: ../src/pulse/sample.c:190 +#, c-format +msgid "%u B" +msgstr "%u B" + +#: ../src/pulse/client-conf-x11.c:55 ../src/utils/pax11publish.c:100 +msgid "XOpenDisplay() failed" +msgstr "XOpenDisplay() പരാജയപ്പെട്ടു" + +#: ../src/pulse/client-conf-x11.c:93 +msgid "Failed to parse cookie data" +msgstr "കുക്കി ഡേറ്റാ പാഴ്സ് ചെയ്യുന്നതില്‍ പരാജയപ്പെട്ടു" + +#: ../src/pulse/client-conf.c:111 +#, c-format +msgid "Failed to open configuration file '%s': %s" +msgstr "ക്രമീകരണ ഫയല്‍ '%s' തുറക്കുന്നതില്‍ പരാജയപ്പെട്ടു: %s" + +#: ../src/pulse/context.c:550 +msgid "No cookie loaded. Attempting to connect without." +msgstr "ഒരു കുക്കിയും ലഭ്യമല്ല. അതില്ലാതെ കണക്ട് ചെയ്യുവാന്‍‌ ശ്രമിക്കുന്നു." + +#: ../src/pulse/context.c:693 +#, c-format +msgid "fork(): %s" +msgstr "fork(): %s" + +#: ../src/pulse/context.c:748 +#, c-format +msgid "waitpid(): %s" +msgstr "waitpid(): %s" + +#: ../src/pulse/context.c:1438 +#, c-format +msgid "Received message for unknown extension '%s'" +msgstr "അപരിചിതമായ എക്സ്റ്റെന്‍ഷന്‍ '%s'-നുള്ള സന്ദേശം ലഭിച്ചിരിക്കുന്നു" + +#: ../src/utils/pacat.c:108 +#, c-format +msgid "Failed to drain stream: %s" +msgstr "സ്ട്രീം ഡ്രെയിന്‍ ചെയ്യുന്നതില്‍ പരാജയപ്പെട്ടു: %s" + +#: ../src/utils/pacat.c:113 +msgid "Playback stream drained." +msgstr "പ്ലേബാക്ക് സ്ട്രീം ഡ്രെയിന്‍ ചെയ്തിരിക്കുന്നു." + +#: ../src/utils/pacat.c:123 +msgid "Draining connection to server." +msgstr "സര്‍വറിലേക്കുള്ള കണക്ഷന്‍ ഡ്രെയിന്‍ ചെയ്യുന്നു." + +#: ../src/utils/pacat.c:136 +#, c-format +msgid "pa_stream_drain(): %s" +msgstr "pa_stream_drain(): %s" + +#: ../src/utils/pacat.c:159 +#, c-format +msgid "pa_stream_write() failed: %s" +msgstr "pa_stream_write() പരാജയപ്പെട്ടു: %s" + +#: ../src/utils/pacat.c:197 +#, c-format +msgid "pa_stream_begin_write() failed: %s" +msgstr "pa_stream_begin_write() പരാജയപ്പെട്ടു: %s" + +#: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267 +#, c-format +msgid "pa_stream_peek() failed: %s" +msgstr "pa_stream_peek() പരാജയപ്പെട്ടു: %s" + +#: ../src/utils/pacat.c:307 +msgid "Stream successfully created." +msgstr "സ്ട്രീം വിജയകരമായി ഉണ്ടാക്കിയിരിക്കുന്നു." + +#: ../src/utils/pacat.c:310 +#, c-format +msgid "pa_stream_get_buffer_attr() failed: %s" +msgstr "pa_stream_get_buffer_attr() പരാജയപ്പെട്ടു: %s" + +#: ../src/utils/pacat.c:314 +#, c-format +msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u" +msgstr "ബഫര്‍ മെട്രിക്സ്: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u" + +#: ../src/utils/pacat.c:317 +#, c-format +msgid "Buffer metrics: maxlength=%u, fragsize=%u" +msgstr "ബഫര്‍ മെട്രിക്സ്: maxlength=%u, fragsize=%u" + +#: ../src/utils/pacat.c:321 +#, c-format +msgid "Using sample spec '%s', channel map '%s'." +msgstr "സാംപിള്‍ സ്പെക് '%s', ചാനല്‍ മാപ്പ് '%s' ഉപയോഗിക്കുന്നു." + +#: ../src/utils/pacat.c:325 +#, c-format +msgid "Connected to device %s (%u, %ssuspended)." +msgstr "ഡിവൈസ് %s-ലേക്ക് കണക്ട് ചെയ്തിരിക്കുന്നു (%u, %ssuspended)." + +#: ../src/utils/pacat.c:335 +#, c-format +msgid "Stream error: %s" +msgstr "സ്ട്രീം പിശക്: %s" + +#: ../src/utils/pacat.c:345 +#, c-format +msgid "Stream device suspended.%s" +msgstr "സ്ട്രീം ഡിവൈസ് സസ്പെന്‍ഡ് ചെയ്തിരിക്കുന്നു.%s" + +#: ../src/utils/pacat.c:347 +#, c-format +msgid "Stream device resumed.%s" +msgstr "സ്ട്രീം ഡിവൈസ് വീണ്ടും ആരംഭിച്ചിരിക്കുന്നു.%s" + +#: ../src/utils/pacat.c:355 +#, c-format +msgid "Stream underrun.%s" +msgstr "സ്ട്രീം അണ്ടര്‍റണ്‍.%s" + +#: ../src/utils/pacat.c:362 +#, c-format +msgid "Stream overrun.%s" +msgstr "സ്ട്രീ ഓവര്‍റണ്‍.%s" + +#: ../src/utils/pacat.c:369 +#, c-format +msgid "Stream started.%s" +msgstr "സ്ട്രീം ആരംഭിച്ചിരിക്കുന്നു.%s" + +#: ../src/utils/pacat.c:376 +#, c-format +msgid "Stream moved to device %s (%u, %ssuspended).%s" +msgstr "ഡിവൈസ് %s-ലേക്ക് സ്ട്രീം നീക്കം ചെയ്തിരിക്കുന്നു (%u, %ssuspended).%s" + +#: ../src/utils/pacat.c:376 +msgid "not " +msgstr "അല്ല" + +#: ../src/utils/pacat.c:383 +#, c-format +msgid "Stream buffer attributes changed.%s" +msgstr "സ്ട്രീം ബഫര്‍ വിശേഷതകള്‍ മാറ്റിയിരിക്കുന്നു.%s" + +#: ../src/utils/pacat.c:415 +#, c-format +msgid "Connection established.%s" +msgstr "കണക്ഷന്‍ സ്ഥാപിച്ചിരിക്കുന്നു.%s" + +#: ../src/utils/pacat.c:418 +#, c-format +msgid "pa_stream_new() failed: %s" +msgstr "pa_stream_new() പരാജയപ്പെട്ടു: %s" + +#: ../src/utils/pacat.c:450 +#, c-format +msgid "pa_stream_connect_playback() failed: %s" +msgstr "pa_stream_connect_playback() പരാജയപ്പെട്ടു: %s" + +#: ../src/utils/pacat.c:456 +#, c-format +msgid "pa_stream_connect_record() failed: %s" +msgstr "pa_stream_connect_record() പരാജയപ്പെട്ടു: %s" + +#: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857 +#, c-format +msgid "Connection failure: %s" +msgstr "കണക്ഷനില്‍ തകരാര്‍: %s" + +#: ../src/utils/pacat.c:503 +msgid "Got EOF." +msgstr "EOF ലഭ്യമായിരിക്കുന്നു" + +#: ../src/utils/pacat.c:540 +#, c-format +msgid "write() failed: %s" +msgstr "write() പരാജയപ്പെട്ടു: %s" + +#: ../src/utils/pacat.c:561 +msgid "Got signal, exiting." +msgstr "സിഗ്നല്‍ ലഭ്യമായി, പുറത്തു് കടക്കുന്നു." + +#: ../src/utils/pacat.c:575 +#, c-format +msgid "Failed to get latency: %s" +msgstr "ലാറ്റന്‍സി ലഭ്യമാക്കുന്നതില്‍ പരാജയപ്പെട്ടു: %s" + +#: ../src/utils/pacat.c:580 +#, c-format +msgid "Time: %0.3f sec; Latency: %0.0f usec." +msgstr "സമയം: %0.3f sec; ലാറ്റന്‍സി: %0.0f usec." + +#: ../src/utils/pacat.c:599 +#, c-format +msgid "pa_stream_update_timing_info() failed: %s" +msgstr "pa_stream_update_timing_info() പരാജയപ്പെട്ടു: %s" + +#: ../src/utils/pacat.c:609 +#, c-format +msgid "" +"%s [options]\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -r, --record Create a connection for recording\n" +" -p, --playback Create a connection for playback\n" +"\n" +" -v, --verbose Enable verbose operations\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -d, --device=DEVICE The name of the sink/source to " +"connect to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" +" --stream-name=NAME How to call this stream on the " +"server\n" +" --volume=VOLUME Specify the initial (linear) volume " +"in range 0...65536\n" +" --rate=SAMPLERATE The sample rate in Hz (defaults to " +"44100)\n" +" --format=SAMPLEFORMAT The sample type, one of s16le, " +"s16be, u8, float32le,\n" +" float32be, ulaw, alaw, s32le, s32be, " +"s24le, s24be,\n" +" s24-32le, s24-32be (defaults to " +"s16ne)\n" +" --channels=CHANNELS The number of channels, 1 for mono, " +"2 for stereo\n" +" (defaults to 2)\n" +" --channel-map=CHANNELMAP Channel map to use instead of the " +"default\n" +" --fix-format Take the sample format from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-rate Take the sampling rate from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-channels Take the number of channels and the " +"channel map\n" +" from the sink the stream is being " +"connected to.\n" +" --no-remix Don't upmix or downmix channels.\n" +" --no-remap Map channels by index instead of " +"name.\n" +" --latency=BYTES Request the specified latency in " +"bytes.\n" +" --process-time=BYTES Request the specified process time " +"per request in bytes.\n" +" --property=PROPERTY=VALUE Set the specified property to the " +"specified value.\n" +" --raw Record/play raw PCM data.\n" +" --file-format=FFORMAT Record/play formatted PCM data.\n" +" --list-file-formats List available file formats.\n" +msgstr "" +"%s [options]\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -r, --record Create a connection for recording\n" +" -p, --playback Create a connection for playback\n" +"\n" +" -v, --verbose Enable verbose operations\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -d, --device=DEVICE The name of the sink/source to " +"connect to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" +" --stream-name=NAME How to call this stream on the " +"server\n" +" --volume=VOLUME Specify the initial (linear) volume " +"in range 0...65536\n" +" --rate=SAMPLERATE The sample rate in Hz (defaults to " +"44100)\n" +" --format=SAMPLEFORMAT The sample type, one of s16le, " +"s16be, u8, float32le,\n" +" float32be, ulaw, alaw, s32le, s32be, " +"s24le, s24be,\n" +" s24-32le, s24-32be (defaults to " +"s16ne)\n" +" --channels=CHANNELS The number of channels, 1 for mono, " +"2 for stereo\n" +" (defaults to 2)\n" +" --channel-map=CHANNELMAP Channel map to use instead of the " +"default\n" +" --fix-format Take the sample format from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-rate Take the sampling rate from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-channels Take the number of channels and the " +"channel map\n" +" from the sink the stream is being " +"connected to.\n" +" --no-remix Don't upmix or downmix channels.\n" +" --no-remap Map channels by index instead of " +"name.\n" +" --latency=BYTES Request the specified latency in " +"bytes.\n" +" --process-time=BYTES Request the specified process time " +"per request in bytes.\n" +" --property=PROPERTY=VALUE Set the specified property to the " +"specified value.\n" +" --raw Record/play raw PCM data.\n" +" --file-format=FFORMAT Record/play formatted PCM data.\n" +" --list-file-formats List available file formats.\n" + +#: ../src/utils/pacat.c:731 +#, c-format +msgid "" +"pacat %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pacat %s\n" +"libpulse %s-നൊപ്പം കംപൈല്‍ ചെയ്തിരിക്കുന്നു\n" +"libpulse %s-നൊപ്പം ലിങ്ക് ചെയ്തിരിക്കുന്നു\n" + +#: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953 +#, c-format +msgid "Invalid client name '%s'" +msgstr "തെറ്റായ ക്ലൈന്റ് നാമം '%s'" + +#: ../src/utils/pacat.c:779 +#, c-format +msgid "Invalid stream name '%s'" +msgstr "തെറ്റായ സ്ട്രീം നാമം '%s'" + +#: ../src/utils/pacat.c:816 +#, c-format +msgid "Invalid channel map '%s'" +msgstr "തെറ്റായ ചാനല്‍ മാപ്പ് '%s'" + +#: ../src/utils/pacat.c:845 +#, c-format +msgid "Invalid latency specification '%s'" +msgstr "തെറ്റായ ലാറ്റന്‍സി വിവരണം '%s'" + +#: ../src/utils/pacat.c:852 +#, c-format +msgid "Invalid process time specification '%s'" +msgstr "തെറ്റായ പ്രക്രിയ സമയ വിവരണം '%s'" + +#: ../src/utils/pacat.c:864 +#, c-format +msgid "Invalid property '%s'" +msgstr "തെറ്റായ വിശേഷത '%s'" + +#: ../src/utils/pacat.c:881 +#, c-format +msgid "Unknown file format %s." +msgstr "അപരിചിതമായ ഫയല്‍ രീതി %s." + +#: ../src/utils/pacat.c:900 +msgid "Invalid sample specification" +msgstr "തെറ്റായ മാതൃക വിവരണം" + +#: ../src/utils/pacat.c:910 +#, c-format +msgid "open(): %s" +msgstr "open(): %s" + +#: ../src/utils/pacat.c:915 +#, c-format +msgid "dup2(): %s" +msgstr "dup2(): %s" + +#: ../src/utils/pacat.c:922 +msgid "Too many arguments." +msgstr "അനവധി ആര്‍ഗ്യുമെന്റുകള്‍." + +#: ../src/utils/pacat.c:933 +msgid "Failed to generate sample specification for file." +msgstr "ഫയലിനുള്ള സാംപിള്‍ വിവരണം ലഭ്യമാക്കുന്നതില്‍ പരാജയപ്പെട്ടു." + +#: ../src/utils/pacat.c:953 +msgid "Failed to open audio file." +msgstr "ഓ‍ഡിയോ ഫയല്‍ തുറക്കുന്നതില്‍ പരാജയപ്പെട്ടു." + +#: ../src/utils/pacat.c:959 +msgid "" +"Warning: specified sample specification will be overwritten with " +"specification from file." +msgstr "" +"മുന്നറിയിപ്പു്: ഫയലില്‍ നിന്നുള്ള വിവരണം വ്യക്തമാക്കിയിരിക്കുന്ന സാംപിള്‍ വിവരണം മാറ്റിയെഴുതുന്നു." + +#: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997 +msgid "Failed to determine sample specification from file." +msgstr "ഫയലില്‍ നിന്നും സാംപിള്‍ വിവരണം ലഭ്യമാക്കുന്നതില്‍ പരാജയപ്പെട്ടു." + +#: ../src/utils/pacat.c:971 +msgid "Warning: Failed to determine channel map from file." +msgstr "മുന്നറിയിപ്പു്: ഫയലില്‍ നിന്നും ചാനല്‍ മാപ്പ് ലഭ്യമാക്കുന്നതില്‍ പരാജയപ്പെട്ടു." + +#: ../src/utils/pacat.c:982 +msgid "Channel map doesn't match sample specification" +msgstr "ചാനല്‍ മാപ്പ് സാംപിള്‍ വിവരണവുമായി ചേരുന്നില്ല" + +#: ../src/utils/pacat.c:993 +msgid "Warning: failed to write channel map to file." +msgstr "മുന്നറിയിപ്പു്: ഫയലിലേക്ക് ചാനല്‍ മാപ്പ് സൂക്ഷിക്കുന്നതില്‍ പരാജയപ്പെട്ടു." + +#: ../src/utils/pacat.c:1008 +#, c-format +msgid "" +"Opening a %s stream with sample specification '%s' and channel map '%s'." +msgstr "%s സ്ട്രീം തുറക്കുന്നു. ഇതിന്റെ സാംപിള്‍ വിവരണം '%s'-ഉം ചാനല്‍ മാപ്പ് '%s'-ഉം ആണു്." + +#: ../src/utils/pacat.c:1009 +msgid "recording" +msgstr "റിക്കോര്‍ഡ് ചെയ്യുന്നു" + +#: ../src/utils/pacat.c:1009 +msgid "playback" +msgstr "പ്ലേബാക്ക്" + +#: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267 +msgid "pa_mainloop_new() failed." +msgstr "pa_mainloop_new() പരാജയപ്പെട്ടു." + +#: ../src/utils/pacat.c:1054 +msgid "io_new() failed." +msgstr "io_new() പരാജയപ്പെട്ടു." + +#: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279 +msgid "pa_context_new() failed." +msgstr "pa_context_new() പരാജയപ്പെട്ടു." + +#: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285 +#, c-format +msgid "pa_context_connect() failed: %s" +msgstr "pa_context_connect() പരാജയപ്പെട്ടു: %s" + +#: ../src/utils/pacat.c:1075 +msgid "pa_context_rttime_new() failed." +msgstr "pa_context_rttime_new() പരാജയപ്പെട്ടു." + +#: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290 +msgid "pa_mainloop_run() failed." +msgstr "pa_mainloop_run() പരാജയപ്പെട്ടു." + +#: ../src/utils/pasuspender.c:81 +#, c-format +msgid "fork(): %s\n" +msgstr "fork(): %s\n" + +#: ../src/utils/pasuspender.c:92 +#, c-format +msgid "execvp(): %s\n" +msgstr "execvp(): %s\n" + +#: ../src/utils/pasuspender.c:109 +#, c-format +msgid "Failure to suspend: %s\n" +msgstr "സസ്പെന്‍ഡ് ചെയ്യുന്നതില്‍ പരാജയപ്പെട്ടു: %s\n" + +#: ../src/utils/pasuspender.c:124 +#, c-format +msgid "Failure to resume: %s\n" +msgstr "വീണ്ടും ആരംഭിക്കുന്നതില്‍ പരാജയപ്പെട്ടു: %s\n" + +#: ../src/utils/pasuspender.c:147 +#, c-format +msgid "WARNING: Sound server is not local, not suspending.\n" +msgstr "മുന്നറിയിപ്പു്: ശബ്ദ സര്‍വര്‍ ലോക്കലല്ല, സസ്പെന്‍ഡ് ചെയ്യുന്നില്ല.\n" + +#: ../src/utils/pasuspender.c:159 +#, c-format +msgid "Connection failure: %s\n" +msgstr "കണക്ഷനില്‍ തകരാര്‍: %s\n" + +#: ../src/utils/pasuspender.c:176 +#, c-format +msgid "Got SIGINT, exiting.\n" +msgstr "SIGINT ലഭിച്ചു, പുറത്തു് കടക്കുന്നു.\n" + +#: ../src/utils/pasuspender.c:194 +#, c-format +msgid "WARNING: Child process terminated by signal %u\n" +msgstr "മുന്നറിയിപ്പു്: %u സിഗ്നല്‍ വഴി ചൈള്‍ പ്രക്രിയ അവസാനിച്ചിരിക്കുന്നു\n" + +#: ../src/utils/pasuspender.c:212 +#, c-format +msgid "" +"%s [options] ... \n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +"\n" +msgstr "" +"%s [options] ... \n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +"\n" + +#: ../src/utils/pasuspender.c:248 +#, c-format +msgid "" +"pasuspender %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pasuspender %s\n" +"libpulse %s-നൊപ്പം കംപൈല്‍ ചെയ്തിരിക്കുന്നു\n" +"libpulse %s-നൊപ്പം ലിങ്ക് ചെയ്തിരിക്കുന്നു\n" + +#: ../src/utils/pasuspender.c:277 +#, c-format +msgid "pa_mainloop_new() failed.\n" +msgstr "pa_mainloop_new() പരാജയപ്പെട്ടു.\n" + +#: ../src/utils/pasuspender.c:290 +#, c-format +msgid "pa_context_new() failed.\n" +msgstr "pa_context_new() പരാജയപ്പെട്ടു..\n" + +#: ../src/utils/pasuspender.c:298 +#, c-format +msgid "pa_mainloop_run() failed.\n" +msgstr "pa_mainloop_run() പരാജയപ്പെട്ടു.\n" + +#: ../src/utils/pactl.c:135 +#, c-format +msgid "Failed to get statistics: %s" +msgstr "സ്ഥിതിവിവരക്കണക്കുകള്‍ ലഭ്യമാക്കുന്നതില്‍ പരാജയപ്പെട്ടു: %s" + +#: ../src/utils/pactl.c:141 +#, c-format +msgid "Currently in use: %u blocks containing %s bytes total.\n" +msgstr "നിലവില്‍ ഉപയോഗത്തില്‍: %u ബ്ലോക്കുകള്‍, മൊത്തം %s ബൈറ്റുകള്‍ അടങ്ങുന്നു.\n" + +#: ../src/utils/pactl.c:144 +#, c-format +msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n" +msgstr "കാലാവധിയ്ക്കുള്ളില്‍ അനുവദിക്കുന്നു: %u ബ്ലോക്കുകള്‍, മൊത്തം %s ബൈറ്റുകള്‍ അടങ്ങുന്നു.\n" + +#: ../src/utils/pactl.c:147 +#, c-format +msgid "Sample cache size: %s\n" +msgstr "സാംപിള്‍ കാഷ് വ്യപ്തി: %s\n" + +#: ../src/utils/pactl.c:156 +#, c-format +msgid "Failed to get server information: %s" +msgstr "സര്‍വര്‍ വിവരങ്ങള്‍ ലഭ്യമാക്കുന്നതില്‍ പരാജയപ്പെട്ടു: %s" + +#: ../src/utils/pactl.c:164 +#, c-format +msgid "" +"User name: %s\n" +"Host Name: %s\n" +"Server Name: %s\n" +"Server Version: %s\n" +"Default Sample Specification: %s\n" +"Default Channel Map: %s\n" +"Default Sink: %s\n" +"Default Source: %s\n" +"Cookie: %08x\n" +msgstr "" +"User name: %s\n" +"Host Name: %s\n" +"Server Name: %s\n" +"Server Version: %s\n" +"Default Sample Specification: %s\n" +"Default Channel Map: %s\n" +"Default Sink: %s\n" +"Default Source: %s\n" +"Cookie: %08x\n" + +#: ../src/utils/pactl.c:205 +#, c-format +msgid "Failed to get sink information: %s" +msgstr "സിങ്ക് വിവരം ലഭ്യമാക്കുന്നതില്‍ പരാജയപ്പെട്ടു: %s" + +#: ../src/utils/pactl.c:221 +#, c-format +msgid "" +"Sink #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor Source: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Sink #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor Source: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360 +#, c-format +msgid "\tPorts:\n" +msgstr "\tപോര്‍ട്ടുകള്‍:\n" + +#: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366 +#, c-format +msgid "\tActive Port: %s\n" +msgstr "\tസജീവമായ പോര്‍ട്ട്: %s\n" + +#: ../src/utils/pactl.c:297 +#, c-format +msgid "Failed to get source information: %s" +msgstr "സോഴ്സ് വിവരങ്ങള്‍ ലഭ്യമാക്കുന്നതില്‍ പരാജയപ്പെട്ടു: %s" + +#: ../src/utils/pactl.c:313 +#, c-format +msgid "" +"Source #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor of Sink: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Source #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor of Sink: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:345 ../src/utils/pactl.c:401 ../src/utils/pactl.c:436 +#: ../src/utils/pactl.c:473 ../src/utils/pactl.c:532 ../src/utils/pactl.c:533 +#: ../src/utils/pactl.c:543 ../src/utils/pactl.c:587 ../src/utils/pactl.c:588 +#: ../src/utils/pactl.c:594 ../src/utils/pactl.c:637 ../src/utils/pactl.c:638 +#: ../src/utils/pactl.c:645 +msgid "n/a" +msgstr "n/a" + +#: ../src/utils/pactl.c:375 +#, c-format +msgid "Failed to get module information: %s" +msgstr "ഘടക വിവരങ്ങള്‍ ലഭ്യമാക്കുന്നതില്‍ പരാജയപ്പെട്ടു: %s" + +#: ../src/utils/pactl.c:393 +#, c-format +msgid "" +"Module #%u\n" +"\tName: %s\n" +"\tArgument: %s\n" +"\tUsage counter: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Module #%u\n" +"\tName: %s\n" +"\tArgument: %s\n" +"\tUsage counter: %s\n" +"\tProperties:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:412 +#, c-format +msgid "Failed to get client information: %s" +msgstr "ക്ലൈന്റ് വിവരങ്ങള്‍ ലഭ്യമാക്കുന്നതില്‍ പരാജയപ്പെട്ടു: %s" + +#: ../src/utils/pactl.c:430 +#, c-format +msgid "" +"Client #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Client #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:447 +#, c-format +msgid "Failed to get card information: %s" +msgstr "കാര്‍ഡ് വിവരങ്ങള്‍ ലഭ്യമാക്കുന്നതില്‍ പരാജയപ്പെട്ടു: %s" + +#: ../src/utils/pactl.c:465 +#, c-format +msgid "" +"Card #%u\n" +"\tName: %s\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Card #%u\n" +"\tName: %s\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:479 +#, c-format +msgid "\tProfiles:\n" +msgstr "\tപ്രൊഫൈലുകള്‍:\n" + +#: ../src/utils/pactl.c:485 +#, c-format +msgid "\tActive Profile: %s\n" +msgstr "\tസജീവമായ പ്രൊഫൈല്‍: %s\n" + +#: ../src/utils/pactl.c:496 +#, c-format +msgid "Failed to get sink input information: %s" +msgstr "സിങ്ക് ഇന്‍പുട്ട് വിവരങ്ങള്‍ ലഭ്യമാക്കുന്നതില്‍ പരാജയപ്പെട്ടു: %s" + +#: ../src/utils/pactl.c:515 +#, c-format +msgid "" +"Sink Input #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSink: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tMute: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSink Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Sink Input #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSink: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tMute: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSink Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:554 +#, c-format +msgid "Failed to get source output information: %s" +msgstr "സോഴ്സ് ഔട്ട്പുട്ട് വിവരം ലഭ്യമാക്കുന്നതില്‍ പരാജയപ്പെട്ടു: %s" + +#: ../src/utils/pactl.c:574 +#, c-format +msgid "" +"Source Output #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSource: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSource Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Source Output #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSource: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSource Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:605 +#, c-format +msgid "Failed to get sample information: %s" +msgstr "മാതൃകയുടെ വിവരങ്ങള്‍ ലഭ്യമാക്കുന്നതില്‍ പരാജയപ്പെട്ടു: %s" + +#: ../src/utils/pactl.c:623 +#, c-format +msgid "" +"Sample #%u\n" +"\tName: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tDuration: %0.1fs\n" +"\tSize: %s\n" +"\tLazy: %s\n" +"\tFilename: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Sample #%u\n" +"\tName: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tDuration: %0.1fs\n" +"\tSize: %s\n" +"\tLazy: %s\n" +"\tFilename: %s\n" +"\tProperties:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663 +#, c-format +msgid "Failure: %s" +msgstr "പരാജയം: %s" + +#: ../src/utils/pactl.c:687 +#, c-format +msgid "Failed to upload sample: %s" +msgstr "മാതൃക അപ്ലോഡ് ചെയ്യുന്നതില്‍ പരാജയപ്പെട്ടു: %s" + +#: ../src/utils/pactl.c:704 +msgid "Premature end of file" +msgstr "ഫയല്‍ അനുചിതമായ അവസാനം" + +#: ../src/utils/pactl.c:863 +msgid "Got SIGINT, exiting." +msgstr "SIGINT ലഭ്യമായി, പുറത്തു് കടക്കുന്നു." + +#: ../src/utils/pactl.c:869 +#, c-format +msgid "" +"%s [options] stat\n" +"%s [options] list\n" +"%s [options] exit\n" +"%s [options] upload-sample FILENAME [NAME]\n" +"%s [options] play-sample NAME [SINK]\n" +"%s [options] remove-sample NAME\n" +"%s [options] move-sink-input SINKINPUT SINK\n" +"%s [options] move-source-output SOURCEOUTPUT SOURCE\n" +"%s [options] load-module NAME [ARGS ...]\n" +"%s [options] unload-module MODULE\n" +"%s [options] suspend-sink SINK 1|0\n" +"%s [options] suspend-source SOURCE 1|0\n" +"%s [options] set-card-profile CARD PROFILE\n" +"%s [options] set-sink-port SINK PORT\n" +"%s [options] set-source-port SOURCE PORT\n" +"%s [options] set-sink-volume SINK VOLUME\n" +"%s [options] set-source-volume SOURCE VOLUME\n" +"%s [options] set-sink-input-volume SINKINPUT VOLUME\n" +"%s [options] set-sink-mute SINK 1|0\n" +"%s [options] set-source-mute SOURCE 1|0\n" +"%s [options] set-sink-input-mute SINKINPUT 1|0\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" +msgstr "" +"%s [options] stat\n" +"%s [options] list\n" +"%s [options] exit\n" +"%s [options] upload-sample FILENAME [NAME]\n" +"%s [options] play-sample NAME [SINK]\n" +"%s [options] remove-sample NAME\n" +"%s [options] move-sink-input SINKINPUT SINK\n" +"%s [options] move-source-output SOURCEOUTPUT SOURCE\n" +"%s [options] load-module NAME [ARGS ...]\n" +"%s [options] unload-module MODULE\n" +"%s [options] suspend-sink SINK 1|0\n" +"%s [options] suspend-source SOURCE 1|0\n" +"%s [options] set-card-profile CARD PROFILE\n" +"%s [options] set-sink-port SINK PORT\n" +"%s [options] set-source-port SOURCE PORT\n" +"%s [options] set-sink-volume SINK VOLUME\n" +"%s [options] set-source-volume SOURCE VOLUME\n" +"%s [options] set-sink-input-volume SINKINPUT VOLUME\n" +"%s [options] set-sink-mute SINK 1|0\n" +"%s [options] set-source-mute SOURCE 1|0\n" +"%s [options] set-sink-input-mute SINKINPUT 1|0\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" + +#: ../src/utils/pactl.c:933 +#, c-format +msgid "" +"pactl %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pactl %s\n" +"libpulse %s-നൊപ്പം കംപൈല്‍ ചെയ്തിരിക്കുന്നു\n" +"libpulse %s-നൊപ്പം ലിങ്ക് ചെയ്തിരിക്കുന്നു\n" + +#: ../src/utils/pactl.c:979 +msgid "Please specify a sample file to load" +msgstr "ലഭ്യമാക്കുന്നതിലുള്ള മാതൃകാ ഫയല്‍ ദയവായി വ്യക്തമാക്കുക" + +#: ../src/utils/pactl.c:992 +msgid "Failed to open sound file." +msgstr "ശബ്ദ ഫയല്‍ തുറക്കുന്നതില്‍ പരാജയപ്പെട്ടു." + +#: ../src/utils/pactl.c:1004 +msgid "Warning: Failed to determine sample specification from file." +msgstr "മുന്നറിയിപ്പു്: ഫയലില്‍ നിന്നും മാതൃകയുടെ വിവരണം കണ്ടുപിടിക്കുന്നതില്‍ പരാജയപ്പെട്ടു." + +#: ../src/utils/pactl.c:1014 +msgid "You have to specify a sample name to play" +msgstr "പ്രവര്‍ത്തിപ്പിക്കുവാനുള്ള മാതൃകയുടെ പേരു് നല്‍കേണ്ടതുണ്ടു്" + +#: ../src/utils/pactl.c:1026 +msgid "You have to specify a sample name to remove" +msgstr "നീക്കം ചെയ്യുന്നതിനുള്ള മാതൃകയുടെ പേരു് നല്‍കേണ്ടതുണ്ടു്" + +#: ../src/utils/pactl.c:1035 +msgid "You have to specify a sink input index and a sink" +msgstr "ഒരു സിങ്ക് ഇന്‍പുട്ട് ഇന്‍ഡക്സും സിങ്കും നല്‍കേണ്ടതുണ്ടു്" + +#: ../src/utils/pactl.c:1045 +msgid "You have to specify a source output index and a source" +msgstr "ഒരു സോഴ്സ് ഔട്ട്പുട്ട് ഇന്‍ഡക്സും സോഴ്സും നല്‍കേണ്ടതുണ്ടു്" + +#: ../src/utils/pactl.c:1060 +msgid "You have to specify a module name and arguments." +msgstr "ഒരു മൌഡ്യൂള്‍ നാമവും ആര്‍ഗ്യുമെന്റുകളും നല്‍കേണ്ടതുണ്ടു്." + +#: ../src/utils/pactl.c:1080 +msgid "You have to specify a module index" +msgstr "ഒരു മൌഡ്യൂള്‍ ഇന്‍ഡക്സ് നല്‍കേണ്ടതുണ്ടു്" + +#: ../src/utils/pactl.c:1090 +msgid "" +"You may not specify more than one sink. You have to specify a boolean value." +msgstr "" +"ഒരു സിങ്കില്‍ കൂടുതല്‍ നിങ്ങള്‍ നല്‍കേണ്ടതില്ല. കൂടാതെ, ഒരു ബൂളിയന്‍ മൂല്ല്യവും നിങ്ങള്‍ നല്‍കേണ്ടതാണു്." + +#: ../src/utils/pactl.c:1103 +msgid "" +"You may not specify more than one source. You have to specify a boolean " +"value." +msgstr "" +"ഒരു സോഴ്സില്‍ കൂടുതല്‍ നിങ്ങള്‍ നല്‍കേണ്ടതില്ല. കൂടാതെ, ഒരു ബൂളിയന്‍ മൂല്ല്യവും നിങ്ങള്‍ നല്‍കേണ്ടതാണു്." + +#: ../src/utils/pactl.c:1115 +msgid "You have to specify a card name/index and a profile name" +msgstr "ഒരു കാര്‍ഡ് നാമം/ഇന്‍ഡക്സും പ്രൊഫൈല്‍ നാമവും നല്‍കേണ്ടതുണ്ടു്" + +#: ../src/utils/pactl.c:1126 +msgid "You have to specify a sink name/index and a port name" +msgstr "ഒരു സിങ്ക് നാമം/ഇന്‍ഡക്സും പോര്‍ട്ട് നാമവും നല്‍കേണ്ടതുണ്ടു്" + +#: ../src/utils/pactl.c:1137 +msgid "You have to specify a source name/index and a port name" +msgstr "ഒരു സോഴ്സ് നാമം/ഇന്‍ഡക്സും പോര്‍ട്ട് നാമവും നല്‍കേണ്ടതുണ്ടു്" + +#: ../src/utils/pactl.c:1149 +msgid "You have to specify a sink name/index and a volume" +msgstr "ഒരു സിങ്ക് നാമം/ഇന്‍ഡക്സും വോള്യവും നല്‍കേണ്ടതുണ്ടു്" + +#: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171 +#: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209 +#: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248 +msgid "Invalid volume specification" +msgstr "തെറ്റായ വോള്യം വിവരണങ്ങള്‍" + +#: ../src/utils/pactl.c:1166 +msgid "You have to specify a source name/index and a volume" +msgstr "ഒരു സോഴ്സ് നാമം/ഇന്‍ഡക്സും വോള്യവും നല്‍കേണ്ടതുണ്ടു്" + +#: ../src/utils/pactl.c:1183 +msgid "You have to specify a sink input index and a volume" +msgstr "ഒരു സിങ്ക് ഇന്‍പുട്ട് ഇന്‍ഡക്സും വോള്യവും നല്‍കേണ്ടതുണ്ടു്" + +#: ../src/utils/pactl.c:1188 +msgid "Invalid sink input index" +msgstr "തെറ്റായ സിങ്ക് ഇന്‍പുട്ട് ഇന്‍ഡക്സ്" + +#: ../src/utils/pactl.c:1204 +msgid "You have to specify a sink name/index and a mute boolean" +msgstr "ഒരു സിങ്ക് നാമം/ഇന്‍ഡക്സും മ്യൂട്ട് ബൂളിയനും നല്‍കേണ്ടതുണ്ടു്" + +#: ../src/utils/pactl.c:1221 +msgid "You have to specify a source name/index and a mute boolean" +msgstr "ഒരു സോഴ്സ് നാമം/ഇന്‍ഡക്സും മ്യൂട്ട് ബൂളിയനും നല്‍കേണ്ടതുണ്ടു്" + +#: ../src/utils/pactl.c:1238 +msgid "You have to specify a sink input index and a mute boolean" +msgstr "ഒരു സിങ്ക് ഇന്‍പുട്ട് ഇന്‍ഡക്സും മ്യൂട്ട് ബൂളിയനും നല്‍കേണ്ടതുണ്ടു്" + +#: ../src/utils/pactl.c:1243 +msgid "Invalid sink input index specification" +msgstr "തെറ്റായ സിങ്ക് ഇന്‍പുട്ട് ഇന്‍ഡക്സ് സ്പെസിഫിക്കേഷന്‍" + +#: ../src/utils/pactl.c:1262 +msgid "No valid command specified." +msgstr "ശരിയായ കമാന്‍ഡുകള്‍ നല്‍കിയിട്ടില്ല." + +#: ../src/utils/pax11publish.c:61 +#, c-format +msgid "" +"%s [-D display] [-S server] [-O sink] [-I source] [-c file] [-d|-e|-i|-r]\n" +"\n" +" -d Show current PulseAudio data attached to X11 display (default)\n" +" -e Export local PulseAudio data to X11 display\n" +" -i Import PulseAudio data from X11 display to local environment " +"variables and cookie file.\n" +" -r Remove PulseAudio data from X11 display\n" +msgstr "" +"%s [-D display] [-S server] [-O sink] [-I source] [-c file] [-d|-e|-i|-r]\n" +"\n" +" -d Show current PulseAudio data attached to X11 display (default)\n" +" -e Export local PulseAudio data to X11 display\n" +" -i Import PulseAudio data from X11 display to local environment " +"variables and cookie file.\n" +" -r Remove PulseAudio data from X11 display\n" + +#: ../src/utils/pax11publish.c:94 +#, c-format +msgid "Failed to parse command line.\n" +msgstr "കമാന്‍ഡ് ലൈന്‍ പാഴ്സ് ചെയ്യുന്നതില്‍ പരാജയപ്പെട്ടു.\n" + +#: ../src/utils/pax11publish.c:108 +#, c-format +msgid "Server: %s\n" +msgstr "സര്‍വര്‍: %s\n" + +#: ../src/utils/pax11publish.c:110 +#, c-format +msgid "Source: %s\n" +msgstr "സോഴ്സ്: %s\n" + +#: ../src/utils/pax11publish.c:112 +#, c-format +msgid "Sink: %s\n" +msgstr "സിങ്ക്: %s\n" + +#: ../src/utils/pax11publish.c:114 +#, c-format +msgid "Cookie: %s\n" +msgstr "കുക്കി: %s\n" + +#: ../src/utils/pax11publish.c:132 +#, c-format +msgid "Failed to parse cookie data\n" +msgstr "കുക്കീ ഡേറ്റാ പാഴ്സ് ചെയ്യുന്നതില്‍ പരാജയപ്പെട്ടു\n" + +#: ../src/utils/pax11publish.c:137 +#, c-format +msgid "Failed to save cookie data\n" +msgstr "കുക്കീ ഡേറ്റാ സൂക്ഷിക്കുന്നതില്‍ പരാജയപ്പെട്ടു\n" + +#: ../src/utils/pax11publish.c:152 +#, c-format +msgid "Failed to load client configuration file.\n" +msgstr "ക്ലൈന്റ് ക്രമീകരണ ഫയല്‍ ലഭ്യമാക്കുന്നതില്‍ പരാജയപ്പെട്ടു\n" + +#: ../src/utils/pax11publish.c:157 +#, c-format +msgid "Failed to read environment configuration data.\n" +msgstr "എന്‍വയോണ്മെന്റ് ക്രമീകരണ ഡേറ്റാ ലഭ്യമാക്കുന്നതില്‍ പരാജയപ്പെട്ടു\n" + +#: ../src/utils/pax11publish.c:174 +#, c-format +msgid "Failed to get FQDN.\n" +msgstr "FQDN ലഭ്യമാക്കുന്നതില്‍ പരാജയപ്പെട്ടു\n" + +#: ../src/utils/pax11publish.c:194 +#, c-format +msgid "Failed to load cookie data\n" +msgstr "കുക്കീ ഡേറ്റാ ലഭ്യമാക്കുന്നതില്‍ പരാജയപ്പെട്ടു\n" + +#: ../src/utils/pax11publish.c:211 +#, c-format +msgid "Not yet implemented.\n" +msgstr "ഇതുവരെ ലഭ്യമാക്കിയിട്ടില്ല.\n" + +#: ../src/utils/pacmd.c:69 +msgid "No PulseAudio daemon running, or not running as session daemon." +msgstr "പള്‍സ്ഓഡിയോ ഡെമണ്‍ പ്രവര്‍ത്തനതിലില്ല, സെഷന്‍ ഡെമണായും പ്രവര്‍ത്തിക്കുന്നില്ല." + +#: ../src/utils/pacmd.c:74 +#, c-format +msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s" +msgstr "socket(PF_UNIX, SOCK_STREAM, 0): %s" + +#: ../src/utils/pacmd.c:91 +#, c-format +msgid "connect(): %s" +msgstr "connect(): %s" + +#: ../src/utils/pacmd.c:99 +msgid "Failed to kill PulseAudio daemon." +msgstr "പള്‍സ്ഓഡിയോ ഡെമണ്‍ ഇല്ലാതാക്കുന്നതില്‍ പരാജയപ്പെട്ടു." + +#: ../src/utils/pacmd.c:107 +msgid "Daemon not responding." +msgstr "ഡെമണ്‍ മറുപടി നല്‍കുന്നില്ല." + +#: ../src/utils/pacmd.c:161 +#, c-format +msgid "poll(): %s" +msgstr "poll(): %s" + +#: ../src/utils/pacmd.c:171 ../src/utils/pacmd.c:188 +#, c-format +msgid "read(): %s" +msgstr "read(): %s" + +#: ../src/utils/pacmd.c:207 ../src/utils/pacmd.c:223 +#, c-format +msgid "write(): %s" +msgstr "write(): %s" + +#: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:219 +msgid "Cannot access autospawn lock." +msgstr "ഓട്ടോസ്പൌണ്‍ ലോക്ക് ലഭ്യമാക്കുവാന്‍ സാധ്യമല്ല." + +#: ../src/modules/alsa/alsa-sink.c:530 ../src/modules/alsa/alsa-sink.c:689 +#, c-format +msgid "" +"ALSA woke us up to write new data to the device, but there was actually " +"nothing to write!\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers.\n" +"We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() " +"returned 0 or another value < min_avail." +msgstr "" +"ഡിവൈസില്‍ നിന്നും പുതിയ ഡേറ്റാ ലഭ്യമാക്കുന്നതിനായി ALSA നമുക്കു് അറിയിപ്പു് നല്‍കിയിരിക്കുന്നു, " +"പക്ഷേ ഡേറ്റാ ലഭ്യമല്ല!\n" +"ഇതു് ALSA ഡ്രൈവര്‍ '%s'-ലുള്ള ഒരു ബഗാവാം. ദയവായി ഈ പ്രശ്നം ALSA ഡവലപ്പര്‍സിനെ അറിയിക്കുക.\n" +"POLLOUT സെറ്റ് വഴി നമ്മെ അറിയിച്ചിരിക്കുന്നു -- പക്ഷേ, snd_pcm_avail() ലഭ്യമാക്കിയതു് 0 " +"അല്ലെങ്കില്‍ മറ്റൊരു മൂല്ല്യം < min_avail ആണു്." + +#: ../src/modules/alsa/alsa-source.c:506 ../src/modules/alsa/alsa-source.c:656 +#, c-format +msgid "" +"ALSA woke us up to read new data from the device, but there was actually " +"nothing to read!\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers.\n" +"We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() " +"returned 0 or another value < min_avail." +msgstr "" +"ഡിവൈസില്‍ നിന്നും പുതിയ ഡേറ്റാ ലഭ്യമാക്കുന്നതിനായി ALSA നമുക്കു് അറിയിപ്പു് നല്‍കിയിരിക്കുന്നു, " +"പക്ഷേ ഡേറ്റാ ലഭ്യമല്ല!\n" +"ഇതു് ALSA ഡ്രൈവര്‍ '%s'-ലുള്ള ഒരു ബഗാവാം. ദയവായി ഈ പ്രശ്നം ALSA ഡവലപ്പര്‍സിനെ അറിയിക്കുക.\n" +"POLLIN സെറ്റ് വഴി നമ്മെ അറിയിച്ചിരിക്കുന്നു -- പക്ഷേ, snd_pcm_avail() ലഭ്യമാക്കിയതു് 0 " +"അല്ലെങ്കില്‍ മറ്റൊരു മൂല്ല്യം < min_avail ആണു്." + +#: ../src/modules/alsa/module-alsa-card.c:152 +#: ../src/modules/bluetooth/module-bluetooth-device.c:2228 +#: ../src/modules/alsa/alsa-mixer.c:2931 +msgid "Off" +msgstr "ഓഫ്" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2184 +msgid "High Fidelity Playback (A2DP)" +msgstr "ഹൈ ഫിഡലിറ്റി പ്ലേബാക്ക് (A2DP)" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2198 +msgid "High Fidelity Capture (A2DP)" +msgstr "ഹൈ ഫിഡലിറ്റി കാപ്ചര്‍ (A2DP)" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2213 +msgid "Telephony Duplex (HSP/HFP)" +msgstr "ടെലിഫോണി ഡ്യൂപ്ലെക്സ് (HSP/HFP)" + +#: ../src/modules/reserve-wrap.c:151 +msgid "PulseAudio Sound Server" +msgstr "പള്‍സ്ഓഡിയോ സൌണ്ട് സര്‍വര്‍" + +#: ../src/modules/module-rygel-media-server.c:569 +#: ../src/modules/module-rygel-media-server.c:583 +msgid "Output Devices" +msgstr "" + +#: ../src/modules/module-rygel-media-server.c:570 +#: ../src/modules/module-rygel-media-server.c:584 +msgid "Input Devices" +msgstr "" + +#: ../src/modules/module-rygel-media-server.c:774 +msgid "Audio on @HOSTNAME@" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1701 +msgid "Input" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1702 +msgid "Docking Station Input" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1703 +msgid "Docking Station Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1704 +msgid "Line-In" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1705 +msgid "Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1706 +msgid "External Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1707 +#, fuzzy +msgid "Internal Microphone" +msgstr "ഇന്റേര്‍ണല്‍ ഓഡിയോ" + +#: ../src/modules/alsa/alsa-mixer.c:1708 +msgid "Radio" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1709 +msgid "Video" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1710 +msgid "Automatic Gain Control" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1711 +msgid "No Automatic Gain Control" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1712 +msgid "Boost" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1713 +msgid "No Boost" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1714 +msgid "Amplifier" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1715 +msgid "No Amplifier" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1773 +msgid "Analog Input" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1774 +msgid "Analog Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1775 +msgid "Analog Line-In" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1776 +msgid "Analog Radio" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1777 +msgid "Analog Video" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1778 +#, fuzzy +msgid "Analog Output" +msgstr "നള്‍ ഔട്ട്പുട്ട്" + +#: ../src/modules/alsa/alsa-mixer.c:1779 +msgid "Analog Headphones" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1780 +msgid "Analog Output (LFE)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1781 +msgid "Analog Mono Output" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1981 +#, fuzzy, c-format +msgid "%s+%s" +msgstr "%s %s" + +#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404 +#, fuzzy, c-format +msgid "%s / %s" +msgstr "%s %s" + +#: ../src/modules/alsa/alsa-mixer.c:2790 +msgid "Analog Mono" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2791 +#, fuzzy +msgid "Analog Stereo" +msgstr "സ്റ്റീരിയോ" + +#: ../src/modules/alsa/alsa-mixer.c:2792 +#, fuzzy +msgid "Analog Surround 2.1" +msgstr "സറൌണ്ട് 4.1" + +#: ../src/modules/alsa/alsa-mixer.c:2793 +#, fuzzy +msgid "Analog Surround 3.0" +msgstr "സറൌണ്ട് 4.0" + +#: ../src/modules/alsa/alsa-mixer.c:2794 +#, fuzzy +msgid "Analog Surround 3.1" +msgstr "സറൌണ്ട് 4.1" + +#: ../src/modules/alsa/alsa-mixer.c:2795 +#, fuzzy +msgid "Analog Surround 4.0" +msgstr "സറൌണ്ട് 4.0" + +#: ../src/modules/alsa/alsa-mixer.c:2796 +#, fuzzy +msgid "Analog Surround 4.1" +msgstr "സറൌണ്ട് 4.1" + +#: ../src/modules/alsa/alsa-mixer.c:2797 +#, fuzzy +msgid "Analog Surround 5.0" +msgstr "സറൌണ്ട് 5.0" + +#: ../src/modules/alsa/alsa-mixer.c:2798 +#, fuzzy +msgid "Analog Surround 5.1" +msgstr "സറൌണ്ട് 5.1" + +#: ../src/modules/alsa/alsa-mixer.c:2799 +#, fuzzy +msgid "Analog Surround 6.0" +msgstr "സറൌണ്ട് 4.0" + +#: ../src/modules/alsa/alsa-mixer.c:2800 +#, fuzzy +msgid "Analog Surround 6.1" +msgstr "സറൌണ്ട് 4.1" + +#: ../src/modules/alsa/alsa-mixer.c:2801 +#, fuzzy +msgid "Analog Surround 7.0" +msgstr "സറൌണ്ട് 4.0" + +#: ../src/modules/alsa/alsa-mixer.c:2802 +#, fuzzy +msgid "Analog Surround 7.1" +msgstr "സറൌണ്ട് 7.1" + +#: ../src/modules/alsa/alsa-mixer.c:2803 +msgid "Digital Stereo (IEC958)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2804 +msgid "Digital Surround 4.0 (IEC958)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2805 +msgid "Digital Surround 4.0 (IEC958/AC3)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2806 +msgid "Digital Surround 5.1 (IEC958/AC3)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2807 +msgid "Digital Stereo (HDMI)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2928 +msgid "Analog Mono Duplex" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2929 +msgid "Analog Stereo Duplex" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2930 +msgid "Digital Stereo Duplex (IEC958)" +msgstr "" diff --git a/po/mr.po b/po/mr.po new file mode 100644 index 0000000..9f417fd --- /dev/null +++ b/po/mr.po @@ -0,0 +1,2569 @@ +# translation of pulseaudio.master-tx.po to Marathi +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Sandeep Shedmake , 2009. +# Sandeep Shedmake , 2009. +msgid "" +msgstr "" +"Project-Id-Version: pulseaudio.master-tx\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-09-29 23:47+0200\n" +"PO-Revision-Date: 2009-09-21 18:16+0530\n" +"Last-Translator: Sandeep Shedmake \n" +"Language-Team: Marathi \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=2; plural=(n!=1);\n" + +#: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629 +#, c-format +msgid "%s %s" +msgstr "%s %s" + +#: ../src/modules/alsa/alsa-util.c:1106 +#, c-format +msgid "" +"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu " +"ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_avail() ने अपेक्षा पेक्षा मोठे मूल्य पूरवले: %lu बाईटस् (%lu ms).\n" +"हे सहसा ALSA ड्राइवर '%s' अंतर्गत बग अशू शकते. कृपया या अडचणीस ALSA डेव्हलपर करीता " +"कळवा." + +#: ../src/modules/alsa/alsa-util.c:1147 +#, c-format +msgid "" +"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%" +"lu ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_delay() ने अपेक्षा पेक्षा मोठे मूल्य पूरवले: %li बाईटस् (%s% lu ms).\n" +"हे सहसा ALSA ड्राइवर '%s' अंतर्गत बग अशू शकते. कृपया या अडचणीस ALSA डेव्हलपर करीता " +"कळवा." + +#: ../src/modules/alsa/alsa-util.c:1194 +#, c-format +msgid "" +"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes " +"(%lu ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_nmap_begin() ने अपेक्षा पेक्षा मोठे मूल्य पूरवले: %lu बाईटस् (%lu ms).\n" +"हे सहसा ALSA ड्राइवर '%s' अंतर्गत बग अशू शकते. कृपया या अडचणीस ALSA डेव्हलपर करीता " +"कळवा." + +#: ../src/modules/module-always-sink.c:39 +msgid "Always keeps at least one sink loaded even if it's a null one" +msgstr "नल्ल असल्यावरही नेहमी किमान एक सींक लोड करून ठेवा" + +#: ../src/modules/module-always-sink.c:83 +msgid "Dummy Output" +msgstr "डम्मी आऊटपुट" + +#: ../src/modules/module-ladspa-sink.c:49 +msgid "Virtual LADSPA sink" +msgstr "आभासी LADSPA सींक" + +#: ../src/modules/module-ladspa-sink.c:53 +msgid "" +"sink_name= sink_properties= " +"master= format= rate= " +"channels= channel_map= plugin= label= control=" +msgstr "" +"sink_name=<सींक करीता नाव> sink_properties=<सींक करीता गुणधर्म> " +"master=<फिल्टरजोगी सींकचे नाव> format=<चाचणी रूपण> rate=<चाचणी दर> " +"channels=<वाहिनींची संख्या> channel_map=<वाहिनी नकाशा> plugin= label= control=<इंपुट कंट्रोल मुल्यांची स्वल्पविराम विभाजीत " +"सूची>" + +#: ../src/modules/module-null-sink.c:55 +msgid "Clocked NULL sink" +msgstr "क्लॉक्ड् NULL सींक" + +#: ../src/modules/module-null-sink.c:291 +msgid "Null Output" +msgstr "Null आऊटपुट" + +#: ../src/pulsecore/sink.c:2613 +msgid "Internal Audio" +msgstr "आंतरीक ऑडिओ" + +#: ../src/pulsecore/sink.c:2618 +msgid "Modem" +msgstr "मोडेम" + +#: ../src/daemon/ltdl-bind-now.c:124 +msgid "Failed to find original lt_dlopen loader." +msgstr "मूळ lt_dlopen दाखलकर्ता शोधण्यास अपयशी." + +#: ../src/daemon/ltdl-bind-now.c:129 +msgid "Failed to allocate new dl loader." +msgstr "नवीन dl दाखलकर्ता वाटप करण्यास अपयशी." + +#: ../src/daemon/ltdl-bind-now.c:142 +msgid "Failed to add bind-now-loader." +msgstr "bind-now-loader समावेष करण्यास अपयशी." + +#: ../src/daemon/main.c:141 +#, c-format +msgid "Got signal %s." +msgstr "संकेत %s प्राप्त झाले." + +#: ../src/daemon/main.c:168 +msgid "Exiting." +msgstr "बाहेर पडत आहे." + +#: ../src/daemon/main.c:186 +#, c-format +msgid "Failed to find user '%s'." +msgstr "वापरकर्ता '%s' शोधणे अशक्य." + +#: ../src/daemon/main.c:191 +#, c-format +msgid "Failed to find group '%s'." +msgstr "गट '%s' शोधण्यास अपयशी." + +#: ../src/daemon/main.c:195 +#, c-format +msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)." +msgstr "वापरकर्ता '%s' (UID %lu) व गट '%s' (GID %lu) आढळले." + +#: ../src/daemon/main.c:200 +#, c-format +msgid "GID of user '%s' and of group '%s' don't match." +msgstr "वापरकर्ता '%s' व गट '%s' चे GID जुळत नाही." + +#: ../src/daemon/main.c:205 +#, c-format +msgid "Home directory of user '%s' is not '%s', ignoring." +msgstr "वापरकर्ता '%s' ची मुख्य डिरेक्ट्री '%s' नाही, दुर्लक्ष करत आहे." + +#: ../src/daemon/main.c:208 ../src/daemon/main.c:213 +#, c-format +msgid "Failed to create '%s': %s" +msgstr "'%s' बनवण्यास अपयशी: %s" + +#: ../src/daemon/main.c:220 +#, c-format +msgid "Failed to change group list: %s" +msgstr "गट यादी बदलवण्यास अपयशी: %s" + +#: ../src/daemon/main.c:236 +#, c-format +msgid "Failed to change GID: %s" +msgstr "GID बदलवण्यास अपयशी: %s" + +#: ../src/daemon/main.c:252 +#, c-format +msgid "Failed to change UID: %s" +msgstr "UID बदलवण्यास अपयशी: %s" + +#: ../src/daemon/main.c:271 +msgid "Successfully dropped root privileges." +msgstr "रूट परवानगी यशस्वीरित्या वगळले." + +#: ../src/daemon/main.c:279 +msgid "System wide mode unsupported on this platform." +msgstr "प्रणाली भर पद्धत या प्लॅटफॉर्म करीता समर्थीत नाही." + +#: ../src/daemon/main.c:297 +#, c-format +msgid "setrlimit(%s, (%u, %u)) failed: %s" +msgstr "setrlimit(%s, (%u, %u)) अपयशी: %s" + +#: ../src/daemon/main.c:474 +msgid "Failed to parse command line." +msgstr "आदेश ओळ वाचण्यास अपयशी." + +#: ../src/daemon/main.c:541 +msgid "Daemon not running" +msgstr "डिमन कार्यरत नाही" + +#: ../src/daemon/main.c:543 +#, c-format +msgid "Daemon running as PID %u" +msgstr "डिमन PID %u नुरूप कार्यरत आहे" + +#: ../src/daemon/main.c:553 +#, c-format +msgid "Failed to kill daemon: %s" +msgstr "डिमन नष्ट करण्यास अपयशी: %s" + +#: ../src/daemon/main.c:571 +msgid "" +"This program is not intended to be run as root (unless --system is " +"specified)." +msgstr "हा कार्यक्रम रूट नुरूप चालविण्याकरीता नाही (जोपर्यंत --system निश्चित नाही)." + +#: ../src/daemon/main.c:573 +msgid "Root privileges required." +msgstr "रूट परवानगी आवश्यक." + +#: ../src/daemon/main.c:578 +msgid "--start not supported for system instances." +msgstr "प्रणाली घटनांकरीता --start समर्थीत नाही." + +#: ../src/daemon/main.c:583 +msgid "Running in system mode, but --disallow-exit not set!" +msgstr "प्रणाली पद्धती अंतर्गत कार्यरत, परंतु --disallow-exit निश्चित केले नाही!" + +#: ../src/daemon/main.c:586 +msgid "Running in system mode, but --disallow-module-loading not set!" +msgstr "" +"प्रणाली पद्धती अंतर्गत कार्यरत, परंतु --disallow-module-loading निश्चित केले नाही!" + +#: ../src/daemon/main.c:589 +msgid "Running in system mode, forcibly disabling SHM mode!" +msgstr "प्रणाली पद्धती अंतर्गत कार्यरत, SHM पद्धत जबरनरित्या अकार्यान्वीत करत आहे!" + +#: ../src/daemon/main.c:594 +msgid "Running in system mode, forcibly disabling exit idle time!" +msgstr "प्रणाली पद्धती अंतर्गत कार्यरत, रिकामे वेळ जबरनरित्या अकार्यान्वीत करत आहे!" + +#: ../src/daemon/main.c:621 +msgid "Failed to acquire stdio." +msgstr "stdio प्राप्त करण्यास अपयशी." + +#: ../src/daemon/main.c:627 +#, c-format +msgid "pipe failed: %s" +msgstr "पाइप अपयशी: %s" + +#: ../src/daemon/main.c:632 +#, c-format +msgid "fork() failed: %s" +msgstr "fork() अपयशी: %s" + +#: ../src/daemon/main.c:646 ../src/utils/pacat.c:508 +#, c-format +msgid "read() failed: %s" +msgstr "read() अपयशी: %s" + +#: ../src/daemon/main.c:652 +msgid "Daemon startup failed." +msgstr "डिमन स्टार्टअप अपयशी." + +#: ../src/daemon/main.c:654 +msgid "Daemon startup successful." +msgstr "डिमन स्टार्टअप यशस्वी." + +#: ../src/daemon/main.c:731 +#, c-format +msgid "This is PulseAudio %s" +msgstr "हे PulseAudio %s आहे" + +#: ../src/daemon/main.c:732 +#, c-format +msgid "Compilation host: %s" +msgstr "कंपाइलेशन यजमान: %s" + +#: ../src/daemon/main.c:733 +#, c-format +msgid "Compilation CFLAGS: %s" +msgstr "कंपाइलेशन CFLAGS: %s" + +#: ../src/daemon/main.c:736 +#, c-format +msgid "Running on host: %s" +msgstr "यजमान वर कार्यरत: %s" + +#: ../src/daemon/main.c:739 +#, c-format +msgid "Found %u CPUs." +msgstr "%u CPUs आढळले." + +#: ../src/daemon/main.c:741 +#, c-format +msgid "Page size is %lu bytes" +msgstr "पान आकार %lu बाईटस् आहे" + +#: ../src/daemon/main.c:744 +msgid "Compiled with Valgrind support: yes" +msgstr "Valgrind समर्थनशी कंपाईल केले: होय" + +#: ../src/daemon/main.c:746 +msgid "Compiled with Valgrind support: no" +msgstr "Valgrind समर्थनशी कंपाईल केले: नाही" + +#: ../src/daemon/main.c:749 +#, c-format +msgid "Running in valgrind mode: %s" +msgstr "valgrind पद्धतीत कार्यरत: %s" + +#: ../src/daemon/main.c:752 +msgid "Optimized build: yes" +msgstr "अनुकूल बिल्ड: होय" + +#: ../src/daemon/main.c:754 +msgid "Optimized build: no" +msgstr "अनुकूल बिल्ड: नाही" + +#: ../src/daemon/main.c:758 +msgid "NDEBUG defined, all asserts disabled." +msgstr "NDEBUG वर्णीकृत, सर्व asserts अकार्यान्वीत." + +#: ../src/daemon/main.c:760 +msgid "FASTPATH defined, only fast path asserts disabled." +msgstr "FASTPATH वर्णीकृत, फक्त जलद मार्गीय asserts अकार्यान्वीत केले." + +#: ../src/daemon/main.c:762 +msgid "All asserts enabled." +msgstr "सर्व asserts कार्यान्वीत केले." + +#: ../src/daemon/main.c:766 +msgid "Failed to get machine ID" +msgstr "मशीन ID प्राप्त करण्यास अपयशी" + +#: ../src/daemon/main.c:769 +#, c-format +msgid "Machine ID is %s." +msgstr "मशीन ID %s आहे." + +#: ../src/daemon/main.c:773 +#, c-format +msgid "Session ID is %s." +msgstr "सत्र ID %s आहे." + +#: ../src/daemon/main.c:779 +#, c-format +msgid "Using runtime directory %s." +msgstr "रनटाईम डिरेक्ट्री %s वापरत आहे." + +#: ../src/daemon/main.c:784 +#, c-format +msgid "Using state directory %s." +msgstr "स्थिती डिरेक्ट्री %s वापरत आहे." + +#: ../src/daemon/main.c:787 +#, c-format +msgid "Using modules directory %s." +msgstr "घटक डिरेक्ट्री %s वापरत आहे." + +#: ../src/daemon/main.c:789 +#, c-format +msgid "Running in system mode: %s" +msgstr "प्रणाली पद्धतीत कार्यरत: %s" + +#: ../src/daemon/main.c:792 +msgid "" +"OK, so you are running PA in system mode. Please note that you most likely " +"shouldn't be doing that.\n" +"If you do it nonetheless then it's your own fault if things don't work as " +"expected.\n" +"Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an " +"explanation why system mode is usually a bad idea." +msgstr "" +"ठिक आहे, तुम्ही PA प्रणाली मोडमध्ये चालवत आहात. कृपया लक्षात ठेवा असे करण्यास फारशी " +"आवश्यकता नाही.\n" +"असे कार्यान्वीत केल्यास, काहिक घटक योग्यप्रकारे कार्य नसेल करत असल्यास त्याला तुम्हीच " +"जबाबदार राहणार.\n" +"प्रणाली मोड दोकादायक आहे यासाठी कृपया http://pulseaudio.org/wiki/" +"WhatIsWrongWithSystemMode वाचा." + +#: ../src/daemon/main.c:809 +msgid "pa_pid_file_create() failed." +msgstr "pa_pid_file_create() अपयशी." + +#: ../src/daemon/main.c:819 +msgid "Fresh high-resolution timers available! Bon appetit!" +msgstr "नवीन उच्च-बिंदूता टाइमर उपलब्ध! Bon appetit!" + +#: ../src/daemon/main.c:821 +msgid "" +"Dude, your kernel stinks! The chef's recommendation today is Linux with high-" +"resolution timers enabled!" +msgstr "" +"Dude, your kernel stinks! The chef's recommendation today is Linux with high-" +"resolution timers enabled!" + +#: ../src/daemon/main.c:844 +msgid "pa_core_new() failed." +msgstr "pa_core_new() अपयशी." + +#: ../src/daemon/main.c:904 +msgid "Failed to initialize daemon." +msgstr "डिमन प्रारंभ करण्यास अपयशी." + +#: ../src/daemon/main.c:909 +msgid "Daemon startup without any loaded modules, refusing to work." +msgstr "विना विभाग दाखल केल्यास डिमन प्रारंभ झाले, कार्य करण्यास नकार." + +#: ../src/daemon/main.c:926 +msgid "Daemon startup complete." +msgstr "डिमन स्टार्टअप पूर्ण झाले." + +#: ../src/daemon/main.c:932 +msgid "Daemon shutdown initiated." +msgstr "डिमन पूर्णपणे बंद करण्यास प्रारंभ केले." + +#: ../src/daemon/main.c:954 +msgid "Daemon terminated." +msgstr "डिमन नष्ट केले." + +#: ../src/daemon/cmdline.c:115 +#, c-format +msgid "" +"%s [options]\n" +"\n" +"COMMANDS:\n" +" -h, --help Show this help\n" +" --version Show version\n" +" --dump-conf Dump default configuration\n" +" --dump-modules Dump list of available modules\n" +" --dump-resample-methods Dump available resample methods\n" +" --cleanup-shm Cleanup stale shared memory " +"segments\n" +" --start Start the daemon if it is not " +"running\n" +" -k --kill Kill a running daemon\n" +" --check Check for a running daemon (only " +"returns exit code)\n" +"\n" +"OPTIONS:\n" +" --system[=BOOL] Run as system-wide instance\n" +" -D, --daemonize[=BOOL] Daemonize after startup\n" +" --fail[=BOOL] Quit when startup fails\n" +" --high-priority[=BOOL] Try to set high nice level\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_NICE)\n" +" --realtime[=BOOL] Try to enable realtime scheduling\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_RTPRIO)\n" +" --disallow-module-loading[=BOOL] Disallow module user requested " +"module\n" +" loading/unloading after startup\n" +" --disallow-exit[=BOOL] Disallow user requested exit\n" +" --exit-idle-time=SECS Terminate the daemon when idle and " +"this\n" +" time passed\n" +" --module-idle-time=SECS Unload autoloaded modules when idle " +"and\n" +" this time passed\n" +" --scache-idle-time=SECS Unload autoloaded samples when idle " +"and\n" +" this time passed\n" +" --log-level[=LEVEL] Increase or set verbosity level\n" +" -v Increase the verbosity level\n" +" --log-target={auto,syslog,stderr} Specify the log target\n" +" --log-meta[=BOOL] Include code location in log " +"messages\n" +" --log-time[=BOOL] Include timestamps in log messages\n" +" --log-backtrace=FRAMES Include a backtrace in log messages\n" +" -p, --dl-search-path=PATH Set the search path for dynamic " +"shared\n" +" objects (plugins)\n" +" --resample-method=METHOD Use the specified resampling method\n" +" (See --dump-resample-methods for\n" +" possible values)\n" +" --use-pid-file[=BOOL] Create a PID file\n" +" --no-cpu-limit[=BOOL] Do not install CPU load limiter on\n" +" platforms that support it.\n" +" --disable-shm[=BOOL] Disable shared memory support.\n" +"\n" +"STARTUP SCRIPT:\n" +" -L, --load=\"MODULE ARGUMENTS\" Load the specified plugin module " +"with\n" +" the specified argument\n" +" -F, --file=FILENAME Run the specified script\n" +" -C Open a command line on the running " +"TTY\n" +" after startup\n" +"\n" +" -n Don't load default script file\n" +msgstr "" +"%s [options]\n" +"\n" +"COMMANDS:\n" +" -h, --help Show this help\n" +" --version Show version\n" +" --dump-conf Dump default configuration\n" +" --dump-modules Dump list of available modules\n" +" --dump-resample-methods Dump available resample methods\n" +" --cleanup-shm Cleanup stale shared memory " +"segments\n" +" --start Start the daemon if it is not " +"running\n" +" -k --kill Kill a running daemon\n" +" --check Check for a running daemon (only " +"returns exit code)\n" +"\n" +"OPTIONS:\n" +" --system[=BOOL] Run as system-wide instance\n" +" -D, --daemonize[=BOOL] Daemonize after startup\n" +" --fail[=BOOL] Quit when startup fails\n" +" --high-priority[=BOOL] Try to set high nice level\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_NICE)\n" +" --realtime[=BOOL] Try to enable realtime scheduling\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_RTPRIO)\n" +" --disallow-module-loading[=BOOL] Disallow module user requested " +"module\n" +" loading/unloading after startup\n" +" --disallow-exit[=BOOL] Disallow user requested exit\n" +" --exit-idle-time=SECS Terminate the daemon when idle and " +"this\n" +" time passed\n" +" --module-idle-time=SECS Unload autoloaded modules when idle " +"and\n" +" this time passed\n" +" --scache-idle-time=SECS Unload autoloaded samples when idle " +"and\n" +" this time passed\n" +" --log-level[=LEVEL] Increase or set verbosity level\n" +" -v Increase the verbosity level\n" +" --log-target={auto,syslog,stderr} Specify the log target\n" +" --log-meta[=BOOL] Include code location in log " +"messages\n" +" --log-time[=BOOL] Include timestamps in log messages\n" +" --log-backtrace=FRAMES Include a backtrace in log messages\n" +" -p, --dl-search-path=PATH Set the search path for dynamic " +"shared\n" +" objects (plugins)\n" +" --resample-method=METHOD Use the specified resampling method\n" +" (See --dump-resample-methods for\n" +" possible values)\n" +" --use-pid-file[=BOOL] Create a PID file\n" +" --no-cpu-limit[=BOOL] Do not install CPU load limiter on\n" +" platforms that support it.\n" +" --disable-shm[=BOOL] Disable shared memory support.\n" +"\n" +"STARTUP SCRIPT:\n" +" -L, --load=\"MODULE ARGUMENTS\" Load the specified plugin module " +"with\n" +" the specified argument\n" +" -F, --file=FILENAME Run the specified script\n" +" -C Open a command line on the running " +"TTY\n" +" after startup\n" +"\n" +" -n Don't load default script file\n" + +#: ../src/daemon/cmdline.c:247 +msgid "--daemonize expects boolean argument" +msgstr "--daemonize यास बूलीयन बाब अपेक्षीत आहे" + +#: ../src/daemon/cmdline.c:254 +msgid "--fail expects boolean argument" +msgstr "--fail यास बूलीयन बाब अपेक्षीत आहे" + +#: ../src/daemon/cmdline.c:264 +msgid "" +"--log-level expects log level argument (either numeric in range 0..4 or one " +"of debug, info, notice, warn, error)." +msgstr "" +"--log-level यास लॉग स्तरीय बाब अपेक्षीत आहे (एकतर क्षेत्र 0..4 अंतर्गत संख्यायी किंवा " +"debug, info, notice, warn, error पैकी एक)." + +#: ../src/daemon/cmdline.c:276 +msgid "--high-priority expects boolean argument" +msgstr "--high-priority यास बूलीयन बाब अपेक्षीत आहे" + +#: ../src/daemon/cmdline.c:283 +msgid "--realtime expects boolean argument" +msgstr "--realtime यास बूलीयन बाब अपेक्षीत आहे" + +#: ../src/daemon/cmdline.c:290 +msgid "--disallow-module-loading expects boolean argument" +msgstr "--disallow-module-loading यास बूलीयन बाब अपेक्षीत आहे" + +#: ../src/daemon/cmdline.c:297 +msgid "--disallow-exit expects boolean argument" +msgstr "--disallow-exit यास बूलीयन बाब अपेक्षीत आहे" + +#: ../src/daemon/cmdline.c:304 +msgid "--use-pid-file expects boolean argument" +msgstr "--use-pid-file यास बूलीयन बाब अपेक्षीत आहे" + +#: ../src/daemon/cmdline.c:321 +msgid "Invalid log target: use either 'syslog', 'stderr' or 'auto'." +msgstr "अवैध लॉग लक्ष्य: 'syslog', 'stderr' किंवा 'auto' पैकी एक वापरा." + +#: ../src/daemon/cmdline.c:328 +msgid "--log-time expects boolean argument" +msgstr "--log-time यास बूलीयन बाब अपेक्षीत आहे" + +#: ../src/daemon/cmdline.c:335 +msgid "--log-meta expects boolean argument" +msgstr "--log-meta यास बूलीयन बाब अपेक्षीत आहे" + +#: ../src/daemon/cmdline.c:354 +#, c-format +msgid "Invalid resample method '%s'." +msgstr "अवैध पुन्ह सॅम्पल पद्धत '%s'." + +#: ../src/daemon/cmdline.c:361 +msgid "--system expects boolean argument" +msgstr "--system यास बूलीयन बाब अपेक्षीत आहे" + +#: ../src/daemon/cmdline.c:368 +msgid "--no-cpu-limit expects boolean argument" +msgstr "--no-cpu-limit यास बूलीयन बाब अपेक्षीत आहे" + +#: ../src/daemon/cmdline.c:375 +msgid "--disable-shm expects boolean argument" +msgstr "--disable-shm यास बूलीयन बाब अपेक्षीत आहे" + +#: ../src/daemon/dumpmodules.c:60 +#, c-format +msgid "Name: %s\n" +msgstr "नाव: %s\n" + +#: ../src/daemon/dumpmodules.c:63 +#, c-format +msgid "No module information available\n" +msgstr "घटक माहिती उपलब्ध नाही\n" + +#: ../src/daemon/dumpmodules.c:66 +#, c-format +msgid "Version: %s\n" +msgstr "आवृत्ती: %s\n" + +#: ../src/daemon/dumpmodules.c:68 +#, c-format +msgid "Description: %s\n" +msgstr "वर्णन: %s\n" + +#: ../src/daemon/dumpmodules.c:70 +#, c-format +msgid "Author: %s\n" +msgstr "लेखक: %s\n" + +#: ../src/daemon/dumpmodules.c:72 +#, c-format +msgid "Usage: %s\n" +msgstr "वापरणी: %s\n" + +#: ../src/daemon/dumpmodules.c:73 +#, c-format +msgid "Load Once: %s\n" +msgstr "एकदा दाखल करा: %s\n" + +#: ../src/daemon/dumpmodules.c:75 +#, c-format +msgid "DEPRECATION WARNING: %s\n" +msgstr "DEPRECATION WARNING: %s\n" + +#: ../src/daemon/dumpmodules.c:79 +#, c-format +msgid "Path: %s\n" +msgstr "मार्ग: %s\n" + +#: ../src/daemon/daemon-conf.c:232 +#, c-format +msgid "[%s:%u] Invalid log target '%s'." +msgstr "[%s:%u] अवैध लॉग लक्ष्य '%s'." + +#: ../src/daemon/daemon-conf.c:248 +#, c-format +msgid "[%s:%u] Invalid log level '%s'." +msgstr "[%s:%u] अवैध लॉग स्तर '%s'." + +#: ../src/daemon/daemon-conf.c:264 +#, c-format +msgid "[%s:%u] Invalid resample method '%s'." +msgstr "[%s:%u] अवैध पुन्ह सॅम्पल पद्धत '%s'." + +#: ../src/daemon/daemon-conf.c:287 +#, c-format +msgid "[%s:%u] Invalid rlimit '%s'." +msgstr "[%s:%u] अवैध rlimit '%s'." + +#: ../src/daemon/daemon-conf.c:294 +#, c-format +msgid "[%s:%u] rlimit not supported on this platform." +msgstr "[%s:%u] rlimit या प्लॅटफॉर्म वर समर्थीत नाही." + +#: ../src/daemon/daemon-conf.c:310 +#, c-format +msgid "[%s:%u] Invalid sample format '%s'." +msgstr "[%s:%u] अवैध सॅम्पल स्वरूप '%s'." + +#: ../src/daemon/daemon-conf.c:328 +#, c-format +msgid "[%s:%u] Invalid sample rate '%s'." +msgstr "[%s:%u] अवैध सॅम्पल दर '%s'." + +#: ../src/daemon/daemon-conf.c:352 +#, c-format +msgid "[%s:%u] Invalid sample channels '%s'." +msgstr "[%s:%u] अवैध सॅम्पल मार्ग '%s'." + +#: ../src/daemon/daemon-conf.c:370 +#, c-format +msgid "[%s:%u] Invalid channel map '%s'." +msgstr "[%s:%u] अवैध मार्ग मॅप '%s'." + +#: ../src/daemon/daemon-conf.c:388 +#, c-format +msgid "[%s:%u] Invalid number of fragments '%s'." +msgstr "[%s:%u] अवैध तुकडे '%s' यांची एकूण संख्या." + +#: ../src/daemon/daemon-conf.c:406 +#, c-format +msgid "[%s:%u] Invalid fragment size '%s'." +msgstr "[%s:%u] अवैध तुकड्याचे आकार '%s'." + +#: ../src/daemon/daemon-conf.c:424 +#, c-format +msgid "[%s:%u] Invalid nice level '%s'." +msgstr "[%s:%u] अवैध nice स्तर '%s'." + +#: ../src/daemon/daemon-conf.c:546 +#, c-format +msgid "Failed to open configuration file: %s" +msgstr "संयोजना फाइल उघडण्यास अपयशी: %s" + +#: ../src/daemon/daemon-conf.c:562 +msgid "" +"The specified default channel map has a different number of channels than " +"the specified default number of channels." +msgstr "" +"निश्चित मुलभूत वाहिनी मॅपकडे निश्चित एकूण मुलभूत वाहिनी पेक्षा वेगळे वाहिनी संख्या " +"समाविष्टीत आहे." + +#: ../src/daemon/daemon-conf.c:638 +#, c-format +msgid "### Read from configuration file: %s ###\n" +msgstr "### संयोजना फाइल: %s पासून वाचा ###\n" + +#: ../src/daemon/caps.c:62 +msgid "Cleaning up privileges." +msgstr "परवानगी वगळत आहे." + +#: ../src/daemon/pulseaudio.desktop.in.h:1 +msgid "PulseAudio Sound System" +msgstr "PulseAudio आवाज प्रणाली" + +#: ../src/daemon/pulseaudio.desktop.in.h:2 +msgid "Start the PulseAudio Sound System" +msgstr "PulseAudio आवाज प्रणाली सुरू करा" + +#: ../src/pulse/channelmap.c:105 ../src/pulse/channelmap.c:757 +msgid "Mono" +msgstr "मोनो" + +#: ../src/pulse/channelmap.c:107 +msgid "Front Center" +msgstr "समोर मध्यभागी" + +#: ../src/pulse/channelmap.c:108 +msgid "Front Left" +msgstr "समोर डावीकडे" + +#: ../src/pulse/channelmap.c:109 +msgid "Front Right" +msgstr "समोर उजवीकडे" + +#: ../src/pulse/channelmap.c:111 +msgid "Rear Center" +msgstr "पाठीमागे भध्यभागी" + +#: ../src/pulse/channelmap.c:112 +msgid "Rear Left" +msgstr "पाठीमागे डावीकडे" + +#: ../src/pulse/channelmap.c:113 +msgid "Rear Right" +msgstr "पाठीमागे उजवीकडे" + +#: ../src/pulse/channelmap.c:115 +msgid "Low Frequency Emmiter" +msgstr "कमी क्रिक्वेन्सी स्रोत" + +#: ../src/pulse/channelmap.c:117 +msgid "Front Left-of-center" +msgstr "समोर डावी-कडील-मध्यभागी" + +#: ../src/pulse/channelmap.c:118 +msgid "Front Right-of-center" +msgstr "समोर उजवी-कडील-मध्यभागी" + +#: ../src/pulse/channelmap.c:120 +msgid "Side Left" +msgstr "डावी बाजू" + +#: ../src/pulse/channelmap.c:121 +msgid "Side Right" +msgstr "उजवी बाजू" + +#: ../src/pulse/channelmap.c:123 +msgid "Auxiliary 0" +msgstr "ऑक्जीलरी 0" + +#: ../src/pulse/channelmap.c:124 +msgid "Auxiliary 1" +msgstr "ऑक्जीलरी 1" + +#: ../src/pulse/channelmap.c:125 +msgid "Auxiliary 2" +msgstr "ऑक्जीलरी 2" + +#: ../src/pulse/channelmap.c:126 +msgid "Auxiliary 3" +msgstr "ऑक्जीलरी 3" + +#: ../src/pulse/channelmap.c:127 +msgid "Auxiliary 4" +msgstr "ऑक्जीलरी 4" + +#: ../src/pulse/channelmap.c:128 +msgid "Auxiliary 5" +msgstr "ऑक्जीलरी 5" + +#: ../src/pulse/channelmap.c:129 +msgid "Auxiliary 6" +msgstr "ऑक्जीलरी 6" + +#: ../src/pulse/channelmap.c:130 +msgid "Auxiliary 7" +msgstr "ऑक्जीलरी 7" + +#: ../src/pulse/channelmap.c:131 +msgid "Auxiliary 8" +msgstr "ऑक्जीलरी 8" + +#: ../src/pulse/channelmap.c:132 +msgid "Auxiliary 9" +msgstr "ऑक्जीलरी 9" + +#: ../src/pulse/channelmap.c:133 +msgid "Auxiliary 10" +msgstr "ऑक्जीलरी 10" + +#: ../src/pulse/channelmap.c:134 +msgid "Auxiliary 11" +msgstr "ऑक्जीलरी 11" + +#: ../src/pulse/channelmap.c:135 +msgid "Auxiliary 12" +msgstr "ऑक्जीलरी 12" + +#: ../src/pulse/channelmap.c:136 +msgid "Auxiliary 13" +msgstr "ऑक्जीलरी 13" + +#: ../src/pulse/channelmap.c:137 +msgid "Auxiliary 14" +msgstr "ऑक्जीलरी 14" + +#: ../src/pulse/channelmap.c:138 +msgid "Auxiliary 15" +msgstr "ऑक्जीलरी 15" + +#: ../src/pulse/channelmap.c:139 +msgid "Auxiliary 16" +msgstr "ऑक्जीलरी 16" + +#: ../src/pulse/channelmap.c:140 +msgid "Auxiliary 17" +msgstr "ऑक्जीलरी 17" + +#: ../src/pulse/channelmap.c:141 +msgid "Auxiliary 18" +msgstr "ऑक्जीलरी 18" + +#: ../src/pulse/channelmap.c:142 +msgid "Auxiliary 19" +msgstr "ऑक्जीलरी 19" + +#: ../src/pulse/channelmap.c:143 +msgid "Auxiliary 20" +msgstr "ऑक्जीलरी 20" + +#: ../src/pulse/channelmap.c:144 +msgid "Auxiliary 21" +msgstr "ऑक्जीलरी 21" + +#: ../src/pulse/channelmap.c:145 +msgid "Auxiliary 22" +msgstr "ऑक्जीलरी 22" + +#: ../src/pulse/channelmap.c:146 +msgid "Auxiliary 23" +msgstr "ऑक्जीलरी 23" + +#: ../src/pulse/channelmap.c:147 +msgid "Auxiliary 24" +msgstr "ऑक्जीलरी 24" + +#: ../src/pulse/channelmap.c:148 +msgid "Auxiliary 25" +msgstr "ऑक्जीलरी 25" + +#: ../src/pulse/channelmap.c:149 +msgid "Auxiliary 26" +msgstr "ऑक्जीलरी 26" + +#: ../src/pulse/channelmap.c:150 +msgid "Auxiliary 27" +msgstr "ऑक्जीलरी 27" + +#: ../src/pulse/channelmap.c:151 +msgid "Auxiliary 28" +msgstr "ऑक्जीलरी 28" + +#: ../src/pulse/channelmap.c:152 +msgid "Auxiliary 29" +msgstr "ऑक्जीलरी 29" + +#: ../src/pulse/channelmap.c:153 +msgid "Auxiliary 30" +msgstr "ऑक्जीलरी 30" + +#: ../src/pulse/channelmap.c:154 +msgid "Auxiliary 31" +msgstr "ऑक्जीलरी 31" + +#: ../src/pulse/channelmap.c:156 +msgid "Top Center" +msgstr "वरील मध्य" + +#: ../src/pulse/channelmap.c:158 +msgid "Top Front Center" +msgstr "वरील समोरचे मध्य" + +#: ../src/pulse/channelmap.c:159 +msgid "Top Front Left" +msgstr "वरील समोरचे डावे" + +#: ../src/pulse/channelmap.c:160 +msgid "Top Front Right" +msgstr "वरील समोरचे उजवे" + +#: ../src/pulse/channelmap.c:162 +msgid "Top Rear Center" +msgstr "वरील पाठीमागचे मध्य" + +#: ../src/pulse/channelmap.c:163 +msgid "Top Rear Left" +msgstr "वरील पाठीमागचे डावे" + +#: ../src/pulse/channelmap.c:164 +msgid "Top Rear Right" +msgstr "वरील पाठीमागचे उजवे" + +#: ../src/pulse/channelmap.c:484 ../src/pulse/sample.c:170 +#: ../src/pulse/volume.c:295 ../src/pulse/volume.c:321 +#: ../src/pulse/volume.c:341 ../src/pulse/volume.c:371 +msgid "(invalid)" +msgstr "(अवैध)" + +#: ../src/pulse/channelmap.c:761 +msgid "Stereo" +msgstr "स्टिरीओ" + +#: ../src/pulse/channelmap.c:766 +msgid "Surround 4.0" +msgstr "सराऊन्ड 4.0" + +#: ../src/pulse/channelmap.c:772 +msgid "Surround 4.1" +msgstr "सराऊन्ड 4.1" + +#: ../src/pulse/channelmap.c:778 +msgid "Surround 5.0" +msgstr "सराऊन्ड 5.0" + +#: ../src/pulse/channelmap.c:784 +msgid "Surround 5.1" +msgstr "सराऊन्ड 5.1" + +#: ../src/pulse/channelmap.c:791 +msgid "Surround 7.1" +msgstr "सराऊन्ड 7.1" + +#: ../src/pulse/error.c:43 +msgid "OK" +msgstr "ठिक" + +#: ../src/pulse/error.c:44 +msgid "Access denied" +msgstr "प्रवेश नकारले" + +#: ../src/pulse/error.c:45 +msgid "Unknown command" +msgstr "अपरिचीत आदेश" + +#: ../src/pulse/error.c:46 +msgid "Invalid argument" +msgstr "अवैध बाब" + +#: ../src/pulse/error.c:47 +msgid "Entity exists" +msgstr "घटक अस्तित्वात आहे" + +#: ../src/pulse/error.c:48 +msgid "No such entity" +msgstr "घटक आढळले नाही" + +#: ../src/pulse/error.c:49 +msgid "Connection refused" +msgstr "जुळवणी नकारली" + +#: ../src/pulse/error.c:50 +msgid "Protocol error" +msgstr "प्रोटोकॉल त्रुटी" + +#: ../src/pulse/error.c:51 +msgid "Timeout" +msgstr "वेळसमाप्ती" + +#: ../src/pulse/error.c:52 +msgid "No authorization key" +msgstr "ओळख पटवण्याकरीता कि आढळली नाही" + +#: ../src/pulse/error.c:53 +msgid "Internal error" +msgstr "आंतरीक त्रुटी" + +#: ../src/pulse/error.c:54 +msgid "Connection terminated" +msgstr "वेळसमाप्ती नष्ट झाली" + +#: ../src/pulse/error.c:55 +msgid "Entity killed" +msgstr "घटक नष्ट झाले" + +#: ../src/pulse/error.c:56 +msgid "Invalid server" +msgstr "अवैध सर्वर" + +#: ../src/pulse/error.c:57 +msgid "Module initalization failed" +msgstr "घटक प्रारंभ अपयशी" + +#: ../src/pulse/error.c:58 +msgid "Bad state" +msgstr "अयोग्य स्तर" + +#: ../src/pulse/error.c:59 +msgid "No data" +msgstr "डेटा आढळला नाही" + +#: ../src/pulse/error.c:60 +msgid "Incompatible protocol version" +msgstr "असहत्व प्रोटोकॉल आवृत्ती" + +#: ../src/pulse/error.c:61 +msgid "Too large" +msgstr "खूप मोठे" + +#: ../src/pulse/error.c:62 +msgid "Not supported" +msgstr "समर्थीत नाही" + +#: ../src/pulse/error.c:63 +msgid "Unknown error code" +msgstr "अपरिचीत त्रुटी कोड" + +#: ../src/pulse/error.c:64 +msgid "No such extension" +msgstr "यानुरूप वाढ आढळली नाही" + +#: ../src/pulse/error.c:65 +msgid "Obsolete functionality" +msgstr "जुणी कार्यपद्धत" + +#: ../src/pulse/error.c:66 +msgid "Missing implementation" +msgstr "लागू केले आहे असे आढळले नाही" + +#: ../src/pulse/error.c:67 +msgid "Client forked" +msgstr "क्लाऐंट विभाजीत केले" + +#: ../src/pulse/error.c:68 +msgid "Input/Output error" +msgstr "इंपुट/आऊटपुट त्रुटी" + +#: ../src/pulse/error.c:69 +msgid "Device or resource busy" +msgstr "उपकरन किंव स्रोत व्यस्थ" + +#: ../src/pulse/sample.c:172 +#, c-format +msgid "%s %uch %uHz" +msgstr "%s %uch %uHz" + +#: ../src/pulse/sample.c:184 +#, c-format +msgid "%0.1f GiB" +msgstr "%0.1f GiB" + +#: ../src/pulse/sample.c:186 +#, c-format +msgid "%0.1f MiB" +msgstr "%0.1f MiB" + +#: ../src/pulse/sample.c:188 +#, c-format +msgid "%0.1f KiB" +msgstr "%0.1f KiB" + +#: ../src/pulse/sample.c:190 +#, c-format +msgid "%u B" +msgstr "%u B" + +#: ../src/pulse/client-conf-x11.c:55 ../src/utils/pax11publish.c:100 +msgid "XOpenDisplay() failed" +msgstr "XOpenDisplay() अपयशी" + +#: ../src/pulse/client-conf-x11.c:93 +msgid "Failed to parse cookie data" +msgstr "कुकी डेटा वाचण्यास अपयशी" + +#: ../src/pulse/client-conf.c:111 +#, c-format +msgid "Failed to open configuration file '%s': %s" +msgstr "संयोजना फाइल '%s' उघडण्यास अपयशी: %s" + +#: ../src/pulse/context.c:550 +msgid "No cookie loaded. Attempting to connect without." +msgstr "कुकी दाखल केले नाही. जुळवणीचा प्रयत्न करत आहे." + +#: ../src/pulse/context.c:693 +#, c-format +msgid "fork(): %s" +msgstr "fork(): %s" + +#: ../src/pulse/context.c:748 +#, c-format +msgid "waitpid(): %s" +msgstr "waitpid(): %s" + +#: ../src/pulse/context.c:1438 +#, c-format +msgid "Received message for unknown extension '%s'" +msgstr "अपरिचीत वाढ '%s' करीता संदेश प्राप्त झाले" + +#: ../src/utils/pacat.c:108 +#, c-format +msgid "Failed to drain stream: %s" +msgstr "स्ट्रीम रिकामे करण्यास अपयशी: %s" + +#: ../src/utils/pacat.c:113 +msgid "Playback stream drained." +msgstr "प्लेबॅक स्ट्रीम रिकामे झाले." + +#: ../src/utils/pacat.c:123 +msgid "Draining connection to server." +msgstr "सर्व्हर करीता जुळवणी ड्रेन केली." + +#: ../src/utils/pacat.c:136 +#, c-format +msgid "pa_stream_drain(): %s" +msgstr "pa_stream_drain(): %s" + +#: ../src/utils/pacat.c:159 +#, c-format +msgid "pa_stream_write() failed: %s" +msgstr "pa_stream_write() अपयशी: %s" + +#: ../src/utils/pacat.c:197 +#, c-format +msgid "pa_stream_begin_write() failed: %s" +msgstr "pa_stream_begin_write() अपयशी: %s" + +#: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267 +#, c-format +msgid "pa_stream_peek() failed: %s" +msgstr "pa_stream_peek() अपयशी: %s" + +#: ../src/utils/pacat.c:307 +msgid "Stream successfully created." +msgstr "स्ट्रीम यशस्वीरित्या निर्माण केले." + +#: ../src/utils/pacat.c:310 +#, c-format +msgid "pa_stream_get_buffer_attr() failed: %s" +msgstr "pa_stream_get_buffer_attr() अपयशी: %s" + +#: ../src/utils/pacat.c:314 +#, c-format +msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u" +msgstr "बफर मेट्रीक्स्: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u" + +#: ../src/utils/pacat.c:317 +#, c-format +msgid "Buffer metrics: maxlength=%u, fragsize=%u" +msgstr "बफर मेट्रीक्स्: maxlength=%u, fragsize=%u" + +#: ../src/utils/pacat.c:321 +#, c-format +msgid "Using sample spec '%s', channel map '%s'." +msgstr "उदाहरणार्थ spec '%s', वाहिनी नकाशा '%s' वापरत आहे." + +#: ../src/utils/pacat.c:325 +#, c-format +msgid "Connected to device %s (%u, %ssuspended)." +msgstr "साधन %s शी जुळले (%u, %s सस्पेंड केले)." + +#: ../src/utils/pacat.c:335 +#, c-format +msgid "Stream error: %s" +msgstr "स्ट्रीम त्रुटी: %s" + +#: ../src/utils/pacat.c:345 +#, c-format +msgid "Stream device suspended.%s" +msgstr "स्ट्रीम साधन सस्पेंड केले.%s" + +#: ../src/utils/pacat.c:347 +#, c-format +msgid "Stream device resumed.%s" +msgstr "स्ट्रीम साधन पुनः सुरू केले.%s" + +#: ../src/utils/pacat.c:355 +#, c-format +msgid "Stream underrun.%s" +msgstr "स्ट्रीम underrun.%s" + +#: ../src/utils/pacat.c:362 +#, c-format +msgid "Stream overrun.%s" +msgstr "स्ट्रीम overrun.%s" + +#: ../src/utils/pacat.c:369 +#, c-format +msgid "Stream started.%s" +msgstr "स्ट्रीम started.%s" + +#: ../src/utils/pacat.c:376 +#, c-format +msgid "Stream moved to device %s (%u, %ssuspended).%s" +msgstr "स्ट्रीम साधन %s कडे स्थानांतरीत केले (%u, %ssuspended).%s" + +#: ../src/utils/pacat.c:376 +msgid "not " +msgstr "नाही " + +#: ../src/utils/pacat.c:383 +#, c-format +msgid "Stream buffer attributes changed.%s" +msgstr "स्ट्रीम बफर गुणधर्म बदलले.%s" + +#: ../src/utils/pacat.c:415 +#, c-format +msgid "Connection established.%s" +msgstr "जुळवणी स्थापीत केली.%s" + +#: ../src/utils/pacat.c:418 +#, c-format +msgid "pa_stream_new() failed: %s" +msgstr "pa_stream_new() अपयशी: %s" + +#: ../src/utils/pacat.c:450 +#, c-format +msgid "pa_stream_connect_playback() failed: %s" +msgstr "pa_stream_connect_playback() अपयशी: %s" + +#: ../src/utils/pacat.c:456 +#, c-format +msgid "pa_stream_connect_record() failed: %s" +msgstr "pa_stream_connect_record() अपयशी: %s" + +#: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857 +#, c-format +msgid "Connection failure: %s" +msgstr "जुळवणी अपयशी: %s" + +#: ../src/utils/pacat.c:503 +msgid "Got EOF." +msgstr "EOF प्राप्त झाले." + +#: ../src/utils/pacat.c:540 +#, c-format +msgid "write() failed: %s" +msgstr "write() अपयशी: %s" + +#: ../src/utils/pacat.c:561 +msgid "Got signal, exiting." +msgstr "संकेत प्राप्त झाले, बाहेर पडत आहे." + +#: ../src/utils/pacat.c:575 +#, c-format +msgid "Failed to get latency: %s" +msgstr "विलंब प्राप्त करण्यास अपयशी: %s" + +#: ../src/utils/pacat.c:580 +#, c-format +msgid "Time: %0.3f sec; Latency: %0.0f usec." +msgstr "वेळ: %0.3f sec; विलंब: %0.0f usec." + +#: ../src/utils/pacat.c:599 +#, c-format +msgid "pa_stream_update_timing_info() failed: %s" +msgstr "pa_stream_update_timing_info() अपयशी: %s" + +#: ../src/utils/pacat.c:609 +#, c-format +msgid "" +"%s [options]\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -r, --record Create a connection for recording\n" +" -p, --playback Create a connection for playback\n" +"\n" +" -v, --verbose Enable verbose operations\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -d, --device=DEVICE The name of the sink/source to " +"connect to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" +" --stream-name=NAME How to call this stream on the " +"server\n" +" --volume=VOLUME Specify the initial (linear) volume " +"in range 0...65536\n" +" --rate=SAMPLERATE The sample rate in Hz (defaults to " +"44100)\n" +" --format=SAMPLEFORMAT The sample type, one of s16le, " +"s16be, u8, float32le,\n" +" float32be, ulaw, alaw, s32le, s32be, " +"s24le, s24be,\n" +" s24-32le, s24-32be (defaults to " +"s16ne)\n" +" --channels=CHANNELS The number of channels, 1 for mono, " +"2 for stereo\n" +" (defaults to 2)\n" +" --channel-map=CHANNELMAP Channel map to use instead of the " +"default\n" +" --fix-format Take the sample format from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-rate Take the sampling rate from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-channels Take the number of channels and the " +"channel map\n" +" from the sink the stream is being " +"connected to.\n" +" --no-remix Don't upmix or downmix channels.\n" +" --no-remap Map channels by index instead of " +"name.\n" +" --latency=BYTES Request the specified latency in " +"bytes.\n" +" --process-time=BYTES Request the specified process time " +"per request in bytes.\n" +" --property=PROPERTY=VALUE Set the specified property to the " +"specified value.\n" +" --raw Record/play raw PCM data.\n" +" --file-format=FFORMAT Record/play formatted PCM data.\n" +" --list-file-formats List available file formats.\n" +msgstr "" +"%s [options]\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -r, --record Create a connection for recording\n" +" -p, --playback Create a connection for playback\n" +"\n" +" -v, --verbose Enable verbose operations\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -d, --device=DEVICE The name of the sink/source to " +"connect to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" +" --stream-name=NAME How to call this stream on the " +"server\n" +" --volume=VOLUME Specify the initial (linear) volume " +"in range 0...65536\n" +" --rate=SAMPLERATE The sample rate in Hz (defaults to " +"44100)\n" +" --format=SAMPLEFORMAT The sample type, one of s16le, " +"s16be, u8, float32le,\n" +" float32be, ulaw, alaw, s32le, s32be, " +"s24le, s24be,\n" +" s24-32le, s24-32be (defaults to " +"s16ne)\n" +" --channels=CHANNELS The number of channels, 1 for mono, " +"2 for stereo\n" +" (defaults to 2)\n" +" --channel-map=CHANNELMAP Channel map to use instead of the " +"default\n" +" --fix-format Take the sample format from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-rate Take the sampling rate from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-channels Take the number of channels and the " +"channel map\n" +" from the sink the stream is being " +"connected to.\n" +" --no-remix Don't upmix or downmix channels.\n" +" --no-remap Map channels by index instead of " +"name.\n" +" --latency=BYTES Request the specified latency in " +"bytes.\n" +" --process-time=BYTES Request the specified process time " +"per request in bytes.\n" +" --property=PROPERTY=VALUE Set the specified property to the " +"specified value.\n" +" --raw Record/play raw PCM data.\n" +" --file-format=FFORMAT Record/play formatted PCM data.\n" +" --list-file-formats List available file formats.\n" + +#: ../src/utils/pacat.c:731 +#, c-format +msgid "" +"pacat %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pacat %s\n" +"libpulse %s शी कंपाई केले\n" +"libpulse %s शी लिंक केले\n" + +#: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953 +#, c-format +msgid "Invalid client name '%s'" +msgstr "अवैध क्लाएंटचे नाव '%s'" + +#: ../src/utils/pacat.c:779 +#, c-format +msgid "Invalid stream name '%s'" +msgstr "अवैध स्ट्रीमचे नाव '%s'" + +#: ../src/utils/pacat.c:816 +#, c-format +msgid "Invalid channel map '%s'" +msgstr "अवैध वाहिनी नकाशा '%s'" + +#: ../src/utils/pacat.c:845 +#, c-format +msgid "Invalid latency specification '%s'" +msgstr "अवैध विलंब संयोजना '%s'" + +#: ../src/utils/pacat.c:852 +#, c-format +msgid "Invalid process time specification '%s'" +msgstr "अवैध कार्य वेळ संयोजना '%s'" + +#: ../src/utils/pacat.c:864 +#, c-format +msgid "Invalid property '%s'" +msgstr "अवैध गुणधर्म '%s'" + +#: ../src/utils/pacat.c:881 +#, c-format +msgid "Unknown file format %s." +msgstr "अपरिचीत फाइल रूपण %s." + +#: ../src/utils/pacat.c:900 +msgid "Invalid sample specification" +msgstr "अवैध सॅम्पल संयोजना" + +#: ../src/utils/pacat.c:910 +#, c-format +msgid "open(): %s" +msgstr "open(): %s" + +#: ../src/utils/pacat.c:915 +#, c-format +msgid "dup2(): %s" +msgstr "dup2(): %s" + +#: ../src/utils/pacat.c:922 +msgid "Too many arguments." +msgstr "खूप जास्त बाब." + +#: ../src/utils/pacat.c:933 +msgid "Failed to generate sample specification for file." +msgstr "फाइलसाठी सॅम्पल माहिती प्राप्त करण्यास अपयशी." + +#: ../src/utils/pacat.c:953 +msgid "Failed to open audio file." +msgstr "आवाज फाइल उघडण्यास अपयशी." + +#: ../src/utils/pacat.c:959 +msgid "" +"Warning: specified sample specification will be overwritten with " +"specification from file." +msgstr "सावधानता: निर्देशीत चाचणी संयोजना फाइलमधील संयोजनाशी खोडून पुनः लिहीली जाईल." + +#: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997 +msgid "Failed to determine sample specification from file." +msgstr "फाइलपासून चाचणी संयोजना माहिती प्राप्त करण्यास अपयशी." + +#: ../src/utils/pacat.c:971 +msgid "Warning: Failed to determine channel map from file." +msgstr "सावधानता: फाइलपासून वाहिनी नकाशा ओळखण्यास अपयशी." + +#: ../src/utils/pacat.c:982 +msgid "Channel map doesn't match sample specification" +msgstr "वाहिनी नकाशा चाचणी संयोजनाशी जुळत नाही" + +#: ../src/utils/pacat.c:993 +msgid "Warning: failed to write channel map to file." +msgstr "सावधानता: वाहिनी नकाशा फाइलमध्ये लिहण्यास अपयशी." + +#: ../src/utils/pacat.c:1008 +#, c-format +msgid "" +"Opening a %s stream with sample specification '%s' and channel map '%s'." +msgstr "%s स्ट्रीम चाचणी संयोजना '%s' व वाहिनी नकाशा '%s' सह उघडत आहे." + +#: ../src/utils/pacat.c:1009 +msgid "recording" +msgstr "रेकॉर्डींग" + +#: ../src/utils/pacat.c:1009 +msgid "playback" +msgstr "प्लेबॅक" + +#: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267 +msgid "pa_mainloop_new() failed." +msgstr "pa_mainloop_new() अपयशी." + +#: ../src/utils/pacat.c:1054 +msgid "io_new() failed." +msgstr "io_new() अपयशी." + +#: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279 +msgid "pa_context_new() failed." +msgstr "pa_context_new() अपयशी." + +#: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285 +#, c-format +msgid "pa_context_connect() failed: %s" +msgstr "pa_context_connect() अपयशी: %s" + +#: ../src/utils/pacat.c:1075 +msgid "pa_context_rttime_new() failed." +msgstr "pa_context_rrttime_new() अपयशी." + +#: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290 +msgid "pa_mainloop_run() failed." +msgstr "pa_mainloop_run() अपयशी." + +#: ../src/utils/pasuspender.c:81 +#, c-format +msgid "fork(): %s\n" +msgstr "fork(): %s\n" + +#: ../src/utils/pasuspender.c:92 +#, c-format +msgid "execvp(): %s\n" +msgstr "execvp(): %s\n" + +#: ../src/utils/pasuspender.c:109 +#, c-format +msgid "Failure to suspend: %s\n" +msgstr "सस्पेंड करण्यास अपयशी: %s\n" + +#: ../src/utils/pasuspender.c:124 +#, c-format +msgid "Failure to resume: %s\n" +msgstr "पुन्हा चालू करण्यास अपयशी: %s\n" + +#: ../src/utils/pasuspender.c:147 +#, c-format +msgid "WARNING: Sound server is not local, not suspending.\n" +msgstr "सावधानता: आवाज सर्वर स्थानीय नाही, सस्पेंड करत नाही.\n" + +#: ../src/utils/pasuspender.c:159 +#, c-format +msgid "Connection failure: %s\n" +msgstr "जुळवणी अपयशी: %s\n" + +#: ../src/utils/pasuspender.c:176 +#, c-format +msgid "Got SIGINT, exiting.\n" +msgstr "SIGINT प्राप्त झाले, बाहेर पडत आहे.\n" + +#: ../src/utils/pasuspender.c:194 +#, c-format +msgid "WARNING: Child process terminated by signal %u\n" +msgstr "सावधानता: उप कार्य संकेत %u द्वारे नष्ट करण्यात आले\n" + +#: ../src/utils/pasuspender.c:212 +#, c-format +msgid "" +"%s [options] ... \n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +"\n" +msgstr "" +"%s [options] ... \n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +"\n" + +#: ../src/utils/pasuspender.c:248 +#, c-format +msgid "" +"pasuspender %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pasuspender %s\n" +"libpulse %s शी कंपाई केले\n" +"libpulse %s शी लिंक केले\n" + +#: ../src/utils/pasuspender.c:277 +#, c-format +msgid "pa_mainloop_new() failed.\n" +msgstr "pa_mainloop_new() अपयशी.\n" + +#: ../src/utils/pasuspender.c:290 +#, c-format +msgid "pa_context_new() failed.\n" +msgstr "pa_context_new() अपयशी.\n" + +#: ../src/utils/pasuspender.c:298 +#, c-format +msgid "pa_mainloop_run() failed.\n" +msgstr "pa_mainloop_run() अपयशी.\n" + +#: ../src/utils/pactl.c:135 +#, c-format +msgid "Failed to get statistics: %s" +msgstr "आकडेवारी प्राप्त करण्यास अपयशी: %s" + +#: ../src/utils/pactl.c:141 +#, c-format +msgid "Currently in use: %u blocks containing %s bytes total.\n" +msgstr "वर्तमानक्षणी वापरणीत आहे: %2$s बाईटस् समाविष्टीत एकूण %1$u ब्लॉक्स् .\n" + +#: ../src/utils/pactl.c:144 +#, c-format +msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n" +msgstr "संपूर्ण कार्यकाळवेळी लागू केले: %2$s बाईटस् समाविष्टीत एकूण %1$u ब्लॉक्स् .\n" + +#: ../src/utils/pactl.c:147 +#, c-format +msgid "Sample cache size: %s\n" +msgstr "सॅपल कॅशे आकार: %s\n" + +#: ../src/utils/pactl.c:156 +#, c-format +msgid "Failed to get server information: %s" +msgstr "सर्वर माहिती प्राप्त करण्यास अपयशी: %s" + +#: ../src/utils/pactl.c:164 +#, c-format +msgid "" +"User name: %s\n" +"Host Name: %s\n" +"Server Name: %s\n" +"Server Version: %s\n" +"Default Sample Specification: %s\n" +"Default Channel Map: %s\n" +"Default Sink: %s\n" +"Default Source: %s\n" +"Cookie: %08x\n" +msgstr "" +"वापरकर्ता नाव: %s\n" +"आयोजक नाव: %s\n" +"सर्वर नाव: %s\n" +"सर्वर आवृत्ती: %s\n" +"मुलभूत सॅम्पल संयोनजा: %s\n" +"मुलभूत वाहिनी नकाशा: %s\n" +"मुलभूत सींक: %s\n" +"मुलभूत स्रोत: %s\n" +"कुकीज: %08x\n" + +#: ../src/utils/pactl.c:205 +#, c-format +msgid "Failed to get sink information: %s" +msgstr "sink माहिती प्राप्त करण्यास अपयशी: %s" + +#: ../src/utils/pactl.c:221 +#, c-format +msgid "" +"Sink #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor Source: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Sink #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor Source: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360 +#, c-format +msgid "\tPorts:\n" +msgstr "\tपोर्टस्:\n" + +#: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366 +#, c-format +msgid "\tActive Port: %s\n" +msgstr "\tसक्रीय पोर्ट: %s\n" + +#: ../src/utils/pactl.c:297 +#, c-format +msgid "Failed to get source information: %s" +msgstr "स्रोत माहिती प्राप्त करण्यास अपयशी: %s" + +#: ../src/utils/pactl.c:313 +#, c-format +msgid "" +"Source #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor of Sink: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Source #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor of Sink: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:345 ../src/utils/pactl.c:401 ../src/utils/pactl.c:436 +#: ../src/utils/pactl.c:473 ../src/utils/pactl.c:532 ../src/utils/pactl.c:533 +#: ../src/utils/pactl.c:543 ../src/utils/pactl.c:587 ../src/utils/pactl.c:588 +#: ../src/utils/pactl.c:594 ../src/utils/pactl.c:637 ../src/utils/pactl.c:638 +#: ../src/utils/pactl.c:645 +msgid "n/a" +msgstr "n/a" + +#: ../src/utils/pactl.c:375 +#, c-format +msgid "Failed to get module information: %s" +msgstr "विभाग माहिती प्राप्त करण्यास अपयशी: %s" + +#: ../src/utils/pactl.c:393 +#, c-format +msgid "" +"Module #%u\n" +"\tName: %s\n" +"\tArgument: %s\n" +"\tUsage counter: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Module #%u\n" +"\tName: %s\n" +"\tArgument: %s\n" +"\tUsage counter: %s\n" +"\tProperties:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:412 +#, c-format +msgid "Failed to get client information: %s" +msgstr "क्लाऐंट माहिती प्राप्त करण्यास अपयशी: %s" + +#: ../src/utils/pactl.c:430 +#, c-format +msgid "" +"Client #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Client #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:447 +#, c-format +msgid "Failed to get card information: %s" +msgstr "कार्ड माहिती प्राप्त करण्यास अपयशी: %s" + +#: ../src/utils/pactl.c:465 +#, c-format +msgid "" +"Card #%u\n" +"\tName: %s\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Card #%u\n" +"\tName: %s\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:479 +#, c-format +msgid "\tProfiles:\n" +msgstr "\tसंक्षिप्त माहिती:\n" + +#: ../src/utils/pactl.c:485 +#, c-format +msgid "\tActive Profile: %s\n" +msgstr "\tसक्रीय संक्षिप्त माहिती: %s\n" + +#: ../src/utils/pactl.c:496 +#, c-format +msgid "Failed to get sink input information: %s" +msgstr "सींक इंपुट माहिती प्राप्त करण्यास अपयशी: %s" + +#: ../src/utils/pactl.c:515 +#, c-format +msgid "" +"Sink Input #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSink: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tMute: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSink Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Sink Input #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSink: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tMute: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSink Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:554 +#, c-format +msgid "Failed to get source output information: %s" +msgstr "स्रोत आऊटपुट माहिती प्राप्त करण्यास अपयशी: %s" + +#: ../src/utils/pactl.c:574 +#, c-format +msgid "" +"Source Output #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSource: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSource Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Source Output #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSource: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSource Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:605 +#, c-format +msgid "Failed to get sample information: %s" +msgstr "सॅम्पल माहिती प्राप्त करण्यास अपयशी: %s" + +#: ../src/utils/pactl.c:623 +#, c-format +msgid "" +"Sample #%u\n" +"\tName: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tDuration: %0.1fs\n" +"\tSize: %s\n" +"\tLazy: %s\n" +"\tFilename: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Sample #%u\n" +"\tName: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tDuration: %0.1fs\n" +"\tSize: %s\n" +"\tLazy: %s\n" +"\tFilename: %s\n" +"\tProperties:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663 +#, c-format +msgid "Failure: %s" +msgstr "अपयशी: %s" + +#: ../src/utils/pactl.c:687 +#, c-format +msgid "Failed to upload sample: %s" +msgstr "सॅम्पल अपलोड करण्यास अपयशी: %s" + +#: ../src/utils/pactl.c:704 +msgid "Premature end of file" +msgstr "फाइलची अयोग्य समाप्ती" + +#: ../src/utils/pactl.c:863 +msgid "Got SIGINT, exiting." +msgstr "SIGINT प्राप्त झाले, बाहेर पडत आहे." + +#: ../src/utils/pactl.c:869 +#, c-format +msgid "" +"%s [options] stat\n" +"%s [options] list\n" +"%s [options] exit\n" +"%s [options] upload-sample FILENAME [NAME]\n" +"%s [options] play-sample NAME [SINK]\n" +"%s [options] remove-sample NAME\n" +"%s [options] move-sink-input SINKINPUT SINK\n" +"%s [options] move-source-output SOURCEOUTPUT SOURCE\n" +"%s [options] load-module NAME [ARGS ...]\n" +"%s [options] unload-module MODULE\n" +"%s [options] suspend-sink SINK 1|0\n" +"%s [options] suspend-source SOURCE 1|0\n" +"%s [options] set-card-profile CARD PROFILE\n" +"%s [options] set-sink-port SINK PORT\n" +"%s [options] set-source-port SOURCE PORT\n" +"%s [options] set-sink-volume SINK VOLUME\n" +"%s [options] set-source-volume SOURCE VOLUME\n" +"%s [options] set-sink-input-volume SINKINPUT VOLUME\n" +"%s [options] set-sink-mute SINK 1|0\n" +"%s [options] set-source-mute SOURCE 1|0\n" +"%s [options] set-sink-input-mute SINKINPUT 1|0\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" +msgstr "" +"%s [options] stat\n" +"%s [options] list\n" +"%s [options] exit\n" +"%s [options] upload-sample FILENAME [NAME]\n" +"%s [options] play-sample NAME [SINK]\n" +"%s [options] remove-sample NAME\n" +"%s [options] move-sink-input SINKINPUT SINK\n" +"%s [options] move-source-output SOURCEOUTPUT SOURCE\n" +"%s [options] load-module NAME [ARGS ...]\n" +"%s [options] unload-module MODULE\n" +"%s [options] suspend-sink SINK 1|0\n" +"%s [options] suspend-source SOURCE 1|0\n" +"%s [options] set-card-profile CARD PROFILE\n" +"%s [options] set-sink-port SINK PORT\n" +"%s [options] set-source-port SOURCE PORT\n" +"%s [options] set-sink-volume SINK VOLUME\n" +"%s [options] set-source-volume SOURCE VOLUME\n" +"%s [options] set-sink-input-volume SINKINPUT VOLUME\n" +"%s [options] set-sink-mute SINK 1|0\n" +"%s [options] set-source-mute SOURCE 1|0\n" +"%s [options] set-sink-input-mute SINKINPUT 1|0\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" + +#: ../src/utils/pactl.c:933 +#, c-format +msgid "" +"pactl %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pactl %s\n" +"libpulse %s सह कंपाईल केले\n" +"libpulse %s सह जुळले\n" + +#: ../src/utils/pactl.c:979 +msgid "Please specify a sample file to load" +msgstr "कृपया दाखल करण्याजोगी तात्पूर्ती फाइल निर्देशीत करा" + +#: ../src/utils/pactl.c:992 +msgid "Failed to open sound file." +msgstr "आवाज फाइल उघडण्यास अपयशी." + +#: ../src/utils/pactl.c:1004 +msgid "Warning: Failed to determine sample specification from file." +msgstr "सावधानता: फाइलपासून चाचणी संयोजना ओळखण्यास अपयशी." + +#: ../src/utils/pactl.c:1014 +msgid "You have to specify a sample name to play" +msgstr "चालवण्याकरीता तुम्हाला तात्पूर्ते नाव निश्चित करावे लागेल" + +#: ../src/utils/pactl.c:1026 +msgid "You have to specify a sample name to remove" +msgstr "काढून टाकण्याकरीता तुम्हाला तात्पूर्ते नाव निश्चित करावे लागेल" + +#: ../src/utils/pactl.c:1035 +msgid "You have to specify a sink input index and a sink" +msgstr "तुम्हाला सींक इंपुट निर्देशांक व सींक निश्चित करावे लागेल" + +#: ../src/utils/pactl.c:1045 +msgid "You have to specify a source output index and a source" +msgstr "तुम्हाला आऊटपुट इंडेक्स स्रोत व स्रोत निश्चित करावे लागेल" + +#: ../src/utils/pactl.c:1060 +msgid "You have to specify a module name and arguments." +msgstr "तुम्हाला विभागाचे नाव व बाब निश्चित करावे लागेल." + +#: ../src/utils/pactl.c:1080 +msgid "You have to specify a module index" +msgstr "तुम्हाला विभाग इंडेक्स् निश्चित करावे लागेल" + +#: ../src/utils/pactl.c:1090 +msgid "" +"You may not specify more than one sink. You have to specify a boolean value." +msgstr "" +"तुम्ही एकापेक्षा जास्त सींक निश्चित करू शकत नाही. तुम्हाला बूलीयन मूल्य निश्चित करावे लागेल." + +#: ../src/utils/pactl.c:1103 +msgid "" +"You may not specify more than one source. You have to specify a boolean " +"value." +msgstr "" +"तुम्ही एकापेक्षा जास्त स्रोत निश्चित करू शकत नाही. तुम्हाला बूलीयन मूल्य निश्चित करावे लागेल." + +#: ../src/utils/pactl.c:1115 +msgid "You have to specify a card name/index and a profile name" +msgstr "तुम्हाला कार्डचे नाव/इंडेक्स् व प्रोफाइल नाव निश्चित करावे लागेल" + +#: ../src/utils/pactl.c:1126 +msgid "You have to specify a sink name/index and a port name" +msgstr "तुम्हाला सींक नाव/इंडेक्स् व पोर्टचे नाव निश्चित करावे लागेल" + +#: ../src/utils/pactl.c:1137 +msgid "You have to specify a source name/index and a port name" +msgstr "तुम्हाला स्रोत नाव/इंडेक्स् व पोर्टचे नाव निश्चित करावे लागेल" + +#: ../src/utils/pactl.c:1149 +msgid "You have to specify a sink name/index and a volume" +msgstr "तुम्हाला सींक नाव/इंडेक्स् व पोर्टचे नाव निश्चित करावे लागेल" + +#: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171 +#: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209 +#: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248 +msgid "Invalid volume specification" +msgstr "अवैध खंडाची संयोजना" + +#: ../src/utils/pactl.c:1166 +msgid "You have to specify a source name/index and a volume" +msgstr "तुम्हाला स्रोत नाव/इंडेक्स् व खंडाचे नाव निश्चित करावे लागेल" + +#: ../src/utils/pactl.c:1183 +msgid "You have to specify a sink input index and a volume" +msgstr "तुम्हाला सींक इंपुट इंडेक्स् व सींक निश्चित करावे लागेल" + +#: ../src/utils/pactl.c:1188 +msgid "Invalid sink input index" +msgstr "अवैध सींक इंपुट इंडेक्स्" + +#: ../src/utils/pactl.c:1204 +msgid "You have to specify a sink name/index and a mute boolean" +msgstr "तुम्हाला सींक नाव/इंडेक्स् व पोर्टचे नाव निश्चित करावे लागेल" + +#: ../src/utils/pactl.c:1221 +msgid "You have to specify a source name/index and a mute boolean" +msgstr "तुम्हाला स्रोत नाव/इंडेक्स् व पोर्टचे नाव निश्चित करावे लागेल" + +#: ../src/utils/pactl.c:1238 +msgid "You have to specify a sink input index and a mute boolean" +msgstr "तुम्हाला सींक इंपुट निर्देशांक व सींक निश्चित करावे लागेल" + +#: ../src/utils/pactl.c:1243 +msgid "Invalid sink input index specification" +msgstr "अवैध सींक इंपुट इंडेक्स् संयोजना" + +#: ../src/utils/pactl.c:1262 +msgid "No valid command specified." +msgstr "वैध आदेश निश्चित केले नाही." + +#: ../src/utils/pax11publish.c:61 +#, c-format +msgid "" +"%s [-D display] [-S server] [-O sink] [-I source] [-c file] [-d|-e|-i|-r]\n" +"\n" +" -d Show current PulseAudio data attached to X11 display (default)\n" +" -e Export local PulseAudio data to X11 display\n" +" -i Import PulseAudio data from X11 display to local environment " +"variables and cookie file.\n" +" -r Remove PulseAudio data from X11 display\n" +msgstr "" +"%s [-D display] [-S server] [-O sink] [-I source] [-c file] [-d|-e|-i|-r]\n" +"\n" +" -d Show current PulseAudio data attached to X11 display (default)\n" +" -e Export local PulseAudio data to X11 display\n" +" -i Import PulseAudio data from X11 display to local environment " +"variables and cookie file.\n" +" -r Remove PulseAudio data from X11 display\n" + +#: ../src/utils/pax11publish.c:94 +#, c-format +msgid "Failed to parse command line.\n" +msgstr "आदेश ओळ वाचण्यास अपयशी.\n" + +#: ../src/utils/pax11publish.c:108 +#, c-format +msgid "Server: %s\n" +msgstr "सर्वर: %s\n" + +#: ../src/utils/pax11publish.c:110 +#, c-format +msgid "Source: %s\n" +msgstr "स्रोत: %s\n" + +#: ../src/utils/pax11publish.c:112 +#, c-format +msgid "Sink: %s\n" +msgstr "सींक: %s\n" + +#: ../src/utils/pax11publish.c:114 +#, c-format +msgid "Cookie: %s\n" +msgstr "कुकीज: %s\n" + +#: ../src/utils/pax11publish.c:132 +#, c-format +msgid "Failed to parse cookie data\n" +msgstr "कुकीज माहिती वाचण्यास अपयशी\n" + +#: ../src/utils/pax11publish.c:137 +#, c-format +msgid "Failed to save cookie data\n" +msgstr "कुकी डेटा साठवण्यास अपयशी\n" + +#: ../src/utils/pax11publish.c:152 +#, c-format +msgid "Failed to load client configuration file.\n" +msgstr "क्लाऐंट संयोजना फाइल दाखल करण्यास अपयशी.\n" + +#: ../src/utils/pax11publish.c:157 +#, c-format +msgid "Failed to read environment configuration data.\n" +msgstr "वातावरण संयोजना डेटा वाचण्यास अपयशी.\n" + +#: ../src/utils/pax11publish.c:174 +#, c-format +msgid "Failed to get FQDN.\n" +msgstr "FQDN प्राप्त करण्यास अपयशी.\n" + +#: ../src/utils/pax11publish.c:194 +#, c-format +msgid "Failed to load cookie data\n" +msgstr "कुकी डेटा दाखल करण्यास अपयशी\n" + +#: ../src/utils/pax11publish.c:211 +#, c-format +msgid "Not yet implemented.\n" +msgstr "अजूनही लागू केले नाही.\n" + +#: ../src/utils/pacmd.c:69 +msgid "No PulseAudio daemon running, or not running as session daemon." +msgstr "PulseAudio डिमन कार्यरत नाही, किंवा सत्र डिमन नुरूप कार्यरत नाही." + +#: ../src/utils/pacmd.c:74 +#, c-format +msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s" +msgstr "socket(PF_UNIX, SOCK_STREAM, 0): %s" + +#: ../src/utils/pacmd.c:91 +#, c-format +msgid "connect(): %s" +msgstr "connect(): %s" + +#: ../src/utils/pacmd.c:99 +msgid "Failed to kill PulseAudio daemon." +msgstr "PulseAudio डिमन पूर्णपणे नष्ट करण्यास अपयशी." + +#: ../src/utils/pacmd.c:107 +msgid "Daemon not responding." +msgstr "डिमन प्रतिसाद देत नाही." + +#: ../src/utils/pacmd.c:161 +#, c-format +msgid "poll(): %s" +msgstr "poll(): %s" + +#: ../src/utils/pacmd.c:171 ../src/utils/pacmd.c:188 +#, c-format +msgid "read(): %s" +msgstr "read(): %s" + +#: ../src/utils/pacmd.c:207 ../src/utils/pacmd.c:223 +#, c-format +msgid "write(): %s" +msgstr "write(): %s" + +#: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:219 +msgid "Cannot access autospawn lock." +msgstr "autospawn कुलूप करीता प्रवेश प्राप्य अशक्य." + +#: ../src/modules/alsa/alsa-sink.c:530 ../src/modules/alsa/alsa-sink.c:689 +#, c-format +msgid "" +"ALSA woke us up to write new data to the device, but there was actually " +"nothing to write!\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers.\n" +"We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() " +"returned 0 or another value < min_avail." +msgstr "" +"ALSA साधनवर नवीन डेटा लिहण्याकरीता सज्ज झाले, परंतु लिहण्याकरीता काहीच आढळले नाही!\n" +"हे सहसा ALSA ड्राइवर '%s' अंतर्गत बग आहे. कृपया ही अडचण ALSA डेव्हलपर करीता कळवा.\n" +"POLLOUT द्वारे सज्ज होणे शक्य आहे -- तरी परस्पर snd_pcm_avail() ने 0 पूरविले किंवा इतर " +"मूल्य < min_avail असावे." + +#: ../src/modules/alsa/alsa-source.c:506 ../src/modules/alsa/alsa-source.c:656 +#, c-format +msgid "" +"ALSA woke us up to read new data from the device, but there was actually " +"nothing to read!\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers.\n" +"We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() " +"returned 0 or another value < min_avail." +msgstr "" +"ALSA साधनवर नवीन डेटा लिहण्याकरीता सज्ज झाले, परंतु लिहण्याकरीता काहीच आढळले नाही!\n" +"हे सहसा ALSA ड्राइवर '%s' अंतर्गत बग आहे. कृपया ही अडचण ALSA डेव्हलपर करीता कळवा.\n" +"POLLIN द्वारे सज्ज होणे शक्य आहे -- तरी परस्पर snd_pcm_avail() ने 0 पूरविले किंवा इतर " +"मूल्य < min_avail असावे." + +#: ../src/modules/alsa/module-alsa-card.c:152 +#: ../src/modules/bluetooth/module-bluetooth-device.c:2228 +#: ../src/modules/alsa/alsa-mixer.c:2931 +msgid "Off" +msgstr "बंद करा" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2184 +msgid "High Fidelity Playback (A2DP)" +msgstr "हाय फिडेलिटी प्लेबॅक (A2DP)" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2198 +msgid "High Fidelity Capture (A2DP)" +msgstr "हाय फिडीलीटी कॅपचर (A2DP)" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2213 +msgid "Telephony Duplex (HSP/HFP)" +msgstr "टेलिफोनी ड्युप्लेक्स् (HSP/HFP)" + +#: ../src/modules/reserve-wrap.c:151 +msgid "PulseAudio Sound Server" +msgstr "PulseAudio आवाज सर्वर" + +#: ../src/modules/module-rygel-media-server.c:569 +#: ../src/modules/module-rygel-media-server.c:583 +msgid "Output Devices" +msgstr "" + +#: ../src/modules/module-rygel-media-server.c:570 +#: ../src/modules/module-rygel-media-server.c:584 +msgid "Input Devices" +msgstr "" + +#: ../src/modules/module-rygel-media-server.c:774 +msgid "Audio on @HOSTNAME@" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1701 +msgid "Input" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1702 +msgid "Docking Station Input" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1703 +msgid "Docking Station Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1704 +msgid "Line-In" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1705 +msgid "Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1706 +msgid "External Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1707 +#, fuzzy +msgid "Internal Microphone" +msgstr "आंतरीक ऑडिओ" + +#: ../src/modules/alsa/alsa-mixer.c:1708 +msgid "Radio" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1709 +msgid "Video" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1710 +msgid "Automatic Gain Control" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1711 +msgid "No Automatic Gain Control" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1712 +msgid "Boost" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1713 +msgid "No Boost" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1714 +msgid "Amplifier" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1715 +msgid "No Amplifier" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1773 +msgid "Analog Input" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1774 +msgid "Analog Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1775 +msgid "Analog Line-In" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1776 +msgid "Analog Radio" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1777 +msgid "Analog Video" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1778 +#, fuzzy +msgid "Analog Output" +msgstr "Null आऊटपुट" + +#: ../src/modules/alsa/alsa-mixer.c:1779 +msgid "Analog Headphones" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1780 +msgid "Analog Output (LFE)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1781 +msgid "Analog Mono Output" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1981 +#, fuzzy, c-format +msgid "%s+%s" +msgstr "%s %s" + +#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404 +#, fuzzy, c-format +msgid "%s / %s" +msgstr "%s %s" + +#: ../src/modules/alsa/alsa-mixer.c:2790 +msgid "Analog Mono" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2791 +#, fuzzy +msgid "Analog Stereo" +msgstr "स्टिरीओ" + +#: ../src/modules/alsa/alsa-mixer.c:2792 +#, fuzzy +msgid "Analog Surround 2.1" +msgstr "सराऊन्ड 4.1" + +#: ../src/modules/alsa/alsa-mixer.c:2793 +#, fuzzy +msgid "Analog Surround 3.0" +msgstr "सराऊन्ड 4.0" + +#: ../src/modules/alsa/alsa-mixer.c:2794 +#, fuzzy +msgid "Analog Surround 3.1" +msgstr "सराऊन्ड 4.1" + +#: ../src/modules/alsa/alsa-mixer.c:2795 +#, fuzzy +msgid "Analog Surround 4.0" +msgstr "सराऊन्ड 4.0" + +#: ../src/modules/alsa/alsa-mixer.c:2796 +#, fuzzy +msgid "Analog Surround 4.1" +msgstr "सराऊन्ड 4.1" + +#: ../src/modules/alsa/alsa-mixer.c:2797 +#, fuzzy +msgid "Analog Surround 5.0" +msgstr "सराऊन्ड 5.0" + +#: ../src/modules/alsa/alsa-mixer.c:2798 +#, fuzzy +msgid "Analog Surround 5.1" +msgstr "सराऊन्ड 5.1" + +#: ../src/modules/alsa/alsa-mixer.c:2799 +#, fuzzy +msgid "Analog Surround 6.0" +msgstr "सराऊन्ड 4.0" + +#: ../src/modules/alsa/alsa-mixer.c:2800 +#, fuzzy +msgid "Analog Surround 6.1" +msgstr "सराऊन्ड 4.1" + +#: ../src/modules/alsa/alsa-mixer.c:2801 +#, fuzzy +msgid "Analog Surround 7.0" +msgstr "सराऊन्ड 4.0" + +#: ../src/modules/alsa/alsa-mixer.c:2802 +#, fuzzy +msgid "Analog Surround 7.1" +msgstr "सराऊन्ड 7.1" + +#: ../src/modules/alsa/alsa-mixer.c:2803 +msgid "Digital Stereo (IEC958)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2804 +msgid "Digital Surround 4.0 (IEC958)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2805 +msgid "Digital Surround 4.0 (IEC958/AC3)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2806 +msgid "Digital Surround 5.1 (IEC958/AC3)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2807 +msgid "Digital Stereo (HDMI)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2928 +msgid "Analog Mono Duplex" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2929 +msgid "Analog Stereo Duplex" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2930 +msgid "Digital Stereo Duplex (IEC958)" +msgstr "" diff --git a/po/nl.po b/po/nl.po new file mode 100644 index 0000000..a1c127e --- /dev/null +++ b/po/nl.po @@ -0,0 +1,2686 @@ +# Dutch translation of pulseaudio.master-tx. +# Copyright (C) 2009 THE pulseaudio.master-tx'S COPYRIGHT HOLDER +# This file is distributed under the same license as the pulseaudio.master-tx package. +# Geert Warrink , 2009. +# Reinout van Schouwen , 2009 +# +# +msgid "" +msgstr "" +"Project-Id-Version: pulseaudio.master-tx\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-10-14 04:44+0000\n" +"PO-Revision-Date: 2009-10-14 11:00+0100\n" +"Last-Translator: Reinout van Schouwen \n" +"Language-Team: Dutch \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" + +#: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629 +#, c-format +msgid "%s %s" +msgstr "%s %s" + +#: ../src/modules/alsa/alsa-util.c:1106 +#, c-format +msgid "" +"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu " +"ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_avail() gaf een waarde terug die uitzonderlijk groot is: %lu bytes (%" +"lu ms).\n" +"Waarschijnlijk is dit een fout in het ALSA-stuurprogramma ‘%s’. Meld dit " +"probleem alstublieft aan de ALSA-ontwikkelaars." + +#: ../src/modules/alsa/alsa-util.c:1147 +#, c-format +msgid "" +"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%" +"lu ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_delay() gaf een waarde terug die uitzonderlijk groot is: %li bytes (%" +"s%lu ms).\n" +"Waarschijnlijk is dit een fout in het ALSA-stuurprogramma ‘%s’. Meld dit " +"probleem alstublieft aan de ALSA-ontwikkelaars." + +#: ../src/modules/alsa/alsa-util.c:1194 +#, c-format +msgid "" +"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes " +"(%lu ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_mmap_begin() gaf een waarde terug die uitzonderlijk groot is: %lu " +"bytes (%lu ms).\n" +"Waarschijnlijk is dit een fout in het ALSA-stuurprogramma ‘%s’. Meld dit " +"probleem alstublieft aan de ALSA-ontwikkelaars." + +#: ../src/modules/module-always-sink.c:39 +msgid "Always keeps at least one sink loaded even if it's a null one" +msgstr "" +"Houdt altijd ten minste een afvoer ingeladen zelfs als het de null-afvoer is." + +#: ../src/modules/module-always-sink.c:83 +msgid "Dummy Output" +msgstr "Dummy-uitvoer" + +#: ../src/modules/module-ladspa-sink.c:49 +msgid "Virtual LADSPA sink" +msgstr "Virtuele LADSPA afvoer" + +#: ../src/modules/module-ladspa-sink.c:53 +msgid "" +"sink_name= sink_properties= " +"master= format= rate= " +"channels= channel_map= plugin= label= control=" +msgstr "" +"sink_name= sink_properties= " +"master= format= rate= channels= channel_map= plugin= label= control=" + +#: ../src/modules/module-null-sink.c:55 +msgid "Clocked NULL sink" +msgstr "Geklokte NULL afvoer" + +#: ../src/modules/module-null-sink.c:291 +msgid "Null Output" +msgstr "Null-uitvoer" + +#: ../src/pulsecore/sink.c:2613 +msgid "Internal Audio" +msgstr "Intern geluid" + +#: ../src/pulsecore/sink.c:2618 +msgid "Modem" +msgstr "Modem" + +#: ../src/daemon/ltdl-bind-now.c:124 +msgid "Failed to find original lt_dlopen loader." +msgstr "Kon de originele lt_dlopen lader niet vinden." + +#: ../src/daemon/ltdl-bind-now.c:129 +msgid "Failed to allocate new dl loader." +msgstr "Kon die nieuwe dl lader niet toekennen." + +#: ../src/daemon/ltdl-bind-now.c:142 +msgid "Failed to add bind-now-loader." +msgstr "Kon bind-now-loader niet toevoegen." + +#: ../src/daemon/main.c:141 +#, c-format +msgid "Got signal %s." +msgstr "Signaal %s ontvangen." + +#: ../src/daemon/main.c:168 +msgid "Exiting." +msgstr "Afsluiten." + +#: ../src/daemon/main.c:186 +#, c-format +msgid "Failed to find user '%s'." +msgstr "Kon gebruiker '%s' niet vinden." + +#: ../src/daemon/main.c:191 +#, c-format +msgid "Failed to find group '%s'." +msgstr "Kon groep ‘%s’ niet vinden." + +#: ../src/daemon/main.c:195 +#, c-format +msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)." +msgstr "Gebruiker ‘%s’ (UID %lu) en groep ‘%s’ (GID %lu) gevonden." + +#: ../src/daemon/main.c:200 +#, c-format +msgid "GID of user '%s' and of group '%s' don't match." +msgstr "GID van gebruiker ‘%s’ en van groep ‘%s’ passen niet bij elkaar." + +#: ../src/daemon/main.c:205 +#, c-format +msgid "Home directory of user '%s' is not '%s', ignoring." +msgstr "Persoonlijke map van gebruiker ‘%s’ is niet ‘%s’, negeer het." + +#: ../src/daemon/main.c:208 ../src/daemon/main.c:213 +#, c-format +msgid "Failed to create '%s': %s" +msgstr "Aanmaken van ‘%s’ mislukt: %s" + +#: ../src/daemon/main.c:220 +#, c-format +msgid "Failed to change group list: %s" +msgstr "Veranderen van groepslijst mislukt: %s" + +#: ../src/daemon/main.c:236 +#, c-format +msgid "Failed to change GID: %s" +msgstr "Veranderen van GID mislukt: %s" + +#: ../src/daemon/main.c:252 +#, c-format +msgid "Failed to change UID: %s" +msgstr "Veranderen van UID mislukt: %s" + +#: ../src/daemon/main.c:271 +msgid "Successfully dropped root privileges." +msgstr "Beheerdersrechten met succes laten vervallen." + +#: ../src/daemon/main.c:279 +msgid "System wide mode unsupported on this platform." +msgstr "Systeembrede modus wordt op dit platform niet ondersteund." + +#: ../src/daemon/main.c:297 +#, c-format +msgid "setrlimit(%s, (%u, %u)) failed: %s" +msgstr "setrlimit(%s, (%u, %u)) mislukte: %s" + +#: ../src/daemon/main.c:474 +msgid "Failed to parse command line." +msgstr "Analyseren van de opdrachtregel mislukte." + +#: ../src/daemon/main.c:541 +msgid "Daemon not running" +msgstr "Voorziening draait niet" + +#: ../src/daemon/main.c:543 +#, c-format +msgid "Daemon running as PID %u" +msgstr "Voorziening draait met PID %u" + +#: ../src/daemon/main.c:553 +#, c-format +msgid "Failed to kill daemon: %s" +msgstr "Elimineren van voorziening mislukt: ‘%s’" + +#: ../src/daemon/main.c:571 +msgid "" +"This program is not intended to be run as root (unless --system is " +"specified)." +msgstr "" +"Dit programma is niet bedoeld om als root gedraaid te worden (behalve als --" +"system is opgegeven)." + +#: ../src/daemon/main.c:573 +msgid "Root privileges required." +msgstr "Beheerdersrechten vereist." + +#: ../src/daemon/main.c:578 +msgid "--start not supported for system instances." +msgstr "--start wordt niet ondersteund voor systeeminstanties" + +#: ../src/daemon/main.c:583 +msgid "Running in system mode, but --disallow-exit not set!" +msgstr "Draaiend in systeemmodus, maar --disallow-exit is niet ingesteld!" + +#: ../src/daemon/main.c:586 +msgid "Running in system mode, but --disallow-module-loading not set!" +msgstr "" +"Draaiend in systeemmodus, maar --disallow-module-loading is niet gezet!" + +#: ../src/daemon/main.c:589 +msgid "Running in system mode, forcibly disabling SHM mode!" +msgstr "Draaiend in systeemmodus, geforceerd uitzetten van SHM-modus!" + +#: ../src/daemon/main.c:594 +msgid "Running in system mode, forcibly disabling exit idle time!" +msgstr "Draaiend in systeemmodus, geforceerd uitzetten van exit idle time!" + +#: ../src/daemon/main.c:621 +msgid "Failed to acquire stdio." +msgstr "Verkrijgen van stdio mislukte." + +#: ../src/daemon/main.c:627 +#, c-format +msgid "pipe failed: %s" +msgstr "pipe mislukte: %s" + +#: ../src/daemon/main.c:632 +#, c-format +msgid "fork() failed: %s" +msgstr "fork() mislukte: %s" + +#: ../src/daemon/main.c:646 ../src/utils/pacat.c:508 +#, c-format +msgid "read() failed: %s" +msgstr "read() mislukte: %s" + +#: ../src/daemon/main.c:652 +msgid "Daemon startup failed." +msgstr "Voorziening opstarten mislukt." + +#: ../src/daemon/main.c:654 +msgid "Daemon startup successful." +msgstr "Voorziening met succes opgestart." + +#: ../src/daemon/main.c:731 +#, c-format +msgid "This is PulseAudio %s" +msgstr "Dit is PulseAudio %s" + +#: ../src/daemon/main.c:732 +#, c-format +msgid "Compilation host: %s" +msgstr "Compilatiehost: %s" + +#: ../src/daemon/main.c:733 +#, c-format +msgid "Compilation CFLAGS: %s" +msgstr "Compilatie-CFLAGS: %s" + +#: ../src/daemon/main.c:736 +#, c-format +msgid "Running on host: %s" +msgstr "Draaiend op host: %s" + +#: ../src/daemon/main.c:739 +#, c-format +msgid "Found %u CPUs." +msgstr "%u CPU's gevonden." + +#: ../src/daemon/main.c:741 +#, c-format +msgid "Page size is %lu bytes" +msgstr "Pagina grootte is %lu bytes" + +#: ../src/daemon/main.c:744 +msgid "Compiled with Valgrind support: yes" +msgstr "Gecompileerd met Valgrind ondersteuning: ja" + +#: ../src/daemon/main.c:746 +msgid "Compiled with Valgrind support: no" +msgstr "Gecompileerd met Valgrind ondersteuning: nee" + +#: ../src/daemon/main.c:749 +#, c-format +msgid "Running in valgrind mode: %s" +msgstr "Draaiend in valgrind-modus: %s" + +#: ../src/daemon/main.c:752 +msgid "Optimized build: yes" +msgstr "Geoptimaliseerd gebouwd: ja" + +#: ../src/daemon/main.c:754 +msgid "Optimized build: no" +msgstr "Geoptimaliseerd gebouwd: nee" + +#: ../src/daemon/main.c:758 +msgid "NDEBUG defined, all asserts disabled." +msgstr "NDEBUG gedefinieerd, alle asserts uitgezet." + +#: ../src/daemon/main.c:760 +msgid "FASTPATH defined, only fast path asserts disabled." +msgstr "FASTPATH gedefinieerd, alleen fast path-asserts uitgezet." + +#: ../src/daemon/main.c:762 +msgid "All asserts enabled." +msgstr "Alle asserts aangezet." + +#: ../src/daemon/main.c:766 +msgid "Failed to get machine ID" +msgstr "Machine-ID verkrijgen mislukt" + +#: ../src/daemon/main.c:769 +#, c-format +msgid "Machine ID is %s." +msgstr "Machine-ID is: %s." + +#: ../src/daemon/main.c:773 +#, c-format +msgid "Session ID is %s." +msgstr "Sessie-ID is: %s." + +#: ../src/daemon/main.c:779 +#, c-format +msgid "Using runtime directory %s." +msgstr "Gebruik van runtime-map %s." + +#: ../src/daemon/main.c:784 +#, c-format +msgid "Using state directory %s." +msgstr "Verbruik van state-map %s." + +#: ../src/daemon/main.c:787 +#, c-format +msgid "Using modules directory %s." +msgstr "Gebruik van module-map %s." + +#: ../src/daemon/main.c:789 +#, c-format +msgid "Running in system mode: %s" +msgstr "Draaiend in systeemmodus: %s" + +#: ../src/daemon/main.c:792 +msgid "" +"OK, so you are running PA in system mode. Please note that you most likely " +"shouldn't be doing that.\n" +"If you do it nonetheless then it's your own fault if things don't work as " +"expected.\n" +"Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an " +"explanation why system mode is usually a bad idea." +msgstr "" +"OK, dus u draait PA in systeemmodus. Merk op dat u dit " +"waarschijnlijk beter niet kunt doen.\n" +"Als u het toch doet dan is het uw eigen schuld als dingen niet werken zoals " +"verwacht.\n" +"Lees http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode voor een " +"uitleg waarom systeemmodus gewoonlijk een slecht idee is." + +#: ../src/daemon/main.c:809 +msgid "pa_pid_file_create() failed." +msgstr "pa_pid_file_create() mislukte." + +#: ../src/daemon/main.c:819 +msgid "Fresh high-resolution timers available! Bon appetit!" +msgstr "Verse high-resolution timers beschikbaar! Smakelijk eten!" + +#: ../src/daemon/main.c:821 +msgid "" +"Dude, your kernel stinks! The chef's recommendation today is Linux with high-" +"resolution timers enabled!" +msgstr "" +"Kerel, je kernel stinkt! De aanbeveling van de chef is vandaag Linux met " +"aangezette high-resolution timers!" + +#: ../src/daemon/main.c:844 +msgid "pa_core_new() failed." +msgstr "pa_core_new() mislukte." + +#: ../src/daemon/main.c:904 +msgid "Failed to initialize daemon." +msgstr "Initialiseren van de voorziening mislukt." + +#: ../src/daemon/main.c:909 +msgid "Daemon startup without any loaded modules, refusing to work." +msgstr "Voorziening opgestart zonder geladen modules, dat werkt niet." + +#: ../src/daemon/main.c:926 +msgid "Daemon startup complete." +msgstr "Voorziening opstarten is klaar." + +#: ../src/daemon/main.c:932 +msgid "Daemon shutdown initiated." +msgstr "Voorziening afsluiten is begonnen." + +#: ../src/daemon/main.c:954 +msgid "Daemon terminated." +msgstr "Voorziening is afgesloten." + +#: ../src/daemon/cmdline.c:115 +#, c-format +msgid "" +"%s [options]\n" +"\n" +"COMMANDS:\n" +" -h, --help Show this help\n" +" --version Show version\n" +" --dump-conf Dump default configuration\n" +" --dump-modules Dump list of available modules\n" +" --dump-resample-methods Dump available resample methods\n" +" --cleanup-shm Cleanup stale shared memory " +"segments\n" +" --start Start the daemon if it is not " +"running\n" +" -k --kill Kill a running daemon\n" +" --check Check for a running daemon (only " +"returns exit code)\n" +"\n" +"OPTIONS:\n" +" --system[=BOOL] Run as system-wide instance\n" +" -D, --daemonize[=BOOL] Daemonize after startup\n" +" --fail[=BOOL] Quit when startup fails\n" +" --high-priority[=BOOL] Try to set high nice level\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_NICE)\n" +" --realtime[=BOOL] Try to enable realtime scheduling\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_RTPRIO)\n" +" --disallow-module-loading[=BOOL] Disallow module user requested " +"module\n" +" loading/unloading after startup\n" +" --disallow-exit[=BOOL] Disallow user requested exit\n" +" --exit-idle-time=SECS Terminate the daemon when idle and " +"this\n" +" time passed\n" +" --module-idle-time=SECS Unload autoloaded modules when idle " +"and\n" +" this time passed\n" +" --scache-idle-time=SECS Unload autoloaded samples when idle " +"and\n" +" this time passed\n" +" --log-level[=LEVEL] Increase or set verbosity level\n" +" -v Increase the verbosity level\n" +" --log-target={auto,syslog,stderr} Specify the log target\n" +" --log-meta[=BOOL] Include code location in log " +"messages\n" +" --log-time[=BOOL] Include timestamps in log messages\n" +" --log-backtrace=FRAMES Include a backtrace in log messages\n" +" -p, --dl-search-path=PATH Set the search path for dynamic " +"shared\n" +" objects (plugins)\n" +" --resample-method=METHOD Use the specified resampling method\n" +" (See --dump-resample-methods for\n" +" possible values)\n" +" --use-pid-file[=BOOL] Create a PID file\n" +" --no-cpu-limit[=BOOL] Do not install CPU load limiter on\n" +" platforms that support it.\n" +" --disable-shm[=BOOL] Disable shared memory support.\n" +"\n" +"STARTUP SCRIPT:\n" +" -L, --load=\"MODULE ARGUMENTS\" Load the specified plugin module " +"with\n" +" the specified argument\n" +" -F, --file=FILENAME Run the specified script\n" +" -C Open a command line on the running " +"TTY\n" +" after startup\n" +"\n" +" -n Don't load default script file\n" +msgstr "" +"%s [opties]\n" +"\n" +"COMMANDO'S:\n" +" -h, --help Laat deze hulp zien\n" +" --version Laat versie zien\n" +" --dump-conf Dump standaard configuratie\n" +" --dump-modules Dump lijst van beschikbare modules\n" +" --dump-resample-methods Dump beschikbare resample methodes\n" +" --cleanup-shm Schoon oud gedeelde geheugen " +"segmenten op\n" +" --start Start de daemon als deze niet " +"draait\n" +" -k --kill Schiet een draaiende daemon af\n" +" --check Controleer voor een draaiende daemon " +"(geeft alleen uitgangs code terug)\n" +"\n" +"OPTIES:\n" +" --system[=BOOL] Draaieals systeem-brede instance\n" +" -D, --daemonize[=BOOL] Maak daemon na opstarten\n" +" --fail[=BOOL] Verlaat als opstarten mislukt\n" +" --high-priority[=BOOL] Probeer een hoog nice nivo in te " +"stellen\n" +" (only beschikbaar voor, als SUID of\n" +" met verhoogde RLIMIT_NICE)\n" +" --realtime[=BOOL] Probeer realtime scheduling aan te " +"zetten \n" +" (alleen beschikbaar voor root, als " +"SUID of\n" +" met verhoogde RLIMIT_RTPRIO)\n" +" --disallow-module-loading[=BOOL] Sta de module gebruiker niet toe om " +"de gevraagde\n" +" module te laden/verwijderen na " +"opstarten\n" +" --disallow-exit[=BOOL] Sta de gebruiker het gevraagde " +"vertrek niet toe\n" +" --exit-idle-time=SECS Sluit de daemon af deze niets doet " +"en deze tijd\n" +" verstreken is\n" +" --module-idle-time=SECS Verwijder automatisch geladen " +"modules als deze niets\n" +" doen en deze tijd verstreken is\n" +" --scache-idle-time=SECS Verwijder automatisch geladen " +"samples als deze niets\n" +" doen en deze tijd verstreken is\n" +" --log-level[=LEVEL] Verhoog of instellen van " +"breedsprakigheids nivo\n" +" -v Verhoog breedsprakigheids nivo\n" +" --log-target={auto,syslog,stderr} Specificeer het log doel\n" +" --log-meta[=BOOL] Voeg code locatie toe aan log " +"boodschappen\n" +" --log-time[=BOOL] Voeg tijdstempels toe aan log " +"boodschappen\n" +" --log-backtrace=FRAMES Voeg een backtrace toe aan log " +"boodscvhappen\n" +" -p, --dl-search-path=PATH Stel het zoek pad voor dynamisch " +"gedeelde\n" +" objecten in (plugins)\n" +" --resample-method=METHOD Gebruik de opgegeven resampling " +"methode\n" +" (Zie --dump-resample-methods voor\n" +" mogelijke waardes)\n" +" --use-pid-file[=BOOL] Maak een PID bestand\n" +" --no-cpu-limit[=BOOL] Installeer geen CPU load begrenzer " +"op\n" +" platforms die dat ondersteunen.\n" +" --disable-shm[=BOOL] Zet gedeeld heugen ondersteuning " +"uit.\n" +"\n" +"OPSTART SCRIPT:\n" +" -L, --load=\"MODULE ARGUMENTS\" Laad de opgegeven plugin module " +"met\n" +" de opgegeven argumenten\n" +" -F, --file=FILENAME Draai het opgegeven script\n" +" -C Open een opdrachtregel op de " +"draaiende TTY\n" +" na het opstarten\n" +"\n" +" -n Laad het standaard script bestand " +"niet\n" + +#: ../src/daemon/cmdline.c:247 +msgid "--daemonize expects boolean argument" +msgstr "--daemonize verwacht een boolean argument" + +#: ../src/daemon/cmdline.c:254 +msgid "--fail expects boolean argument" +msgstr "--fail verwacht een boolean argument" + +#: ../src/daemon/cmdline.c:264 +msgid "" +"--log-level expects log level argument (either numeric in range 0..4 or one " +"of debug, info, notice, warn, error)." +msgstr "" +"--log-level verwacht een log level argument (numeriek uit de reeks 0..4 of " +"een van type debug, info, notice, warn, error)." + +#: ../src/daemon/cmdline.c:276 +msgid "--high-priority expects boolean argument" +msgstr "--high-priority verwacht een boolean argument" + +#: ../src/daemon/cmdline.c:283 +msgid "--realtime expects boolean argument" +msgstr "--realtime verwacht een boolean argument" + +#: ../src/daemon/cmdline.c:290 +msgid "--disallow-module-loading expects boolean argument" +msgstr "--disallow-module-loading verwacht een boolean argument" + +#: ../src/daemon/cmdline.c:297 +msgid "--disallow-exit expects boolean argument" +msgstr "--disallow-exit verwacht een bolean argument" + +#: ../src/daemon/cmdline.c:304 +msgid "--use-pid-file expects boolean argument" +msgstr "--use-pid-file verwacht een boolean argument" + +#: ../src/daemon/cmdline.c:321 +msgid "Invalid log target: use either 'syslog', 'stderr' or 'auto'." +msgstr "Ongeldig log doel: gebruik een van 'syslog', 'stderr', 'auto'." + +#: ../src/daemon/cmdline.c:328 +msgid "--log-time expects boolean argument" +msgstr "--log-time verwacht een boolean argument" + +#: ../src/daemon/cmdline.c:335 +msgid "--log-meta expects boolean argument" +msgstr "--log-meta verwacht een boolean argument" + +#: ../src/daemon/cmdline.c:354 +#, c-format +msgid "Invalid resample method '%s'." +msgstr "Ongeldige resample methode '%s'." + +#: ../src/daemon/cmdline.c:361 +msgid "--system expects boolean argument" +msgstr "--system verwacht een boolean argument" + +#: ../src/daemon/cmdline.c:368 +msgid "--no-cpu-limit expects boolean argument" +msgstr "--no-cpu-limit verwacht een boolean argument" + +#: ../src/daemon/cmdline.c:375 +msgid "--disable-shm expects boolean argument" +msgstr "--disable-shm verwacht een boolean argument" + +#: ../src/daemon/dumpmodules.c:60 +#, c-format +msgid "Name: %s\n" +msgstr "Naam: %s\n" + +#: ../src/daemon/dumpmodules.c:63 +#, c-format +msgid "No module information available\n" +msgstr "Geen module informatie beschikbaar\n" + +#: ../src/daemon/dumpmodules.c:66 +#, c-format +msgid "Version: %s\n" +msgstr "Versie: %s\n" + +#: ../src/daemon/dumpmodules.c:68 +#, c-format +msgid "Description: %s\n" +msgstr "Beschrijving: %s\n" + +#: ../src/daemon/dumpmodules.c:70 +#, c-format +msgid "Author: %s\n" +msgstr "Auteur: %s\n" + +#: ../src/daemon/dumpmodules.c:72 +#, c-format +msgid "Usage: %s\n" +msgstr "Gebruik: %s\n" + +#: ../src/daemon/dumpmodules.c:73 +#, c-format +msgid "Load Once: %s\n" +msgstr "Laad eenmaal: %s\n" + +#: ../src/daemon/dumpmodules.c:75 +#, c-format +msgid "DEPRECATION WARNING: %s\n" +msgstr "ACHTERHAALDHEIDSWAARSCHUWING: %s\n" + +#: ../src/daemon/dumpmodules.c:79 +#, c-format +msgid "Path: %s\n" +msgstr "Pad: %s\n" + +#: ../src/daemon/daemon-conf.c:232 +#, c-format +msgid "[%s:%u] Invalid log target '%s'." +msgstr "[%s:%u] Ongeldig logdoel '%s'." + +#: ../src/daemon/daemon-conf.c:248 +#, c-format +msgid "[%s:%u] Invalid log level '%s'." +msgstr "[%s:%u] Ongeldig logniveau '%s'." + +#: ../src/daemon/daemon-conf.c:264 +#, c-format +msgid "[%s:%u] Invalid resample method '%s'." +msgstr "[%s:%u] Ongeldige resample-methode ‘%s’." + +#: ../src/daemon/daemon-conf.c:287 +#, c-format +msgid "[%s:%u] Invalid rlimit '%s'." +msgstr "[%s:%u] Ongeldige rlimit ‘%s’." + +#: ../src/daemon/daemon-conf.c:294 +#, c-format +msgid "[%s:%u] rlimit not supported on this platform." +msgstr "[%s:%u] rlimit wordt niet ondersteund op dit platform." + +#: ../src/daemon/daemon-conf.c:310 +#, c-format +msgid "[%s:%u] Invalid sample format '%s'." +msgstr "[%s:%u] Ongeldig sampleformaat ‘%s’." + +#: ../src/daemon/daemon-conf.c:328 +#, c-format +msgid "[%s:%u] Invalid sample rate '%s'." +msgstr "[%s:%u] Ongeldige samlperate ‘%s’." + +#: ../src/daemon/daemon-conf.c:352 +#, c-format +msgid "[%s:%u] Invalid sample channels '%s'." +msgstr "[%s:%u] Ongeldige sample-kanalen ‘%s’." + +#: ../src/daemon/daemon-conf.c:370 +#, c-format +msgid "[%s:%u] Invalid channel map '%s'." +msgstr "[%s:%u] Ongeldige kanalenkaart ‘%s’." + +#: ../src/daemon/daemon-conf.c:388 +#, c-format +msgid "[%s:%u] Invalid number of fragments '%s'." +msgstr "[%s:%u] Ongeldig aantal fragmenten '%s'." + +#: ../src/daemon/daemon-conf.c:406 +#, c-format +msgid "[%s:%u] Invalid fragment size '%s'." +msgstr "[%s:%u] Ongeldige fragmentgrootte ‘%s’." + +#: ../src/daemon/daemon-conf.c:424 +#, c-format +msgid "[%s:%u] Invalid nice level '%s'." +msgstr "[%s:%u] Ongeldig nice niveau ‘%s’." + +#: ../src/daemon/daemon-conf.c:546 +#, c-format +msgid "Failed to open configuration file: %s" +msgstr "Openen van configuratiebestand %s mislukt." + +#: ../src/daemon/daemon-conf.c:562 +msgid "" +"The specified default channel map has a different number of channels than " +"the specified default number of channels." +msgstr "" +"De opgegeven standaard kanalenkaart heeft een ander aantal kanalen dan de " +"opgegeven standaard aantal kanalen." + +#: ../src/daemon/daemon-conf.c:638 +#, c-format +msgid "### Read from configuration file: %s ###\n" +msgstr "### Lees uit het configuratiebestand: %s ###\n" + +#: ../src/daemon/caps.c:62 +msgid "Cleaning up privileges." +msgstr "Rechten opschonen." + +#: ../src/daemon/pulseaudio.desktop.in.h:1 +msgid "PulseAudio Sound System" +msgstr "PulseAudio geluidssysteem" + +#: ../src/daemon/pulseaudio.desktop.in.h:2 +msgid "Start the PulseAudio Sound System" +msgstr "Start het PulseAudio geluidssysteem" + +#: ../src/pulse/channelmap.c:105 ../src/pulse/channelmap.c:757 +msgid "Mono" +msgstr "Mono" + +#: ../src/pulse/channelmap.c:107 +msgid "Front Center" +msgstr "Voor midden" + +#: ../src/pulse/channelmap.c:108 +msgid "Front Left" +msgstr "Voor links" + +#: ../src/pulse/channelmap.c:109 +msgid "Front Right" +msgstr "Voor rechts" + +#: ../src/pulse/channelmap.c:111 +msgid "Rear Center" +msgstr "Achter midden" + +#: ../src/pulse/channelmap.c:112 +msgid "Rear Left" +msgstr "Achter links" + +#: ../src/pulse/channelmap.c:113 +msgid "Rear Right" +msgstr "Achter rechts" + +#: ../src/pulse/channelmap.c:115 +msgid "Low Frequency Emmiter" +msgstr "Lage-frequentiezender" + +#: ../src/pulse/channelmap.c:117 +msgid "Front Left-of-center" +msgstr "Voor links-van-het-midden" + +#: ../src/pulse/channelmap.c:118 +msgid "Front Right-of-center" +msgstr "Voor rechts-van-het-midden" + +#: ../src/pulse/channelmap.c:120 +msgid "Side Left" +msgstr "Zijkant links" + +#: ../src/pulse/channelmap.c:121 +msgid "Side Right" +msgstr "Zijkant rechts" + +#: ../src/pulse/channelmap.c:123 +msgid "Auxiliary 0" +msgstr "Auxiliary 0" + +#: ../src/pulse/channelmap.c:124 +msgid "Auxiliary 1" +msgstr "Auxiliary 1" + +#: ../src/pulse/channelmap.c:125 +msgid "Auxiliary 2" +msgstr "Auxiliary 2" + +#: ../src/pulse/channelmap.c:126 +msgid "Auxiliary 3" +msgstr "Auxiliary 3" + +#: ../src/pulse/channelmap.c:127 +msgid "Auxiliary 4" +msgstr "Auxiliary 4" + +#: ../src/pulse/channelmap.c:128 +msgid "Auxiliary 5" +msgstr "Auxiliary 5" + +#: ../src/pulse/channelmap.c:129 +msgid "Auxiliary 6" +msgstr "Auxiliary 6" + +#: ../src/pulse/channelmap.c:130 +msgid "Auxiliary 7" +msgstr "Auxiliary 7" + +#: ../src/pulse/channelmap.c:131 +msgid "Auxiliary 8" +msgstr "Auxiliary 8" + +#: ../src/pulse/channelmap.c:132 +msgid "Auxiliary 9" +msgstr "Auxiliary 9" + +#: ../src/pulse/channelmap.c:133 +msgid "Auxiliary 10" +msgstr "Auxiliary 10" + +#: ../src/pulse/channelmap.c:134 +msgid "Auxiliary 11" +msgstr "Auxiliary 11" + +#: ../src/pulse/channelmap.c:135 +msgid "Auxiliary 12" +msgstr "Auxiliary 12" + +#: ../src/pulse/channelmap.c:136 +msgid "Auxiliary 13" +msgstr "Auxiliary 13" + +#: ../src/pulse/channelmap.c:137 +msgid "Auxiliary 14" +msgstr "Auxiliary 14" + +#: ../src/pulse/channelmap.c:138 +msgid "Auxiliary 15" +msgstr "Auxiliary· 15" + +#: ../src/pulse/channelmap.c:139 +msgid "Auxiliary 16" +msgstr "Auxiliary 16" + +#: ../src/pulse/channelmap.c:140 +msgid "Auxiliary 17" +msgstr "Auxiliary 17" + +#: ../src/pulse/channelmap.c:141 +msgid "Auxiliary 18" +msgstr "Auxiliary 18" + +#: ../src/pulse/channelmap.c:142 +msgid "Auxiliary 19" +msgstr "Auxiliary 19" + +#: ../src/pulse/channelmap.c:143 +msgid "Auxiliary 20" +msgstr "Auxiliary 20" + +#: ../src/pulse/channelmap.c:144 +msgid "Auxiliary 21" +msgstr "Auxiliary 21" + +#: ../src/pulse/channelmap.c:145 +msgid "Auxiliary 22" +msgstr "Auxiliary 22" + +#: ../src/pulse/channelmap.c:146 +msgid "Auxiliary 23" +msgstr "Auxiliary 23" + +#: ../src/pulse/channelmap.c:147 +msgid "Auxiliary 24" +msgstr "Auxiliary 24" + +#: ../src/pulse/channelmap.c:148 +msgid "Auxiliary 25" +msgstr "Auxiliary 25" + +#: ../src/pulse/channelmap.c:149 +msgid "Auxiliary 26" +msgstr "Auxiliary 26" + +#: ../src/pulse/channelmap.c:150 +msgid "Auxiliary 27" +msgstr "Auxiliary 27" + +#: ../src/pulse/channelmap.c:151 +msgid "Auxiliary 28" +msgstr "Auxiliary 28" + +#: ../src/pulse/channelmap.c:152 +msgid "Auxiliary 29" +msgstr "Auxiliary 29" + +#: ../src/pulse/channelmap.c:153 +msgid "Auxiliary 30" +msgstr "Auxiliary 30" + +#: ../src/pulse/channelmap.c:154 +msgid "Auxiliary 31" +msgstr "Auxiliary 31" + +#: ../src/pulse/channelmap.c:156 +msgid "Top Center" +msgstr "Boven midden" + +#: ../src/pulse/channelmap.c:158 +msgid "Top Front Center" +msgstr "Boven voor midden" + +#: ../src/pulse/channelmap.c:159 +msgid "Top Front Left" +msgstr "Boven voor links" + +#: ../src/pulse/channelmap.c:160 +msgid "Top Front Right" +msgstr "Boven voor rechts" + +#: ../src/pulse/channelmap.c:162 +msgid "Top Rear Center" +msgstr "Boven achter midden" + +#: ../src/pulse/channelmap.c:163 +msgid "Top Rear Left" +msgstr "boven achter links" + +#: ../src/pulse/channelmap.c:164 +msgid "Top Rear Right" +msgstr "boven achter rechts" + +#: ../src/pulse/channelmap.c:484 ../src/pulse/sample.c:170 +#: ../src/pulse/volume.c:295 ../src/pulse/volume.c:321 +#: ../src/pulse/volume.c:341 ../src/pulse/volume.c:371 +msgid "(invalid)" +msgstr "(ongeldig)" + +#: ../src/pulse/channelmap.c:761 +msgid "Stereo" +msgstr "Stereo" + +#: ../src/pulse/channelmap.c:766 +msgid "Surround 4.0" +msgstr "Surround 4.0" + +#: ../src/pulse/channelmap.c:772 +msgid "Surround 4.1" +msgstr "Surround 4.1" + +#: ../src/pulse/channelmap.c:778 +msgid "Surround 5.0" +msgstr "Surround 5.0" + +#: ../src/pulse/channelmap.c:784 +msgid "Surround 5.1" +msgstr "Surround 5.1" + +#: ../src/pulse/channelmap.c:791 +msgid "Surround 7.1" +msgstr "Surround 7.1" + +#: ../src/pulse/error.c:43 +msgid "OK" +msgstr "OK" + +#: ../src/pulse/error.c:44 +msgid "Access denied" +msgstr "toegang geweigerd" + +#: ../src/pulse/error.c:45 +msgid "Unknown command" +msgstr "Onbekend commando" + +#: ../src/pulse/error.c:46 +msgid "Invalid argument" +msgstr "Ongeldige argumenten" + +#: ../src/pulse/error.c:47 +msgid "Entity exists" +msgstr "Eenheid bestaat" + +#: ../src/pulse/error.c:48 +msgid "No such entity" +msgstr "Eenheid onbekend" + +#: ../src/pulse/error.c:49 +msgid "Connection refused" +msgstr "Verbinding geweigerd" + +#: ../src/pulse/error.c:50 +msgid "Protocol error" +msgstr "Protocolfout" + +#: ../src/pulse/error.c:51 +msgid "Timeout" +msgstr "Tijd verstreken" + +#: ../src/pulse/error.c:52 +msgid "No authorization key" +msgstr "Geen autorisatiesleutel" + +#: ../src/pulse/error.c:53 +msgid "Internal error" +msgstr "Interne fout" + +#: ../src/pulse/error.c:54 +msgid "Connection terminated" +msgstr "Verbinding verbroken" + +#: ../src/pulse/error.c:55 +msgid "Entity killed" +msgstr "Eenheid geëlimineerd" + +#: ../src/pulse/error.c:56 +msgid "Invalid server" +msgstr "Ongeldige server" + +#: ../src/pulse/error.c:57 +msgid "Module initalization failed" +msgstr "Module-initialisatie mislukt" + +#: ../src/pulse/error.c:58 +msgid "Bad state" +msgstr "Slechte toestand" + +#: ../src/pulse/error.c:59 +msgid "No data" +msgstr "Geen data" + +#: ../src/pulse/error.c:60 +msgid "Incompatible protocol version" +msgstr "Protocol versie niet compatibel" + +#: ../src/pulse/error.c:61 +msgid "Too large" +msgstr "Te groot" + +#: ../src/pulse/error.c:62 +msgid "Not supported" +msgstr "Niet ondersteund" + +#: ../src/pulse/error.c:63 +msgid "Unknown error code" +msgstr "Onbekende fout code" + +#: ../src/pulse/error.c:64 +msgid "No such extension" +msgstr "Onbekende extentie" + +#: ../src/pulse/error.c:65 +msgid "Obsolete functionality" +msgstr "Verouderde functionaliteit" + +#: ../src/pulse/error.c:66 +msgid "Missing implementation" +msgstr "Implementatie ontbreekt" + +#: ../src/pulse/error.c:67 +msgid "Client forked" +msgstr "Client afgesplitst" + +#: ../src/pulse/error.c:68 +msgid "Input/Output error" +msgstr "Input/Output fout" + +#: ../src/pulse/error.c:69 +msgid "Device or resource busy" +msgstr "Apparaat of hulpbron is bezig" + +#: ../src/pulse/sample.c:172 +#, c-format +msgid "%s %uch %uHz" +msgstr "%s %uch %uHz" + +#: ../src/pulse/sample.c:184 +#, c-format +msgid "%0.1f GiB" +msgstr "%0.1f GiB" + +#: ../src/pulse/sample.c:186 +#, c-format +msgid "%0.1f MiB" +msgstr "%0.1f MiB" + +#: ../src/pulse/sample.c:188 +#, c-format +msgid "%0.1f KiB" +msgstr "%0.1f KiB" + +#: ../src/pulse/sample.c:190 +#, c-format +msgid "%u B" +msgstr "%u B" + +#: ../src/pulse/client-conf-x11.c:55 ../src/utils/pax11publish.c:100 +msgid "XOpenDisplay() failed" +msgstr "XOpenDisplay() mislukte" + +#: ../src/pulse/client-conf-x11.c:93 +msgid "Failed to parse cookie data" +msgstr "Analyseren van cookie-data mislukt" + +#: ../src/pulse/client-conf.c:111 +#, c-format +msgid "Failed to open configuration file '%s': %s" +msgstr "Open van configuratiebestand ‘%s’ mislukte: %s" + +#: ../src/pulse/context.c:550 +msgid "No cookie loaded. Attempting to connect without." +msgstr "Geen cookie geladen. Probeer zonder cookie te verbinden." + +#: ../src/pulse/context.c:693 +#, c-format +msgid "fork(): %s" +msgstr "fork(): %s" + +#: ../src/pulse/context.c:748 +#, c-format +msgid "waitpid(): %s" +msgstr "waitpid(): %s" + +#: ../src/pulse/context.c:1438 +#, c-format +msgid "Received message for unknown extension '%s'" +msgstr "Ontving boodschap voor onbekende extensie ‘%s’" + +#: ../src/utils/pacat.c:108 +#, c-format +msgid "Failed to drain stream: %s" +msgstr "Afvoeren stroom %s mislukte" + +#: ../src/utils/pacat.c:113 +msgid "Playback stream drained." +msgstr "Afspelen van afgevoerde stroom." + +#: ../src/utils/pacat.c:123 +msgid "Draining connection to server." +msgstr "Vervinding naar server afvoeren." + +#: ../src/utils/pacat.c:136 +#, c-format +msgid "pa_stream_drain(): %s" +msgstr "pa_stream_drain(): %s" + +#: ../src/utils/pacat.c:159 +#, c-format +msgid "pa_stream_write() failed: %s" +msgstr "pa_stream_write() mislukte: %s" + +#: ../src/utils/pacat.c:197 +#, c-format +msgid "pa_stream_begin_write() failed: %s" +msgstr "pa_stream_begin_write() mislukte: %s" + +#: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267 +#, c-format +msgid "pa_stream_peek() failed: %s" +msgstr "pa_stream_peek() mislukte: %s" + +#: ../src/utils/pacat.c:307 +msgid "Stream successfully created." +msgstr "Stroom met succes aangemaakt." + +#: ../src/utils/pacat.c:310 +#, c-format +msgid "pa_stream_get_buffer_attr() failed: %s" +msgstr "pa_stream_get_buffer_attr() mislukte: %s" + +#: ../src/utils/pacat.c:314 +#, c-format +msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u" +msgstr "Buffermetriek: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u" + +#: ../src/utils/pacat.c:317 +#, c-format +msgid "Buffer metrics: maxlength=%u, fragsize=%u" +msgstr "Buffermetriek: maxlength=%u, fragsize=%u" + +#: ../src/utils/pacat.c:321 +#, c-format +msgid "Using sample spec '%s', channel map '%s'." +msgstr "Gebruik sample-spec '%s', kanaal map '%s'." + +#: ../src/utils/pacat.c:325 +#, c-format +msgid "Connected to device %s (%u, %ssuspended)." +msgstr "Verbonden met apparaat %s (%u, %sopgeschort)." + +#: ../src/utils/pacat.c:335 +#, c-format +msgid "Stream error: %s" +msgstr "Stroomfout: %s" + +#: ../src/utils/pacat.c:345 +#, c-format +msgid "Stream device suspended.%s" +msgstr "Stroomapparaat opgeschort.%s" + +#: ../src/utils/pacat.c:347 +#, c-format +msgid "Stream device resumed.%s" +msgstr "Stroomapparaat hervat.%s" + +#: ../src/utils/pacat.c:355 +#, c-format +msgid "Stream underrun.%s" +msgstr "Te weinig data voor stroom.%s" + +#: ../src/utils/pacat.c:362 +#, c-format +msgid "Stream overrun.%s" +msgstr "Data-overschrijding voor stroom.%s" + +#: ../src/utils/pacat.c:369 +#, c-format +msgid "Stream started.%s" +msgstr "Stroom gestart.%s" + +#: ../src/utils/pacat.c:376 +#, c-format +msgid "Stream moved to device %s (%u, %ssuspended).%s" +msgstr "Stroom verplaatst naar apparaat %s (%u, %sopgeschort).%s" + +#: ../src/utils/pacat.c:376 +msgid "not " +msgstr "niet " + +#: ../src/utils/pacat.c:383 +#, c-format +msgid "Stream buffer attributes changed.%s" +msgstr "Stroom buffer attributen veranderden.%s" + +#: ../src/utils/pacat.c:415 +#, c-format +msgid "Connection established.%s" +msgstr "Verbinding bereikt.%s" + +#: ../src/utils/pacat.c:418 +#, c-format +msgid "pa_stream_new() failed: %s" +msgstr "pa_stream_new() mislukte: %s" + +#: ../src/utils/pacat.c:450 +#, c-format +msgid "pa_stream_connect_playback() failed: %s" +msgstr "pa_stream_connect_playback() mislukte: %s" + +#: ../src/utils/pacat.c:456 +#, c-format +msgid "pa_stream_connect_record() failed: %s" +msgstr "pa_stream_connect_record() mislukte: %s" + +#: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857 +#, c-format +msgid "Connection failure: %s" +msgstr "Verbindingsfout: %s" + +#: ../src/utils/pacat.c:503 +msgid "Got EOF." +msgstr "Kreeg EOF." + +#: ../src/utils/pacat.c:540 +#, c-format +msgid "write() failed: %s" +msgstr "write() mislukte: %s" + +#: ../src/utils/pacat.c:561 +msgid "Got signal, exiting." +msgstr "Ontving signaal, afsluiten." + +#: ../src/utils/pacat.c:575 +#, c-format +msgid "Failed to get latency: %s" +msgstr "Latentie krijgen mislukte: %s" + +#: ../src/utils/pacat.c:580 +#, c-format +msgid "Time: %0.3f sec; Latency: %0.0f usec." +msgstr "Tijd: %0.3f sec; Latentie: %0.0f usec." + +#: ../src/utils/pacat.c:599 +#, c-format +msgid "pa_stream_update_timing_info() failed: %s" +msgstr "pa_stream_update_timing_info() mislukte: %s" + +#: ../src/utils/pacat.c:609 +#, c-format +msgid "" +"%s [options]\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -r, --record Create a connection for recording\n" +" -p, --playback Create a connection for playback\n" +"\n" +" -v, --verbose Enable verbose operations\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -d, --device=DEVICE The name of the sink/source to " +"connect to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" +" --stream-name=NAME How to call this stream on the " +"server\n" +" --volume=VOLUME Specify the initial (linear) volume " +"in range 0...65536\n" +" --rate=SAMPLERATE The sample rate in Hz (defaults to " +"44100)\n" +" --format=SAMPLEFORMAT The sample type, one of s16le, " +"s16be, u8, float32le,\n" +" float32be, ulaw, alaw, s32le, s32be, " +"s24le, s24be,\n" +" s24-32le, s24-32be (defaults to " +"s16ne)\n" +" --channels=CHANNELS The number of channels, 1 for mono, " +"2 for stereo\n" +" (defaults to 2)\n" +" --channel-map=CHANNELMAP Channel map to use instead of the " +"default\n" +" --fix-format Take the sample format from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-rate Take the sampling rate from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-channels Take the number of channels and the " +"channel map\n" +" from the sink the stream is being " +"connected to.\n" +" --no-remix Don't upmix or downmix channels.\n" +" --no-remap Map channels by index instead of " +"name.\n" +" --latency=BYTES Request the specified latency in " +"bytes.\n" +" --process-time=BYTES Request the specified process time " +"per request in bytes.\n" +" --property=PROPERTY=VALUE Set the specified property to the " +"specified value.\n" +" --raw Record/play raw PCM data.\n" +" --file-format=FFORMAT Record/play formatted PCM data.\n" +" --list-file-formats List available file formats.\n" +msgstr "" +"%s [opties]\n" +"\n" +" -h, --help Laat deze hulp zien\n" +" --version Laat versie zien\n" +"\n" +" -r, --record Maak een verbinding voor opnemen\n" +" -p, --playback Maak een verbinding voor afspelen\n" +"\n" +" -v, --verbose Zet breedsprakigheid aan\n" +"\n" +" -s, --server=SERVER De naam van de server waarmee " +"verbonden moet worden\n" +" -d, --device=DEVICE De naam van de afvoer/bron waarmee " +"verbonden moet worden\n" +" -n, --client-name=NAME Hoe wordt deze cliënt op de server " +"genoemd\n" +" --stream-name=NAME Hoe wordt deze stroom op de server " +"genoemd\n" +" --volume=VOLUME Geef het begins (lineare) volume in " +"reeks 0...65536\n" +" --rate=SAMPLERATE De samplerate in Hz " +"(standaard 44100)\n" +" --format=SAMPLEFORMAT Het sampletype, een van s16le, " +"s16be, u8, float32le,\n" +" float32be, ulaw, alaw, s32le, s32be, " +"s24le, s24be,\n" +" s24-32le, s24-32be (standaard " +"s16ne)\n" +" --channels=CHANNELS Het aantal kanalen, 1 voor mono, 2 " +"voor stereo\n" +" (standaard 2)\n" +" --channel-map=CHANNELMAP Kanaalkaart te gebruiken in plaats " +"van de standaard\n" +" --fix-format Neem het sampleformaat over " +"van de afvoer waar de stroom\n" +" mee verbonden is.\n" +" --fix-rate Neem de samplerate over " +"van de afvoer waar de stroom\n" +" mee verbonden is.\n" +" --fix-channels Neem het aantal kanalen en de kanaal " +"map over\n" +" van de afvoer waar de stroom mee " +"verbonden is.\n" +" --no-remix Doe geen upmix of downmix van " +"kanalen.\n" +" --no-remap Map kanalen met index in plaats van " +"met naam.\n" +" --latency=BYTES Verzoek de opgegeven latentie in " +"bytes.\n" +" --process-time=BYTES Verzoek de opgegeven proces tijd per " +"verzoek in bytes.\n" +" --property=PROPERTY=VALUE Zet de opgegeven eigenschap op de " +"opgegeven waarde.\n" +" --raw Opnemen/afspelen van ruwe PCM data.\n" +" --file-format=FFORMAT Opnemen/afspelen van geformateerde " +"data.\n" +" --list-file-formats Laat beschikbare bestandsformaten " +"zien.\n" + +#: ../src/utils/pacat.c:731 +#, c-format +msgid "" +"pacat %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pacat %s\n" +"Gecompileerd met libpulse %s\n" +"Gelinkt met libpulse %s\n" + +#: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953 +#, c-format +msgid "Invalid client name '%s'" +msgstr "Ongeldige clientnaam ‘%s’." + +#: ../src/utils/pacat.c:779 +#, c-format +msgid "Invalid stream name '%s'" +msgstr "Ongeldige stroomnaam ‘%s’." + +#: ../src/utils/pacat.c:816 +#, c-format +msgid "Invalid channel map '%s'" +msgstr "Ongeldige kanaalkaart ‘%s’." + +#: ../src/utils/pacat.c:845 +#, c-format +msgid "Invalid latency specification '%s'" +msgstr "Ongeldige latentie-specificatie ‘%s’." + +#: ../src/utils/pacat.c:852 +#, c-format +msgid "Invalid process time specification '%s'" +msgstr "Ongeldige procestijdspecificatie ‘%s’." + +#: ../src/utils/pacat.c:864 +#, c-format +msgid "Invalid property '%s'" +msgstr "Ongeldige eigenschap ‘%s’." + +#: ../src/utils/pacat.c:881 +#, c-format +msgid "Unknown file format %s." +msgstr "Ongeldig bestandsformaat %s" + +#: ../src/utils/pacat.c:900 +msgid "Invalid sample specification" +msgstr "Ongeldige samplespecificatie" + +#: ../src/utils/pacat.c:910 +#, c-format +msgid "open(): %s" +msgstr "open(): %s" + +#: ../src/utils/pacat.c:915 +#, c-format +msgid "dup2(): %s" +msgstr "dup2(): %s" + +#: ../src/utils/pacat.c:922 +msgid "Too many arguments." +msgstr "Te veel argumenten." + +#: ../src/utils/pacat.c:933 +msgid "Failed to generate sample specification for file." +msgstr "Aanmaken van samplespecificatie voor bestand mislukt." + +#: ../src/utils/pacat.c:953 +msgid "Failed to open audio file." +msgstr "Openen van geluidsbestand mislukte." + +#: ../src/utils/pacat.c:959 +msgid "" +"Warning: specified sample specification will be overwritten with " +"specification from file." +msgstr "" +"Waarschuwing: opgegeven bemonster specificatie zal overschreven worden met " +"de specificatie van het bestand." + +#: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997 +msgid "Failed to determine sample specification from file." +msgstr "Bepalen van samplespecificatie van het bestand mislukte." + +#: ../src/utils/pacat.c:971 +msgid "Warning: Failed to determine channel map from file." +msgstr "Waarschuwing: Bepalen van kanaalkaart van bestand mislukte." + +#: ../src/utils/pacat.c:982 +msgid "Channel map doesn't match sample specification" +msgstr "Kanaal map komt niet overeen met bemonster specificatie." + +#: ../src/utils/pacat.c:993 +msgid "Warning: failed to write channel map to file." +msgstr "Waarschuwing: schrijven van kanaalkaart naar bestand mislukte." + +#: ../src/utils/pacat.c:1008 +#, c-format +msgid "" +"Opening a %s stream with sample specification '%s' and channel map '%s'." +msgstr "" +"Openen van een %s stroom met samplespecificatie ‘%s’ en kanaalkaart ‘%s’." + +#: ../src/utils/pacat.c:1009 +msgid "recording" +msgstr "opnemen" + +#: ../src/utils/pacat.c:1009 +msgid "playback" +msgstr "afspelen" + +#: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267 +msgid "pa_mainloop_new() failed." +msgstr "pa_mainloop_new() mislukte." + +#: ../src/utils/pacat.c:1054 +msgid "io_new() failed." +msgstr "io_new() mislukte." + +#: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279 +msgid "pa_context_new() failed." +msgstr "pa_cotext_new() mislukte." + +#: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285 +#, c-format +msgid "pa_context_connect() failed: %s" +msgstr "pa_context_connect() mislukte: %s" + +#: ../src/utils/pacat.c:1075 +msgid "pa_context_rttime_new() failed." +msgstr "pa_context_rttime_new() mislukte." + +#: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290 +msgid "pa_mainloop_run() failed." +msgstr "pa_mainloop_run() mislukte." + +#: ../src/utils/pasuspender.c:81 +#, c-format +msgid "fork(): %s\n" +msgstr "fork(): %s\n" + +#: ../src/utils/pasuspender.c:92 +#, c-format +msgid "execvp(): %s\n" +msgstr "execvp(): %s\n" + +#: ../src/utils/pasuspender.c:109 +#, c-format +msgid "Failure to suspend: %s\n" +msgstr "Opschorten mislukte: %s\n" + +#: ../src/utils/pasuspender.c:124 +#, c-format +msgid "Failure to resume: %s\n" +msgstr "Vervolgen mislukte: %s\n" + +#: ../src/utils/pasuspender.c:147 +#, c-format +msgid "WARNING: Sound server is not local, not suspending.\n" +msgstr "WAARSCHUWING: Geluidsserver is niet lokaal, geen opschorten.\n" + +#: ../src/utils/pasuspender.c:159 +#, c-format +msgid "Connection failure: %s\n" +msgstr "Verbonding mislukte: %s\n" + +#: ../src/utils/pasuspender.c:176 +#, c-format +msgid "Got SIGINT, exiting.\n" +msgstr "Kreeg SIGINT, verlaten.\n" + +#: ../src/utils/pasuspender.c:194 +#, c-format +msgid "WARNING: Child process terminated by signal %u\n" +msgstr "WAARSCHUWING: kind proces afgesloten door signaal %u\n" + +#: ../src/utils/pasuspender.c:212 +#, c-format +msgid "" +"%s [options] ... \n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +"\n" +msgstr "" +"%s [opties] ... \n" +"\n" +" -h, --help Laat deze hulp zien\n" +" --version Laat versie zien\n" +" -s, --server=SERVER De naam van de server waarmee " +"verbonden wordt\n" +"\n" + +#: ../src/utils/pasuspender.c:248 +#, c-format +msgid "" +"pasuspender %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pasuspender %s\n" +"Gecompileerd met libpulse %s\n" +"Gelinkt met libpulse %s\n" + +#: ../src/utils/pasuspender.c:277 +#, c-format +msgid "pa_mainloop_new() failed.\n" +msgstr "pa_mainloop_new() mislukte.\n" + +#: ../src/utils/pasuspender.c:290 +#, c-format +msgid "pa_context_new() failed.\n" +msgstr "pa_context_new() mislukte.\n" + +#: ../src/utils/pasuspender.c:298 +#, c-format +msgid "pa_mainloop_run() failed.\n" +msgstr "pa_mainloop_run() mislukte.\n" + +#: ../src/utils/pactl.c:135 +#, c-format +msgid "Failed to get statistics: %s" +msgstr "Verkrijgen van statistiek %s mislukte" + +#: ../src/utils/pactl.c:141 +#, c-format +msgid "Currently in use: %u blocks containing %s bytes total.\n" +msgstr "Op dit moment in gebruik: %u blokken bevattende in totaal %s bytes.\n" + +#: ../src/utils/pactl.c:144 +#, c-format +msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n" +msgstr "" +"Toegewezen tijdens de gehele levensduur: %u blokken bevattende in totaal %s " +"butes.\n" + +#: ../src/utils/pactl.c:147 +#, c-format +msgid "Sample cache size: %s\n" +msgstr "Sample-buffergrootte: %s\n" + +#: ../src/utils/pactl.c:156 +#, c-format +msgid "Failed to get server information: %s" +msgstr "Server informatie verkrijgen mislukte: %s" + +#: ../src/utils/pactl.c:164 +#, c-format +msgid "" +"User name: %s\n" +"Host Name: %s\n" +"Server Name: %s\n" +"Server Version: %s\n" +"Default Sample Specification: %s\n" +"Default Channel Map: %s\n" +"Default Sink: %s\n" +"Default Source: %s\n" +"Cookie: %08x\n" +msgstr "" +"Gebruikersnaam: %s\n" +"Hostnaam: %s\n" +"Servernaam: %s\n" +"Serverversie: %s\n" +"Standaard samplespecificatie: %s\n" +"Standaard kanaal map: %s\n" +"Standaard afvoer: %s\n" +"Standaard bron: %s\n" +"Cookie: %08x\n" + +#: ../src/utils/pactl.c:205 +#, c-format +msgid "Failed to get sink information: %s" +msgstr "Verkrijgen afvoerinformatie mislukte: %s" + +#: ../src/utils/pactl.c:221 +#, c-format +msgid "" +"Sink #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor Source: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Afvoer #%u\n" +"\tToestand: %s\n" +"\tNaam: %s\n" +"\tBeschrijving: %s\n" +"\tDriver: %s\n" +"\tBemonsterings specificatie: %s\n" +"\tKanaal map: %s\n" +"\tModule eigenaar: %u\n" +"\tDemping: %s\n" +"\tVolume: %s%s%s\n" +"\t balans %0.2f\n" +"\tBasis volume: %s%s%s\n" +"\tMonitor bron: %s\n" +"\tLatentie: %0.0f usec, ingesteld %0.0f usec\n" +"\tVlaggen: %s%s%s%s%s%s\n" +"\tEigenschappen:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360 +#, c-format +msgid "\tPorts:\n" +msgstr "\tPoorten:\n" + +#: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366 +#, c-format +msgid "\tActive Port: %s\n" +msgstr "\tActieve poort: %s\n" + +#: ../src/utils/pactl.c:297 +#, c-format +msgid "Failed to get source information: %s" +msgstr "Verkrijgen van broninformatie mislukt: %s" + +#: ../src/utils/pactl.c:313 +#, c-format +msgid "" +"Source #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor of Sink: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Bron #%u\n" +"\tToestand: %s\n" +"\tNaam: %s\n" +"\tBeschrijving: %s\n" +"\tDriver: %s\n" +"\tSamplespecificatie: %s\n" +"\tKanaal map: %s\n" +"\tModule eigenaar: %u\n" +"\tDemping: %s\n" +"\tVolume: %s%s%s\n" +"\t balans %0.2f\n" +"\tBasis volume: %s%s%s\n" +"\tMonitorafvoer: %s\n" +"\tLatentie: %0.0f usec, ingesteld %0.0f usec\n" +"\tVlaggen: %s%s%s%s%s%s\n" +"\tEigenschappen:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:345 ../src/utils/pactl.c:401 ../src/utils/pactl.c:436 +#: ../src/utils/pactl.c:473 ../src/utils/pactl.c:532 ../src/utils/pactl.c:533 +#: ../src/utils/pactl.c:543 ../src/utils/pactl.c:587 ../src/utils/pactl.c:588 +#: ../src/utils/pactl.c:594 ../src/utils/pactl.c:637 ../src/utils/pactl.c:638 +#: ../src/utils/pactl.c:645 +msgid "n/a" +msgstr "n.v.t." + +#: ../src/utils/pactl.c:375 +#, c-format +msgid "Failed to get module information: %s" +msgstr "Verkrijgen van module informatie mislukte: %s" + +#: ../src/utils/pactl.c:393 +#, c-format +msgid "" +"Module #%u\n" +"\tName: %s\n" +"\tArgument: %s\n" +"\tUsage counter: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Module #%u\n" +"\tNaam: %s\n" +"\tArgument: %s\n" +"\tGebruiksteller: %s\n" +"\tEigenschappen:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:412 +#, c-format +msgid "Failed to get client information: %s" +msgstr "Verkrijgen van clientinformatie mislukt: %s" + +#: ../src/utils/pactl.c:430 +#, c-format +msgid "" +"Client #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Client #%u\n" +"\tStuurprogramma: %s\n" +"\tModule-eigenaar: %s\n" +"\tEigenschappen:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:447 +#, c-format +msgid "Failed to get card information: %s" +msgstr "Verkrijgen van kaartinformatie mislukt: %s" + +#: ../src/utils/pactl.c:465 +#, c-format +msgid "" +"Card #%u\n" +"\tName: %s\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Kaart #%u\n" +"\tNaam: %s\n" +"\tStuurprogramma: %s\n" +"\tModule-eigenaar: %s\n" +"\tEigenschappen:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:479 +#, c-format +msgid "\tProfiles:\n" +msgstr "\tProfielen:\n" + +#: ../src/utils/pactl.c:485 +#, c-format +msgid "\tActive Profile: %s\n" +msgstr "\tActieve profiel: %s\n" + +#: ../src/utils/pactl.c:496 +#, c-format +msgid "Failed to get sink input information: %s" +msgstr "Verkrijgen van afvoer-invoerinformatie mislukt: %s" + +#: ../src/utils/pactl.c:515 +#, c-format +msgid "" +"Sink Input #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSink: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tMute: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSink Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Afvoer input #%u\n" +"\tStuurprogramma: %s\n" +"\tModule-eigenaar: %s\n" +"\tClient: %s\n" +"\tAfvoer: %u\n" +"\tSamplespecificatie: %s\n" +"\tKanaalkaart: %s\n" +"\tDemping: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balans %0.2f\n" +"\tBufferlatentie: %0.0f usec\n" +"\tAfvoerlatentie: %0.0f usec\n" +"\tResample-methode: %s\n" +"\tEigenschappen:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:554 +#, c-format +msgid "Failed to get source output information: %s" +msgstr "Verkrijgen van bron-uitvoerinformatie mislukt: %s" + +#: ../src/utils/pactl.c:574 +#, c-format +msgid "" +"Source Output #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSource: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSource Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Bronuitvoer #%u\n" +"\tDriver: %s\n" +"\tModule-eigenaaar: %s\n" +"\tClient: %s\n" +"\tBron: %u\n" +"\tSamplespecificatie: %s\n" +"\tKanaalkaart: %s\n" +"\tBufferlatentie: %0.0f usec\n" +"\tBronlatentie: %0.0f usec\n" +"\tResample-methode: %s\n" +"\tEigenschappen:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:605 +#, c-format +msgid "Failed to get sample information: %s" +msgstr "Verkrijgen van sample-informatie mislukt: %s" + +#: ../src/utils/pactl.c:623 +#, c-format +msgid "" +"Sample #%u\n" +"\tName: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tDuration: %0.1fs\n" +"\tSize: %s\n" +"\tLazy: %s\n" +"\tFilename: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Sample #%u\n" +"\tNaam: %s\n" +"\tSamplespecificatie: %s\n" +"\tKanaal map: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balans %0.2f\n" +"\tDuur: %0.1fs\n" +"\tGrootte: %s\n" +"\tTraagheid: %s\n" +"\tBestandsnaam: %s\n" +"\tEigenschappen:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663 +#, c-format +msgid "Failure: %s" +msgstr "Mislukt: %s" + +#: ../src/utils/pactl.c:687 +#, c-format +msgid "Failed to upload sample: %s" +msgstr "Uploaden van monster mislukte: %s" + +#: ../src/utils/pactl.c:704 +msgid "Premature end of file" +msgstr "Voortijdig einde van bestand" + +#: ../src/utils/pactl.c:863 +msgid "Got SIGINT, exiting." +msgstr "Ontving SIGINT, afsluiten." + +#: ../src/utils/pactl.c:869 +#, c-format +msgid "" +"%s [options] stat\n" +"%s [options] list\n" +"%s [options] exit\n" +"%s [options] upload-sample FILENAME [NAME]\n" +"%s [options] play-sample NAME [SINK]\n" +"%s [options] remove-sample NAME\n" +"%s [options] move-sink-input SINKINPUT SINK\n" +"%s [options] move-source-output SOURCEOUTPUT SOURCE\n" +"%s [options] load-module NAME [ARGS ...]\n" +"%s [options] unload-module MODULE\n" +"%s [options] suspend-sink SINK 1|0\n" +"%s [options] suspend-source SOURCE 1|0\n" +"%s [options] set-card-profile CARD PROFILE\n" +"%s [options] set-sink-port SINK PORT\n" +"%s [options] set-source-port SOURCE PORT\n" +"%s [options] set-sink-volume SINK VOLUME\n" +"%s [options] set-source-volume SOURCE VOLUME\n" +"%s [options] set-sink-input-volume SINKINPUT VOLUME\n" +"%s [options] set-sink-mute SINK 1|0\n" +"%s [options] set-source-mute SOURCE 1|0\n" +"%s [options] set-sink-input-mute SINKINPUT 1|0\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" +msgstr "" +"%s [opties] stat\n" +"%s [opties] list\n" +"%s [opties] exit\n" +"%s [opties] upload-sample BESTANDNAAM [NAAM]\n" +"%s [opties] play-sample NAAM [AFVOER]\n" +"%s [opties] remove-sample NAAM\n" +"%s [opties] move-sink-input AFVOERINPUT AFVOER\n" +"%s [opties] move-source-output BRONOUTPUT BRON\n" +"%s [opties] load-module NAAM [ARG ...]\n" +"%s [opties] unload-module MODULE\n" +"%s [opties] suspend-sink AFVOER 1|0\n" +"%s [opties] suspend-source BRON 1|0\n" +"%s [opties] set-card-profile KAART PROFIEL\n" +"%s [opties] set-sink-port AFVOER POORT\n" +"%s [opties] set-source-port BRON POORT\n" +"%s [opties] set-sink-volume AFVOER VOLUME\n" +"%s [opties] set-source-volume BRON VOLUME\n" +"%s [opties] set-sink-input-volume AFVOERINPUT VOLUME\n" +"%s [opties] set-sink-mute AFVOER 1|0\n" +"%s [opties] set-source-mute BRON 1|0\n" +"%s [opties] set-sink-input-mute AFVOERINPUT 1|0\n" +"\n" +" -h, --help Laat deze hulp zien\n" +" --version Laat versie zien\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" + +#: ../src/utils/pactl.c:933 +#, c-format +msgid "" +"pactl %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pactl %s\n" +"Gecompileerd met libpulse %s\n" +"Gelinkt met libpulse %s\n" + +#: ../src/utils/pactl.c:979 +msgid "Please specify a sample file to load" +msgstr "Geef een te laden samplebestand op" + +#: ../src/utils/pactl.c:992 +msgid "Failed to open sound file." +msgstr "Openen geluidsbestand mislukt." + +#: ../src/utils/pactl.c:1004 +msgid "Warning: Failed to determine sample specification from file." +msgstr "" +"Waarschuwing: Bepalen van samplespecificatie van bestand mislukte." + +#: ../src/utils/pactl.c:1014 +msgid "You have to specify a sample name to play" +msgstr "U dient een samplenaam op te geven om af te spelen" + +#: ../src/utils/pactl.c:1026 +msgid "You have to specify a sample name to remove" +msgstr "U dient een samplenaam op te geven om te verwijderen" + +#: ../src/utils/pactl.c:1035 +msgid "You have to specify a sink input index and a sink" +msgstr "U dient een afvoer-invoerindex en een afvoer op te geven" + +#: ../src/utils/pactl.c:1045 +msgid "You have to specify a source output index and a source" +msgstr "U dient een bron-uitvoerindex en een bron op te geven" + +#: ../src/utils/pactl.c:1060 +msgid "You have to specify a module name and arguments." +msgstr "U dient een modulenaam en argumenten op te geven." + +#: ../src/utils/pactl.c:1080 +msgid "You have to specify a module index" +msgstr "U dient een module index op te geven" + +#: ../src/utils/pactl.c:1090 +msgid "" +"You may not specify more than one sink. You have to specify a boolean value." +msgstr "" +"U kunt niet meer dan een afvoer opgeven. U dient een boolean waarde op te geven." + +#: ../src/utils/pactl.c:1103 +msgid "" +"You may not specify more than one source. You have to specify a boolean " +"value." +msgstr "" +"U kunt niet meer dan één bron opgeven. u dient een boolean waarde op te geven." + +#: ../src/utils/pactl.c:1115 +msgid "You have to specify a card name/index and a profile name" +msgstr "U dient een kaartnaam/index en een profielnaam op te geven" + +#: ../src/utils/pactl.c:1126 +msgid "You have to specify a sink name/index and a port name" +msgstr "U dient een afvoernaam/index en een poortnaam op te geven" + +#: ../src/utils/pactl.c:1137 +msgid "You have to specify a source name/index and a port name" +msgstr "U dient een bronnaam/index en een poortnaam op te geven" + +#: ../src/utils/pactl.c:1149 +msgid "You have to specify a sink name/index and a volume" +msgstr "U dient een afvoernaam/index en een volume op te geven" + +#: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171 +#: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209 +#: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248 +msgid "Invalid volume specification" +msgstr "Ongeldige volume-opgave" + +#: ../src/utils/pactl.c:1166 +msgid "You have to specify a source name/index and a volume" +msgstr "U dient een bronnaam/index en een volume op te geven" + +#: ../src/utils/pactl.c:1183 +msgid "You have to specify a sink input index and a volume" +msgstr "U dient een afvoer-invoerindex en een volume op te geven" + +#: ../src/utils/pactl.c:1188 +msgid "Invalid sink input index" +msgstr "Ongeldige afvoer-invoerindex" + +#: ../src/utils/pactl.c:1204 +msgid "You have to specify a sink name/index and a mute boolean" +msgstr "U dient een afvoernaam/index en een dempingsboolean op te geven" + +#: ../src/utils/pactl.c:1221 +msgid "You have to specify a source name/index and a mute boolean" +msgstr "U dient een bronnaam/index en een dempingsboolean op te geven" + +#: ../src/utils/pactl.c:1238 +msgid "You have to specify a sink input index and a mute boolean" +msgstr "U dient een afvoer-invoerindex en een dempingsboolean op te geven" + +#: ../src/utils/pactl.c:1243 +msgid "Invalid sink input index specification" +msgstr "Ongeldige afvoer-invoerindex opgave" + +#: ../src/utils/pactl.c:1262 +msgid "No valid command specified." +msgstr "Geen geldige opdracht opgegeven." + +#: ../src/utils/pax11publish.c:61 +#, c-format +msgid "" +"%s [-D display] [-S server] [-O sink] [-I source] [-c file] [-d|-e|-i|-r]\n" +"\n" +" -d Show current PulseAudio data attached to X11 display (default)\n" +" -e Export local PulseAudio data to X11 display\n" +" -i Import PulseAudio data from X11 display to local environment " +"variables and cookie file.\n" +" -r Remove PulseAudio data from X11 display\n" +msgstr "" +"%s [-D scherm] [-S server] [-O afvoer] [-I bron] [-c bestand] [-d|-e|-i|-" +"r]\n" +"\n" +" -d Laat huidige PulseAudio data zien horende bij X11 scherm (standaard)\n" +" -e Exporteer locale PulseAudio data naar X11 scherm\n" +" -i Importeer PulseAudio data van X11 scherm naar locale omgevings " +"variabelen en cookie bestand.\n" +" -r Verwijder PulseAudio data van X11 scherm\n" + +#: ../src/utils/pax11publish.c:94 +#, c-format +msgid "Failed to parse command line.\n" +msgstr "Opdrachtregel ontleden mislukt.\n" + +#: ../src/utils/pax11publish.c:108 +#, c-format +msgid "Server: %s\n" +msgstr "Server: %s\n" + +#: ../src/utils/pax11publish.c:110 +#, c-format +msgid "Source: %s\n" +msgstr "Bron: %s\n" + +#: ../src/utils/pax11publish.c:112 +#, c-format +msgid "Sink: %s\n" +msgstr "Afvoer: %s\n" + +#: ../src/utils/pax11publish.c:114 +#, c-format +msgid "Cookie: %s\n" +msgstr "Cookie: %s\n" + +#: ../src/utils/pax11publish.c:132 +#, c-format +msgid "Failed to parse cookie data\n" +msgstr "Cookiedata ontleden mislukt\n" + +#: ../src/utils/pax11publish.c:137 +#, c-format +msgid "Failed to save cookie data\n" +msgstr "Cookiedata opslaan mislukt\n" + +#: ../src/utils/pax11publish.c:152 +#, c-format +msgid "Failed to load client configuration file.\n" +msgstr "Clientconfiguratiebestand laden mislukt.\n" + +#: ../src/utils/pax11publish.c:157 +#, c-format +msgid "Failed to read environment configuration data.\n" +msgstr "Omgevingsconfiguratiedata lezen mislukt.\n" + +#: ../src/utils/pax11publish.c:174 +#, c-format +msgid "Failed to get FQDN.\n" +msgstr "FQDN verkrijgen mislukte.\n" + +#: ../src/utils/pax11publish.c:194 +#, c-format +msgid "Failed to load cookie data\n" +msgstr "Cookiedata laden mislukt\n" + +#: ../src/utils/pax11publish.c:211 +#, c-format +msgid "Not yet implemented.\n" +msgstr "Nog niet geïmplementeerd.\n" + +#: ../src/utils/pacmd.c:69 +msgid "No PulseAudio daemon running, or not running as session daemon." +msgstr "" +"Er draait geen PulseAudio-voorziening, of het draait niet als sessievoorziening." + +#: ../src/utils/pacmd.c:74 +#, c-format +msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s" +msgstr "socket(PF_UNIX, SOCK_STREAM, 0): %s" + +#: ../src/utils/pacmd.c:91 +#, c-format +msgid "connect(): %s" +msgstr "connect(): %s" + +#: ../src/utils/pacmd.c:99 +msgid "Failed to kill PulseAudio daemon." +msgstr "PulseAudio-voorziening uitzetten mislukt." + +#: ../src/utils/pacmd.c:107 +msgid "Daemon not responding." +msgstr "Voorziening reageert niet." + +#: ../src/utils/pacmd.c:161 +#, c-format +msgid "poll(): %s" +msgstr "poll(): %s" + +#: ../src/utils/pacmd.c:171 ../src/utils/pacmd.c:188 +#, c-format +msgid "read(): %s" +msgstr "read(): %s" + +#: ../src/utils/pacmd.c:207 ../src/utils/pacmd.c:223 +#, c-format +msgid "write(): %s" +msgstr "write(): %s" + +#: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:219 +msgid "Cannot access autospawn lock." +msgstr "Kan geen toegang krijgen tot autospawn blokkade." + +#: ../src/modules/alsa/alsa-sink.c:530 ../src/modules/alsa/alsa-sink.c:689 +#, c-format +msgid "" +"ALSA woke us up to write new data to the device, but there was actually " +"nothing to write!\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers.\n" +"We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() " +"returned 0 or another value < min_avail." +msgstr "" +"ALSA maakte ons wakker om nieuwe data naar het apparaat te schrijven, maar " +"er was niets om weg te schrijven!\n" +"Waarschijnlijk is dit een fout in het ALSA-stuurprogramma ‘%s’. Meld dit " +"probleem alstublieft aan de ALSA-ontwikkelaars.\n" +"We werden gewekt met POLLOUT ingesteld -- echter een opvolgende snd_pcm_avail" +"() gaf 0 terug of een andere waarde < min_avail." + +#: ../src/modules/alsa/alsa-source.c:506 ../src/modules/alsa/alsa-source.c:656 +#, c-format +msgid "" +"ALSA woke us up to read new data from the device, but there was actually " +"nothing to read!\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers.\n" +"We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() " +"returned 0 or another value < min_avail." +msgstr "" +"ALSA maakte ons wakker om nieuwe data van het apparaat te lezen, maar er was " +"niets om te lezen!\n" +"Waarschijnlijk is dit een fout in het ALSA-stuurprogramma ‘%s’. Meld dit " +"probleem alstublieft aan de ALSA-ontwikkelaars.\n" +"We werden gewekt met POLLIN ingesteld -- echter een opvolgende snd_pcm_avail" +"() gaf 0 terug of een andere waarde < min_avail." + +#: ../src/modules/alsa/module-alsa-card.c:152 +#: ../src/modules/bluetooth/module-bluetooth-device.c:2228 +#: ../src/modules/alsa/alsa-mixer.c:2931 +msgid "Off" +msgstr "Uit" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2184 +msgid "High Fidelity Playback (A2DP)" +msgstr "High Fidelity Playback (A2DP)" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2198 +msgid "High Fidelity Capture (A2DP)" +msgstr "High Fidelity afvangen (A2DP)" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2213 +msgid "Telephony Duplex (HSP/HFP)" +msgstr "Telefonie duplex (HSP/HFP)" + +#: ../src/modules/reserve-wrap.c:151 +msgid "PulseAudio Sound Server" +msgstr "PulseAudio-geluidsserver" + +#: ../src/modules/module-rygel-media-server.c:569 +#: ../src/modules/module-rygel-media-server.c:583 +msgid "Output Devices" +msgstr "Uitvoerapparaten" + +#: ../src/modules/module-rygel-media-server.c:570 +#: ../src/modules/module-rygel-media-server.c:584 +msgid "Input Devices" +msgstr "Invoerapparaten" + +#: ../src/modules/module-rygel-media-server.c:774 +msgid "Audio on @HOSTNAME@" +msgstr "Geluid op @HOSTNAME@" + +#: ../src/modules/alsa/alsa-mixer.c:1701 +msgid "Input" +msgstr "Invoer" + +#: ../src/modules/alsa/alsa-mixer.c:1702 +msgid "Docking Station Input" +msgstr "Docking station-invoer" + +#: ../src/modules/alsa/alsa-mixer.c:1703 +msgid "Docking Station Microphone" +msgstr "Docking station-microfoon" + +#: ../src/modules/alsa/alsa-mixer.c:1704 +msgid "Line-In" +msgstr "Lijn-in" + +#: ../src/modules/alsa/alsa-mixer.c:1705 +msgid "Microphone" +msgstr "Microfoon" + +#: ../src/modules/alsa/alsa-mixer.c:1706 +msgid "External Microphone" +msgstr "Externe microfoon" + +#: ../src/modules/alsa/alsa-mixer.c:1707 +msgid "Internal Microphone" +msgstr "Interne microfoon" + +#: ../src/modules/alsa/alsa-mixer.c:1708 +msgid "Radio" +msgstr "Radio" + +#: ../src/modules/alsa/alsa-mixer.c:1709 +msgid "Video" +msgstr "Video" + +#: ../src/modules/alsa/alsa-mixer.c:1710 +msgid "Automatic Gain Control" +msgstr "Automatische gain-controle" + +#: ../src/modules/alsa/alsa-mixer.c:1711 +msgid "No Automatic Gain Control" +msgstr "Geen automatische gain-controle" + +#: ../src/modules/alsa/alsa-mixer.c:1712 +msgid "Boost" +msgstr "Boostversterking" + +#: ../src/modules/alsa/alsa-mixer.c:1713 +msgid "No Boost" +msgstr "Geen boostversterking" + +#: ../src/modules/alsa/alsa-mixer.c:1714 +msgid "Amplifier" +msgstr "Versterker" + +#: ../src/modules/alsa/alsa-mixer.c:1715 +msgid "No Amplifier" +msgstr "Geen versterker" + +#: ../src/modules/alsa/alsa-mixer.c:1773 +msgid "Analog Input" +msgstr "Analoge invoer" + +#: ../src/modules/alsa/alsa-mixer.c:1774 +msgid "Analog Microphone" +msgstr "Analoge microfoon" + +#: ../src/modules/alsa/alsa-mixer.c:1775 +msgid "Analog Line-In" +msgstr "Analoge lijn-in" + +#: ../src/modules/alsa/alsa-mixer.c:1776 +msgid "Analog Radio" +msgstr "Analoge radio" + +#: ../src/modules/alsa/alsa-mixer.c:1777 +msgid "Analog Video" +msgstr "Analoge video" + +#: ../src/modules/alsa/alsa-mixer.c:1778 +msgid "Analog Output" +msgstr "Analoge output" + +#: ../src/modules/alsa/alsa-mixer.c:1779 +msgid "Analog Headphones" +msgstr "Analoge koptelefoon" + +#: ../src/modules/alsa/alsa-mixer.c:1780 +msgid "Analog Output (LFE)" +msgstr "Analoge output (LFE)" + +#: ../src/modules/alsa/alsa-mixer.c:1781 +msgid "Analog Mono Output" +msgstr "Analoge mono-uitvoer" + +#: ../src/modules/alsa/alsa-mixer.c:1981 +#, c-format +msgid "%s+%s" +msgstr "%s+%s" + +#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404 +#, c-format +msgid "%s / %s" +msgstr "%s/%s" + +#: ../src/modules/alsa/alsa-mixer.c:2790 +msgid "Analog Mono" +msgstr "Analoog mono" + +#: ../src/modules/alsa/alsa-mixer.c:2791 +msgid "Analog Stereo" +msgstr "Analoog stereo" + +#: ../src/modules/alsa/alsa-mixer.c:2792 +msgid "Analog Surround 2.1" +msgstr "Analoog surround 2.1" + +#: ../src/modules/alsa/alsa-mixer.c:2793 +msgid "Analog Surround 3.0" +msgstr "Analoog surround 3.0" + +#: ../src/modules/alsa/alsa-mixer.c:2794 +msgid "Analog Surround 3.1" +msgstr "Analoog surround 3.1" + +#: ../src/modules/alsa/alsa-mixer.c:2795 +msgid "Analog Surround 4.0" +msgstr "Analoog surround 4.0" + +#: ../src/modules/alsa/alsa-mixer.c:2796 +msgid "Analog Surround 4.1" +msgstr "Analoog surround 4.1" + +#: ../src/modules/alsa/alsa-mixer.c:2797 +msgid "Analog Surround 5.0" +msgstr "Analoog surround 5.0" + +#: ../src/modules/alsa/alsa-mixer.c:2798 +msgid "Analog Surround 5.1" +msgstr "Analoog surround 5.1" + +#: ../src/modules/alsa/alsa-mixer.c:2799 +msgid "Analog Surround 6.0" +msgstr "Analoog surround 6.0" + +#: ../src/modules/alsa/alsa-mixer.c:2800 +msgid "Analog Surround 6.1" +msgstr "Analoog surround 6.1" + +#: ../src/modules/alsa/alsa-mixer.c:2801 +msgid "Analog Surround 7.0" +msgstr "Analoog surround 7.0" + +#: ../src/modules/alsa/alsa-mixer.c:2802 +msgid "Analog Surround 7.1" +msgstr "Analoog surround 7.1" + +#: ../src/modules/alsa/alsa-mixer.c:2803 +msgid "Digital Stereo (IEC958)" +msgstr "Digitaal stereo (IEC958)" + +#: ../src/modules/alsa/alsa-mixer.c:2804 +msgid "Digital Surround 4.0 (IEC958)" +msgstr "Digitaal surround 4.0 (IEC958)" + +#: ../src/modules/alsa/alsa-mixer.c:2805 +msgid "Digital Surround 4.0 (IEC958/AC3)" +msgstr "Digitaal surround 4.0 (IEC958/AC3)" + +#: ../src/modules/alsa/alsa-mixer.c:2806 +msgid "Digital Surround 5.1 (IEC958/AC3)" +msgstr "Digitaal surround 5.1 (IEC958/AC3)" + +#: ../src/modules/alsa/alsa-mixer.c:2807 +msgid "Digital Stereo (HDMI)" +msgstr "Digitaal stereo (HDMI)" + +#: ../src/modules/alsa/alsa-mixer.c:2928 +msgid "Analog Mono Duplex" +msgstr "Analoog mono duplex" + +#: ../src/modules/alsa/alsa-mixer.c:2929 +msgid "Analog Stereo Duplex" +msgstr "Analoog stereo duplex" + +#: ../src/modules/alsa/alsa-mixer.c:2930 +msgid "Digital Stereo Duplex (IEC958)" +msgstr "Digitaal stereo duplex (IEC958)" + +#, fuzzy +#~ msgid "Invalid client name '%s'\n" +#~ msgstr "Ongeldige resample methode '%s'." + +#~ msgid "Cannot connect to system bus: %s" +#~ msgstr "Kan niet verbinden met systeem bus: %s" + +#~ msgid "Cannot get caller from PID: %s" +#~ msgstr "Kan geen bezoeker krijgen van PID: %s" + +#~ msgid "Cannot set UID on caller object." +#~ msgstr "Kan UID niet instellen op caller object." + +#~ msgid "Failed to get CK session." +#~ msgstr "Kon geen CK sessie krijgen." + +#~ msgid "Cannot set UID on session object." +#~ msgstr "Kan UID niet instellen op sessie object." + +#~ msgid "Cannot allocate PolKitAction." +#~ msgstr "Kan PolKitAction niet toekennen." + +#~ msgid "Cannot set action_id" +#~ msgstr "Kan action_id niet instellen" + +#~ msgid "Cannot allocate PolKitContext." +#~ msgstr "Kan PolKitContext niet toekennen." + +#~ msgid "Cannot initialize PolKitContext: %s" +#~ msgstr "Kan PolKitContext niet intialiseren: %s" + +#~ msgid "Could not determine whether caller is authorized: %s" +#~ msgstr "Kon niet bepalen of bezoeker gemachtigd is: %s" + +#~ msgid "Cannot obtain auth: %s" +#~ msgstr "Kan geen authorisatie krijgen: %s" + +#~ msgid "PolicyKit responded with '%s'" +#~ msgstr "PolicyKit antwoordde met '%s'" + +#~ msgid "We're in the group '%s', allowing high-priority scheduling." +#~ msgstr "" +#~ "Wij zijn in de groep '%s', wat plannen met hoge prioriteit toestaat." + +#~ msgid "We're in the group '%s', allowing real-time scheduling." +#~ msgstr "Wij zijn in de groep '%s', war real-time planning toestaat." + +#~ msgid "PolicyKit grants us acquire-high-priority privilege." +#~ msgstr "PolicyKit kent ons acquire-high-priority rechten toe." + +#~ msgid "PolicyKit refuses acquire-high-priority privilege." +#~ msgstr "PolicyKit weigert ons acquire-high-priority rechten." + +#~ msgid "PolicyKit grants us acquire-real-time privilege." +#~ msgstr "PolicyKit kent ons acquire-real-time rechten toe." + +#~ msgid "PolicyKit refuses acquire-real-time privilege." +#~ msgstr "PolicyKit weigert ons acquire-real-time rechten." + +#~ msgid "" +#~ "Called SUID root and real-time and/or high-priority scheduling was " +#~ "requested in the configuration. However, we lack the necessary " +#~ "privileges:\n" +#~ "We are not in group '%s', PolicyKit refuse to grant us the requested " +#~ "privileges and we have no increase RLIMIT_NICE/RLIMIT_RTPRIO resource " +#~ "limits.\n" +#~ "For enabling real-time/high-priority scheduling please acquire the " +#~ "appropriate PolicyKit privileges, or become a member of '%s', or increase " +#~ "the RLIMIT_NICE/RLIMIT_RTPRIO resource limits for this user." +#~ msgstr "" +#~ "Aangeroepen met SUID root en real-time en/of high-priority inplannen was " +#~ "verzocht in de configuratie. Echter de nodige rechten ontbreken:\n" +#~ "We zijn niet in groep '%s', PolicyKit weigert om ons de gevraagde rechten " +#~ "te geven en we hebben geen rect om de RLIMIT_NICE/RLIMIT_RTPRIO limieten " +#~ "te verhogen.\n" +#~ "Voor het aanzetten van real-time/high-priority inplannen mort je juiste " +#~ "PolicyKit privileges hebben, of lid van '%s\" worden, of de RLIMIT_NICE/" +#~ "RLIMIT_RTPRIO limieten voor deze gebruiker verhogen." + +#~ msgid "" +#~ "High-priority scheduling enabled in configuration but not allowed by " +#~ "policy." +#~ msgstr "" +#~ "Hoge prioriteit inplannen is aangezet in de configuratie maar niet " +#~ "toegestaan door de richtlijnen." + +#~ msgid "Successfully increased RLIMIT_RTPRIO" +#~ msgstr "RLIMIT_RTPRIO met succes verhoogd" + +#~ msgid "RLIMIT_RTPRIO failed: %s" +#~ msgstr "RLIMIT_RTPRIO mislukte: %s" + +#~ msgid "Giving up CAP_NICE" +#~ msgstr "Opgeven CAP_NICE" + +#~ msgid "" +#~ "Real-time scheduling enabled in configuration but not allowed by policy." +#~ msgstr "" +#~ "Real-time inplannen is aangezet in de configuratie maar niet toegestaan " +#~ "door de richtlijnen." diff --git a/po/or.po b/po/or.po new file mode 100644 index 0000000..c4a8d19 --- /dev/null +++ b/po/or.po @@ -0,0 +1,2578 @@ +# translation of pulseaudio.master-tx.or.po to Oriya +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Manoj Kumar Giri , 2009. +msgid "" +msgstr "" +"Project-Id-Version: pulseaudio.master-tx.or\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-09-29 23:47+0200\n" +"PO-Revision-Date: 2009-09-11 12:56+0530\n" +"Last-Translator: Manoj Kumar Giri \n" +"Language-Team: Oriya \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=2; plural=(n!=1);\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" + +#: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629 +#, c-format +msgid "%s %s" +msgstr "%s %s" + +#: ../src/modules/alsa/alsa-util.c:1106 +#, c-format +msgid "" +"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu " +"ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu " +"ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." + +#: ../src/modules/alsa/alsa-util.c:1147 +#, c-format +msgid "" +"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%" +"lu ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%" +"lu ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." + +#: ../src/modules/alsa/alsa-util.c:1194 +#, c-format +msgid "" +"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes " +"(%lu ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes " +"(%lu ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." + +#: ../src/modules/module-always-sink.c:39 +msgid "Always keeps at least one sink loaded even if it's a null one" +msgstr "ସର୍ବଦା ଅତିକମରେ ଗୋଟିଏ ସିଙ୍କକୁ ଧାରଣ କରନ୍ତୁ ଯଦିଚ ତାହା ଗୋଟିଏ ଶୂନ୍ୟ ଅଟେ" + +#: ../src/modules/module-always-sink.c:83 +msgid "Dummy Output" +msgstr "ପ୍ରତିରୂପି ଫଳାଫଳ" + +#: ../src/modules/module-ladspa-sink.c:49 +msgid "Virtual LADSPA sink" +msgstr "ଆଭାସୀ LADSPA ସିଙ୍କ" + +#: ../src/modules/module-ladspa-sink.c:53 +msgid "" +"sink_name= sink_properties= " +"master= format= rate= " +"channels= channel_map= plugin= label= control=" +msgstr "" +"sink_name=<ସିଙ୍କର ନାମ> sink_properties=<ସିଙ୍କର ଗୁଣଧର୍ମ> master=<ସିଙ୍କ ଛାଣକର ନାମ> " +"format=<ନମୁନା ସଜ୍ଜିକରଣ ଶୈଳୀ> rate=<ନମୁନା ହାର> channels=<ଚ୍ୟାନେଲ ସଂଖ୍ୟା> " +"channel_map=<ଚ୍ୟାନେଲ ମ୍ୟାପ> plugin= label= control=<କମା ଦ୍ୱାରା ପୃଥକ ନିବେଶ ନିୟନ୍ତ୍ରଣ ମୂଲ୍ୟ ତାଲିକା>" + +#: ../src/modules/module-null-sink.c:55 +msgid "Clocked NULL sink" +msgstr "ସମୟାନୁବର୍ତ୍ତି ଶୂନ୍ୟ ସିଙ୍କ" + +#: ../src/modules/module-null-sink.c:291 +msgid "Null Output" +msgstr "ଶୂନ୍ୟ ଫଳାଫଳ" + +#: ../src/pulsecore/sink.c:2613 +msgid "Internal Audio" +msgstr "ଆଭ୍ୟନ୍ତରୀଣ ଧ୍ୱନି" + +#: ../src/pulsecore/sink.c:2618 +msgid "Modem" +msgstr "ମଡେମ" + +#: ../src/daemon/ltdl-bind-now.c:124 +msgid "Failed to find original lt_dlopen loader." +msgstr "ପ୍ରକୃତ lt_dlopen ଧାରକକୁ ଖୋଜି ପାଇବାରେ ବିଫଳ।" + +#: ../src/daemon/ltdl-bind-now.c:129 +msgid "Failed to allocate new dl loader." +msgstr "ନୂତନ dl ଧାରକକୁ ବଣ୍ଟନ କରିବାରେ ବିଫଳ।" + +#: ../src/daemon/ltdl-bind-now.c:142 +msgid "Failed to add bind-now-loader." +msgstr "bind-now-loaderକୁ ଯୋଗ କରିବାରେ ବିଫଳ।" + +#: ../src/daemon/main.c:141 +#, c-format +msgid "Got signal %s." +msgstr "ସଂକେତ %s ପାଇଲା।" + +#: ../src/daemon/main.c:168 +msgid "Exiting." +msgstr "ଉତ୍ତେଜିତ କରୁଅଛି।" + +#: ../src/daemon/main.c:186 +#, c-format +msgid "Failed to find user '%s'." +msgstr "ଚାଳକ '%s' କୁ ଖୋଜିବାରେ ବିଫଳ।" + +#: ../src/daemon/main.c:191 +#, c-format +msgid "Failed to find group '%s'." +msgstr "ସମୂହ '%s' କୁ ଖୋଜି ପାଇବାରେ ବିଫଳ।" + +#: ../src/daemon/main.c:195 +#, c-format +msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)." +msgstr "ଚାଳକ '%s' (UID %lu) ଏବଂ ସମୂହ '%s' (GID %lu) ମିଳିଲା।" + +#: ../src/daemon/main.c:200 +#, c-format +msgid "GID of user '%s' and of group '%s' don't match." +msgstr "ଚାଳକ '%s' ଏବଂ ସମୂହ '%s' ର GID ମେଳଖାଏନାହିଁ।" + +#: ../src/daemon/main.c:205 +#, c-format +msgid "Home directory of user '%s' is not '%s', ignoring." +msgstr "ଚାଳକ '%s' ର ମୂଖ୍ୟ ଡିରେକ୍ଟୋରୀଟି '%s' ନୁହଁ, ଅଗ୍ରାହ୍ୟ କରୁଅଛି।" + +#: ../src/daemon/main.c:208 ../src/daemon/main.c:213 +#, c-format +msgid "Failed to create '%s': %s" +msgstr "'%s' ନିର୍ମାଣ କରିବାରେ ବିଫଳ: %s" + +#: ../src/daemon/main.c:220 +#, c-format +msgid "Failed to change group list: %s" +msgstr "ସମୂହ ତାଲିକାକୁ ପରିବର୍ତ୍ତନ କରିବାରେ ବିଫଳ: %s" + +#: ../src/daemon/main.c:236 +#, c-format +msgid "Failed to change GID: %s" +msgstr "GID କୁ ପରିବର୍ତ୍ତନ କରିବାରେ ବିଫଳ ହୋଇଛି: %s" + +#: ../src/daemon/main.c:252 +#, c-format +msgid "Failed to change UID: %s" +msgstr "UID କୁ ପରିବର୍ତ୍ତନ କରିବାରେ ବିଫଳ ହୋଇଛି: %s" + +#: ../src/daemon/main.c:271 +msgid "Successfully dropped root privileges." +msgstr "ମୂଖ୍ୟ ଚାଳକ ଅଧିକାରକୁ ସଫଳତାର ସହିତ ପକାଯାଇଛି।" + +#: ../src/daemon/main.c:279 +msgid "System wide mode unsupported on this platform." +msgstr "ତନ୍ତ୍ରମୟ ଧାରା ଏହି ପ୍ଲାଟଫର୍ମରେ ଅସମର୍ଥିତ।" + +#: ../src/daemon/main.c:297 +#, c-format +msgid "setrlimit(%s, (%u, %u)) failed: %s" +msgstr "setrlimit(%s, (%u, %u)) ବିଫଳ ହୋଇଛି: %s" + +#: ../src/daemon/main.c:474 +msgid "Failed to parse command line." +msgstr "ପାଠ୍ୟ ନିର୍ଦ୍ଦେଶକୁ ବିଶ୍ଳେଷଣ କରିବାରେ ବିଫଳ।" + +#: ../src/daemon/main.c:541 +msgid "Daemon not running" +msgstr "ଡେମନ ଚାଲୁନାହିଁ" + +#: ../src/daemon/main.c:543 +#, c-format +msgid "Daemon running as PID %u" +msgstr "ଡେମନ PID %u ପରି ଚାଲୁଅଛି" + +#: ../src/daemon/main.c:553 +#, c-format +msgid "Failed to kill daemon: %s" +msgstr "ଡେମନକୁ ବନ୍ଦ କରିବାରେ ବିଫଳ: %s" + +#: ../src/daemon/main.c:571 +msgid "" +"This program is not intended to be run as root (unless --system is " +"specified)." +msgstr "" +"ଏହି ପ୍ରଗ୍ରାମଟି ମୂଖ୍ୟ ଚାଳକ ଭାବରେ ଚଲାଇବା ପାଇଁ ନିର୍ଦ୍ଦିଷ୍ଟ ହୋଇନାହିଁ (unless --system is " +"specified)।" + +#: ../src/daemon/main.c:573 +msgid "Root privileges required." +msgstr "ମୂଖ୍ୟ ଚାଳକ ଅଧିକାର ଆବଶ୍ୟକ।" + +#: ../src/daemon/main.c:578 +msgid "--start not supported for system instances." +msgstr "--start ତନ୍ତ୍ର ସ୍ଥିତି ପାଇଁ ସମର୍ଥିତ ନୁହଁ।" + +#: ../src/daemon/main.c:583 +msgid "Running in system mode, but --disallow-exit not set!" +msgstr "ତନ୍ତ୍ର ଧାରାରେ ଚାଲୁଅଛି, କିନ୍ତୁ --disallow-exit କୁ ସେଟ କରାଯାଇନାହିଁ!" + +#: ../src/daemon/main.c:586 +msgid "Running in system mode, but --disallow-module-loading not set!" +msgstr "ତନ୍ତ୍ର ଧାରାରେ ଚାଲୁଅଛି, କିନ୍ତୁ --disallow-module-loading କୁ ସେଟ କରାଯାଇନାହିଁ!" + +#: ../src/daemon/main.c:589 +msgid "Running in system mode, forcibly disabling SHM mode!" +msgstr "ତନ୍ତ୍ର ଧାରାରେ ଚାଲୁଅଛି, SHM ଧାରାକୁ ବାଧ୍ଯତାମୁଳକ ଭାବରେ ନିଷ୍କ୍ରିୟ କରିଥାଏ!" + +#: ../src/daemon/main.c:594 +msgid "Running in system mode, forcibly disabling exit idle time!" +msgstr "ତନ୍ତ୍ର ଧାରାରେ ଚାଲୁଅଛି, ପ୍ରସ୍ଥାନ ସ୍ଥିର ସମୟକୁ ବାଧ୍ଯତାମୁଳକ ଭାବରେ ନିଷ୍କ୍ରିୟ କରିଥାଏ!" + +#: ../src/daemon/main.c:621 +msgid "Failed to acquire stdio." +msgstr "stdio କୁ ଅଧିକାର କରିବାରେ ବିଫଳ।" + +#: ../src/daemon/main.c:627 +#, c-format +msgid "pipe failed: %s" +msgstr "ପାଇପ ବିଫଳ ହୋଇଛି: %s" + +#: ../src/daemon/main.c:632 +#, c-format +msgid "fork() failed: %s" +msgstr "fork() ବିଫଳ ହୋଇଛି: %s" + +#: ../src/daemon/main.c:646 ../src/utils/pacat.c:508 +#, c-format +msgid "read() failed: %s" +msgstr "read() ବିଫଳ ହୋଇଛି: %s" + +#: ../src/daemon/main.c:652 +msgid "Daemon startup failed." +msgstr "ଡେମନ ଆରମ୍ଭ ବିଫଳ ହୋଇଛି।" + +#: ../src/daemon/main.c:654 +msgid "Daemon startup successful." +msgstr "ଡେମନ ଆରମ୍ଭ ସଫଳ ହୋଇଛି।" + +#: ../src/daemon/main.c:731 +#, c-format +msgid "This is PulseAudio %s" +msgstr "ଏହା ହେଉଛି PulseAudio %s" + +#: ../src/daemon/main.c:732 +#, c-format +msgid "Compilation host: %s" +msgstr "ସଂକଳନ ଆଧାର: %s" + +#: ../src/daemon/main.c:733 +#, c-format +msgid "Compilation CFLAGS: %s" +msgstr "ସଂକଳନ CFLAGS: %s" + +#: ../src/daemon/main.c:736 +#, c-format +msgid "Running on host: %s" +msgstr "ଆଧାରରେ ଚାଲୁଅଛି: %s" + +#: ../src/daemon/main.c:739 +#, c-format +msgid "Found %u CPUs." +msgstr "%u CPUs ମିଳିଛି।" + +#: ../src/daemon/main.c:741 +#, c-format +msgid "Page size is %lu bytes" +msgstr "ପୃଷ୍ଠା ଆକାରଟି ହେଉଛି %lu ବାଇଟ" + +#: ../src/daemon/main.c:744 +msgid "Compiled with Valgrind support: yes" +msgstr "Valgrind ସମର୍ଥନ ସହିତ ସଂକଳନ ହୋଇଛି: yes" + +#: ../src/daemon/main.c:746 +msgid "Compiled with Valgrind support: no" +msgstr "Valgrind ସମର୍ଥନ ସହିତ ସଂକଳନ ହୋଇଛି: no" + +#: ../src/daemon/main.c:749 +#, c-format +msgid "Running in valgrind mode: %s" +msgstr "valgrind ଧାରାରେ ଚାଲୁଅଛି: %s" + +#: ../src/daemon/main.c:752 +msgid "Optimized build: yes" +msgstr "ଉପଯୁକ୍ତ ନିର୍ମାଣ: yes" + +#: ../src/daemon/main.c:754 +msgid "Optimized build: no" +msgstr "ଉପଯୁକ୍ତ ନିର୍ମାଣ: no" + +#: ../src/daemon/main.c:758 +msgid "NDEBUG defined, all asserts disabled." +msgstr "NDEBUG କୁ ବ୍ୟାଖ୍ୟା କରାଯାଇଛି, ସମସ୍ତ ନିଶ୍ଚୟକୁ ନିଷ୍କ୍ରିୟ କରାଯାଇଛି।" + +#: ../src/daemon/main.c:760 +msgid "FASTPATH defined, only fast path asserts disabled." +msgstr "FASTPATH କୁ ବ୍ୟାଖ୍ୟା କରାଯାଇଛି, କେବଳ ତୀବ୍ର ପଥ ନିଶ୍ଚୟକୁ ନିଷ୍କ୍ରିୟ କରାଯାଇଛି।" + +#: ../src/daemon/main.c:762 +msgid "All asserts enabled." +msgstr "ସମସ୍ତ ନିଶ୍ଚୟକୁ ସକ୍ରିୟ କରାଯାଇଛି।" + +#: ../src/daemon/main.c:766 +msgid "Failed to get machine ID" +msgstr "ଯନ୍ତ୍ର ID ପାଇବାରେ ବିଫଳ" + +#: ../src/daemon/main.c:769 +#, c-format +msgid "Machine ID is %s." +msgstr "ଯନ୍ତ୍ର ID ଟି ହେଉଛି %s।" + +#: ../src/daemon/main.c:773 +#, c-format +msgid "Session ID is %s." +msgstr "ଅଧିବେଶନ ID ଟି ହେଉଛି %s।" + +#: ../src/daemon/main.c:779 +#, c-format +msgid "Using runtime directory %s." +msgstr "ପ୍ରଚଳିତ ଡିରେକ୍ଟୋରୀ %s କୁ ବ୍ୟବହାର କରୁଅଛି।" + +#: ../src/daemon/main.c:784 +#, c-format +msgid "Using state directory %s." +msgstr "ସ୍ଥିତି ଡିରେକ୍ଟୋରୀ %s କୁ ବ୍ୟବହାର କରି।" + +#: ../src/daemon/main.c:787 +#, c-format +msgid "Using modules directory %s." +msgstr "ଏକକାଂଶ ଡିରେକ୍ଟୋରୀ %s କୁ ବ୍ୟବହାର କରି।" + +#: ../src/daemon/main.c:789 +#, c-format +msgid "Running in system mode: %s" +msgstr "ତନ୍ତ୍ର ଧାରାରେ ଚାଲୁଅଛି: %s" + +#: ../src/daemon/main.c:792 +msgid "" +"OK, so you are running PA in system mode. Please note that you most likely " +"shouldn't be doing that.\n" +"If you do it nonetheless then it's your own fault if things don't work as " +"expected.\n" +"Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an " +"explanation why system mode is usually a bad idea." +msgstr "" +"OK, ଆପଣ PA କୁ ତନ୍ତ୍ର ଧାରାରେ ଚଲାଉଛନ୍ତି। ଦୟାକରି ମନେ ରଖନ୍ତୁ ଯେ ଆପଣ ପ୍ରାୟତଃ ତାହା " +"କରୁନାହାନ୍ତି।\n" +"ଯଦି ଆପଣ ତାହା କରନ୍ତି ଏବଂ ସବୁକିଛି ଠିକରେ ନଚାଲେ ତେବେ ତାହା ଆପଣଙ୍କର ନିଜର ଦୋଷ।\n" +"ତନ୍ତ୍ର ଧାରାଟି ସାଧାରଣତଃ କାହିଁକି ଖରାପ ତାହା ବିଷୟରେ ଜାଣିବା ପାଇଁ ଦୟାକରି http://pulseaudio." +"org/wiki/WhatIsWrongWithSystemMode କୁ ପଢ଼ନ୍ତୁ।" + +#: ../src/daemon/main.c:809 +msgid "pa_pid_file_create() failed." +msgstr "pa_pid_file_create() ବିଫଳ ହୋଇଛି।" + +#: ../src/daemon/main.c:819 +msgid "Fresh high-resolution timers available! Bon appetit!" +msgstr "ସତେଜ ଉଚ୍ଚ-ବିଭେଦନ ସମୟ ମାପକ ଉପଲବ୍ଧ! Bon appetit!" + +#: ../src/daemon/main.c:821 +msgid "" +"Dude, your kernel stinks! The chef's recommendation today is Linux with high-" +"resolution timers enabled!" +msgstr "" +"Dude, your kernel stinks! The chef's recommendation today is Linux with high-" +"resolution timers enabled!" + +#: ../src/daemon/main.c:844 +msgid "pa_core_new() failed." +msgstr "pa_core_new() ବିଫଳ ହୋଇଛି।" + +#: ../src/daemon/main.c:904 +msgid "Failed to initialize daemon." +msgstr "ଡେମନକୁ ଆରମ୍ଭ କରିବାରେ ବିଫଳ।" + +#: ../src/daemon/main.c:909 +msgid "Daemon startup without any loaded modules, refusing to work." +msgstr "ଧାରଣ ହୋଇଥିବା ଏକକାଂଶଗୁଡ଼ିକ ବିନା ଡେମନ ଆରମ୍ଭ ହୋଇଛି, କାର୍ଯ୍ୟ କରିବାକୁ ବାରଣ କରୁଅଛି।" + +#: ../src/daemon/main.c:926 +msgid "Daemon startup complete." +msgstr "ଡେମନ ଆରମ୍ଭ ସମ୍ପୂର୍ଣ୍ଣ ହୋଇଛି।" + +#: ../src/daemon/main.c:932 +msgid "Daemon shutdown initiated." +msgstr "ଡେମନ ବନ୍ଦକୁ ଆରମ୍ଭ କରାଯାଇଛି।" + +#: ../src/daemon/main.c:954 +msgid "Daemon terminated." +msgstr "ଡେମନକୁ ସମାପ୍ତ କରାଯାଇଛି।" + +#: ../src/daemon/cmdline.c:115 +#, c-format +msgid "" +"%s [options]\n" +"\n" +"COMMANDS:\n" +" -h, --help Show this help\n" +" --version Show version\n" +" --dump-conf Dump default configuration\n" +" --dump-modules Dump list of available modules\n" +" --dump-resample-methods Dump available resample methods\n" +" --cleanup-shm Cleanup stale shared memory " +"segments\n" +" --start Start the daemon if it is not " +"running\n" +" -k --kill Kill a running daemon\n" +" --check Check for a running daemon (only " +"returns exit code)\n" +"\n" +"OPTIONS:\n" +" --system[=BOOL] Run as system-wide instance\n" +" -D, --daemonize[=BOOL] Daemonize after startup\n" +" --fail[=BOOL] Quit when startup fails\n" +" --high-priority[=BOOL] Try to set high nice level\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_NICE)\n" +" --realtime[=BOOL] Try to enable realtime scheduling\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_RTPRIO)\n" +" --disallow-module-loading[=BOOL] Disallow module user requested " +"module\n" +" loading/unloading after startup\n" +" --disallow-exit[=BOOL] Disallow user requested exit\n" +" --exit-idle-time=SECS Terminate the daemon when idle and " +"this\n" +" time passed\n" +" --module-idle-time=SECS Unload autoloaded modules when idle " +"and\n" +" this time passed\n" +" --scache-idle-time=SECS Unload autoloaded samples when idle " +"and\n" +" this time passed\n" +" --log-level[=LEVEL] Increase or set verbosity level\n" +" -v Increase the verbosity level\n" +" --log-target={auto,syslog,stderr} Specify the log target\n" +" --log-meta[=BOOL] Include code location in log " +"messages\n" +" --log-time[=BOOL] Include timestamps in log messages\n" +" --log-backtrace=FRAMES Include a backtrace in log messages\n" +" -p, --dl-search-path=PATH Set the search path for dynamic " +"shared\n" +" objects (plugins)\n" +" --resample-method=METHOD Use the specified resampling method\n" +" (See --dump-resample-methods for\n" +" possible values)\n" +" --use-pid-file[=BOOL] Create a PID file\n" +" --no-cpu-limit[=BOOL] Do not install CPU load limiter on\n" +" platforms that support it.\n" +" --disable-shm[=BOOL] Disable shared memory support.\n" +"\n" +"STARTUP SCRIPT:\n" +" -L, --load=\"MODULE ARGUMENTS\" Load the specified plugin module " +"with\n" +" the specified argument\n" +" -F, --file=FILENAME Run the specified script\n" +" -C Open a command line on the running " +"TTY\n" +" after startup\n" +"\n" +" -n Don't load default script file\n" +msgstr "" +"%s [options]\n" +"\n" +"COMMANDS:\n" +" -h, --help ଏହି ସହାୟତା ଦର୍ଶାନ୍ତୁ\n" +" --version ସଂସ୍କରଣ ଦର୍ଶାନ୍ତୁ\n" +" --dump-conf ପୂର୍ବନିର୍ଦ୍ଧାରିତ ବିନ୍ୟାସକୁ ଡମ୍ପ କରନ୍ତୁ\n" +" --dump-modules ଉପଲବ୍ଧ ଏକକାଂଶଗୁଡ଼ିକର ଡମ୍ପ ତାଲିକା\n" +" --dump-resample-methods Dump available resample methods\n" +" --cleanup-shm Cleanup stale shared memory " +"segments\n" +" --start ଡେମନକୁ ଆରମ୍ଭ କରନ୍ତୁ ଯଦି ତାହା ଚାଲୁନାହିଁ\n" +" -k --kill ଚାଲୁଥିବା ଡେମନକୁ ବନ୍ଦ କରନ୍ତୁ\n" +" --check Check for a running daemon (only " +"returns exit code)\n" +"\n" +"OPTIONS:\n" +" --system[=BOOL] Run as system-wide instance\n" +" -D, --daemonize[=BOOL] Daemonize after startup\n" +" --fail[=BOOL] Quit when startup fails\n" +" --high-priority[=BOOL] Try to set high nice level\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_NICE)\n" +" --realtime[=BOOL] Try to enable realtime scheduling\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_RTPRIO)\n" +" --disallow-module-loading[=BOOL] Disallow module user requested " +"module\n" +" loading/unloading after startup\n" +" --disallow-exit[=BOOL] Disallow user requested exit\n" +" --exit-idle-time=SECS Terminate the daemon when idle and " +"this\n" +" time passed\n" +" --module-idle-time=SECS Unload autoloaded modules when idle " +"and\n" +" this time passed\n" +" --scache-idle-time=SECS Unload autoloaded samples when idle " +"and\n" +" this time passed\n" +" --log-level[=LEVEL] Increase or set verbosity level\n" +" -v Increase the verbosity level\n" +" --log-target={auto,syslog,stderr} Specify the log target\n" +" --log-meta[=BOOL] Include code location in log " +"messages\n" +" --log-time[=BOOL] Include timestamps in log messages\n" +" --log-backtrace=FRAMES Include a backtrace in log messages\n" +" -p, --dl-search-path=PATH Set the search path for dynamic " +"shared\n" +" objects (plugins)\n" +" --resample-method=METHOD Use the specified resampling method\n" +" (See --dump-resample-methods for\n" +" possible values)\n" +" --use-pid-file[=BOOL] Create a PID file\n" +" --no-cpu-limit[=BOOL] Do not install CPU load limiter on\n" +" platforms that support it.\n" +" --disable-shm[=BOOL] Disable shared memory support.\n" +"\n" +"STARTUP SCRIPT:\n" +" -L, --load=\"MODULE ARGUMENTS\" Load the specified plugin module " +"with\n" +" the specified argument\n" +" -F, --file=FILENAME Run the specified script\n" +" -C Open a command line on the running " +"TTY\n" +" after startup\n" +"\n" +" -n Don't load default script file\n" + +#: ../src/daemon/cmdline.c:247 +msgid "--daemonize expects boolean argument" +msgstr "--daemonize ବୁଲିଆନ ସ୍ୱତନ୍ତ୍ରଚର ଆଶା କରୁଅଛି" + +#: ../src/daemon/cmdline.c:254 +msgid "--fail expects boolean argument" +msgstr "--fail ବୁଲିଆନ ସ୍ୱତନ୍ତ୍ରଚର ଆଶା କରୁଅଛି" + +#: ../src/daemon/cmdline.c:264 +msgid "" +"--log-level expects log level argument (either numeric in range 0..4 or one " +"of debug, info, notice, warn, error)." +msgstr "" +"--log-level expects log level argument (either numeric in range 0..4 or one " +"of debug, info, notice, warn, error)." + +#: ../src/daemon/cmdline.c:276 +msgid "--high-priority expects boolean argument" +msgstr "--high-priority ବୁଲିଆନ ସ୍ୱତନ୍ତ୍ରଚର ଆଶା କରୁଅଛି" + +#: ../src/daemon/cmdline.c:283 +msgid "--realtime expects boolean argument" +msgstr "--realtime ବୁଲିଆନ ସ୍ୱତନ୍ତ୍ରଚର ଆଶା କରୁଅଛି" + +#: ../src/daemon/cmdline.c:290 +msgid "--disallow-module-loading expects boolean argument" +msgstr "--disallow-module-loading ବୁଲିଆନ ସ୍ୱତନ୍ତ୍ରଚର ଆଶା କରୁଅଛି" + +#: ../src/daemon/cmdline.c:297 +msgid "--disallow-exit expects boolean argument" +msgstr "--disallow-exit ବୁଲିଆନ ସ୍ୱତନ୍ତ୍ରଚର ଆଶା କରୁଅଛି" + +#: ../src/daemon/cmdline.c:304 +msgid "--use-pid-file expects boolean argument" +msgstr "--use-pid-file ବୁଲିଆନ ସ୍ୱତନ୍ତ୍ରଚର ଆଶା କରୁଅଛି" + +#: ../src/daemon/cmdline.c:321 +msgid "Invalid log target: use either 'syslog', 'stderr' or 'auto'." +msgstr "ଅବୈଧ ଲଗ ଲକ୍ଷ୍ଯସ୍ଥଳ: 'syslog', 'stderr' କିମ୍ବା 'auto' କୁ ବ୍ୟବହାର କରନ୍ତୁ।" + +#: ../src/daemon/cmdline.c:328 +msgid "--log-time expects boolean argument" +msgstr "--log-time ବୁଲିଆନ ସ୍ୱତନ୍ତ୍ରଚର ଆଶା କରୁଅଛି" + +#: ../src/daemon/cmdline.c:335 +msgid "--log-meta expects boolean argument" +msgstr "--log-meta ବୁଲିଆନ ସ୍ୱତନ୍ତ୍ରଚର ଆଶା କରୁଅଛି" + +#: ../src/daemon/cmdline.c:354 +#, c-format +msgid "Invalid resample method '%s'." +msgstr "ଅବୈଧ ପୁନଃ ପ୍ରତିଦର୍ଶନ ଧାରା '%s'।" + +#: ../src/daemon/cmdline.c:361 +msgid "--system expects boolean argument" +msgstr "--system ବୁଲିଆନ ସ୍ୱତନ୍ତ୍ରଚର ଆଶା କରୁଅଛି" + +#: ../src/daemon/cmdline.c:368 +msgid "--no-cpu-limit expects boolean argument" +msgstr "--no-cpu-limit ବୁଲିଆନ ସ୍ୱତନ୍ତ୍ରଚର ଆଶା କରୁଅଛି" + +#: ../src/daemon/cmdline.c:375 +msgid "--disable-shm expects boolean argument" +msgstr "--disable-shm ବୁଲିଆନ ସ୍ୱତନ୍ତ୍ରଚର ଆଶା କରୁଅଛି" + +#: ../src/daemon/dumpmodules.c:60 +#, c-format +msgid "Name: %s\n" +msgstr "ନାମ: %s\n" + +#: ../src/daemon/dumpmodules.c:63 +#, c-format +msgid "No module information available\n" +msgstr "କୌଣସି ଏକକାଂଶ ସୂଚନା ଉପଲବ୍ଧ ନାହିଁ\n" + +#: ../src/daemon/dumpmodules.c:66 +#, c-format +msgid "Version: %s\n" +msgstr "ସଂସ୍କରଣ: %s\n" + +#: ../src/daemon/dumpmodules.c:68 +#, c-format +msgid "Description: %s\n" +msgstr "ବର୍ଣ୍ଣନା: %s\n" + +#: ../src/daemon/dumpmodules.c:70 +#, c-format +msgid "Author: %s\n" +msgstr "ଲେଖକ: %s\n" + +#: ../src/daemon/dumpmodules.c:72 +#, c-format +msgid "Usage: %s\n" +msgstr "ବ୍ୟବହାର ବିଧି: %s\n" + +#: ../src/daemon/dumpmodules.c:73 +#, c-format +msgid "Load Once: %s\n" +msgstr "ଥରେ ଧାରଣ କରନ୍ତୁ: %s\n" + +#: ../src/daemon/dumpmodules.c:75 +#, c-format +msgid "DEPRECATION WARNING: %s\n" +msgstr "DEPRECATION WARNING: %s\n" + +#: ../src/daemon/dumpmodules.c:79 +#, c-format +msgid "Path: %s\n" +msgstr "ପଥ: %s\n" + +#: ../src/daemon/daemon-conf.c:232 +#, c-format +msgid "[%s:%u] Invalid log target '%s'." +msgstr "[%s:%u] ଅବୈଧ ଲଗ ଲକ୍ଷ୍ଯସ୍ଥଳ '%s'।" + +#: ../src/daemon/daemon-conf.c:248 +#, c-format +msgid "[%s:%u] Invalid log level '%s'." +msgstr "[%s:%u] ଅବୈଧ ଲଗ ସ୍ତର%s'." + +#: ../src/daemon/daemon-conf.c:264 +#, c-format +msgid "[%s:%u] Invalid resample method '%s'." +msgstr "[%s:%u] ଅବୈଧ ପୁନଃ ମିଶ୍ରଣ ଧାରା '%s'।" + +#: ../src/daemon/daemon-conf.c:287 +#, c-format +msgid "[%s:%u] Invalid rlimit '%s'." +msgstr "[%s:%u] ଅବୈଧ rlimit '%s'." + +#: ../src/daemon/daemon-conf.c:294 +#, c-format +msgid "[%s:%u] rlimit not supported on this platform." +msgstr "[%s:%u] rlimit ଏହି ପ୍ଲାଟଫର୍ମରେ ସମର୍ଥିତ ନୁହଁ।" + +#: ../src/daemon/daemon-conf.c:310 +#, c-format +msgid "[%s:%u] Invalid sample format '%s'." +msgstr "[%s:%u] ଅବୈଧ ନମୁନା ଶୈଳୀ '%s'।" + +#: ../src/daemon/daemon-conf.c:328 +#, c-format +msgid "[%s:%u] Invalid sample rate '%s'." +msgstr "[%s:%u] ଅବୈଧ ନମୁନା ହାର '%s'।" + +#: ../src/daemon/daemon-conf.c:352 +#, c-format +msgid "[%s:%u] Invalid sample channels '%s'." +msgstr "[%s:%u] ଅବୈଧ ନମୁନା ଚ୍ୟାନେଲ '%s'।" + +#: ../src/daemon/daemon-conf.c:370 +#, c-format +msgid "[%s:%u] Invalid channel map '%s'." +msgstr "[%s:%u] ଅବୈଧ ଚ୍ୟାନେଲ ମ୍ୟାପ '%s'." + +#: ../src/daemon/daemon-conf.c:388 +#, c-format +msgid "[%s:%u] Invalid number of fragments '%s'." +msgstr "[%s:%u] ଅବୈଧ ସଂଖ୍ୟକ ଖଣ୍ଡଗୁଡ଼ିକ '%s'." + +#: ../src/daemon/daemon-conf.c:406 +#, c-format +msgid "[%s:%u] Invalid fragment size '%s'." +msgstr "[%s:%u] ଅବୈଧ ଖଣ୍ଡ ଆକାର '%s'." + +#: ../src/daemon/daemon-conf.c:424 +#, c-format +msgid "[%s:%u] Invalid nice level '%s'." +msgstr "[%s:%u] ଅବୈଧ ସୁନ୍ଦର ସ୍ତର '%s'." + +#: ../src/daemon/daemon-conf.c:546 +#, c-format +msgid "Failed to open configuration file: %s" +msgstr "ବିନ୍ୟାସ ଫାଇଲ ଖୋଲିବାରେ ବିଫଳ: %s" + +#: ../src/daemon/daemon-conf.c:562 +msgid "" +"The specified default channel map has a different number of channels than " +"the specified default number of channels." +msgstr "" +"ନିର୍ଦ୍ଦିଷ୍ଟିତ ପୂର୍ବନିର୍ଦ୍ଧାରିତ ଚ୍ୟାନେଲ ମ୍ୟାପରେ ପୂର୍ବନିର୍ଦ୍ଧାରିତ ସଂଖ୍ୟକ ଚ୍ୟାନେଲ ବ୍ୟତିତ ଭିନ୍ନ ସଂଖ୍ୟକ " +"ଚ୍ୟାନେଲ ଉଲ୍ଲେଖ ଅଛି।" + +#: ../src/daemon/daemon-conf.c:638 +#, c-format +msgid "### Read from configuration file: %s ###\n" +msgstr "### ବିନ୍ୟାସ ଫାଇଲରୁ ପଢ଼ନ୍ତୁ: %s ###\n" + +#: ../src/daemon/caps.c:62 +msgid "Cleaning up privileges." +msgstr "ଅଧିକାରଗୁଡ଼ିକୁ ବାତିଲ କରୁଅଛି।" + +#: ../src/daemon/pulseaudio.desktop.in.h:1 +msgid "PulseAudio Sound System" +msgstr "PulseAudio ଧ୍ୱନି ତନ୍ତ୍ର" + +#: ../src/daemon/pulseaudio.desktop.in.h:2 +msgid "Start the PulseAudio Sound System" +msgstr "PulseAudio ଧ୍ୱନି ତନ୍ତ୍ରକୁ ଆରମ୍ଭ କରନ୍ତୁ" + +#: ../src/pulse/channelmap.c:105 ../src/pulse/channelmap.c:757 +msgid "Mono" +msgstr "ମୋନୋ" + +#: ../src/pulse/channelmap.c:107 +msgid "Front Center" +msgstr "ସାମ୍ନା ପାଖ କେନ୍ଦ୍ର" + +#: ../src/pulse/channelmap.c:108 +msgid "Front Left" +msgstr "ସାମ୍ନା ବାମ ପାଖ" + +#: ../src/pulse/channelmap.c:109 +msgid "Front Right" +msgstr "ସାମ୍ନା ଡ଼ାହାଣ ପାଖ" + +#: ../src/pulse/channelmap.c:111 +msgid "Rear Center" +msgstr "ପଛ ପାଖ କେନ୍ଦ୍ର" + +#: ../src/pulse/channelmap.c:112 +msgid "Rear Left" +msgstr "ପଛ ବାମ ପାଖ" + +#: ../src/pulse/channelmap.c:113 +msgid "Rear Right" +msgstr "ପଛ ଡ଼ାହାଣ ପାଖ" + +#: ../src/pulse/channelmap.c:115 +msgid "Low Frequency Emmiter" +msgstr "ନିମ୍ନ ଆବୃତ୍ତି ପରିତ୍ୟାଗ କାରୀ" + +#: ../src/pulse/channelmap.c:117 +msgid "Front Left-of-center" +msgstr "ସାମ୍ନା କେନ୍ଦ୍ର-ର-ବାମ ପାଖ" + +#: ../src/pulse/channelmap.c:118 +msgid "Front Right-of-center" +msgstr "ସାମ୍ନା କେନ୍ଦ୍ର-ର-ଡ଼ାହାଣ ପାଖ" + +#: ../src/pulse/channelmap.c:120 +msgid "Side Left" +msgstr "ବାମ ପାର୍ଶ୍ୱ" + +#: ../src/pulse/channelmap.c:121 +msgid "Side Right" +msgstr "ଡ଼ାହାଣ ପାର୍ଶ୍ୱ" + +#: ../src/pulse/channelmap.c:123 +msgid "Auxiliary 0" +msgstr "ସହାୟକ 0" + +#: ../src/pulse/channelmap.c:124 +msgid "Auxiliary 1" +msgstr "ସହାୟକ 1" + +#: ../src/pulse/channelmap.c:125 +msgid "Auxiliary 2" +msgstr "ସହାୟକ 2" + +#: ../src/pulse/channelmap.c:126 +msgid "Auxiliary 3" +msgstr "ସହାୟକ 3" + +#: ../src/pulse/channelmap.c:127 +msgid "Auxiliary 4" +msgstr "ସହାୟକ 4" + +#: ../src/pulse/channelmap.c:128 +msgid "Auxiliary 5" +msgstr "ସହାୟକ 5" + +#: ../src/pulse/channelmap.c:129 +msgid "Auxiliary 6" +msgstr "ସହାୟକ 6" + +#: ../src/pulse/channelmap.c:130 +msgid "Auxiliary 7" +msgstr "ସହାୟକ 7" + +#: ../src/pulse/channelmap.c:131 +msgid "Auxiliary 8" +msgstr "ସହାୟକ 8" + +#: ../src/pulse/channelmap.c:132 +msgid "Auxiliary 9" +msgstr "ସହାୟକ 9" + +#: ../src/pulse/channelmap.c:133 +msgid "Auxiliary 10" +msgstr "ସହାୟକ 10" + +#: ../src/pulse/channelmap.c:134 +msgid "Auxiliary 11" +msgstr "ସହାୟକ 11" + +#: ../src/pulse/channelmap.c:135 +msgid "Auxiliary 12" +msgstr "ସହାୟକ 12" + +#: ../src/pulse/channelmap.c:136 +msgid "Auxiliary 13" +msgstr "ସହାୟକ 13" + +#: ../src/pulse/channelmap.c:137 +msgid "Auxiliary 14" +msgstr "ସହାୟକ 14" + +#: ../src/pulse/channelmap.c:138 +msgid "Auxiliary 15" +msgstr "ସହାୟକ 15" + +#: ../src/pulse/channelmap.c:139 +msgid "Auxiliary 16" +msgstr "ସହାୟକ 16" + +#: ../src/pulse/channelmap.c:140 +msgid "Auxiliary 17" +msgstr "ସହାୟକ 17" + +#: ../src/pulse/channelmap.c:141 +msgid "Auxiliary 18" +msgstr "ସହାୟକ 18" + +#: ../src/pulse/channelmap.c:142 +msgid "Auxiliary 19" +msgstr "ସହାୟକ 19" + +#: ../src/pulse/channelmap.c:143 +msgid "Auxiliary 20" +msgstr "ସହାୟକ 20" + +#: ../src/pulse/channelmap.c:144 +msgid "Auxiliary 21" +msgstr "ସହାୟକ 21" + +#: ../src/pulse/channelmap.c:145 +msgid "Auxiliary 22" +msgstr "ସହାୟକ 22" + +#: ../src/pulse/channelmap.c:146 +msgid "Auxiliary 23" +msgstr "ସହାୟକ 23" + +#: ../src/pulse/channelmap.c:147 +msgid "Auxiliary 24" +msgstr "ସହାୟକ 24" + +#: ../src/pulse/channelmap.c:148 +msgid "Auxiliary 25" +msgstr "ସହାୟକ 25" + +#: ../src/pulse/channelmap.c:149 +msgid "Auxiliary 26" +msgstr "ସହାୟକ 26" + +#: ../src/pulse/channelmap.c:150 +msgid "Auxiliary 27" +msgstr "ସହାୟକ 27" + +#: ../src/pulse/channelmap.c:151 +msgid "Auxiliary 28" +msgstr "ସହାୟକ 28" + +#: ../src/pulse/channelmap.c:152 +msgid "Auxiliary 29" +msgstr "ସହାୟକ 28" + +#: ../src/pulse/channelmap.c:153 +msgid "Auxiliary 30" +msgstr "ସହାୟକ 30" + +#: ../src/pulse/channelmap.c:154 +msgid "Auxiliary 31" +msgstr "ସହାୟକ 31" + +#: ../src/pulse/channelmap.c:156 +msgid "Top Center" +msgstr "ଉପର କେନ୍ଦ୍ର" + +#: ../src/pulse/channelmap.c:158 +msgid "Top Front Center" +msgstr "ଉପର ସମ୍ନା ପାଖ କେନ୍ଦ୍ର" + +#: ../src/pulse/channelmap.c:159 +msgid "Top Front Left" +msgstr "ଉପର ସାମ୍ନା ବାମ ପାଖ" + +#: ../src/pulse/channelmap.c:160 +msgid "Top Front Right" +msgstr "ଉପର ସାମ୍ନା ଡ଼ାହାଣ ପାଖ" + +#: ../src/pulse/channelmap.c:162 +msgid "Top Rear Center" +msgstr "ଉପର ପଛ ପାଖ କେନ୍ଦ୍ର" + +#: ../src/pulse/channelmap.c:163 +msgid "Top Rear Left" +msgstr "ଉପର ପଛ ବାମ ପାଖ" + +#: ../src/pulse/channelmap.c:164 +msgid "Top Rear Right" +msgstr "ଉପର ପଛ ଡ଼ାହାଣ ପାଖ" + +#: ../src/pulse/channelmap.c:484 ../src/pulse/sample.c:170 +#: ../src/pulse/volume.c:295 ../src/pulse/volume.c:321 +#: ../src/pulse/volume.c:341 ../src/pulse/volume.c:371 +msgid "(invalid)" +msgstr "(ଅବୈଧ)" + +#: ../src/pulse/channelmap.c:761 +msgid "Stereo" +msgstr "ଷ୍ଟେରିଓ" + +#: ../src/pulse/channelmap.c:766 +msgid "Surround 4.0" +msgstr "ଚତୁଃ ପାର୍ଶ୍ୱ 4.0" + +#: ../src/pulse/channelmap.c:772 +msgid "Surround 4.1" +msgstr "ଚତୁଃ ପାର୍ଶ୍ୱ 4.1" + +#: ../src/pulse/channelmap.c:778 +msgid "Surround 5.0" +msgstr "ଚତୁଃ ପାର୍ଶ୍ୱ 5.0" + +#: ../src/pulse/channelmap.c:784 +msgid "Surround 5.1" +msgstr "ଚତୁଃ ପାର୍ଶ୍ୱ 5.1" + +#: ../src/pulse/channelmap.c:791 +msgid "Surround 7.1" +msgstr "ଚତୁଃ ପାର୍ଶ୍ୱ 7.1" + +#: ../src/pulse/error.c:43 +msgid "OK" +msgstr "OK" + +#: ../src/pulse/error.c:44 +msgid "Access denied" +msgstr "ଅଭିଗମ୍ୟତା ବାରଣ ହୋଇଛି" + +#: ../src/pulse/error.c:45 +msgid "Unknown command" +msgstr "ଅଜଣା ନିର୍ଦ୍ଦେଶ" + +#: ../src/pulse/error.c:46 +msgid "Invalid argument" +msgstr "ଅବୈଧ ସ୍ୱତନ୍ତ୍ରଚର" + +#: ../src/pulse/error.c:47 +msgid "Entity exists" +msgstr "ବସ୍ତୁ ଅବସ୍ଥିତ" + +#: ../src/pulse/error.c:48 +msgid "No such entity" +msgstr "ଏପରି କୌଣସି ବସ୍ତୁ ନାହିଁ" + +#: ../src/pulse/error.c:49 +msgid "Connection refused" +msgstr "ସଂଯୋଗ ବାରଣ ହୋଇଛି" + +#: ../src/pulse/error.c:50 +msgid "Protocol error" +msgstr "ପ୍ରୋଟୋକଲ ତ୍ରୁଟି" + +#: ../src/pulse/error.c:51 +msgid "Timeout" +msgstr "ସମୟ ସମାପ୍ତ" + +#: ../src/pulse/error.c:52 +msgid "No authorization key" +msgstr "କୌଣସି ପ୍ରାଧିକରଣ କି ନାହିଁ" + +#: ../src/pulse/error.c:53 +msgid "Internal error" +msgstr "ଆଭ୍ୟନ୍ତରୀଣ ତ୍ରୁଟି" + +#: ../src/pulse/error.c:54 +msgid "Connection terminated" +msgstr "ସଂଯୋଗ ବନ୍ଦ ହୋଇଯାଇଛି" + +#: ../src/pulse/error.c:55 +msgid "Entity killed" +msgstr "ବସ୍ତୁକୁ ବନ୍ଦକରାଯାଇଛି" + +#: ../src/pulse/error.c:56 +msgid "Invalid server" +msgstr "ଅବୈଧ ସର୍ଭର" + +#: ../src/pulse/error.c:57 +msgid "Module initalization failed" +msgstr "ଏକକାଂଶ ପ୍ରାରମ୍ଭିକରଣ ବିଫଳ ହୋଇଛି" + +#: ../src/pulse/error.c:58 +msgid "Bad state" +msgstr "ଖରାପ ସ୍ଥିତି" + +#: ../src/pulse/error.c:59 +msgid "No data" +msgstr "କୌଣସି ତଥ୍ୟ ନାହିଁ" + +#: ../src/pulse/error.c:60 +msgid "Incompatible protocol version" +msgstr "ଅସଙ୍ଗତ ପ୍ରୋଟୋକଲ ସଂସ୍କରଣ" + +#: ../src/pulse/error.c:61 +msgid "Too large" +msgstr "ଅତ୍ୟଧିକ ବଡ଼" + +#: ../src/pulse/error.c:62 +msgid "Not supported" +msgstr "ସମର୍ଥିତ ନୁହଁ" + +#: ../src/pulse/error.c:63 +msgid "Unknown error code" +msgstr "ଅଜଣା ତ୍ରୁଟି ସଂକେତ" + +#: ../src/pulse/error.c:64 +msgid "No such extension" +msgstr "ଏପରି କୌଣସି ଅନୁଲଗ୍ନ ନାହିଁ" + +#: ../src/pulse/error.c:65 +msgid "Obsolete functionality" +msgstr "ଅଚଳ କାର୍ଯ୍ୟକାରିତା" + +#: ../src/pulse/error.c:66 +msgid "Missing implementation" +msgstr "ଅନୁପସ୍ଥିତ ପ୍ରୟୋଗ" + +#: ../src/pulse/error.c:67 +msgid "Client forked" +msgstr "ଗ୍ରାହକ ଶାଖାଯୁକ୍ତ ହୋଇଛି" + +#: ../src/pulse/error.c:68 +msgid "Input/Output error" +msgstr "ନିବେଶ/ଫଳାଫଳ ତ୍ରୁଟି" + +#: ../src/pulse/error.c:69 +msgid "Device or resource busy" +msgstr "ଉପକରଣ ଅଥବା ଉତ୍ସ ବ୍ୟସ୍ତ ଅଛି" + +#: ../src/pulse/sample.c:172 +#, c-format +msgid "%s %uch %uHz" +msgstr "%s %uch %uHz" + +#: ../src/pulse/sample.c:184 +#, c-format +msgid "%0.1f GiB" +msgstr "%0.1f GiB" + +#: ../src/pulse/sample.c:186 +#, c-format +msgid "%0.1f MiB" +msgstr "%0.1f MiB" + +#: ../src/pulse/sample.c:188 +#, c-format +msgid "%0.1f KiB" +msgstr "%0.1f KiB" + +#: ../src/pulse/sample.c:190 +#, c-format +msgid "%u B" +msgstr "%u B" + +#: ../src/pulse/client-conf-x11.c:55 ../src/utils/pax11publish.c:100 +msgid "XOpenDisplay() failed" +msgstr "XOpenDisplay() ବିଫଳ ହୋଇଛି" + +#: ../src/pulse/client-conf-x11.c:93 +msgid "Failed to parse cookie data" +msgstr "କୁକି ତଥ୍ୟକୁ ବିଶ୍ଳେଷଣ କରିବାରେ ବିଫଳ" + +#: ../src/pulse/client-conf.c:111 +#, c-format +msgid "Failed to open configuration file '%s': %s" +msgstr "ବିନ୍ୟାସ ଫାଇଲ '%s' କୁ ଖୋଲିବାରେ ବିଫଳ: %s" + +#: ../src/pulse/context.c:550 +msgid "No cookie loaded. Attempting to connect without." +msgstr "କୌଣସି କୁକି ଧାରଣ କରାଯାଇନାହିଁ। ତାହା ବିନା ସଂଯୋଗ କରିବାକୁ ପ୍ରଚେଷ୍ଚା କରୁଅଛି।" + +#: ../src/pulse/context.c:693 +#, c-format +msgid "fork(): %s" +msgstr "fork(): %s" + +#: ../src/pulse/context.c:748 +#, c-format +msgid "waitpid(): %s" +msgstr "waitpid(): %s" + +#: ../src/pulse/context.c:1438 +#, c-format +msgid "Received message for unknown extension '%s'" +msgstr "ଅଜଣା ଅନୁଲଗ୍ନ '%s' ପାଇଁ ସନ୍ଦେଶ ଗ୍ରହଣ କରିଅଛି" + +#: ../src/utils/pacat.c:108 +#, c-format +msgid "Failed to drain stream: %s" +msgstr "ଧାରାକୁ ବାହାର କରିବାରେ ବିଫଳ ହୋଇଛି: %s" + +#: ../src/utils/pacat.c:113 +msgid "Playback stream drained." +msgstr "ପଛଚଲା ଧାରାକୁ ବାହାର କରାଯାଇଛି।" + +#: ../src/utils/pacat.c:123 +msgid "Draining connection to server." +msgstr "ସର୍ଭର ପ୍ରତି ଡ୍ରେନିଙ୍ଗ ସଂଯୋଗ।" + +#: ../src/utils/pacat.c:136 +#, c-format +msgid "pa_stream_drain(): %s" +msgstr "pa_stream_drain(): %s" + +#: ../src/utils/pacat.c:159 +#, c-format +msgid "pa_stream_write() failed: %s" +msgstr "pa_stream_write() ବିଫଳ ହୋଇଛି: %s" + +#: ../src/utils/pacat.c:197 +#, c-format +msgid "pa_stream_begin_write() failed: %s" +msgstr "pa_stream_begin_write() ବିଫଳ ହୋଇଛି: %s" + +#: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267 +#, c-format +msgid "pa_stream_peek() failed: %s" +msgstr "pa_stream_peek() ବିଫଳ ହୋଇଛି: %s" + +#: ../src/utils/pacat.c:307 +msgid "Stream successfully created." +msgstr "ଧାରା ସଫଳତାର ସହିତ ନିର୍ମାଣ ହୋଇଛି।" + +#: ../src/utils/pacat.c:310 +#, c-format +msgid "pa_stream_get_buffer_attr() failed: %s" +msgstr "pa_stream_get_buffer_attr() ବିଫଳ ହୋଇଛି: %s" + +#: ../src/utils/pacat.c:314 +#, c-format +msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u" +msgstr "ବଫର ମେଟ୍ରିକସ: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u" + +#: ../src/utils/pacat.c:317 +#, c-format +msgid "Buffer metrics: maxlength=%u, fragsize=%u" +msgstr "ବଫର ମେଟ୍ରିକସ: maxlength=%u, fragsize=%u" + +#: ../src/utils/pacat.c:321 +#, c-format +msgid "Using sample spec '%s', channel map '%s'." +msgstr "ନମୁନା spec '%s' ବ୍ୟବହାର କରି, ଚ୍ୟାନେଲ ମ୍ୟାପ '%s'।" + +#: ../src/utils/pacat.c:325 +#, c-format +msgid "Connected to device %s (%u, %ssuspended)." +msgstr "ଉପକରଣ %s ସହିତ ସଂଯୁକ୍ତ ହୋଇଛି (%u, %ssuspended)।" + +#: ../src/utils/pacat.c:335 +#, c-format +msgid "Stream error: %s" +msgstr "ଧାରା ତ୍ରୁଟି: %s" + +#: ../src/utils/pacat.c:345 +#, c-format +msgid "Stream device suspended.%s" +msgstr "ଧାରା ଉପକରଣ ନିଲମ୍ବିତ ହୋଇଛି।%s" + +#: ../src/utils/pacat.c:347 +#, c-format +msgid "Stream device resumed.%s" +msgstr "ଧାରା ଉପକରଣ ପୁନଃ ଚଳନ ହୋଇଛି।%s" + +#: ../src/utils/pacat.c:355 +#, c-format +msgid "Stream underrun.%s" +msgstr "ଧାରା underrun.%s" + +#: ../src/utils/pacat.c:362 +#, c-format +msgid "Stream overrun.%s" +msgstr "ଧାରା overrun.%s" + +#: ../src/utils/pacat.c:369 +#, c-format +msgid "Stream started.%s" +msgstr "ଧାରା ଆରମ୍ଭ ହୋଇଛି।%s" + +#: ../src/utils/pacat.c:376 +#, c-format +msgid "Stream moved to device %s (%u, %ssuspended).%s" +msgstr "ଧାରା ଉପକରଣ %sକୁ ଗତି କରିଛି (%u, %ssuspended).%s" + +#: ../src/utils/pacat.c:376 +msgid "not " +msgstr "not " + +#: ../src/utils/pacat.c:383 +#, c-format +msgid "Stream buffer attributes changed.%s" +msgstr "ଧାରା ବଫର ଗୁଣଗୁଡ଼ିକ ପରିବର୍ତ୍ତନ ହୋଇଛି।%s" + +#: ../src/utils/pacat.c:415 +#, c-format +msgid "Connection established.%s" +msgstr "ସଂଯୋଗ ସ୍ଥାପିତ ହୋଇଛି।%s" + +#: ../src/utils/pacat.c:418 +#, c-format +msgid "pa_stream_new() failed: %s" +msgstr "pa_stream_new() ବିଫଳ ହୋଇଛି: %s" + +#: ../src/utils/pacat.c:450 +#, c-format +msgid "pa_stream_connect_playback() failed: %s" +msgstr "pa_stream_connect_playback() ବିଫଳ ହୋଇଛି: %s" + +#: ../src/utils/pacat.c:456 +#, c-format +msgid "pa_stream_connect_record() failed: %s" +msgstr "pa_stream_connect_record() ବିଫଳ ହୋଇଛି: %s" + +#: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857 +#, c-format +msgid "Connection failure: %s" +msgstr "ସଂଯୋଗ ବିଫଳ ହୋଇଛି: %s" + +#: ../src/utils/pacat.c:503 +msgid "Got EOF." +msgstr "EOF ପାଇଅଛି।" + +#: ../src/utils/pacat.c:540 +#, c-format +msgid "write() failed: %s" +msgstr "write() ବିଫଳ ହୋଇଛି: %s" + +#: ../src/utils/pacat.c:561 +msgid "Got signal, exiting." +msgstr "ସଂକେତ ପାଇଲା, ପ୍ରସ୍ଥାନ କରୁଅଛି।" + +#: ../src/utils/pacat.c:575 +#, c-format +msgid "Failed to get latency: %s" +msgstr "ବିଳମ୍ବତା ପାଇବାରେ ବିଫଳ: %s" + +#: ../src/utils/pacat.c:580 +#, c-format +msgid "Time: %0.3f sec; Latency: %0.0f usec." +msgstr "ସମୟ: %0.3f ସେକଣ୍ଡ; ବିଳମ୍ବତା: %0.0f usec." + +#: ../src/utils/pacat.c:599 +#, c-format +msgid "pa_stream_update_timing_info() failed: %s" +msgstr "pa_stream_update_timing_info() ବିଫଳ ହୋଇଛି: %s" + +#: ../src/utils/pacat.c:609 +#, c-format +msgid "" +"%s [options]\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -r, --record Create a connection for recording\n" +" -p, --playback Create a connection for playback\n" +"\n" +" -v, --verbose Enable verbose operations\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -d, --device=DEVICE The name of the sink/source to " +"connect to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" +" --stream-name=NAME How to call this stream on the " +"server\n" +" --volume=VOLUME Specify the initial (linear) volume " +"in range 0...65536\n" +" --rate=SAMPLERATE The sample rate in Hz (defaults to " +"44100)\n" +" --format=SAMPLEFORMAT The sample type, one of s16le, " +"s16be, u8, float32le,\n" +" float32be, ulaw, alaw, s32le, s32be, " +"s24le, s24be,\n" +" s24-32le, s24-32be (defaults to " +"s16ne)\n" +" --channels=CHANNELS The number of channels, 1 for mono, " +"2 for stereo\n" +" (defaults to 2)\n" +" --channel-map=CHANNELMAP Channel map to use instead of the " +"default\n" +" --fix-format Take the sample format from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-rate Take the sampling rate from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-channels Take the number of channels and the " +"channel map\n" +" from the sink the stream is being " +"connected to.\n" +" --no-remix Don't upmix or downmix channels.\n" +" --no-remap Map channels by index instead of " +"name.\n" +" --latency=BYTES Request the specified latency in " +"bytes.\n" +" --process-time=BYTES Request the specified process time " +"per request in bytes.\n" +" --property=PROPERTY=VALUE Set the specified property to the " +"specified value.\n" +" --raw Record/play raw PCM data.\n" +" --file-format=FFORMAT Record/play formatted PCM data.\n" +" --list-file-formats List available file formats.\n" +msgstr "" +"%s [ବିକଳ୍ପଗୁଡ଼ିକ]\n" +"\n" +" -h, --help ଏହି ସହାୟତା ଦର୍ଶାନ୍ତୁ\n" +" --version ସଂସ୍କରଣ ଦର୍ଶାନ୍ତୁ\n" +"\n" +" -r, --record ଲେଖିବା ପାଇଁ ସଂଯୋଗ ନିର୍ମାଣ କରନ୍ତୁ\n" +" -p, --playback ପଛକୁ ଚଲାଇବା ପାଇଁ ଗୋଟିଏ ସଂଯୋଗ ନିର୍ମାଣ " +"କରନ୍ତୁ\n" +"\n" +" -v, --verbose verbose ପ୍ରକ୍ରିୟାଗୁଡ଼ିକୁ ସକ୍ରିୟ କରନ୍ତୁ\n" +"\n" +" -s, --server=SERVER ସଂଯୋଗ କରିବା ପାଇଁ ସର୍ଭରର ନାମ\n" +" -d, --device=DEVICE ସଂଯୋଗ କରିବା ପାଇଁ ସିଙ୍କ/ଉତ୍ସର ନାମ\n" +" -n, --client-name=NAME ସର୍ଭରରେ ଏହି ଗ୍ରାହକଙ୍କୁ କିପରି ଡାକିବେ\n" +" --stream-name=NAME ସର୍ଭରରେ ଏହି ଧାରାକୁ କିପରି ଡାକିବେ\n" +" --volume=VOLUME ପ୍ରାରମ୍ଭିକ (ସିଧା) ଭଲ୍ୟୁମକୁ ସୀମା 0...65536 " +"ମଧ୍ଯରେଉଲ୍ଲେଖ କରନ୍ତୁ\n" +" --rate=SAMPLERATE The sample rate in Hz (defaults to " +"44100)\n" +" --format=SAMPLEFORMAT The sample type, one of s16le, " +"s16be, u8, float32le,\n" +" float32be, ulaw, alaw, s32le, s32be " +"(defaults to s16ne)\n" +" --channels=CHANNELS ଚ୍ୟାନେଲ ସଂଖ୍ୟା, ମୋନୋ ପାଇଁ 1, ଷ୍ଟେରିଓ ପାଇଁ " +"2\n" +" (2 ପାଇଁ ପୂର୍ବନିର୍ଦ୍ଧାରିତ)\n" +" --channel-map=CHANNELMAP ପୂର୍ବନିର୍ଦ୍ଧାରିତ ପରିବର୍ତ୍ତେ ବ୍ୟବହାର କରିବାକୁ ଥିବା " +"ଚ୍ୟାନେଲ ମ୍ୟାପ\n" +" --fix-format ନମୁନା ବିଶେଷ ଲକ୍ଷଣ ସଜ୍ଜିକରଣ ଶୈଳୀକୁ ସିଙ୍କରୁ " +"ଗ୍ରହଣ କରନ୍ତୁ\n" +" ଯାହା ସହିତ ଧାରାଟି ସଂଯୁକ୍ତ।\n" +" --fix-rate ନମୁନା ବିଶେଷ ଲକ୍ଷଣ ସଜ୍ଜିକରଣ ଶୈଳୀକୁ ସିଙ୍କରୁ " +"ଗ୍ରହଣ କରନ୍ତୁ\n" +" ଯାହା ସହିତ ଧାରାଟି ସଂଯୁକ୍ତ।\n" +" --fix-channels ଚ୍ୟାନେଲ ସଂଖ୍ୟା ଏବଂ ଚ୍ୟାନେଲ ମ୍ୟାପକୁ " +"ସିଙ୍କରୁଗ୍ରହଣ କରନ୍ତୁ\n" +" ଯାହା ସହିତ ଧାରାଟି ସଂଯୁକ୍ତ।\n" +" --no-remix ଚ୍ୟାନେଲଗୁଡ଼ିକୁ upmix ଅଥବା downmix କରନ୍ତୁ " +"ନାହିଁ।\n" +" --no-remap ନାମ ପରିବର୍ତ୍ତେ ଅନୁକ୍ରମଣିକା ଅନୁସାରେ " +"ଚ୍ୟାନେଲଗୁଡ଼ିକୁ ମ୍ୟାପ କରନ୍ତୁ।\n" +" --latency=BYTES ନିର୍ଦ୍ଦିଷ୍ଟିତ ବିଳମ୍ବତାକୁ ବାଇଟରେ ଆବେଦନ କରନ୍ତୁ।\n" +" --process-time=BYTES ଅନୁରୋଧ ପ୍ରତି ନିର୍ଦ୍ଦିଷ୍ଟିତ ବିଳମ୍ବତାକୁ ବାଇଟରେ " +"ଆବେଦନ କରନ୍ତୁ।\n" +" --property=PROPERTY=VALUE ନିର୍ଦ୍ଦିଷ୍ଟିତ ମୂଲ୍ୟ ପାଇଁ ଉଲ୍ଲିଖିତ ଗୁଣଧର୍ମକୁ ସେଟ " +"କରନ୍ତୁ।\n" +" --raw ଅପରିପକ୍ୱ PCM ତଥ୍ୟକୁ ଲିପିବଦ୍ଧ କରନ୍ତୁ/ଚଲାନ୍ତୁ।\n" +" --file-format=FFORMAT ସଜ୍ଜିକୃତ PCM ତଥ୍ୟକୁ ଲିପିବଦ୍ଧ କରନ୍ତୁ/ଚଲାନ୍ତୁ।\n" +" --list-file-formats ତାଲିକା ଉପଲବ୍ଧ ଫାଇଲ ସଜ୍ଜିକରଣ ଶୈଳୀ।\n" + +#: ../src/utils/pacat.c:731 +#, c-format +msgid "" +"pacat %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pacat %s\n" +"libpulse %s ସହିତ ସଂକଳିତ\n" +"libpulse %s ସହିତ ସଂଯୁକ୍ତ\n" + +#: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953 +#, c-format +msgid "Invalid client name '%s'" +msgstr "ଅବୈଧ କ୍ଲାଏଣ୍ଟ ନାମ '%s'" + +#: ../src/utils/pacat.c:779 +#, c-format +msgid "Invalid stream name '%s'" +msgstr "ଅବୈଧ ଧାରା ନାମ '%s'" + +#: ../src/utils/pacat.c:816 +#, c-format +msgid "Invalid channel map '%s'" +msgstr "ଅବୈଧ ଚ୍ୟାନେଲ ମ୍ୟାପ '%s'" + +#: ../src/utils/pacat.c:845 +#, c-format +msgid "Invalid latency specification '%s'" +msgstr "ଅବୈଧ ବିଳମ୍ବତା ବିଶେଷ ଲକ୍ଷଣ '%s'" + +#: ../src/utils/pacat.c:852 +#, c-format +msgid "Invalid process time specification '%s'" +msgstr "ଅବୈଧ ପଦ୍ଧତି ସମୟ ବିଶେଷ ଲକ୍ଷଣ '%s'" + +#: ../src/utils/pacat.c:864 +#, c-format +msgid "Invalid property '%s'" +msgstr "ଅବୈଧ ଗୁଣଧର୍ମ '%s'" + +#: ../src/utils/pacat.c:881 +#, c-format +msgid "Unknown file format %s." +msgstr "ଅଜଣା ଫାଇଲ ସଜ୍ଜିକରଣ ଶୈଳୀ %s।" + +#: ../src/utils/pacat.c:900 +msgid "Invalid sample specification" +msgstr "ଅବୈଧ ନମୁନା ବିଶେଷ ଲକ୍ଷଣ" + +#: ../src/utils/pacat.c:910 +#, c-format +msgid "open(): %s" +msgstr "open(): %s" + +#: ../src/utils/pacat.c:915 +#, c-format +msgid "dup2(): %s" +msgstr "dup2(): %s" + +#: ../src/utils/pacat.c:922 +msgid "Too many arguments." +msgstr "ଅତ୍ୟଧିକ ସ୍ୱତନ୍ତ୍ରଚର।" + +#: ../src/utils/pacat.c:933 +msgid "Failed to generate sample specification for file." +msgstr "ଫାଇଲ ପାଇଁ ନମୁନା ସୂଚନା ସୃଷ୍ଟି କରିବାରେ ବିଫଳ।" + +#: ../src/utils/pacat.c:953 +msgid "Failed to open audio file." +msgstr "ଧ୍ୱନି ଫାଇଲ ଖୋଲିବାରେ ବିଫଳ।" + +#: ../src/utils/pacat.c:959 +msgid "" +"Warning: specified sample specification will be overwritten with " +"specification from file." +msgstr "ଚେତାବନୀ: ଉଲ୍ଲିଖିତ ନମୁନା ବିଶେଷ ଲକ୍ଷଣକୁ ଫାଇଲରୁ ବିଶେଷ ଲକ୍ଷଣ ସହିତ ନବଲିଖନ କରାଯିବ।" + +#: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997 +msgid "Failed to determine sample specification from file." +msgstr "ଫାଇଲରୁ ନମୁନା ସୂଚନା ନିର୍ଦ୍ଧାରଣ କରିବାରେ ବିଫଳ।" + +#: ../src/utils/pacat.c:971 +msgid "Warning: Failed to determine channel map from file." +msgstr "ଚେତାବନୀ: ଫାଇଲରୁ ଚ୍ୟାନେଲ ମ୍ୟାପ ନିର୍ଦ୍ଧାରଣ କରିବାରେ ବିଫଳ।" + +#: ../src/utils/pacat.c:982 +msgid "Channel map doesn't match sample specification" +msgstr "ନମୁନା ବିଶେଷ ଲକ୍ଷଣ ସହିତ ଚ୍ୟାନେଲ ମ୍ୟାପ ମେଳ ଖାଉନାହିଁ" + +#: ../src/utils/pacat.c:993 +msgid "Warning: failed to write channel map to file." +msgstr "ଚେତାବନୀ: ଚ୍ୟାନେଲ ମ୍ୟାପକୁ ଫାଇଲରେ ଲେଖିବାରେ ବିଫଳ।" + +#: ../src/utils/pacat.c:1008 +#, c-format +msgid "" +"Opening a %s stream with sample specification '%s' and channel map '%s'." +msgstr "ନମୁନା ବିଶେଷ ଲକ୍ଷଣ '%s' ଏବଂ ଚ୍ୟାନେଲ ମ୍ୟାପ '%s' ସହିତ ଗୋଟିଏ %s ଧାରାକୁ ଖୋଲୁଅଛି।" + +#: ../src/utils/pacat.c:1009 +msgid "recording" +msgstr "ଅନୁଲିପି କରୁଅଛି" + +#: ../src/utils/pacat.c:1009 +msgid "playback" +msgstr "ପଛଚଲା" + +#: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267 +msgid "pa_mainloop_new() failed." +msgstr "pa_mainloop_new() ବିଫଳ ହୋଇଛି।" + +#: ../src/utils/pacat.c:1054 +msgid "io_new() failed." +msgstr "io_new() ବିଫଳ ହୋଇଛି।" + +#: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279 +msgid "pa_context_new() failed." +msgstr "pa_context_new() ବିଫଳ ହୋଇଛି।" + +#: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285 +#, c-format +msgid "pa_context_connect() failed: %s" +msgstr "pa_context_connect() ବିଫଳ ହୋଇଛି: %s" + +#: ../src/utils/pacat.c:1075 +msgid "pa_context_rttime_new() failed." +msgstr "pa_context_rttime_new() ବିଫଳ ହୋଇଛି।" + +#: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290 +msgid "pa_mainloop_run() failed." +msgstr "pa_mainloop_run() ବିଫଳ ହୋଇଛି।" + +#: ../src/utils/pasuspender.c:81 +#, c-format +msgid "fork(): %s\n" +msgstr "fork(): %s\n" + +#: ../src/utils/pasuspender.c:92 +#, c-format +msgid "execvp(): %s\n" +msgstr "execvp(): %s\n" + +#: ../src/utils/pasuspender.c:109 +#, c-format +msgid "Failure to suspend: %s\n" +msgstr "ନିଲମ୍ବନ କରିବାରେ ବିଫଳ: %s\n" + +#: ../src/utils/pasuspender.c:124 +#, c-format +msgid "Failure to resume: %s\n" +msgstr "ପୁନଃ ଚଳନ କରିବାରେ ବିଫଳ: %s\n" + +#: ../src/utils/pasuspender.c:147 +#, c-format +msgid "WARNING: Sound server is not local, not suspending.\n" +msgstr "WARNING: ଧ୍ୱନି ସର୍ଭରଟି ସ୍ଥାନୀୟ ନୁହଁ, ନିଲମ୍ବିତ କରୁନାହିଁ।\n" + +#: ../src/utils/pasuspender.c:159 +#, c-format +msgid "Connection failure: %s\n" +msgstr "ସଂଯୋଗ ବିଫଳ ହୋଇଛି: %s\n" + +#: ../src/utils/pasuspender.c:176 +#, c-format +msgid "Got SIGINT, exiting.\n" +msgstr "SIGINT ପାଇଛି, ଉତ୍ସାହିତ କରୁଅଛି।\n" + +#: ../src/utils/pasuspender.c:194 +#, c-format +msgid "WARNING: Child process terminated by signal %u\n" +msgstr "WARNING: ନିମ୍ନ ସ୍ତରର ପ୍ରକ୍ରିୟାଟି ସଂକେତ %u ଦ୍ୱାରା ସମାପ୍ତ\n" + +#: ../src/utils/pasuspender.c:212 +#, c-format +msgid "" +"%s [options] ... \n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +"\n" +msgstr "" +"%s [options] ... \n" +"\n" +" -h, --help ଏହି ସହାୟତାକୁ ଦର୍ଶାନ୍ତୁ\n" +" --version ସଂସ୍କରଣ ଦର୍ଶାନ୍ତୁ\n" +" -s, --server=SERVER ସଂଯୋଗ କରିବା ପାଇଁ ସର୍ଭରର ନାମ\n" +"\n" + +#: ../src/utils/pasuspender.c:248 +#, c-format +msgid "" +"pasuspender %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pasuspender %s\n" +"libpulse %s ସହିତ ସଂକଳିତ\n" +"libpulse %s ସହିତ ସଂଯୁକ୍ତ\n" + +#: ../src/utils/pasuspender.c:277 +#, c-format +msgid "pa_mainloop_new() failed.\n" +msgstr "pa_mainloop_new() ବିଫଳ ହୋଇଛି।\n" + +#: ../src/utils/pasuspender.c:290 +#, c-format +msgid "pa_context_new() failed.\n" +msgstr "pa_context_new() ବିଫଳ ହୋଇଛି।\n" + +#: ../src/utils/pasuspender.c:298 +#, c-format +msgid "pa_mainloop_run() failed.\n" +msgstr "pa_mainloop_run() ବିଫଳ ହୋଇଛି।\n" + +#: ../src/utils/pactl.c:135 +#, c-format +msgid "Failed to get statistics: %s" +msgstr "ପରିସଂଖ୍ୟାନ ପାଇବାରେ ବିଫଳ: %s" + +#: ../src/utils/pactl.c:141 +#, c-format +msgid "Currently in use: %u blocks containing %s bytes total.\n" +msgstr "ବର୍ତ୍ତମାନ ବ୍ୟବହାରରେ ଅଛି: %u ବ୍ଲକ ସମୁଦାୟ %s ବାଇଟ ଧାରଣ କରିଥାଏ।\n" + +#: ../src/utils/pactl.c:144 +#, c-format +msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n" +msgstr "ସମଗ୍ର ଜୀବନରେ ବଣ୍ଟିତ ହୋଇଥାଏ: %u ବ୍ଲକ ସମୁଦାୟ %s ବାଇଟ ଧାରଣ କରିଥାଏ।\n" + +#: ../src/utils/pactl.c:147 +#, c-format +msgid "Sample cache size: %s\n" +msgstr "ନମୁନା କ୍ୟାଶେ ଆକାର: %s\n" + +#: ../src/utils/pactl.c:156 +#, c-format +msgid "Failed to get server information: %s" +msgstr "ସର୍ଭର ସୂଚନା ପାଇବାରେ ବିଫଳ: %s" + +#: ../src/utils/pactl.c:164 +#, c-format +msgid "" +"User name: %s\n" +"Host Name: %s\n" +"Server Name: %s\n" +"Server Version: %s\n" +"Default Sample Specification: %s\n" +"Default Channel Map: %s\n" +"Default Sink: %s\n" +"Default Source: %s\n" +"Cookie: %08x\n" +msgstr "" +"ଚାଳକ ନାମ: %s\n" +"ଆଧାର ନାମ: %s\n" +"ସର୍ଭର ନାମ: %s\n" +"ସର୍ଭର ସଂସ୍କରଣ: %s\n" +"ପୂର୍ବନିର୍ଦ୍ଧାରିତ ନମୁନା ବିଶିଷ୍ଟ: %s\n" +"ପୂର୍ବନିର୍ଦ୍ଧାରିତ ଚ୍ୟାନେଲ ମ୍ୟାପ: %s\n" +"ପୂର୍ବନିର୍ଦ୍ଧାରିତ ସିଙ୍କ: %s\n" +"ପୂର୍ବନିର୍ଦ୍ଧାରିତ ଉତ୍ସ: %s\n" +"କୁକି: %08x\n" + +#: ../src/utils/pactl.c:205 +#, c-format +msgid "Failed to get sink information: %s" +msgstr "ସିଙ୍କ ସୂଚନା ପାଇବାରେ ବିଫଳ: %s" + +#: ../src/utils/pactl.c:221 +#, c-format +msgid "" +"Sink #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor Source: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"ସିଙ୍କ #%u\n" +"\tସ୍ଥିତି: %s\n" +"\tନାମ: %s\n" +"\tବର୍ଣ୍ଣନା: %s\n" +"\tଡ୍ରାଇଭର: %s\n" +"\tନମୁନା ବିଶେଷ ଲକ୍ଷଣ: %s\n" +"\tଚ୍ୟାନେଲ ମ୍ୟାପ: %s\n" +"\tନିଜ ଏକକାଂଶ: %u\n" +"\tମୁକ: %s\n" +"\tଭଲ୍ୟୁମ: %s%s%s\n" +"\t ସମତୁଲ %0.2f\n" +"\tଆଧାର ଭଲ୍ୟୁମ: %s%s%s\n" +"\tପ୍ରଦର୍ଶିକା ଉତ୍ସ: %s\n" +"\tବିଲମ୍ବତା: %0.0f usec, ବିନ୍ୟାସିତ %0.0f usec\n" +"\tଚିହ୍ନକ: %s%s%s%s%s%s\n" +"\tଗୁଣଧର୍ମ:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360 +#, c-format +msgid "\tPorts:\n" +msgstr "\tସଂଯୋଗିକୀଗୁଡ଼ିକ:\n" + +#: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366 +#, c-format +msgid "\tActive Port: %s\n" +msgstr "\tସକ୍ରିୟ ସଂଯୋଗିକୀ: %s\n" + +#: ../src/utils/pactl.c:297 +#, c-format +msgid "Failed to get source information: %s" +msgstr "ଉତ୍ସ ସୂଚନା ପାଇବାରେ ବିଫଳ: %s" + +#: ../src/utils/pactl.c:313 +#, c-format +msgid "" +"Source #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor of Sink: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"ଉତ୍ସ #%u\n" +"\tସ୍ଥିତି: %s\n" +"\tନାମ: %s\n" +"\tବର୍ଣ୍ଣନା: %s\n" +"\tଡ୍ରାଇଭର: %s\n" +"\tନମୁନା ବିଶେଷ ଲକ୍ଷଣ: %s\n" +"\tଚ୍ୟାନେଲ ମ୍ୟାପ: %s\n" +"\tମାଲିକ ଏକକାଂଶ: %u\n" +"\tମୁକ: %s\n" +"\tଭଲ୍ୟୁମ: %s%s%s\n" +"\t ସମତୁଲ %0.2f\n" +"\tଆଧାର ଭଲ୍ୟୁମ: %s%s%s\n" +"\tସିଙ୍କର ପ୍ରଦର୍ଶିକା: %s\n" +"\tବିଲମ୍ବତା: %0.0f usec, ବିନ୍ୟାସିତ %0.0f usec\n" +"\tଚିହ୍ନକ: %s%s%s%s%s%s\n" +"\tଗୁଣଧର୍ମ:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:345 ../src/utils/pactl.c:401 ../src/utils/pactl.c:436 +#: ../src/utils/pactl.c:473 ../src/utils/pactl.c:532 ../src/utils/pactl.c:533 +#: ../src/utils/pactl.c:543 ../src/utils/pactl.c:587 ../src/utils/pactl.c:588 +#: ../src/utils/pactl.c:594 ../src/utils/pactl.c:637 ../src/utils/pactl.c:638 +#: ../src/utils/pactl.c:645 +msgid "n/a" +msgstr "n/a" + +#: ../src/utils/pactl.c:375 +#, c-format +msgid "Failed to get module information: %s" +msgstr "ଏକକାଂଶ ସୂଚନା ପାଇବାରେ ବିଫଳ: %s" + +#: ../src/utils/pactl.c:393 +#, c-format +msgid "" +"Module #%u\n" +"\tName: %s\n" +"\tArgument: %s\n" +"\tUsage counter: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"ଏକକାଂଶ #%u\n" +"\tନାମ: %s\n" +"\tସ୍ୱତନ୍ତ୍ରଚର: %s\n" +"\tଉପଯୋଗିତା ଗଣକ: %s\n" +"\tଗୁଣଧର୍ମ:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:412 +#, c-format +msgid "Failed to get client information: %s" +msgstr "ଗ୍ରାହକ ସୂଚନା ପାଇବାରେ ବିଫଳ: %s" + +#: ../src/utils/pactl.c:430 +#, c-format +msgid "" +"Client #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"ଗ୍ରାହକ #%u\n" +"\tଡ୍ରାଇଭର: %s\n" +"\tମାଲିକର ଏକକାଂଶ: %s\n" +"\tଗୁଣଧର୍ମ:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:447 +#, c-format +msgid "Failed to get card information: %s" +msgstr "କାର୍ଡ ସୂଚନା ପାଇବାରେ ବିଫଳ: %s" + +#: ../src/utils/pactl.c:465 +#, c-format +msgid "" +"Card #%u\n" +"\tName: %s\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"କାର୍ଡ #%u\n" +"\tନାମ: %s\n" +"\tଡ୍ରାଇଭର: %s\n" +"\tନିଜ ଏକକାଂଶ: %s\n" +"\tଗୁଣଧର୍ମ:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:479 +#, c-format +msgid "\tProfiles:\n" +msgstr "\tରୂପରେଖଗୁଡ଼ିକ:\n" + +#: ../src/utils/pactl.c:485 +#, c-format +msgid "\tActive Profile: %s\n" +msgstr "\tସକ୍ରିୟ ରୂପରେଖା: %s\n" + +#: ../src/utils/pactl.c:496 +#, c-format +msgid "Failed to get sink input information: %s" +msgstr "ସିଙ୍କ ନିବେଶ ସୂଚନା ପାଇବାରେ ବିଫଳ: %s" + +#: ../src/utils/pactl.c:515 +#, c-format +msgid "" +"Sink Input #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSink: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tMute: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSink Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"ସିଙ୍କ ନିବେଶ #%u\n" +"\tଡ୍ରାଇଭର: %s\n" +"\tମାଲିକ ଏକକାଂଶ: %s\n" +"\tଗ୍ରାହକ: %s\n" +"\tସିଙ୍କ: %u\n" +"\tନମୁନା ବିଶେଷ ଲକ୍ଷଣ: %s\n" +"\tଚ୍ୟାନେଲ ମ୍ୟାପ: %s\n" +"\tମୁକ: %s\n" +"\tଭଲ୍ୟୁମ: %s\n" +"\t %s\n" +"\t ସମତୁଲ %0.2f\n" +"\tବଫର ବିଳମ୍ବତା: %0.0f usec\n" +"\tସିଙ୍କ ବିଳମ୍ବତା: %0.0f usec\n" +"\tପୁନଃ ମିଶ୍ରଣ ପଦ୍ଧତି: %s\n" +"\tଗୁଣଧର୍ମ:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:554 +#, c-format +msgid "Failed to get source output information: %s" +msgstr "ଉତ୍ସ ଫଳାଫଳ ସୂଚନା ପାଇବାରେ ବିଫଳ: %s" + +#: ../src/utils/pactl.c:574 +#, c-format +msgid "" +"Source Output #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSource: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSource Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"ଉତ୍ସ ନିର୍ଗମ #%u\n" +"\tଡ୍ରାଇଭର: %s\n" +"\tମାଲିକ ଏକକାଂଶ: %s\n" +"\tଗ୍ରାହକ: %s\n" +"\tଉତ୍ସ: %u\n" +"\tନମୁନା ବିଶେଷ ଲକ୍ଷଣ: %s\n" +"\tଚ୍ୟାନେଲ ମ୍ୟାପ: %s\n" +"\tବଫର ବିଳମ୍ବତା: %0.0f usec\n" +"\tଉତ୍ସ ବିଳମ୍ବତା: %0.0f usec\n" +"\tପୁନଃ ମିଶ୍ରଣ ପଦ୍ଧତି: %s\n" +"\tଗୁଣଧର୍ମ:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:605 +#, c-format +msgid "Failed to get sample information: %s" +msgstr "ନମୁନା ସୂଚନା ପାଇବାରେ ବିଫଳ: %s" + +#: ../src/utils/pactl.c:623 +#, c-format +msgid "" +"Sample #%u\n" +"\tName: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tDuration: %0.1fs\n" +"\tSize: %s\n" +"\tLazy: %s\n" +"\tFilename: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"ନମୁନା #%u\n" +"\tନାମ: %s\n" +"\tନମୁନା ବିଶେଷ ଲକ୍ଷଣ: %s\n" +"\tଚ୍ୟାନେଲ ମ୍ୟାପ: %s\n" +"\tଭଲ୍ୟୁମ: %s\n" +"\t %s\n" +"\t ସମତୁଲ %0.2f\n" +"\tଅବଧି: %0.1fs\n" +"\tଆକାର: %s\n" +"\tଶିଥିଳ: %s\n" +"\tଫାଇଲ ନାମ: %s\n" +"\tଗୁଣଧର୍ମ:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663 +#, c-format +msgid "Failure: %s" +msgstr "ବିଫଳତା: %s" + +#: ../src/utils/pactl.c:687 +#, c-format +msgid "Failed to upload sample: %s" +msgstr "ନମୁନାକୁ ଧାରଣ କରିବାରେ ବିଫଳ: %s" + +#: ../src/utils/pactl.c:704 +msgid "Premature end of file" +msgstr "ଫାଇଲର ସମୟ ପୂର୍ବ ସମାପ୍ତି" + +#: ../src/utils/pactl.c:863 +msgid "Got SIGINT, exiting." +msgstr "SIGINT ପାଇଛି, ଉତ୍ସାହିତ କରୁଅଛି।" + +#: ../src/utils/pactl.c:869 +#, c-format +msgid "" +"%s [options] stat\n" +"%s [options] list\n" +"%s [options] exit\n" +"%s [options] upload-sample FILENAME [NAME]\n" +"%s [options] play-sample NAME [SINK]\n" +"%s [options] remove-sample NAME\n" +"%s [options] move-sink-input SINKINPUT SINK\n" +"%s [options] move-source-output SOURCEOUTPUT SOURCE\n" +"%s [options] load-module NAME [ARGS ...]\n" +"%s [options] unload-module MODULE\n" +"%s [options] suspend-sink SINK 1|0\n" +"%s [options] suspend-source SOURCE 1|0\n" +"%s [options] set-card-profile CARD PROFILE\n" +"%s [options] set-sink-port SINK PORT\n" +"%s [options] set-source-port SOURCE PORT\n" +"%s [options] set-sink-volume SINK VOLUME\n" +"%s [options] set-source-volume SOURCE VOLUME\n" +"%s [options] set-sink-input-volume SINKINPUT VOLUME\n" +"%s [options] set-sink-mute SINK 1|0\n" +"%s [options] set-source-mute SOURCE 1|0\n" +"%s [options] set-sink-input-mute SINKINPUT 1|0\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" +msgstr "" +"%s [ବିକଳ୍ପଗୁଡ଼ିକ] stat\n" +"%s [ବିକଳ୍ପଗୁଡ଼ିକ] list\n" +"%s [ବିକଳ୍ପଗୁଡ଼ିକ] exit\n" +"%s [ବିକଳ୍ପଗୁଡ଼ିକ] upload-sample FILENAME [NAME]\n" +"%s [ବିକଳ୍ପଗୁଡ଼ିକ] play-sample NAME [SINK]\n" +"%s [ବିକଳ୍ପଗୁଡ଼ିକ] remove-sample NAME\n" +"%s [ବିକଳ୍ପଗୁଡ଼ିକ] move-sink-input ID SINK\n" +"%s [ବିକଳ୍ପଗୁଡ଼ିକ] move-source-output ID SOURCE\n" +"%s [ବିକଳ୍ପଗୁଡ଼ିକ] load-module NAME [ARGS ...]\n" +"%s [ବିକଳ୍ପଗୁଡ଼ିକ] unload-module ID\n" +"%s [ବିକଳ୍ପଗୁଡ଼ିକ] suspend-sink [SINK] 1|0\n" +"%s [ବିକଳ୍ପଗୁଡ଼ିକ] suspend-source [SOURCE] 1|0\n" +"%s [ବିକଳ୍ପଗୁଡ଼ିକ] set-card-profile [CARD] [PROFILE] \n" +"%s [ବିକଳ୍ପଗୁଡ଼ିକ] set-sink-port [SINK] [PORT] \n" +"%s [ବିକଳ୍ପଗୁଡ଼ିକ] set-source-port [SOURCE] [PORT] \n" +"%s [ବିକଳ୍ପଗୁଡ଼ିକ] set-sink-volume SINK VOLUME\n" +"%s [ବିକଳ୍ପଗୁଡ଼ିକ] set-source-volume SOURCE VOLUME\n" +"%s [ବିକଳ୍ପଗୁଡ଼ିକ] set-sink-input-volume SINKINPUT VOLUME\n" +"%s [ବିକଳ୍ପଗୁଡ଼ିକ] set-sink-mute SINK 1|0\n" +"%s [ବିକଳ୍ପଗୁଡ଼ିକ] set-source-mute SOURCE 1|0\n" +"%s [ବିକଳ୍ପଗୁଡ଼ିକ] set-sink-input-mute SINKINPUT 1|0\n" +"\n" +" -h, --help ଏହି ସହାୟତାକୁ ଦର୍ଶାନ୍ତୁ\n" +" --version ସଂସ୍କରଣ ଦର୍ଶାନ୍ତୁ\n" +"\n" +" -s, --server=SERVER ସଂଯୋଗ କରିବା ପାଇଁ ସର୍ଭରର ନାମ\n" +" -n, --client-name=NAME ସର୍ଭରରେ ଏହି କ୍ଲାଏଣ୍ଟକୁ କିପରି ଡାକିବେ\n" + +#: ../src/utils/pactl.c:933 +#, c-format +msgid "" +"pactl %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pactl %s\n" +"libpulse %s ସହିତ ସଂକଳିତ\n" +"libpulse %s ସହିତ ସଂଯୁକ୍ତ\n" + +#: ../src/utils/pactl.c:979 +msgid "Please specify a sample file to load" +msgstr "ଧାରଣ କରିବା ପାଇଁ ଗୋଟିଏ ନୁମନା ଫାଇଲ ଉଲ୍ଲେଖ କରନ୍ତୁ" + +#: ../src/utils/pactl.c:992 +msgid "Failed to open sound file." +msgstr "ଧ୍ୱନି ଫାଇଲ ଖୋଲିବାରେ ବିଫଳ।" + +#: ../src/utils/pactl.c:1004 +msgid "Warning: Failed to determine sample specification from file." +msgstr "ଚେତାବନୀ: ଫାଇଲରୁ ନମୁନା ବିଶେଷ ଲକ୍ଷଣକୁ ନିର୍ଦ୍ଧାରଣ କରିବାରେ ବିଫଳ।" + +#: ../src/utils/pactl.c:1014 +msgid "You have to specify a sample name to play" +msgstr "ଚଲାଇବା ପାଇଁ ଆପଣଙ୍କୁ ଗୋଟିଏ ନମୁନା ନାମ ଉଲ୍ଲେଖ କରିବାକୁ ହେବ" + +#: ../src/utils/pactl.c:1026 +msgid "You have to specify a sample name to remove" +msgstr "କାଢ଼ିବା ପାଇଁ ଆପଣଙ୍କୁ ଗୋଟିଏ ନମୁନା ନାମ ଉଲ୍ଲେଖ କରିବାକୁ ହେବ" + +#: ../src/utils/pactl.c:1035 +msgid "You have to specify a sink input index and a sink" +msgstr "ଆପଣଙ୍କୁ ଗୋଟିଏ ସିଙ୍କ ନିବେଶ ଅନୁକ୍ରମଣିକା ଏବଂ ଗୋଟିଏ ସିଙ୍କ ଉଲ୍ଲେଖ କରିବାକୁ ହେବ" + +#: ../src/utils/pactl.c:1045 +msgid "You have to specify a source output index and a source" +msgstr "ଆପଣଙ୍କୁ ଗୋଟିଏ ଉତ୍ସ ନିର୍ଗମ ଅନୁକ୍ରମଣିକା ଏବଂ ଗୋଟିଏ ଉତ୍ସ ଉଲ୍ଲେଖ କରିବାକୁ ହେବ" + +#: ../src/utils/pactl.c:1060 +msgid "You have to specify a module name and arguments." +msgstr "ଆପଣଙ୍କୁ ଗୋଟିଏ ଏକକାଂଶ ନାମ ଏବଂ ସ୍ୱତନ୍ତ୍ରଚରଗୁଡ଼ିକୁ ଉଲ୍ଲେଖ କରିବା ଉଚିତ।" + +#: ../src/utils/pactl.c:1080 +msgid "You have to specify a module index" +msgstr "ଆପଣଙ୍କୁ ଗୋଟିଏ ଏକକାଂଶ ଅନୁକ୍ରମଣିକାକୁ ଉଲ୍ଲେଖ କରିବା ଉଚିତ ନୁହଁ" + +#: ../src/utils/pactl.c:1090 +msgid "" +"You may not specify more than one sink. You have to specify a boolean value." +msgstr "" +"ଆପଣଙ୍କୁ ଗୋଟିଏରୁ ଅଧିକ ସିଙ୍କ ଉଲ୍ଲେଖ କରିବାକୁ ପଡ଼ିନପାରେ। ଆପଣଙ୍କୁ ଗୋଟିଏ ବୁଲିଆନ ମୂଲ୍ୟ ଉଲ୍ଲେଖ କରିବାକୁ ହେବ।" + +#: ../src/utils/pactl.c:1103 +msgid "" +"You may not specify more than one source. You have to specify a boolean " +"value." +msgstr "" +"ଆପଣଙ୍କୁ ଗୋଟିଏରୁ ଅଧିକ ଉତ୍ସ ଉଲ୍ଲେଖ କରିବାକୁ ପଡ଼ିନପାରେ। ଆପଣଙ୍କୁ ଗୋଟିଏ ବୁଲିଆନ ମୂଲ୍ୟ ଉଲ୍ଲେଖ କରିବାକୁ ହେବ।" + +#: ../src/utils/pactl.c:1115 +msgid "You have to specify a card name/index and a profile name" +msgstr "ଆପଣଙ୍କୁ ଗୋଟିଏ କାର୍ଡ ନାମ/ଅନୁକ୍ରମଣିକା ଏବଂ ରୂପରେଖା ନାମ ଉଲ୍ଲେଖ କରିବାକୁ ହେବ" + +#: ../src/utils/pactl.c:1126 +msgid "You have to specify a sink name/index and a port name" +msgstr "ଆପଣଙ୍କୁ ଗୋଟିଏ ସିଙ୍କ ନାମ/ଅନୁକ୍ରମଣିକା ଏବଂ ସଂଯୋଗିକୀ ନାମ ଉଲ୍ଲେଖ କରିବାକୁ ହେବ" + +#: ../src/utils/pactl.c:1137 +msgid "You have to specify a source name/index and a port name" +msgstr "ଆପଣଙ୍କୁ ଗୋଟିଏ ଉତ୍ସ ନାମ/ଅନୁକ୍ରମଣିକା ଏବଂ ସଂଯୋଗିକୀ ନାମ ଉଲ୍ଲେଖ କରିବାକୁ ହେବ" + +#: ../src/utils/pactl.c:1149 +msgid "You have to specify a sink name/index and a volume" +msgstr "ଆପଣଙ୍କୁ ଗୋଟିଏ ସିଙ୍କ ନାମ/ଅନୁକ୍ରମଣିକା ଏବଂ ସଂଯୋଗିକୀ ନାମ ଉଲ୍ଲେଖ କରିବାକୁ ହେବ" + +#: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171 +#: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209 +#: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248 +msgid "Invalid volume specification" +msgstr "ଅବୈଧ ନମୁନା ବିଶେଷ ଲକ୍ଷଣ" + +#: ../src/utils/pactl.c:1166 +msgid "You have to specify a source name/index and a volume" +msgstr "ଆପଣଙ୍କୁ ଗୋଟିଏ ଉତ୍ସ ନାମ/ଅନୁକ୍ରମଣିକା ଏବଂ ସଂଯୋଗିକୀ ନାମ ଉଲ୍ଲେଖ କରିବାକୁ ହେବ" + +#: ../src/utils/pactl.c:1183 +msgid "You have to specify a sink input index and a volume" +msgstr "ଆପଣଙ୍କୁ ଗୋଟିଏ ସିଙ୍କ ନିବେଶ ଅନୁକ୍ରମଣିକା ଏବଂ ଗୋଟିଏ ସିଙ୍କ ଉଲ୍ଲେଖ କରିବାକୁ ହେବ" + +#: ../src/utils/pactl.c:1188 +msgid "Invalid sink input index" +msgstr "ଅବୈଧ ସିଙ୍କ ନିବେଶ ଅନୁକ୍ରମଣିକା" + +#: ../src/utils/pactl.c:1204 +msgid "You have to specify a sink name/index and a mute boolean" +msgstr "ଆପଣଙ୍କୁ ଗୋଟିଏ ସିଙ୍କ ନାମ/ଅନୁକ୍ରମଣିକା ଏବଂ ସଂଯୋଗିକୀ ନାମ ଉଲ୍ଲେଖ କରିବାକୁ ହେବ" + +#: ../src/utils/pactl.c:1221 +msgid "You have to specify a source name/index and a mute boolean" +msgstr "ଆପଣଙ୍କୁ ଗୋଟିଏ ଉତ୍ସ ନାମ/ଅନୁକ୍ରମଣିକା ଏବଂ ସଂଯୋଗିକୀ ନାମ ଉଲ୍ଲେଖ କରିବାକୁ ହେବ" + +#: ../src/utils/pactl.c:1238 +msgid "You have to specify a sink input index and a mute boolean" +msgstr "ଆପଣଙ୍କୁ ଗୋଟିଏ ସିଙ୍କ ନିବେଶ ଅନୁକ୍ରମଣିକା ଏବଂ ଗୋଟିଏ ସିଙ୍କ ଉଲ୍ଲେଖ କରିବାକୁ ହେବ" + +#: ../src/utils/pactl.c:1243 +msgid "Invalid sink input index specification" +msgstr "ଅବୈଧ ସିଙ୍କ ନିବେଶ ଅନୁକ୍ରମଣିକା ବିଶେଷ ଲକ୍ଷଣ" + +#: ../src/utils/pactl.c:1262 +msgid "No valid command specified." +msgstr "କୌଣସି ବୈଧ ନିର୍ଦ୍ଦେଶ ଉଲ୍ଲେଖ କରାଯାଇନାହିଁ।" + +#: ../src/utils/pax11publish.c:61 +#, c-format +msgid "" +"%s [-D display] [-S server] [-O sink] [-I source] [-c file] [-d|-e|-i|-r]\n" +"\n" +" -d Show current PulseAudio data attached to X11 display (default)\n" +" -e Export local PulseAudio data to X11 display\n" +" -i Import PulseAudio data from X11 display to local environment " +"variables and cookie file.\n" +" -r Remove PulseAudio data from X11 display\n" +msgstr "" +"%s [-D display] [-S server] [-O sink] [-I source] [-c file] [-d|-e|-i|-r]\n" +"\n" +" -d X11 ପ୍ରଦର୍ଶିକା ସହିତ ସଂଲଗ୍ନ ପ୍ରଚଳିତ PulseAudio ତଥ୍ୟ ଦର୍ଶାନ୍ତୁ (ପୂର୍ବନିର୍ଦ୍ଧାରିତ)\n" +" -e X11 ପ୍ରଦର୍ଶିକାକୁ ସ୍ଥାନୀୟ PulseAudio ତଥ୍ୟ ରପ୍ତାନି କରନ୍ତୁ\n" +" -i X11 ପ୍ରଦର୍ଶିକାରୁ ସ୍ଥାନୀୟ ପରିବେଶ ପ୍ରାଚଳ ଏବଂ କୁକି ଫାଇଲକୁ ଆମଦାନି କରନ୍ତୁ।\n" +" -r X11 ପ୍ରଦର୍ଶିକାରୁ PulseAudio ତଥ୍ୟକୁ କାଢ଼ନ୍ତୁ\n" + +#: ../src/utils/pax11publish.c:94 +#, c-format +msgid "Failed to parse command line.\n" +msgstr "ପାଠ୍ୟ ନିର୍ଦ୍ଦେଶକୁ ବିଶ୍ଳେଷଣ କରିବାରେ ବିଫଳ।\n" + +#: ../src/utils/pax11publish.c:108 +#, c-format +msgid "Server: %s\n" +msgstr "ସର୍ଭର: %s\n" + +#: ../src/utils/pax11publish.c:110 +#, c-format +msgid "Source: %s\n" +msgstr "ଉତ୍ସ: %s\n" + +#: ../src/utils/pax11publish.c:112 +#, c-format +msgid "Sink: %s\n" +msgstr "ସିଙ୍କ: %s\n" + +#: ../src/utils/pax11publish.c:114 +#, c-format +msgid "Cookie: %s\n" +msgstr "କୁକି: %s\n" + +#: ../src/utils/pax11publish.c:132 +#, c-format +msgid "Failed to parse cookie data\n" +msgstr "କୁକି ତଥ୍ୟକୁ ବିଶ୍ଳେଷଣ କରିବାରେ ବିଫଳ\n" + +#: ../src/utils/pax11publish.c:137 +#, c-format +msgid "Failed to save cookie data\n" +msgstr "କୁକି ତଥ୍ୟକୁ ସଂରକ୍ଷଣ କରିବାରେ ବିଫଳ\n" + +#: ../src/utils/pax11publish.c:152 +#, c-format +msgid "Failed to load client configuration file.\n" +msgstr "ଗ୍ରାହକ ବିନ୍ୟାସ ଫାଇଲକୁ ଧାରଣ କରିବାରେ ବିଫଳ।\n" + +#: ../src/utils/pax11publish.c:157 +#, c-format +msgid "Failed to read environment configuration data.\n" +msgstr "ପରିବେଶ ବିନ୍ୟାସ ତଥ୍ୟକୁ ପଢ଼ିବାରେ ବିଫଳ।\n" + +#: ../src/utils/pax11publish.c:174 +#, c-format +msgid "Failed to get FQDN.\n" +msgstr "FQDNକୁ ପାଇବାରେ ବିଫଳ।\n" + +#: ../src/utils/pax11publish.c:194 +#, c-format +msgid "Failed to load cookie data\n" +msgstr "କୁକି ତଥ୍ୟ ଧାରଣ କରିବାରେ ବିଫଳ\n" + +#: ../src/utils/pax11publish.c:211 +#, c-format +msgid "Not yet implemented.\n" +msgstr "ଅପର୍ଯ୍ୟନ୍ତ କାର୍ଯ୍ୟକାରୀ ହୋଇନାହିଁ।\n" + +#: ../src/utils/pacmd.c:69 +msgid "No PulseAudio daemon running, or not running as session daemon." +msgstr "କୌଣସି PulseAudio ଡେମନ ଚାଲୁନାହିଁ, କିମ୍ବା ଅଧିବେଶନ ଡେମନ ପରି ଚାଲୁନାହିଁ।" + +#: ../src/utils/pacmd.c:74 +#, c-format +msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s" +msgstr "ସକେଟ(PF_UNIX, SOCK_STREAM, 0): %s" + +#: ../src/utils/pacmd.c:91 +#, c-format +msgid "connect(): %s" +msgstr "ସଂଯୋଗ କରନ୍ତୁ(): %s" + +#: ../src/utils/pacmd.c:99 +msgid "Failed to kill PulseAudio daemon." +msgstr "PulseAudio ଡେମନକୁ ବନ୍ଦ କରିବାରେ ବିଫଳ।" + +#: ../src/utils/pacmd.c:107 +msgid "Daemon not responding." +msgstr "ଡେମନ ଉତ୍ତର ଦେଉନାହିଁ।" + +#: ../src/utils/pacmd.c:161 +#, c-format +msgid "poll(): %s" +msgstr "poll(): %s" + +#: ../src/utils/pacmd.c:171 ../src/utils/pacmd.c:188 +#, c-format +msgid "read(): %s" +msgstr "ପଢ଼ନ୍ତୁ(): %s" + +#: ../src/utils/pacmd.c:207 ../src/utils/pacmd.c:223 +#, c-format +msgid "write(): %s" +msgstr "ଲେଖନ୍ତୁ(): %s" + +#: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:219 +msgid "Cannot access autospawn lock." +msgstr "autospawn ଅପରିବର୍ତ୍ତନୀୟତାକୁ ଅଭିଗମ୍ୟ କରିହେଉ ନାହିଁ" + +#: ../src/modules/alsa/alsa-sink.c:530 ../src/modules/alsa/alsa-sink.c:689 +#, c-format +msgid "" +"ALSA woke us up to write new data to the device, but there was actually " +"nothing to write!\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers.\n" +"We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() " +"returned 0 or another value < min_avail." +msgstr "" +"ALSA woke us up to write new data to the device, but there was actually " +"nothing to write!\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers.\n" +"We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() " +"returned 0 or another value < min_avail." + +#: ../src/modules/alsa/alsa-source.c:506 ../src/modules/alsa/alsa-source.c:656 +#, c-format +msgid "" +"ALSA woke us up to read new data from the device, but there was actually " +"nothing to read!\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers.\n" +"We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() " +"returned 0 or another value < min_avail." +msgstr "" +"ALSA woke us up to read new data from the device, but there was actually " +"nothing to read!\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers.\n" +"We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() " +"returned 0 or another value < min_avail." + +#: ../src/modules/alsa/module-alsa-card.c:152 +#: ../src/modules/bluetooth/module-bluetooth-device.c:2228 +#: ../src/modules/alsa/alsa-mixer.c:2931 +msgid "Off" +msgstr "ଅଫ" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2184 +msgid "High Fidelity Playback (A2DP)" +msgstr "ଉଚ୍ଚ ଫିଡିଲିଟି ପଛଚଲା (A2DP)" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2198 +msgid "High Fidelity Capture (A2DP)" +msgstr "ଉଚ୍ଚ ଫିଡିଲିଟି ପଛଚଲା (A2DP)" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2213 +msgid "Telephony Duplex (HSP/HFP)" +msgstr "ଟେଲିଫୋନି ଡ୍ୟୁପ୍ଲେକ୍ସ (HSP/HFP)" + +#: ../src/modules/reserve-wrap.c:151 +msgid "PulseAudio Sound Server" +msgstr "PulseAudio ଧ୍ୱନି ସର୍ଭର" + +#: ../src/modules/module-rygel-media-server.c:569 +#: ../src/modules/module-rygel-media-server.c:583 +msgid "Output Devices" +msgstr "" + +#: ../src/modules/module-rygel-media-server.c:570 +#: ../src/modules/module-rygel-media-server.c:584 +msgid "Input Devices" +msgstr "" + +#: ../src/modules/module-rygel-media-server.c:774 +msgid "Audio on @HOSTNAME@" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1701 +msgid "Input" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1702 +msgid "Docking Station Input" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1703 +msgid "Docking Station Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1704 +msgid "Line-In" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1705 +msgid "Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1706 +msgid "External Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1707 +#, fuzzy +msgid "Internal Microphone" +msgstr "ଆଭ୍ୟନ୍ତରୀଣ ଧ୍ୱନି" + +#: ../src/modules/alsa/alsa-mixer.c:1708 +msgid "Radio" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1709 +msgid "Video" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1710 +msgid "Automatic Gain Control" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1711 +msgid "No Automatic Gain Control" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1712 +msgid "Boost" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1713 +msgid "No Boost" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1714 +msgid "Amplifier" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1715 +msgid "No Amplifier" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1773 +msgid "Analog Input" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1774 +msgid "Analog Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1775 +msgid "Analog Line-In" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1776 +msgid "Analog Radio" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1777 +msgid "Analog Video" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1778 +#, fuzzy +msgid "Analog Output" +msgstr "ଶୂନ୍ୟ ଫଳାଫଳ" + +#: ../src/modules/alsa/alsa-mixer.c:1779 +msgid "Analog Headphones" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1780 +msgid "Analog Output (LFE)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1781 +msgid "Analog Mono Output" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1981 +#, fuzzy, c-format +msgid "%s+%s" +msgstr "%s %s" + +#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404 +#, fuzzy, c-format +msgid "%s / %s" +msgstr "%s %s" + +#: ../src/modules/alsa/alsa-mixer.c:2790 +msgid "Analog Mono" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2791 +#, fuzzy +msgid "Analog Stereo" +msgstr "ଷ୍ଟେରିଓ" + +#: ../src/modules/alsa/alsa-mixer.c:2792 +#, fuzzy +msgid "Analog Surround 2.1" +msgstr "ଚତୁଃ ପାର୍ଶ୍ୱ 4.1" + +#: ../src/modules/alsa/alsa-mixer.c:2793 +#, fuzzy +msgid "Analog Surround 3.0" +msgstr "ଚତୁଃ ପାର୍ଶ୍ୱ 4.0" + +#: ../src/modules/alsa/alsa-mixer.c:2794 +#, fuzzy +msgid "Analog Surround 3.1" +msgstr "ଚତୁଃ ପାର୍ଶ୍ୱ 4.1" + +#: ../src/modules/alsa/alsa-mixer.c:2795 +#, fuzzy +msgid "Analog Surround 4.0" +msgstr "ଚତୁଃ ପାର୍ଶ୍ୱ 4.0" + +#: ../src/modules/alsa/alsa-mixer.c:2796 +#, fuzzy +msgid "Analog Surround 4.1" +msgstr "ଚତୁଃ ପାର୍ଶ୍ୱ 4.1" + +#: ../src/modules/alsa/alsa-mixer.c:2797 +#, fuzzy +msgid "Analog Surround 5.0" +msgstr "ଚତୁଃ ପାର୍ଶ୍ୱ 5.0" + +#: ../src/modules/alsa/alsa-mixer.c:2798 +#, fuzzy +msgid "Analog Surround 5.1" +msgstr "ଚତୁଃ ପାର୍ଶ୍ୱ 5.1" + +#: ../src/modules/alsa/alsa-mixer.c:2799 +#, fuzzy +msgid "Analog Surround 6.0" +msgstr "ଚତୁଃ ପାର୍ଶ୍ୱ 4.0" + +#: ../src/modules/alsa/alsa-mixer.c:2800 +#, fuzzy +msgid "Analog Surround 6.1" +msgstr "ଚତୁଃ ପାର୍ଶ୍ୱ 4.1" + +#: ../src/modules/alsa/alsa-mixer.c:2801 +#, fuzzy +msgid "Analog Surround 7.0" +msgstr "ଚତୁଃ ପାର୍ଶ୍ୱ 4.0" + +#: ../src/modules/alsa/alsa-mixer.c:2802 +#, fuzzy +msgid "Analog Surround 7.1" +msgstr "ଚତୁଃ ପାର୍ଶ୍ୱ 7.1" + +#: ../src/modules/alsa/alsa-mixer.c:2803 +msgid "Digital Stereo (IEC958)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2804 +msgid "Digital Surround 4.0 (IEC958)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2805 +msgid "Digital Surround 4.0 (IEC958/AC3)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2806 +msgid "Digital Surround 5.1 (IEC958/AC3)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2807 +msgid "Digital Stereo (HDMI)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2928 +msgid "Analog Mono Duplex" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2929 +msgid "Analog Stereo Duplex" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2930 +msgid "Digital Stereo Duplex (IEC958)" +msgstr "" diff --git a/po/pa.po b/po/pa.po new file mode 100644 index 0000000..16c5abe --- /dev/null +++ b/po/pa.po @@ -0,0 +1,2564 @@ +# translation of pulseaudio.master-tx.pa.po to Punjabi +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Amanpreet Singh Alam , 2008. +# Jaswinder Singh , 2009. +# A S Alam , 2009. +msgid "" +msgstr "" +"Project-Id-Version: pulseaudio.master-tx.pa\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-09-29 23:47+0200\n" +"PO-Revision-Date: 2009-09-11 12:08+0530\n" +"Last-Translator: Jaswinder Singh \n" +"Language-Team: Punjabi \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629 +#, c-format +msgid "%s %s" +msgstr "%s %s" + +#: ../src/modules/alsa/alsa-util.c:1106 +#, c-format +msgid "" +"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu " +"ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_avail() ਤੋਂ ਇੱਕ ਮੁੱਲ ਮਿਲਿਆ ਹੈ, ਜੋ ਬਹੁਤ ਵੱਡਾ ਹੈ: %lu ਬਾਈਟ (%lu ms)।\n" +"ਇਹ ALSA ਡਰਾਈਵਰ '%s' ਵਿਚਲਾ ਬੱਗ ਲੱਗਦਾ ਹੈ। ਇਸ ਮੁੱਦੇ ਦੀ ALSA ਡਿਵੈਲਪਰਾਂ ਨੂੰ ਰਿਪੋਰਟ ਦਿਓ ਜੀ।" + +#: ../src/modules/alsa/alsa-util.c:1147 +#, c-format +msgid "" +"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%" +"lu ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_delay() ਤੋਂ ਇੱਕ ਮੁੱਲ ਮਿਲਿਆ ਹੈ, ਜੋ ਬਹੁਤ ਵੱਡਾ ਹੈ: %li ਬਾਈਟ (%s%lu ms)।\n" +"ਇਹ ALSA ਡਰਾਈਵਰ '%s' ਵਿਚਲਾ ਬੱਗ ਲੱਗਦਾ ਹੈ। ਇਸ ਮੁੱਦੇ ਦੀ ALSA ਡਿਵੈਲਪਰਾਂ ਨੂੰ ਰਿਪੋਰਟ ਦਿਓ ਜੀ।" + +#: ../src/modules/alsa/alsa-util.c:1194 +#, c-format +msgid "" +"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes " +"(%lu ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_mmap_begin() ਤੋਂ ਇੱਕ ਮੁੱਲ ਮਿਲਿਆ ਹੈ, ਜੋ ਬਹੁਤ ਵੱਡਾ ਹੈ: %lu ਬਾਈਟ (%lu ms)।\n" +"ਇਹ ALSA ਡਰਾਈਵਰ '%s' ਵਿਚਲਾ ਬੱਗ ਲੱਗਦਾ ਹੈ। ਇਸ ਮੁੱਦੇ ਦੀ ALSA ਡਿਵੈਲਪਰਾਂ ਨੂੰ ਰਿਪੋਰਟ ਦਿਓ ਜੀ।" + +#: ../src/modules/module-always-sink.c:39 +msgid "Always keeps at least one sink loaded even if it's a null one" +msgstr "ਹਮੇਸ਼ਾਂ ਘੱਟੋ-ਘੱਟ ਇੱਕ ਸਿੰਕ ਲੋਡ ਹੀ ਰੱਖੋ ਭਾਵੇਂ ਇਹ ਇੱਕ ਜ਼ੀਰੋ (null) ਹੇਵੋ" + +#: ../src/modules/module-always-sink.c:83 +msgid "Dummy Output" +msgstr "ਡੰਮੀ ਆਊਟਪੁੱਟ" + +#: ../src/modules/module-ladspa-sink.c:49 +msgid "Virtual LADSPA sink" +msgstr "ਵਰਚੁਅਲ LADSPA ਸਿੰਕ" + +#: ../src/modules/module-ladspa-sink.c:53 +msgid "" +"sink_name= sink_properties= " +"master= format= rate= " +"channels= channel_map= plugin= label= control=" +msgstr "" +"sink_name= sink_properties= " +"master= format= rate= " +"channels= channel_map= plugin= label= control=" + +#: ../src/modules/module-null-sink.c:55 +msgid "Clocked NULL sink" +msgstr "ਕਲਾਕਡ NULL ਸਿੰਕ" + +#: ../src/modules/module-null-sink.c:291 +msgid "Null Output" +msgstr "ਜ਼ੀਰੋ (Null) ਆਉਟਪੁੱਟ" + +#: ../src/pulsecore/sink.c:2613 +msgid "Internal Audio" +msgstr "ਅੰਦਰੂਨੀ ਆਡੀਓ" + +#: ../src/pulsecore/sink.c:2618 +msgid "Modem" +msgstr "ਮਾਡਮ" + +#: ../src/daemon/ltdl-bind-now.c:124 +msgid "Failed to find original lt_dlopen loader." +msgstr "ਅਸਲੀ lt_dlopen ਲੋਡਰ ਲੱਭਣ ਵਿੱਚ ਫੇਲ੍ਹ ਹੋਇਆ।" + +#: ../src/daemon/ltdl-bind-now.c:129 +msgid "Failed to allocate new dl loader." +msgstr "ਨਵਾਂ dl ਲੋਡਰ ਦੇਣ ਲਈ ਫੇਲ੍ਹ।" + +#: ../src/daemon/ltdl-bind-now.c:142 +msgid "Failed to add bind-now-loader." +msgstr "ਬਾਈਂਡ-ਨਾਓ-ਲੋਡਰ ਜੋੜਨ ਵਿੱਚ ਫੇਲ੍ਹ ਹੋਇਆ।" + +#: ../src/daemon/main.c:141 +#, c-format +msgid "Got signal %s." +msgstr "%s ਸਿਗਨਲ ਮਿਲਿਆ ਹੈ।" + +#: ../src/daemon/main.c:168 +msgid "Exiting." +msgstr "ਬੰਦ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ।" + +#: ../src/daemon/main.c:186 +#, c-format +msgid "Failed to find user '%s'." +msgstr "'%s' ਯੂਜ਼ਰ ਲੱਭਣ ਵਿੱਚ ਫੇਲ੍ਹ ਹੋਇਆ ਹੈ।" + +#: ../src/daemon/main.c:191 +#, c-format +msgid "Failed to find group '%s'." +msgstr "'%s' ਗਰੁੱਪ ਲੱਭਣ ਵਿੱਚ ਫੇਲ ਹੋਇਆ ਹੈ।" + +#: ../src/daemon/main.c:195 +#, c-format +msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)." +msgstr "ਯੂਜ਼ਰ '%s' (UID %lu) ਅਤੇ ਗਰੁੱਪ '%s' (GID %lu) ਲੱਭੇ ਹਨ।" + +#: ../src/daemon/main.c:200 +#, c-format +msgid "GID of user '%s' and of group '%s' don't match." +msgstr "ਯੂਜ਼ੂ '%s' ਅਤੇ ਗਰੁੱਪ '%s' ਦਾ GID ਮੇਲ ਨਹੀਂ ਖਾਂਦੇ।" + +#: ../src/daemon/main.c:205 +#, c-format +msgid "Home directory of user '%s' is not '%s', ignoring." +msgstr "ਯੂਜ਼ੂ '%s' ਦੀ ਘਰ ਡਾਇਰੈਕਟਰੀ '%s' ਨਹੀਂ, ਅਣਡਿੱਠਾ ਕਰ ਰਿਹਾ।" + +#: ../src/daemon/main.c:208 ../src/daemon/main.c:213 +#, c-format +msgid "Failed to create '%s': %s" +msgstr "'%s' ਬਣਾਉਣ ਵਿੱਚ ਫੇਲ੍ਹ: %s" + +#: ../src/daemon/main.c:220 +#, c-format +msgid "Failed to change group list: %s" +msgstr "ਗਰੁੱਪ ਲਿਸਟ ਬਦਲਣ ਲਈ ਫੇਲ੍ਹ: %s" + +#: ../src/daemon/main.c:236 +#, c-format +msgid "Failed to change GID: %s" +msgstr "GID ਬਦਲਣ ਲਈ ਫੇਲ੍ਹ: %s" + +#: ../src/daemon/main.c:252 +#, c-format +msgid "Failed to change UID: %s" +msgstr "UID ਬਦਲਣ ਲਈ ਫੇਲ੍ਹ: %s" + +#: ../src/daemon/main.c:271 +msgid "Successfully dropped root privileges." +msgstr "ਰੂਟ ਅਧਿਕਾਰ ਸਫਲਤਾਪੂਰਕ ਹਟਾਏ ਗਏ।" + +#: ../src/daemon/main.c:279 +msgid "System wide mode unsupported on this platform." +msgstr "ਇਸ ਪਲੇਟਫਾਰਮ ਤੇ ਸਿਸਟਮ ਸੰਬੰਧੀ ਮੋਡ ਨੂੰ ਸਹਿਯੋਗ ਨਹੀਂ ਹੈ।" + +#: ../src/daemon/main.c:297 +#, c-format +msgid "setrlimit(%s, (%u, %u)) failed: %s" +msgstr "setrlimit(%s, (%u, %u)) ਫੇਲ੍ਹ ਹੋਇਆ: %s" + +#: ../src/daemon/main.c:474 +msgid "Failed to parse command line." +msgstr "ਕਮਾਂਡ ਲਾਈਨ ਪਾਰਸ ਕਰਨ ਵਿੱਚ ਫੇਲ੍ਹ।" + +#: ../src/daemon/main.c:541 +msgid "Daemon not running" +msgstr "ਡੈਮਨ ਚੱਲ ਨਹੀਂ ਰਿਹਾ" + +#: ../src/daemon/main.c:543 +#, c-format +msgid "Daemon running as PID %u" +msgstr "ਡੈਮਨ PID %u ਤੌਰ ਤੇ ਚੱਲ ਰਿਹਾ ਹੈ" + +#: ../src/daemon/main.c:553 +#, c-format +msgid "Failed to kill daemon: %s" +msgstr "ਡੈਮਨ ਖਤਮ ਕਰਨ ਵਿੱਚ ਫੇਲ੍ਹ: %s" + +#: ../src/daemon/main.c:571 +msgid "" +"This program is not intended to be run as root (unless --system is " +"specified)." +msgstr "ਇਹ ਪਰੋਗਰਾਮ ਰੂਟ ਦੇ ਤੌਰ ਤੇ ਚਲਾਉਣ ਲਈ ਨਹੀਂ ਹੈ (ਜਦੋਂ ਤੱਕ --system ਦਿੱਤਾ ਨਹੀਂ ਜਾਂਦਾ)।" + +#: ../src/daemon/main.c:573 +msgid "Root privileges required." +msgstr "ਰੂਟ ਅਧਿਕਾਰਾਂ ਦੀ ਲੋੜ ਹੈ।" + +#: ../src/daemon/main.c:578 +msgid "--start not supported for system instances." +msgstr "--start ਨੂੰ ਸਿਸਟਮ ਮੌਕਿਆਂ ਲਈ ਸਹਿਯੋਗ ਨਹੀਂ ਹੈ।" + +#: ../src/daemon/main.c:583 +msgid "Running in system mode, but --disallow-exit not set!" +msgstr "ਸਿਸਟਮ ਮੋਡ ਵਿੱਚ ਚੱਲ ਰਿਹਾ ਹੈ, ਪਰ --disallow-exit ਸੈੱਟ ਨਹੀਂ ਕੀਤਾ!" + +#: ../src/daemon/main.c:586 +msgid "Running in system mode, but --disallow-module-loading not set!" +msgstr "ਸਿਸਟਮ ਮੋਡ ਵਿੱਚ ਚੱਲ ਰਿਹਾ ਹੈ, ਪਰ --disallow-module-loading ਸੈੱਟ ਨਹੀਂ ਕੀਤਾ!" + +#: ../src/daemon/main.c:589 +msgid "Running in system mode, forcibly disabling SHM mode!" +msgstr "ਸਿਸਟਮ ਮੋਡ ਵਿੱਚ ਚੱਲ ਰਿਹਾ ਹੈ, ਜ਼ਬਰਦਸਤੀ SHM ਮੋਡ ਨੂੰ ਅਯੋਗ ਕਰ ਰਿਹਾ ਹੈ!" + +#: ../src/daemon/main.c:594 +msgid "Running in system mode, forcibly disabling exit idle time!" +msgstr "ਸਿਸਟਮ ਮੋਡ ਵਿੱਚ ਚੱਲ ਰਿਹਾ ਹੈ, ਜ਼ਬਰਦਸਤੀ idle ਟਾਈਲ ਬੰਦ ਨੂੰ ਅਯੋਗ ਕਰ ਰਿਹਾ ਹੈ!" + +#: ../src/daemon/main.c:621 +msgid "Failed to acquire stdio." +msgstr "ਸਟੂਡੀਓ ਪ੍ਰਾਪਤ ਕਰਨ ਵਿੱਚ ਫੇਲ੍ਹ।" + +#: ../src/daemon/main.c:627 +#, c-format +msgid "pipe failed: %s" +msgstr "pipe ਫੇਲ੍ਹ: %s" + +#: ../src/daemon/main.c:632 +#, c-format +msgid "fork() failed: %s" +msgstr "fork() ਫੇਲ੍ਹ ਹੈ: %s" + +#: ../src/daemon/main.c:646 ../src/utils/pacat.c:508 +#, c-format +msgid "read() failed: %s" +msgstr "read() ਫੇਲ੍ਹ ਹੈ: %s" + +#: ../src/daemon/main.c:652 +msgid "Daemon startup failed." +msgstr "ਡੈਮਨ ਸ਼ੁਰੂਆਤੀ ਫੇਲ੍ਹ ਹੋਈ।" + +#: ../src/daemon/main.c:654 +msgid "Daemon startup successful." +msgstr "ਡੈਮਨ ਸ਼ੁਰੂਆਤੀ ਸਫ਼ਲ ਹੋਈ।" + +#: ../src/daemon/main.c:731 +#, c-format +msgid "This is PulseAudio %s" +msgstr "ਇਹ ਪਲਸਆਡੀਓ %s ਹੈ" + +#: ../src/daemon/main.c:732 +#, c-format +msgid "Compilation host: %s" +msgstr "ਕੰਪਾਈਲੇਸ਼ਨ ਹੋਸਟ: %s" + +#: ../src/daemon/main.c:733 +#, c-format +msgid "Compilation CFLAGS: %s" +msgstr "ਕੰਪਾਈਲੇਸ਼ਨ CFLAGS: %s" + +#: ../src/daemon/main.c:736 +#, c-format +msgid "Running on host: %s" +msgstr "ਹੋਸਟ ਤੇ ਚੱਲ ਰਿਹਾ ਹੈ: %s" + +#: ../src/daemon/main.c:739 +#, c-format +msgid "Found %u CPUs." +msgstr "%u CPUs ਲੱਭੇ।" + +#: ../src/daemon/main.c:741 +#, c-format +msgid "Page size is %lu bytes" +msgstr "ਪੇਜ਼ ਸਾਈਜ਼ %lu ਬਾਈਟ ਹੈ" + +#: ../src/daemon/main.c:744 +msgid "Compiled with Valgrind support: yes" +msgstr "Valgrind ਸਹਿਯੋਗ ਨਾਲ ਕੰਪਾਈਲ: ਹਾਂ" + +#: ../src/daemon/main.c:746 +msgid "Compiled with Valgrind support: no" +msgstr "Valgrind ਸਹਿਯੋਗ ਨਾਲ ਕੰਪਾਈਲ: ਨਹੀਂ" + +#: ../src/daemon/main.c:749 +#, c-format +msgid "Running in valgrind mode: %s" +msgstr "Valgrind ਮੋਡ ਵਿੱਚ ਚੱਲ ਰਿਹਾ ਹੈ: %s" + +#: ../src/daemon/main.c:752 +msgid "Optimized build: yes" +msgstr "ਓਪਟੀਮਾਈਜ਼ਡ ਬਿਲਡ: ਹਾਂ" + +#: ../src/daemon/main.c:754 +msgid "Optimized build: no" +msgstr "ਓਪਟੀਮਾਈਜ਼ਡ ਬਿਲਡ: ਨਹੀਂ" + +#: ../src/daemon/main.c:758 +msgid "NDEBUG defined, all asserts disabled." +msgstr "NDEBUG ਪਰਿਭਾਸ਼ਤ, ਸਭ asserts ਅਯੋਗ ਹਨ।" + +#: ../src/daemon/main.c:760 +msgid "FASTPATH defined, only fast path asserts disabled." +msgstr "FASTPATH ਪਰਿਭਾਸ਼ਤ, ਸਿਰਫ ਫਾਸਟ ਪਾਥ asserts ਅਯੋਗ ਹਨ।" + +#: ../src/daemon/main.c:762 +msgid "All asserts enabled." +msgstr "ਸਭ asserts ਯੋਗ ਕੀਤੇ ਹਨ।" + +#: ../src/daemon/main.c:766 +msgid "Failed to get machine ID" +msgstr "ਮਸ਼ੀਨ ID ਪ੍ਰਾਪਤ ਕਰਨ ਵਿੱਚ ਫੇਲ੍ਹ" + +#: ../src/daemon/main.c:769 +#, c-format +msgid "Machine ID is %s." +msgstr "ਮਸ਼ੀਨ ID %s ਹੈ।" + +#: ../src/daemon/main.c:773 +#, c-format +msgid "Session ID is %s." +msgstr "ਸ਼ੈਸ਼ਨ ID %s ਹੈ।" + +#: ../src/daemon/main.c:779 +#, c-format +msgid "Using runtime directory %s." +msgstr "ਰਨਟਾਈਮ ਡਾਇਰੈਕਟਰੀ %s ਦੀ ਵਰਤੋਂ।" + +#: ../src/daemon/main.c:784 +#, c-format +msgid "Using state directory %s." +msgstr "ਸਟੇਟ ਡਾਇਰੈਕਟਰੀ %s ਦੀ ਵਰਤੋਂ।" + +#: ../src/daemon/main.c:787 +#, c-format +msgid "Using modules directory %s." +msgstr "ਮੈਡਿਊਲ ਡਾਇਰੈਕਟਰੀ %s ਦੀ ਵਰਤੋਂ।" + +#: ../src/daemon/main.c:789 +#, c-format +msgid "Running in system mode: %s" +msgstr "ਸਿਸਟਮ ਮੋਡ ਵਿੱਚ ਚੱਲ ਰਿਹਾ ਹੈ: %s" + +#: ../src/daemon/main.c:792 +msgid "" +"OK, so you are running PA in system mode. Please note that you most likely " +"shouldn't be doing that.\n" +"If you do it nonetheless then it's your own fault if things don't work as " +"expected.\n" +"Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an " +"explanation why system mode is usually a bad idea." +msgstr "" +"ਠੀਕ ਹੈ, ਤਾਂ ਤੁਸੀਂ PA ਨੂੰ ਸਿਸਟਮ ਮੋਡ ਵਿੱਚ ਚਲਾ ਰਹੇ ਹੋ। ਕਿਰਪਾ ਕਰਕੇ ਧਿਆਨ ਰੱਖੋ ਕਿ ਤੁਹਾਨੂੰ ਇਹ ਕਰਨਾ " +"ਨਹੀਂ ਚਾਹੀਦਾ।\n" +"ਜੇ ਤੁਸੀਂ ਅਜਿਹਾ ਕੀਤਾ ਹੈ ਤਾਂ ਇਹ ਤੁਹਾਡੀ ਗਲਤੀ ਹੈ ਜੇ ਲੋੜ-ਮੁਤਾਬਕ ਠੀਕ ਕੰਮ ਨਾ ਚੱਲਿਆ।\n" +"ਕਿਰਪਾ ਕਰਕੇ ਸਿਸਟਮ ਮੋਡ ਦੇ ਗਲਤ ਹੋਣ ਬਾਰੇ ਵਧੇਰੇ ਜਾਣਕਾਰੀ ਲਈ http://pulseaudio.org/wiki/" +"WhatIsWrongWithSystemMode ਵੇਖੋ।" + +#: ../src/daemon/main.c:809 +msgid "pa_pid_file_create() failed." +msgstr "pa_pid_file_create() ਫੇਲ੍ਹ ਹੈ।" + +#: ../src/daemon/main.c:819 +msgid "Fresh high-resolution timers available! Bon appetit!" +msgstr "ਤਾਜ਼ੀ ਹਾਈ-ਰੈਜ਼ੋਲੂਸ਼ਨ ਟਾਈਮਰ ਉਪਲੱਬਧ ਹੈ! Bon appetit!" + +#: ../src/daemon/main.c:821 +msgid "" +"Dude, your kernel stinks! The chef's recommendation today is Linux with high-" +"resolution timers enabled!" +msgstr "" +"ਮਿੱਤਰਾ, ਤੇਰਾ ਕਰਨਲ ਪੁਰਾਣਾ ਹੈ! ਚੀਫ ਦੀ ਅੱਜ ਦੀ ਸਿਫਾਰਸ਼ ਹਾਈ-ਰੈਜ਼ੋਲੂਸ਼ਨ ਟਾਈਮਰ ਯੋਗ ਨਾਲ ਲੀਨਕਸ ਹੈ!" + +#: ../src/daemon/main.c:844 +msgid "pa_core_new() failed." +msgstr "pa_core_new() ਫੇਲ੍ਹ ਹੈ।" + +#: ../src/daemon/main.c:904 +msgid "Failed to initialize daemon." +msgstr "ਡੈਮਨ ਸ਼ੁਰੂ ਕਰਨ ਵਿੱਚ ਫੇਲ੍ਹ।" + +#: ../src/daemon/main.c:909 +msgid "Daemon startup without any loaded modules, refusing to work." +msgstr "ਡੈਮਨ ਸ਼ੁਰੂਆਤੀ ਬਿਨਾਂ ਕਿਸੇ ਲੋਡ ਕੀਤੇ ਮੈਡਿਊਲ, ਕੰਮ ਕਰਨ ਤੋਂ ਰੋਕ ਰਿਹਾ ਹੈ।" + +#: ../src/daemon/main.c:926 +msgid "Daemon startup complete." +msgstr "ਡੈਮਨ ਸ਼ੁਰੂਆਤੀ ਮੁਕੰਮਲ।" + +#: ../src/daemon/main.c:932 +msgid "Daemon shutdown initiated." +msgstr "ਡੈਮਨ ਬੰਦ ਕਰਨਾ ਸ਼ੁਰੂ ਹੋ ਗਿਆ।" + +#: ../src/daemon/main.c:954 +msgid "Daemon terminated." +msgstr "ਡੈਮਨ ਬੰਦ ਹੋ ਗਿਆ।" + +#: ../src/daemon/cmdline.c:115 +#, c-format +msgid "" +"%s [options]\n" +"\n" +"COMMANDS:\n" +" -h, --help Show this help\n" +" --version Show version\n" +" --dump-conf Dump default configuration\n" +" --dump-modules Dump list of available modules\n" +" --dump-resample-methods Dump available resample methods\n" +" --cleanup-shm Cleanup stale shared memory " +"segments\n" +" --start Start the daemon if it is not " +"running\n" +" -k --kill Kill a running daemon\n" +" --check Check for a running daemon (only " +"returns exit code)\n" +"\n" +"OPTIONS:\n" +" --system[=BOOL] Run as system-wide instance\n" +" -D, --daemonize[=BOOL] Daemonize after startup\n" +" --fail[=BOOL] Quit when startup fails\n" +" --high-priority[=BOOL] Try to set high nice level\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_NICE)\n" +" --realtime[=BOOL] Try to enable realtime scheduling\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_RTPRIO)\n" +" --disallow-module-loading[=BOOL] Disallow module user requested " +"module\n" +" loading/unloading after startup\n" +" --disallow-exit[=BOOL] Disallow user requested exit\n" +" --exit-idle-time=SECS Terminate the daemon when idle and " +"this\n" +" time passed\n" +" --module-idle-time=SECS Unload autoloaded modules when idle " +"and\n" +" this time passed\n" +" --scache-idle-time=SECS Unload autoloaded samples when idle " +"and\n" +" this time passed\n" +" --log-level[=LEVEL] Increase or set verbosity level\n" +" -v Increase the verbosity level\n" +" --log-target={auto,syslog,stderr} Specify the log target\n" +" --log-meta[=BOOL] Include code location in log " +"messages\n" +" --log-time[=BOOL] Include timestamps in log messages\n" +" --log-backtrace=FRAMES Include a backtrace in log messages\n" +" -p, --dl-search-path=PATH Set the search path for dynamic " +"shared\n" +" objects (plugins)\n" +" --resample-method=METHOD Use the specified resampling method\n" +" (See --dump-resample-methods for\n" +" possible values)\n" +" --use-pid-file[=BOOL] Create a PID file\n" +" --no-cpu-limit[=BOOL] Do not install CPU load limiter on\n" +" platforms that support it.\n" +" --disable-shm[=BOOL] Disable shared memory support.\n" +"\n" +"STARTUP SCRIPT:\n" +" -L, --load=\"MODULE ARGUMENTS\" Load the specified plugin module " +"with\n" +" the specified argument\n" +" -F, --file=FILENAME Run the specified script\n" +" -C Open a command line on the running " +"TTY\n" +" after startup\n" +"\n" +" -n Don't load default script file\n" +msgstr "" +"%s [options]\n" +"\n" +"COMMANDS:\n" +" -h, --help Show this help\n" +" --version Show version\n" +" --dump-conf Dump default configuration\n" +" --dump-modules Dump list of available modules\n" +" --dump-resample-methods Dump available resample methods\n" +" --cleanup-shm Cleanup stale shared memory " +"segments\n" +" --start Start the daemon if it is not " +"running\n" +" -k --kill Kill a running daemon\n" +" --check Check for a running daemon (only " +"returns exit code)\n" +"\n" +"OPTIONS:\n" +" --system[=BOOL] Run as system-wide instance\n" +" -D, --daemonize[=BOOL] Daemonize after startup\n" +" --fail[=BOOL] Quit when startup fails\n" +" --high-priority[=BOOL] Try to set high nice level\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_NICE)\n" +" --realtime[=BOOL] Try to enable realtime scheduling\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_RTPRIO)\n" +" --disallow-module-loading[=BOOL] Disallow module user requested " +"module\n" +" loading/unloading after startup\n" +" --disallow-exit[=BOOL] Disallow user requested exit\n" +" --exit-idle-time=SECS Terminate the daemon when idle and " +"this\n" +" time passed\n" +" --module-idle-time=SECS Unload autoloaded modules when idle " +"and\n" +" this time passed\n" +" --scache-idle-time=SECS Unload autoloaded samples when idle " +"and\n" +" this time passed\n" +" --log-level[=LEVEL] Increase or set verbosity level\n" +" -v Increase the verbosity level\n" +" --log-target={auto,syslog,stderr} Specify the log target\n" +" --log-meta[=BOOL] Include code location in log " +"messages\n" +" --log-time[=BOOL] Include timestamps in log messages\n" +" --log-backtrace=FRAMES Include a backtrace in log messages\n" +" -p, --dl-search-path=PATH Set the search path for dynamic " +"shared\n" +" objects (plugins)\n" +" --resample-method=METHOD Use the specified resampling method\n" +" (See --dump-resample-methods for\n" +" possible values)\n" +" --use-pid-file[=BOOL] Create a PID file\n" +" --no-cpu-limit[=BOOL] Do not install CPU load limiter on\n" +" platforms that support it.\n" +" --disable-shm[=BOOL] Disable shared memory support.\n" +"\n" +"STARTUP SCRIPT:\n" +" -L, --load=\"MODULE ARGUMENTS\" Load the specified plugin module " +"with\n" +" the specified argument\n" +" -F, --file=FILENAME Run the specified script\n" +" -C Open a command line on the running " +"TTY\n" +" after startup\n" +"\n" +" -n Don't load default script file\n" + +#: ../src/daemon/cmdline.c:247 +msgid "--daemonize expects boolean argument" +msgstr "--daemonize ਨੂੰ ਬੁਲੀਅਨ ਆਰਗੂਮੈਂਟ ਦੀ ਲੋੜ ਹੈ" + +#: ../src/daemon/cmdline.c:254 +msgid "--fail expects boolean argument" +msgstr "--fail ਨੂੰ ਬੁਲੀਅਨ ਆਰਗੂਮੈਂਟ ਦੀ ਲੋੜ ਹੈ" + +#: ../src/daemon/cmdline.c:264 +msgid "" +"--log-level expects log level argument (either numeric in range 0..4 or one " +"of debug, info, notice, warn, error)." +msgstr "" +"--log-level ਨੂੰ ਲਾਗ ਲੈਵਲ ਆਰਗੂਮੈਂਟ ਦੀ ਲੋੜ ਹੈ (ਜਾਂ ਤਾਂ ਅੰਕੀ ਰੇਂਜ 0..4 ਜਾਂ debug, info, " +"notice, warn, error ਵਿੱਚੋਂ ਇੱਕ)।" + +#: ../src/daemon/cmdline.c:276 +msgid "--high-priority expects boolean argument" +msgstr "--high-priority ਨੂੰ ਬੁਲੀਅਨ ਆਰਗੂਮੈਂਟ ਦੀ ਲੋੜ ਹੈ" + +#: ../src/daemon/cmdline.c:283 +msgid "--realtime expects boolean argument" +msgstr "--realtime ਨੂੰ ਬੁਲੀਅਨ ਆਰਗੂਮੈਂਟ ਦੀ ਲੋੜ ਹੈ" + +#: ../src/daemon/cmdline.c:290 +msgid "--disallow-module-loading expects boolean argument" +msgstr "--disallow-module-loading ਨੂੰ ਬੁਲੀਅਨ ਆਰਗੂਮੈਂਟ ਦੀ ਲੋੜ ਹੈ" + +#: ../src/daemon/cmdline.c:297 +msgid "--disallow-exit expects boolean argument" +msgstr "--disallow-exit ਨੂੰ ਬੁਲੀਅਨ ਆਰਗੂਮੈਂਟ ਦੀ ਲੋੜ ਹੈ" + +#: ../src/daemon/cmdline.c:304 +msgid "--use-pid-file expects boolean argument" +msgstr "--use-pid-file ਨੂੰ ਬੁਲੀਅਨ ਆਰਗੂਮੈਂਟ ਦੀ ਲੋੜ ਹੈ" + +#: ../src/daemon/cmdline.c:321 +msgid "Invalid log target: use either 'syslog', 'stderr' or 'auto'." +msgstr "ਗਲਤ ਲਾਗ ਟਾਰਗੇਟ: 'syslog', 'stderr' ਜਾਂ 'auto' ਵਰਤੋਂ।" + +#: ../src/daemon/cmdline.c:328 +msgid "--log-time expects boolean argument" +msgstr "--log-time ਨੂੰ ਬੁਲੀਅਨ ਆਰਗੂਮੈਂਟ ਦੀ ਲੋੜ ਹੈ" + +#: ../src/daemon/cmdline.c:335 +msgid "--log-meta expects boolean argument" +msgstr "--log-meta ਨੂੰ ਬੁਲੀਅਨ ਆਰਗੂਮੈਂਟ ਦੀ ਲੋੜ ਹੈ" + +#: ../src/daemon/cmdline.c:354 +#, c-format +msgid "Invalid resample method '%s'." +msgstr "ਅਢੁੱਕਵਾਂ ਰੀਸੈਂਪਲ ਢੰਗ '%s'।" + +#: ../src/daemon/cmdline.c:361 +msgid "--system expects boolean argument" +msgstr "--system ਨੂੰ ਬੁਲੀਅਨ ਆਰਗੂਮੈਂਟ ਦੀ ਲੋੜ ਹੈ" + +#: ../src/daemon/cmdline.c:368 +msgid "--no-cpu-limit expects boolean argument" +msgstr "--no-cpu-limit ਨੂੰ ਬੁਲੀਅਨ ਆਰਗੂਮੈਂਟ ਦੀ ਲੋੜ ਹੈ" + +#: ../src/daemon/cmdline.c:375 +msgid "--disable-shm expects boolean argument" +msgstr "--disable-shm ਨੂੰ ਬੁਲੀਅਨ ਆਰਗੂਮੈਂਟ ਦੀ ਲੋੜ ਹੈ" + +#: ../src/daemon/dumpmodules.c:60 +#, c-format +msgid "Name: %s\n" +msgstr "ਨਾਂ: %s\n" + +#: ../src/daemon/dumpmodules.c:63 +#, c-format +msgid "No module information available\n" +msgstr "ਕੋਈ ਮੋਡੀਊਲ ਜਾਣਕਾਰੀ ਉਪਲੱਬਧ ਨਹੀਂ\n" + +#: ../src/daemon/dumpmodules.c:66 +#, c-format +msgid "Version: %s\n" +msgstr "ਵਰਜਨ: %s\n" + +#: ../src/daemon/dumpmodules.c:68 +#, c-format +msgid "Description: %s\n" +msgstr "ਵੇਰਵਾ: %s\n" + +#: ../src/daemon/dumpmodules.c:70 +#, c-format +msgid "Author: %s\n" +msgstr "ਲੇਖਕ: %s\n" + +#: ../src/daemon/dumpmodules.c:72 +#, c-format +msgid "Usage: %s\n" +msgstr "ਵਰਤੋਂ: %s\n" + +#: ../src/daemon/dumpmodules.c:73 +#, c-format +msgid "Load Once: %s\n" +msgstr "ਇੱਕ ਵਾਰ ਲੋਡ ਕਰੋ: %s\n" + +#: ../src/daemon/dumpmodules.c:75 +#, c-format +msgid "DEPRECATION WARNING: %s\n" +msgstr "DEPRECATION WARNING: %s\n" + +#: ../src/daemon/dumpmodules.c:79 +#, c-format +msgid "Path: %s\n" +msgstr "ਪਾਥ: %s\n" + +#: ../src/daemon/daemon-conf.c:232 +#, c-format +msgid "[%s:%u] Invalid log target '%s'." +msgstr "[%s:%u] ਗਲਤ ਲਾਗ ਟਾਰਗੇਟ '%s'।" + +#: ../src/daemon/daemon-conf.c:248 +#, c-format +msgid "[%s:%u] Invalid log level '%s'." +msgstr "[%s:%u] ਗਲਤੀ ਲਾਗ ਲੈਵਲ '%s'।" + +#: ../src/daemon/daemon-conf.c:264 +#, c-format +msgid "[%s:%u] Invalid resample method '%s'." +msgstr "[%s:%u] ਅਢੁੱਕਵੀਂ ਰੀਸੈਂਪਲ ਢੰਗ '%s'।" + +#: ../src/daemon/daemon-conf.c:287 +#, c-format +msgid "[%s:%u] Invalid rlimit '%s'." +msgstr "[%s:%u] ਅਢੁੱਕਵੀਂ rlimit '%s'।" + +#: ../src/daemon/daemon-conf.c:294 +#, c-format +msgid "[%s:%u] rlimit not supported on this platform." +msgstr "[%s:%u] rlimit ਨੂੰ ਇਸ ਪਲੇਟਫਾਰਮ ਤੇ ਸਹਿਯੋਗ ਨਹੀਂ ਹੈ।" + +#: ../src/daemon/daemon-conf.c:310 +#, c-format +msgid "[%s:%u] Invalid sample format '%s'." +msgstr "[%s:%u] ਅਢੁੱਕਵਾਂ ਸੈਂਪਲ ਫਾਰਮੈਟ '%s'।" + +#: ../src/daemon/daemon-conf.c:328 +#, c-format +msgid "[%s:%u] Invalid sample rate '%s'." +msgstr "[%s:%u] ਅਢੁੱਕਵਾਂ ਸੈਂਪਲ ਰੇਟ '%s'।" + +#: ../src/daemon/daemon-conf.c:352 +#, c-format +msgid "[%s:%u] Invalid sample channels '%s'." +msgstr "[%s:%u] ਅਢੁੱਕਵਾਂ ਸੈਂਪਲ ਚੈਨਲ '%s'।" + +#: ../src/daemon/daemon-conf.c:370 +#, c-format +msgid "[%s:%u] Invalid channel map '%s'." +msgstr "[%s:%u] ਅਢੁੱਕਵਾਂ ਚੈਨਲ ਮੈਪ '%s'।" + +#: ../src/daemon/daemon-conf.c:388 +#, c-format +msgid "[%s:%u] Invalid number of fragments '%s'." +msgstr "[%s:%u] ਫਰੈਗਮੈਂਟਾਂ ਦਾ ਅਢੁੱਕਵਾਂ ਨੰਬਰ '%s'।" + +#: ../src/daemon/daemon-conf.c:406 +#, c-format +msgid "[%s:%u] Invalid fragment size '%s'." +msgstr "[%s:%u] ਅਢੁੱਕਵਾਂ ਫਰੈਗਮੈਂਟ ਅਕਾਰ '%s'।" + +#: ../src/daemon/daemon-conf.c:424 +#, c-format +msgid "[%s:%u] Invalid nice level '%s'." +msgstr "[%s:%u] ਅਢੁੱਕਵਾਂ nice ਲੈਵਲ '%s'।" + +#: ../src/daemon/daemon-conf.c:546 +#, c-format +msgid "Failed to open configuration file: %s" +msgstr "ਸੰਰਚਨਾ ਫਾਇਲ ਖੋਲ੍ਹਣ ਵਿੱਚ ਫੇਲ੍ਹ: %s" + +#: ../src/daemon/daemon-conf.c:562 +msgid "" +"The specified default channel map has a different number of channels than " +"the specified default number of channels." +msgstr "ਦਿੱਤੇ ਡਿਫਾਲਟ ਚੈਨਲ ਮੈਪ ਦੀ ਦਿੱਤੇਤ ਚੈਨਲ ਗਿਣਤੀ ਨਾਲੋਂ ਇੱਕ ਵੱਖਰੀ ਚੈਨਲ ਗਿਣਤੀ ਹੈ।" + +#: ../src/daemon/daemon-conf.c:638 +#, c-format +msgid "### Read from configuration file: %s ###\n" +msgstr "### ਸੰਰਚਨਾ ਫਾਇਲ ਵਿੱਚੋਂ ਪੜਿਆ: %s ###\n" + +#: ../src/daemon/caps.c:62 +msgid "Cleaning up privileges." +msgstr "ਅਧਿਕਾਰ ਹਟਾ ਰਿਹਾ ਹੈ।" + +#: ../src/daemon/pulseaudio.desktop.in.h:1 +msgid "PulseAudio Sound System" +msgstr "ਪਲਸਆਡੀਓ ਸਾਊਂਡ ਸਿਸਟਮ" + +#: ../src/daemon/pulseaudio.desktop.in.h:2 +msgid "Start the PulseAudio Sound System" +msgstr "ਪਲਸਆਡੀਓ ਸਾਊਂਡ ਸਿਸਟਮ ਚਲਾਓ" + +#: ../src/pulse/channelmap.c:105 ../src/pulse/channelmap.c:757 +msgid "Mono" +msgstr "ਮੋਨੋ" + +#: ../src/pulse/channelmap.c:107 +msgid "Front Center" +msgstr "ਅੱਗੇ ਸੈਂਟਰ" + +#: ../src/pulse/channelmap.c:108 +msgid "Front Left" +msgstr "ਅੱਗੇ ਖੱਬੇ" + +#: ../src/pulse/channelmap.c:109 +msgid "Front Right" +msgstr "ਅੱਗੇ ਸੱਜਾ" + +#: ../src/pulse/channelmap.c:111 +msgid "Rear Center" +msgstr "ਪਿੱਛੇ ਸੈਂਟਰ" + +#: ../src/pulse/channelmap.c:112 +msgid "Rear Left" +msgstr "ਪਿੱਛੇ ਖੱਬਾ" + +#: ../src/pulse/channelmap.c:113 +msgid "Rear Right" +msgstr "ਪਿੱਛੇ ਸੱਜਾ" + +#: ../src/pulse/channelmap.c:115 +msgid "Low Frequency Emmiter" +msgstr "ਘੱਟ ਫਰੀਕਿਊਂਸੀ ਇੱਮਟਰ" + +#: ../src/pulse/channelmap.c:117 +msgid "Front Left-of-center" +msgstr "ਅੱਗੇ ਸੈਂਟਰ ਦਾ ਖੱਬੇ" + +#: ../src/pulse/channelmap.c:118 +msgid "Front Right-of-center" +msgstr "ਅੱਗੇ ਸੈਂਟਰ ਦਾ ਸੱਜਾ" + +#: ../src/pulse/channelmap.c:120 +msgid "Side Left" +msgstr "ਖੱਬੇ ਪਾਸੇ" + +#: ../src/pulse/channelmap.c:121 +msgid "Side Right" +msgstr "ਸੱਜੇ ਪਾਸੇ" + +#: ../src/pulse/channelmap.c:123 +msgid "Auxiliary 0" +msgstr "ਐਗਜਿਲਰੀ 0" + +#: ../src/pulse/channelmap.c:124 +msgid "Auxiliary 1" +msgstr "ਐਗਜਿਲਰੀ 1" + +#: ../src/pulse/channelmap.c:125 +msgid "Auxiliary 2" +msgstr "ਐਗਜਿਲਰੀ 2" + +#: ../src/pulse/channelmap.c:126 +msgid "Auxiliary 3" +msgstr "ਐਗਜਿਲਰੀ 3" + +#: ../src/pulse/channelmap.c:127 +msgid "Auxiliary 4" +msgstr "ਐਗਜਿਲਰੀ 4" + +#: ../src/pulse/channelmap.c:128 +msgid "Auxiliary 5" +msgstr "ਐਗਜਿਲਰੀ 5" + +#: ../src/pulse/channelmap.c:129 +msgid "Auxiliary 6" +msgstr "ਐਗਜਿਲਰੀ 6" + +#: ../src/pulse/channelmap.c:130 +msgid "Auxiliary 7" +msgstr "ਐਗਜਿਲਰੀ 7" + +#: ../src/pulse/channelmap.c:131 +msgid "Auxiliary 8" +msgstr "ਐਗਜਿਲਰੀ 8" + +#: ../src/pulse/channelmap.c:132 +msgid "Auxiliary 9" +msgstr "ਐਗਜਿਲਰੀ 9" + +#: ../src/pulse/channelmap.c:133 +msgid "Auxiliary 10" +msgstr "ਐਗਜਿਲਰੀ 10" + +#: ../src/pulse/channelmap.c:134 +msgid "Auxiliary 11" +msgstr "ਐਗਜਿਲਰੀ 11" + +#: ../src/pulse/channelmap.c:135 +msgid "Auxiliary 12" +msgstr "ਐਗਜਿਲਰੀ 12" + +#: ../src/pulse/channelmap.c:136 +msgid "Auxiliary 13" +msgstr "ਐਗਜਿਲਰੀ 13" + +#: ../src/pulse/channelmap.c:137 +msgid "Auxiliary 14" +msgstr "ਐਗਜਿਲਰੀ 14" + +#: ../src/pulse/channelmap.c:138 +msgid "Auxiliary 15" +msgstr "ਐਗਜਿਲਰੀ 15" + +#: ../src/pulse/channelmap.c:139 +msgid "Auxiliary 16" +msgstr "ਐਗਜਿਲਰੀ 16" + +#: ../src/pulse/channelmap.c:140 +msgid "Auxiliary 17" +msgstr "ਐਗਜਿਲਰੀ 17" + +#: ../src/pulse/channelmap.c:141 +msgid "Auxiliary 18" +msgstr "ਐਗਜਿਲਰੀ 18" + +#: ../src/pulse/channelmap.c:142 +msgid "Auxiliary 19" +msgstr "ਐਗਜਿਲਰੀ 19" + +#: ../src/pulse/channelmap.c:143 +msgid "Auxiliary 20" +msgstr "ਐਗਜਿਲਰੀ 20" + +#: ../src/pulse/channelmap.c:144 +msgid "Auxiliary 21" +msgstr "ਐਗਜਿਲਰੀ 21" + +#: ../src/pulse/channelmap.c:145 +msgid "Auxiliary 22" +msgstr "ਐਗਜਿਲਰੀ 22" + +#: ../src/pulse/channelmap.c:146 +msgid "Auxiliary 23" +msgstr "ਐਗਜਿਲਰੀ 23" + +#: ../src/pulse/channelmap.c:147 +msgid "Auxiliary 24" +msgstr "ਐਗਜਿਲਰੀ 24" + +#: ../src/pulse/channelmap.c:148 +msgid "Auxiliary 25" +msgstr "ਐਗਜਿਲਰੀ 25" + +#: ../src/pulse/channelmap.c:149 +msgid "Auxiliary 26" +msgstr "ਐਗਜਿਲਰੀ 26" + +#: ../src/pulse/channelmap.c:150 +msgid "Auxiliary 27" +msgstr "ਐਗਜਿਲਰੀ 27" + +#: ../src/pulse/channelmap.c:151 +msgid "Auxiliary 28" +msgstr "ਐਗਜਿਲਰੀ 28" + +#: ../src/pulse/channelmap.c:152 +msgid "Auxiliary 29" +msgstr "ਐਗਜਿਲਰੀ 29" + +#: ../src/pulse/channelmap.c:153 +msgid "Auxiliary 30" +msgstr "ਐਗਜਿਲਰੀ 30" + +#: ../src/pulse/channelmap.c:154 +msgid "Auxiliary 31" +msgstr "ਐਗਜਿਲਰੀ 31" + +#: ../src/pulse/channelmap.c:156 +msgid "Top Center" +msgstr "ਉੱਤੇ ਕੇਂਦਰੀ" + +#: ../src/pulse/channelmap.c:158 +msgid "Top Front Center" +msgstr "ਉੱਤੇ ਅੱਗੇ ਸੈਂਟਰ" + +#: ../src/pulse/channelmap.c:159 +msgid "Top Front Left" +msgstr "ਉੱਤੇ ਅੱਗੇ ਖੱਬੇ" + +#: ../src/pulse/channelmap.c:160 +msgid "Top Front Right" +msgstr "ਉੱਤੇ ਅੱਗੇ ਸੱਜੇ" + +#: ../src/pulse/channelmap.c:162 +msgid "Top Rear Center" +msgstr "ਉੱਤੇ ਪਿੱਛੇ ਸੈਂਟਰ" + +#: ../src/pulse/channelmap.c:163 +msgid "Top Rear Left" +msgstr "ਉੱਤੇ ਪਿੱਛੇ ਖੱਬੇ" + +#: ../src/pulse/channelmap.c:164 +msgid "Top Rear Right" +msgstr "ਉੱਤੇ ਪਿੱਛੇ ਸੱਜੇ" + +#: ../src/pulse/channelmap.c:484 ../src/pulse/sample.c:170 +#: ../src/pulse/volume.c:295 ../src/pulse/volume.c:321 +#: ../src/pulse/volume.c:341 ../src/pulse/volume.c:371 +msgid "(invalid)" +msgstr "(ਅਢੁੱਕਵਾਂ)" + +#: ../src/pulse/channelmap.c:761 +msgid "Stereo" +msgstr "ਸਟੀਰੀਓ" + +#: ../src/pulse/channelmap.c:766 +msgid "Surround 4.0" +msgstr "ਸਰਾਊਂਡਿੰਗ 4.0" + +#: ../src/pulse/channelmap.c:772 +msgid "Surround 4.1" +msgstr "ਸਰਾਊਂਡਿੰਗ 4.1" + +#: ../src/pulse/channelmap.c:778 +msgid "Surround 5.0" +msgstr "ਸਰਾਊਂਡਿੰਗ 5.0" + +#: ../src/pulse/channelmap.c:784 +msgid "Surround 5.1" +msgstr "ਸਰਾਊਂਡਿੰਗ 5.1" + +#: ../src/pulse/channelmap.c:791 +msgid "Surround 7.1" +msgstr "ਸਰਾਊਂਡਿੰਗ 7.1" + +#: ../src/pulse/error.c:43 +msgid "OK" +msgstr "ਠੀਕ ਹੈ" + +#: ../src/pulse/error.c:44 +msgid "Access denied" +msgstr "ਅਸੈੱਸ ਪਾਬੰਦੀ ਹੈ" + +#: ../src/pulse/error.c:45 +msgid "Unknown command" +msgstr "ਅਣਜਾਣ ਕਮਾਂਡ" + +#: ../src/pulse/error.c:46 +msgid "Invalid argument" +msgstr "ਅਢੁੱਕਵਾਂ ਆਰਗੂਮੈਂਟ" + +#: ../src/pulse/error.c:47 +msgid "Entity exists" +msgstr "ਐਂਟਟੀ ਮੌਜੂਦ ਹੈ" + +#: ../src/pulse/error.c:48 +msgid "No such entity" +msgstr "ਕੋਈ ਐਂਟਟੀ ਨਹੀਂ" + +#: ../src/pulse/error.c:49 +msgid "Connection refused" +msgstr "ਕੁਨੈਕਸ਼ਨ ਤੋਂ ਇਨਕਾਰ" + +#: ../src/pulse/error.c:50 +msgid "Protocol error" +msgstr "ਪਰੋਟੋਕਾਲ ਗਲਤੀ" + +#: ../src/pulse/error.c:51 +msgid "Timeout" +msgstr "ਸਮਾਂ-ਸਮਾਪਤ" + +#: ../src/pulse/error.c:52 +msgid "No authorization key" +msgstr "ਕੋਈ ਪ੍ਰਮਾਣਿਕਤਾ ਕੁੰਜੀ ਨਹੀਂ" + +#: ../src/pulse/error.c:53 +msgid "Internal error" +msgstr "ਅੰਦਰੂਨੀ ਗਲਤੀ" + +#: ../src/pulse/error.c:54 +msgid "Connection terminated" +msgstr "ਕੁਨੈਕਸ਼ਨ ਖਤਮ ਕੀਤਾ" + +#: ../src/pulse/error.c:55 +msgid "Entity killed" +msgstr "ਐਂਟਟੀ ਖਤਮ ਹੋ ਗਈ" + +#: ../src/pulse/error.c:56 +msgid "Invalid server" +msgstr "ਅਢੁੱਕਵਾਂ ਸਰਵਰ" + +#: ../src/pulse/error.c:57 +msgid "Module initalization failed" +msgstr "ਮੋਡੀਊਲ ਸ਼ੁਰੂ ਕਰਨਾ ਫੇਲ੍ਹ" + +#: ../src/pulse/error.c:58 +msgid "Bad state" +msgstr "ਖਰਾਬ ਹਾਲਤ" + +#: ../src/pulse/error.c:59 +msgid "No data" +msgstr "ਕੋਈ ਡਾਟਾ ਨਹੀਂ" + +#: ../src/pulse/error.c:60 +msgid "Incompatible protocol version" +msgstr "ਨਾ-ਅਨੁਕੂਲ ਪਰੋਟੋਕਾਲ ਵਰਜਨ" + +#: ../src/pulse/error.c:61 +msgid "Too large" +msgstr "ਬਹੁਤ ਵੱਡਾ" + +#: ../src/pulse/error.c:62 +msgid "Not supported" +msgstr "ਸਹਾਇਕ ਨਹੀਂ" + +#: ../src/pulse/error.c:63 +msgid "Unknown error code" +msgstr "ਅਣਜਾਣ ਗਲਤੀ ਕੋਡ" + +#: ../src/pulse/error.c:64 +msgid "No such extension" +msgstr "ਕੋਈ ਅਜਿਹੀ ਇਕਸਟੈਂਸ਼ਨ ਨਹੀਂ" + +#: ../src/pulse/error.c:65 +msgid "Obsolete functionality" +msgstr "ਛੱਡੀ ਗਈ ਫੰਕਸ਼ਨੈਲਿਟੀ" + +#: ../src/pulse/error.c:66 +msgid "Missing implementation" +msgstr "ਗੈਰ-ਮੌਜੂਦ ਨਿਰਧਾਰਨ" + +#: ../src/pulse/error.c:67 +msgid "Client forked" +msgstr "ਕਲਾਇਟ ਅੱਡ ਕੀਤਾ" + +#: ../src/pulse/error.c:68 +msgid "Input/Output error" +msgstr "ਇੰਪੁੱਟ/ਆਊਟਪੁੱਟ ਗਲਤੀ" + +#: ../src/pulse/error.c:69 +msgid "Device or resource busy" +msgstr "ਜਤੰਰ ਜਾਂ ਸਰੋਤ ਵਰਤੋਂ ਅਧੀਨ ਹੈ" + +#: ../src/pulse/sample.c:172 +#, c-format +msgid "%s %uch %uHz" +msgstr "%s %uch %uHz" + +#: ../src/pulse/sample.c:184 +#, c-format +msgid "%0.1f GiB" +msgstr "%0.1f GiB" + +#: ../src/pulse/sample.c:186 +#, c-format +msgid "%0.1f MiB" +msgstr "%0.1f MiB" + +#: ../src/pulse/sample.c:188 +#, c-format +msgid "%0.1f KiB" +msgstr "%0.1f KiB" + +#: ../src/pulse/sample.c:190 +#, c-format +msgid "%u B" +msgstr "%u B" + +#: ../src/pulse/client-conf-x11.c:55 ../src/utils/pax11publish.c:100 +msgid "XOpenDisplay() failed" +msgstr "XOpenDisplay() ਫੇਲ੍ਹ ਹੈ" + +#: ../src/pulse/client-conf-x11.c:93 +msgid "Failed to parse cookie data" +msgstr "ਕੂਕੀ ਡਾਟਾ ਪਾਰਸ ਕਰਨ ਵਿੱਚ ਫੇਲ੍ਹ" + +#: ../src/pulse/client-conf.c:111 +#, c-format +msgid "Failed to open configuration file '%s': %s" +msgstr "ਸੰਰਚਨਾ ਫਾਇਲ '%s' ਨੂੰ ਖੋਲ੍ਹਣ ਵਿੱਚ ਫੇਲ੍ਹ: %s" + +#: ../src/pulse/context.c:550 +msgid "No cookie loaded. Attempting to connect without." +msgstr "ਕੋਈ ਕੂਕੀ ਲੋਡ ਨਹੀਂ ਕੀਤੀ। ਇਸ ਤੋਂ ਬਿਨਾਂ ਕੁਨੈਕਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ।" + +#: ../src/pulse/context.c:693 +#, c-format +msgid "fork(): %s" +msgstr "fork(): %s" + +#: ../src/pulse/context.c:748 +#, c-format +msgid "waitpid(): %s" +msgstr "waitpid(): %s" + +#: ../src/pulse/context.c:1438 +#, c-format +msgid "Received message for unknown extension '%s'" +msgstr "ਅਣਜਾਣੀ ਇਕਸਟੈਂਸ਼ਨ '%s' ਲਈ ਸੁਨੇਹਾ ਮਿਲਿਆ ਹੈ" + +#: ../src/utils/pacat.c:108 +#, c-format +msgid "Failed to drain stream: %s" +msgstr "ਸਟਰੀਮ ਡਰੇਨ ਫੇਲ੍ਹ ਹੋਇਆ: %s" + +#: ../src/utils/pacat.c:113 +msgid "Playback stream drained." +msgstr "ਪਲੇਬੈਕ ਸਟਰੀਮ ਡਰੇਨ ਕੀਤੀ।" + +#: ../src/utils/pacat.c:123 +msgid "Draining connection to server." +msgstr "ਸਰਵਰ ਨਾਲ ਕੁਨੈਕਸ਼ਨ ਡਰੇਨ ਹੋ ਰਿਹਾ ਹੈ।" + +#: ../src/utils/pacat.c:136 +#, c-format +msgid "pa_stream_drain(): %s" +msgstr "pa_stream_drain(): %s" + +#: ../src/utils/pacat.c:159 +#, c-format +msgid "pa_stream_write() failed: %s" +msgstr "pa_stream_write() ਫੇਲ੍ਹ ਹੈ: %s" + +#: ../src/utils/pacat.c:197 +#, c-format +msgid "pa_stream_begin_write() failed: %s" +msgstr "pa_stream_write() ਫੇਲ੍ਹ ਹੈ: %s" + +#: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267 +#, c-format +msgid "pa_stream_peek() failed: %s" +msgstr "pa_stream_peek() ਫੇਲ੍ਹ ਹੈ: %s" + +#: ../src/utils/pacat.c:307 +msgid "Stream successfully created." +msgstr "ਸਟਰੀਮ ਸਫਲਤਾਪੂਰਕ ਬਣ ਗਈ ਹੈ।" + +#: ../src/utils/pacat.c:310 +#, c-format +msgid "pa_stream_get_buffer_attr() failed: %s" +msgstr "pa_stream_get_buffer_attr() ਫੇਲ੍ਹ ਹੈ: %s" + +#: ../src/utils/pacat.c:314 +#, c-format +msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u" +msgstr "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u" + +#: ../src/utils/pacat.c:317 +#, c-format +msgid "Buffer metrics: maxlength=%u, fragsize=%u" +msgstr "Buffer metrics: maxlength=%u, fragsize=%u" + +#: ../src/utils/pacat.c:321 +#, c-format +msgid "Using sample spec '%s', channel map '%s'." +msgstr "ਸਧਾਰਨ spec '%s', ਚੈਨਲ ਮੈਪ '%s' ਦੀ ਵਰਤੋਂ।" + +#: ../src/utils/pacat.c:325 +#, c-format +msgid "Connected to device %s (%u, %ssuspended)." +msgstr "%s ਜੰਤਰ ਨਾਲ ਕੁਨਕੈਟ ਕੀਤਾ (%u, %ssuspended)।" + +#: ../src/utils/pacat.c:335 +#, c-format +msgid "Stream error: %s" +msgstr "ਸਟਰੀਮ ਗਲਤੀ: %s" + +#: ../src/utils/pacat.c:345 +#, c-format +msgid "Stream device suspended.%s" +msgstr "ਸਟਰੀਮ ਜੰਤਰ ਸਸਪੈਂਡ ਕੀਤਾ ਹੈ।%s" + +#: ../src/utils/pacat.c:347 +#, c-format +msgid "Stream device resumed.%s" +msgstr "ਸਟਰੀਮ ਜੰਤਰ ਮੁੜ-ਪ੍ਰਾਪਤ ਕੀਤਾ।%s" + +#: ../src/utils/pacat.c:355 +#, c-format +msgid "Stream underrun.%s" +msgstr "ਸਟਰੀਮ ਅੰਡਰਰਨ।%s" + +#: ../src/utils/pacat.c:362 +#, c-format +msgid "Stream overrun.%s" +msgstr "ਸਟਰੀਮ ਓਵਰਰਨ।%s" + +#: ../src/utils/pacat.c:369 +#, c-format +msgid "Stream started.%s" +msgstr "ਸਟਰੀਮ ਸ਼ੁਰੂ ਕੀਤੀ। %s" + +#: ../src/utils/pacat.c:376 +#, c-format +msgid "Stream moved to device %s (%u, %ssuspended).%s" +msgstr "ਸਟਰੀਮ ਨੂੰ ਜੰਤਰ %s ਤੋਂ ਤਬਦੀਲ ਕੀਤਾ ਗਿਆ ਹੈ (%u, %ssuspended)।%s" + +#: ../src/utils/pacat.c:376 +msgid "not " +msgstr "ਨਹੀਂ " + +#: ../src/utils/pacat.c:383 +#, c-format +msgid "Stream buffer attributes changed.%s" +msgstr "ਸਟਰੀਮ ਬਫਰ ਐਟਰੀਬਿਊਟ ਤਬਦੀਲ ਕੀਤੇ ਗਏ।%s" + +#: ../src/utils/pacat.c:415 +#, c-format +msgid "Connection established.%s" +msgstr "ਕੁਨੈਕਸ਼ਨ ਬਣ ਗਿਆ।%s" + +#: ../src/utils/pacat.c:418 +#, c-format +msgid "pa_stream_new() failed: %s" +msgstr "pa_stream_new() ਫੇਲ੍ਹ ਹੈ: %s" + +#: ../src/utils/pacat.c:450 +#, c-format +msgid "pa_stream_connect_playback() failed: %s" +msgstr "pa_stream_connect_playback() ਫੇਲ੍ਹ ਹੈ: %s" + +#: ../src/utils/pacat.c:456 +#, c-format +msgid "pa_stream_connect_record() failed: %s" +msgstr "pa_stream_connect_record() ਫੇਲ੍ਹ ਹੈ: %s" + +#: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857 +#, c-format +msgid "Connection failure: %s" +msgstr "ਕੁਨੈਕਸ਼ਨ ਫੇਲ: %s" + +#: ../src/utils/pacat.c:503 +msgid "Got EOF." +msgstr "EOF ਮਿਲਿਆ।" + +#: ../src/utils/pacat.c:540 +#, c-format +msgid "write() failed: %s" +msgstr "write() ਫੇਲ੍ਹ ਹੈ: %s" + +#: ../src/utils/pacat.c:561 +msgid "Got signal, exiting." +msgstr "ਸਿਗਨਲ ਮਿਲਿਆ, ਬੰਦ ਹੋ ਰਿਹਾ ਹੈ।" + +#: ../src/utils/pacat.c:575 +#, c-format +msgid "Failed to get latency: %s" +msgstr "ਵਕਫਾ ਪ੍ਰਾਪਤੀ ਫੇਲ ਹੋਈ: %s" + +#: ../src/utils/pacat.c:580 +#, c-format +msgid "Time: %0.3f sec; Latency: %0.0f usec." +msgstr "ਟਾਈਮ: %0.3f ਸਕਿੰਟ; ਵਕਫਾ: %0.0f usec।" + +#: ../src/utils/pacat.c:599 +#, c-format +msgid "pa_stream_update_timing_info() failed: %s" +msgstr "pa_stream_update_timing_info() ਫੇਲ੍ਹ ਹੈ: %s" + +#: ../src/utils/pacat.c:609 +#, c-format +msgid "" +"%s [options]\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -r, --record Create a connection for recording\n" +" -p, --playback Create a connection for playback\n" +"\n" +" -v, --verbose Enable verbose operations\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -d, --device=DEVICE The name of the sink/source to " +"connect to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" +" --stream-name=NAME How to call this stream on the " +"server\n" +" --volume=VOLUME Specify the initial (linear) volume " +"in range 0...65536\n" +" --rate=SAMPLERATE The sample rate in Hz (defaults to " +"44100)\n" +" --format=SAMPLEFORMAT The sample type, one of s16le, " +"s16be, u8, float32le,\n" +" float32be, ulaw, alaw, s32le, s32be, " +"s24le, s24be,\n" +" s24-32le, s24-32be (defaults to " +"s16ne)\n" +" --channels=CHANNELS The number of channels, 1 for mono, " +"2 for stereo\n" +" (defaults to 2)\n" +" --channel-map=CHANNELMAP Channel map to use instead of the " +"default\n" +" --fix-format Take the sample format from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-rate Take the sampling rate from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-channels Take the number of channels and the " +"channel map\n" +" from the sink the stream is being " +"connected to.\n" +" --no-remix Don't upmix or downmix channels.\n" +" --no-remap Map channels by index instead of " +"name.\n" +" --latency=BYTES Request the specified latency in " +"bytes.\n" +" --process-time=BYTES Request the specified process time " +"per request in bytes.\n" +" --property=PROPERTY=VALUE Set the specified property to the " +"specified value.\n" +" --raw Record/play raw PCM data.\n" +" --file-format=FFORMAT Record/play formatted PCM data.\n" +" --list-file-formats List available file formats.\n" +msgstr "" +"%s [options]\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -r, --record Create a connection for recording\n" +" -p, --playback Create a connection for playback\n" +"\n" +" -v, --verbose Enable verbose operations\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -d, --device=DEVICE The name of the sink/source to " +"connect to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" +" --stream-name=NAME How to call this stream on the " +"server\n" +" --volume=VOLUME Specify the initial (linear) volume " +"in range 0...65536\n" +" --rate=SAMPLERATE The sample rate in Hz (defaults to " +"44100)\n" +" --format=SAMPLEFORMAT The sample type, one of s16le, " +"s16be, u8, float32le,\n" +" float32be, ulaw, alaw, s32le, s32be, " +"s24le, s24be,\n" +" s24-32le, s24-32be (defaults to " +"s16ne)\n" +" --channels=CHANNELS The number of channels, 1 for mono, " +"2 for stereo\n" +" (defaults to 2)\n" +" --channel-map=CHANNELMAP Channel map to use instead of the " +"default\n" +" --fix-format Take the sample format from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-rate Take the sampling rate from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-channels Take the number of channels and the " +"channel map\n" +" from the sink the stream is being " +"connected to.\n" +" --no-remix Don't upmix or downmix channels.\n" +" --no-remap Map channels by index instead of " +"name.\n" +" --latency=BYTES Request the specified latency in " +"bytes.\n" +" --process-time=BYTES Request the specified process time " +"per request in bytes.\n" +" --property=PROPERTY=VALUE Set the specified property to the " +"specified value.\n" +" --raw Record/play raw PCM data.\n" +" --file-format=FFORMAT Record/play formatted PCM data.\n" +" --list-file-formats List available file formats.\n" + +#: ../src/utils/pacat.c:731 +#, c-format +msgid "" +"pacat %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pacat %s\n" +"libpulse %s ਦੇ ਕੰਪਾਇਲ\n" +"libpulse %s ਨਾਲ ਲਿੰਕ ਕੀਤਾ\n" + +#: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953 +#, c-format +msgid "Invalid client name '%s'" +msgstr "ਅਢੁੱਕਵਾਂ ਚੈਨਲ ਮੈਪ '%s'" + +#: ../src/utils/pacat.c:779 +#, c-format +msgid "Invalid stream name '%s'" +msgstr "ਅਢੁੱਕਵਾਂ ਰੀਸੈਂਪਲ ਢੰਗ '%s'" + +#: ../src/utils/pacat.c:816 +#, c-format +msgid "Invalid channel map '%s'" +msgstr "ਅਢੁੱਕਵਾਂ ਚੈਨਲ ਮੈਪ '%s'" + +#: ../src/utils/pacat.c:845 +#, c-format +msgid "Invalid latency specification '%s'" +msgstr "ਅਢੁੱਕਵਾਂ ਵਕਫਾ ਹਦਾਇਤ '%s'" + +#: ../src/utils/pacat.c:852 +#, c-format +msgid "Invalid process time specification '%s'" +msgstr "ਅਢੁੱਕਵਾਂ ਪਰੋਸੈੱਸ ਟਾਈਮ ਹਦਾਇਤ '%s'" + +#: ../src/utils/pacat.c:864 +#, c-format +msgid "Invalid property '%s'" +msgstr "ਅਢੁੱਕਵਾਂ ਰੀਸੈਂਪਲ ਢੰਗ '%s'" + +#: ../src/utils/pacat.c:881 +#, c-format +msgid "Unknown file format %s." +msgstr "ਅਣਜਾਣ ਫਾਇਲ ਫਾਰਮੈਟ %s" + +#: ../src/utils/pacat.c:900 +msgid "Invalid sample specification" +msgstr "ਅਢੁੱਕਵਾਂ ਸੈਂਪਲ ਹਦਾਇਤ" + +#: ../src/utils/pacat.c:910 +#, c-format +msgid "open(): %s" +msgstr "open(): %s" + +#: ../src/utils/pacat.c:915 +#, c-format +msgid "dup2(): %s" +msgstr "dup2(): %s" + +#: ../src/utils/pacat.c:922 +msgid "Too many arguments." +msgstr "ਬਹੁਤ ਵੱਧ ਆਰਗੂਮੈਂਟ।" + +#: ../src/utils/pacat.c:933 +msgid "Failed to generate sample specification for file." +msgstr "ਸੈਂਪਲ ਜਾਣਕਾਰੀ ਲੈਣ ਵਿੱਚ ਫੇਲ: %s" + +#: ../src/utils/pacat.c:953 +msgid "Failed to open audio file." +msgstr "ਸਾਊਂਡ ਫਾਇਲ ਖੋਲ੍ਹਣ ਲਈ ਫੇਲ੍ਹ ਹੈ।" + +#: ../src/utils/pacat.c:959 +msgid "" +"Warning: specified sample specification will be overwritten with " +"specification from file." +msgstr "ਇੱਕ %s ਸਟਰੀਮ ਨੂੰ ਸੈਂਪਲ ਹਦਾਇਤ '%s' ਨਾਲ ਖੋਲ੍ਹਿਆ ਜਾ ਰਿਹਾ ਹੈ।" + +#: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997 +msgid "Failed to determine sample specification from file." +msgstr "ਸੈਂਪਲ ਜਾਣਕਾਰੀ ਲੈਣ ਵਿੱਚ ਫੇਲ: %s" + +#: ../src/utils/pacat.c:971 +msgid "Warning: Failed to determine channel map from file." +msgstr "ਇੱਕ %s ਸਟਰੀਮ ਨੂੰ ਸੈਂਪਲ ਹਦਾਇਤ '%s' ਨਾਲ ਖੋਲ੍ਹਿਆ ਜਾ ਰਿਹਾ ਹੈ।" + +#: ../src/utils/pacat.c:982 +msgid "Channel map doesn't match sample specification" +msgstr "ਚੈਨਲ ਮੈਪ ਸੈਂਪਲ ਹਦਾਇਤ ਨਾਲ ਨਹੀਂ ਮਿਲਦਾ" + +#: ../src/utils/pacat.c:993 +msgid "Warning: failed to write channel map to file." +msgstr "ਇੱਕ %s ਸਟਰੀਮ ਨੂੰ ਸੈਂਪਲ ਹਦਾਇਤ '%s' ਨਾਲ ਖੋਲ੍ਹਿਆ ਜਾ ਰਿਹਾ ਹੈ।" + +#: ../src/utils/pacat.c:1008 +#, c-format +msgid "" +"Opening a %s stream with sample specification '%s' and channel map '%s'." +msgstr "ਇੱਕ %s ਸਟਰੀਮ ਨੂੰ ਸੈਂਪਲ ਹਦਾਇਤ '%s' ਅਤੇ ਚੈਨਲ ਮੈਪ '%s' ਨਾਲ ਖੋਲ੍ਹਿਆ ਜਾ ਰਿਹਾ ਹੈ।" + +#: ../src/utils/pacat.c:1009 +msgid "recording" +msgstr "ਰਿਕਾਰਡਿੰਗ" + +#: ../src/utils/pacat.c:1009 +msgid "playback" +msgstr "ਪਲੇਅਬੈਕ" + +#: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267 +msgid "pa_mainloop_new() failed." +msgstr "pa_mainloop_new() ਫੇਲ੍ਹ ਹੈ।" + +#: ../src/utils/pacat.c:1054 +msgid "io_new() failed." +msgstr "io_new() ਫੇਲ੍ਹ ਹੈ।" + +#: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279 +msgid "pa_context_new() failed." +msgstr "pa_context_new() ਫੇਲ੍ਹ ਹੈ।" + +#: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285 +#, c-format +msgid "pa_context_connect() failed: %s" +msgstr "pa_context_connect() ਫੇਲ੍ਹ ਹੈ: %s" + +#: ../src/utils/pacat.c:1075 +msgid "pa_context_rttime_new() failed." +msgstr "pa_context_new() ਫੇਲ੍ਹ ਹੈ।" + +#: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290 +msgid "pa_mainloop_run() failed." +msgstr "pa_mainloop_run() ਫੇਲ੍ਹ ਹੈ।" + +#: ../src/utils/pasuspender.c:81 +#, c-format +msgid "fork(): %s\n" +msgstr "fork(): %s\n" + +#: ../src/utils/pasuspender.c:92 +#, c-format +msgid "execvp(): %s\n" +msgstr "execvp(): %s\n" + +#: ../src/utils/pasuspender.c:109 +#, c-format +msgid "Failure to suspend: %s\n" +msgstr "ਸਸਪੈਂਡ ਕਰਨ ਵਿੱਚ ਫੇਲ: %s\n" + +#: ../src/utils/pasuspender.c:124 +#, c-format +msgid "Failure to resume: %s\n" +msgstr "ਮੁੜ-ਪ੍ਰਾਪਤੀ ਫੇਲ: %s\n" + +#: ../src/utils/pasuspender.c:147 +#, c-format +msgid "WARNING: Sound server is not local, not suspending.\n" +msgstr "ਚੇਤਾਵਨੀ: ਸਾਊਂਡ ਸਰਵਰ ਲੋਕਲ ਨਹੀਂ ਹੈ, ਸਸਪੈਂਡ ਨਹੀਂ ਹੋ ਰਿਹਾ।\n" + +#: ../src/utils/pasuspender.c:159 +#, c-format +msgid "Connection failure: %s\n" +msgstr "ਕੁਨੈਕਸ਼ਨ ਫੇਲ: %s\n" + +#: ../src/utils/pasuspender.c:176 +#, c-format +msgid "Got SIGINT, exiting.\n" +msgstr "SIGINT ਮਿਲਿਆ, ਬੰਦ ਹੋ ਰਿਹਾ ਹੈ।\n" + +#: ../src/utils/pasuspender.c:194 +#, c-format +msgid "WARNING: Child process terminated by signal %u\n" +msgstr "ਚੇਤਾਵਨੀ: ਚਲਾਈਡ ਪਰੋਸੈੱਸ ਨੂੰ ਸਿਗਨਲ %u ਵਲੋਂ ਬੰਦ ਕੀਤਾ ਗਿਆ ਹੈ\n" + +#: ../src/utils/pasuspender.c:212 +#, c-format +msgid "" +"%s [options] ... \n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +"\n" +msgstr "" +"%s [options] ... \n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +"\n" + +#: ../src/utils/pasuspender.c:248 +#, c-format +msgid "" +"pasuspender %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pasuspender %s\n" +"libpulse %s ਨਾਲ ਕੰਪਾਇਲ\n" +"libpulse %s ਨਾਲ ਲਿੰਕ\n" + +#: ../src/utils/pasuspender.c:277 +#, c-format +msgid "pa_mainloop_new() failed.\n" +msgstr "pa_mainloop_new() ਫੇਲ੍ਹ ਹੈ।\n" + +#: ../src/utils/pasuspender.c:290 +#, c-format +msgid "pa_context_new() failed.\n" +msgstr "pa_context_new() ਫੇਲ੍ਹ ਹੈ।\n" + +#: ../src/utils/pasuspender.c:298 +#, c-format +msgid "pa_mainloop_run() failed.\n" +msgstr "pa_mainloop_run() ਫੇਲ੍ਹ ਹੈ।\n" + +#: ../src/utils/pactl.c:135 +#, c-format +msgid "Failed to get statistics: %s" +msgstr "ਅੰਕੜੇ ਪ੍ਰਾਪਤੀ ਫੇਲ੍ਹ: %s" + +#: ../src/utils/pactl.c:141 +#, c-format +msgid "Currently in use: %u blocks containing %s bytes total.\n" +msgstr "ਹੁਣ ਵਰਤੋਂ ਵਿੱਚ ਹੈ: %u ਬਲਾਕ ਵਿੱਚ ਕੁੱਲ %s ਬਾਈਟ ਹਨ।\n" + +#: ../src/utils/pactl.c:144 +#, c-format +msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n" +msgstr "ਪੂਰੇ ਲਾਈਫਟਾਈਮ ਵਿੱਚ ਜਾਰੀ ਕੀਤਾ ਗਿਆ: %u ਬਲਾਕ ਵਿੱਚ ਕੁੱਲ %s ਬਾਈਟ ਹਨ।\n" + +#: ../src/utils/pactl.c:147 +#, c-format +msgid "Sample cache size: %s\n" +msgstr "ਸੈਂਪਲ ਕੈਸ਼ ਸਾਈਜ਼: %s\n" + +#: ../src/utils/pactl.c:156 +#, c-format +msgid "Failed to get server information: %s" +msgstr "ਸਰਵਰ ਜਾਣਕਾਰੀ ਪ੍ਰਾਪਤ ਕਰਨ ਵਿੱਚ ਫੇਲ ਹੋਇਆ: %s" + +#: ../src/utils/pactl.c:164 +#, c-format +msgid "" +"User name: %s\n" +"Host Name: %s\n" +"Server Name: %s\n" +"Server Version: %s\n" +"Default Sample Specification: %s\n" +"Default Channel Map: %s\n" +"Default Sink: %s\n" +"Default Source: %s\n" +"Cookie: %08x\n" +msgstr "" +"User name: %s\n" +"Host Name: %s\n" +"Server Name: %s\n" +"Server Version: %s\n" +"Default Sample Specification: %s\n" +"Default Channel Map: %s\n" +"Default Sink: %s\n" +"Default Source: %s\n" +"Cookie: %08x\n" + +#: ../src/utils/pactl.c:205 +#, c-format +msgid "Failed to get sink information: %s" +msgstr "ਸਿੰਕ ਜਾਣਕਾਰੀ ਲੈਣ ਵਿੱਚ ਫੇਲ੍ਹ: %s" + +#: ../src/utils/pactl.c:221 +#, c-format +msgid "" +"Sink #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor Source: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Sink #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor Source: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360 +#, c-format +msgid "\tPorts:\n" +msgstr "\tਪੋਰਟ:\n" + +#: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366 +#, c-format +msgid "\tActive Port: %s\n" +msgstr "\tਸਰਗਰਮ ਪੋਰਟ: %s\n" + +#: ../src/utils/pactl.c:297 +#, c-format +msgid "Failed to get source information: %s" +msgstr "ਸਰੋਤ ਜਾਣਕਾਰੀ ਲੈਣ ਵਿੱਚ ਫੇਲ: %s" + +#: ../src/utils/pactl.c:313 +#, c-format +msgid "" +"Source #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor of Sink: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Source #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor of Sink: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:345 ../src/utils/pactl.c:401 ../src/utils/pactl.c:436 +#: ../src/utils/pactl.c:473 ../src/utils/pactl.c:532 ../src/utils/pactl.c:533 +#: ../src/utils/pactl.c:543 ../src/utils/pactl.c:587 ../src/utils/pactl.c:588 +#: ../src/utils/pactl.c:594 ../src/utils/pactl.c:637 ../src/utils/pactl.c:638 +#: ../src/utils/pactl.c:645 +msgid "n/a" +msgstr "ਉਪਲੱਬਧ ਨਹੀਂ" + +#: ../src/utils/pactl.c:375 +#, c-format +msgid "Failed to get module information: %s" +msgstr "ਮੋਡੀਊਲ ਜਾਣਕਾਰੀ ਲੈਣ ਵਿੱਚ ਫੇਲ: %s" + +#: ../src/utils/pactl.c:393 +#, c-format +msgid "" +"Module #%u\n" +"\tName: %s\n" +"\tArgument: %s\n" +"\tUsage counter: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Module #%u\n" +"\tName: %s\n" +"\tArgument: %s\n" +"\tUsage counter: %s\n" +"\tProperties:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:412 +#, c-format +msgid "Failed to get client information: %s" +msgstr "ਕਲਾਇਟ ਜਾਣਕਾਰੀ ਲੈਣ ਵਿੱਚ ਫੇਲ: %s" + +#: ../src/utils/pactl.c:430 +#, c-format +msgid "" +"Client #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Client #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:447 +#, c-format +msgid "Failed to get card information: %s" +msgstr "ਕਾਰਡ ਜਾਣਕਾਰੀ ਲੈਣ ਵਿੱਚ ਫੇਲ: %s" + +#: ../src/utils/pactl.c:465 +#, c-format +msgid "" +"Card #%u\n" +"\tName: %s\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Card #%u\n" +"\tName: %s\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:479 +#, c-format +msgid "\tProfiles:\n" +msgstr "\tਪਰੋਫਾਈਲ:\n" + +#: ../src/utils/pactl.c:485 +#, c-format +msgid "\tActive Profile: %s\n" +msgstr "\tਸਰਗਰਮ ਪਰੋਫਾਈਲ: %s\n" + +#: ../src/utils/pactl.c:496 +#, c-format +msgid "Failed to get sink input information: %s" +msgstr "ਇੰਪੁੱਟ ਜਾਣਕਾਰੀ ਲੈਣ ਵਿੱਚ ਫੇਲ੍ਹ: %s" + +#: ../src/utils/pactl.c:515 +#, c-format +msgid "" +"Sink Input #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSink: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tMute: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSink Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Sink Input #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSink: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tMute: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSink Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:554 +#, c-format +msgid "Failed to get source output information: %s" +msgstr "ਸਰੋਤ ਆਉਟਪੁੱਟ ਜਾਣਕਾਰੀ ਲੈਣ ਵਿੱਚ ਫੇਲ: %s" + +#: ../src/utils/pactl.c:574 +#, c-format +msgid "" +"Source Output #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSource: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSource Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Source Output #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSource: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSource Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:605 +#, c-format +msgid "Failed to get sample information: %s" +msgstr "ਸੈਂਪਲ ਜਾਣਕਾਰੀ ਲੈਣ ਵਿੱਚ ਫੇਲ: %s" + +#: ../src/utils/pactl.c:623 +#, c-format +msgid "" +"Sample #%u\n" +"\tName: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tDuration: %0.1fs\n" +"\tSize: %s\n" +"\tLazy: %s\n" +"\tFilename: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Sample #%u\n" +"\tName: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tDuration: %0.1fs\n" +"\tSize: %s\n" +"\tLazy: %s\n" +"\tFilename: %s\n" +"\tProperties:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663 +#, c-format +msgid "Failure: %s" +msgstr "ਫੇਲ੍ਹ: %s" + +#: ../src/utils/pactl.c:687 +#, c-format +msgid "Failed to upload sample: %s" +msgstr "ਸੈਂਪਲ ਅੱਪਲੋਡ ਕਰਨ ਵਿੱਚ ਫੇਲ: %s" + +#: ../src/utils/pactl.c:704 +msgid "Premature end of file" +msgstr "ਫਾਇਲ ਦਾ ਸਮੇਂ ਤੋਂ ਪਹਿਲਾਂ ਅੰਤ" + +#: ../src/utils/pactl.c:863 +msgid "Got SIGINT, exiting." +msgstr "SIGINT ਮਿਲਿਆ, ਬੰਦ ਹੋ ਰਿਹਾ ਹੈ।" + +#: ../src/utils/pactl.c:869 +#, c-format +msgid "" +"%s [options] stat\n" +"%s [options] list\n" +"%s [options] exit\n" +"%s [options] upload-sample FILENAME [NAME]\n" +"%s [options] play-sample NAME [SINK]\n" +"%s [options] remove-sample NAME\n" +"%s [options] move-sink-input SINKINPUT SINK\n" +"%s [options] move-source-output SOURCEOUTPUT SOURCE\n" +"%s [options] load-module NAME [ARGS ...]\n" +"%s [options] unload-module MODULE\n" +"%s [options] suspend-sink SINK 1|0\n" +"%s [options] suspend-source SOURCE 1|0\n" +"%s [options] set-card-profile CARD PROFILE\n" +"%s [options] set-sink-port SINK PORT\n" +"%s [options] set-source-port SOURCE PORT\n" +"%s [options] set-sink-volume SINK VOLUME\n" +"%s [options] set-source-volume SOURCE VOLUME\n" +"%s [options] set-sink-input-volume SINKINPUT VOLUME\n" +"%s [options] set-sink-mute SINK 1|0\n" +"%s [options] set-source-mute SOURCE 1|0\n" +"%s [options] set-sink-input-mute SINKINPUT 1|0\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" +msgstr "" +"%s [options] stat\n" +"%s [options] list\n" +"%s [options] exit\n" +"%s [options] upload-sample FILENAME [NAME]\n" +"%s [options] play-sample NAME [SINK]\n" +"%s [options] remove-sample NAME\n" +"%s [options] move-sink-input SINKINPUT SINK\n" +"%s [options] move-source-output SOURCEOUTPUT SOURCE\n" +"%s [options] load-module NAME [ARGS ...]\n" +"%s [options] unload-module MODULE\n" +"%s [options] suspend-sink SINK 1|0\n" +"%s [options] suspend-source SOURCE 1|0\n" +"%s [options] set-card-profile CARD PROFILE\n" +"%s [options] set-sink-port SINK PORT\n" +"%s [options] set-source-port SOURCE PORT\n" +"%s [options] set-sink-volume SINK VOLUME\n" +"%s [options] set-source-volume SOURCE VOLUME\n" +"%s [options] set-sink-input-volume SINKINPUT VOLUME\n" +"%s [options] set-sink-mute SINK 1|0\n" +"%s [options] set-source-mute SOURCE 1|0\n" +"%s [options] set-sink-input-mute SINKINPUT 1|0\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" + +#: ../src/utils/pactl.c:933 +#, c-format +msgid "" +"pactl %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pactl %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" + +#: ../src/utils/pactl.c:979 +msgid "Please specify a sample file to load" +msgstr "ਲੋਡ ਕਰਨ ਲਈ ਸੈਂਪਲ ਫਾਇਲ ਦਿਓ" + +#: ../src/utils/pactl.c:992 +msgid "Failed to open sound file." +msgstr "ਸਾਊਂਡ ਫਾਇਲ ਖੋਲ੍ਹਣ ਲਈ ਫੇਲ੍ਹ ਹੈ।" + +#: ../src/utils/pactl.c:1004 +msgid "Warning: Failed to determine sample specification from file." +msgstr "ਇੱਕ %s ਸਟਰੀਮ ਨੂੰ ਸੈਂਪਲ ਹਦਾਇਤ '%s' ਨਾਲ ਖੋਲ੍ਹਿਆ ਜਾ ਰਿਹਾ ਹੈ।" + +#: ../src/utils/pactl.c:1014 +msgid "You have to specify a sample name to play" +msgstr "ਖੇਡਣ ਲਈ ਤੁਹਾਨੂੰ ਸੈਂਪਲ ਨਾਂ ਦੇਣਾ ਪਵੇਗਾ" + +#: ../src/utils/pactl.c:1026 +msgid "You have to specify a sample name to remove" +msgstr "ਹਟਾਉਣ ਲਈ ਤੁਹਾਨੂੰ ਸੈਂਪਲ ਨਾਂ ਦੇਣਾ ਪਵੇਗਾ" + +#: ../src/utils/pactl.c:1035 +msgid "You have to specify a sink input index and a sink" +msgstr "ਤੁਹਾਨੂੰ ਇੰਪੁੱਟ ਲਿਸਟ ਅਤੇ ਇੱਕ ਸਿੰਕ ਨੂੰ ਸਿੰਕ ਕਰਨਾ ਪਵੇਗਾ" + +#: ../src/utils/pactl.c:1045 +msgid "You have to specify a source output index and a source" +msgstr "ਤੁਹਾਨੂੰ ਇੱਕ ਸਰੋਤ ਆਉਟਪੁੱਟ ਲਿਸਟ ਅਤੇ ਇੱਕ ਸਰੋਤ ਦੇਣਾ ਪਵੇਗਾ" + +#: ../src/utils/pactl.c:1060 +msgid "You have to specify a module name and arguments." +msgstr "ਤੁਹਾਨੂੰ ਇੱਕ ਮੋਡੀਊਲ ਨਾਂ ਅਤੇ ਆਰਗੂਮੈਂਟ ਦੇਣਾ ਪਵੇਗਾ।" + +#: ../src/utils/pactl.c:1080 +msgid "You have to specify a module index" +msgstr "ਤੁਹਾਨੂੰ ਇੱਕ ਮੈਡੀਊਲ ਲਿਸਟ ਦੇਣੀ ਪਵੇਗੀ" + +#: ../src/utils/pactl.c:1090 +msgid "" +"You may not specify more than one sink. You have to specify a boolean value." +msgstr "ਤੁਸੀਂ ਇੱਕ ਤੋਂ ਵੱਧ ਸਿੰਕ ਨਹੀਂ ਦੇ ਸਕਦੇ। ਤੁਹਾਨੂੰ ਇੱਕ ਬੁਲੀਅਨ ਮੁੱਲ ਦੇਣਾ ਪਵੇਗਾ।" + +#: ../src/utils/pactl.c:1103 +msgid "" +"You may not specify more than one source. You have to specify a boolean " +"value." +msgstr "ਤੁਸੀਂ ਇੱਕ ਤੋਂ ਵੱਧ ਸਰੋਤ ਨਹੀਂ ਦੇ ਸਕਦੇ। ਤੁਹਾਨੂੰ ਬੁਲੀਅਨ ਮੁੱਲ ਦੇਣਾ ਪਵੇਗਾ।" + +#: ../src/utils/pactl.c:1115 +msgid "You have to specify a card name/index and a profile name" +msgstr "ਤੁਹਾਨੂੰ ਇੱਕ ਕਾਰਡ ਨਾਂ/ਲਿਸਟ ਅਤੇ ਪਰੋਫਾਈਲ ਨਾਂ ਦੇਣਾ ਪਵੇਗਾ" + +#: ../src/utils/pactl.c:1126 +msgid "You have to specify a sink name/index and a port name" +msgstr "ਤੁਹਾਨੂੰ ਇੱਕ ਕਾਰਡ ਨਾਂ/ਲਿਸਟ ਅਤੇ ਪਰੋਫਾਈਲ ਨਾਂ ਦੇਣਾ ਪਵੇਗਾ" + +#: ../src/utils/pactl.c:1137 +msgid "You have to specify a source name/index and a port name" +msgstr "ਤੁਹਾਨੂੰ ਇੱਕ ਕਾਰਡ ਨਾਂ/ਲਿਸਟ ਅਤੇ ਪਰੋਫਾਈਲ ਨਾਂ ਦੇਣਾ ਪਵੇਗਾ" + +#: ../src/utils/pactl.c:1149 +msgid "You have to specify a sink name/index and a volume" +msgstr "ਤੁਹਾਨੂੰ ਇੱਕ ਕਾਰਡ ਨਾਂ/ਲਿਸਟ ਅਤੇ ਪਰੋਫਾਈਲ ਨਾਂ ਦੇਣਾ ਪਵੇਗਾ" + +#: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171 +#: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209 +#: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248 +msgid "Invalid volume specification" +msgstr "ਅਢੁੱਕਵਾਂ ਸੈਂਪਲ ਹਦਾਇਤ" + +#: ../src/utils/pactl.c:1166 +msgid "You have to specify a source name/index and a volume" +msgstr "ਤੁਹਾਨੂੰ ਇੱਕ ਕਾਰਡ ਨਾਂ/ਲਿਸਟ ਅਤੇ ਪਰੋਫਾਈਲ ਨਾਂ ਦੇਣਾ ਪਵੇਗਾ" + +#: ../src/utils/pactl.c:1183 +msgid "You have to specify a sink input index and a volume" +msgstr "ਤੁਹਾਨੂੰ ਇੰਪੁੱਟ ਲਿਸਟ ਅਤੇ ਇੱਕ ਸਿੰਕ ਨੂੰ ਸਿੰਕ ਕਰਨਾ ਪਵੇਗਾ" + +#: ../src/utils/pactl.c:1188 +msgid "Invalid sink input index" +msgstr "ਅਢੁੱਕਵੀਂ ਸਿੰਕ ਇੰਪੁੱਟ ਸੂਚੀ" + +#: ../src/utils/pactl.c:1204 +msgid "You have to specify a sink name/index and a mute boolean" +msgstr "ਤੁਹਾਨੂੰ ਇੱਕ ਕਾਰਡ ਨਾਂ/ਲਿਸਟ ਅਤੇ ਪਰੋਫਾਈਲ ਨਾਂ ਦੇਣਾ ਪਵੇਗਾ" + +#: ../src/utils/pactl.c:1221 +msgid "You have to specify a source name/index and a mute boolean" +msgstr "ਤੁਹਾਨੂੰ ਇੱਕ ਕਾਰਡ ਨਾਂ/ਲਿਸਟ ਅਤੇ ਪਰੋਫਾਈਲ ਨਾਂ ਦੇਣਾ ਪਵੇਗਾ" + +#: ../src/utils/pactl.c:1238 +msgid "You have to specify a sink input index and a mute boolean" +msgstr "ਤੁਹਾਨੂੰ ਇੰਪੁੱਟ ਲਿਸਟ ਅਤੇ ਇੱਕ ਸਿੰਕ ਨੂੰ ਸਿੰਕ ਕਰਨਾ ਪਵੇਗਾ" + +#: ../src/utils/pactl.c:1243 +msgid "Invalid sink input index specification" +msgstr "ਅਢੁੱਕਵਾਂ ਸੈਂਪਲ ਹਦਾਇਤ" + +#: ../src/utils/pactl.c:1262 +msgid "No valid command specified." +msgstr "ਕੋਈ ਯੋਗ ਕਮਾਂਡ ਨਹੀਂ ਦਿੱਤੀ।" + +#: ../src/utils/pax11publish.c:61 +#, c-format +msgid "" +"%s [-D display] [-S server] [-O sink] [-I source] [-c file] [-d|-e|-i|-r]\n" +"\n" +" -d Show current PulseAudio data attached to X11 display (default)\n" +" -e Export local PulseAudio data to X11 display\n" +" -i Import PulseAudio data from X11 display to local environment " +"variables and cookie file.\n" +" -r Remove PulseAudio data from X11 display\n" +msgstr "" +"%s [-D display] [-S server] [-O sink] [-I source] [-c file] [-d|-e|-i|-r]\n" +"\n" +" -d Show current PulseAudio data attached to X11 display (default)\n" +" -e Export local PulseAudio data to X11 display\n" +" -i Import PulseAudio data from X11 display to local environment " +"variables and cookie file.\n" +" -r Remove PulseAudio data from X11 display\n" + +#: ../src/utils/pax11publish.c:94 +#, c-format +msgid "Failed to parse command line.\n" +msgstr "ਕਮਾਂਡ ਲਾਈਨ ਪਾਰਸ ਕਰਨ ਵਿੱਚ ਫੇਲ੍ਹ।\n" + +#: ../src/utils/pax11publish.c:108 +#, c-format +msgid "Server: %s\n" +msgstr "ਸਰਵਰ: %s\n" + +#: ../src/utils/pax11publish.c:110 +#, c-format +msgid "Source: %s\n" +msgstr "ਸਰੋਤ: %s\n" + +#: ../src/utils/pax11publish.c:112 +#, c-format +msgid "Sink: %s\n" +msgstr "ਸਿੰਕ: %s\n" + +#: ../src/utils/pax11publish.c:114 +#, c-format +msgid "Cookie: %s\n" +msgstr "ਕੂਕੀਜ਼: %s\n" + +#: ../src/utils/pax11publish.c:132 +#, c-format +msgid "Failed to parse cookie data\n" +msgstr "ਕੂਕੀ ਡਾਟਾ ਪਾਰਸ ਕਰਨ ਵਿੱਚ ਫੇਲ\n" + +#: ../src/utils/pax11publish.c:137 +#, c-format +msgid "Failed to save cookie data\n" +msgstr "ਕੂਕੀ ਡਾਟਾ ਸੰਭਾਲਣ ਵਿੱਚ ਫੇਲ\n" + +#: ../src/utils/pax11publish.c:152 +#, c-format +msgid "Failed to load client configuration file.\n" +msgstr "ਕਲਾਇਟ ਸੰਰਚਨਾ ਫਾਇਲ ਲੋਡ ਕਰਨ ਵਿੱਚ ਫੇਲ।\n" + +#: ../src/utils/pax11publish.c:157 +#, c-format +msgid "Failed to read environment configuration data.\n" +msgstr "ਇੰਵਾਇਰਨਮੈਂਟ ਸੰਰਚਨਾ ਡਾਟਾ ਪੜ੍ਹਨ ਵਿੱਚ ਫੇਲ੍ਹ।\n" + +#: ../src/utils/pax11publish.c:174 +#, c-format +msgid "Failed to get FQDN.\n" +msgstr "FQDN ਪ੍ਰਾਪਤ ਕਰਨ ਵਿੱਚ ਫੇਲ।\n" + +#: ../src/utils/pax11publish.c:194 +#, c-format +msgid "Failed to load cookie data\n" +msgstr "ਕੂਕੀ ਡਾਟਾ ਲੋਡ ਕਰਨ ਵਿੱਚ ਫੇਲ\n" + +#: ../src/utils/pax11publish.c:211 +#, c-format +msgid "Not yet implemented.\n" +msgstr "ਹਾਲੇ ਬਣਾਇਆ ਨਹੀਂ।\n" + +#: ../src/utils/pacmd.c:69 +msgid "No PulseAudio daemon running, or not running as session daemon." +msgstr "ਕੋਈ ਪਲਸ-ਆਡੀਓ ਡੈਮਨ ਨਹੀਂ ਚੱਲ ਰਿਹਾ, ਜਾਂ ਸ਼ੈਸ਼ਨ ਡੈਮਨ ਤੌਰ ਤੇ ਨਹੀਂ ਚੱਲ ਰਿਹਾ।" + +#: ../src/utils/pacmd.c:74 +#, c-format +msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s" +msgstr "socket(PF_UNIX, SOCK_STREAM, 0): %s" + +#: ../src/utils/pacmd.c:91 +#, c-format +msgid "connect(): %s" +msgstr "connect(): %s" + +#: ../src/utils/pacmd.c:99 +msgid "Failed to kill PulseAudio daemon." +msgstr "ਪਲਸਆਡੀਓ ਡੈਮਨ ਬੰਦ ਕਰਨ ਵਿੱਚ ਫੇਲ।" + +#: ../src/utils/pacmd.c:107 +msgid "Daemon not responding." +msgstr "ਡੈਮਨ ਜਵਾਬ ਨਹੀਂ ਦੇ ਰਹੀ।" + +#: ../src/utils/pacmd.c:161 +#, c-format +msgid "poll(): %s" +msgstr "poll(): %s" + +#: ../src/utils/pacmd.c:171 ../src/utils/pacmd.c:188 +#, c-format +msgid "read(): %s" +msgstr "read(): %s" + +#: ../src/utils/pacmd.c:207 ../src/utils/pacmd.c:223 +#, c-format +msgid "write(): %s" +msgstr "write(): %s" + +#: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:219 +msgid "Cannot access autospawn lock." +msgstr "autospawn ਲਾਕ ਵਰਤ ਨਹੀਂ ਸਕਦਾ।" + +#: ../src/modules/alsa/alsa-sink.c:530 ../src/modules/alsa/alsa-sink.c:689 +#, c-format +msgid "" +"ALSA woke us up to write new data to the device, but there was actually " +"nothing to write!\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers.\n" +"We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() " +"returned 0 or another value < min_avail." +msgstr "" +"ALSA woke us up to write new data to the device, but there was actually " +"nothing to write!\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers.\n" +"We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() " +"returned 0 or another value < min_avail." + +#: ../src/modules/alsa/alsa-source.c:506 ../src/modules/alsa/alsa-source.c:656 +#, c-format +msgid "" +"ALSA woke us up to read new data from the device, but there was actually " +"nothing to read!\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers.\n" +"We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() " +"returned 0 or another value < min_avail." +msgstr "" +"ALSA woke us up to read new data from the device, but there was actually " +"nothing to read!\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers.\n" +"We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() " +"returned 0 or another value < min_avail." + +#: ../src/modules/alsa/module-alsa-card.c:152 +#: ../src/modules/bluetooth/module-bluetooth-device.c:2228 +#: ../src/modules/alsa/alsa-mixer.c:2931 +msgid "Off" +msgstr "ਬੰਦ" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2184 +msgid "High Fidelity Playback (A2DP)" +msgstr "ਹਾਈ ਫਡੈਲਿਟੀ ਪਲੇਅਬੈਕ (A2DP)" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2198 +msgid "High Fidelity Capture (A2DP)" +msgstr "ਹਾਈ ਫਡੈਲਿਟੀ ਪਲੇਅਬੈਕ (A2DP)" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2213 +msgid "Telephony Duplex (HSP/HFP)" +msgstr "ਟੈਲੀਫੋਨੀ ਡੁਪਲੈਕਸ (HSP/HFP)" + +#: ../src/modules/reserve-wrap.c:151 +msgid "PulseAudio Sound Server" +msgstr "ਪਲਸਆਡੀਓ ਸਾਊਂਡ ਡਰਾਇਵਰ" + +#: ../src/modules/module-rygel-media-server.c:569 +#: ../src/modules/module-rygel-media-server.c:583 +msgid "Output Devices" +msgstr "" + +#: ../src/modules/module-rygel-media-server.c:570 +#: ../src/modules/module-rygel-media-server.c:584 +msgid "Input Devices" +msgstr "" + +#: ../src/modules/module-rygel-media-server.c:774 +msgid "Audio on @HOSTNAME@" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1701 +msgid "Input" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1702 +msgid "Docking Station Input" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1703 +msgid "Docking Station Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1704 +msgid "Line-In" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1705 +msgid "Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1706 +msgid "External Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1707 +#, fuzzy +msgid "Internal Microphone" +msgstr "ਅੰਦਰੂਨੀ ਆਡੀਓ" + +#: ../src/modules/alsa/alsa-mixer.c:1708 +msgid "Radio" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1709 +msgid "Video" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1710 +msgid "Automatic Gain Control" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1711 +msgid "No Automatic Gain Control" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1712 +msgid "Boost" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1713 +msgid "No Boost" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1714 +msgid "Amplifier" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1715 +msgid "No Amplifier" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1773 +msgid "Analog Input" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1774 +msgid "Analog Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1775 +msgid "Analog Line-In" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1776 +msgid "Analog Radio" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1777 +msgid "Analog Video" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1778 +#, fuzzy +msgid "Analog Output" +msgstr "ਜ਼ੀਰੋ (Null) ਆਉਟਪੁੱਟ" + +#: ../src/modules/alsa/alsa-mixer.c:1779 +msgid "Analog Headphones" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1780 +msgid "Analog Output (LFE)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1781 +msgid "Analog Mono Output" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1981 +#, fuzzy, c-format +msgid "%s+%s" +msgstr "%s %s" + +#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404 +#, fuzzy, c-format +msgid "%s / %s" +msgstr "%s %s" + +#: ../src/modules/alsa/alsa-mixer.c:2790 +msgid "Analog Mono" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2791 +#, fuzzy +msgid "Analog Stereo" +msgstr "ਸਟੀਰੀਓ" + +#: ../src/modules/alsa/alsa-mixer.c:2792 +#, fuzzy +msgid "Analog Surround 2.1" +msgstr "ਸਰਾਊਂਡਿੰਗ 4.1" + +#: ../src/modules/alsa/alsa-mixer.c:2793 +#, fuzzy +msgid "Analog Surround 3.0" +msgstr "ਸਰਾਊਂਡਿੰਗ 4.0" + +#: ../src/modules/alsa/alsa-mixer.c:2794 +#, fuzzy +msgid "Analog Surround 3.1" +msgstr "ਸਰਾਊਂਡਿੰਗ 4.1" + +#: ../src/modules/alsa/alsa-mixer.c:2795 +#, fuzzy +msgid "Analog Surround 4.0" +msgstr "ਸਰਾਊਂਡਿੰਗ 4.0" + +#: ../src/modules/alsa/alsa-mixer.c:2796 +#, fuzzy +msgid "Analog Surround 4.1" +msgstr "ਸਰਾਊਂਡਿੰਗ 4.1" + +#: ../src/modules/alsa/alsa-mixer.c:2797 +#, fuzzy +msgid "Analog Surround 5.0" +msgstr "ਸਰਾਊਂਡਿੰਗ 5.0" + +#: ../src/modules/alsa/alsa-mixer.c:2798 +#, fuzzy +msgid "Analog Surround 5.1" +msgstr "ਸਰਾਊਂਡਿੰਗ 5.1" + +#: ../src/modules/alsa/alsa-mixer.c:2799 +#, fuzzy +msgid "Analog Surround 6.0" +msgstr "ਸਰਾਊਂਡਿੰਗ 4.0" + +#: ../src/modules/alsa/alsa-mixer.c:2800 +#, fuzzy +msgid "Analog Surround 6.1" +msgstr "ਸਰਾਊਂਡਿੰਗ 4.1" + +#: ../src/modules/alsa/alsa-mixer.c:2801 +#, fuzzy +msgid "Analog Surround 7.0" +msgstr "ਸਰਾਊਂਡਿੰਗ 4.0" + +#: ../src/modules/alsa/alsa-mixer.c:2802 +#, fuzzy +msgid "Analog Surround 7.1" +msgstr "ਸਰਾਊਂਡਿੰਗ 7.1" + +#: ../src/modules/alsa/alsa-mixer.c:2803 +msgid "Digital Stereo (IEC958)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2804 +msgid "Digital Surround 4.0 (IEC958)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2805 +msgid "Digital Surround 4.0 (IEC958/AC3)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2806 +msgid "Digital Surround 5.1 (IEC958/AC3)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2807 +msgid "Digital Stereo (HDMI)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2928 +msgid "Analog Mono Duplex" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2929 +msgid "Analog Stereo Duplex" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2930 +msgid "Digital Stereo Duplex (IEC958)" +msgstr "" diff --git a/po/pl.po b/po/pl.po new file mode 100644 index 0000000..5d7f3a0 --- /dev/null +++ b/po/pl.po @@ -0,0 +1,2579 @@ +# translation of pl.po to Polish +# Piotr Drąg , 2008. +# +msgid "" +msgstr "" +"Project-Id-Version: pl\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-09-30 09:44+0000\n" +"PO-Revision-Date: 2009-09-30 17:04+0200\n" +"Last-Translator: Piotr Drąg \n" +"Language-Team: Polish \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629 +#, c-format +msgid "%s %s" +msgstr "%s %s" + +#: ../src/modules/alsa/alsa-util.c:1106 +#, c-format +msgid "" +"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu " +"ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_avail() zwróciło wyjątkowo dużą wartość: %lu bajty (%lu ms).\n" +"Prawdopodobnie jest to błąd sterownika ALSA \"%s\". Proszę zgłosić ten " +"problem programistom ALSA." + +#: ../src/modules/alsa/alsa-util.c:1147 +#, c-format +msgid "" +"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%" +"lu ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_delay() zwróciło wyjątkowo dużą wartość: %li bajty (%s%lu ms).\n" +"Prawdopodobnie jest to błąd sterownika ALSA \"%s\". Proszę zgłosić ten " +"problem programistom ALSA." + +#: ../src/modules/alsa/alsa-util.c:1194 +#, c-format +msgid "" +"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes " +"(%lu ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_mmap_begin() zwróciło wyjątkowo dużą wartość: %lu bajty (%lu ms).\n" +"Prawdopodobnie jest to błąd sterownika ALSA \"%s\". Proszę zgłosić ten " +"problem programistom ALSA." + +#: ../src/modules/module-always-sink.c:39 +msgid "Always keeps at least one sink loaded even if it's a null one" +msgstr "" +"Utrzymywanie zawsze co najmniej jednego wczytanego odpływu nawet, jeśli to " +"pusty odpływ" + +#: ../src/modules/module-always-sink.c:83 +msgid "Dummy Output" +msgstr "Głuche wyjście" + +#: ../src/modules/module-ladspa-sink.c:49 +msgid "Virtual LADSPA sink" +msgstr "Wirtualny odpływ LADSPA" + +#: ../src/modules/module-ladspa-sink.c:53 +msgid "" +"sink_name= sink_properties= " +"master= format= rate= " +"channels= channel_map= plugin= label= control=" +msgstr "" +"sink_name= sink_properties= " +"master= format= " +"rate= channels= channel_map= plugin= label= " +"control=" + +#: ../src/modules/module-null-sink.c:55 +msgid "Clocked NULL sink" +msgstr "Zegarowy PUSTY odpływ" + +#: ../src/modules/module-null-sink.c:291 +msgid "Null Output" +msgstr "Puste wyjście" + +#: ../src/pulsecore/sink.c:2613 +msgid "Internal Audio" +msgstr "Wewnętrzny dźwięk" + +#: ../src/pulsecore/sink.c:2618 +msgid "Modem" +msgstr "Modem" + +#: ../src/daemon/ltdl-bind-now.c:124 +msgid "Failed to find original lt_dlopen loader." +msgstr "" +"Znalezienie oryginalnego programu wczytującego lt_dlopen nie powiodło się." + +#: ../src/daemon/ltdl-bind-now.c:129 +msgid "Failed to allocate new dl loader." +msgstr "Przydzielenie nowego programu wczytującego dl nie powiodło się." + +#: ../src/daemon/ltdl-bind-now.c:142 +msgid "Failed to add bind-now-loader." +msgstr "Dodanie bind-now-loader nie powiodło się." + +#: ../src/daemon/main.c:141 +#, c-format +msgid "Got signal %s." +msgstr "Otrzymano sygnał %s." + +#: ../src/daemon/main.c:168 +msgid "Exiting." +msgstr "Kończenie pracy." + +#: ../src/daemon/main.c:186 +#, c-format +msgid "Failed to find user '%s'." +msgstr "Odnalezienie użytkownika \"%s\" nie powiodło się." + +#: ../src/daemon/main.c:191 +#, c-format +msgid "Failed to find group '%s'." +msgstr "Odnalezienie grupy \"%s\" nie powiodło się." + +#: ../src/daemon/main.c:195 +#, c-format +msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)." +msgstr "Odnaleziono użytkownika \"%s\" (UID %lu) i grupę \"%s\" (GID %lu)." + +#: ../src/daemon/main.c:200 +#, c-format +msgid "GID of user '%s' and of group '%s' don't match." +msgstr "GID użytkownika \"%s\" i grupy \"%s\" nie zgadzają się." + +#: ../src/daemon/main.c:205 +#, c-format +msgid "Home directory of user '%s' is not '%s', ignoring." +msgstr "Katalog domowy użytkownika \"%s\" nie jest \"%s\", ignorowanie." + +#: ../src/daemon/main.c:208 ../src/daemon/main.c:213 +#, c-format +msgid "Failed to create '%s': %s" +msgstr "Utworzenie \"%s\" nie powiodło się: %s" + +#: ../src/daemon/main.c:220 +#, c-format +msgid "Failed to change group list: %s" +msgstr "Zmiana listy grup nie powiodła się: %s" + +#: ../src/daemon/main.c:236 +#, c-format +msgid "Failed to change GID: %s" +msgstr "Zmiana GID nie powiodła się: %s" + +#: ../src/daemon/main.c:252 +#, c-format +msgid "Failed to change UID: %s" +msgstr "Zmiana UID nie powiodła się: %s" + +#: ../src/daemon/main.c:271 +msgid "Successfully dropped root privileges." +msgstr "Pomyślnie porzucono uprawnienia roota." + +#: ../src/daemon/main.c:279 +msgid "System wide mode unsupported on this platform." +msgstr "Tryb systemowy nie jest obsługiwany na tej platformie." + +#: ../src/daemon/main.c:297 +#, c-format +msgid "setrlimit(%s, (%u, %u)) failed: %s" +msgstr "setrlimit(%s, (%u, %u)) nie powiodło się: %s" + +#: ../src/daemon/main.c:474 +msgid "Failed to parse command line." +msgstr "Przetworzenie wiersza poleceń nie powiodła się." + +#: ../src/daemon/main.c:541 +msgid "Daemon not running" +msgstr "Demon nie jest uruchomiony" + +#: ../src/daemon/main.c:543 +#, c-format +msgid "Daemon running as PID %u" +msgstr "Demon jest uruchomiony jako PID %u" + +#: ../src/daemon/main.c:553 +#, c-format +msgid "Failed to kill daemon: %s" +msgstr "Zniszczenie demona nie powiodło się: %s" + +#: ../src/daemon/main.c:571 +msgid "" +"This program is not intended to be run as root (unless --system is " +"specified)." +msgstr "" +"Ten program nie powinien być uruchomiany jako root (chyba, że podano --" +"system)." + +#: ../src/daemon/main.c:573 +msgid "Root privileges required." +msgstr "Wymagane są uprawnienia roota." + +#: ../src/daemon/main.c:578 +msgid "--start not supported for system instances." +msgstr "--start nie jest obsługiwane przy uruchamianiu systemowym." + +#: ../src/daemon/main.c:583 +msgid "Running in system mode, but --disallow-exit not set!" +msgstr "" +"Uruchamianie w trybie systemowym, ale --disallow-exit nie jest ustawione." + +#: ../src/daemon/main.c:586 +msgid "Running in system mode, but --disallow-module-loading not set!" +msgstr "" +"Uruchamianie w trybie systemowym, ale --disallow-module-loading nie jest " +"ustawione." + +#: ../src/daemon/main.c:589 +msgid "Running in system mode, forcibly disabling SHM mode!" +msgstr "Uruchamianie w trybie systemowym, wymuszanie wyłączenia trybu SHM." + +#: ../src/daemon/main.c:594 +msgid "Running in system mode, forcibly disabling exit idle time!" +msgstr "" +"Uruchamianie w trybie systemowym, wymuszanie wyłączenia czasu oczekiwania na " +"zakończenie." + +#: ../src/daemon/main.c:621 +msgid "Failed to acquire stdio." +msgstr "Uzyskanie standardowego wejścia/wyjścia nie powiodło się." + +#: ../src/daemon/main.c:627 +#, c-format +msgid "pipe failed: %s" +msgstr "potok nie powiódł się: %s" + +#: ../src/daemon/main.c:632 +#, c-format +msgid "fork() failed: %s" +msgstr "fork() nie powiodło się: %s" + +#: ../src/daemon/main.c:646 ../src/utils/pacat.c:508 +#, c-format +msgid "read() failed: %s" +msgstr "read() nie powiodło się: %s" + +#: ../src/daemon/main.c:652 +msgid "Daemon startup failed." +msgstr "Uruchomienie demona nie powiodło się." + +#: ../src/daemon/main.c:654 +msgid "Daemon startup successful." +msgstr "Pomyślnie uruchomiono demona." + +#: ../src/daemon/main.c:731 +#, c-format +msgid "This is PulseAudio %s" +msgstr "To jest PulseAudio %s" + +#: ../src/daemon/main.c:732 +#, c-format +msgid "Compilation host: %s" +msgstr "Komputer kompilacji: %s" + +#: ../src/daemon/main.c:733 +#, c-format +msgid "Compilation CFLAGS: %s" +msgstr "CFLAGS kompilacji: %s" + +#: ../src/daemon/main.c:736 +#, c-format +msgid "Running on host: %s" +msgstr "Uruchamianie na komputerze: %s" + +#: ../src/daemon/main.c:739 +#, c-format +msgid "Found %u CPUs." +msgstr "Odnaleziono %u procesorów." + +#: ../src/daemon/main.c:741 +#, c-format +msgid "Page size is %lu bytes" +msgstr "Rozmiar strony to %lu bajtów" + +#: ../src/daemon/main.c:744 +msgid "Compiled with Valgrind support: yes" +msgstr "Skompilowano z obsługą Valgrind: tak" + +#: ../src/daemon/main.c:746 +msgid "Compiled with Valgrind support: no" +msgstr "Skompilowano z obsługą Valgrind: nie" + +#: ../src/daemon/main.c:749 +#, c-format +msgid "Running in valgrind mode: %s" +msgstr "Uruchamianie w trybie Valgrind: %s" + +#: ../src/daemon/main.c:752 +msgid "Optimized build: yes" +msgstr "Budowanie optymalizowane: tak" + +#: ../src/daemon/main.c:754 +msgid "Optimized build: no" +msgstr "Budowanie optymalizowane: nie" + +#: ../src/daemon/main.c:758 +msgid "NDEBUG defined, all asserts disabled." +msgstr "Podano NDEBUG, wszystkie asercje zostały wyłączone." + +#: ../src/daemon/main.c:760 +msgid "FASTPATH defined, only fast path asserts disabled." +msgstr "Podano FASTPATH, tylko szybkie asercje ścieżek zostały wyłączone." + +#: ../src/daemon/main.c:762 +msgid "All asserts enabled." +msgstr "Wszystkie asercje są włączone." + +#: ../src/daemon/main.c:766 +msgid "Failed to get machine ID" +msgstr "Uzyskanie identyfikatora komputera nie powiodło się" + +#: ../src/daemon/main.c:769 +#, c-format +msgid "Machine ID is %s." +msgstr "Identyfikator komputera to %s." + +#: ../src/daemon/main.c:773 +#, c-format +msgid "Session ID is %s." +msgstr "Identyfikator sesji to %s." + +#: ../src/daemon/main.c:779 +#, c-format +msgid "Using runtime directory %s." +msgstr "Używanie katalogu wykonywania %s." + +#: ../src/daemon/main.c:784 +#, c-format +msgid "Using state directory %s." +msgstr "Używanie katalogu stanu %s." + +#: ../src/daemon/main.c:787 +#, c-format +msgid "Using modules directory %s." +msgstr "Używanie katalogu modułów %s." + +#: ../src/daemon/main.c:789 +#, c-format +msgid "Running in system mode: %s" +msgstr "Uruchamianie w trybie systemowym: %s" + +#: ../src/daemon/main.c:792 +msgid "" +"OK, so you are running PA in system mode. Please note that you most likely " +"shouldn't be doing that.\n" +"If you do it nonetheless then it's your own fault if things don't work as " +"expected.\n" +"Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an " +"explanation why system mode is usually a bad idea." +msgstr "" +"OK, więc PA jest uruchomione w trybie systemowym. Proszę zauważyć, że " +"prawdopodobnie tak nie powinno być.\n" +"Jeśli mimo to tak jest, to wina użytkownika, jeśli coś nie działa tak jak " +"powinno.\n" +"Proszę przeczytać http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode, " +"gdzie wyjaśniono, dlaczego tryb systemowy jest zwykle złym pomysłem." + +#: ../src/daemon/main.c:809 +msgid "pa_pid_file_create() failed." +msgstr "pa_pid_file_create() nie powiodło się." + +#: ../src/daemon/main.c:819 +msgid "Fresh high-resolution timers available! Bon appetit!" +msgstr "Świeże zegary o wysokiej rozdzielczości! Smacznego!" + +#: ../src/daemon/main.c:821 +msgid "" +"Dude, your kernel stinks! The chef's recommendation today is Linux with high-" +"resolution timers enabled!" +msgstr "" +"Koleś, twoje jądro śmierdzi! Szef kuchni poleca dzisiaj Linuksa z włączonymi " +"zegarami o wysokiej rozdzielczości!" + +#: ../src/daemon/main.c:844 +msgid "pa_core_new() failed." +msgstr "pa_core_new() nie powiodło się." + +#: ../src/daemon/main.c:904 +msgid "Failed to initialize daemon." +msgstr "Zainicjowanie demona nie powiodło się." + +#: ../src/daemon/main.c:909 +msgid "Daemon startup without any loaded modules, refusing to work." +msgstr "Uruchamianie demona bez żadnych wczytanych modułów, odmawianie pracy." + +#: ../src/daemon/main.c:926 +msgid "Daemon startup complete." +msgstr "Ukończono uruchamianie demona." + +#: ../src/daemon/main.c:932 +msgid "Daemon shutdown initiated." +msgstr "Zainicjowano wyłączenie demona." + +#: ../src/daemon/main.c:954 +msgid "Daemon terminated." +msgstr "Demon został zniszczony." + +#: ../src/daemon/cmdline.c:115 +#, c-format +msgid "" +"%s [options]\n" +"\n" +"COMMANDS:\n" +" -h, --help Show this help\n" +" --version Show version\n" +" --dump-conf Dump default configuration\n" +" --dump-modules Dump list of available modules\n" +" --dump-resample-methods Dump available resample methods\n" +" --cleanup-shm Cleanup stale shared memory " +"segments\n" +" --start Start the daemon if it is not " +"running\n" +" -k --kill Kill a running daemon\n" +" --check Check for a running daemon (only " +"returns exit code)\n" +"\n" +"OPTIONS:\n" +" --system[=BOOL] Run as system-wide instance\n" +" -D, --daemonize[=BOOL] Daemonize after startup\n" +" --fail[=BOOL] Quit when startup fails\n" +" --high-priority[=BOOL] Try to set high nice level\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_NICE)\n" +" --realtime[=BOOL] Try to enable realtime scheduling\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_RTPRIO)\n" +" --disallow-module-loading[=BOOL] Disallow module user requested " +"module\n" +" loading/unloading after startup\n" +" --disallow-exit[=BOOL] Disallow user requested exit\n" +" --exit-idle-time=SECS Terminate the daemon when idle and " +"this\n" +" time passed\n" +" --module-idle-time=SECS Unload autoloaded modules when idle " +"and\n" +" this time passed\n" +" --scache-idle-time=SECS Unload autoloaded samples when idle " +"and\n" +" this time passed\n" +" --log-level[=LEVEL] Increase or set verbosity level\n" +" -v Increase the verbosity level\n" +" --log-target={auto,syslog,stderr} Specify the log target\n" +" --log-meta[=BOOL] Include code location in log " +"messages\n" +" --log-time[=BOOL] Include timestamps in log messages\n" +" --log-backtrace=FRAMES Include a backtrace in log messages\n" +" -p, --dl-search-path=PATH Set the search path for dynamic " +"shared\n" +" objects (plugins)\n" +" --resample-method=METHOD Use the specified resampling method\n" +" (See --dump-resample-methods for\n" +" possible values)\n" +" --use-pid-file[=BOOL] Create a PID file\n" +" --no-cpu-limit[=BOOL] Do not install CPU load limiter on\n" +" platforms that support it.\n" +" --disable-shm[=BOOL] Disable shared memory support.\n" +"\n" +"STARTUP SCRIPT:\n" +" -L, --load=\"MODULE ARGUMENTS\" Load the specified plugin module " +"with\n" +" the specified argument\n" +" -F, --file=FILENAME Run the specified script\n" +" -C Open a command line on the running " +"TTY\n" +" after startup\n" +"\n" +" -n Don't load default script file\n" +msgstr "" +"%s [opcje]\n" +"\n" +"POLECENIA:\n" +" -h, --help Wyświetla tę pomoc\n" +" --version Wyświetla wersję\n" +" --dump-conf Zrzuca domyślną konfigurację\n" +" --dump-modules Zrzuca listę dostępnych modułów\n" +" --dump-resample-methods Zrzuca dostępne metody resamplingu\n" +" --cleanup-shm Czyści stare fragmenty pamięci\n" +" współdzielonej\n" +" --start Uruchamia demona, jeśli nie jest\n" +" uruchomiony\n" +" -k --kill Niszczy uruchomionego demona\n" +" --check Sprawdza, czy demon jest\n" +" uruchomiony (zwraca tylko kod\n" +" wyjścia)\n" +"\n" +"OPCJE:\n" +" --system[=ZMIENNALOGICZNA] Uruchamia w trybie systemowym\n" +" -D, --daemonize[=ZMIENNALOGICZNA] Tworzy demona po uruchomieniu\n" +" --fail[=ZMIENNALOGICZNA] Wyłącza, kiedy uruchomienie nie\n" +" powiedzie się\n" +" --high-priority[=ZMIENNALOGICZNA] Próbuje ustawić wysoki poziom nice\n" +" (dostępne tylko jako root, na SUID\n" +" lub z podniesionym RLIMIT_NICE)\n" +" --realtime[=ZMIENNALOGICZNA] Próbuje ustawić szeregowanie w\n" +" czasie rzeczywistym\n" +" (dostępne tylko jako root, na SUID\n" +" lub z podniesionym RLIMIT_RTPRIO)\n" +" --disallow-module-loading[=ZMIENNALOGICZNA] Nie zezwala\n" +" użytkownikowi modułu na żądanie\n" +" wczytania/usunięcia modułu po\n" +" uruchomieniu\n" +" --disallow-exit[=ZMIENNALOGICZNA] Nie zezwala użytkownikowi na\n" +" żądanie wyłączenia\n" +" --exit-idle-time=SEKUNDY Niszczy demona, kiedy jest zajęty i\n" +" upłynął podany czas\n" +" --module-idle-time=SEKUNDY Usuwa automatycznie wczytane\n" +" moduły, kiedy jest zajęty i upłynął\n" +" podany czas\n" +" --scache-idle-time=SEKUNDY Usuwa automatycznie wczytane\n" +" próbki, kiedy jest zajęty i upłynął\n" +" podany czas\n" +" --log-level[=POZIOM] Zwiększa lub ustawia poziom\n" +" wyświetlanych informacji\n" +" -v Zwiększa poziom wyświetlanych\n" +" informacji\n" +" --log-target={auto,syslog,stderr} Określa dziennik docelowy\n" +" --log-meta[=ZMIENNALOGICZNA] Dołącza położenie kodu do\n" +" komunikatów dziennika\n" +" --log-time[=ZMIENNALOGICZNA] Dołącza czas w komunikatach\n" +" dziennika\n" +" --log-backtrace=RAMKI Dołącza błąd w komunikatach\n" +" dziennika\n" +" -p, --dl-search-path=ŚCIEŻKA Ustawia ścieżkę wyszukiwania dla\n" +" dynamicznie współdzielonych\n" +" obiektów (wtyczek)\n" +" --resample-method=METODA Używa podanej metody resamplingu\n" +" (zobacz --dump-resample-methods,\n" +" aby poznać możliwe wartości)\n" +" --use-pid-file[=ZMIENNALOGICZNA] Tworzy plik PID\n" +" --no-cpu-limit[=ZMIENNALOGICZNA] Nie instaluje ograniczenia zasobów\n" +" procesora na obsługujących je\n" +" platformach.\n" +" --disable-shm[=ZMIENNALOGICZNA] Wyłącza obsługę pamięci\n" +" współdzielonej.\n" +"\n" +"SKRYPT STARTOWY:\n" +" -L, --load=\"PARAMETRY MODUŁU\" Wczytuje podany moduł wtyczki z\n" +" podanym parametrem\n" +" -F, --file=NAZWAPLIKU Wykonuje podany skrypt\n" +" -C Otwiera wiersz poleceń na\n" +" uruchomionym TTY po uruchomieniu\n" +"\n" +" -n Nie wczytuje domyślnego pliku\n" +" skryptu\n" + +#: ../src/daemon/cmdline.c:247 +msgid "--daemonize expects boolean argument" +msgstr "--daemonize oczekuje parametru zmiennej logicznej" + +#: ../src/daemon/cmdline.c:254 +msgid "--fail expects boolean argument" +msgstr "--fail oczekuje parametru zmiennej logicznej" + +#: ../src/daemon/cmdline.c:264 +msgid "" +"--log-level expects log level argument (either numeric in range 0..4 or one " +"of debug, info, notice, warn, error)." +msgstr "" +"--log-level oczekuje parametru poziomu dziennika (numeryczny w zakresie 0..4 " +"lub jeden z debug, info, notice, warn, error)." + +#: ../src/daemon/cmdline.c:276 +msgid "--high-priority expects boolean argument" +msgstr "--high-priority oczekuje parametru zmiennej logicznej" + +#: ../src/daemon/cmdline.c:283 +msgid "--realtime expects boolean argument" +msgstr "--realtime oczekuje parametru zmiennej logicznej" + +#: ../src/daemon/cmdline.c:290 +msgid "--disallow-module-loading expects boolean argument" +msgstr "--disallow-module-loading oczekuje parametru zmiennej logicznej" + +#: ../src/daemon/cmdline.c:297 +msgid "--disallow-exit expects boolean argument" +msgstr "--disallow-exit oczekuje parametru zmiennej logicznej" + +#: ../src/daemon/cmdline.c:304 +msgid "--use-pid-file expects boolean argument" +msgstr "--use-pid-file oczekuje parametru zmiennej logicznej" + +#: ../src/daemon/cmdline.c:321 +msgid "Invalid log target: use either 'syslog', 'stderr' or 'auto'." +msgstr "" +"Nieprawidłowy dziennik docelowy: należy użyć \"syslog\", \"stderr\" lub " +"\"auto\"." + +#: ../src/daemon/cmdline.c:328 +msgid "--log-time expects boolean argument" +msgstr "--log-time oczekuje parametru zmiennej logicznej" + +#: ../src/daemon/cmdline.c:335 +msgid "--log-meta expects boolean argument" +msgstr "--log-meta oczekuje parametru zmiennej logicznej" + +#: ../src/daemon/cmdline.c:354 +#, c-format +msgid "Invalid resample method '%s'." +msgstr "Nieprawidłowa metoda resamplingu \"%s\"." + +#: ../src/daemon/cmdline.c:361 +msgid "--system expects boolean argument" +msgstr "--system oczekuje parametru zmiennej logicznej" + +#: ../src/daemon/cmdline.c:368 +msgid "--no-cpu-limit expects boolean argument" +msgstr "--no-cpu-limit oczekuje parametru zmiennej logicznej" + +#: ../src/daemon/cmdline.c:375 +msgid "--disable-shm expects boolean argument" +msgstr "--disable-shm oczekuje parametru zmiennej logicznej" + +#: ../src/daemon/dumpmodules.c:60 +#, c-format +msgid "Name: %s\n" +msgstr "Nazwa: %s\n" + +#: ../src/daemon/dumpmodules.c:63 +#, c-format +msgid "No module information available\n" +msgstr "Brak informacji o module\n" + +#: ../src/daemon/dumpmodules.c:66 +#, c-format +msgid "Version: %s\n" +msgstr "Wersja: %s\n" + +#: ../src/daemon/dumpmodules.c:68 +#, c-format +msgid "Description: %s\n" +msgstr "Opis: %s\n" + +#: ../src/daemon/dumpmodules.c:70 +#, c-format +msgid "Author: %s\n" +msgstr "Autor: %s\n" + +#: ../src/daemon/dumpmodules.c:72 +#, c-format +msgid "Usage: %s\n" +msgstr "Użycie: %s\n" + +#: ../src/daemon/dumpmodules.c:73 +#, c-format +msgid "Load Once: %s\n" +msgstr "Wczytanie jednorazowe: %s\n" + +#: ../src/daemon/dumpmodules.c:75 +#, c-format +msgid "DEPRECATION WARNING: %s\n" +msgstr "OSTRZEŻENIE O PRZESTARZAŁOŚCI: %s\n" + +#: ../src/daemon/dumpmodules.c:79 +#, c-format +msgid "Path: %s\n" +msgstr "Ścieżka: %s\n" + +#: ../src/daemon/daemon-conf.c:232 +#, c-format +msgid "[%s:%u] Invalid log target '%s'." +msgstr "[%s:%u] Nieprawidłowy dziennik docelowy \"%s\"." + +#: ../src/daemon/daemon-conf.c:248 +#, c-format +msgid "[%s:%u] Invalid log level '%s'." +msgstr "[%s:%u] Nieprawidłowy poziom dziennika \"%s\"." + +#: ../src/daemon/daemon-conf.c:264 +#, c-format +msgid "[%s:%u] Invalid resample method '%s'." +msgstr "[%s:%u] Nieprawidłowa metoda resamplingu \"%s\"." + +#: ../src/daemon/daemon-conf.c:287 +#, c-format +msgid "[%s:%u] Invalid rlimit '%s'." +msgstr "[%s:%u] Nieprawidłowy rlimit \"%s\"." + +#: ../src/daemon/daemon-conf.c:294 +#, c-format +msgid "[%s:%u] rlimit not supported on this platform." +msgstr "[%s:%u] rlimit nie jest obsługiwany na tej platformie." + +#: ../src/daemon/daemon-conf.c:310 +#, c-format +msgid "[%s:%u] Invalid sample format '%s'." +msgstr "[%s:%u] Nieprawidłowy format próbki \"%s\"." + +#: ../src/daemon/daemon-conf.c:328 +#, c-format +msgid "[%s:%u] Invalid sample rate '%s'." +msgstr "[%s:%u] Nieprawidłowa częstotliwość próbki \"%s\"." + +#: ../src/daemon/daemon-conf.c:352 +#, c-format +msgid "[%s:%u] Invalid sample channels '%s'." +msgstr "[%s:%u] Nieprawidłowe kanały próbki \"%s\"." + +#: ../src/daemon/daemon-conf.c:370 +#, c-format +msgid "[%s:%u] Invalid channel map '%s'." +msgstr "[%s:%u] Nieprawidłowa mapa kanałów \"%s\"." + +#: ../src/daemon/daemon-conf.c:388 +#, c-format +msgid "[%s:%u] Invalid number of fragments '%s'." +msgstr "[%s:%u] Nieprawidłowa liczba fragmentów \"%s\"." + +#: ../src/daemon/daemon-conf.c:406 +#, c-format +msgid "[%s:%u] Invalid fragment size '%s'." +msgstr "[%s:%u] Nieprawidłowy rozmiar fragmentu \"%s\"." + +#: ../src/daemon/daemon-conf.c:424 +#, c-format +msgid "[%s:%u] Invalid nice level '%s'." +msgstr "[%s:%u] Nieprawidłowy poziom nice \"%s\"." + +#: ../src/daemon/daemon-conf.c:546 +#, c-format +msgid "Failed to open configuration file: %s" +msgstr "Otwarcie pliku konfiguracji nie powiodło się: %s" + +#: ../src/daemon/daemon-conf.c:562 +msgid "" +"The specified default channel map has a different number of channels than " +"the specified default number of channels." +msgstr "" +"Podana domyślna mapa kanałów ma inną liczbę kanałów niż podana domyślna " +"liczba kanałów." + +#: ../src/daemon/daemon-conf.c:638 +#, c-format +msgid "### Read from configuration file: %s ###\n" +msgstr "### Odczytano z pliku konfiguracji: %s ###\n" + +#: ../src/daemon/caps.c:62 +msgid "Cleaning up privileges." +msgstr "Czyszczenie uprawnień." + +#: ../src/daemon/pulseaudio.desktop.in.h:1 +msgid "PulseAudio Sound System" +msgstr "System dźwięku PulseAudio" + +#: ../src/daemon/pulseaudio.desktop.in.h:2 +msgid "Start the PulseAudio Sound System" +msgstr "Uruchomienie systemu dźwięku PulseAudio" + +#: ../src/pulse/channelmap.c:105 ../src/pulse/channelmap.c:757 +msgid "Mono" +msgstr "Mono" + +#: ../src/pulse/channelmap.c:107 +msgid "Front Center" +msgstr "Przedni środkowy" + +#: ../src/pulse/channelmap.c:108 +msgid "Front Left" +msgstr "Przedni lewy" + +#: ../src/pulse/channelmap.c:109 +msgid "Front Right" +msgstr "Przedni prawy" + +#: ../src/pulse/channelmap.c:111 +msgid "Rear Center" +msgstr "Tylny środkowy" + +#: ../src/pulse/channelmap.c:112 +msgid "Rear Left" +msgstr "Tylny lewy" + +#: ../src/pulse/channelmap.c:113 +msgid "Rear Right" +msgstr "Tylny prawy" + +#: ../src/pulse/channelmap.c:115 +msgid "Low Frequency Emmiter" +msgstr "Subwoofer" + +#: ../src/pulse/channelmap.c:117 +msgid "Front Left-of-center" +msgstr "Przedni lewy po środku" + +#: ../src/pulse/channelmap.c:118 +msgid "Front Right-of-center" +msgstr "Przedni prawy po środku" + +#: ../src/pulse/channelmap.c:120 +msgid "Side Left" +msgstr "Boczny lewy" + +#: ../src/pulse/channelmap.c:121 +msgid "Side Right" +msgstr "Boczny prawy" + +#: ../src/pulse/channelmap.c:123 +msgid "Auxiliary 0" +msgstr "Pomocnicze 0" + +#: ../src/pulse/channelmap.c:124 +msgid "Auxiliary 1" +msgstr "Pomocnicze 1" + +#: ../src/pulse/channelmap.c:125 +msgid "Auxiliary 2" +msgstr "Pomocnicze 2" + +#: ../src/pulse/channelmap.c:126 +msgid "Auxiliary 3" +msgstr "Pomocnicze 3" + +#: ../src/pulse/channelmap.c:127 +msgid "Auxiliary 4" +msgstr "Pomocnicze 4" + +#: ../src/pulse/channelmap.c:128 +msgid "Auxiliary 5" +msgstr "Pomocnicze 5" + +#: ../src/pulse/channelmap.c:129 +msgid "Auxiliary 6" +msgstr "Pomocnicze 6" + +#: ../src/pulse/channelmap.c:130 +msgid "Auxiliary 7" +msgstr "Pomocnicze 7" + +#: ../src/pulse/channelmap.c:131 +msgid "Auxiliary 8" +msgstr "Pomocnicze 8" + +#: ../src/pulse/channelmap.c:132 +msgid "Auxiliary 9" +msgstr "Pomocnicze 9" + +#: ../src/pulse/channelmap.c:133 +msgid "Auxiliary 10" +msgstr "Pomocnicze 10" + +#: ../src/pulse/channelmap.c:134 +msgid "Auxiliary 11" +msgstr "Pomocnicze 11" + +#: ../src/pulse/channelmap.c:135 +msgid "Auxiliary 12" +msgstr "Pomocnicze 12" + +#: ../src/pulse/channelmap.c:136 +msgid "Auxiliary 13" +msgstr "Pomocnicze 13" + +#: ../src/pulse/channelmap.c:137 +msgid "Auxiliary 14" +msgstr "Pomocnicze 14" + +#: ../src/pulse/channelmap.c:138 +msgid "Auxiliary 15" +msgstr "Pomocnicze 15" + +#: ../src/pulse/channelmap.c:139 +msgid "Auxiliary 16" +msgstr "Pomocnicze 16" + +#: ../src/pulse/channelmap.c:140 +msgid "Auxiliary 17" +msgstr "Pomocnicze 17" + +#: ../src/pulse/channelmap.c:141 +msgid "Auxiliary 18" +msgstr "Pomocnicze 18" + +#: ../src/pulse/channelmap.c:142 +msgid "Auxiliary 19" +msgstr "Pomocnicze 19" + +#: ../src/pulse/channelmap.c:143 +msgid "Auxiliary 20" +msgstr "Pomocnicze 20" + +#: ../src/pulse/channelmap.c:144 +msgid "Auxiliary 21" +msgstr "Pomocnicze 21" + +#: ../src/pulse/channelmap.c:145 +msgid "Auxiliary 22" +msgstr "Pomocnicze 22" + +#: ../src/pulse/channelmap.c:146 +msgid "Auxiliary 23" +msgstr "Pomocnicze 23" + +#: ../src/pulse/channelmap.c:147 +msgid "Auxiliary 24" +msgstr "Pomocnicze 24" + +#: ../src/pulse/channelmap.c:148 +msgid "Auxiliary 25" +msgstr "Pomocnicze 25" + +#: ../src/pulse/channelmap.c:149 +msgid "Auxiliary 26" +msgstr "Pomocnicze 26" + +#: ../src/pulse/channelmap.c:150 +msgid "Auxiliary 27" +msgstr "Pomocnicze 27" + +#: ../src/pulse/channelmap.c:151 +msgid "Auxiliary 28" +msgstr "Pomocnicze 28" + +#: ../src/pulse/channelmap.c:152 +msgid "Auxiliary 29" +msgstr "Pomocnicze 29" + +#: ../src/pulse/channelmap.c:153 +msgid "Auxiliary 30" +msgstr "Pomocnicze 30" + +#: ../src/pulse/channelmap.c:154 +msgid "Auxiliary 31" +msgstr "Pomocnicze 31" + +#: ../src/pulse/channelmap.c:156 +msgid "Top Center" +msgstr "Górny środkowy" + +#: ../src/pulse/channelmap.c:158 +msgid "Top Front Center" +msgstr "Górny przedni środkowy" + +#: ../src/pulse/channelmap.c:159 +msgid "Top Front Left" +msgstr "Górny przedni lewy" + +#: ../src/pulse/channelmap.c:160 +msgid "Top Front Right" +msgstr "Górny przedni prawy" + +#: ../src/pulse/channelmap.c:162 +msgid "Top Rear Center" +msgstr "Górny tylny środkowy" + +#: ../src/pulse/channelmap.c:163 +msgid "Top Rear Left" +msgstr "Górny tylny lewy" + +#: ../src/pulse/channelmap.c:164 +msgid "Top Rear Right" +msgstr "Górny tylny prawy" + +#: ../src/pulse/channelmap.c:484 ../src/pulse/sample.c:170 +#: ../src/pulse/volume.c:295 ../src/pulse/volume.c:321 +#: ../src/pulse/volume.c:341 ../src/pulse/volume.c:371 +msgid "(invalid)" +msgstr "(nieprawidłowe)" + +#: ../src/pulse/channelmap.c:761 +msgid "Stereo" +msgstr "Stereo" + +#: ../src/pulse/channelmap.c:766 +msgid "Surround 4.0" +msgstr "Surround 4.0" + +#: ../src/pulse/channelmap.c:772 +msgid "Surround 4.1" +msgstr "Surround 4.1" + +#: ../src/pulse/channelmap.c:778 +msgid "Surround 5.0" +msgstr "Surround 5.0" + +#: ../src/pulse/channelmap.c:784 +msgid "Surround 5.1" +msgstr "Surround 5.1" + +#: ../src/pulse/channelmap.c:791 +msgid "Surround 7.1" +msgstr "Surround 7.1" + +#: ../src/pulse/error.c:43 +msgid "OK" +msgstr "OK" + +#: ../src/pulse/error.c:44 +msgid "Access denied" +msgstr "Odmówiono dostępu" + +#: ../src/pulse/error.c:45 +msgid "Unknown command" +msgstr "Nieznane polecenie" + +#: ../src/pulse/error.c:46 +msgid "Invalid argument" +msgstr "Nieprawidłowy parametr" + +#: ../src/pulse/error.c:47 +msgid "Entity exists" +msgstr "Jednostka istnieje" + +#: ../src/pulse/error.c:48 +msgid "No such entity" +msgstr "Brak jednostki" + +#: ../src/pulse/error.c:49 +msgid "Connection refused" +msgstr "Odrzucono połączenie" + +#: ../src/pulse/error.c:50 +msgid "Protocol error" +msgstr "Błąd protokołu" + +#: ../src/pulse/error.c:51 +msgid "Timeout" +msgstr "Przekroczono czas oczekiwania" + +#: ../src/pulse/error.c:52 +msgid "No authorization key" +msgstr "Brak klucza upoważnienia" + +#: ../src/pulse/error.c:53 +msgid "Internal error" +msgstr "Wewnętrzny błąd" + +#: ../src/pulse/error.c:54 +msgid "Connection terminated" +msgstr "Zniszczono połączenie" + +#: ../src/pulse/error.c:55 +msgid "Entity killed" +msgstr "Zniszczono jednostkę" + +#: ../src/pulse/error.c:56 +msgid "Invalid server" +msgstr "Nieprawidłowy serwer" + +#: ../src/pulse/error.c:57 +msgid "Module initalization failed" +msgstr "Zainicjowanie modułu nie powiodło się" + +#: ../src/pulse/error.c:58 +msgid "Bad state" +msgstr "Błędny stan" + +#: ../src/pulse/error.c:59 +msgid "No data" +msgstr "Brak danych" + +#: ../src/pulse/error.c:60 +msgid "Incompatible protocol version" +msgstr "Niezgodna wersja protokołu" + +#: ../src/pulse/error.c:61 +msgid "Too large" +msgstr "Za duże" + +#: ../src/pulse/error.c:62 +msgid "Not supported" +msgstr "Nieobsługiwane" + +#: ../src/pulse/error.c:63 +msgid "Unknown error code" +msgstr "Nieznany kod błędu" + +#: ../src/pulse/error.c:64 +msgid "No such extension" +msgstr "Nie ma takiego rozszerzenia" + +#: ../src/pulse/error.c:65 +msgid "Obsolete functionality" +msgstr "Przestarzała funkcjonalność" + +#: ../src/pulse/error.c:66 +msgid "Missing implementation" +msgstr "Brak implementacji" + +#: ../src/pulse/error.c:67 +msgid "Client forked" +msgstr "Rozdzielono klienta" + +#: ../src/pulse/error.c:68 +msgid "Input/Output error" +msgstr "Błąd wejścia/wyjścia" + +#: ../src/pulse/error.c:69 +msgid "Device or resource busy" +msgstr "Urządzenie lub zasób jest zajęty" + +#: ../src/pulse/sample.c:172 +#, c-format +msgid "%s %uch %uHz" +msgstr "%s %uch %uHz" + +#: ../src/pulse/sample.c:184 +#, c-format +msgid "%0.1f GiB" +msgstr "%0.1f GiB" + +#: ../src/pulse/sample.c:186 +#, c-format +msgid "%0.1f MiB" +msgstr "%0.1f MiB" + +#: ../src/pulse/sample.c:188 +#, c-format +msgid "%0.1f KiB" +msgstr "%0.1f KiB" + +#: ../src/pulse/sample.c:190 +#, c-format +msgid "%u B" +msgstr "%u B" + +#: ../src/pulse/client-conf-x11.c:55 ../src/utils/pax11publish.c:100 +msgid "XOpenDisplay() failed" +msgstr "XOpenDisplay() nie powiodło się" + +#: ../src/pulse/client-conf-x11.c:93 +msgid "Failed to parse cookie data" +msgstr "Przetworzenie danych ciasteczka nie powiodło się" + +#: ../src/pulse/client-conf.c:111 +#, c-format +msgid "Failed to open configuration file '%s': %s" +msgstr "Otwarcie pliku konfiguracji \"%s\" nie powiodło się: %s" + +#: ../src/pulse/context.c:550 +msgid "No cookie loaded. Attempting to connect without." +msgstr "Nie wczytano ciasteczka. Próba połączenia się bez niego." + +#: ../src/pulse/context.c:693 +#, c-format +msgid "fork(): %s" +msgstr "fork(): %s" + +#: ../src/pulse/context.c:748 +#, c-format +msgid "waitpid(): %s" +msgstr "waitpid(): %s" + +#: ../src/pulse/context.c:1438 +#, c-format +msgid "Received message for unknown extension '%s'" +msgstr "Otrzymano komunikat z nieznanego powodu \"%s\"" + +#: ../src/utils/pacat.c:108 +#, c-format +msgid "Failed to drain stream: %s" +msgstr "Opróżnienie strumienia nie powiodło się: %s" + +#: ../src/utils/pacat.c:113 +msgid "Playback stream drained." +msgstr "Opróżniono strumień odtwarzania." + +#: ../src/utils/pacat.c:123 +msgid "Draining connection to server." +msgstr "Opróżnianie połączenia z serwerem." + +#: ../src/utils/pacat.c:136 +#, c-format +msgid "pa_stream_drain(): %s" +msgstr "pa_stream_drain(): %s" + +#: ../src/utils/pacat.c:159 +#, c-format +msgid "pa_stream_write() failed: %s" +msgstr "pa_stream_write() nie powiodło się: %s" + +#: ../src/utils/pacat.c:197 +#, c-format +msgid "pa_stream_begin_write() failed: %s" +msgstr "pa_stream_begin_write() nie powiodło się: %s" + +#: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267 +#, c-format +msgid "pa_stream_peek() failed: %s" +msgstr "pa_stream_peek() nie powiodło się: %s" + +#: ../src/utils/pacat.c:307 +msgid "Stream successfully created." +msgstr "Pomyślnie utworzono strumień." + +#: ../src/utils/pacat.c:310 +#, c-format +msgid "pa_stream_get_buffer_attr() failed: %s" +msgstr "pa_stream_get_buffer_attr() nie powiodło się: %s" + +#: ../src/utils/pacat.c:314 +#, c-format +msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u" +msgstr "Metryka bufora: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u" + +#: ../src/utils/pacat.c:317 +#, c-format +msgid "Buffer metrics: maxlength=%u, fragsize=%u" +msgstr "Metryka bufora: maxlength=%u, fragsize=%u" + +#: ../src/utils/pacat.c:321 +#, c-format +msgid "Using sample spec '%s', channel map '%s'." +msgstr "Używanie przykładowej specyfikacji \"%s\", mapa kanałów \"%s\"." + +#: ../src/utils/pacat.c:325 +#, c-format +msgid "Connected to device %s (%u, %ssuspended)." +msgstr "Połączono się z urządzeniem %s (%u, %swstrzymane)." + +#: ../src/utils/pacat.c:335 +#, c-format +msgid "Stream error: %s" +msgstr "Błąd strumienia: %s" + +#: ../src/utils/pacat.c:345 +#, c-format +msgid "Stream device suspended.%s" +msgstr "Wstrzymano urządzenie strumienia.%s" + +#: ../src/utils/pacat.c:347 +#, c-format +msgid "Stream device resumed.%s" +msgstr "Wznowiono urządzenie strumienia.%s" + +#: ../src/utils/pacat.c:355 +#, c-format +msgid "Stream underrun.%s" +msgstr "Niedopełniono strumień.%s" + +#: ../src/utils/pacat.c:362 +#, c-format +msgid "Stream overrun.%s" +msgstr "Przepełniono strumień.%s" + +#: ../src/utils/pacat.c:369 +#, c-format +msgid "Stream started.%s" +msgstr "Utworzono strumień.%s" + +#: ../src/utils/pacat.c:376 +#, c-format +msgid "Stream moved to device %s (%u, %ssuspended).%s" +msgstr "Strumień został przeniesiony do urządzenia %s (%u, %swstrzymane).%s" + +#: ../src/utils/pacat.c:376 +msgid "not " +msgstr "nie " + +#: ../src/utils/pacat.c:383 +#, c-format +msgid "Stream buffer attributes changed.%s" +msgstr "Zmieniono atrybuty bufora strumienia.%s" + +#: ../src/utils/pacat.c:415 +#, c-format +msgid "Connection established.%s" +msgstr "Ustanowiono połączenie.%s" + +#: ../src/utils/pacat.c:418 +#, c-format +msgid "pa_stream_new() failed: %s" +msgstr "pa_stream_new() nie powiodło się: %s" + +#: ../src/utils/pacat.c:450 +#, c-format +msgid "pa_stream_connect_playback() failed: %s" +msgstr "pa_stream_connect_playback() nie powiodło się: %s" + +#: ../src/utils/pacat.c:456 +#, c-format +msgid "pa_stream_connect_record() failed: %s" +msgstr "pa_stream_connect_record() nie powiodło się: %s" + +#: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857 +#, c-format +msgid "Connection failure: %s" +msgstr "Połączenie nie powiodło się: %s" + +#: ../src/utils/pacat.c:503 +msgid "Got EOF." +msgstr "Otrzymano EOF." + +#: ../src/utils/pacat.c:540 +#, c-format +msgid "write() failed: %s" +msgstr "write() nie powiodło się: %s" + +#: ../src/utils/pacat.c:561 +msgid "Got signal, exiting." +msgstr "Otrzymano sygnał, kończenie pracy." + +#: ../src/utils/pacat.c:575 +#, c-format +msgid "Failed to get latency: %s" +msgstr "Uzyskanie opóźnienia nie powiodło się: %s" + +#: ../src/utils/pacat.c:580 +#, c-format +msgid "Time: %0.3f sec; Latency: %0.0f usec." +msgstr "Czas: %0.3f sekundy; opóźnienie: %0.0f usekundy." + +#: ../src/utils/pacat.c:599 +#, c-format +msgid "pa_stream_update_timing_info() failed: %s" +msgstr "pa_stream_update_timing_info() nie powiodło się: %s" + +#: ../src/utils/pacat.c:609 +#, c-format +msgid "" +"%s [options]\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -r, --record Create a connection for recording\n" +" -p, --playback Create a connection for playback\n" +"\n" +" -v, --verbose Enable verbose operations\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -d, --device=DEVICE The name of the sink/source to " +"connect to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" +" --stream-name=NAME How to call this stream on the " +"server\n" +" --volume=VOLUME Specify the initial (linear) volume " +"in range 0...65536\n" +" --rate=SAMPLERATE The sample rate in Hz (defaults to " +"44100)\n" +" --format=SAMPLEFORMAT The sample type, one of s16le, " +"s16be, u8, float32le,\n" +" float32be, ulaw, alaw, s32le, s32be, " +"s24le, s24be,\n" +" s24-32le, s24-32be (defaults to " +"s16ne)\n" +" --channels=CHANNELS The number of channels, 1 for mono, " +"2 for stereo\n" +" (defaults to 2)\n" +" --channel-map=CHANNELMAP Channel map to use instead of the " +"default\n" +" --fix-format Take the sample format from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-rate Take the sampling rate from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-channels Take the number of channels and the " +"channel map\n" +" from the sink the stream is being " +"connected to.\n" +" --no-remix Don't upmix or downmix channels.\n" +" --no-remap Map channels by index instead of " +"name.\n" +" --latency=BYTES Request the specified latency in " +"bytes.\n" +" --process-time=BYTES Request the specified process time " +"per request in bytes.\n" +" --property=PROPERTY=VALUE Set the specified property to the " +"specified value.\n" +" --raw Record/play raw PCM data.\n" +" --file-format=FFORMAT Record/play formatted PCM data.\n" +" --list-file-formats List available file formats.\n" +msgstr "" +"%s [opcje]\n" +"\n" +" -h, --help Wyświetla tę pomoc\n" +" --version Wyświetla wersję\n" +"\n" +" -r, --record Tworzy połączenie do nagrywania\n" +" -p, --playback Tworzy połączenie do odtwarzania\n" +"\n" +" -v, --verbose Wyświetla więcej informacji o\n" +" działaniu\n" +"\n" +" -s, --server=SERWER Nazwa serwera do połączenia się\n" +" -d, --device=URZĄDZENIE Nazwa odpływu/źródła do połączenia\n" +" się\n" +" -n, --client-name=NAZWA Jak nazywać tego klienta na\n" +" serwerze\n" +" --stream-name=NAZWA Jak nazwać ten strumień na serwerze\n" +" --volume=POZIOMGŁOŚNOŚCI Określa początkowy (liniowy)\n" +" poziom głośności z zakresie\n" +" 0...65536\n" +" --rate=CZĘSTOTLIWOŚĆPRÓBKI Częstotliwość próbki w Hz\n" +" (domyślnie 44100)\n" +" --format=FORMATPRÓBKI Typ próbki, jeden z s16le, s16be,\n" +" u8, float32le, float32be, ulaw,\n" +" alaw, s32le, s32be, s24le, s24be,\n" +" s24-32le, s24-32be (domyślnie\n" +" s16ne)\n" +" --channels=KANAŁY Liczba kanałów, 1 dla mono, 2 dla\n" +" stereo\n" +" (domyślnie 2)\n" +" --channel-map=MAPAKANAŁÓW Mapa kanałów używa zamiast\n" +" domyślnej\n" +" --fix-format Pobiera format próbki z odpływu, z\n" +" jakim połączony jest strumień.\n" +" --fix-rate Pobiera częstotliwość sampli z\n" +" odpływu, z jakim połączony jest\n" +" strumień.\n" +" --fix-channels Pobiera liczbę kanałów i mapę\n" +" kanałów z odpływu, z jakim\n" +" połączony jest strumień.\n" +" --no-remix Nie miesza kanałów w górę lub w\n" +" dół.\n" +" --no-remap Mapuje kanały przez indeks zamiast\n" +" przez nazwę.\n" +" --latency=BAJTY Żąda określonego opóźnienia w\n" +" bajtach.\n" +" --process-time=BAJTY Żąda określonego czasu procesu na\n" +" żądanie w bajtach.\n" +" --property=WŁASNOŚĆ=WARTOŚĆ Ustawia podaną własność na podaną\n" +" wartość.\n" +" --raw Nagrywa/odtwarza surowe dane PCM.\n" +" --file-format=FFORMAT Nagrywa/odtwarza sformatowane dane\n" +" PCM.\n" +" --list-file-formats Wyświetla listę dostępnych formatów\n" +" plików.\n" + +#: ../src/utils/pacat.c:731 +#, c-format +msgid "" +"pacat %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pacat %s\n" +"Skompilowane za pomocą libpulse %s\n" +"Skonsolidowane za pomocą libpulse %s\n" + +#: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953 +#, c-format +msgid "Invalid client name '%s'" +msgstr "Nieprawidłowa nazwa klienta \"%s\"" + +#: ../src/utils/pacat.c:779 +#, c-format +msgid "Invalid stream name '%s'" +msgstr "Nieprawidłowa nazwa strumienia \"%s\"" + +#: ../src/utils/pacat.c:816 +#, c-format +msgid "Invalid channel map '%s'" +msgstr "Nieprawidłowa mapa kanałów \"%s\"" + +#: ../src/utils/pacat.c:845 +#, c-format +msgid "Invalid latency specification '%s'" +msgstr "Nieprawidłowe określenie opóźnienia \"%s\"" + +#: ../src/utils/pacat.c:852 +#, c-format +msgid "Invalid process time specification '%s'" +msgstr "Nieprawidłowe określenie czasu procesu \"%s\"" + +#: ../src/utils/pacat.c:864 +#, c-format +msgid "Invalid property '%s'" +msgstr "Nieprawidłowa własność \"%s\"" + +#: ../src/utils/pacat.c:881 +#, c-format +msgid "Unknown file format %s." +msgstr "Nieznany format pliku %s." + +#: ../src/utils/pacat.c:900 +msgid "Invalid sample specification" +msgstr "Nieprawidłowe określenie próbki" + +#: ../src/utils/pacat.c:910 +#, c-format +msgid "open(): %s" +msgstr "open(): %s" + +#: ../src/utils/pacat.c:915 +#, c-format +msgid "dup2(): %s" +msgstr "dup2(): %s" + +#: ../src/utils/pacat.c:922 +msgid "Too many arguments." +msgstr "Za dużo parametrów." + +#: ../src/utils/pacat.c:933 +msgid "Failed to generate sample specification for file." +msgstr "Utworzenie określenia próbki dla pliku nie powiodło się." + +#: ../src/utils/pacat.c:953 +msgid "Failed to open audio file." +msgstr "Otwarcie pliku dźwiękowego nie powiodło się." + +#: ../src/utils/pacat.c:959 +msgid "" +"Warning: specified sample specification will be overwritten with " +"specification from file." +msgstr "" +"Ostrzeżenie: podane określenie próbki zostanie zastąpione przez określenie z " +"pliku." + +#: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997 +msgid "Failed to determine sample specification from file." +msgstr "Ustalenie określenia próbki z pliku nie powiodło się." + +#: ../src/utils/pacat.c:971 +msgid "Warning: Failed to determine channel map from file." +msgstr "Ostrzeżenie: ustalenie mapy kanałów z pliku nie powiodło się." + +#: ../src/utils/pacat.c:982 +msgid "Channel map doesn't match sample specification" +msgstr "Mapa kanałów nie zgadza się z określeniem próbki" + +#: ../src/utils/pacat.c:993 +msgid "Warning: failed to write channel map to file." +msgstr "Ostrzeżenie: zapisanie mapy kanałów do pliku nie powiodło się." + +#: ../src/utils/pacat.c:1008 +#, c-format +msgid "" +"Opening a %s stream with sample specification '%s' and channel map '%s'." +msgstr "" +"Otwieranie strumienia %s za pomocą określenie próbki \"%s\" i mapy kanałów " +"\"%s\"." + +#: ../src/utils/pacat.c:1009 +msgid "recording" +msgstr "nagrywanie" + +#: ../src/utils/pacat.c:1009 +msgid "playback" +msgstr "odtwarzanie" + +#: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267 +msgid "pa_mainloop_new() failed." +msgstr "pa_mainloop_new() nie powiodło się." + +#: ../src/utils/pacat.c:1054 +msgid "io_new() failed." +msgstr "io_new() nie powiodło się." + +#: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279 +msgid "pa_context_new() failed." +msgstr "pa_context_new() nie powiodło się." + +#: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285 +#, c-format +msgid "pa_context_connect() failed: %s" +msgstr "pa_context_connect() nie powiodło się: %s" + +#: ../src/utils/pacat.c:1075 +msgid "pa_context_rttime_new() failed." +msgstr "pa_context_rttime_new() nie powiodło się." + +#: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290 +msgid "pa_mainloop_run() failed." +msgstr "pa_mainloop_run() nie powiodło się." + +#: ../src/utils/pasuspender.c:81 +#, c-format +msgid "fork(): %s\n" +msgstr "fork(): %s\n" + +#: ../src/utils/pasuspender.c:92 +#, c-format +msgid "execvp(): %s\n" +msgstr "execvp(): %s\n" + +#: ../src/utils/pasuspender.c:109 +#, c-format +msgid "Failure to suspend: %s\n" +msgstr "Wstrzymanie nie powiodło się: %s\n" + +#: ../src/utils/pasuspender.c:124 +#, c-format +msgid "Failure to resume: %s\n" +msgstr "Wznowienie nie powiodło się: %s\n" + +#: ../src/utils/pasuspender.c:147 +#, c-format +msgid "WARNING: Sound server is not local, not suspending.\n" +msgstr "" +"OSTRZEŻENIE: serwer dźwięku nie jest lokalny, nie zostanie wstrzymany.\n" + +#: ../src/utils/pasuspender.c:159 +#, c-format +msgid "Connection failure: %s\n" +msgstr "Połączenie nie powiodło się: %s\n" + +#: ../src/utils/pasuspender.c:176 +#, c-format +msgid "Got SIGINT, exiting.\n" +msgstr "Otrzymano SIGINT, kończenie pracy.\n" + +#: ../src/utils/pasuspender.c:194 +#, c-format +msgid "WARNING: Child process terminated by signal %u\n" +msgstr "OSTRZEŻENIE: proces potomny został zniszczony przez sygnał %u\n" + +#: ../src/utils/pasuspender.c:212 +#, c-format +msgid "" +"%s [options] ... \n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +"\n" +msgstr "" +"%s [opcje] ... \n" +"\n" +" -h, --help Wyświetla tę pomoc\n" +" --version Wyświetla wersję\n" +" -s, --server=SERWER Nazwa serwera do połączenia się\n" +"\n" + +#: ../src/utils/pasuspender.c:248 +#, c-format +msgid "" +"pasuspender %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pasuspender %s\n" +"Skompilowane za pomocą libpulse %s\n" +"Skonsolidowane za pomocą libpulse %s\n" + +#: ../src/utils/pasuspender.c:277 +#, c-format +msgid "pa_mainloop_new() failed.\n" +msgstr "pa_mainloop_new() nie powiodło się.\n" + +#: ../src/utils/pasuspender.c:290 +#, c-format +msgid "pa_context_new() failed.\n" +msgstr "pa_context_new() nie powiodło się.\n" + +#: ../src/utils/pasuspender.c:298 +#, c-format +msgid "pa_mainloop_run() failed.\n" +msgstr "pa_mainloop_run() nie powiodło się.\n" + +#: ../src/utils/pactl.c:135 +#, c-format +msgid "Failed to get statistics: %s" +msgstr "Uzyskanie statystyk nie powiodło się: %s" + +#: ../src/utils/pactl.c:141 +#, c-format +msgid "Currently in use: %u blocks containing %s bytes total.\n" +msgstr "Obecnie używane: %u bloków zawierających razem %s bajtów.\n" + +#: ../src/utils/pactl.c:144 +#, c-format +msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n" +msgstr "" +"Przydzielono podczas całego czasu uruchomienia: %u bloków zawierających " +"razem %s bajtów.\n" + +#: ../src/utils/pactl.c:147 +#, c-format +msgid "Sample cache size: %s\n" +msgstr "Rozmiar pamięci podręcznej próbek: %s\n" + +#: ../src/utils/pactl.c:156 +#, c-format +msgid "Failed to get server information: %s" +msgstr "Uzyskanie informacji o serwerze nie powiodło się: %s" + +#: ../src/utils/pactl.c:164 +#, c-format +msgid "" +"User name: %s\n" +"Host Name: %s\n" +"Server Name: %s\n" +"Server Version: %s\n" +"Default Sample Specification: %s\n" +"Default Channel Map: %s\n" +"Default Sink: %s\n" +"Default Source: %s\n" +"Cookie: %08x\n" +msgstr "" +"Nazwa użytkownika: %s\n" +"Nazwa komputera: %s\n" +"Nazwa serwera: %s\n" +"Wersja serwera: %s\n" +"Domyślne określenie próbki: %s\n" +"Domyślna mapa kanałów: %s\n" +"Domyślny odpływ: %s\n" +"Domyślne źródło: %s\n" +"Ciasteczko: %08x\n" + +#: ../src/utils/pactl.c:205 +#, c-format +msgid "Failed to get sink information: %s" +msgstr "Uzyskanie informacji o odpływie nie powiodło się: %s" + +#: ../src/utils/pactl.c:221 +#, c-format +msgid "" +"Sink #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor Source: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Odpływ #%u\n" +"\tStan: %s\n" +"\tNazwa: %s\n" +"\tOpis: %s\n" +"\tSterownik: %s\n" +"\tOkreślenie próbki: %s\n" +"\tMapa kanałów: %s\n" +"\tWłaściciel modułu: %u\n" +"\tWyciszenie: %s\n" +"\tPoziom głośności: %s%s%s\n" +"\t balans %0.2f\n" +"\tGłośność podstawowa: %s%s%s\n" +"\tŹródło monitora: %s\n" +"\tOpóźnienie: %0.0f usekundy, skonfigurowano %0.0f usekundy\n" +"\tFlagi: %s%s%s%s%s%s\n" +"\tWłaściwości:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360 +#, c-format +msgid "\tPorts:\n" +msgstr "\tPorty:\n" + +#: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366 +#, c-format +msgid "\tActive Port: %s\n" +msgstr "\tAktywny port: %s\n" + +#: ../src/utils/pactl.c:297 +#, c-format +msgid "Failed to get source information: %s" +msgstr "Uzyskanie informacji o źródle nie powiodło się: %s" + +#: ../src/utils/pactl.c:313 +#, c-format +msgid "" +"Source #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor of Sink: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Źródło #%u\n" +"\tStan: %s\n" +"\tNazwa: %s\n" +"\tOpis: %s\n" +"\tSterownik: %s\n" +"\tOkreślenie próbki: %s\n" +"\tMapa kanałów: %s\n" +"\tWłaściciel modułu: %u\n" +"\tWyciszenie: %s\n" +"\tPoziom głośności: %s%s%s\n" +"\t balans %0.2f\n" +"\tGłośność podstawowa: %s%s%s\n" +"\tMonitor odpływu: %s\n" +"\tOpóźnienie: %0.0f usekundy, skonfigurowano %0.0f usekundy\n" +"\tFlagi: %s%s%s%s%s%s\n" +"\tWłaściwości:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:345 ../src/utils/pactl.c:401 ../src/utils/pactl.c:436 +#: ../src/utils/pactl.c:473 ../src/utils/pactl.c:532 ../src/utils/pactl.c:533 +#: ../src/utils/pactl.c:543 ../src/utils/pactl.c:587 ../src/utils/pactl.c:588 +#: ../src/utils/pactl.c:594 ../src/utils/pactl.c:637 ../src/utils/pactl.c:638 +#: ../src/utils/pactl.c:645 +msgid "n/a" +msgstr "nie dotyczy" + +#: ../src/utils/pactl.c:375 +#, c-format +msgid "Failed to get module information: %s" +msgstr "Uzyskanie informacji o module nie powiodło się: %s" + +#: ../src/utils/pactl.c:393 +#, c-format +msgid "" +"Module #%u\n" +"\tName: %s\n" +"\tArgument: %s\n" +"\tUsage counter: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Moduł #%u\n" +"\tNazwa: %s\n" +"\tParametr: %s\n" +"\tLicznik użycia: %s\n" +"\tWłaściwości:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:412 +#, c-format +msgid "Failed to get client information: %s" +msgstr "Uzyskanie informacji o kliencie nie powiodło się: %s" + +#: ../src/utils/pactl.c:430 +#, c-format +msgid "" +"Client #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Klient #%u\n" +"\tSterownik: %s\n" +"\tWłaściciel modułu: %s\n" +"\tWłaściwości:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:447 +#, c-format +msgid "Failed to get card information: %s" +msgstr "Uzyskanie informacji o karcie nie powiodło się: %s" + +#: ../src/utils/pactl.c:465 +#, c-format +msgid "" +"Card #%u\n" +"\tName: %s\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Karta #%u\n" +"\tNazwa: %s\n" +"\tSterownik: %s\n" +"\tWłaściciel modułu: %s\n" +"\tWłaściwości:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:479 +#, c-format +msgid "\tProfiles:\n" +msgstr "\tProfile:\n" + +#: ../src/utils/pactl.c:485 +#, c-format +msgid "\tActive Profile: %s\n" +msgstr "\tAktywny profil: %s\n" + +#: ../src/utils/pactl.c:496 +#, c-format +msgid "Failed to get sink input information: %s" +msgstr "Uzyskanie informacji o wejściu odpływu nie powiodło się: %s" + +#: ../src/utils/pactl.c:515 +#, c-format +msgid "" +"Sink Input #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSink: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tMute: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSink Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Odpływ wejścia #%u\n" +"\tSterownik: %s\n" +"\tWłaściciel modułu: %s\n" +"\tKlient: %s\n" +"\tOdpływ: %u\n" +"\tOkreślenie próbki: %s\n" +"\tMapa kanałów: %s\n" +"\tWyciszenie: %s\n" +"\tPoziom głośności: %s\n" +"\t %s\n" +"\t balans %0.2f\n" +"\tOpóźnienie bufora: %0.0f usekundy\n" +"\tOpóźnienie odpływu: %0.0f usekundy\n" +"\tMetoda resamplingu: %s\n" +"\tWłaściwości:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:554 +#, c-format +msgid "Failed to get source output information: %s" +msgstr "Uzyskanie informacji o wyjściu źródła nie powiodło się: %s" + +#: ../src/utils/pactl.c:574 +#, c-format +msgid "" +"Source Output #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSource: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSource Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Źródło wyjścia #%u\n" +"\tSterownik: %s\n" +"\tWłaściciel modułu: %s\n" +"\tKlient: %s\n" +"\tŹródło: %u\n" +"\tOkreślenie próbki: %s\n" +"\tMapa kanałów: %s\n" +"\tOpóźnienie bufora: %0.0f usekundy\n" +"\tOpóźnienie źródła: %0.0f usekundy\n" +"\tMetoda resamplingu: %s\n" +"\tWłaściwości:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:605 +#, c-format +msgid "Failed to get sample information: %s" +msgstr "Uzyskanie informacji o próbce nie powiodło się: %s" + +#: ../src/utils/pactl.c:623 +#, c-format +msgid "" +"Sample #%u\n" +"\tName: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tDuration: %0.1fs\n" +"\tSize: %s\n" +"\tLazy: %s\n" +"\tFilename: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Próbka #%u\n" +"\tNazwa: %s\n" +"\tOkreślenie próbki: %s\n" +"\tMapa kanałów: %s\n" +"\tPoziom głośności: %s\n" +"\t %s\n" +"\t balans %0.2f\n" +"\tCzas trwania: %0.1fs\n" +"\tRozmiar: %s\n" +"\tLazy: %s\n" +"\tNazwa pliku: %s\n" +"\tWłaściwości:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663 +#, c-format +msgid "Failure: %s" +msgstr "Niepowodzenie: %s" + +#: ../src/utils/pactl.c:687 +#, c-format +msgid "Failed to upload sample: %s" +msgstr "Wysłanie próbki nie powiodło się: %s" + +#: ../src/utils/pactl.c:704 +msgid "Premature end of file" +msgstr "Przedwczesny koniec pliku" + +#: ../src/utils/pactl.c:863 +msgid "Got SIGINT, exiting." +msgstr "Otrzymano SIGINT, kończenie pracy." + +#: ../src/utils/pactl.c:869 +#, c-format +msgid "" +"%s [options] stat\n" +"%s [options] list\n" +"%s [options] exit\n" +"%s [options] upload-sample FILENAME [NAME]\n" +"%s [options] play-sample NAME [SINK]\n" +"%s [options] remove-sample NAME\n" +"%s [options] move-sink-input SINKINPUT SINK\n" +"%s [options] move-source-output SOURCEOUTPUT SOURCE\n" +"%s [options] load-module NAME [ARGS ...]\n" +"%s [options] unload-module MODULE\n" +"%s [options] suspend-sink SINK 1|0\n" +"%s [options] suspend-source SOURCE 1|0\n" +"%s [options] set-card-profile CARD PROFILE\n" +"%s [options] set-sink-port SINK PORT\n" +"%s [options] set-source-port SOURCE PORT\n" +"%s [options] set-sink-volume SINK VOLUME\n" +"%s [options] set-source-volume SOURCE VOLUME\n" +"%s [options] set-sink-input-volume SINKINPUT VOLUME\n" +"%s [options] set-sink-mute SINK 1|0\n" +"%s [options] set-source-mute SOURCE 1|0\n" +"%s [options] set-sink-input-mute SINKINPUT 1|0\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" +msgstr "" +"%s [opcje] stat\n" +"%s [opcje] list\n" +"%s [opcje] exit\n" +"%s [opcje] upload-sample NAZWAPLIKU [NAZWA]\n" +"%s [opcje] play-sample NAZWA [ODPŁYW]\n" +"%s [opcje] remove-sample NAZWA\n" +"%s [opcje] move-sink-input WEJŚCIE_ODPŁYWU ODPŁYW\n" +"%s [opcje] move-source-output WYJŚCIE_ODPŁYWU ŹRÓDŁO\n" +"%s [opcje] load-module NAZWA [PARAMETRY...]\n" +"%s [opcje] unload-module MODUŁ\n" +"%s [opcje] suspend-sink SINK 1|0\n" +"%s [opcje] suspend-source SOURCE 1|0\n" +"%s [opcje] set-card-profile KARTA PROFIL\n" +"%s [opcje] set-sink-port ODPŁYW PORT\n" +"%s [opcje] set-source-port ŹRÓDŁO PORT\n" +"%s [opcje] set-sink-volume ODPŁYW GŁOŚNOŚĆ\n" +"%s [opcje] set-source-volume ŹRÓDŁO GŁOŚNOŚĆ\n" +"%s [opcje] set-sink-input-volume WYJŚCIE_ODPŁYWU GŁOŚNOŚĆ\n" +"%s [opcje] set-sink-mute ODPŁYW 1|0\n" +"%s [opcje] set-source-mute ŹRÓDŁO 1|0\n" +"%s [opcje] set-sink-input-mute WEJŚCIE_ODPŁYWU 1|0\n" +"\n" +"\n" +" -h, --help Wyświetla tę pomoc\n" +" --version Wyświetla wersję\n" +"\n" +" -s, --server=SERWER Nazwa serwera do połączenia się\n" +" -n, --client-name=NAZWA Jak nazwać tego klienta na serwerze\n" + +#: ../src/utils/pactl.c:933 +#, c-format +msgid "" +"pactl %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pactl %s\n" +"Skompilowane za pomocą libpulse %s\n" +"Skonsolidowane za pomocą libpulse %s\n" + +#: ../src/utils/pactl.c:979 +msgid "Please specify a sample file to load" +msgstr "Proszę podać plik próbki do wczytania" + +#: ../src/utils/pactl.c:992 +msgid "Failed to open sound file." +msgstr "Otwarcie pliku dźwiękowego nie powiodło się." + +#: ../src/utils/pactl.c:1004 +msgid "Warning: Failed to determine sample specification from file." +msgstr "Ostrzeżenie: ustalenie określenia próbki z pliku nie powiodło się." + +#: ../src/utils/pactl.c:1014 +msgid "You have to specify a sample name to play" +msgstr "Należy podać nazwę próbki do odtworzenia" + +#: ../src/utils/pactl.c:1026 +msgid "You have to specify a sample name to remove" +msgstr "Należy podać nazwę próbki do usunięcia" + +#: ../src/utils/pactl.c:1035 +msgid "You have to specify a sink input index and a sink" +msgstr "Należy podać indeks odpływu wejścia i odpływ" + +#: ../src/utils/pactl.c:1045 +msgid "You have to specify a source output index and a source" +msgstr "Należy podać indeks źródła wyjścia i źródło" + +#: ../src/utils/pactl.c:1060 +msgid "You have to specify a module name and arguments." +msgstr "Należy podać nazwę modułu i parametry." + +#: ../src/utils/pactl.c:1080 +msgid "You have to specify a module index" +msgstr "Należy podać indeks modułu" + +#: ../src/utils/pactl.c:1090 +msgid "" +"You may not specify more than one sink. You have to specify a boolean value." +msgstr "" +"Nie można podać więcej niż jednego odpływu. Należy podać wartość logiczną." + +#: ../src/utils/pactl.c:1103 +msgid "" +"You may not specify more than one source. You have to specify a boolean " +"value." +msgstr "" +"Nie można podać więcej niż jednego źródła. Należy podać wartość logiczną." + +#: ../src/utils/pactl.c:1115 +msgid "You have to specify a card name/index and a profile name" +msgstr "Należy podać nazwę karty/indeks i nazwę profilu" + +#: ../src/utils/pactl.c:1126 +msgid "You have to specify a sink name/index and a port name" +msgstr "Należy podać nazwę odpływu/indeks i nazwę portu" + +#: ../src/utils/pactl.c:1137 +msgid "You have to specify a source name/index and a port name" +msgstr "Należy podać nazwę źródła/indeks i nazwę portu" + +#: ../src/utils/pactl.c:1149 +msgid "You have to specify a sink name/index and a volume" +msgstr "Należy podać nazwę odpływu/indeks i głośność" + +#: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171 +#: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209 +#: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248 +msgid "Invalid volume specification" +msgstr "Nieprawidłowe określenie głośności" + +#: ../src/utils/pactl.c:1166 +msgid "You have to specify a source name/index and a volume" +msgstr "Należy podać nazwę źródła/indeks i głośność" + +#: ../src/utils/pactl.c:1183 +msgid "You have to specify a sink input index and a volume" +msgstr "Należy podać indeks odpływu wejścia i głośność" + +#: ../src/utils/pactl.c:1188 +msgid "Invalid sink input index" +msgstr "Nieprawidłowy indeks wejścia odpływu" + +#: ../src/utils/pactl.c:1204 +msgid "You have to specify a sink name/index and a mute boolean" +msgstr "Należy podać nazwę odpływu/indeks i zmienną logiczną wyciszenia" + +#: ../src/utils/pactl.c:1221 +msgid "You have to specify a source name/index and a mute boolean" +msgstr "Należy podać nazwę źródła/indeks i zmienną logiczną wyciszenia" + +#: ../src/utils/pactl.c:1238 +msgid "You have to specify a sink input index and a mute boolean" +msgstr "Należy podać indeks odpływu wejścia i zmienną logiczną wyciszenia" + +#: ../src/utils/pactl.c:1243 +msgid "Invalid sink input index specification" +msgstr "Nieprawidłowe określenie indeksu wejścia odpływu" + +#: ../src/utils/pactl.c:1262 +msgid "No valid command specified." +msgstr "Nie podano prawidłowego polecenia." + +#: ../src/utils/pax11publish.c:61 +#, c-format +msgid "" +"%s [-D display] [-S server] [-O sink] [-I source] [-c file] [-d|-e|-i|-r]\n" +"\n" +" -d Show current PulseAudio data attached to X11 display (default)\n" +" -e Export local PulseAudio data to X11 display\n" +" -i Import PulseAudio data from X11 display to local environment " +"variables and cookie file.\n" +" -r Remove PulseAudio data from X11 display\n" +msgstr "" +"%s [-D ekran] [-S serwer] [-O odpływ] [-I źródło] [-c plik] [-d|-e|-i|-r]\n" +"\n" +" -d Wyświetla dane PulseAudio dołączone do ekranu X11 (domyślne)\n" +" -e Eksportuje lokalne dane PulseAudio na ekran X11\n" +" -i Importuje dane PulseAudio z ekranu X11 do lokalnych zmiennych\n" +" środowiskowych i pliku ciasteczka.\n" +" -r Usuwa dane PulseAudio z ekranu X11\n" + +#: ../src/utils/pax11publish.c:94 +#, c-format +msgid "Failed to parse command line.\n" +msgstr "Przetworzenie wiersza poleceń nie powiodła się.\n" + +#: ../src/utils/pax11publish.c:108 +#, c-format +msgid "Server: %s\n" +msgstr "Serwer: %s\n" + +#: ../src/utils/pax11publish.c:110 +#, c-format +msgid "Source: %s\n" +msgstr "Źródło: %s\n" + +#: ../src/utils/pax11publish.c:112 +#, c-format +msgid "Sink: %s\n" +msgstr "Odpływ: %s\n" + +#: ../src/utils/pax11publish.c:114 +#, c-format +msgid "Cookie: %s\n" +msgstr "Ciasteczko: %s\n" + +#: ../src/utils/pax11publish.c:132 +#, c-format +msgid "Failed to parse cookie data\n" +msgstr "Przetworzenie danych ciasteczka nie powiodła się\n" + +#: ../src/utils/pax11publish.c:137 +#, c-format +msgid "Failed to save cookie data\n" +msgstr "Zapisanie danych ciasteczka nie powiodło się\n" + +#: ../src/utils/pax11publish.c:152 +#, c-format +msgid "Failed to load client configuration file.\n" +msgstr "Wczytanie pliku konfiguracji klienta nie powiodło się.\n" + +#: ../src/utils/pax11publish.c:157 +#, c-format +msgid "Failed to read environment configuration data.\n" +msgstr "Odczytanie danych konfiguracji środowiska nie powiodło się.\n" + +#: ../src/utils/pax11publish.c:174 +#, c-format +msgid "Failed to get FQDN.\n" +msgstr "Uzyskanie FQDN nie powiodło się.\n" + +#: ../src/utils/pax11publish.c:194 +#, c-format +msgid "Failed to load cookie data\n" +msgstr "Wczytanie danych ciasteczka nie powiodło się\n" + +#: ../src/utils/pax11publish.c:211 +#, c-format +msgid "Not yet implemented.\n" +msgstr "Niezaimplementowane.\n" + +#: ../src/utils/pacmd.c:69 +msgid "No PulseAudio daemon running, or not running as session daemon." +msgstr "" +"Demon PulseAudio nie jest uruchomiony, lub nie jest uruchomiony jako demon " +"sesji." + +#: ../src/utils/pacmd.c:74 +#, c-format +msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s" +msgstr "gniazdo(PF_UNIX, SOCK_STREAM, 0): %s" + +#: ../src/utils/pacmd.c:91 +#, c-format +msgid "connect(): %s" +msgstr "connect(): %s" + +#: ../src/utils/pacmd.c:99 +msgid "Failed to kill PulseAudio daemon." +msgstr "Zniszczenie demona PulseAudio nie powiodło się." + +#: ../src/utils/pacmd.c:107 +msgid "Daemon not responding." +msgstr "Demon nie odpowiada." + +#: ../src/utils/pacmd.c:161 +#, c-format +msgid "poll(): %s" +msgstr "poll(): %s" + +#: ../src/utils/pacmd.c:171 ../src/utils/pacmd.c:188 +#, c-format +msgid "read(): %s" +msgstr "read(): %s" + +#: ../src/utils/pacmd.c:207 ../src/utils/pacmd.c:223 +#, c-format +msgid "write(): %s" +msgstr "write(): %s" + +#: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:219 +msgid "Cannot access autospawn lock." +msgstr "Nie można uzyskać dostępu do blokady automatycznego wznawiania." + +#: ../src/modules/alsa/alsa-sink.c:530 ../src/modules/alsa/alsa-sink.c:689 +#, c-format +msgid "" +"ALSA woke us up to write new data to the device, but there was actually " +"nothing to write!\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers.\n" +"We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() " +"returned 0 or another value < min_avail." +msgstr "" +"ALSA została wybudzona, aby zapisać nowe dane do urządzenia, ale nie było " +"nic do zapisania.\n" +"Prawdopodobnie jest to błąd w sterowniku ALSA \"%s\". Proszę zgłosić ten " +"problem programistom ALSA.\n" +"Wybudzono za pomocą ustawienia POLLOUT - ale jednoczesne wywołanie " +"snd_pcm_avail() zwróciło zero lub inną wartość < min_avail." + +#: ../src/modules/alsa/alsa-source.c:506 ../src/modules/alsa/alsa-source.c:656 +#, c-format +msgid "" +"ALSA woke us up to read new data from the device, but there was actually " +"nothing to read!\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers.\n" +"We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() " +"returned 0 or another value < min_avail." +msgstr "" +"ALSA została wybudzona, aby odczytać nowe dane z urządzenia, ale nie było " +"nic do odczytania.\n" +"Prawdopodobnie jest to błąd w sterowniku ALSA \"%s\". Proszę zgłosić ten " +"problem programistom ALSA.\n" +"Wybudzono za pomocą ustawienia POLLIN - ale jednoczesne wywołanie " +"snd_pcm_avail() zwróciło zero lub inną wartość < min_avail." + +#: ../src/modules/alsa/module-alsa-card.c:152 +#: ../src/modules/bluetooth/module-bluetooth-device.c:2228 +#: ../src/modules/alsa/alsa-mixer.c:2931 +msgid "Off" +msgstr "Wyłącz" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2184 +msgid "High Fidelity Playback (A2DP)" +msgstr "Odtwarzanie o wysokiej dokładności (A2DP)" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2198 +msgid "High Fidelity Capture (A2DP)" +msgstr "Przechwytywanie o wysokiej dokładności (A2DP)" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2213 +msgid "Telephony Duplex (HSP/HFP)" +msgstr "Duplex telefoniczny (HSP/HFP)" + +#: ../src/modules/reserve-wrap.c:151 +msgid "PulseAudio Sound Server" +msgstr "Serwer dźwięku PulseAudio" + +#: ../src/modules/module-rygel-media-server.c:569 +#: ../src/modules/module-rygel-media-server.c:583 +msgid "Output Devices" +msgstr "Urządzenia wyjściowe" + +#: ../src/modules/module-rygel-media-server.c:570 +#: ../src/modules/module-rygel-media-server.c:584 +msgid "Input Devices" +msgstr "Urządzenia wejściowe" + +#: ../src/modules/module-rygel-media-server.c:774 +msgid "Audio on @HOSTNAME@" +msgstr "Dźwięk na @HOSTNAME@" + +#: ../src/modules/alsa/alsa-mixer.c:1701 +msgid "Input" +msgstr "Wejście" + +#: ../src/modules/alsa/alsa-mixer.c:1702 +msgid "Docking Station Input" +msgstr "Wejście stacji dokującej" + +#: ../src/modules/alsa/alsa-mixer.c:1703 +msgid "Docking Station Microphone" +msgstr "Mikrofon stacji dokującej" + +#: ../src/modules/alsa/alsa-mixer.c:1704 +msgid "Line-In" +msgstr "Wejście liniowe" + +#: ../src/modules/alsa/alsa-mixer.c:1705 +msgid "Microphone" +msgstr "Mikrofon" + +#: ../src/modules/alsa/alsa-mixer.c:1706 +msgid "External Microphone" +msgstr "Zewnętrzny mikrofon" + +#: ../src/modules/alsa/alsa-mixer.c:1707 +msgid "Internal Microphone" +msgstr "Wewnętrzny mikrofon" + +#: ../src/modules/alsa/alsa-mixer.c:1708 +msgid "Radio" +msgstr "Radio" + +#: ../src/modules/alsa/alsa-mixer.c:1709 +msgid "Video" +msgstr "Wideo" + +#: ../src/modules/alsa/alsa-mixer.c:1710 +msgid "Automatic Gain Control" +msgstr "Automatyczna kontrola natężenia" + +#: ../src/modules/alsa/alsa-mixer.c:1711 +msgid "No Automatic Gain Control" +msgstr "Brak automatycznej kontroli natężenia" + +#: ../src/modules/alsa/alsa-mixer.c:1712 +msgid "Boost" +msgstr "Podbicie" + +#: ../src/modules/alsa/alsa-mixer.c:1713 +msgid "No Boost" +msgstr "Brak podbicia" + +#: ../src/modules/alsa/alsa-mixer.c:1714 +msgid "Amplifier" +msgstr "Amplituner" + +#: ../src/modules/alsa/alsa-mixer.c:1715 +msgid "No Amplifier" +msgstr "Brak amplitunera" + +#: ../src/modules/alsa/alsa-mixer.c:1773 +msgid "Analog Input" +msgstr "Wejście analogowe" + +#: ../src/modules/alsa/alsa-mixer.c:1774 +msgid "Analog Microphone" +msgstr "Mikrofon analogowy" + +#: ../src/modules/alsa/alsa-mixer.c:1775 +msgid "Analog Line-In" +msgstr "Analogowe wejście liniowe" + +#: ../src/modules/alsa/alsa-mixer.c:1776 +msgid "Analog Radio" +msgstr "Radio analogowe" + +#: ../src/modules/alsa/alsa-mixer.c:1777 +msgid "Analog Video" +msgstr "Wideo analogowe" + +#: ../src/modules/alsa/alsa-mixer.c:1778 +msgid "Analog Output" +msgstr "Wyjście analogowe" + +#: ../src/modules/alsa/alsa-mixer.c:1779 +msgid "Analog Headphones" +msgstr "Słuchawki analogowe" + +#: ../src/modules/alsa/alsa-mixer.c:1780 +msgid "Analog Output (LFE)" +msgstr "Wyjście analogowe (subwoofer)" + +#: ../src/modules/alsa/alsa-mixer.c:1781 +msgid "Analog Mono Output" +msgstr "Analogowe wyjście mono" + +#: ../src/modules/alsa/alsa-mixer.c:1981 +#, c-format +msgid "%s+%s" +msgstr "%s+%s" + +#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404 +#, c-format +msgid "%s / %s" +msgstr "%s/%s" + +#: ../src/modules/alsa/alsa-mixer.c:2790 +msgid "Analog Mono" +msgstr "Analogowe mono" + +#: ../src/modules/alsa/alsa-mixer.c:2791 +msgid "Analog Stereo" +msgstr "Analogowe stereo" + +#: ../src/modules/alsa/alsa-mixer.c:2792 +msgid "Analog Surround 2.1" +msgstr "Analogowe surround 2.1" + +#: ../src/modules/alsa/alsa-mixer.c:2793 +msgid "Analog Surround 3.0" +msgstr "Analogowe surround 3.0" + +#: ../src/modules/alsa/alsa-mixer.c:2794 +msgid "Analog Surround 3.1" +msgstr "Analogowe surround 3.1" + +#: ../src/modules/alsa/alsa-mixer.c:2795 +msgid "Analog Surround 4.0" +msgstr "Analogowe surround 4.0" + +#: ../src/modules/alsa/alsa-mixer.c:2796 +msgid "Analog Surround 4.1" +msgstr "Analogowe surround 4.1" + +#: ../src/modules/alsa/alsa-mixer.c:2797 +msgid "Analog Surround 5.0" +msgstr "Analogowe surround 5.0" + +#: ../src/modules/alsa/alsa-mixer.c:2798 +msgid "Analog Surround 5.1" +msgstr "Analogowe surround 5.1" + +#: ../src/modules/alsa/alsa-mixer.c:2799 +msgid "Analog Surround 6.0" +msgstr "Analogowe surround 6.0" + +#: ../src/modules/alsa/alsa-mixer.c:2800 +msgid "Analog Surround 6.1" +msgstr "Analogowe surround 6.1" + +#: ../src/modules/alsa/alsa-mixer.c:2801 +msgid "Analog Surround 7.0" +msgstr "Analogowe surround 7.0" + +#: ../src/modules/alsa/alsa-mixer.c:2802 +msgid "Analog Surround 7.1" +msgstr "Analogowe surround 7.1" + +#: ../src/modules/alsa/alsa-mixer.c:2803 +msgid "Digital Stereo (IEC958)" +msgstr "Cyfrowe stereo (IEC958)" + +#: ../src/modules/alsa/alsa-mixer.c:2804 +msgid "Digital Surround 4.0 (IEC958)" +msgstr "Cyfrowe surround 4.0 (IEC958)" + +#: ../src/modules/alsa/alsa-mixer.c:2805 +msgid "Digital Surround 4.0 (IEC958/AC3)" +msgstr "Cyfrowe surround 4.0 (IEC958/AC3)" + +#: ../src/modules/alsa/alsa-mixer.c:2806 +msgid "Digital Surround 5.1 (IEC958/AC3)" +msgstr "Cyfrowe surround 5.1 (IEC958/AC3)" + +#: ../src/modules/alsa/alsa-mixer.c:2807 +msgid "Digital Stereo (HDMI)" +msgstr "Cyfrowe stereo (HDMI)" + +#: ../src/modules/alsa/alsa-mixer.c:2928 +msgid "Analog Mono Duplex" +msgstr "Analogowy dupleks mono" + +#: ../src/modules/alsa/alsa-mixer.c:2929 +msgid "Analog Stereo Duplex" +msgstr "Analogowy dupleks stereo" + +#: ../src/modules/alsa/alsa-mixer.c:2930 +msgid "Digital Stereo Duplex (IEC958)" +msgstr "Cyfrowy dupleks stereo (IEC958)" diff --git a/po/pt.po b/po/pt.po new file mode 100644 index 0000000..bca8d93 --- /dev/null +++ b/po/pt.po @@ -0,0 +1,2759 @@ +msgid "" +msgstr "" +"Project-Id-Version: pulseaudio\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-09-29 23:47+0200\n" +"PO-Revision-Date: \n" +"Last-Translator: Rui Gouveia \n" +"Language-Team: pt \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Portuguese\n" +"X-Poedit-Country: PORTUGAL\n" + +#: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629 +#, c-format +msgid "%s %s" +msgstr "%s %s" + +#: ../src/modules/alsa/alsa-util.c:1106 +#, c-format +msgid "" +"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu " +"ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_avail() retornou um valor excepcionalmente elevado: %lu bytes (%lu " +"ms).\n" +"Provavelmente isto é um erro no driver ALSA '%s'. Por favor, reporte este " +"problema aos programadores do ALSA." + +#: ../src/modules/alsa/alsa-util.c:1147 +#, c-format +msgid "" +"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%" +"lu ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_delay() retornou um valor excepcionalmente elevado: %li bytes (%s%lu " +"ms).\n" +"Provavelmente isto é um erro no driver ALSA '%s'. Por favor, reporte este " +"problema aos programadores do ALSA." + +#: ../src/modules/alsa/alsa-util.c:1194 +#, c-format +msgid "" +"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes " +"(%lu ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_mmap_begin() retornou um valor excepcionalmente elevado: %lu bytes (%" +"lu ms).\n" +"Provavelmente isto é um erro no driver ALSA '%s'. Por favor, reporte este " +"problema aos programadores do ALSA." + +#: ../src/modules/module-always-sink.c:39 +msgid "Always keeps at least one sink loaded even if it's a null one" +msgstr "Mantém sempre pelo menos um depósito carregado mesmo que seja um nulo" + +#: ../src/modules/module-always-sink.c:83 +msgid "Dummy Output" +msgstr "Saída Dummy" + +#: ../src/modules/module-ladspa-sink.c:49 +msgid "Virtual LADSPA sink" +msgstr "Depósito virtual LADSPA" + +#: ../src/modules/module-ladspa-sink.c:53 +msgid "" +"sink_name= sink_properties= " +"master= format= rate= " +"channels= channel_map= plugin= label= control=" +msgstr "" +"sink_name= sink_properties= " +"master= format= " +"rate= channels= " +"channel_map= plugin= label= control=" + +#: ../src/modules/module-null-sink.c:55 +msgid "Clocked NULL sink" +msgstr "" + +#: ../src/modules/module-null-sink.c:291 +msgid "Null Output" +msgstr "Saída nula" + +#: ../src/pulsecore/sink.c:2613 +msgid "Internal Audio" +msgstr "Áudio Interno" + +#: ../src/pulsecore/sink.c:2618 +msgid "Modem" +msgstr "Modem" + +#: ../src/daemon/ltdl-bind-now.c:124 +msgid "Failed to find original lt_dlopen loader." +msgstr "Não foi possível encontrar o carregador \"lt_dlopen\"." + +#: ../src/daemon/ltdl-bind-now.c:129 +msgid "Failed to allocate new dl loader." +msgstr "Não foi possível alocar o novo carregador \"dl\"." + +#: ../src/daemon/ltdl-bind-now.c:142 +msgid "Failed to add bind-now-loader." +msgstr "Não foi possível adicionar \"bind-now-loader\"." + +#: ../src/daemon/main.c:141 +#, c-format +msgid "Got signal %s." +msgstr "Foi obtido o sinal %s." + +#: ../src/daemon/main.c:168 +msgid "Exiting." +msgstr "A sair." + +#: ../src/daemon/main.c:186 +#, c-format +msgid "Failed to find user '%s'." +msgstr "Falha ao procurar o utilizador '%s'." + +#: ../src/daemon/main.c:191 +#, c-format +msgid "Failed to find group '%s'." +msgstr "Falha ao procurar o grupo '%s'." + +#: ../src/daemon/main.c:195 +#, c-format +msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)." +msgstr "Foi encontrado utilizador '%s' (UID %lu) e grupo '%s' (GID %lu)." + +#: ../src/daemon/main.c:200 +#, c-format +msgid "GID of user '%s' and of group '%s' don't match." +msgstr "GID do utilizador '%s' e do grupo '%s' não coincidem." + +#: ../src/daemon/main.c:205 +#, c-format +msgid "Home directory of user '%s' is not '%s', ignoring." +msgstr "Directório pessoal do utilizador '%s' não é '%s'. A ignorar." + +#: ../src/daemon/main.c:208 ../src/daemon/main.c:213 +#, c-format +msgid "Failed to create '%s': %s" +msgstr "Falha ao criar o '%s': %s" + +#: ../src/daemon/main.c:220 +#, c-format +msgid "Failed to change group list: %s" +msgstr "Falhou a alteração da lista de grupos: %s" + +#: ../src/daemon/main.c:236 +#, c-format +msgid "Failed to change GID: %s" +msgstr "Não foi possível mudar o GID: %s" + +#: ../src/daemon/main.c:252 +#, c-format +msgid "Failed to change UID: %s" +msgstr "Não foi possível mudar o UID: %s" + +#: ../src/daemon/main.c:271 +msgid "Successfully dropped root privileges." +msgstr "Privilégios de root cedidos com sucesso." + +#: ../src/daemon/main.c:279 +msgid "System wide mode unsupported on this platform." +msgstr "Modo de sistema não suportado nesta plataforma." + +#: ../src/daemon/main.c:297 +#, c-format +msgid "setrlimit(%s, (%u, %u)) failed: %s" +msgstr "setrlimit(%s, (%u, %u)) falhou: %s" + +#: ../src/daemon/main.c:474 +msgid "Failed to parse command line." +msgstr "Não foi possível processar linha de comando." + +#: ../src/daemon/main.c:541 +msgid "Daemon not running" +msgstr "Serviço não está a executar" + +#: ../src/daemon/main.c:543 +#, c-format +msgid "Daemon running as PID %u" +msgstr "Serviço a executar como PID %u" + +#: ../src/daemon/main.c:553 +#, c-format +msgid "Failed to kill daemon: %s" +msgstr "Tentativa de matar serviço falhou: %s" + +#: ../src/daemon/main.c:571 +msgid "" +"This program is not intended to be run as root (unless --system is " +"specified)." +msgstr "" +"Este programa não pretende ser executado como root (a não ser que a opção --" +"system seja especificada)." + +#: ../src/daemon/main.c:573 +msgid "Root privileges required." +msgstr "São necessários privilégios de root." + +#: ../src/daemon/main.c:578 +msgid "--start not supported for system instances." +msgstr "--start não é suportado para instâncias do sistema." + +#: ../src/daemon/main.c:583 +msgid "Running in system mode, but --disallow-exit not set!" +msgstr "A executar em modo de sistema, mas --disallow-exit não está definido!" + +#: ../src/daemon/main.c:586 +msgid "Running in system mode, but --disallow-module-loading not set!" +msgstr "" +"A executar em modo de sistema, mas --disallow-module-loading não está " +"definido!" + +#: ../src/daemon/main.c:589 +msgid "Running in system mode, forcibly disabling SHM mode!" +msgstr "A executar em modo de sistema, a forçar a desactivação do modo SHM!" + +#: ../src/daemon/main.c:594 +msgid "Running in system mode, forcibly disabling exit idle time!" +msgstr "" +"A executar em modo de sistema, a forçar a desactivação da saída por " +"inactividade!" + +#: ../src/daemon/main.c:621 +msgid "Failed to acquire stdio." +msgstr "Não foi possível adquirir o stdio." + +#: ../src/daemon/main.c:627 +#, c-format +msgid "pipe failed: %s" +msgstr "pipe falhou: %s" + +#: ../src/daemon/main.c:632 +#, c-format +msgid "fork() failed: %s" +msgstr "fork() falhou: %s" + +#: ../src/daemon/main.c:646 ../src/utils/pacat.c:508 +#, c-format +msgid "read() failed: %s" +msgstr "read() falhou: %s" + +#: ../src/daemon/main.c:652 +msgid "Daemon startup failed." +msgstr "Arranque do serviço falhou." + +#: ../src/daemon/main.c:654 +msgid "Daemon startup successful." +msgstr "Arranque do serviço sucedeu." + +#: ../src/daemon/main.c:731 +#, c-format +msgid "This is PulseAudio %s" +msgstr "Isto é PulseAudio %s" + +#: ../src/daemon/main.c:732 +#, c-format +msgid "Compilation host: %s" +msgstr "Máquina de compilação: %s" + +#: ../src/daemon/main.c:733 +#, c-format +msgid "Compilation CFLAGS: %s" +msgstr "CFLAGS utilizadas na compilação: %s" + +#: ../src/daemon/main.c:736 +#, c-format +msgid "Running on host: %s" +msgstr "A executar na máquina: %s" + +#: ../src/daemon/main.c:739 +#, c-format +msgid "Found %u CPUs." +msgstr "Foram encontrados %u CPUs." + +#: ../src/daemon/main.c:741 +#, c-format +msgid "Page size is %lu bytes" +msgstr "Tamanho da página é %lu bytes" + +#: ../src/daemon/main.c:744 +msgid "Compiled with Valgrind support: yes" +msgstr "Compilado com suporte para Valgrind: sim" + +#: ../src/daemon/main.c:746 +msgid "Compiled with Valgrind support: no" +msgstr "Compilado com suporte para Valgrind: não" + +#: ../src/daemon/main.c:749 +#, c-format +msgid "Running in valgrind mode: %s" +msgstr "A executar em modo \"valgrind\": %s" + +#: ../src/daemon/main.c:752 +msgid "Optimized build: yes" +msgstr "Optimizado: sim" + +#: ../src/daemon/main.c:754 +msgid "Optimized build: no" +msgstr "Compilação optimizada: não" + +#: ../src/daemon/main.c:758 +msgid "NDEBUG defined, all asserts disabled." +msgstr "NDEBUG definido, todas as declarações desactivadas." + +#: ../src/daemon/main.c:760 +msgid "FASTPATH defined, only fast path asserts disabled." +msgstr "FASTPATH definido, apenas as declarações \"fast path\" desactivadas." + +#: ../src/daemon/main.c:762 +msgid "All asserts enabled." +msgstr "Todas as declarações desactivadas." + +#: ../src/daemon/main.c:766 +msgid "Failed to get machine ID" +msgstr "A tentativa de ler o ID da máquina falhou" + +#: ../src/daemon/main.c:769 +#, c-format +msgid "Machine ID is %s." +msgstr "O ID da máquina é %s." + +#: ../src/daemon/main.c:773 +#, c-format +msgid "Session ID is %s." +msgstr "O ID da sessão é %s." + +#: ../src/daemon/main.c:779 +#, c-format +msgid "Using runtime directory %s." +msgstr "Execução a utilizar o directório %s" + +#: ../src/daemon/main.c:784 +#, c-format +msgid "Using state directory %s." +msgstr "A manter o estado no directório %s." + +#: ../src/daemon/main.c:787 +#, c-format +msgid "Using modules directory %s." +msgstr "A utilizar o directório de módulos %s" + +#: ../src/daemon/main.c:789 +#, c-format +msgid "Running in system mode: %s" +msgstr "Execução em modo de sistema: %s" + +#: ../src/daemon/main.c:792 +msgid "" +"OK, so you are running PA in system mode. Please note that you most likely " +"shouldn't be doing that.\n" +"If you do it nonetheless then it's your own fault if things don't work as " +"expected.\n" +"Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an " +"explanation why system mode is usually a bad idea." +msgstr "" +"Ok, então está a correr PA em modo de sistema. Por favor repare que não " +"deveria estar a fazê-lo.\n" +"Se, na mesma, o continuar a fazer e as coisas não correrem como esperado, a " +"culpa será sua.\n" +"Por favor leia http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode para uma " +"explicação de como o modo de sistema é usualmente uma má ideia." + +#: ../src/daemon/main.c:809 +msgid "pa_pid_file_create() failed." +msgstr "pa_pid_file_create() falhou." + +#: ../src/daemon/main.c:819 +msgid "Fresh high-resolution timers available! Bon appetit!" +msgstr "Timer \"frescos\" de alta resolução disponíveis. Bom apetite!" + +#: ../src/daemon/main.c:821 +msgid "" +"Dude, your kernel stinks! The chef's recommendation today is Linux with high-" +"resolution timers enabled!" +msgstr "" +"Oh pá, o teu kernel não presta! O prato do dia recomendado é Linux com " +"timers de alta resolução activos!" + +#: ../src/daemon/main.c:844 +msgid "pa_core_new() failed." +msgstr "pa_core_new() falhou." + +#: ../src/daemon/main.c:904 +msgid "Failed to initialize daemon." +msgstr "Falha ao inicializar serviço." + +#: ../src/daemon/main.c:909 +msgid "Daemon startup without any loaded modules, refusing to work." +msgstr "Serviço arrancou sem módulos carregados. A recusar trabalhar." + +#: ../src/daemon/main.c:926 +msgid "Daemon startup complete." +msgstr "Arranque do serviço completo." + +#: ../src/daemon/main.c:932 +msgid "Daemon shutdown initiated." +msgstr "Encerramento do serviço iniciado." + +#: ../src/daemon/main.c:954 +msgid "Daemon terminated." +msgstr "Serviço terminado." + +#: ../src/daemon/cmdline.c:115 +#, c-format +msgid "" +"%s [options]\n" +"\n" +"COMMANDS:\n" +" -h, --help Show this help\n" +" --version Show version\n" +" --dump-conf Dump default configuration\n" +" --dump-modules Dump list of available modules\n" +" --dump-resample-methods Dump available resample methods\n" +" --cleanup-shm Cleanup stale shared memory " +"segments\n" +" --start Start the daemon if it is not " +"running\n" +" -k --kill Kill a running daemon\n" +" --check Check for a running daemon (only " +"returns exit code)\n" +"\n" +"OPTIONS:\n" +" --system[=BOOL] Run as system-wide instance\n" +" -D, --daemonize[=BOOL] Daemonize after startup\n" +" --fail[=BOOL] Quit when startup fails\n" +" --high-priority[=BOOL] Try to set high nice level\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_NICE)\n" +" --realtime[=BOOL] Try to enable realtime scheduling\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_RTPRIO)\n" +" --disallow-module-loading[=BOOL] Disallow module user requested " +"module\n" +" loading/unloading after startup\n" +" --disallow-exit[=BOOL] Disallow user requested exit\n" +" --exit-idle-time=SECS Terminate the daemon when idle and " +"this\n" +" time passed\n" +" --module-idle-time=SECS Unload autoloaded modules when idle " +"and\n" +" this time passed\n" +" --scache-idle-time=SECS Unload autoloaded samples when idle " +"and\n" +" this time passed\n" +" --log-level[=LEVEL] Increase or set verbosity level\n" +" -v Increase the verbosity level\n" +" --log-target={auto,syslog,stderr} Specify the log target\n" +" --log-meta[=BOOL] Include code location in log " +"messages\n" +" --log-time[=BOOL] Include timestamps in log messages\n" +" --log-backtrace=FRAMES Include a backtrace in log messages\n" +" -p, --dl-search-path=PATH Set the search path for dynamic " +"shared\n" +" objects (plugins)\n" +" --resample-method=METHOD Use the specified resampling method\n" +" (See --dump-resample-methods for\n" +" possible values)\n" +" --use-pid-file[=BOOL] Create a PID file\n" +" --no-cpu-limit[=BOOL] Do not install CPU load limiter on\n" +" platforms that support it.\n" +" --disable-shm[=BOOL] Disable shared memory support.\n" +"\n" +"STARTUP SCRIPT:\n" +" -L, --load=\"MODULE ARGUMENTS\" Load the specified plugin module " +"with\n" +" the specified argument\n" +" -F, --file=FILENAME Run the specified script\n" +" -C Open a command line on the running " +"TTY\n" +" after startup\n" +"\n" +" -n Don't load default script file\n" +msgstr "" +"%s [opções]\n" +"\n" +"COMANDOS:\n" +" -h, --help Mostra esta ajuda\n" +" --version Mostra versão\n" +" --dump-conf Despeja configuração por omissão\n" +" --dump-modules Despeja lista de módulos " +"disponíveis\n" +" --dump-resample-methods Despeja métodos \"resample\" " +"disponíveis\n" +" --cleanup-shm Limpar segmentos de memória " +"partilhados encravados\n" +" --start Inicia o serviço, se ainda não " +"estiver a executar\n" +" -k --kill Termina o serviço, se estiver a " +"executar \n" +" --check Verifica se o serviço está a " +"executar (apenas retorna um código de saída)\n" +"\n" +"OPTIONS:\n" +" --system[=BOOL] Executa em modo de sistema\n" +" -D, --daemonize[=BOOL] Passa a serviço depois de executar\n" +" --fail[=BOOL] Termina quando o arranque falha\n" +" --high-priority[=BOOL] Tenta definir um alto nível de " +"execução\n" +" (apenas disponível como root, quando " +"é SUID ou\n" +" com níveis elevados de RLIMIT_NICE)\n" +" --realtime[=BOOL] Tenta activar escalonamento em tempo " +"real\n" +" (apenas disponível como root, quando " +"é SUID ou\n" +" com níveis elevados de " +"RLIMIT_RTPRIO)\n" +" --disallow-module-loading[=BOOL] Desautoriza o carregamento/" +"descarregamento\n" +" de módulos, pelo utilizador, depois " +"do arranque\n" +" --disallow-exit[=BOOL] Desautoriza pedidos de saída do " +"utilizador\n" +" --exit-idle-time=SECS Termina o serviço quando inactivo e " +"já passou\n" +" este tempo\n" +" --module-idle-time=SECS Descarregar módulos de carregamento " +"automático quando inactivo e\n" +" passou este tempo\n" +" --scache-idle-time=SECS Descarregar amostras de carregamento " +"automático quando inactivas e\n" +" passou este tempo\n" +" --log-level[=LEVEL] Aumenta ou define o nível de " +"verbosidade\n" +" -v Aumenta o nível de verbosidade\n" +" --log-target={auto,syslog,stderr} Especifica o ficheiro de registo\n" +" --log-meta[=BOOL] Inclui código de localização na " +"mensagem de registo\n" +" --log-time[=BOOL] Inclui tempo na mensagem de registo\n" +" --log-backtrace=FRAMES Inclui informação de tracagem na " +"mensagem de registo\n" +" -p, --dl-search-path=PATH Define o caminho de procura para os " +"plugins partilhados dinâmicos\n" +" --resample-method=METHOD Utilizar o método de \"resampling\" " +"especificado\n" +" (Ver --dump-resample-methods para\n" +" possíveis valores)\n" +" --use-pid-file[=BOOL] Criar um ficheiro com o PID\n" +" --no-cpu-limit[=BOOL] Não instala limitadores de load no " +"CPU em\n" +" plataformas que o suportam.\n" +" --disable-shm[=BOOL] Desactivar suporte para memória " +"partilhada.\n" +"\n" +"STARTUP SCRIPT:\n" +" -L, --load=\"MODULE ARGUMENTS\" Carrega o módulo especificado com\n" +" o argumento especificado\n" +" -F, --file=FILENAME Executa o script especificado\n" +" -C Abre uma linha de comando no TTY " +"(consola) em execução\n" +" depois do arranque\n" +"\n" +" -n Não carrega o script por omissão\n" + +#: ../src/daemon/cmdline.c:247 +msgid "--daemonize expects boolean argument" +msgstr "--daemonize espera argumento booleano" + +#: ../src/daemon/cmdline.c:254 +msgid "--fail expects boolean argument" +msgstr "--fail espera argumento booleano" + +#: ../src/daemon/cmdline.c:264 +msgid "" +"--log-level expects log level argument (either numeric in range 0..4 or one " +"of debug, info, notice, warn, error)." +msgstr "" +"--log-level espera um argumento para o nível de log (numérico no intervalo " +"0..4 ou um dos seguintes: debug, info, notice, warn, error)." + +#: ../src/daemon/cmdline.c:276 +msgid "--high-priority expects boolean argument" +msgstr "--high-priority espera argumento booleano" + +#: ../src/daemon/cmdline.c:283 +msgid "--realtime expects boolean argument" +msgstr "--realtime espera argumento booleano" + +#: ../src/daemon/cmdline.c:290 +msgid "--disallow-module-loading expects boolean argument" +msgstr "--disallow-module-loading espera argumento booleano" + +#: ../src/daemon/cmdline.c:297 +msgid "--disallow-exit expects boolean argument" +msgstr "--disallow-exit espera argumento booleano" + +#: ../src/daemon/cmdline.c:304 +msgid "--use-pid-file expects boolean argument" +msgstr "--use-pid-file espera argumento booleano" + +#: ../src/daemon/cmdline.c:321 +msgid "Invalid log target: use either 'syslog', 'stderr' or 'auto'." +msgstr "" +"Destino de ficheiro de registo inválido: utilize 'syslog', 'stderr' ou " +"'auto'." + +#: ../src/daemon/cmdline.c:328 +msgid "--log-time expects boolean argument" +msgstr "--log-time espera argumento booleano" + +#: ../src/daemon/cmdline.c:335 +msgid "--log-meta expects boolean argument" +msgstr "--log-meta espera argumento booleano" + +#: ../src/daemon/cmdline.c:354 +#, c-format +msgid "Invalid resample method '%s'." +msgstr "Método de resample inválido '%s'." + +#: ../src/daemon/cmdline.c:361 +msgid "--system expects boolean argument" +msgstr "--system espera argumento booleano" + +#: ../src/daemon/cmdline.c:368 +msgid "--no-cpu-limit expects boolean argument" +msgstr "--no-cpu-limit espera argumento booleano" + +#: ../src/daemon/cmdline.c:375 +msgid "--disable-shm expects boolean argument" +msgstr "--disable-shm espera argumento booleano" + +#: ../src/daemon/dumpmodules.c:60 +#, c-format +msgid "Name: %s\n" +msgstr "Nome: %s\n" + +#: ../src/daemon/dumpmodules.c:63 +#, c-format +msgid "No module information available\n" +msgstr "Nenhuma informação de módulo disponível\n" + +#: ../src/daemon/dumpmodules.c:66 +#, c-format +msgid "Version: %s\n" +msgstr "Versão: %s\n" + +#: ../src/daemon/dumpmodules.c:68 +#, c-format +msgid "Description: %s\n" +msgstr "Descrição: %s\n" + +#: ../src/daemon/dumpmodules.c:70 +#, c-format +msgid "Author: %s\n" +msgstr "Autor: %s\n" + +#: ../src/daemon/dumpmodules.c:72 +#, c-format +msgid "Usage: %s\n" +msgstr "Utilização: %s\n" + +#: ../src/daemon/dumpmodules.c:73 +#, c-format +msgid "Load Once: %s\n" +msgstr "Carregar Uma Vez: %s\n" + +#: ../src/daemon/dumpmodules.c:75 +#, c-format +msgid "DEPRECATION WARNING: %s\n" +msgstr "AVISO DE DESCONTINUIDADE: %s\n" + +#: ../src/daemon/dumpmodules.c:79 +#, c-format +msgid "Path: %s\n" +msgstr "Caminho: %s\n" + +#: ../src/daemon/daemon-conf.c:232 +#, c-format +msgid "[%s:%u] Invalid log target '%s'." +msgstr "[%s:%u] ficheiro registo de destino inválido '%s'." + +#: ../src/daemon/daemon-conf.c:248 +#, c-format +msgid "[%s:%u] Invalid log level '%s'." +msgstr "[%s:%u] Nível do ficheiro de registo inválido '%s'." + +#: ../src/daemon/daemon-conf.c:264 +#, c-format +msgid "[%s:%u] Invalid resample method '%s'." +msgstr "[%s:%u] Método de reamostragem inválido '%s'." + +#: ../src/daemon/daemon-conf.c:287 +#, c-format +msgid "[%s:%u] Invalid rlimit '%s'." +msgstr "[%s:%u] rlimit inválido '%s'." + +#: ../src/daemon/daemon-conf.c:294 +#, c-format +msgid "[%s:%u] rlimit not supported on this platform." +msgstr "[%s:%u] rlimit não é suportado nesta plataforma." + +#: ../src/daemon/daemon-conf.c:310 +#, c-format +msgid "[%s:%u] Invalid sample format '%s'." +msgstr "[%s:%u] Formato da amostra inválido '%s'." + +#: ../src/daemon/daemon-conf.c:328 +#, c-format +msgid "[%s:%u] Invalid sample rate '%s'." +msgstr "[%s:%u] Taxa de amostragem '%s' inválida." + +#: ../src/daemon/daemon-conf.c:352 +#, c-format +msgid "[%s:%u] Invalid sample channels '%s'." +msgstr "[%s:%u] Canais de amostragem inválidos '%s'." + +#: ../src/daemon/daemon-conf.c:370 +#, c-format +msgid "[%s:%u] Invalid channel map '%s'." +msgstr "[%s:%u] Mapa de canais inválido '%s'." + +#: ../src/daemon/daemon-conf.c:388 +#, c-format +msgid "[%s:%u] Invalid number of fragments '%s'." +msgstr "[%s:%u] Número inválido de fragmentos '%s'." + +#: ../src/daemon/daemon-conf.c:406 +#, c-format +msgid "[%s:%u] Invalid fragment size '%s'." +msgstr "[%s:%u] Tamanho do fragmento inválido '%s'." + +#: ../src/daemon/daemon-conf.c:424 +#, c-format +msgid "[%s:%u] Invalid nice level '%s'." +msgstr "[%s:%u] nível nice inválido '%s'." + +#: ../src/daemon/daemon-conf.c:546 +#, c-format +msgid "Failed to open configuration file: %s" +msgstr "Falha ao abrir ficheiro de configuração: %s" + +#: ../src/daemon/daemon-conf.c:562 +msgid "" +"The specified default channel map has a different number of channels than " +"the specified default number of channels." +msgstr "" +"O mapa de canais especificado tem um número de canais diferente do número de " +"canais definido por omissão." + +#: ../src/daemon/daemon-conf.c:638 +#, c-format +msgid "### Read from configuration file: %s ###\n" +msgstr "### Ler configuração a partir do ficheiro: %s ###\n" + +#: ../src/daemon/caps.c:62 +msgid "Cleaning up privileges." +msgstr "A limpar privilégios." + +#: ../src/daemon/pulseaudio.desktop.in.h:1 +msgid "PulseAudio Sound System" +msgstr "Sistema de Som PulseAudio" + +#: ../src/daemon/pulseaudio.desktop.in.h:2 +msgid "Start the PulseAudio Sound System" +msgstr "Inciar o Sistema de Som PulseAudio" + +#: ../src/pulse/channelmap.c:105 ../src/pulse/channelmap.c:757 +msgid "Mono" +msgstr "Mono" + +#: ../src/pulse/channelmap.c:107 +msgid "Front Center" +msgstr "Frontal Central" + +#: ../src/pulse/channelmap.c:108 +msgid "Front Left" +msgstr "Frontal Esquerda" + +#: ../src/pulse/channelmap.c:109 +msgid "Front Right" +msgstr "Frontal Direita" + +#: ../src/pulse/channelmap.c:111 +msgid "Rear Center" +msgstr "Traseira Central" + +#: ../src/pulse/channelmap.c:112 +msgid "Rear Left" +msgstr "Traseira Esquerda" + +#: ../src/pulse/channelmap.c:113 +msgid "Rear Right" +msgstr "Traseira Direita" + +#: ../src/pulse/channelmap.c:115 +msgid "Low Frequency Emmiter" +msgstr "Emissor de Baixa Frequência" + +#: ../src/pulse/channelmap.c:117 +msgid "Front Left-of-center" +msgstr "Central Centro-Esquerda" + +#: ../src/pulse/channelmap.c:118 +msgid "Front Right-of-center" +msgstr "Central Centro-Direita" + +#: ../src/pulse/channelmap.c:120 +msgid "Side Left" +msgstr "Lateral Esquerda" + +#: ../src/pulse/channelmap.c:121 +msgid "Side Right" +msgstr "Lateral Direita" + +#: ../src/pulse/channelmap.c:123 +msgid "Auxiliary 0" +msgstr "Auxiliar 0" + +#: ../src/pulse/channelmap.c:124 +msgid "Auxiliary 1" +msgstr "Auxiliar 1" + +#: ../src/pulse/channelmap.c:125 +msgid "Auxiliary 2" +msgstr "Auxiliar 2" + +#: ../src/pulse/channelmap.c:126 +msgid "Auxiliary 3" +msgstr "Auxiliar 3" + +#: ../src/pulse/channelmap.c:127 +msgid "Auxiliary 4" +msgstr "Auxiliar 4" + +#: ../src/pulse/channelmap.c:128 +msgid "Auxiliary 5" +msgstr "Auxiliar 5" + +#: ../src/pulse/channelmap.c:129 +msgid "Auxiliary 6" +msgstr "Auxiliar 6" + +#: ../src/pulse/channelmap.c:130 +msgid "Auxiliary 7" +msgstr "Auxiliar 7" + +#: ../src/pulse/channelmap.c:131 +msgid "Auxiliary 8" +msgstr "Auxiliar 8" + +#: ../src/pulse/channelmap.c:132 +msgid "Auxiliary 9" +msgstr "Auxiliar 9" + +#: ../src/pulse/channelmap.c:133 +msgid "Auxiliary 10" +msgstr "Auxiliar 10" + +#: ../src/pulse/channelmap.c:134 +msgid "Auxiliary 11" +msgstr "Auxiliar 11" + +#: ../src/pulse/channelmap.c:135 +msgid "Auxiliary 12" +msgstr "Auxiliar 12" + +#: ../src/pulse/channelmap.c:136 +msgid "Auxiliary 13" +msgstr "Auxiliar 13" + +#: ../src/pulse/channelmap.c:137 +msgid "Auxiliary 14" +msgstr "Auxiliar 14" + +#: ../src/pulse/channelmap.c:138 +msgid "Auxiliary 15" +msgstr "Auxiliar 15" + +#: ../src/pulse/channelmap.c:139 +msgid "Auxiliary 16" +msgstr "Auxiliar 16" + +#: ../src/pulse/channelmap.c:140 +msgid "Auxiliary 17" +msgstr "Auxiliar 17" + +#: ../src/pulse/channelmap.c:141 +msgid "Auxiliary 18" +msgstr "Auxiliar 18" + +#: ../src/pulse/channelmap.c:142 +msgid "Auxiliary 19" +msgstr "Auxiliar 19" + +#: ../src/pulse/channelmap.c:143 +msgid "Auxiliary 20" +msgstr "Auxiliar 20" + +#: ../src/pulse/channelmap.c:144 +msgid "Auxiliary 21" +msgstr "Auxiliar 21" + +#: ../src/pulse/channelmap.c:145 +msgid "Auxiliary 22" +msgstr "Auxiliar 22" + +#: ../src/pulse/channelmap.c:146 +msgid "Auxiliary 23" +msgstr "Auxiliar 23" + +#: ../src/pulse/channelmap.c:147 +msgid "Auxiliary 24" +msgstr "Auxiliar 24" + +#: ../src/pulse/channelmap.c:148 +msgid "Auxiliary 25" +msgstr "Auxiliar 25" + +#: ../src/pulse/channelmap.c:149 +msgid "Auxiliary 26" +msgstr "Auxiliar 26" + +#: ../src/pulse/channelmap.c:150 +msgid "Auxiliary 27" +msgstr "Auxiliar 27" + +#: ../src/pulse/channelmap.c:151 +msgid "Auxiliary 28" +msgstr "Auxiliar 28" + +#: ../src/pulse/channelmap.c:152 +msgid "Auxiliary 29" +msgstr "Auxiliar 29" + +#: ../src/pulse/channelmap.c:153 +msgid "Auxiliary 30" +msgstr "Auxiliar 30" + +#: ../src/pulse/channelmap.c:154 +msgid "Auxiliary 31" +msgstr "Auxiliar 31" + +#: ../src/pulse/channelmap.c:156 +msgid "Top Center" +msgstr "Topo Centro" + +#: ../src/pulse/channelmap.c:158 +msgid "Top Front Center" +msgstr "Topo Central Centro" + +#: ../src/pulse/channelmap.c:159 +msgid "Top Front Left" +msgstr "Topo Frontal Esquerda" + +#: ../src/pulse/channelmap.c:160 +msgid "Top Front Right" +msgstr "Topo Frontal Direita" + +#: ../src/pulse/channelmap.c:162 +msgid "Top Rear Center" +msgstr "Topo Traseira Centro" + +#: ../src/pulse/channelmap.c:163 +msgid "Top Rear Left" +msgstr "Topo Traseira Esquerda" + +#: ../src/pulse/channelmap.c:164 +msgid "Top Rear Right" +msgstr "Topo Traseira Direita" + +#: ../src/pulse/channelmap.c:484 ../src/pulse/sample.c:170 +#: ../src/pulse/volume.c:295 ../src/pulse/volume.c:321 +#: ../src/pulse/volume.c:341 ../src/pulse/volume.c:371 +msgid "(invalid)" +msgstr "(inválido)" + +#: ../src/pulse/channelmap.c:761 +msgid "Stereo" +msgstr "Estéreo" + +#: ../src/pulse/channelmap.c:766 +msgid "Surround 4.0" +msgstr "Surround 4.0" + +#: ../src/pulse/channelmap.c:772 +msgid "Surround 4.1" +msgstr "Surround 4.1" + +#: ../src/pulse/channelmap.c:778 +msgid "Surround 5.0" +msgstr "Surround 5.0" + +#: ../src/pulse/channelmap.c:784 +msgid "Surround 5.1" +msgstr "Surround 5.1" + +#: ../src/pulse/channelmap.c:791 +msgid "Surround 7.1" +msgstr "Surround 7.1" + +#: ../src/pulse/error.c:43 +msgid "OK" +msgstr "OK" + +#: ../src/pulse/error.c:44 +msgid "Access denied" +msgstr "Acesso negado" + +#: ../src/pulse/error.c:45 +msgid "Unknown command" +msgstr "Comando desconhecido" + +#: ../src/pulse/error.c:46 +msgid "Invalid argument" +msgstr "Argumento inválido" + +#: ../src/pulse/error.c:47 +msgid "Entity exists" +msgstr "Entidade existe! " + +#: ../src/pulse/error.c:48 +msgid "No such entity" +msgstr "Entidade não existe" + +#: ../src/pulse/error.c:49 +msgid "Connection refused" +msgstr "Ligação recusada" + +#: ../src/pulse/error.c:50 +msgid "Protocol error" +msgstr "Erro de protocolo" + +#: ../src/pulse/error.c:51 +msgid "Timeout" +msgstr "Tempo expirou" + +#: ../src/pulse/error.c:52 +msgid "No authorization key" +msgstr "Sem chave de autorização" + +#: ../src/pulse/error.c:53 +msgid "Internal error" +msgstr "Erro interno" + +#: ../src/pulse/error.c:54 +msgid "Connection terminated" +msgstr "Ligação terminou" + +#: ../src/pulse/error.c:55 +msgid "Entity killed" +msgstr "Entidade terminada" + +#: ../src/pulse/error.c:56 +msgid "Invalid server" +msgstr "Servidor Inválido" + +#: ../src/pulse/error.c:57 +msgid "Module initalization failed" +msgstr "Inicialização do módulo falhou" + +#: ../src/pulse/error.c:58 +msgid "Bad state" +msgstr "Mau estado" + +#: ../src/pulse/error.c:59 +msgid "No data" +msgstr "Nenhuns dados" + +#: ../src/pulse/error.c:60 +msgid "Incompatible protocol version" +msgstr "Versão de protocolo incompatível" + +#: ../src/pulse/error.c:61 +msgid "Too large" +msgstr "Demasiado Grande" + +#: ../src/pulse/error.c:62 +msgid "Not supported" +msgstr "Não suportado" + +#: ../src/pulse/error.c:63 +msgid "Unknown error code" +msgstr "Código de erro desconhecido" + +#: ../src/pulse/error.c:64 +msgid "No such extension" +msgstr "Extensão não existe" + +#: ../src/pulse/error.c:65 +msgid "Obsolete functionality" +msgstr "Funcionalidade obsoleta" + +#: ../src/pulse/error.c:66 +msgid "Missing implementation" +msgstr "Implementação em falta" + +#: ../src/pulse/error.c:67 +msgid "Client forked" +msgstr "Cliente efectuou um fork" + +#: ../src/pulse/error.c:68 +msgid "Input/Output error" +msgstr "Erro de entrada/saída" + +#: ../src/pulse/error.c:69 +msgid "Device or resource busy" +msgstr "Dispositivo ou recurso ocupado" + +#: ../src/pulse/sample.c:172 +#, c-format +msgid "%s %uch %uHz" +msgstr "%s %uch %uHz" + +#: ../src/pulse/sample.c:184 +#, c-format +msgid "%0.1f GiB" +msgstr "%.1f GiB" + +#: ../src/pulse/sample.c:186 +#, c-format +msgid "%0.1f MiB" +msgstr "%.1f MiB" + +#: ../src/pulse/sample.c:188 +#, c-format +msgid "%0.1f KiB" +msgstr "%.1f KiB" + +#: ../src/pulse/sample.c:190 +#, c-format +msgid "%u B" +msgstr "%u B" + +#: ../src/pulse/client-conf-x11.c:55 ../src/utils/pax11publish.c:100 +msgid "XOpenDisplay() failed" +msgstr "XOpenDisplay() falhou" + +#: ../src/pulse/client-conf-x11.c:93 +msgid "Failed to parse cookie data" +msgstr "Não foi possível processar dados da cookie" + +#: ../src/pulse/client-conf.c:111 +#, c-format +msgid "Failed to open configuration file '%s': %s" +msgstr "Falha ao abrir ficheiro de configuração '%s': %s" + +#: ../src/pulse/context.c:550 +msgid "No cookie loaded. Attempting to connect without." +msgstr "Nenhuma cookie carregada. A tentar ligar sem cookie." + +#: ../src/pulse/context.c:693 +#, c-format +msgid "fork(): %s" +msgstr "fork(): %s" + +#: ../src/pulse/context.c:748 +#, c-format +msgid "waitpid(): %s" +msgstr "waitpid(): %s" + +#: ../src/pulse/context.c:1438 +#, c-format +msgid "Received message for unknown extension '%s'" +msgstr "Recebida mensagem para extensão desconhecida '%s'" + +#: ../src/utils/pacat.c:108 +#, c-format +msgid "Failed to drain stream: %s" +msgstr "Falha ao esvaziar fluxo: %s" + +#: ../src/utils/pacat.c:113 +msgid "Playback stream drained." +msgstr "Fluxo de leitura drenado." + +#: ../src/utils/pacat.c:123 +msgid "Draining connection to server." +msgstr "A drenar ligação ao servidor." + +#: ../src/utils/pacat.c:136 +#, c-format +msgid "pa_stream_drain(): %s" +msgstr "pa_stream_drain(): %s" + +#: ../src/utils/pacat.c:159 +#, c-format +msgid "pa_stream_write() failed: %s" +msgstr "pa_stream_write() falhou: %s" + +#: ../src/utils/pacat.c:197 +#, c-format +msgid "pa_stream_begin_write() failed: %s" +msgstr "pa_stream_write() falhou: %s" + +#: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267 +#, c-format +msgid "pa_stream_peek() failed: %s" +msgstr "pa_stream_peek() falhou: %s" + +#: ../src/utils/pacat.c:307 +msgid "Stream successfully created." +msgstr "Fluxo criado com sucesso." + +#: ../src/utils/pacat.c:310 +#, c-format +msgid "pa_stream_get_buffer_attr() failed: %s" +msgstr "pa_stream_get_buffer_attr() falhou: %s" + +#: ../src/utils/pacat.c:314 +#, c-format +msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u" +msgstr "Métricas do Buffer: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u" + +#: ../src/utils/pacat.c:317 +#, c-format +msgid "Buffer metrics: maxlength=%u, fragsize=%u" +msgstr "Métricas do Buffer: maxlength=%u, fragsize=%u" + +#: ../src/utils/pacat.c:321 +#, c-format +msgid "Using sample spec '%s', channel map '%s'." +msgstr "Utilizando especificação da amostra '%s', mapa de canal '%s'." + +#: ../src/utils/pacat.c:325 +#, c-format +msgid "Connected to device %s (%u, %ssuspended)." +msgstr "Ligado ao dispositivo %s (%u, %ssuspended)." + +#: ../src/utils/pacat.c:335 +#, c-format +msgid "Stream error: %s" +msgstr "Erro de fluxo: %s" + +#: ../src/utils/pacat.c:345 +#, c-format +msgid "Stream device suspended.%s" +msgstr "Dispositivo de fluxo suspenso.%s" + +#: ../src/utils/pacat.c:347 +#, c-format +msgid "Stream device resumed.%s" +msgstr "Dispositivo de fluxo retomado.%s" + +#: ../src/utils/pacat.c:355 +#, c-format +msgid "Stream underrun.%s" +msgstr "Fluxo com falta de dados.%s" + +#: ../src/utils/pacat.c:362 +#, c-format +msgid "Stream overrun.%s" +msgstr "Fluxo com excesso de dados.%s" + +#: ../src/utils/pacat.c:369 +#, c-format +msgid "Stream started.%s" +msgstr "Fluxo iniciado.%s" + +#: ../src/utils/pacat.c:376 +#, c-format +msgid "Stream moved to device %s (%u, %ssuspended).%s" +msgstr "Fluxo movido para o dispositivo %s (%u, %ssuspended).%s" + +#: ../src/utils/pacat.c:376 +msgid "not " +msgstr "negação" + +#: ../src/utils/pacat.c:383 +#, c-format +msgid "Stream buffer attributes changed.%s" +msgstr "Atributos do buffer de fluxo alterados.%s" + +#: ../src/utils/pacat.c:415 +#, c-format +msgid "Connection established.%s" +msgstr "Ligação estabelecida.%s" + +#: ../src/utils/pacat.c:418 +#, c-format +msgid "pa_stream_new() failed: %s" +msgstr "pa_stream_new() falhou: %s" + +#: ../src/utils/pacat.c:450 +#, c-format +msgid "pa_stream_connect_playback() failed: %s" +msgstr "pa_stream_connect_playback() falhou: %s" + +#: ../src/utils/pacat.c:456 +#, c-format +msgid "pa_stream_connect_record() failed: %s" +msgstr "pa_stream_connect_record() falhou: %s" + +#: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857 +#, c-format +msgid "Connection failure: %s" +msgstr "Ligação falhou: %s" + +#: ../src/utils/pacat.c:503 +msgid "Got EOF." +msgstr "Obtive EOF." + +#: ../src/utils/pacat.c:540 +#, c-format +msgid "write() failed: %s" +msgstr "write() falhou: %s" + +#: ../src/utils/pacat.c:561 +msgid "Got signal, exiting." +msgstr "Recebido sinal, a sair." + +#: ../src/utils/pacat.c:575 +#, c-format +msgid "Failed to get latency: %s" +msgstr "Falhou a obtenção da cadência: %s" + +#: ../src/utils/pacat.c:580 +#, c-format +msgid "Time: %0.3f sec; Latency: %0.0f usec." +msgstr "Tempo: %0.3f sec; Cadência: %0.0f usec." + +#: ../src/utils/pacat.c:599 +#, c-format +msgid "pa_stream_update_timing_info() failed: %s" +msgstr "pa_stream_update_timing_info() falhou: %s" + +#: ../src/utils/pacat.c:609 +#, c-format +msgid "" +"%s [options]\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -r, --record Create a connection for recording\n" +" -p, --playback Create a connection for playback\n" +"\n" +" -v, --verbose Enable verbose operations\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -d, --device=DEVICE The name of the sink/source to " +"connect to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" +" --stream-name=NAME How to call this stream on the " +"server\n" +" --volume=VOLUME Specify the initial (linear) volume " +"in range 0...65536\n" +" --rate=SAMPLERATE The sample rate in Hz (defaults to " +"44100)\n" +" --format=SAMPLEFORMAT The sample type, one of s16le, " +"s16be, u8, float32le,\n" +" float32be, ulaw, alaw, s32le, s32be, " +"s24le, s24be,\n" +" s24-32le, s24-32be (defaults to " +"s16ne)\n" +" --channels=CHANNELS The number of channels, 1 for mono, " +"2 for stereo\n" +" (defaults to 2)\n" +" --channel-map=CHANNELMAP Channel map to use instead of the " +"default\n" +" --fix-format Take the sample format from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-rate Take the sampling rate from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-channels Take the number of channels and the " +"channel map\n" +" from the sink the stream is being " +"connected to.\n" +" --no-remix Don't upmix or downmix channels.\n" +" --no-remap Map channels by index instead of " +"name.\n" +" --latency=BYTES Request the specified latency in " +"bytes.\n" +" --process-time=BYTES Request the specified process time " +"per request in bytes.\n" +" --property=PROPERTY=VALUE Set the specified property to the " +"specified value.\n" +" --raw Record/play raw PCM data.\n" +" --file-format=FFORMAT Record/play formatted PCM data.\n" +" --list-file-formats List available file formats.\n" +msgstr "" +"%s [opções]\n" +"\n" +" -h, --help Mostra esta ajuda\n" +" --version Mostra a versão\n" +"\n" +" -r, --record Cria uma ligação para gravar\n" +" -p, --playback Cria uma ligação para lêr\n" +"\n" +" -v, --verbose Activa operações verbose\n" +"\n" +" -s, --server=SERVER Nome do servidor a qual ligar\n" +" -d, --device=DEVICE Nome do depósito/fonte a qual ligar\n" +" -n, --client-name=NAME Como chamar este cliente no " +"servidor\n" +" --stream-name=NAME Como chamar este fluxo no servidor\n" +" --volume=VOLUME Especificar o volume (linear) " +"inicial na gama 0...65536\n" +" --rate=SAMPLERATE A mesma taxa em Hz (por omissão " +"44100)\n" +" --format=SAMPLEFORMAT Tipo de amostragem, uma de s16le, " +"s16be, u8, float32le,\n" +" float32be, ulaw, alaw, s32le, s32be, " +"s24le, s24be,\n" +" s24-32le, s24-32be (por omissão " +"s16ne)\n" +" --channels=CHANNELS Número de canais, 1 para mono, 2 " +"para estéreo\n" +" (por omissão 2)\n" +" --channel-map=CHANNELMAP Mapa de canais a usar em vez do mapa " +"por omissão\n" +" --fix-format Usa o formato de amostragem do " +"depósito para\n" +" onde o fluxo está a ligado.\n" +" --fix-rate Usa a taxa de amostragem do depósito " +"para\n" +" onde o fluxo está ligado.\n" +" --fix-channels Pega no número de canais e no mapa " +"de canais\n" +" do depósito para onde o fluxo está " +"ligado.\n" +" --no-remix Não misturar os canais em cima nem " +"em baixo.\n" +" --no-remap Mapeia os canais por índice em vez " +"do nome.\n" +" --latency=BYTES Pede a cadência especificada em " +"bytes.\n" +" --process-time=BYTES Pede o tempo de processo por pedido " +"em bytes.\n" +" --property=PROPERTY=VALUE Coloca a propriedade específica com " +"o valor especificado.\n" +" --raw Grava/Lê dados raw em PCM.\n" +" --file-format=FFORMAT Grava/Lê dados formatados em PCM.\n" +" --list-file-formats Lista o formato de ficheiros " +"disponíveis.\n" + +#: ../src/utils/pacat.c:731 +#, c-format +msgid "" +"pacat %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pacat %s\n" +"Compilado com libpulse %s\n" +"Ligado com libpulse %s\n" + +#: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953 +#, c-format +msgid "Invalid client name '%s'" +msgstr "Nome de cliente inválido '%s'" + +#: ../src/utils/pacat.c:779 +#, c-format +msgid "Invalid stream name '%s'" +msgstr "Nome de fluxo inválido '%s'" + +#: ../src/utils/pacat.c:816 +#, c-format +msgid "Invalid channel map '%s'" +msgstr "Mapa de canais inválido '%s'" + +#: ../src/utils/pacat.c:845 +#, c-format +msgid "Invalid latency specification '%s'" +msgstr "Especificação da cadência inválida '%s'" + +#: ../src/utils/pacat.c:852 +#, c-format +msgid "Invalid process time specification '%s'" +msgstr "Especificação de tempo de processamento inválido '%s'" + +#: ../src/utils/pacat.c:864 +#, c-format +msgid "Invalid property '%s'" +msgstr "Propriedade inválida '%s'" + +#: ../src/utils/pacat.c:881 +#, c-format +msgid "Unknown file format %s." +msgstr "Formato de ficheiro desconhecido %s." + +#: ../src/utils/pacat.c:900 +msgid "Invalid sample specification" +msgstr "Especificação de amostra inválida" + +#: ../src/utils/pacat.c:910 +#, c-format +msgid "open(): %s" +msgstr "open(): %s" + +#: ../src/utils/pacat.c:915 +#, c-format +msgid "dup2(): %s" +msgstr "dup2(): %s" + +#: ../src/utils/pacat.c:922 +msgid "Too many arguments." +msgstr "Demasiados argumentos." + +#: ../src/utils/pacat.c:933 +msgid "Failed to generate sample specification for file." +msgstr "Falha ao gerar especificação de amostra para o ficheiro." + +#: ../src/utils/pacat.c:953 +msgid "Failed to open audio file." +msgstr "Falha ao abrir ficheiro de audio" + +#: ../src/utils/pacat.c:959 +msgid "" +"Warning: specified sample specification will be overwritten with " +"specification from file." +msgstr "" +"Aviso: a especificação da amostra será sobrescrita com a especificação do " +"ficheiro." + +#: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997 +msgid "Failed to determine sample specification from file." +msgstr "Falha ao determinar a especificação da amostra a partir do ficheiro." + +#: ../src/utils/pacat.c:971 +msgid "Warning: Failed to determine channel map from file." +msgstr "Aviso: Falha a determinar o mapa de canal do ficheiro." + +#: ../src/utils/pacat.c:982 +msgid "Channel map doesn't match sample specification" +msgstr "Mapa de canais não corresponde à especificação da amostra" + +#: ../src/utils/pacat.c:993 +msgid "Warning: failed to write channel map to file." +msgstr "Aviso: falha na escrita do mapa de canais no ficheiro." + +#: ../src/utils/pacat.c:1008 +#, c-format +msgid "" +"Opening a %s stream with sample specification '%s' and channel map '%s'." +msgstr "" +"Abrindo um %s fluxo com especificação da amostra '%s' e mapa de canais '%s'." + +#: ../src/utils/pacat.c:1009 +msgid "recording" +msgstr "a gravar" + +#: ../src/utils/pacat.c:1009 +msgid "playback" +msgstr "reprodução" + +#: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267 +msgid "pa_mainloop_new() failed." +msgstr "pa_mainloop_new() falhou." + +#: ../src/utils/pacat.c:1054 +msgid "io_new() failed." +msgstr "io_new() falhou." + +#: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279 +msgid "pa_context_new() failed." +msgstr "pa_context_new() falhou." + +#: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285 +#, c-format +msgid "pa_context_connect() failed: %s" +msgstr "pa_context_connect() falhou: %s" + +#: ../src/utils/pacat.c:1075 +msgid "pa_context_rttime_new() failed." +msgstr "pa_context_rttime_new() falhou." + +#: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290 +msgid "pa_mainloop_run() failed." +msgstr "pa_mainloop_run() falhou." + +#: ../src/utils/pasuspender.c:81 +#, c-format +msgid "fork(): %s\n" +msgstr "fork(): %s\n" + +#: ../src/utils/pasuspender.c:92 +#, c-format +msgid "execvp(): %s\n" +msgstr "execvp(): %s\n" + +#: ../src/utils/pasuspender.c:109 +#, c-format +msgid "Failure to suspend: %s\n" +msgstr "Falhou ao suspender: %s\n" + +#: ../src/utils/pasuspender.c:124 +#, c-format +msgid "Failure to resume: %s\n" +msgstr "Falhou ao restaurar: %s\n" + +#: ../src/utils/pasuspender.c:147 +#, c-format +msgid "WARNING: Sound server is not local, not suspending.\n" +msgstr "Atenção: Servidor de Som não local, suspender ignorado.\n" + +#: ../src/utils/pasuspender.c:159 +#, c-format +msgid "Connection failure: %s\n" +msgstr "Ligação falhou: %s\n" + +#: ../src/utils/pasuspender.c:176 +#, c-format +msgid "Got SIGINT, exiting.\n" +msgstr "Obtido SIGINT, a sair.\n" + +#: ../src/utils/pasuspender.c:194 +#, c-format +msgid "WARNING: Child process terminated by signal %u\n" +msgstr "Atenção: Processo filho terminado por sinal %u\n" + +#: ../src/utils/pasuspender.c:212 +#, c-format +msgid "" +"%s [options] ... \n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +"\n" +msgstr "" +"%s [opções] ... \n" +"\n" +" -h, --help Mostra esta ajuda\n" +" --version Mostra a versão\n" +" -s, --server=SERVER Nome do servidor ao qual ligar\n" +"\n" + +#: ../src/utils/pasuspender.c:248 +#, c-format +msgid "" +"pasuspender %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pasuspender %s\n" +"Compilado com libpulse %s\n" +"Ligado com libpulse %s\n" + +#: ../src/utils/pasuspender.c:277 +#, c-format +msgid "pa_mainloop_new() failed.\n" +msgstr "pa_mainloop_new() falhou.\n" + +#: ../src/utils/pasuspender.c:290 +#, c-format +msgid "pa_context_new() failed.\n" +msgstr "pa_context_new() falhou.\n" + +#: ../src/utils/pasuspender.c:298 +#, c-format +msgid "pa_mainloop_run() failed.\n" +msgstr "pa_mainloop_run() falhou.\n" + +#: ../src/utils/pactl.c:135 +#, c-format +msgid "Failed to get statistics: %s" +msgstr "Falhou a obtenção de estatísticas: %s" + +#: ../src/utils/pactl.c:141 +#, c-format +msgid "Currently in use: %u blocks containing %s bytes total.\n" +msgstr "Correntemente em uso: %u blocos contendo %s bytes no total.\n" + +#: ../src/utils/pactl.c:144 +#, c-format +msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n" +msgstr "" +"Alocado durante todo o tempo de vida: %u blocos contendo %s bytes no total.\n" + +#: ../src/utils/pactl.c:147 +#, c-format +msgid "Sample cache size: %s\n" +msgstr "Tamanho cache da amostra: %s\n" + +#: ../src/utils/pactl.c:156 +#, c-format +msgid "Failed to get server information: %s" +msgstr "Falha ao obter informações do servidor: %s" + +#: ../src/utils/pactl.c:164 +#, c-format +msgid "" +"User name: %s\n" +"Host Name: %s\n" +"Server Name: %s\n" +"Server Version: %s\n" +"Default Sample Specification: %s\n" +"Default Channel Map: %s\n" +"Default Sink: %s\n" +"Default Source: %s\n" +"Cookie: %08x\n" +msgstr "" +"Nome de utilizador: %s\n" +"Nome da máquina: %s\n" +"Nome do servidor: %s\n" +"Versão do servidor: %s\n" +"Especificação da amostra por omissão: %s\n" +"Mapa de canais por omissão: %s\n" +"Depósito por omissão: %s\n" +"Fonte por omissão: %s\n" +"Cookie: %08x\n" + +#: ../src/utils/pactl.c:205 +#, c-format +msgid "Failed to get sink information: %s" +msgstr "Falha ao obter informações do depósito: %s" + +#: ../src/utils/pactl.c:221 +#, c-format +msgid "" +"Sink #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor Source: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Depósito #%u\n" +"\tEstado: %s\n" +"\tNome: %s\n" +"\tDescrição: %s\n" +"\tDriver: %s\n" +"\tEspecificação da Amostra: %s\n" +"\tMapa de Canais: %s\n" +"\tMódulo Dono: %u\n" +"\tMudo: %s\n" +"\tVolume: %s%s%s\n" +"\t balanço %0.2f\n" +"\tVolume Base: %s%s%s\n" +"\tMonitor de Fonte: %s\n" +"\tCadência: %0.0f usec, configurado %0.0f usec\n" +"\tBandeiras: %s%s%s%s%s%s\n" +"\tPropriedades:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360 +#, c-format +msgid "\tPorts:\n" +msgstr "\tPorto:\n" + +#: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366 +#, c-format +msgid "\tActive Port: %s\n" +msgstr "\tPorto Activo: %s\n" + +#: ../src/utils/pactl.c:297 +#, c-format +msgid "Failed to get source information: %s" +msgstr "Falha ao obter informações da fonte: %s" + +#: ../src/utils/pactl.c:313 +#, c-format +msgid "" +"Source #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor of Sink: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Fonte #%u\n" +"\tEstado: %s\n" +"\tNome: %s\n" +"\tDescrição: %s\n" +"\tDriver: %s\n" +"\tEspecificação da Amostra: %s\n" +"\tMapa de canais: %s\n" +"\tMódulo Dono: %u\n" +"\tMudo: %s\n" +"\tVolume: %s%s%s\n" +"\t balanço %0.2f\n" +"\tVolume Base: %s%s%s\n" +"\tMonitor do Depósito: %s\n" +"\tCadência: %0.0f usec, configurado %0.0f usec\n" +"\tBandeiras: %s%s%s%s%s%s\n" +"\tPropriedades:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:345 ../src/utils/pactl.c:401 ../src/utils/pactl.c:436 +#: ../src/utils/pactl.c:473 ../src/utils/pactl.c:532 ../src/utils/pactl.c:533 +#: ../src/utils/pactl.c:543 ../src/utils/pactl.c:587 ../src/utils/pactl.c:588 +#: ../src/utils/pactl.c:594 ../src/utils/pactl.c:637 ../src/utils/pactl.c:638 +#: ../src/utils/pactl.c:645 +msgid "n/a" +msgstr "n/d" + +#: ../src/utils/pactl.c:375 +#, c-format +msgid "Failed to get module information: %s" +msgstr "Falha ao obter informações do módulo: %s" + +#: ../src/utils/pactl.c:393 +#, c-format +msgid "" +"Module #%u\n" +"\tName: %s\n" +"\tArgument: %s\n" +"\tUsage counter: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Módulo #%u\n" +"\tNome: %s\n" +"\tArgumento: %s\n" +"\tContador de utilização: %s\n" +"\tPropriedades:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:412 +#, c-format +msgid "Failed to get client information: %s" +msgstr "Falha ao obter informações do cliente: %s" + +#: ../src/utils/pactl.c:430 +#, c-format +msgid "" +"Client #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Cliente #%u\n" +"\tDriver: %s\n" +"\tMódulo dono: %s\n" +"\tPropriedades:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:447 +#, c-format +msgid "Failed to get card information: %s" +msgstr "Falha ao obter informações da carta: %s" + +#: ../src/utils/pactl.c:465 +#, c-format +msgid "" +"Card #%u\n" +"\tName: %s\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Placa #%u\n" +"\tNome: %s\n" +"\tDriver: %s\n" +"\tMódulo dono: %s\n" +"\tPropriedades:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:479 +#, c-format +msgid "\tProfiles:\n" +msgstr "\tPrefis:\n" + +#: ../src/utils/pactl.c:485 +#, c-format +msgid "\tActive Profile: %s\n" +msgstr "\tPerfil Activo: %s\n" + +#: ../src/utils/pactl.c:496 +#, c-format +msgid "Failed to get sink input information: %s" +msgstr "Falha ao obter informação de entrada do depósito: %s" + +#: ../src/utils/pactl.c:515 +#, c-format +msgid "" +"Sink Input #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSink: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tMute: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSink Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Entrada de Depósito #%u\n" +"\tDriver: %s\n" +"\tMódulo Dono: %s\n" +"\tCliente: %s\n" +"\tDepósito: %u\n" +"\tEspecificação da amostra: %s\n" +"\tMapa de canais: %s\n" +"\tMudo: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balanço %0.2f\n" +"\tCadência do Buffer: %0.0f usec\n" +"\tCadência do Depósito: %0.0f usec\n" +"\tMétodo de reamostragem: %s\n" +"\tPropriedades:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:554 +#, c-format +msgid "Failed to get source output information: %s" +msgstr "Falha ao obter informações da fonte: %s" + +#: ../src/utils/pactl.c:574 +#, c-format +msgid "" +"Source Output #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSource: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSource Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Saída fonte #%u\n" +"\tDriver: %s\n" +"\tMódulo dono: %s\n" +"\tCliente: %s\n" +"\tFonte: %u\n" +"\tEspecificação da amostra: %s\n" +"\tMapa de Canais: %s\n" +"\tCadência do Buffer: %0.0f usec\n" +"\tCadência da Fonte: %0.0f usec\n" +"\tMétodo de reamostragem: %s\n" +"\tPropriedades:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:605 +#, c-format +msgid "Failed to get sample information: %s" +msgstr "Falha ao obter informações da amostra: %s" + +#: ../src/utils/pactl.c:623 +#, c-format +msgid "" +"Sample #%u\n" +"\tName: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tDuration: %0.1fs\n" +"\tSize: %s\n" +"\tLazy: %s\n" +"\tFilename: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Amostra #%u\n" +"\tNome: %s\n" +"\tEspecificação da Amostra: %s\n" +"\tMapa de Canais: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balanço %0.2f\n" +"\tDuração: %0.1fs\n" +"\tTamanho: %s\n" +"\tLento: %s\n" +"\tNome do ficheiro: %s\n" +"\tPropriedades:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663 +#, c-format +msgid "Failure: %s" +msgstr "Falha: %s" + +#: ../src/utils/pactl.c:687 +#, c-format +msgid "Failed to upload sample: %s" +msgstr "Falha ao enviar amostra: %s" + +#: ../src/utils/pactl.c:704 +msgid "Premature end of file" +msgstr "Fim prematuro do ficheiro" + +#: ../src/utils/pactl.c:863 +msgid "Got SIGINT, exiting." +msgstr "Obtido SIGINT, a sair." + +#: ../src/utils/pactl.c:869 +#, c-format +msgid "" +"%s [options] stat\n" +"%s [options] list\n" +"%s [options] exit\n" +"%s [options] upload-sample FILENAME [NAME]\n" +"%s [options] play-sample NAME [SINK]\n" +"%s [options] remove-sample NAME\n" +"%s [options] move-sink-input SINKINPUT SINK\n" +"%s [options] move-source-output SOURCEOUTPUT SOURCE\n" +"%s [options] load-module NAME [ARGS ...]\n" +"%s [options] unload-module MODULE\n" +"%s [options] suspend-sink SINK 1|0\n" +"%s [options] suspend-source SOURCE 1|0\n" +"%s [options] set-card-profile CARD PROFILE\n" +"%s [options] set-sink-port SINK PORT\n" +"%s [options] set-source-port SOURCE PORT\n" +"%s [options] set-sink-volume SINK VOLUME\n" +"%s [options] set-source-volume SOURCE VOLUME\n" +"%s [options] set-sink-input-volume SINKINPUT VOLUME\n" +"%s [options] set-sink-mute SINK 1|0\n" +"%s [options] set-source-mute SOURCE 1|0\n" +"%s [options] set-sink-input-mute SINKINPUT 1|0\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" +msgstr "" +"%s [opções] stat\n" +"%s [opções] list\n" +"%s [opções] exit\n" +"%s [opções] upload-sample NOME_DO_FICHEIRO [NOME]\n" +"%s [opções] play-sample NOME [DEPÓSITO]\n" +"%s [opções] remove-sample NOME\n" +"%s [opções] move-sink-input ENTRADA_DO_DEPÓSITO DEPÓSITO\n" +"%s [opções] move-source-output SAÍDA_DA_FONTE FONTE\n" +"%s [opções] load-module NOME [ARGTOS ...]\n" +"%s [opções] unload-module MÓDULO\n" +"%s [opções] suspend-sink DEPÓSITO 1|0\n" +"%s [opções] suspend-source FONTE 1|0\n" +"%s [opções] set-card-profile PLACA PERFIL\n" +"%s [opções] set-sink-port DEPÓSITO PORTO\n" +"%s [opções] set-source-port FONTE PORTO\n" +"%s [opções] set-sink-volume DEPÓSITO VOLUME\n" +"%s [opções] set-source-volume FONTE VOLUME\n" +"%s [opções] set-sink-input-volume VOLUME_DE_ENTRADA DEPÓSITO\n" +"%s [opções] set-sink-mute DEPÓSITO 1|0\n" +"%s [opções] set-source-mute FONTE 1|0\n" +"%s [opções] set-sink-input-mute ENTRADA_DA_FONTE 1|0\n" +"\n" +" -h, --help Mostra esta ajuda\n" +" --version Mostra a versão\n" +"\n" +" -s, --server=SERVER O nome do servidor ao qual ligar\n" +" -n, --client-name=NAME Como chamar este cliente no " +"servidor\n" + +#: ../src/utils/pactl.c:933 +#, c-format +msgid "" +"pactl %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pactl %s\n" +"Compilado com libpulse %s\n" +"Linkado com libpulse %s\n" + +#: ../src/utils/pactl.c:979 +msgid "Please specify a sample file to load" +msgstr "Por favor, especifique um ficheiro de amostra para carregar" + +#: ../src/utils/pactl.c:992 +msgid "Failed to open sound file." +msgstr "Falha ao abrir ficheiro de som." + +#: ../src/utils/pactl.c:1004 +msgid "Warning: Failed to determine sample specification from file." +msgstr "Aviso: Falha ao determinar a especificação da amostra do ficheiro." + +#: ../src/utils/pactl.c:1014 +msgid "You have to specify a sample name to play" +msgstr "Tem de especificar um nome de amostra para reproduzir" + +#: ../src/utils/pactl.c:1026 +msgid "You have to specify a sample name to remove" +msgstr "Tem de especificar um nome de amostra para remover" + +#: ../src/utils/pactl.c:1035 +msgid "You have to specify a sink input index and a sink" +msgstr "Tem de especificar um índice de entrada de depósito e um depósito" + +#: ../src/utils/pactl.c:1045 +msgid "You have to specify a source output index and a source" +msgstr "Tem de especificar um índice de saída de fonte e uma fonte" + +#: ../src/utils/pactl.c:1060 +msgid "You have to specify a module name and arguments." +msgstr "Tem de especificar um nome de módulo e argumentos." + +#: ../src/utils/pactl.c:1080 +msgid "You have to specify a module index" +msgstr "Tem de especificar um índice de módulo" + +#: ../src/utils/pactl.c:1090 +msgid "" +"You may not specify more than one sink. You have to specify a boolean value." +msgstr "" +"Não pode especificar mais do que um depósito. Tem de especificar um valor " +"booleano." + +#: ../src/utils/pactl.c:1103 +msgid "" +"You may not specify more than one source. You have to specify a boolean " +"value." +msgstr "" +"Não pode especificar mais do que uma fonte. Tem de especificar um valor " +"booleano." + +#: ../src/utils/pactl.c:1115 +msgid "You have to specify a card name/index and a profile name" +msgstr "Tem de especificar um nome/índice de placa e um nome de perfil" + +#: ../src/utils/pactl.c:1126 +msgid "You have to specify a sink name/index and a port name" +msgstr "Tem de especificar um nome/índice de depósito e nome de um porto" + +#: ../src/utils/pactl.c:1137 +msgid "You have to specify a source name/index and a port name" +msgstr "Tem de especificar um nome/índice de fonte e nome de um porto" + +#: ../src/utils/pactl.c:1149 +msgid "You have to specify a sink name/index and a volume" +msgstr "Tem de especificar um nome/índice de depósito e um volume" + +#: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171 +#: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209 +#: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248 +msgid "Invalid volume specification" +msgstr "Especificação de volume inválida" + +#: ../src/utils/pactl.c:1166 +msgid "You have to specify a source name/index and a volume" +msgstr "Tem de especificar um nome/índice de fonte e um volume" + +#: ../src/utils/pactl.c:1183 +msgid "You have to specify a sink input index and a volume" +msgstr "Tem de especificar um índice de entrada de depósito e um volume" + +#: ../src/utils/pactl.c:1188 +msgid "Invalid sink input index" +msgstr "Índice de depósito de entrada inválido" + +#: ../src/utils/pactl.c:1204 +msgid "You have to specify a sink name/index and a mute boolean" +msgstr "Tem de especificar um nome/índice de depósito e um booleano mudo" + +#: ../src/utils/pactl.c:1221 +msgid "You have to specify a source name/index and a mute boolean" +msgstr "Tem de especificar um nome/índice de fonte e um booleano mudo" + +#: ../src/utils/pactl.c:1238 +msgid "You have to specify a sink input index and a mute boolean" +msgstr "Tem de especificar um índice de entrada de depósito e um booleano mudo" + +#: ../src/utils/pactl.c:1243 +msgid "Invalid sink input index specification" +msgstr "Índice de entrada de depósito inválida" + +#: ../src/utils/pactl.c:1262 +msgid "No valid command specified." +msgstr "O comando especificado é inválido." + +#: ../src/utils/pax11publish.c:61 +#, c-format +msgid "" +"%s [-D display] [-S server] [-O sink] [-I source] [-c file] [-d|-e|-i|-r]\n" +"\n" +" -d Show current PulseAudio data attached to X11 display (default)\n" +" -e Export local PulseAudio data to X11 display\n" +" -i Import PulseAudio data from X11 display to local environment " +"variables and cookie file.\n" +" -r Remove PulseAudio data from X11 display\n" +msgstr "" +"%s [-D ecrã] [-S servidor] [-O depósito] [-I fonte] [-c ficheiro] [-d|-e|-" +"i|-r]\n" +"\n" +" -d Mostra os dados correntes do PulseAudio anexados ao ecrã X11 " +"(default)\n" +" -e Exporta dados locais do PulseAudio para o ecrã X11\n" +" -i Importa dados do PulseAudio do ecrã X11 para variáveis de ambiente " +"locais e ficheiro de cookies.\n" +" -r Remove dados do PulseAudio do ecrã X11\n" + +#: ../src/utils/pax11publish.c:94 +#, c-format +msgid "Failed to parse command line.\n" +msgstr "Não foi possível processar a linha de comando.\n" + +#: ../src/utils/pax11publish.c:108 +#, c-format +msgid "Server: %s\n" +msgstr "Servidor: %s\n" + +#: ../src/utils/pax11publish.c:110 +#, c-format +msgid "Source: %s\n" +msgstr "Fonte: %s\n" + +#: ../src/utils/pax11publish.c:112 +#, c-format +msgid "Sink: %s\n" +msgstr "Sink: %s\n" + +#: ../src/utils/pax11publish.c:114 +#, c-format +msgid "Cookie: %s\n" +msgstr "Cookie: %s\n" + +#: ../src/utils/pax11publish.c:132 +#, c-format +msgid "Failed to parse cookie data\n" +msgstr "Não foi possível processar os dados da cookie\n" + +#: ../src/utils/pax11publish.c:137 +#, c-format +msgid "Failed to save cookie data\n" +msgstr "Não foi possível gravar os dados da cookie\n" + +#: ../src/utils/pax11publish.c:152 +#, c-format +msgid "Failed to load client configuration file.\n" +msgstr "Não foi possível carregar o ficheiro de configuração do cliente\n" + +#: ../src/utils/pax11publish.c:157 +#, c-format +msgid "Failed to read environment configuration data.\n" +msgstr "Não foi possível ler os dados de configuração do ambiente\n" + +#: ../src/utils/pax11publish.c:174 +#, c-format +msgid "Failed to get FQDN.\n" +msgstr "Falhou ao obter FQDN.\n" + +#: ../src/utils/pax11publish.c:194 +#, c-format +msgid "Failed to load cookie data\n" +msgstr "Não foi possível carregar os dados da cookie\n" + +#: ../src/utils/pax11publish.c:211 +#, c-format +msgid "Not yet implemented.\n" +msgstr "Ainda não implementado.\n" + +#: ../src/utils/pacmd.c:69 +msgid "No PulseAudio daemon running, or not running as session daemon." +msgstr "" +"Não existe um daemon PulseAudio a correr, ou não corre como daemon de sessão." + +#: ../src/utils/pacmd.c:74 +#, c-format +msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s" +msgstr "socket(PF_UNIX, SOCK_STREAM, 0): %s" + +#: ../src/utils/pacmd.c:91 +#, c-format +msgid "connect(): %s" +msgstr "connect(): %s" + +#: ../src/utils/pacmd.c:99 +msgid "Failed to kill PulseAudio daemon." +msgstr "Não foi possível terminar o serviço PulseAudio." + +#: ../src/utils/pacmd.c:107 +msgid "Daemon not responding." +msgstr "Serviço não responde." + +#: ../src/utils/pacmd.c:161 +#, c-format +msgid "poll(): %s" +msgstr "poll(): %s" + +#: ../src/utils/pacmd.c:171 ../src/utils/pacmd.c:188 +#, c-format +msgid "read(): %s" +msgstr "read(): %s" + +#: ../src/utils/pacmd.c:207 ../src/utils/pacmd.c:223 +#, c-format +msgid "write(): %s" +msgstr "write(): %s" + +#: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:219 +msgid "Cannot access autospawn lock." +msgstr "Impossível aceder ao lock \"autospawn\"." + +#: ../src/modules/alsa/alsa-sink.c:530 ../src/modules/alsa/alsa-sink.c:689 +#, c-format +msgid "" +"ALSA woke us up to write new data to the device, but there was actually " +"nothing to write!\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers.\n" +"We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() " +"returned 0 or another value < min_avail." +msgstr "" +"ALSA acordou-nos para escrever novos dados para o dispositivo, mas não havia " +"nada para escrever!\n" +"Provavelmente isto é um erro no driver ALSA '%s'. Por favor, reporte este " +"problema aos programadores do ALSA.\n" +"Fomos acordados pelo conjunto POLLOUT -- contudo uma chamada a seguir de " +"snd_pcm_avail() retornou 0 ou outro valor < min_avail." + +#: ../src/modules/alsa/alsa-source.c:506 ../src/modules/alsa/alsa-source.c:656 +#, c-format +msgid "" +"ALSA woke us up to read new data from the device, but there was actually " +"nothing to read!\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers.\n" +"We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() " +"returned 0 or another value < min_avail." +msgstr "" +"ALSA acordou-nos para ler novos dados do dispositivo, mas não havia nada " +"para ler!\n" +"Provavelmente isto é um erro no driver ALSA '%s'. Por favor, reporte este " +"problema aos programadores do ALSA.\n" +"Fomos acordados pelo conjunto POLLIN -- contudo uma chamada a seguir de " +"snd_pcm_avail() retornou 0 ou outro valor < min_avail." + +#: ../src/modules/alsa/module-alsa-card.c:152 +#: ../src/modules/bluetooth/module-bluetooth-device.c:2228 +#: ../src/modules/alsa/alsa-mixer.c:2931 +msgid "Off" +msgstr "Desligado" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2184 +msgid "High Fidelity Playback (A2DP)" +msgstr "Reprodução Alta Fidelidade (A2DP)" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2198 +msgid "High Fidelity Capture (A2DP)" +msgstr "Captação de Alta Fidelidade (A2DP)" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2213 +msgid "Telephony Duplex (HSP/HFP)" +msgstr "Telefonia Duplex (HSP/HFP)" + +#: ../src/modules/reserve-wrap.c:151 +msgid "PulseAudio Sound Server" +msgstr "Servidor de Som PulseAudio" + +#: ../src/modules/module-rygel-media-server.c:569 +#: ../src/modules/module-rygel-media-server.c:583 +msgid "Output Devices" +msgstr "" + +#: ../src/modules/module-rygel-media-server.c:570 +#: ../src/modules/module-rygel-media-server.c:584 +#, fuzzy +msgid "Input Devices" +msgstr "Entrada %s" + +#: ../src/modules/module-rygel-media-server.c:774 +msgid "Audio on @HOSTNAME@" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1701 +#, fuzzy +msgid "Input" +msgstr "Entrada %s" + +#: ../src/modules/alsa/alsa-mixer.c:1702 +msgid "Docking Station Input" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1703 +msgid "Docking Station Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1704 +msgid "Line-In" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1705 +msgid "Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1706 +msgid "External Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1707 +#, fuzzy +msgid "Internal Microphone" +msgstr "Áudio Interno" + +#: ../src/modules/alsa/alsa-mixer.c:1708 +msgid "Radio" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1709 +msgid "Video" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1710 +msgid "Automatic Gain Control" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1711 +msgid "No Automatic Gain Control" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1712 +msgid "Boost" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1713 +msgid "No Boost" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1714 +msgid "Amplifier" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1715 +msgid "No Amplifier" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1773 +#, fuzzy +msgid "Analog Input" +msgstr "Mono Analógico" + +#: ../src/modules/alsa/alsa-mixer.c:1774 +#, fuzzy +msgid "Analog Microphone" +msgstr "Mono Analógico" + +#: ../src/modules/alsa/alsa-mixer.c:1775 +#, fuzzy +msgid "Analog Line-In" +msgstr "Mono Analógico" + +#: ../src/modules/alsa/alsa-mixer.c:1776 +#, fuzzy +msgid "Analog Radio" +msgstr "Mono Analógico" + +#: ../src/modules/alsa/alsa-mixer.c:1777 +#, fuzzy +msgid "Analog Video" +msgstr "Estéreo Analógico" + +#: ../src/modules/alsa/alsa-mixer.c:1778 +#, fuzzy +msgid "Analog Output" +msgstr "Saída nula" + +#: ../src/modules/alsa/alsa-mixer.c:1779 +#, fuzzy +msgid "Analog Headphones" +msgstr "Mono Analógico" + +#: ../src/modules/alsa/alsa-mixer.c:1780 +msgid "Analog Output (LFE)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1781 +#, fuzzy +msgid "Analog Mono Output" +msgstr "Mono Analógico" + +#: ../src/modules/alsa/alsa-mixer.c:1981 +#, fuzzy, c-format +msgid "%s+%s" +msgstr "%s %s" + +#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404 +#, fuzzy, c-format +msgid "%s / %s" +msgstr "%s %s" + +#: ../src/modules/alsa/alsa-mixer.c:2790 +msgid "Analog Mono" +msgstr "Mono Analógico" + +#: ../src/modules/alsa/alsa-mixer.c:2791 +msgid "Analog Stereo" +msgstr "Estéreo Analógico" + +#: ../src/modules/alsa/alsa-mixer.c:2792 +#, fuzzy +msgid "Analog Surround 2.1" +msgstr "Analog Surround 4.1" + +#: ../src/modules/alsa/alsa-mixer.c:2793 +#, fuzzy +msgid "Analog Surround 3.0" +msgstr "Analog Surround 4.0" + +#: ../src/modules/alsa/alsa-mixer.c:2794 +#, fuzzy +msgid "Analog Surround 3.1" +msgstr "Analog Surround 4.1" + +#: ../src/modules/alsa/alsa-mixer.c:2795 +msgid "Analog Surround 4.0" +msgstr "Analog Surround 4.0" + +#: ../src/modules/alsa/alsa-mixer.c:2796 +msgid "Analog Surround 4.1" +msgstr "Analog Surround 4.1" + +#: ../src/modules/alsa/alsa-mixer.c:2797 +msgid "Analog Surround 5.0" +msgstr "Analog Surround 5.0" + +#: ../src/modules/alsa/alsa-mixer.c:2798 +msgid "Analog Surround 5.1" +msgstr "Analog Surround 5.1" + +#: ../src/modules/alsa/alsa-mixer.c:2799 +#, fuzzy +msgid "Analog Surround 6.0" +msgstr "Analog Surround 4.0" + +#: ../src/modules/alsa/alsa-mixer.c:2800 +#, fuzzy +msgid "Analog Surround 6.1" +msgstr "Analog Surround 4.1" + +#: ../src/modules/alsa/alsa-mixer.c:2801 +#, fuzzy +msgid "Analog Surround 7.0" +msgstr "Analog Surround 4.0" + +#: ../src/modules/alsa/alsa-mixer.c:2802 +msgid "Analog Surround 7.1" +msgstr "Analog Surround 7.1" + +#: ../src/modules/alsa/alsa-mixer.c:2803 +msgid "Digital Stereo (IEC958)" +msgstr "Estéreo Digital (IEC958)" + +#: ../src/modules/alsa/alsa-mixer.c:2804 +#, fuzzy +msgid "Digital Surround 4.0 (IEC958)" +msgstr "Surround Digital 4.0 (IEC958/AC3)" + +#: ../src/modules/alsa/alsa-mixer.c:2805 +msgid "Digital Surround 4.0 (IEC958/AC3)" +msgstr "Surround Digital 4.0 (IEC958/AC3)" + +#: ../src/modules/alsa/alsa-mixer.c:2806 +msgid "Digital Surround 5.1 (IEC958/AC3)" +msgstr "Surround Digital 5.1 (IEC958/AC3)" + +#: ../src/modules/alsa/alsa-mixer.c:2807 +msgid "Digital Stereo (HDMI)" +msgstr "Estéreo Digital (HDMI)" + +#: ../src/modules/alsa/alsa-mixer.c:2928 +#, fuzzy +msgid "Analog Mono Duplex" +msgstr "Mono Analógico" + +#: ../src/modules/alsa/alsa-mixer.c:2929 +#, fuzzy +msgid "Analog Stereo Duplex" +msgstr "Estéreo Analógico" + +#: ../src/modules/alsa/alsa-mixer.c:2930 +#, fuzzy +msgid "Digital Stereo Duplex (IEC958)" +msgstr "Estéreo Digital (IEC958)" + +#, fuzzy +#~ msgid "Invalid client name '%s'\n" +#~ msgstr "Nome de máquina inválido" + +#, fuzzy +#~ msgid "Failed to determine sample specification from file.\n" +#~ msgstr "não foi possível obter informações da amostra: %s\n" + +#~ msgid "select(): %s" +#~ msgstr "select(): %s" + +#~ msgid "Cannot connect to system bus: %s" +#~ msgstr "Incapaz de se ligar ao bus de sistema: %s" + +#~ msgid "Cannot get caller from PID: %s" +#~ msgstr "Não foi possível obter chamador a partir do PID: %s" + +#~ msgid "Cannot set UID on caller object." +#~ msgstr "Não foi possível definir o UID no objecto chamador." + +#~ msgid "Failed to get CK session." +#~ msgstr "Falha ao obter sessão CK." + +#~ msgid "Cannot set UID on session object." +#~ msgstr "Não foi possível definir o UID no objecto da sessão." + +#~ msgid "Cannot allocate PolKitAction." +#~ msgstr "Não é possível alocar PolKitAction." + +#~ msgid "Cannot set action_id" +#~ msgstr "impossível definir action_id" + +#~ msgid "Cannot allocate PolKitContext." +#~ msgstr "Não é possível alocar contexto PolKitContext." + +#~ msgid "Cannot initialize PolKitContext: %s" +#~ msgstr "Incapaz de inicializar o PolKitContext: %s" + +#~ msgid "Could not determine whether caller is authorized: %s" +#~ msgstr "Não foi possível determinar se o chamador está autorizado: %s" + +#~ msgid "Cannot obtain auth: %s" +#~ msgstr "Não foi possível obter autenticação: %s" + +#~ msgid "PolicyKit responded with '%s'" +#~ msgstr "PolicyKit respondeu com '%s'" + +#~ msgid "" +#~ "High-priority scheduling (negative Unix nice level) for the PulseAudio " +#~ "daemon" +#~ msgstr "" +#~ "Escalonamento de alta-prioridade (nível 'nice' negativo em Unix) para o " +#~ "serviço PulseAudio" + +#~ msgid "Real-time scheduling for the PulseAudio daemon" +#~ msgstr "Escalonamento em tempo-real para o serviço PulseAudio" + +#~ msgid "" +#~ "System policy prevents PulseAudio from acquiring high-priority scheduling." +#~ msgstr "" +#~ "Politica do sistema impede o PulseAudio de obter escalonamento de alta-" +#~ "prioridade." + +#~ msgid "" +#~ "System policy prevents PulseAudio from acquiring real-time scheduling." +#~ msgstr "" +#~ "Politica do sistema impede o PulseAudio de obter escalonamento de tempo-" +#~ "real." + +#~ msgid "read() failed: %s\n" +#~ msgstr "read() falhou: %s\n" + +#, fuzzy +#~ msgid "pa_context_connect() failed: %s\n" +#~ msgstr "Impossível ligar ao servidor." + +#~ msgid "We're in the group '%s', allowing high-priority scheduling." +#~ msgstr "Estamos no grupo '%s', permitindo escalonamento de alta-prioridade." + +#~ msgid "We're in the group '%s', allowing real-time scheduling." +#~ msgstr "Estamos no grupo '%s', permitindo escalonamento em tempo real." + +#~ msgid "PolicyKit grants us acquire-high-priority privilege." +#~ msgstr "" +#~ "O PolicyKit permite-nos o privilégio \"acquire-high-priority\" (adquirir " +#~ "alta prioridade)." + +#~ msgid "PolicyKit refuses acquire-high-priority privilege." +#~ msgstr "" +#~ "O PolicyKit recusa-nos o privilégio \"acquire-high-priority\" (adquirir " +#~ "alta prioridade)." + +#~ msgid "PolicyKit grants us acquire-real-time privilege." +#~ msgstr "" +#~ "O PolicyKit permite-nos o privilégio \"acquire-real-time\" (adquirir " +#~ "tempo real)." + +#~ msgid "PolicyKit refuses acquire-real-time privilege." +#~ msgstr "" +#~ "O PolicyKit recusa-nos o privilégio \"acquire-real-time\" (adquirir tempo " +#~ "real)." + +#~ msgid "" +#~ "High-priority scheduling enabled in configuration but not allowed by " +#~ "policy." +#~ msgstr "" +#~ "Escalonamento de alta prioridade activo na configuração, mas não " +#~ "permitido pela politica." + +#~ msgid "Successfully increased RLIMIT_RTPRIO" +#~ msgstr "RLIMIT_RTPRIO aumentado com sucesso" + +#~ msgid "RLIMIT_RTPRIO failed: %s" +#~ msgstr "RLIMIT_RTPRIO falhou: %s" + +#~ msgid "Giving up CAP_NICE" +#~ msgstr "A desistir de CAP_NICE" + +#~ msgid "" +#~ "Real-time scheduling enabled in configuration but not allowed by policy." +#~ msgstr "" +#~ "Escalonamento em tempo real activo na configuração, mas não permitido " +#~ "pela politica." + +#~ msgid "Limited capabilities successfully to CAP_SYS_NICE." +#~ msgstr "Capacidades limitadas com sucesso em CAP_SYS_NICE." + +#~ msgid "time_new() failed.\n" +#~ msgstr "time_new() falhou.\n" + +#~ msgid "Stream successfully created\n" +#~ msgstr "Fluxo criado com sucesso\n" + +#~ msgid "Stream errror: %s\n" +#~ msgstr "Erro de fluxo: %s\n" + +#~ msgid "Connection established.\n" +#~ msgstr "Ligação Estabelecida.\n" + +#~ msgid "" +#~ "paplay %s\n" +#~ "Compiled with libpulse %s\n" +#~ "Linked with libpulse %s\n" +#~ msgstr "" +#~ "paplay %s\n" +#~ "Compilado com libpulse %s\n" +#~ "Linkado com libpulse %s\n" + +#~ msgid "Invalid channel map\n" +#~ msgstr "Mapa de canais inválido\n" + +#~ msgid "Failed to open file '%s'\n" +#~ msgstr "Falha ao abrir o ficheiro '%s'\n" + +#~ msgid "Output %s + Input %s" +#~ msgstr "Saída %s + Entrada %s" diff --git a/po/pt_BR.po b/po/pt_BR.po new file mode 100644 index 0000000..257aa36 --- /dev/null +++ b/po/pt_BR.po @@ -0,0 +1,2670 @@ +# Brazilian Portuguese translation of PulseAudio +# Copyright (C) 2008,2009 pulseaudio +# This file is distributed under the same license as the pulseaudio package. +# Fabian Affolter , 2008. +# Igor Pires Soares , 2009. +# +msgid "" +msgstr "" +"Project-Id-Version: pulseaudio\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-10-23 09:53+0000\n" +"PO-Revision-Date: 2009-10-23 14:42-0300\n" +"Last-Translator: Igor Pires Soares \n" +"Language-Team: Brazilian-Portuguese \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Poedit-Language: Portuguese\n" +"X-Poedit-Country: Brazil\n" + +#: ../src/modules/alsa/alsa-util.c:858 +#: ../src/pulsecore/sink.c:2629 +#, c-format +msgid "%s %s" +msgstr "%s %s" + +#: ../src/modules/alsa/alsa-util.c:1106 +#, c-format +msgid "" +"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers." +msgstr "" +"O snd_pcm_avail() retornou um valor que é excepcionalmente grande: %lu bytes (%lu ms).\n" +"É mais provável que isso seja um erro no driver \"%s\" do ALSA. Por favor, relate esse problema aos desenvolvedores do ALSA." + +#: ../src/modules/alsa/alsa-util.c:1147 +#, c-format +msgid "" +"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%lu ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers." +msgstr "" +"O snd_pcm_delay() retornou um valor que é excepcionalmente grande: %li bytes (%s%lu ms).\n" +"É mais provável que isso seja um erro no driver \"%s\" do ALSA. Por favor, relate esse problema aos desenvolvedores do ALSA." + +#: ../src/modules/alsa/alsa-util.c:1194 +#, c-format +msgid "" +"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes (%lu ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers." +msgstr "" +"O snd_pcm_mmap_begin() retornou um valor que é excepcionalmente grande: %lu bytes (%lu ms).\n" +"É mais provável que isso seja um erro no driver \"%s\" do ALSA. Por favor, relate esse problema aos desenvolvedores do ALSA." + +#: ../src/modules/module-always-sink.c:39 +msgid "Always keeps at least one sink loaded even if it's a null one" +msgstr "Sempre manter pelo menos um destino carregado mesmo se for nulo" + +#: ../src/modules/module-always-sink.c:83 +msgid "Dummy Output" +msgstr "Saída fictícia" + +#: ../src/modules/module-ladspa-sink.c:49 +msgid "Virtual LADSPA sink" +msgstr "Destino Virtual LADSPA" + +#: ../src/modules/module-ladspa-sink.c:53 +msgid "sink_name= sink_properties= master= format= rate= channels= channel_map= plugin= label= control=" +msgstr "sink_name= sink_properties= master= format= rate= channels= channel_map= plugin= label= control=" + +#: ../src/modules/module-null-sink.c:55 +msgid "Clocked NULL sink" +msgstr "Destino nulo temporizado" + +#: ../src/modules/module-null-sink.c:291 +msgid "Null Output" +msgstr "Saída nula" + +#: ../src/pulsecore/sink.c:2613 +msgid "Internal Audio" +msgstr "Áudio interno" + +#: ../src/pulsecore/sink.c:2618 +msgid "Modem" +msgstr "Modem" + +#: ../src/daemon/ltdl-bind-now.c:124 +msgid "Failed to find original lt_dlopen loader." +msgstr "Falha ao localizar o carregador original lt_dlopen." + +#: ../src/daemon/ltdl-bind-now.c:129 +msgid "Failed to allocate new dl loader." +msgstr "Falha ao alocar o novo carregador dl." + +#: ../src/daemon/ltdl-bind-now.c:142 +msgid "Failed to add bind-now-loader." +msgstr "Falha em adicionar o bind-now-loader." + +#: ../src/daemon/main.c:141 +#, c-format +msgid "Got signal %s." +msgstr "Sinal %s recebido." + +#: ../src/daemon/main.c:168 +msgid "Exiting." +msgstr "Saindo." + +#: ../src/daemon/main.c:186 +#, c-format +msgid "Failed to find user '%s'." +msgstr "Falha ao localizar o usuário \"%s\"." + +#: ../src/daemon/main.c:191 +#, c-format +msgid "Failed to find group '%s'." +msgstr "Falha ao localizar o grupo \"%s\"." + +#: ../src/daemon/main.c:195 +#, c-format +msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)." +msgstr "Usuário \"%s\" (UID %lu) e grupo \"%s\" (GID %lu) localizados." + +#: ../src/daemon/main.c:200 +#, c-format +msgid "GID of user '%s' and of group '%s' don't match." +msgstr "O GID do usuário'%s' e do grupo '%s' não combinam." + +#: ../src/daemon/main.c:205 +#, c-format +msgid "Home directory of user '%s' is not '%s', ignoring." +msgstr "O diretório pessoal do usuário \"%s\" não é \"%s\", ignorando." + +#: ../src/daemon/main.c:208 +#: ../src/daemon/main.c:213 +#, c-format +msgid "Failed to create '%s': %s" +msgstr "Falha ao criar \"%s\": %s" + +#: ../src/daemon/main.c:220 +#, c-format +msgid "Failed to change group list: %s" +msgstr "Falha ao alterar a lista de grupos: %s" + +#: ../src/daemon/main.c:236 +#, c-format +msgid "Failed to change GID: %s" +msgstr "Falha ao alterar o GID: %s" + +#: ../src/daemon/main.c:252 +#, c-format +msgid "Failed to change UID: %s" +msgstr "Falha ao alterar o UID: %s" + +#: ../src/daemon/main.c:271 +msgid "Successfully dropped root privileges." +msgstr "Os privilégios do root foram retirados com sucesso." + +#: ../src/daemon/main.c:279 +msgid "System wide mode unsupported on this platform." +msgstr "O modo ampliado do sistema não tem suporte nessa plataforma." + +#: ../src/daemon/main.c:297 +#, c-format +msgid "setrlimit(%s, (%u, %u)) failed: %s" +msgstr "setrlimit(%s, (%u, %u)) falhou: %s" + +#: ../src/daemon/main.c:474 +msgid "Failed to parse command line." +msgstr "Falha em interpretar a linha de comando." + +#: ../src/daemon/main.c:541 +msgid "Daemon not running" +msgstr "O daemon não está em execução" + +#: ../src/daemon/main.c:543 +#, c-format +msgid "Daemon running as PID %u" +msgstr "Daemon executando como PID %u" + +#: ../src/daemon/main.c:553 +#, c-format +msgid "Failed to kill daemon: %s" +msgstr "Falha em encerrar o daemon: %s" + +#: ../src/daemon/main.c:571 +msgid "This program is not intended to be run as root (unless --system is specified)." +msgstr "Este programa não é para ser executado como root (a não ser que --system seja especificado)." + +#: ../src/daemon/main.c:573 +msgid "Root privileges required." +msgstr "Privilégios de root requeridos." + +#: ../src/daemon/main.c:578 +msgid "--start not supported for system instances." +msgstr "--start não tem suporte para instâncias de sistemas." + +#: ../src/daemon/main.c:583 +msgid "Running in system mode, but --disallow-exit not set!" +msgstr "Executando em no modo system, mas --disallow-exit não foi configurado!" + +#: ../src/daemon/main.c:586 +msgid "Running in system mode, but --disallow-module-loading not set!" +msgstr "Executando no modo system, mas --disallow-module-loading não foi configurado!" + +#: ../src/daemon/main.c:589 +msgid "Running in system mode, forcibly disabling SHM mode!" +msgstr "Executando no modo system, desabilitando forçadamente o modo SHM!" + +#: ../src/daemon/main.c:594 +msgid "Running in system mode, forcibly disabling exit idle time!" +msgstr "Executando no modo system, desabilitando forçadamente o exit idle time!" + +#: ../src/daemon/main.c:621 +msgid "Failed to acquire stdio." +msgstr "Falha em adquirir o stdio." + +#: ../src/daemon/main.c:627 +#, c-format +msgid "pipe failed: %s" +msgstr "O pipe falhou: %s" + +#: ../src/daemon/main.c:632 +#, c-format +msgid "fork() failed: %s" +msgstr "O fork() falhou: %s" + +#: ../src/daemon/main.c:646 +#: ../src/utils/pacat.c:508 +#, c-format +msgid "read() failed: %s" +msgstr "A operação read() falhou: %s" + +#: ../src/daemon/main.c:652 +msgid "Daemon startup failed." +msgstr "Falha na partida do daemon." + +#: ../src/daemon/main.c:654 +msgid "Daemon startup successful." +msgstr "Os daemons foram iniciados com sucesso." + +#: ../src/daemon/main.c:731 +#, c-format +msgid "This is PulseAudio %s" +msgstr "Este é o PulseAudio %s" + +#: ../src/daemon/main.c:732 +#, c-format +msgid "Compilation host: %s" +msgstr "Host de compilação: %s" + +#: ../src/daemon/main.c:733 +#, c-format +msgid "Compilation CFLAGS: %s" +msgstr "Compilação CFLAGS: %s" + +#: ../src/daemon/main.c:736 +#, c-format +msgid "Running on host: %s" +msgstr "Executando no host: %s" + +#: ../src/daemon/main.c:739 +#, c-format +msgid "Found %u CPUs." +msgstr "%u CPUs localizadas." + +#: ../src/daemon/main.c:741 +#, c-format +msgid "Page size is %lu bytes" +msgstr "O tamanho da página é %lu bytes" + +#: ../src/daemon/main.c:744 +msgid "Compiled with Valgrind support: yes" +msgstr "Compilado com suporte do Valgrind: sim" + +#: ../src/daemon/main.c:746 +msgid "Compiled with Valgrind support: no" +msgstr "Compilado com suporte do Valgrind: não" + +#: ../src/daemon/main.c:749 +#, c-format +msgid "Running in valgrind mode: %s" +msgstr "Executando em modo valgrind: %s" + +#: ../src/daemon/main.c:752 +msgid "Optimized build: yes" +msgstr "Build otimizado: sim" + +#: ../src/daemon/main.c:754 +msgid "Optimized build: no" +msgstr "Build otimizado: não" + +#: ../src/daemon/main.c:758 +msgid "NDEBUG defined, all asserts disabled." +msgstr "NDEBUG definido, todas as declarações desabilitadas." + +#: ../src/daemon/main.c:760 +msgid "FASTPATH defined, only fast path asserts disabled." +msgstr "FASTPATH definido, somente as declarações do \"fast path\" foram desabilitadas." + +#: ../src/daemon/main.c:762 +msgid "All asserts enabled." +msgstr "Todas as declarações habilitadas." + +#: ../src/daemon/main.c:766 +msgid "Failed to get machine ID" +msgstr "Falha em obter o ID da máquina" + +#: ../src/daemon/main.c:769 +#, c-format +msgid "Machine ID is %s." +msgstr "A ID da máquina é %s." + +#: ../src/daemon/main.c:773 +#, c-format +msgid "Session ID is %s." +msgstr "O ID da sessão é %s." + +#: ../src/daemon/main.c:779 +#, c-format +msgid "Using runtime directory %s." +msgstr "Usando o diretório de runtime %s." + +#: ../src/daemon/main.c:784 +#, c-format +msgid "Using state directory %s." +msgstr "Usando o diretório de estado %s." + +#: ../src/daemon/main.c:787 +#, c-format +msgid "Using modules directory %s." +msgstr "Usando o diretório de módulos %s." + +#: ../src/daemon/main.c:789 +#, c-format +msgid "Running in system mode: %s" +msgstr "Executando em modo do sistema: %s" + +#: ../src/daemon/main.c:792 +msgid "" +"OK, so you are running PA in system mode. Please note that you most likely shouldn't be doing that.\n" +"If you do it nonetheless then it's your own fault if things don't work as expected.\n" +"Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an explanation why system mode is usually a bad idea." +msgstr "" +"OK, então você está executando o PA no modo de sistema. Por favor, note que é mais provável que você não deveria estar fazendo isso.\n" +"Todavia, se você o fizer, então a culpa será sua se as coisas não funcionarem como esperado.\n" +"Por favor, leia o http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode para obter um explicação sobre porque o modo de sistema é uma má idéia." + +#: ../src/daemon/main.c:809 +msgid "pa_pid_file_create() failed." +msgstr "pa_pid_file_create() falhou." + +#: ../src/daemon/main.c:819 +msgid "Fresh high-resolution timers available! Bon appetit!" +msgstr "Timers de alta resolução frequinhos disponíveis! Bon appetit!" + +#: ../src/daemon/main.c:821 +msgid "Dude, your kernel stinks! The chef's recommendation today is Linux with high-resolution timers enabled!" +msgstr "Cara, teu kernel fede! A recomendação do chef hoje é Linux com timers de alta resolução habilitados!" + +#: ../src/daemon/main.c:844 +msgid "pa_core_new() failed." +msgstr "pa_core_new() falhou." + +#: ../src/daemon/main.c:904 +msgid "Failed to initialize daemon." +msgstr "Falha em iniciar o daemon." + +#: ../src/daemon/main.c:909 +msgid "Daemon startup without any loaded modules, refusing to work." +msgstr "O Daemon iniciou sem qualquer módulo carregado, recusando-se a trabalhar." + +#: ../src/daemon/main.c:926 +msgid "Daemon startup complete." +msgstr "A partida dos Daemon está completa." + +#: ../src/daemon/main.c:932 +msgid "Daemon shutdown initiated." +msgstr "O encerramento do Daemon foi iniciado." + +#: ../src/daemon/main.c:954 +msgid "Daemon terminated." +msgstr "Daemon terminado." + +#: ../src/daemon/cmdline.c:115 +#, c-format +msgid "" +"%s [options]\n" +"\n" +"COMMANDS:\n" +" -h, --help Show this help\n" +" --version Show version\n" +" --dump-conf Dump default configuration\n" +" --dump-modules Dump list of available modules\n" +" --dump-resample-methods Dump available resample methods\n" +" --cleanup-shm Cleanup stale shared memory segments\n" +" --start Start the daemon if it is not running\n" +" -k --kill Kill a running daemon\n" +" --check Check for a running daemon (only returns exit code)\n" +"\n" +"OPTIONS:\n" +" --system[=BOOL] Run as system-wide instance\n" +" -D, --daemonize[=BOOL] Daemonize after startup\n" +" --fail[=BOOL] Quit when startup fails\n" +" --high-priority[=BOOL] Try to set high nice level\n" +" (only available as root, when SUID or\n" +" with elevated RLIMIT_NICE)\n" +" --realtime[=BOOL] Try to enable realtime scheduling\n" +" (only available as root, when SUID or\n" +" with elevated RLIMIT_RTPRIO)\n" +" --disallow-module-loading[=BOOL] Disallow module user requested module\n" +" loading/unloading after startup\n" +" --disallow-exit[=BOOL] Disallow user requested exit\n" +" --exit-idle-time=SECS Terminate the daemon when idle and this\n" +" time passed\n" +" --module-idle-time=SECS Unload autoloaded modules when idle and\n" +" this time passed\n" +" --scache-idle-time=SECS Unload autoloaded samples when idle and\n" +" this time passed\n" +" --log-level[=LEVEL] Increase or set verbosity level\n" +" -v Increase the verbosity level\n" +" --log-target={auto,syslog,stderr} Specify the log target\n" +" --log-meta[=BOOL] Include code location in log messages\n" +" --log-time[=BOOL] Include timestamps in log messages\n" +" --log-backtrace=FRAMES Include a backtrace in log messages\n" +" -p, --dl-search-path=PATH Set the search path for dynamic shared\n" +" objects (plugins)\n" +" --resample-method=METHOD Use the specified resampling method\n" +" (See --dump-resample-methods for\n" +" possible values)\n" +" --use-pid-file[=BOOL] Create a PID file\n" +" --no-cpu-limit[=BOOL] Do not install CPU load limiter on\n" +" platforms that support it.\n" +" --disable-shm[=BOOL] Disable shared memory support.\n" +"\n" +"STARTUP SCRIPT:\n" +" -L, --load=\"MODULE ARGUMENTS\" Load the specified plugin module with\n" +" the specified argument\n" +" -F, --file=FILENAME Run the specified script\n" +" -C Open a command line on the running TTY\n" +" after startup\n" +"\n" +" -n Don't load default script file\n" +msgstr "" +"%s [opções]\n" +"\n" +"COMANDOS:\n" +" -h, --help Mostra esta ajuda\n" +" --version Mostra a versão\n" +" --dump-conf Descarrega a configuração padrão\n" +" --dump-modules Descarrega a lista de módulos disponíveis\n" +" --dump-resample-methods Descarrega os métodos de reamostragem\n" +" --cleanup-shm Limpa os segmentos de memória compartilhados\n" +" --start Inicia o daemon se ele não estiver em execução\n" +" -k --kill Encerra um daemon em execução\n" +" --check Verifica se há um daemon em execução (somente retorna o código de saída)\n" +"\n" +"OPÇÕES:\n" +" --system[=BOOL] Executa como uma instância do sistema em escala ampla\n" +" -D, --daemonize[=BOOL] Torna-se um daemom após o início\n" +" --fail[=BOOL] Sai quando a partida falha\n" +" --high-priority[=BOOL] Tenta definir um nível alto de nice\n" +" (disponível apenas, quando SUID ou\n" +" com RLIMIT_NICE) elevado\n" +" --realtime[=BOOL] Tenta habilitar o escalonamento em tempo real\n" +" (disponível apenas como root, quando SUID ou\n" +" com RLIMIT_RTPRIO) elevado\n" +" --disallow-module-loading[=BOOL] Não permite carga/descarga de módulo requerido pelo usuário\n" +" depois da partida\n" +" --disallow-exit[=BOOL] Não permite saída requisitada pelo usuário\n" +" --exit-idle-time=SECS Termina um daemon quando ocioso e este\n" +" tempo foi decorrido\n" +" --module-idle-time=SECS Descarrega os módulos autocarregáveis quando ociosos e\n" +" este tempo foi decorrido\n" +" --scache-idle-time=SECS Descarrega amostras quando ociosas e\n" +" este tempo foi decorrido\n" +" --log-level[=LEVEL] Aumenta ou define o grau de detalhamento\n" +" -v Aumenta o nível de detalhamento\n" +" --log-target={auto,syslog,stderr} Especifica o destino do log\n" +" --log-meta[=BOOL] Inclui a localização do código na mensagem de log\n" +" --log-time[=BOOL] Inclui carimbos de hora nas mensagens de log\n" +" --log-backtrace=FRAMES Inclui um backtrace na mensagem de log\n" +" -p, --dl-search-path=PATH Define o caminho de pesquisa para objetos (plugins)\n" +" dinamicamente compartilhados\n" +" --resample-method=METHOD Usa o método de reamostragem especificado\n" +" (Veja --dump-resample-methods para\n" +" valores possíveis)\n" +" --use-pid-file[=BOOL] Cria um arquivo PID\n" +" --no-cpu-limit[=BOOL] Não instala um limitador de carga de CPU em\n" +" plataformas que o suportem.\n" +" --disable-shm[=BOOL] Desabilita o suporte à memória compartilhada.\n" +"\n" +"SCRIPT DE INÍCIO:\n" +" -L, --load=\"ARGUMENTOS DO MÓDULO\" Carrega um plugin especificado com\n" +" o argumento especificado\n" +" -F, --file=NOME_DO_ARQUIVO Executa o script especificado\n" +" -C Abre uma linha de comando no TTY em execução\n" +" depois da partida\n" +"\n" +" -n Não carrega o arquivo de script padrão\n" + +#: ../src/daemon/cmdline.c:247 +msgid "--daemonize expects boolean argument" +msgstr "--daemonize espera argumento booleano" + +#: ../src/daemon/cmdline.c:254 +msgid "--fail expects boolean argument" +msgstr "--fail espera argumento booleano" + +#: ../src/daemon/cmdline.c:264 +msgid "--log-level expects log level argument (either numeric in range 0..4 or one of debug, info, notice, warn, error)." +msgstr "--log-level espera um argumento em nível de log (seja numérico na faixa de 0..4 seja algum entre debug, info, notice, warn, error)." + +#: ../src/daemon/cmdline.c:276 +msgid "--high-priority expects boolean argument" +msgstr "--high-priority espera um argumento booleano" + +#: ../src/daemon/cmdline.c:283 +msgid "--realtime expects boolean argument" +msgstr "--realtime espera um argumento booleano" + +#: ../src/daemon/cmdline.c:290 +msgid "--disallow-module-loading expects boolean argument" +msgstr "--disallow-module-loading espera um argumento booleano" + +#: ../src/daemon/cmdline.c:297 +msgid "--disallow-exit expects boolean argument" +msgstr "--disallow-exit espera um argumento booleano" + +#: ../src/daemon/cmdline.c:304 +msgid "--use-pid-file expects boolean argument" +msgstr "--use-pid-file espera argumento booleano" + +#: ../src/daemon/cmdline.c:321 +msgid "Invalid log target: use either 'syslog', 'stderr' or 'auto'." +msgstr "Log target inválido: use 'syslog', 'stderr' ou 'auto'." + +#: ../src/daemon/cmdline.c:328 +msgid "--log-time expects boolean argument" +msgstr "--log-time espera um argumento booleano" + +#: ../src/daemon/cmdline.c:335 +msgid "--log-meta expects boolean argument" +msgstr "--log-meta espera um argumento booleano" + +#: ../src/daemon/cmdline.c:354 +#, c-format +msgid "Invalid resample method '%s'." +msgstr "Método de reamostragem inválido '%s'." + +#: ../src/daemon/cmdline.c:361 +msgid "--system expects boolean argument" +msgstr "--system espera argumento booleano" + +#: ../src/daemon/cmdline.c:368 +msgid "--no-cpu-limit expects boolean argument" +msgstr "--no-cpu-limit espera argumento booleano" + +#: ../src/daemon/cmdline.c:375 +msgid "--disable-shm expects boolean argument" +msgstr "--disable-shm espera argumento booleano" + +#: ../src/daemon/dumpmodules.c:60 +#, c-format +msgid "Name: %s\n" +msgstr "Nome: %s\n" + +#: ../src/daemon/dumpmodules.c:63 +#, c-format +msgid "No module information available\n" +msgstr "Não há informação do módulo disponível\n" + +#: ../src/daemon/dumpmodules.c:66 +#, c-format +msgid "Version: %s\n" +msgstr "Versão: %s\n" + +#: ../src/daemon/dumpmodules.c:68 +#, c-format +msgid "Description: %s\n" +msgstr "Descrição: %s\n" + +#: ../src/daemon/dumpmodules.c:70 +#, c-format +msgid "Author: %s\n" +msgstr "Autor: %s\n" + +#: ../src/daemon/dumpmodules.c:72 +#, c-format +msgid "Usage: %s\n" +msgstr "Uso: %s\n" + +#: ../src/daemon/dumpmodules.c:73 +#, c-format +msgid "Load Once: %s\n" +msgstr "Carrega uma vez: %s\n" + +#: ../src/daemon/dumpmodules.c:75 +#, c-format +msgid "DEPRECATION WARNING: %s\n" +msgstr "AVISO DE OBSOLESCÊNCIA: %s\n" + +#: ../src/daemon/dumpmodules.c:79 +#, c-format +msgid "Path: %s\n" +msgstr "Caminho: %s\n" + +#: ../src/daemon/daemon-conf.c:232 +#, c-format +msgid "[%s:%u] Invalid log target '%s'." +msgstr "[%s:%u] Alvo do log inválido '%s'." + +#: ../src/daemon/daemon-conf.c:248 +#, c-format +msgid "[%s:%u] Invalid log level '%s'." +msgstr "[%s:%u] Nível de log inválido '%s'." + +#: ../src/daemon/daemon-conf.c:264 +#, c-format +msgid "[%s:%u] Invalid resample method '%s'." +msgstr "[%s:%u] Método de reamostragem inválido '%s'." + +#: ../src/daemon/daemon-conf.c:287 +#, c-format +msgid "[%s:%u] Invalid rlimit '%s'." +msgstr "[%s:%u] rlimit inválido '%s'." + +#: ../src/daemon/daemon-conf.c:294 +#, c-format +msgid "[%s:%u] rlimit not supported on this platform." +msgstr "[%s:%u] rlimit não tem suporte nessa plataforma." + +#: ../src/daemon/daemon-conf.c:310 +#, c-format +msgid "[%s:%u] Invalid sample format '%s'." +msgstr "[%s:%u] Formato de amostragem inválido '%s'." + +#: ../src/daemon/daemon-conf.c:328 +#, c-format +msgid "[%s:%u] Invalid sample rate '%s'." +msgstr "[%s:%u] Taxa de amostragem inválida '%s'." + +#: ../src/daemon/daemon-conf.c:352 +#, c-format +msgid "[%s:%u] Invalid sample channels '%s'." +msgstr "[%s:%u] Canais de amostragem inválidos'%s'." + +#: ../src/daemon/daemon-conf.c:370 +#, c-format +msgid "[%s:%u] Invalid channel map '%s'." +msgstr "[%s:%u] Mapa de canais \"%s\" inválido." + +#: ../src/daemon/daemon-conf.c:388 +#, c-format +msgid "[%s:%u] Invalid number of fragments '%s'." +msgstr "[%s:%u] Números de fragmentos inválidos '%s'." + +#: ../src/daemon/daemon-conf.c:406 +#, c-format +msgid "[%s:%u] Invalid fragment size '%s'." +msgstr "[%s:%u] Tamanho de fragmentos inválido '%s'." + +#: ../src/daemon/daemon-conf.c:424 +#, c-format +msgid "[%s:%u] Invalid nice level '%s'." +msgstr "[%s:%u] Número de nice inválido'%s'." + +#: ../src/daemon/daemon-conf.c:546 +#, c-format +msgid "Failed to open configuration file: %s" +msgstr "Falha em abrir o arquivo de configuração: %s" + +#: ../src/daemon/daemon-conf.c:562 +msgid "The specified default channel map has a different number of channels than the specified default number of channels." +msgstr "O mapa padrão dos canais especificado tem um número diferente de canais do que o número de canais padrão especificado." + +#: ../src/daemon/daemon-conf.c:638 +#, c-format +msgid "### Read from configuration file: %s ###\n" +msgstr "### Lido do arquivo de configuração: %s ###\n" + +#: ../src/daemon/caps.c:62 +msgid "Cleaning up privileges." +msgstr "Limpando privilégios." + +#: ../src/daemon/pulseaudio.desktop.in.h:1 +msgid "PulseAudio Sound System" +msgstr "Sistema de som PulseAudio" + +#: ../src/daemon/pulseaudio.desktop.in.h:2 +msgid "Start the PulseAudio Sound System" +msgstr "Iniciar o sistema de som PulseAudio" + +#: ../src/pulse/channelmap.c:105 +#: ../src/pulse/channelmap.c:757 +msgid "Mono" +msgstr "Mono" + +#: ../src/pulse/channelmap.c:107 +msgid "Front Center" +msgstr "Frontal central" + +#: ../src/pulse/channelmap.c:108 +msgid "Front Left" +msgstr "Frontal esquerdo" + +#: ../src/pulse/channelmap.c:109 +msgid "Front Right" +msgstr "Frontal direito" + +#: ../src/pulse/channelmap.c:111 +msgid "Rear Center" +msgstr "Posterior central" + +#: ../src/pulse/channelmap.c:112 +msgid "Rear Left" +msgstr "Posterior esquerdo" + +#: ../src/pulse/channelmap.c:113 +msgid "Rear Right" +msgstr "Posterior direito" + +#: ../src/pulse/channelmap.c:115 +msgid "Low Frequency Emmiter" +msgstr "Emissor de baixa freqüência" + +#: ../src/pulse/channelmap.c:117 +msgid "Front Left-of-center" +msgstr "Frontal Esquerdo do centro" + +#: ../src/pulse/channelmap.c:118 +msgid "Front Right-of-center" +msgstr "Frontal Direito do centro" + +#: ../src/pulse/channelmap.c:120 +msgid "Side Left" +msgstr "Lateral esquedo" + +#: ../src/pulse/channelmap.c:121 +msgid "Side Right" +msgstr "Lateral direito" + +#: ../src/pulse/channelmap.c:123 +msgid "Auxiliary 0" +msgstr "Auxiliar 0" + +#: ../src/pulse/channelmap.c:124 +msgid "Auxiliary 1" +msgstr "Auxiliar 1" + +#: ../src/pulse/channelmap.c:125 +msgid "Auxiliary 2" +msgstr "Auxiliar 2" + +#: ../src/pulse/channelmap.c:126 +msgid "Auxiliary 3" +msgstr "Auxiliar 3" + +#: ../src/pulse/channelmap.c:127 +msgid "Auxiliary 4" +msgstr "Auxiliar 4" + +#: ../src/pulse/channelmap.c:128 +msgid "Auxiliary 5" +msgstr "Auxiliar 5" + +#: ../src/pulse/channelmap.c:129 +msgid "Auxiliary 6" +msgstr "Auxiliar 6" + +#: ../src/pulse/channelmap.c:130 +msgid "Auxiliary 7" +msgstr "Auxiliar 7" + +#: ../src/pulse/channelmap.c:131 +msgid "Auxiliary 8" +msgstr "Auxiliar 8" + +#: ../src/pulse/channelmap.c:132 +msgid "Auxiliary 9" +msgstr "Auxiliar 9" + +#: ../src/pulse/channelmap.c:133 +msgid "Auxiliary 10" +msgstr "Auxiliar 10" + +#: ../src/pulse/channelmap.c:134 +msgid "Auxiliary 11" +msgstr "Auxiliar 11" + +#: ../src/pulse/channelmap.c:135 +msgid "Auxiliary 12" +msgstr "Auxiliar 12" + +#: ../src/pulse/channelmap.c:136 +msgid "Auxiliary 13" +msgstr "Auxiliar13" + +#: ../src/pulse/channelmap.c:137 +msgid "Auxiliary 14" +msgstr "Auxiliar 14" + +#: ../src/pulse/channelmap.c:138 +msgid "Auxiliary 15" +msgstr "Auxiliar 15" + +#: ../src/pulse/channelmap.c:139 +msgid "Auxiliary 16" +msgstr "Auxiliar 16" + +#: ../src/pulse/channelmap.c:140 +msgid "Auxiliary 17" +msgstr "Auxiliar 17" + +#: ../src/pulse/channelmap.c:141 +msgid "Auxiliary 18" +msgstr "Auxiliar 18" + +#: ../src/pulse/channelmap.c:142 +msgid "Auxiliary 19" +msgstr "Auxiliar 19" + +#: ../src/pulse/channelmap.c:143 +msgid "Auxiliary 20" +msgstr "Auxiliar 20" + +#: ../src/pulse/channelmap.c:144 +msgid "Auxiliary 21" +msgstr "Auxiliar 21" + +#: ../src/pulse/channelmap.c:145 +msgid "Auxiliary 22" +msgstr "Auxiliar 22" + +#: ../src/pulse/channelmap.c:146 +msgid "Auxiliary 23" +msgstr "Auxiliar 23" + +#: ../src/pulse/channelmap.c:147 +msgid "Auxiliary 24" +msgstr "Auxiliar 24" + +#: ../src/pulse/channelmap.c:148 +msgid "Auxiliary 25" +msgstr "Auxiliar 25" + +#: ../src/pulse/channelmap.c:149 +msgid "Auxiliary 26" +msgstr "Auxiliar 26" + +#: ../src/pulse/channelmap.c:150 +msgid "Auxiliary 27" +msgstr "Auxiliar 26" + +#: ../src/pulse/channelmap.c:151 +msgid "Auxiliary 28" +msgstr "Auxiliar 28" + +#: ../src/pulse/channelmap.c:152 +msgid "Auxiliary 29" +msgstr "Auxiliar 29" + +#: ../src/pulse/channelmap.c:153 +msgid "Auxiliary 30" +msgstr "Auxiliar 30" + +#: ../src/pulse/channelmap.c:154 +msgid "Auxiliary 31" +msgstr "Auxiliar 31" + +#: ../src/pulse/channelmap.c:156 +msgid "Top Center" +msgstr "Central superior" + +#: ../src/pulse/channelmap.c:158 +msgid "Top Front Center" +msgstr "Central frontal superior" + +#: ../src/pulse/channelmap.c:159 +msgid "Top Front Left" +msgstr "Frontal superior esquerdo" + +#: ../src/pulse/channelmap.c:160 +msgid "Top Front Right" +msgstr "Fontal superior direito" + +#: ../src/pulse/channelmap.c:162 +msgid "Top Rear Center" +msgstr "Central superior posterior" + +#: ../src/pulse/channelmap.c:163 +msgid "Top Rear Left" +msgstr "Posterior superior esquerdo" + +#: ../src/pulse/channelmap.c:164 +msgid "Top Rear Right" +msgstr "Posterior superior direito" + +#: ../src/pulse/channelmap.c:484 +#: ../src/pulse/sample.c:170 +#: ../src/pulse/volume.c:295 +#: ../src/pulse/volume.c:321 +#: ../src/pulse/volume.c:341 +#: ../src/pulse/volume.c:371 +msgid "(invalid)" +msgstr "(Inválido)" + +#: ../src/pulse/channelmap.c:761 +msgid "Stereo" +msgstr "Stereo" + +#: ../src/pulse/channelmap.c:766 +msgid "Surround 4.0" +msgstr "Surround 4.0" + +#: ../src/pulse/channelmap.c:772 +msgid "Surround 4.1" +msgstr "Surround 4.1" + +#: ../src/pulse/channelmap.c:778 +msgid "Surround 5.0" +msgstr "Surround 5.0" + +#: ../src/pulse/channelmap.c:784 +msgid "Surround 5.1" +msgstr "Surround 5.1" + +#: ../src/pulse/channelmap.c:791 +msgid "Surround 7.1" +msgstr "Surround 7.1" + +#: ../src/pulse/error.c:43 +msgid "OK" +msgstr "OK" + +#: ../src/pulse/error.c:44 +msgid "Access denied" +msgstr "Acesso negado" + +#: ../src/pulse/error.c:45 +msgid "Unknown command" +msgstr "Comando desconhecido" + +#: ../src/pulse/error.c:46 +msgid "Invalid argument" +msgstr "Argumento inválido" + +#: ../src/pulse/error.c:47 +msgid "Entity exists" +msgstr "Entidade existente" + +#: ../src/pulse/error.c:48 +msgid "No such entity" +msgstr "Não existe tal entidade" + +#: ../src/pulse/error.c:49 +msgid "Connection refused" +msgstr "Conexão recusada" + +#: ../src/pulse/error.c:50 +msgid "Protocol error" +msgstr "Erro de protocolo" + +#: ../src/pulse/error.c:51 +msgid "Timeout" +msgstr "Timeout" + +#: ../src/pulse/error.c:52 +msgid "No authorization key" +msgstr "Não há chave para autorização" + +#: ../src/pulse/error.c:53 +msgid "Internal error" +msgstr "Erro interno" + +#: ../src/pulse/error.c:54 +msgid "Connection terminated" +msgstr "Conexão terminada" + +#: ../src/pulse/error.c:55 +msgid "Entity killed" +msgstr "Entidade terminada" + +#: ../src/pulse/error.c:56 +msgid "Invalid server" +msgstr "Servidor inválido" + +#: ../src/pulse/error.c:57 +msgid "Module initalization failed" +msgstr "A inicialização do módulo falhou" + +#: ../src/pulse/error.c:58 +msgid "Bad state" +msgstr "Mau estado" + +#: ../src/pulse/error.c:59 +msgid "No data" +msgstr "Não há dados" + +#: ../src/pulse/error.c:60 +msgid "Incompatible protocol version" +msgstr "Versão de protocolo incompatível" + +#: ../src/pulse/error.c:61 +msgid "Too large" +msgstr "Muito grande" + +#: ../src/pulse/error.c:62 +msgid "Not supported" +msgstr "Não há suporte" + +#: ../src/pulse/error.c:63 +msgid "Unknown error code" +msgstr "Código de erro desconhecido" + +#: ../src/pulse/error.c:64 +msgid "No such extension" +msgstr "Não existe tal extensão" + +#: ../src/pulse/error.c:65 +msgid "Obsolete functionality" +msgstr "Funcionalidade obsoleta" + +#: ../src/pulse/error.c:66 +msgid "Missing implementation" +msgstr "Implementação faltando" + +#: ../src/pulse/error.c:67 +msgid "Client forked" +msgstr "Cliente bifurcado" + +#: ../src/pulse/error.c:68 +msgid "Input/Output error" +msgstr "Erro de entrada/saída" + +#: ../src/pulse/error.c:69 +msgid "Device or resource busy" +msgstr "Dispositivo ou recurso ocupado" + +#: ../src/pulse/sample.c:172 +#, c-format +msgid "%s %uch %uHz" +msgstr "%s %uch %uHz" + +#: ../src/pulse/sample.c:184 +#, c-format +msgid "%0.1f GiB" +msgstr "%0.1f GiB" + +#: ../src/pulse/sample.c:186 +#, c-format +msgid "%0.1f MiB" +msgstr "%0.1f MiB" + +#: ../src/pulse/sample.c:188 +#, c-format +msgid "%0.1f KiB" +msgstr "%0.1f KiB" + +#: ../src/pulse/sample.c:190 +#, c-format +msgid "%u B" +msgstr "%u B" + +#: ../src/pulse/client-conf-x11.c:55 +#: ../src/utils/pax11publish.c:100 +msgid "XOpenDisplay() failed" +msgstr "XOpenDisplay() falhou" + +#: ../src/pulse/client-conf-x11.c:93 +msgid "Failed to parse cookie data" +msgstr "Falhou ao analisar os dados do cookie" + +#: ../src/pulse/client-conf.c:111 +#, c-format +msgid "Failed to open configuration file '%s': %s" +msgstr "Falha em abrir o arquivo de configuração '%s': %s" + +#: ../src/pulse/context.c:550 +msgid "No cookie loaded. Attempting to connect without." +msgstr "Nenhum cookie foi carregado. Tentativa de conexão sem eles." + +#: ../src/pulse/context.c:693 +#, c-format +msgid "fork(): %s" +msgstr "fork(): %s" + +#: ../src/pulse/context.c:748 +#, c-format +msgid "waitpid(): %s" +msgstr "waitpid(): %s" + +#: ../src/pulse/context.c:1438 +#, c-format +msgid "Received message for unknown extension '%s'" +msgstr "Foi recebida uma mensagem para uma extensão desconhecida '%s'" + +#: ../src/utils/pacat.c:108 +#, c-format +msgid "Failed to drain stream: %s" +msgstr "Falha ao drenar o fluxo: %s" + +#: ../src/utils/pacat.c:113 +msgid "Playback stream drained." +msgstr "Fluxo de reprodução drenado." + +#: ../src/utils/pacat.c:123 +msgid "Draining connection to server." +msgstr "Drenando conexão para o servidor." + +#: ../src/utils/pacat.c:136 +#, c-format +msgid "pa_stream_drain(): %s" +msgstr "pa_stream_drain(): %s" + +#: ../src/utils/pacat.c:159 +#, c-format +msgid "pa_stream_write() failed: %s" +msgstr "pa_stream_write() falhou: %s" + +#: ../src/utils/pacat.c:197 +#, c-format +msgid "pa_stream_begin_write() failed: %s" +msgstr "pa_stream_begin_write() falhou: %s" + +#: ../src/utils/pacat.c:237 +#: ../src/utils/pacat.c:267 +#, c-format +msgid "pa_stream_peek() failed: %s" +msgstr "pa_stream_peek() falhou: %s" + +#: ../src/utils/pacat.c:307 +msgid "Stream successfully created." +msgstr "Fluxo criado com sucesso." + +#: ../src/utils/pacat.c:310 +#, c-format +msgid "pa_stream_get_buffer_attr() failed: %s" +msgstr "pa_stream_get_buffer_attr() falhou: %s" + +#: ../src/utils/pacat.c:314 +#, c-format +msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u" +msgstr "Métricas do buffer: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u" + +#: ../src/utils/pacat.c:317 +#, c-format +msgid "Buffer metrics: maxlength=%u, fragsize=%u" +msgstr "Métricas do buffer: maxlength=%u, fragsize=%u" + +#: ../src/utils/pacat.c:321 +#, c-format +msgid "Using sample spec '%s', channel map '%s'." +msgstr "Usando especificação de amostragem \"%s\", mapa de canais \"%s\"." + +#: ../src/utils/pacat.c:325 +#, c-format +msgid "Connected to device %s (%u, %ssuspended)." +msgstr "Conectado ao dispositivo %s (%u, %ssuspended)." + +#: ../src/utils/pacat.c:335 +#, c-format +msgid "Stream error: %s" +msgstr "Erro de fluxo: %s" + +#: ../src/utils/pacat.c:345 +#, c-format +msgid "Stream device suspended.%s" +msgstr "Dispositivo de fluxo suspenso.%s" + +#: ../src/utils/pacat.c:347 +#, c-format +msgid "Stream device resumed.%s" +msgstr "O dispositivo de fluxo continuou.%s" + +#: ../src/utils/pacat.c:355 +#, c-format +msgid "Stream underrun.%s" +msgstr "Subestimação do fluxo.%s" + +#: ../src/utils/pacat.c:362 +#, c-format +msgid "Stream overrun.%s" +msgstr "Superestimação do fluxo.%s" + +#: ../src/utils/pacat.c:369 +#, c-format +msgid "Stream started.%s" +msgstr "Fluxo iniciado.%s" + +#: ../src/utils/pacat.c:376 +#, c-format +msgid "Stream moved to device %s (%u, %ssuspended).%s" +msgstr "Fluxo movido para o dispositivo %s (%u, %ssuspended).%s" + +#: ../src/utils/pacat.c:376 +msgid "not " +msgstr "não" + +#: ../src/utils/pacat.c:383 +#, c-format +msgid "Stream buffer attributes changed.%s" +msgstr "Atributos do buffer de fluxo alterados.%s" + +#: ../src/utils/pacat.c:415 +#, c-format +msgid "Connection established.%s" +msgstr "Conexão estabelecida.%s" + +#: ../src/utils/pacat.c:418 +#, c-format +msgid "pa_stream_new() failed: %s" +msgstr "pa_stream_new() falhou: %s" + +#: ../src/utils/pacat.c:450 +#, c-format +msgid "pa_stream_connect_playback() failed: %s" +msgstr "pa_stream_connect_playback() falhou: %s" + +#: ../src/utils/pacat.c:456 +#, c-format +msgid "pa_stream_connect_record() failed: %s" +msgstr "pa_stream_connect_record() falhou: %s" + +#: ../src/utils/pacat.c:470 +#: ../src/utils/pactl.c:857 +#, c-format +msgid "Connection failure: %s" +msgstr "Falha na conexão: %s" + +#: ../src/utils/pacat.c:503 +msgid "Got EOF." +msgstr "Atingiu EOF." + +#: ../src/utils/pacat.c:540 +#, c-format +msgid "write() failed: %s" +msgstr "write() falhou: %s" + +#: ../src/utils/pacat.c:561 +msgid "Got signal, exiting." +msgstr "Sinal recebido, saindo." + +#: ../src/utils/pacat.c:575 +#, c-format +msgid "Failed to get latency: %s" +msgstr "Falha ao obter a latência: %s" + +#: ../src/utils/pacat.c:580 +#, c-format +msgid "Time: %0.3f sec; Latency: %0.0f usec." +msgstr "Tempo: %0.3f sec;; Latência: %0.0f usec." + +#: ../src/utils/pacat.c:599 +#, c-format +msgid "pa_stream_update_timing_info() failed: %s" +msgstr "pa_stream_update_timing_info() falhou: %s" + +#: ../src/utils/pacat.c:609 +#, c-format +msgid "" +"%s [options]\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -r, --record Create a connection for recording\n" +" -p, --playback Create a connection for playback\n" +"\n" +" -v, --verbose Enable verbose operations\n" +"\n" +" -s, --server=SERVER The name of the server to connect to\n" +" -d, --device=DEVICE The name of the sink/source to connect to\n" +" -n, --client-name=NAME How to call this client on the server\n" +" --stream-name=NAME How to call this stream on the server\n" +" --volume=VOLUME Specify the initial (linear) volume in range 0...65536\n" +" --rate=SAMPLERATE The sample rate in Hz (defaults to 44100)\n" +" --format=SAMPLEFORMAT The sample type, one of s16le, s16be, u8, float32le,\n" +" float32be, ulaw, alaw, s32le, s32be, s24le, s24be,\n" +" s24-32le, s24-32be (defaults to s16ne)\n" +" --channels=CHANNELS The number of channels, 1 for mono, 2 for stereo\n" +" (defaults to 2)\n" +" --channel-map=CHANNELMAP Channel map to use instead of the default\n" +" --fix-format Take the sample format from the sink the stream is\n" +" being connected to.\n" +" --fix-rate Take the sampling rate from the sink the stream is\n" +" being connected to.\n" +" --fix-channels Take the number of channels and the channel map\n" +" from the sink the stream is being connected to.\n" +" --no-remix Don't upmix or downmix channels.\n" +" --no-remap Map channels by index instead of name.\n" +" --latency=BYTES Request the specified latency in bytes.\n" +" --process-time=BYTES Request the specified process time per request in bytes.\n" +" --property=PROPERTY=VALUE Set the specified property to the specified value.\n" +" --raw Record/play raw PCM data.\n" +" --file-format=FFORMAT Record/play formatted PCM data.\n" +" --list-file-formats List available file formats.\n" +msgstr "" +"%s [opções]\n" +"\n" +" -h, --help Mostra essa ajuda\n" +" --version Mostra a versão\n" +"\n" +" -r, --record Cria uma conexão para gravação\n" +" -p, --playback Cria uma conexão para reprodução\n" +"\n" +" -v, --verbose Habilita operações no modo detalhado\n" +"\n" +" -s, --server=SERVIDOR Nome do servidor a conectar-se\n" +" -d, --device=DISPOSITIVO O nome do destino/fonte a conectar-se\n" +" -n, --client-name=NOME Como chamar este cliente no servidor\n" +" --stream-name=NOME Como chamar este fluxo no servidor\n" +" --volume=VOLUME Especifica a faixa (linear) inicial de volume no intervalo 0...65536\n" +" --rate=TAXA_DE_AMOSTRAGEM Taxa de amostragem em Hz (o padrão é 44100)\n" +" --format=FORMATO_DE_AMOSTRAGEM Tipo de amostragem, um de s16le, s16be, u8, float32le,\n" +" float32be, ulaw, alaw, s32le, s32be, s24le, s24be,\n" +" s24-32le, s24-32be (o padrão é s16ne)\n" +" --channels=CANAIS O número de canais, 1 para mono, 2 para estéreo\n" +" (o padrão é 2)\n" +" --channel-map=MAPA_DE_CANAIS Mapeamento de canais a ser usado no lugar do padrão\n" +" --fix-format Obtém o formato da amostragem do destino onde o fluxo\n" +" está sendo conectado.\n" +" --fix-rate Obtém a taxa de amostragem do destino onde o fluxo está\n" +" sendo conectado.\n" +" --fix-channels Obtém o número de canais e o mapa de canais\n" +" do destino onde o fluxo está sendo conectado.\n" +" --no-remix Não realizar upmix nem downmix dos canais.\n" +" --no-remap Mapear os canais por índice em vez de nome.\n" +" --latency=BYTES Requisitar a latência especificada em bytes.\n" +" --process-time=BYTES Requisitar o tempo de processo especificado por requisições em bytes.\n" +" --property=PROPRIEDADE=VALOR Define a propriedade especificada para o valor especificado.\n" +" --raw Grava/reproduz dados PCM não tratados.\n" +" --file-format=FORMATO_DO_ARQ. Grava/reproduz dados PCM formatados.\n" +" --list-file-formats Lista os formatos de arquivo disponíveis.\n" + +#: ../src/utils/pacat.c:731 +#, c-format +msgid "" +"pacat %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pacat %s\n" +"Compilado com libpulse %s\n" +"Linkado com libpulse %s\n" + +#: ../src/utils/pacat.c:764 +#: ../src/utils/pactl.c:953 +#, c-format +msgid "Invalid client name '%s'" +msgstr "Nome do cliente \"%s\" inválido" + +#: ../src/utils/pacat.c:779 +#, c-format +msgid "Invalid stream name '%s'" +msgstr "Nome do fluxo \"%s\" inválido" + +#: ../src/utils/pacat.c:816 +#, c-format +msgid "Invalid channel map '%s'" +msgstr "Mapa de canais \"%s\" inválido" + +#: ../src/utils/pacat.c:845 +#, c-format +msgid "Invalid latency specification '%s'" +msgstr "Especificação de latência inválida \"%s\"" + +#: ../src/utils/pacat.c:852 +#, c-format +msgid "Invalid process time specification '%s'" +msgstr "Especificação do tempo de processo \"%s\" inválida" + +#: ../src/utils/pacat.c:864 +#, c-format +msgid "Invalid property '%s'" +msgstr "Propriedade \"%s\" inválida" + +#: ../src/utils/pacat.c:881 +#, c-format +msgid "Unknown file format %s." +msgstr "Formato de arquivo %s desconhecido." + +#: ../src/utils/pacat.c:900 +msgid "Invalid sample specification" +msgstr "Especificação de amostragem inválida" + +#: ../src/utils/pacat.c:910 +#, c-format +msgid "open(): %s" +msgstr "open(): %s" + +#: ../src/utils/pacat.c:915 +#, c-format +msgid "dup2(): %s" +msgstr "dup2(): %s" + +#: ../src/utils/pacat.c:922 +msgid "Too many arguments." +msgstr "Argumentos em excesso." + +#: ../src/utils/pacat.c:933 +msgid "Failed to generate sample specification for file." +msgstr "Falha ao gerar a especificação de amostragem para o arquivo." + +#: ../src/utils/pacat.c:953 +msgid "Failed to open audio file." +msgstr "Falha ao abrir o arquivo de áudio." + +#: ../src/utils/pacat.c:959 +msgid "Warning: specified sample specification will be overwritten with specification from file." +msgstr "Aviso: a especificação de amostragem especificada será sobrescrita pela especificação do arquivo." + +#: ../src/utils/pacat.c:962 +#: ../src/utils/pactl.c:997 +msgid "Failed to determine sample specification from file." +msgstr "Falha ao determinar a especificação de amostragem a partir do arquivo." + +#: ../src/utils/pacat.c:971 +msgid "Warning: Failed to determine channel map from file." +msgstr "Aviso: falha ao determinar o mapa de canais a partir do arquivo." + +#: ../src/utils/pacat.c:982 +msgid "Channel map doesn't match sample specification" +msgstr "O mapa de canais não combina com a especificação da amostragem" + +#: ../src/utils/pacat.c:993 +msgid "Warning: failed to write channel map to file." +msgstr "Aviso: falha ao gravar o mapa de canais no arquivo." + +#: ../src/utils/pacat.c:1008 +#, c-format +msgid "Opening a %s stream with sample specification '%s' and channel map '%s'." +msgstr "Abrindo um fluxo %s com a especificação de amostragem \"%s\" e mapeamento de canais \"%s\"." + +#: ../src/utils/pacat.c:1009 +msgid "recording" +msgstr "gravando" + +#: ../src/utils/pacat.c:1009 +msgid "playback" +msgstr "playback" + +#: ../src/utils/pacat.c:1035 +#: ../src/utils/pactl.c:1267 +msgid "pa_mainloop_new() failed." +msgstr "pa_mainloop_new() falhou." + +#: ../src/utils/pacat.c:1054 +msgid "io_new() failed." +msgstr "io_new() falhou." + +#: ../src/utils/pacat.c:1061 +#: ../src/utils/pactl.c:1279 +msgid "pa_context_new() failed." +msgstr "pa_context_new() falhou." + +#: ../src/utils/pacat.c:1069 +#: ../src/utils/pactl.c:1285 +#, c-format +msgid "pa_context_connect() failed: %s" +msgstr "pa_context_new() falhou: %s" + +#: ../src/utils/pacat.c:1075 +msgid "pa_context_rttime_new() failed." +msgstr "pa_context_rttime_new() falhou." + +#: ../src/utils/pacat.c:1082 +#: ../src/utils/pactl.c:1290 +msgid "pa_mainloop_run() failed." +msgstr "pa_mainloop_run() falhou." + +#: ../src/utils/pasuspender.c:81 +#, c-format +msgid "fork(): %s\n" +msgstr "fork(): %s\n" + +#: ../src/utils/pasuspender.c:92 +#, c-format +msgid "execvp(): %s\n" +msgstr "execvp(): %s\n" + +#: ../src/utils/pasuspender.c:109 +#, c-format +msgid "Failure to suspend: %s\n" +msgstr "Falha em suspender: %s\n" + +#: ../src/utils/pasuspender.c:124 +#, c-format +msgid "Failure to resume: %s\n" +msgstr "Falha ao prosseguir: %s\n" + +#: ../src/utils/pasuspender.c:147 +#, c-format +msgid "WARNING: Sound server is not local, not suspending.\n" +msgstr "AVISO: O servidor de som não é local, Sound server is not local, não está em suspenso.\n" + +#: ../src/utils/pasuspender.c:159 +#, c-format +msgid "Connection failure: %s\n" +msgstr "Falha na conexão: %s\n" + +#: ../src/utils/pasuspender.c:176 +#, c-format +msgid "Got SIGINT, exiting.\n" +msgstr "Recebido o SIGINT, saindo.\n" + +#: ../src/utils/pasuspender.c:194 +#, c-format +msgid "WARNING: Child process terminated by signal %u\n" +msgstr "AVISO: O processo filho terminou pelo sinal %u \n" + +#: ../src/utils/pasuspender.c:212 +#, c-format +msgid "" +"%s [options] ... \n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +" -s, --server=SERVER The name of the server to connect to\n" +"\n" +msgstr "" +"%s [options] ... \n" +"\n" +" -h, --help Mostra esta ajuda\n" +" --version Mostra a versão\n" +" -s, --server=SERVER Nome do servidor a ser conectado\n" +"\n" + +#: ../src/utils/pasuspender.c:248 +#, c-format +msgid "" +"pasuspender %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pasuspender %s\n" +"Compilado com libpulse %s\n" +"Linkado com libpulse %s\n" + +#: ../src/utils/pasuspender.c:277 +#, c-format +msgid "pa_mainloop_new() failed.\n" +msgstr "pa_mainloop_new() falhou.\n" + +#: ../src/utils/pasuspender.c:290 +#, c-format +msgid "pa_context_new() failed.\n" +msgstr "pa_context_new() falhou.\n" + +#: ../src/utils/pasuspender.c:298 +#, c-format +msgid "pa_mainloop_run() failed.\n" +msgstr "pa_mainloop_run() falhou.\n" + +#: ../src/utils/pactl.c:135 +#, c-format +msgid "Failed to get statistics: %s" +msgstr "Falha ao obter estatísticas: %s" + +#: ../src/utils/pactl.c:141 +#, c-format +msgid "Currently in use: %u blocks containing %s bytes total.\n" +msgstr "Em uso no momento: %u blocos contendo %s bytes no total.\n" + +#: ../src/utils/pactl.c:144 +#, c-format +msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n" +msgstr "Alocado por todo o tempo: %u blocos contendo %s bytes no total.\n" + +#: ../src/utils/pactl.c:147 +#, c-format +msgid "Sample cache size: %s\n" +msgstr "Tamanho do cache para amostragem: %s\n" + +#: ../src/utils/pactl.c:156 +#, c-format +msgid "Failed to get server information: %s" +msgstr "Falha ao obter informações do servidor: %s" + +#: ../src/utils/pactl.c:164 +#, c-format +msgid "" +"User name: %s\n" +"Host Name: %s\n" +"Server Name: %s\n" +"Server Version: %s\n" +"Default Sample Specification: %s\n" +"Default Channel Map: %s\n" +"Default Sink: %s\n" +"Default Source: %s\n" +"Cookie: %08x\n" +msgstr "" +"Nome do usuário: %s\n" +"Nome da máquina: %s\n" +"Nome do servidor: %s\n" +"Versão do servidor: %s\n" +"Especificação padrão de amostragem: %s\n" +"Mapa de canais padrão: %s\n" +"Destino padrão: %s\n" +"Fonte padrão %s\n" +"Cookie: %08x\n" + +#: ../src/utils/pactl.c:205 +#, c-format +msgid "Failed to get sink information: %s" +msgstr "Falha ao obter informações do destino: %s" + +#: ../src/utils/pactl.c:221 +#, c-format +msgid "" +"Sink #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor Source: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Destino #%u\n" +"\tEstado: %s\n" +"\tNome: %s\n" +"\tDescrição: %s\n" +"\tDriver: %s\n" +"\tEspecificação da amostragem: %s\n" +"\tMapa dos canais: %s\n" +"\tMódulo proprietário: %u\n" +"\tMudo: %s\n" +"\tVolume: %s%s%s\n" +"\t balanço %0.2f\n" +"\tVolume base: %s%s%s\n" +"\tFonte de monitoração: %s\n" +"\tLatência: %0.0f usec, %0.0f usec configurado\n" +"\tSinalizadores: %s%s%s%s%s%s\n" +"\tPropriedades:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:268 +#: ../src/utils/pactl.c:360 +#, c-format +msgid "\tPorts:\n" +msgstr "\tPortas:\n" + +#: ../src/utils/pactl.c:274 +#: ../src/utils/pactl.c:366 +#, c-format +msgid "\tActive Port: %s\n" +msgstr "\tPorta ativa: %s\n" + +#: ../src/utils/pactl.c:297 +#, c-format +msgid "Failed to get source information: %s" +msgstr "Falha ao obter informações da fonte: %s" + +#: ../src/utils/pactl.c:313 +#, c-format +msgid "" +"Source #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor of Sink: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Fonte #%u\n" +"\tEstado: %s\n" +"\tNome: %s\n" +"\tDescrição: %s\n" +"\tDriver: %s\n" +"\tEspecificação da amostragem: %s\n" +"\tMapa dos canais: %s\n" +"\tMódulo proprietário: %u\n" +"\tMudo: %s\n" +"\tVolume: %s%s%s\n" +"\t balanço %0.2f\n" +"\tVolume base: %s%s%s\n" +"\tMonitor do destino: %s\n" +"\tLatência: %0.0f usec, %0.0f usec configurado\n" +"\tSinalizadores: %s%s%s%s%s%s\n" +"\tPropriedades:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:345 +#: ../src/utils/pactl.c:401 +#: ../src/utils/pactl.c:436 +#: ../src/utils/pactl.c:473 +#: ../src/utils/pactl.c:532 +#: ../src/utils/pactl.c:533 +#: ../src/utils/pactl.c:543 +#: ../src/utils/pactl.c:587 +#: ../src/utils/pactl.c:588 +#: ../src/utils/pactl.c:594 +#: ../src/utils/pactl.c:637 +#: ../src/utils/pactl.c:638 +#: ../src/utils/pactl.c:645 +msgid "n/a" +msgstr "n/a" + +#: ../src/utils/pactl.c:375 +#, c-format +msgid "Failed to get module information: %s" +msgstr "Falha ao obter informações do módulo: %s" + +#: ../src/utils/pactl.c:393 +#, c-format +msgid "" +"Module #%u\n" +"\tName: %s\n" +"\tArgument: %s\n" +"\tUsage counter: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Módulo #%u\n" +"\tNome: %s\n" +"\tArgumento: %s\n" +"\tContador de uso: %s\n" +"\tPropriedades:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:412 +#, c-format +msgid "Failed to get client information: %s" +msgstr "Falha ao obter informações do cliente: %s" + +#: ../src/utils/pactl.c:430 +#, c-format +msgid "" +"Client #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Cliente #%u\n" +"\tDriver: %s\n" +"\tMódulo proprietário: %s\n" +"\tPropriedades:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:447 +#, c-format +msgid "Failed to get card information: %s" +msgstr "Falha ao obter informações da placa: %s" + +#: ../src/utils/pactl.c:465 +#, c-format +msgid "" +"Card #%u\n" +"\tName: %s\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Placa #%u\n" +"\tNome: %s\n" +"\tDriver: %s\n" +"\tMódulo proprietário: %s\n" +"\tPropriedades:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:479 +#, c-format +msgid "\tProfiles:\n" +msgstr "\tPerfis:\n" + +#: ../src/utils/pactl.c:485 +#, c-format +msgid "\tActive Profile: %s\n" +msgstr "\tPerfil ativo: %s\n" + +#: ../src/utils/pactl.c:496 +#, c-format +msgid "Failed to get sink input information: %s" +msgstr "Falha ao obter informações da entrada do destino: %s" + +#: ../src/utils/pactl.c:515 +#, c-format +msgid "" +"Sink Input #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSink: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tMute: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSink Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Entrada do destino #%u\n" +"\tDriver: %s\n" +"\tMódulo proprietário: %s\n" +"\tCliente: %s\n" +"\tDestino: %u\n" +"\tEspecificação da amostragem: %s\n" +"\tMapa dos canais: %s\n" +"\tMudo: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balanço %0.2f\n" +"\tLatência do buffer: %0.0f usec\n" +"\tLatência do destino: %0.0f usec\n" +"\tMétodo de reamostragem: %s\n" +"\tPropriedades:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:554 +#, c-format +msgid "Failed to get source output information: %s" +msgstr "Falha ao obter informações da saída da fonte: %s" + +#: ../src/utils/pactl.c:574 +#, c-format +msgid "" +"Source Output #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSource: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSource Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Saída da fonte #%u\n" +"\tDriver: %s\n" +"\tMódulo proprietário: %s\n" +"\tCliente: %s\n" +"\tFonte: %u\n" +"\tEspecificação da amostragem: %s\n" +"\tMapa dos canais: %s\n" +"\tLatência do buffer: %0.0f usec\n" +"\tLatência da fonte: %0.0f usec\n" +"\tMétodo de reamostragem: %s\n" +"\tPropriedades:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:605 +#, c-format +msgid "Failed to get sample information: %s" +msgstr "Falha ao obter informações sobre a amostragem: %s" + +#: ../src/utils/pactl.c:623 +#, c-format +msgid "" +"Sample #%u\n" +"\tName: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tDuration: %0.1fs\n" +"\tSize: %s\n" +"\tLazy: %s\n" +"\tFilename: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Amostra #%u\n" +"\tNome: %s\n" +"\tEspecificação da amostragem: %s\n" +"\tMapa dos canais: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balanço %0.2f\n" +"\tDuração: %0.1fs\n" +"\tTamanho: %s\n" +"\tLazy: %s\n" +"\tNome do arquivo: %s\n" +"\tPropriedades:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:653 +#: ../src/utils/pactl.c:663 +#, c-format +msgid "Failure: %s" +msgstr "Falha: %s" + +#: ../src/utils/pactl.c:687 +#, c-format +msgid "Failed to upload sample: %s" +msgstr "Falha ao enviar a amostra: %s" + +#: ../src/utils/pactl.c:704 +msgid "Premature end of file" +msgstr "Fim prematuro do arquivo" + +#: ../src/utils/pactl.c:863 +msgid "Got SIGINT, exiting." +msgstr "SIGINT recebido, saindo." + +#: ../src/utils/pactl.c:869 +#, c-format +msgid "" +"%s [options] stat\n" +"%s [options] list\n" +"%s [options] exit\n" +"%s [options] upload-sample FILENAME [NAME]\n" +"%s [options] play-sample NAME [SINK]\n" +"%s [options] remove-sample NAME\n" +"%s [options] move-sink-input SINKINPUT SINK\n" +"%s [options] move-source-output SOURCEOUTPUT SOURCE\n" +"%s [options] load-module NAME [ARGS ...]\n" +"%s [options] unload-module MODULE\n" +"%s [options] suspend-sink SINK 1|0\n" +"%s [options] suspend-source SOURCE 1|0\n" +"%s [options] set-card-profile CARD PROFILE\n" +"%s [options] set-sink-port SINK PORT\n" +"%s [options] set-source-port SOURCE PORT\n" +"%s [options] set-sink-volume SINK VOLUME\n" +"%s [options] set-source-volume SOURCE VOLUME\n" +"%s [options] set-sink-input-volume SINKINPUT VOLUME\n" +"%s [options] set-sink-mute SINK 1|0\n" +"%s [options] set-source-mute SOURCE 1|0\n" +"%s [options] set-sink-input-mute SINKINPUT 1|0\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -s, --server=SERVER The name of the server to connect to\n" +" -n, --client-name=NAME How to call this client on the server\n" +msgstr "" +"%s [opções] stat\n" +"%s [opções] list\n" +"%s [opções] exit\n" +"%s [opções] upload-sample NOME_DO_ARQUIVO [NOME]\n" +"%s [opções] play-sample NOME [DESTINO]\n" +"%s [opções] remove-sample NOME\n" +"%s [opções] move-sink-input ENTRADA DESTINO\n" +"%s [opções] move-source-output SAÍDA FONTE\n" +"%s [opções] load-module NOME [ARGS ...]\n" +"%s [opções] unload-module MÓDULO\n" +"%s [opções] suspend-sink [DESTINO] 1|0\n" +"%s [opções] suspend-source [FONTE] 1|0\n" +"%s [opções] set-card-profile [PLACA] [PERFIL]\n" +"%s [opções] set-sink-port [DESTINO] [PORTA]\n" +"%s [opções] set-source-port [FONTE] [PORTA]\n" +"%s [opções] set-sink-volume DESTINO VOLUME\n" +"%s [opções] set-source-volume FONTE VOLUME\n" +"%s [opções] set-sink-input-volume ENTRADA VOLUME\n" +"%s [opções] set-sink-mute DESTINO 1|0\n" +"%s [opções] set-source-mute FONTE 1|0\n" +"%s [opções] set-sink-input-mute ENTRADA 1|0\n" +"\n" +" -h, --help Mostra essa ajuda\n" +" --version Mostra a versão\n" +"\n" +" -s, --server=SERVIDOR O nome do servidor a ser conectado\n" +" -n, --client-name=NOME Como chamar este cliente no servidor \n" + +#: ../src/utils/pactl.c:933 +#, c-format +msgid "" +"pactl %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pactl %s\n" +"Compilado com libpulse %s\n" +"Linkado com libpulse %s\n" + +#: ../src/utils/pactl.c:979 +msgid "Please specify a sample file to load" +msgstr "Por favor, especifique um arquivo de amostra a ser carregado" + +#: ../src/utils/pactl.c:992 +msgid "Failed to open sound file." +msgstr "Falha ao abrir o arquivo de som." + +#: ../src/utils/pactl.c:1004 +msgid "Warning: Failed to determine sample specification from file." +msgstr "Aviso: falha ao determinar a especificação da amostragem a partir do arquivo." + +#: ../src/utils/pactl.c:1014 +msgid "You have to specify a sample name to play" +msgstr "Você deve especificar um nome para amostra a ser reproduzida" + +#: ../src/utils/pactl.c:1026 +msgid "You have to specify a sample name to remove" +msgstr "Você deve especificar um nome para a amostra a ser removida" + +#: ../src/utils/pactl.c:1035 +msgid "You have to specify a sink input index and a sink" +msgstr "Você deve especificar a entrada do destino e um destino" + +#: ../src/utils/pactl.c:1045 +msgid "You have to specify a source output index and a source" +msgstr "Você deve especificar um índice de saída da fonte e uma fonte" + +#: ../src/utils/pactl.c:1060 +msgid "You have to specify a module name and arguments." +msgstr "Você deve especificar um nome para o módulo e seus argumentos." + +#: ../src/utils/pactl.c:1080 +msgid "You have to specify a module index" +msgstr "Você deve especificar um índice do módulo" + +#: ../src/utils/pactl.c:1090 +msgid "You may not specify more than one sink. You have to specify a boolean value." +msgstr "Você não pode especificar mais de um destino. Você deve especificar um valor booleano." + +#: ../src/utils/pactl.c:1103 +msgid "You may not specify more than one source. You have to specify a boolean value." +msgstr "Você não pode especificar mais de uma fonte. Você deve especificar um valor booleano." + +#: ../src/utils/pactl.c:1115 +msgid "You have to specify a card name/index and a profile name" +msgstr "Você deve especificar um nome/índice para a placa e um nome de perfil" + +#: ../src/utils/pactl.c:1126 +msgid "You have to specify a sink name/index and a port name" +msgstr "Você deve especificar um nome/índice do destino e o nome da porta" + +#: ../src/utils/pactl.c:1137 +msgid "You have to specify a source name/index and a port name" +msgstr "Você deve especificar um nome/índice da fonte e o nome da porta" + +#: ../src/utils/pactl.c:1149 +msgid "You have to specify a sink name/index and a volume" +msgstr "Você deve especificar um nome/índice do destino e um volume" + +#: ../src/utils/pactl.c:1154 +#: ../src/utils/pactl.c:1171 +#: ../src/utils/pactl.c:1193 +#: ../src/utils/pactl.c:1209 +#: ../src/utils/pactl.c:1226 +#: ../src/utils/pactl.c:1248 +msgid "Invalid volume specification" +msgstr "Especificação de volume inválida" + +#: ../src/utils/pactl.c:1166 +msgid "You have to specify a source name/index and a volume" +msgstr "Você deve especificar um nome/índice da fonte e um volume" + +#: ../src/utils/pactl.c:1183 +msgid "You have to specify a sink input index and a volume" +msgstr "Você deve especificar um índice de entrada para o destino e um volume" + +#: ../src/utils/pactl.c:1188 +msgid "Invalid sink input index" +msgstr "Índice de entrada de destino inválido" + +#: ../src/utils/pactl.c:1204 +msgid "You have to specify a sink name/index and a mute boolean" +msgstr "Você deve especificar um nome/índice do destino e um booleano do mudo" + +#: ../src/utils/pactl.c:1221 +msgid "You have to specify a source name/index and a mute boolean" +msgstr "Você deve especificar um nome/índice da fonte e um booleano do mudo" + +#: ../src/utils/pactl.c:1238 +msgid "You have to specify a sink input index and a mute boolean" +msgstr "Você deve especificar um índice de entrada para o destino e um booleano do mudo" + +#: ../src/utils/pactl.c:1243 +msgid "Invalid sink input index specification" +msgstr "Especificação do índice de entrada de destino inválida" + +#: ../src/utils/pactl.c:1262 +msgid "No valid command specified." +msgstr "Nenhum comando válido especificado." + +#: ../src/utils/pax11publish.c:61 +#, c-format +msgid "" +"%s [-D display] [-S server] [-O sink] [-I source] [-c file] [-d|-e|-i|-r]\n" +"\n" +" -d Show current PulseAudio data attached to X11 display (default)\n" +" -e Export local PulseAudio data to X11 display\n" +" -i Import PulseAudio data from X11 display to local environment variables and cookie file.\n" +" -r Remove PulseAudio data from X11 display\n" +msgstr "" +"%s [-D display] [-S server] [-O sink] [-I source] [-c file] [-d|-e|-i|-r]\n" +"\n" +" -d Mostra os dados atuais do PulseAudio associados ao display X11 (padrão)\n" +" -e Exporta os dados locais do PulseAudio para um display X11 \n" +" -i Importa os dados do PulseAudio de um display X11 para as variáveis de ambiente locais e para o arquivo de cookie.\n" +" -r Remove os dados do PulseAudio do display X11\n" + +#: ../src/utils/pax11publish.c:94 +#, c-format +msgid "Failed to parse command line.\n" +msgstr "Falha em interpretar a linha de comando.\n" + +#: ../src/utils/pax11publish.c:108 +#, c-format +msgid "Server: %s\n" +msgstr "Servidor: %s\n" + +#: ../src/utils/pax11publish.c:110 +#, c-format +msgid "Source: %s\n" +msgstr "Fonte: %s\n" + +#: ../src/utils/pax11publish.c:112 +#, c-format +msgid "Sink: %s\n" +msgstr "Destino: %s\n" + +#: ../src/utils/pax11publish.c:114 +#, c-format +msgid "Cookie: %s\n" +msgstr "Cookie: %s\n" + +#: ../src/utils/pax11publish.c:132 +#, c-format +msgid "Failed to parse cookie data\n" +msgstr "Falha ao analisar os dados do cookie\n" + +#: ../src/utils/pax11publish.c:137 +#, c-format +msgid "Failed to save cookie data\n" +msgstr "Falha em salvar os dados do cookie\n" + +#: ../src/utils/pax11publish.c:152 +#, c-format +msgid "Failed to load client configuration file.\n" +msgstr "Falha em carregar o arquivo de configuração do cliente.\n" + +#: ../src/utils/pax11publish.c:157 +#, c-format +msgid "Failed to read environment configuration data.\n" +msgstr "Falha em ler os dados de configuração do ambiente\n" + +#: ../src/utils/pax11publish.c:174 +#, c-format +msgid "Failed to get FQDN.\n" +msgstr "Falha na obtenção do FQDN.\n" + +#: ../src/utils/pax11publish.c:194 +#, c-format +msgid "Failed to load cookie data\n" +msgstr "Falha em carregar os dados do cookie\n" + +#: ../src/utils/pax11publish.c:211 +#, c-format +msgid "Not yet implemented.\n" +msgstr "Ainda não implementado.\n" + +#: ../src/utils/pacmd.c:69 +msgid "No PulseAudio daemon running, or not running as session daemon." +msgstr "Nenhum daemon do PulseAudio em execução ou não está em execução como daemon de sessão." + +#: ../src/utils/pacmd.c:74 +#, c-format +msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s" +msgstr "socket(PF_UNIX, SOCK_STREAM, 0): %s" + +#: ../src/utils/pacmd.c:91 +#, c-format +msgid "connect(): %s" +msgstr "connect(): %s" + +#: ../src/utils/pacmd.c:99 +msgid "Failed to kill PulseAudio daemon." +msgstr "Falha ao matar o daemon do PulseAudio." + +#: ../src/utils/pacmd.c:107 +msgid "Daemon not responding." +msgstr "O daemon não responde." + +#: ../src/utils/pacmd.c:161 +#, c-format +msgid "poll(): %s" +msgstr "poll(): %s" + +#: ../src/utils/pacmd.c:171 +#: ../src/utils/pacmd.c:188 +#, c-format +msgid "read(): %s" +msgstr "read(): %s" + +#: ../src/utils/pacmd.c:207 +#: ../src/utils/pacmd.c:223 +#, c-format +msgid "write(): %s" +msgstr "write(): %s" + +#: ../src/pulsecore/lock-autospawn.c:136 +#: ../src/pulsecore/lock-autospawn.c:219 +msgid "Cannot access autospawn lock." +msgstr "Não foi possível acessar a trava de autogeração." + +#: ../src/modules/alsa/alsa-sink.c:530 +#: ../src/modules/alsa/alsa-sink.c:689 +#, c-format +msgid "" +"ALSA woke us up to write new data to the device, but there was actually nothing to write!\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.\n" +"We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() returned 0 or another value < min_avail." +msgstr "" +"O ALSA nos acordou para gravar novos dados no dispositivo, mas não há nada a ser gravado!\n" +"É mais provável que isso seja um erro no driver \"%s\" do ALSA. Por favor, relate esse problema para os desenvolvedores do ALSA.\n" +"Nós fomos acordados com o conjunto POLLOUT -- entretanto, a snd_pcm_avail() subseqüente retornou 0 ou outro valor < min_avail." + +#: ../src/modules/alsa/alsa-source.c:506 +#: ../src/modules/alsa/alsa-source.c:656 +#, c-format +msgid "" +"ALSA woke us up to read new data from the device, but there was actually nothing to read!\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.\n" +"We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() returned 0 or another value < min_avail." +msgstr "" +"O ALSA nos acordou para ler novos dados no dispositivo, mas não há nada a ser lido!\n" +"É mais provável que isso seja um erro no driver \"%s\" do ALSA. Por favor, relate esse problema para os desenvolvedores do ALSA.\n" +"Nós fomos acordados com o conjunto POLLIN -- entretanto, a snd_pcm_avail() subseqüente retornou 0 ou outro valor < min_avail." + +#: ../src/modules/alsa/module-alsa-card.c:152 +#: ../src/modules/bluetooth/module-bluetooth-device.c:2228 +#: ../src/modules/alsa/alsa-mixer.c:2931 +msgid "Off" +msgstr "Desligado" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2184 +msgid "High Fidelity Playback (A2DP)" +msgstr "Reprodução de alta fidelidade (A2DP)" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2198 +msgid "High Fidelity Capture (A2DP)" +msgstr "Captura de alta fidelidade (A2DP)" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2213 +msgid "Telephony Duplex (HSP/HFP)" +msgstr "Duplex telefônico (HSP/HFP)" + +#: ../src/modules/reserve-wrap.c:151 +msgid "PulseAudio Sound Server" +msgstr "Servidor de som PulseAudio" + +#: ../src/modules/module-rygel-media-server.c:569 +#: ../src/modules/module-rygel-media-server.c:583 +msgid "Output Devices" +msgstr "Dispositivos de saída" + +#: ../src/modules/module-rygel-media-server.c:570 +#: ../src/modules/module-rygel-media-server.c:584 +msgid "Input Devices" +msgstr "Dispositivos de entrada" + +#: ../src/modules/module-rygel-media-server.c:774 +msgid "Audio on @HOSTNAME@" +msgstr "Áudio em @HOSTNAME@" + +#: ../src/modules/alsa/alsa-mixer.c:1701 +msgid "Input" +msgstr "Entrada" + +#: ../src/modules/alsa/alsa-mixer.c:1702 +msgid "Docking Station Input" +msgstr "Entrada da base de encaixe" + +#: ../src/modules/alsa/alsa-mixer.c:1703 +msgid "Docking Station Microphone" +msgstr "Microfone da base de encaixe" + +#: ../src/modules/alsa/alsa-mixer.c:1704 +msgid "Line-In" +msgstr "Entrada de linha" + +#: ../src/modules/alsa/alsa-mixer.c:1705 +msgid "Microphone" +msgstr "Microfone" + +#: ../src/modules/alsa/alsa-mixer.c:1706 +msgid "External Microphone" +msgstr "Microfone externo" + +#: ../src/modules/alsa/alsa-mixer.c:1707 +msgid "Internal Microphone" +msgstr "Microfone interno" + +#: ../src/modules/alsa/alsa-mixer.c:1708 +msgid "Radio" +msgstr "Rádio" + +#: ../src/modules/alsa/alsa-mixer.c:1709 +msgid "Video" +msgstr "Vídeo" + +#: ../src/modules/alsa/alsa-mixer.c:1710 +msgid "Automatic Gain Control" +msgstr "Ganho de controle automático" + +#: ../src/modules/alsa/alsa-mixer.c:1711 +msgid "No Automatic Gain Control" +msgstr "Sem ganho de controle automático" + +#: ../src/modules/alsa/alsa-mixer.c:1712 +msgid "Boost" +msgstr "Impulso" + +#: ../src/modules/alsa/alsa-mixer.c:1713 +msgid "No Boost" +msgstr "Sem impulso" + +#: ../src/modules/alsa/alsa-mixer.c:1714 +msgid "Amplifier" +msgstr "Amplificador" + +#: ../src/modules/alsa/alsa-mixer.c:1715 +msgid "No Amplifier" +msgstr "Sem amplificador" + +#: ../src/modules/alsa/alsa-mixer.c:1773 +msgid "Analog Input" +msgstr "Entrada analógica" + +#: ../src/modules/alsa/alsa-mixer.c:1774 +msgid "Analog Microphone" +msgstr "Microfone analógico" + +#: ../src/modules/alsa/alsa-mixer.c:1775 +msgid "Analog Line-In" +msgstr "Entrada de linha analógica" + +#: ../src/modules/alsa/alsa-mixer.c:1776 +msgid "Analog Radio" +msgstr "Rádio analógico" + +#: ../src/modules/alsa/alsa-mixer.c:1777 +msgid "Analog Video" +msgstr "Vídeo analógico" + +#: ../src/modules/alsa/alsa-mixer.c:1778 +msgid "Analog Output" +msgstr "Saída analógica" + +#: ../src/modules/alsa/alsa-mixer.c:1779 +msgid "Analog Headphones" +msgstr "Fones de ouvido analógico" + +#: ../src/modules/alsa/alsa-mixer.c:1780 +msgid "Analog Output (LFE)" +msgstr "Saída analógica (LFE)" + +#: ../src/modules/alsa/alsa-mixer.c:1781 +msgid "Analog Mono Output" +msgstr "Saída analógica monofônica" + +#: ../src/modules/alsa/alsa-mixer.c:1981 +#, c-format +msgid "%s+%s" +msgstr "%s+%s" + +#: ../src/modules/alsa/alsa-mixer.c:1984 +#: ../src/modules/alsa/alsa-mixer.c:3404 +#, c-format +msgid "%s / %s" +msgstr "%s / %s" + +#: ../src/modules/alsa/alsa-mixer.c:2790 +msgid "Analog Mono" +msgstr "Monofônico analógico" + +#: ../src/modules/alsa/alsa-mixer.c:2791 +msgid "Analog Stereo" +msgstr "Estéreo analógico" + +#: ../src/modules/alsa/alsa-mixer.c:2792 +msgid "Analog Surround 2.1" +msgstr "Surround analógico 2.1" + +#: ../src/modules/alsa/alsa-mixer.c:2793 +msgid "Analog Surround 3.0" +msgstr "Surround analógico 3.0" + +#: ../src/modules/alsa/alsa-mixer.c:2794 +msgid "Analog Surround 3.1" +msgstr "Surround analógico 3.1" + +#: ../src/modules/alsa/alsa-mixer.c:2795 +msgid "Analog Surround 4.0" +msgstr "Surround analógico 4.0" + +#: ../src/modules/alsa/alsa-mixer.c:2796 +msgid "Analog Surround 4.1" +msgstr "Surround analógico 4.1" + +#: ../src/modules/alsa/alsa-mixer.c:2797 +msgid "Analog Surround 5.0" +msgstr "Surround analógico 5.0" + +#: ../src/modules/alsa/alsa-mixer.c:2798 +msgid "Analog Surround 5.1" +msgstr "Surround analógico 5.1" + +#: ../src/modules/alsa/alsa-mixer.c:2799 +msgid "Analog Surround 6.0" +msgstr "Surround analógico 6.0" + +#: ../src/modules/alsa/alsa-mixer.c:2800 +msgid "Analog Surround 6.1" +msgstr "Surround analógico 6.1" + +#: ../src/modules/alsa/alsa-mixer.c:2801 +msgid "Analog Surround 7.0" +msgstr "Surround analógico 7.0" + +#: ../src/modules/alsa/alsa-mixer.c:2802 +msgid "Analog Surround 7.1" +msgstr "Surround analógico 7.1" + +#: ../src/modules/alsa/alsa-mixer.c:2803 +msgid "Digital Stereo (IEC958)" +msgstr "Estéreo digital (IEC958)" + +#: ../src/modules/alsa/alsa-mixer.c:2804 +msgid "Digital Surround 4.0 (IEC958)" +msgstr "Surround 4.0 digital (IEC958)" + +#: ../src/modules/alsa/alsa-mixer.c:2805 +msgid "Digital Surround 4.0 (IEC958/AC3)" +msgstr "Surround digital 4.0 (IEC958/AC3)" + +#: ../src/modules/alsa/alsa-mixer.c:2806 +msgid "Digital Surround 5.1 (IEC958/AC3)" +msgstr "Surround digital 5.1 (IEC958/AC3)" + +#: ../src/modules/alsa/alsa-mixer.c:2807 +msgid "Digital Stereo (HDMI)" +msgstr "Estéreo digital (HDMI)" + +#: ../src/modules/alsa/alsa-mixer.c:2928 +msgid "Analog Mono Duplex" +msgstr "Duplex monofônico analógico" + +#: ../src/modules/alsa/alsa-mixer.c:2929 +msgid "Analog Stereo Duplex" +msgstr "Duplex estéreo analógico" + +#: ../src/modules/alsa/alsa-mixer.c:2930 +msgid "Digital Stereo Duplex (IEC958)" +msgstr "Duplex estéreo digital (IEC958)" + +#~ msgid "Invalid client name '%s'\n" +#~ msgstr "Nome do cliente \"%s\" inválido\n" +#~ msgid "Failed to determine sample specification from file.\n" +#~ msgstr "" +#~ "Falha ao determinar a especificação de amostragem a partir do arquivo.\n" +#~ msgid "select(): %s" +#~ msgstr "select(): %s" +#~ msgid "Cannot connect to system bus: %s" +#~ msgstr "Não foi possível conectar com o barramento do sistema: %s" +#~ msgid "Cannot get caller from PID: %s" +#~ msgstr "Não foi possível obter quem chamou pelo PID: %s" +#~ msgid "Cannot set UID on caller object." +#~ msgstr "Não foi possível definir o UID sobre o objeto que chamou." +#~ msgid "Failed to get CK session." +#~ msgstr "Falha em obter a sessão CK." +#~ msgid "Cannot set UID on session object." +#~ msgstr "Não foi possível definir o UID do objeto da sessão." +#~ msgid "Cannot allocate PolKitAction." +#~ msgstr "Não foi possível alocar o PolKitAction." +#~ msgid "Cannot set action_id" +#~ msgstr "Não foi possível definir a action_id" +#~ msgid "Cannot allocate PolKitContext." +#~ msgstr "Não foi possível alocar o PolKitContext." +#~ msgid "Cannot initialize PolKitContext: %s" +#~ msgstr "Não foi possível iniciar o PolKitContext: %s" +#~ msgid "Could not determine whether caller is authorized: %s" +#~ msgstr "Não foi possível determinar se o solicitante está autorizado: %s" +#~ msgid "Cannot obtain auth: %s" +#~ msgstr "Não foi possível obter auth: %s" +#~ msgid "PolicyKit responded with '%s'" +#~ msgstr "PolicyKit respondeu com '%s'" +#~ msgid "" +#~ "High-priority scheduling (negative Unix nice level) for the PulseAudio " +#~ "daemon" +#~ msgstr "" +#~ "Escalonamento de alta prioridade (nível de nice Unix negativo) para o " +#~ "daemon do PulseAudio" +#~ msgid "Real-time scheduling for the PulseAudio daemon" +#~ msgstr "Escalonamento em tempo real para o daemon do PulseAudio" +#~ msgid "" +#~ "System policy prevents PulseAudio from acquiring high-priority scheduling." +#~ msgstr "" +#~ "Uma política do sistema impede que o PulseAudio adquira escalonamento de " +#~ "alta prioridade." +#~ msgid "" +#~ "System policy prevents PulseAudio from acquiring real-time scheduling." +#~ msgstr "" +#~ "Uma política do sistema impede que o PulseAudio adquira o escalonamento " +#~ "em tempo real." +#~ msgid "read() failed: %s\n" +#~ msgstr "read() falhou: %s\n" +#~ msgid "pa_context_connect() failed: %s\n" +#~ msgstr "pa_context_connect() falhou: %s\n" +#~ msgid "We're in the group '%s', allowing high-priority scheduling." +#~ msgstr "Estamos no grupo '%s', permitindo escalonamento de alta prioridade." +#~ msgid "We're in the group '%s', allowing real-time scheduling." +#~ msgstr "Estamos no grupo '%s', permitindo escalonamento em tempo real." +#~ msgid "PolicyKit grants us acquire-high-priority privilege." +#~ msgstr "" +#~ "O PolicyKit assegura-nos a aquisição de privilégio de alta prioridade." +#~ msgid "PolicyKit refuses acquire-high-priority privilege." +#~ msgstr "O PolicyKit recusa a aquisição de privilégios de alta prioridade." +#~ msgid "PolicyKit grants us acquire-real-time privilege." +#~ msgstr "O PolicyKit assegura-nos a aquisição de privilégios de tempo-real." +#~ msgid "PolicyKit refuses acquire-real-time privilege." +#~ msgstr "O PolicyKit recusa a aquisição de privilégios de tempo real." +#~ msgid "" +#~ "High-priority scheduling enabled in configuration but not allowed by " +#~ "policy." +#~ msgstr "" +#~ "O escalonamento de alta prioridade foi habilitado para esta configuração, " +#~ "mas não é permitida pela política." +#~ msgid "Successfully increased RLIMIT_RTPRIO" +#~ msgstr "RLIMIT_RTPRIO aumentado com sucesso" +#~ msgid "RLIMIT_RTPRIO failed: %s" +#~ msgstr "RLIMIT_RTPRIO falhou: %s" +#~ msgid "Giving up CAP_NICE" +#~ msgstr "Abandonando CAP_NICE" +#~ msgid "" +#~ "Real-time scheduling enabled in configuration but not allowed by policy." +#~ msgstr "" +#~ "O escalonamento de tempo real foi habilitado pela configuração, mas não é " +#~ "permitido pela política." +#~ msgid "Limited capabilities successfully to CAP_SYS_NICE." +#~ msgstr "As capacidades foram limitadas com sucesso para CAP_SYS_NICE." +#~ msgid "time_new() failed.\n" +#~ msgstr "time_new() falhou.\n" +#~ msgid "Stream successfully created\n" +#~ msgstr "Fluxo criado com sucesso\n" +#~ msgid "Stream errror: %s\n" +#~ msgstr "Erro de fluxo: %s\n" +#~ msgid "Connection established.\n" +#~ msgstr "Conexão estabelecida.\n" +#~ msgid "" +#~ "%s [options] [FILE]\n" +#~ "\n" +#~ " -h, --help Show this help\n" +#~ " --version Show version\n" +#~ "\n" +#~ " -v, --verbose Enable verbose operation\n" +#~ "\n" +#~ " -s, --server=SERVER The name of the server to connect " +#~ "to\n" +#~ " -d, --device=DEVICE The name of the sink to connect " +#~ "to\n" +#~ " -n, --client-name=NAME How to call this client on the " +#~ "server\n" +#~ " --stream-name=NAME How to call this stream on the " +#~ "server\n" +#~ " --volume=VOLUME Specify the initial (linear) " +#~ "volume in range 0...65536\n" +#~ " --channel-map=CHANNELMAP Set the channel map to the use\n" +#~ msgstr "" +#~ "%s [options] [FILE]\n" +#~ "\n" +#~ " -h, --help Mostra essa ajuda\n" +#~ " --version Mostra a versão\n" +#~ "\n" +#~ " -v, --verbose Habilida a operação detalhada\n" +#~ "\n" +#~ " -s, --server=SERVER O nome do servidor a ser " +#~ "conectado\n" +#~ " -d, --device=DEVICE O nome do destino a ser " +#~ "conectado\n" +#~ " -n, --client-name=NAME Como chamar este cliente no " +#~ "servidor\n" +#~ " --stream-name=NAME Como chamar este fluxo no " +#~ "servidor\n" +#~ " --volume=VOLUME Especifica o volume inicial " +#~ "(linear) no intervalo 0...65536\n" +#~ " --channel-map=CHANNELMAP Define o mapa do canal para uso\n" +#~ msgid "" +#~ "paplay %s\n" +#~ "Compiled with libpulse %s\n" +#~ "Linked with libpulse %s\n" +#~ msgstr "" +#~ "paplay %s\n" +#~ "Compilado com libpulse %s\n" +#~ "Linkado com libpulse %s\n" +#~ msgid "Invalid channel map\n" +#~ msgstr "Mapa de canais inválido\n" +#~ msgid "Failed to open file '%s'\n" +#~ msgstr "Falha ao abrir o arquivo '%s'\n" +#~ msgid "Channel map doesn't match file.\n" +#~ msgstr "O mapa dos canais não coincide com o arquivo.\n" +#~ msgid "Using sample spec '%s'\n" +#~ msgstr "Usando a especificação da amostragem '%s'\n" + +#, fuzzy +#~ msgid "" +#~ "Called SUID root and real-time and/or high-priority scheduling was " +#~ "requested in the configuration. However, we lack the necessary " +#~ "privileges:\n" +#~ "We are not in group '" +#~ msgstr "" +#~ "A chamada de SUID root e tempo real/alta prioridade no escalonamento foi " +#~ "requisitada pela configuração. Todavia, falta-nos os privilégios " +#~ "necessários:\n" +#~ "Não estamos no grupo'" + +#, fuzzy +#~ msgid "--log-time boolean argument" +#~ msgstr "--disallow-exit argumento booleano" +#~ msgid "Default sink name (%s) does not exist in name register." +#~ msgstr "O nome padrão do destino (%s) não existe no registro de nomes." +#~ msgid "Buffer overrun, dropping incoming data\n" +#~ msgstr "Houve estouro de buffer, os dados que chegaram foram descartados\n" +#~ msgid "pa_stream_drop() failed: %s\n" +#~ msgstr "pa_stream_drop() falhou: %s\n" +#~ msgid "muted" +#~ msgstr "mudo" +#~ msgid "" +#~ "*** Autoload Entry #%u ***\n" +#~ "Name: %s\n" +#~ "Type: %s\n" +#~ "Module: %s\n" +#~ "Argument: %s\n" +#~ msgstr "" +#~ "*** Entrada do Autoload #%u ***\n" +#~ "Nome: %s\n" +#~ "Tipo: %s\n" +#~ "Módulo: %s\n" +#~ "Argumento: %s\n" +#~ msgid "sink" +#~ msgstr "destino" +#~ msgid "source" +#~ msgstr "fonte" +#~ msgid "" +#~ "' and PolicyKit refuse to grant us priviliges. Dropping SUID again.\n" +#~ "For enabling real-time scheduling please acquire the appropriate " +#~ "PolicyKit priviliges, or become a member of '" +#~ msgstr "" +#~ "' e o PolicyKit recusa-nos a garantia de privilégios. Retirando o SUID " +#~ "outra vez.\n" +#~ " Para habilitar o escalonamento em tempo real, por favo, adquira os " +#~ "privilégios adequados pelo PolicyKit, ou torne-se membro do'" +#~ msgid "" +#~ "', or increase the RLIMIT_NICE/RLIMIT_RTPRIO resource limits for this " +#~ "user." +#~ msgstr "" +#~ "', ou eleve o RLIMIT_NICE/RLIMIT_RTPRIO dos limites do recurso para este " +#~ "usuário." +#~ msgid "socketpair(): %s" +#~ msgstr "socketpair(): %s" + diff --git a/po/sr.po b/po/sr.po new file mode 100644 index 0000000..820b14d --- /dev/null +++ b/po/sr.po @@ -0,0 +1,2579 @@ +# Serbian translations for pulseaudio +# Copyright (C) 2006 Lennart Poettering +# This file is distributed under the same license as the pulseaudio package. +# Igor Miletic (Игор Милетић) , 2009. +# Miloš Komarčević , 2009. +# +msgid "" +msgstr "" +"Project-Id-Version: pulseaudio\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-10-30 10:22+0000\n" +"PO-Revision-Date: 2009-10-30 22:51+0100\n" +"Last-Translator: Miloš Komarčević \n" +"Language-Team: Serbian (sr) \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" +"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" + +#: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629 +#, c-format +msgid "%s %s" +msgstr "%s %s" + +#: ../src/modules/alsa/alsa-util.c:1106 +#, c-format +msgid "" +"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu " +"ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_avail() је вратио вредност која је необично велика: %lu бајтова (%lu " +"ms).\n" +"Ово је највероватније грешка у „%s“ ALSA управљачком програму. Пријавите " +"овај проблем ALSA програмерима." + +#: ../src/modules/alsa/alsa-util.c:1147 +#, c-format +msgid "" +"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%" +"lu ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_delay() је вратио вредност која је необично велика: %li бајтова (%s%" +"lu ms).\n" +"Ово је највероватније грешка у „%s“ ALSA управљачком програму. Пријавите " +"овај проблем ALSA програмерима." + +#: ../src/modules/alsa/alsa-util.c:1194 +#, c-format +msgid "" +"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes " +"(%lu ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_mmap_begin() је вратио вредност која је необично велика: %lu " +"бајтова (%lu ms).\n" +"Ово је највероватније грешка у „%s“ ALSA управљачком програму. Пријавите " +"овај проблем ALSA програмерима." + +#: ../src/modules/module-always-sink.c:39 +msgid "Always keeps at least one sink loaded even if it's a null one" +msgstr "Увек одржава барем један сливник оптерећеним чак и када је празан" + +#: ../src/modules/module-always-sink.c:83 +msgid "Dummy Output" +msgstr "Лажан излаз" + +#: ../src/modules/module-ladspa-sink.c:49 +msgid "Virtual LADSPA sink" +msgstr "Виртуелни LADSPA сливник" + +#: ../src/modules/module-ladspa-sink.c:53 +msgid "" +"sink_name= sink_properties= " +"master= format= rate= " +"channels= channel_map= plugin= label= control=" +msgstr "" +"sink_name=<име сливника> sink_properties=<својства сливника> master=<име " +"сливника за филтрирање> format=<формат узорка> rate=<учестаност " +"дискретизације> channels=<број канала> channel_map=<мапа канала> plugin=<име " +"ladspa додатка> label=<ознака ladspa додатка> control=<списак улазних " +"контролних вредности раздвојених зарезом>" + +#: ../src/modules/module-null-sink.c:55 +msgid "Clocked NULL sink" +msgstr "Узорак NULL сливника" + +#: ../src/modules/module-null-sink.c:291 +msgid "Null Output" +msgstr "Празан излаз" + +#: ../src/pulsecore/sink.c:2613 +msgid "Internal Audio" +msgstr "Унутрашњи звук" + +#: ../src/pulsecore/sink.c:2618 +msgid "Modem" +msgstr "Модем" + +#: ../src/daemon/ltdl-bind-now.c:124 +msgid "Failed to find original lt_dlopen loader." +msgstr "Неуспешна претрага за оригиналним lt_dlopen учитавачем." + +#: ../src/daemon/ltdl-bind-now.c:129 +msgid "Failed to allocate new dl loader." +msgstr "Неуспешно смештање новог dl учитавача." + +#: ../src/daemon/ltdl-bind-now.c:142 +msgid "Failed to add bind-now-loader." +msgstr "Неуспешно додавање „повежи одмах“ учитавача." + +#: ../src/daemon/main.c:141 +#, c-format +msgid "Got signal %s." +msgstr "Добих сигнал %s." + +#: ../src/daemon/main.c:168 +msgid "Exiting." +msgstr "Напуштам." + +#: ../src/daemon/main.c:186 +#, c-format +msgid "Failed to find user '%s'." +msgstr "Не могу наћи корисника „%s“." + +#: ../src/daemon/main.c:191 +#, c-format +msgid "Failed to find group '%s'." +msgstr "Не могу наћи групу „%s“." + +#: ../src/daemon/main.c:195 +#, c-format +msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)." +msgstr "Нађени су корисник „%s“ (UID %lu) и група „%s“ (GID %lu)." + +#: ../src/daemon/main.c:200 +#, c-format +msgid "GID of user '%s' and of group '%s' don't match." +msgstr "GID корисника „%s“ се не поклапа са групом „%s“." + +#: ../src/daemon/main.c:205 +#, c-format +msgid "Home directory of user '%s' is not '%s', ignoring." +msgstr "Лични директоријум корисника „%s“ није „%s“, занемарујем." + +#: ../src/daemon/main.c:208 ../src/daemon/main.c:213 +#, c-format +msgid "Failed to create '%s': %s" +msgstr "Неуспешно прављење „%s“: %s" + +#: ../src/daemon/main.c:220 +#, c-format +msgid "Failed to change group list: %s" +msgstr "Неуспешна промена групног списка: %s" + +#: ../src/daemon/main.c:236 +#, c-format +msgid "Failed to change GID: %s" +msgstr "Неуспешна промена GID-а: %s" + +#: ../src/daemon/main.c:252 +#, c-format +msgid "Failed to change UID: %s" +msgstr "Неуспешна промена UID-а: %s" + +#: ../src/daemon/main.c:271 +msgid "Successfully dropped root privileges." +msgstr "Успешно одбачена root овлашћења." + +#: ../src/daemon/main.c:279 +msgid "System wide mode unsupported on this platform." +msgstr "Режим за читав систем није подржан на овој платформи." + +#: ../src/daemon/main.c:297 +#, c-format +msgid "setrlimit(%s, (%u, %u)) failed: %s" +msgstr "setrlimit(%s, (%u, %u)) није успело: %s" + +#: ../src/daemon/main.c:474 +msgid "Failed to parse command line." +msgstr "Неуспешно тумачење командне линије." + +#: ../src/daemon/main.c:541 +msgid "Daemon not running" +msgstr "Демон није покренут" + +#: ../src/daemon/main.c:543 +#, c-format +msgid "Daemon running as PID %u" +msgstr "Демон је покренут са PID-ом %u" + +#: ../src/daemon/main.c:553 +#, c-format +msgid "Failed to kill daemon: %s" +msgstr "Неуспешно убијање демона: %s" + +#: ../src/daemon/main.c:571 +msgid "" +"This program is not intended to be run as root (unless --system is " +"specified)." +msgstr "" +"Није намеравано да се овај програм покреће из root налога (осим у случају " +"када је --system наведено)" + +#: ../src/daemon/main.c:573 +msgid "Root privileges required." +msgstr "Потребна су root овлашћења." + +#: ../src/daemon/main.c:578 +msgid "--start not supported for system instances." +msgstr "--start није подржано за системске примерке." + +#: ../src/daemon/main.c:583 +msgid "Running in system mode, but --disallow-exit not set!" +msgstr "Покренуто у системском режиму, али --disallow-exit није постављено!" + +#: ../src/daemon/main.c:586 +msgid "Running in system mode, but --disallow-module-loading not set!" +msgstr "" +"Покренуто у системском режиму, али --disallow-module-loading није постављено!" + +#: ../src/daemon/main.c:589 +msgid "Running in system mode, forcibly disabling SHM mode!" +msgstr "Покренуто у системском режиму, присилно онемогућујем SHM режим!" + +#: ../src/daemon/main.c:594 +msgid "Running in system mode, forcibly disabling exit idle time!" +msgstr "" +"Покренуто у системском режиму, присилно онемогућујем гашење после одређеног " +"времена мировања!" + +#: ../src/daemon/main.c:621 +msgid "Failed to acquire stdio." +msgstr "Неуспешно проналажење стандардног улаза/излаза." + +#: ../src/daemon/main.c:627 +#, c-format +msgid "pipe failed: %s" +msgstr "Неуспешно пуштање података кроз цев: %s" + +#: ../src/daemon/main.c:632 +#, c-format +msgid "fork() failed: %s" +msgstr "Неуспела функција fork(): %s" + +#: ../src/daemon/main.c:646 ../src/utils/pacat.c:508 +#, c-format +msgid "read() failed: %s" +msgstr "Неуспела функција read(): %s" + +#: ../src/daemon/main.c:652 +msgid "Daemon startup failed." +msgstr "Неуспешно покретање демона." + +#: ../src/daemon/main.c:654 +msgid "Daemon startup successful." +msgstr "Демон успешно покренут." + +#: ../src/daemon/main.c:731 +#, c-format +msgid "This is PulseAudio %s" +msgstr "Ово је PulseAudio %s" + +#: ../src/daemon/main.c:732 +#, c-format +msgid "Compilation host: %s" +msgstr "Домаћин компајлирања: %s" + +#: ../src/daemon/main.c:733 +#, c-format +msgid "Compilation CFLAGS: %s" +msgstr "CFLAGS компајлирања: %s" + +#: ../src/daemon/main.c:736 +#, c-format +msgid "Running on host: %s" +msgstr "Покренут на домаћину: %s" + +#: ../src/daemon/main.c:739 +#, c-format +msgid "Found %u CPUs." +msgstr "Нашао %u процесор(а)" + +#: ../src/daemon/main.c:741 +#, c-format +msgid "Page size is %lu bytes" +msgstr "Величина странице је %lu бајтова" + +#: ../src/daemon/main.c:744 +msgid "Compiled with Valgrind support: yes" +msgstr "Компајлирано са подршком за Valgrind: да" + +#: ../src/daemon/main.c:746 +msgid "Compiled with Valgrind support: no" +msgstr "Компајлирано са подршком за Valgrind: не" + +#: ../src/daemon/main.c:749 +#, c-format +msgid "Running in valgrind mode: %s" +msgstr "Покренут у Valgrind режиму: %s" + +#: ../src/daemon/main.c:752 +msgid "Optimized build: yes" +msgstr "Оптимизована изградња: да" + +#: ../src/daemon/main.c:754 +msgid "Optimized build: no" +msgstr "Оптимизована изградња: не" + +#: ../src/daemon/main.c:758 +msgid "NDEBUG defined, all asserts disabled." +msgstr "NDEBUG дефинисан, сва обавештења искључена." + +#: ../src/daemon/main.c:760 +msgid "FASTPATH defined, only fast path asserts disabled." +msgstr "FASTPATH дефинисан, само обавештења брзе путање искључена." + +#: ../src/daemon/main.c:762 +msgid "All asserts enabled." +msgstr "Сва обавештења омогућена." + +#: ../src/daemon/main.c:766 +msgid "Failed to get machine ID" +msgstr "Неуспешно добављање ИБ машине" + +#: ../src/daemon/main.c:769 +#, c-format +msgid "Machine ID is %s." +msgstr "ИБ машине је %s." + +#: ../src/daemon/main.c:773 +#, c-format +msgid "Session ID is %s." +msgstr "ИБ сесије је %s." + +#: ../src/daemon/main.c:779 +#, c-format +msgid "Using runtime directory %s." +msgstr "Користи се %s извршни директоријум." + +#: ../src/daemon/main.c:784 +#, c-format +msgid "Using state directory %s." +msgstr "Користи се %s директоријум стања." + +#: ../src/daemon/main.c:787 +#, c-format +msgid "Using modules directory %s." +msgstr "Користи се %s директоријум модула." + +#: ../src/daemon/main.c:789 +#, c-format +msgid "Running in system mode: %s" +msgstr "Покренуто у системском режиму: %s" + +#: ../src/daemon/main.c:792 +msgid "" +"OK, so you are running PA in system mode. Please note that you most likely " +"shouldn't be doing that.\n" +"If you do it nonetheless then it's your own fault if things don't work as " +"expected.\n" +"Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an " +"explanation why system mode is usually a bad idea." +msgstr "" +"У реду, значи извршавате PA у системском режиму. Примите к знању да то " +"вероватно не би требало да радите.\n" +"Ако то свеједно чините онда је ваша кривица ако ствари не раде онако како се " +"очекује.\n" +"Прочитајте http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode ради " +"објашњења зашто је системски режим обично лоша идеја." + +#: ../src/daemon/main.c:809 +msgid "pa_pid_file_create() failed." +msgstr "Неуспела функција pa_pid_file_create()." + +#: ../src/daemon/main.c:819 +msgid "Fresh high-resolution timers available! Bon appetit!" +msgstr "Доступни су нови бројачи високе резолуције! Пријатно!" + +#: ../src/daemon/main.c:821 +msgid "" +"Dude, your kernel stinks! The chef's recommendation today is Linux with high-" +"resolution timers enabled!" +msgstr "" +"Ваше језгро није добро подешено за pulseaudio! Препоручује Вам се да " +"користите Linux језгро са омогућеним бројачима високе резолуције." + +#: ../src/daemon/main.c:844 +msgid "pa_core_new() failed." +msgstr "Неуспела функција pa_core_new()." + +#: ../src/daemon/main.c:904 +msgid "Failed to initialize daemon." +msgstr "Неуспешно покретање демона." + +#: ../src/daemon/main.c:909 +msgid "Daemon startup without any loaded modules, refusing to work." +msgstr "Демон је покренут без иједног учитаног модула, одбија да ради." + +#: ../src/daemon/main.c:926 +msgid "Daemon startup complete." +msgstr "Покретање демона успешно." + +#: ../src/daemon/main.c:932 +msgid "Daemon shutdown initiated." +msgstr "Покренуто гашење демона." + +#: ../src/daemon/main.c:954 +msgid "Daemon terminated." +msgstr "Рад демона је прекинут." + +#: ../src/daemon/cmdline.c:115 +#, c-format +msgid "" +"%s [options]\n" +"\n" +"COMMANDS:\n" +" -h, --help Show this help\n" +" --version Show version\n" +" --dump-conf Dump default configuration\n" +" --dump-modules Dump list of available modules\n" +" --dump-resample-methods Dump available resample methods\n" +" --cleanup-shm Cleanup stale shared memory " +"segments\n" +" --start Start the daemon if it is not " +"running\n" +" -k --kill Kill a running daemon\n" +" --check Check for a running daemon (only " +"returns exit code)\n" +"\n" +"OPTIONS:\n" +" --system[=BOOL] Run as system-wide instance\n" +" -D, --daemonize[=BOOL] Daemonize after startup\n" +" --fail[=BOOL] Quit when startup fails\n" +" --high-priority[=BOOL] Try to set high nice level\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_NICE)\n" +" --realtime[=BOOL] Try to enable realtime scheduling\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_RTPRIO)\n" +" --disallow-module-loading[=BOOL] Disallow module user requested " +"module\n" +" loading/unloading after startup\n" +" --disallow-exit[=BOOL] Disallow user requested exit\n" +" --exit-idle-time=SECS Terminate the daemon when idle and " +"this\n" +" time passed\n" +" --module-idle-time=SECS Unload autoloaded modules when idle " +"and\n" +" this time passed\n" +" --scache-idle-time=SECS Unload autoloaded samples when idle " +"and\n" +" this time passed\n" +" --log-level[=LEVEL] Increase or set verbosity level\n" +" -v Increase the verbosity level\n" +" --log-target={auto,syslog,stderr} Specify the log target\n" +" --log-meta[=BOOL] Include code location in log " +"messages\n" +" --log-time[=BOOL] Include timestamps in log messages\n" +" --log-backtrace=FRAMES Include a backtrace in log messages\n" +" -p, --dl-search-path=PATH Set the search path for dynamic " +"shared\n" +" objects (plugins)\n" +" --resample-method=METHOD Use the specified resampling method\n" +" (See --dump-resample-methods for\n" +" possible values)\n" +" --use-pid-file[=BOOL] Create a PID file\n" +" --no-cpu-limit[=BOOL] Do not install CPU load limiter on\n" +" platforms that support it.\n" +" --disable-shm[=BOOL] Disable shared memory support.\n" +"\n" +"STARTUP SCRIPT:\n" +" -L, --load=\"MODULE ARGUMENTS\" Load the specified plugin module " +"with\n" +" the specified argument\n" +" -F, --file=FILENAME Run the specified script\n" +" -C Open a command line on the running " +"TTY\n" +" after startup\n" +"\n" +" -n Don't load default script file\n" +msgstr "" +"%s [опције]\n" +"\n" +"НАРЕДБЕ:\n" +" -h, --help Прикажи ову помоћ\n" +" --version Прикажи верзију\n" +" --dump-conf Испиши подразумевана подешавања\n" +" --dump-modules Испиши списак доступних модула\n" +" --dump-resample-methods Испиши доступне вредности " +"дискретизације\n" +" --cleanup-shm Очисти бајате делове дељене " +"меморије\n" +" --start Покрени демон ако већ није покренут\n" +" -k --kill Убиј покренути демон\n" +" --check Провери постојање покренутог демона " +"(враћа само излазни ко̑д)\n" +"\n" +"ОПЦИЈЕ:\n" +" --system[=логичка вредност] Покрени као системски примерак\n" +" -D, --daemonize[=лог. вредност] Покрени у позадини\n" +" --fail[=лог. вредност] Изађи после неуспешног покретања\n" +" --high-priority[=лог. вредност] Покушај поставити високоприоритетно " +"распоређивање\n" +" (доступно само root-у, или преко " +"SUID-а или\n" +" са повишеним RLIMIT_NICE нивоом)\n" +" --realtime[=лог. вредност] Покушај омогућити стварновременско " +"распоређивање\n" +" (доступно само root-у, или преко " +"SUID-а или\n" +" са повишеним RLIMIT_RTPRIO нивоом)\n" +" --disallow-module-loading[=лог.] Не дозвољавај учитавање/уклањање " +"модула\n" +" на кориснички захтев после " +"покретања\n" +" --disallow-exit[=лог. вредност] Не дозвољавај излаз на кориснички " +"захтев\n" +" --exit-idle-time=СЕКУНДИ Прекини рад демона после мировања\n" +" од оволико секунди\n" +" --module-idle-time=СЕКУНДИ Уклони самоучитане модуле после " +"мировања\n" +" од оволико секунди\n" +" --scache-idle-time=СЕКУНДИ Уклони самоучитане примерке после " +"мировања\n" +" од оволико секунди\n" +" --log-level[=НИВО] Повећај или постави ниво опширности\n" +" -v Повећај ниво опширности\n" +" --log-target={auto,syslog,stderr} Наведи циљни дневник\n" +" --log-meta[=лог. вредност] Укључи место у ко̑ду у порукама " +"дневника\n" +" --log-time[=лог. вредност] Укључи време у порукама дневника\n" +" --log-backtrace=FRAMES Укључи трагове у порукама дневника\n" +" -p, --dl-search-path=ПУТАЊА Постави путању претраге за динамички " +"дељене\n" +" објекте (додаци)\n" +" --resample-method=НАЧИН Користи наведени начин " +"дискретизације\n" +" (Погледај --dump-resample-methods " +"за\n" +" могуће вредности)\n" +" --use-pid-file[=лог. вредност] Направи PID датотеку\n" +" --no-cpu-limit[=лог. вредност] Немој инсталирати ограничавање " +"процесорског\n" +" терета на платформама које то " +"подржавају.\n" +" --disable-shm[=лог. вредност] Онемогући подршку за дељену " +"меморију.\n" +"\n" +"STARTUP SCRIPT:\n" +" -L, --load=\"ПАРАМЕТРИ МОДУЛА\" Учитај наведени модул додатка са\n" +" наведеним параметрима\n" +" -F, --file=ИМЕДАТОТЕКЕ Покрени наведену скрипту\n" +" -C Отвори командну линију на покренутом " +"TTY-у\n" +" после покретања\n" +"\n" +" -n Не учитавај подразумевану датотеку " +"скрипте.\n" + +#: ../src/daemon/cmdline.c:247 +msgid "--daemonize expects boolean argument" +msgstr "--daemonize очекује логички аргумент" + +#: ../src/daemon/cmdline.c:254 +msgid "--fail expects boolean argument" +msgstr "--fail очекује логички аргумент" + +#: ../src/daemon/cmdline.c:264 +msgid "" +"--log-level expects log level argument (either numeric in range 0..4 or one " +"of debug, info, notice, warn, error)." +msgstr "" +"--log-level очекује аргумент за ниво записа (или нумеричка вредност у опсегу " +"0..4 или једно од debug, info, notice, warn, error)." + +#: ../src/daemon/cmdline.c:276 +msgid "--high-priority expects boolean argument" +msgstr "--high-priority очекује логички аргумент" + +#: ../src/daemon/cmdline.c:283 +msgid "--realtime expects boolean argument" +msgstr "--realtime очекује логички аргумент" + +#: ../src/daemon/cmdline.c:290 +msgid "--disallow-module-loading expects boolean argument" +msgstr "--disallow-module-loading очекује логички аргумент" + +#: ../src/daemon/cmdline.c:297 +msgid "--disallow-exit expects boolean argument" +msgstr "--disallow-exit очекује логички аргумент" + +#: ../src/daemon/cmdline.c:304 +msgid "--use-pid-file expects boolean argument" +msgstr "--use-pid-file очекује логички аргумент" + +#: ../src/daemon/cmdline.c:321 +msgid "Invalid log target: use either 'syslog', 'stderr' or 'auto'." +msgstr "" +"Неисправан циљни дневник: користите једно од „syslog“, „stderr“ или „auto“." + +#: ../src/daemon/cmdline.c:328 +msgid "--log-time expects boolean argument" +msgstr "--log-time очекује логички аргумент" + +#: ../src/daemon/cmdline.c:335 +msgid "--log-meta expects boolean argument" +msgstr "--log-meta очекује логички аргумент" + +#: ../src/daemon/cmdline.c:354 +#, c-format +msgid "Invalid resample method '%s'." +msgstr "Неисправан начин дискретизације „%s“." + +#: ../src/daemon/cmdline.c:361 +msgid "--system expects boolean argument" +msgstr "--system очекује логички аргумент" + +#: ../src/daemon/cmdline.c:368 +msgid "--no-cpu-limit expects boolean argument" +msgstr "--no-cpu-limit очекује логички аргумент" + +#: ../src/daemon/cmdline.c:375 +msgid "--disable-shm expects boolean argument" +msgstr "--disable-shm очекује логички аргумент" + +#: ../src/daemon/dumpmodules.c:60 +#, c-format +msgid "Name: %s\n" +msgstr "Име: %s\n" + +#: ../src/daemon/dumpmodules.c:63 +#, c-format +msgid "No module information available\n" +msgstr "Подаци о модулу нису доступни\n" + +#: ../src/daemon/dumpmodules.c:66 +#, c-format +msgid "Version: %s\n" +msgstr "Верзија: %s\n" + +#: ../src/daemon/dumpmodules.c:68 +#, c-format +msgid "Description: %s\n" +msgstr "Опис: %s\n" + +#: ../src/daemon/dumpmodules.c:70 +#, c-format +msgid "Author: %s\n" +msgstr "Аутор: %s\n" + +#: ../src/daemon/dumpmodules.c:72 +#, c-format +msgid "Usage: %s\n" +msgstr "Употреба: %s\n" + +#: ../src/daemon/dumpmodules.c:73 +#, c-format +msgid "Load Once: %s\n" +msgstr "Учитај једном: %s\n" + +#: ../src/daemon/dumpmodules.c:75 +#, c-format +msgid "DEPRECATION WARNING: %s\n" +msgstr "УПОЗОРЕЊЕ О ПРЕВАЗИЛАЖЕЊУ: %s\n" + +#: ../src/daemon/dumpmodules.c:79 +#, c-format +msgid "Path: %s\n" +msgstr "Путања: %s\n" + +#: ../src/daemon/daemon-conf.c:232 +#, c-format +msgid "[%s:%u] Invalid log target '%s'." +msgstr "[%s:%u] Неисправан циљни дневник „%s“." + +#: ../src/daemon/daemon-conf.c:248 +#, c-format +msgid "[%s:%u] Invalid log level '%s'." +msgstr "[%s:%u] Неисправан ниво опширности у дневнику „%s“." + +#: ../src/daemon/daemon-conf.c:264 +#, c-format +msgid "[%s:%u] Invalid resample method '%s'." +msgstr "[%s:%u] Неисправан начин дискретизације „%s“." + +#: ../src/daemon/daemon-conf.c:287 +#, c-format +msgid "[%s:%u] Invalid rlimit '%s'." +msgstr "[%s:%u] Неисправан rlimit „%s“." + +#: ../src/daemon/daemon-conf.c:294 +#, c-format +msgid "[%s:%u] rlimit not supported on this platform." +msgstr "[%s:%u] rlimit није подржан на овој платформи." + +#: ../src/daemon/daemon-conf.c:310 +#, c-format +msgid "[%s:%u] Invalid sample format '%s'." +msgstr "[%s:%u] Неисправан формат узорка „%s“." + +#: ../src/daemon/daemon-conf.c:328 +#, c-format +msgid "[%s:%u] Invalid sample rate '%s'." +msgstr "[%s:%u] Неисправна учестаност дискретизације „%s“." + +#: ../src/daemon/daemon-conf.c:352 +#, c-format +msgid "[%s:%u] Invalid sample channels '%s'." +msgstr "[%s:%u] Неисправни канали узорка „%s“." + +#: ../src/daemon/daemon-conf.c:370 +#, c-format +msgid "[%s:%u] Invalid channel map '%s'." +msgstr "[%s:%u] Неисправна мапа канала „%s“." + +#: ../src/daemon/daemon-conf.c:388 +#, c-format +msgid "[%s:%u] Invalid number of fragments '%s'." +msgstr "[%s:%u] Неисправан број одломака „%s“." + +#: ../src/daemon/daemon-conf.c:406 +#, c-format +msgid "[%s:%u] Invalid fragment size '%s'." +msgstr "[%s:%u] Неисправна величина одломка „%s“." + +#: ../src/daemon/daemon-conf.c:424 +#, c-format +msgid "[%s:%u] Invalid nice level '%s'." +msgstr "[%s:%u] Неисправан ниво приоритета „%s“." + +#: ../src/daemon/daemon-conf.c:546 +#, c-format +msgid "Failed to open configuration file: %s" +msgstr "Неуспело отварање датотеке подешавања: %s" + +#: ../src/daemon/daemon-conf.c:562 +msgid "" +"The specified default channel map has a different number of channels than " +"the specified default number of channels." +msgstr "" +"Наведена мапа канала има нема исти број канала као што је наведено у " +"подразумеваном броју канала." + +#: ../src/daemon/daemon-conf.c:638 +#, c-format +msgid "### Read from configuration file: %s ###\n" +msgstr "### Прочитај из датотеке подешавања: %s ###\n" + +#: ../src/daemon/caps.c:62 +msgid "Cleaning up privileges." +msgstr "Чистим повластице." + +#: ../src/daemon/pulseaudio.desktop.in.h:1 +msgid "PulseAudio Sound System" +msgstr "PulseAudio звучни систем" + +#: ../src/daemon/pulseaudio.desktop.in.h:2 +msgid "Start the PulseAudio Sound System" +msgstr "Покрени PulseAudio звучни систем" + +#: ../src/pulse/channelmap.c:105 ../src/pulse/channelmap.c:757 +msgid "Mono" +msgstr "Моно" + +#: ../src/pulse/channelmap.c:107 +msgid "Front Center" +msgstr "Предњи централни" + +#: ../src/pulse/channelmap.c:108 +msgid "Front Left" +msgstr "Предњи леви" + +#: ../src/pulse/channelmap.c:109 +msgid "Front Right" +msgstr "Предњи десни" + +#: ../src/pulse/channelmap.c:111 +msgid "Rear Center" +msgstr "Позадински централни" + +#: ../src/pulse/channelmap.c:112 +msgid "Rear Left" +msgstr "Позадински леви" + +#: ../src/pulse/channelmap.c:113 +msgid "Rear Right" +msgstr "Позадински десни" + +#: ../src/pulse/channelmap.c:115 +msgid "Low Frequency Emmiter" +msgstr "Звучник за ниске фреквенције" + +#: ../src/pulse/channelmap.c:117 +msgid "Front Left-of-center" +msgstr "Предњи лево од центра" + +#: ../src/pulse/channelmap.c:118 +msgid "Front Right-of-center" +msgstr "Предњи десно од центра" + +#: ../src/pulse/channelmap.c:120 +msgid "Side Left" +msgstr "Лева страна" + +#: ../src/pulse/channelmap.c:121 +msgid "Side Right" +msgstr "Десна страна" + +#: ../src/pulse/channelmap.c:123 +msgid "Auxiliary 0" +msgstr "Споредни 0" + +#: ../src/pulse/channelmap.c:124 +msgid "Auxiliary 1" +msgstr "Споредни 1" + +#: ../src/pulse/channelmap.c:125 +msgid "Auxiliary 2" +msgstr "Споредни 2" + +#: ../src/pulse/channelmap.c:126 +msgid "Auxiliary 3" +msgstr "Споредни 3" + +#: ../src/pulse/channelmap.c:127 +msgid "Auxiliary 4" +msgstr "Споредни 4" + +#: ../src/pulse/channelmap.c:128 +msgid "Auxiliary 5" +msgstr "Споредни 5" + +#: ../src/pulse/channelmap.c:129 +msgid "Auxiliary 6" +msgstr "Споредни 6" + +#: ../src/pulse/channelmap.c:130 +msgid "Auxiliary 7" +msgstr "Споредни 7" + +#: ../src/pulse/channelmap.c:131 +msgid "Auxiliary 8" +msgstr "Споредни 8" + +#: ../src/pulse/channelmap.c:132 +msgid "Auxiliary 9" +msgstr "Споредни 9" + +#: ../src/pulse/channelmap.c:133 +msgid "Auxiliary 10" +msgstr "Споредни 10" + +#: ../src/pulse/channelmap.c:134 +msgid "Auxiliary 11" +msgstr "Споредни 11" + +#: ../src/pulse/channelmap.c:135 +msgid "Auxiliary 12" +msgstr "Споредни 12" + +#: ../src/pulse/channelmap.c:136 +msgid "Auxiliary 13" +msgstr "Споредни 13" + +#: ../src/pulse/channelmap.c:137 +msgid "Auxiliary 14" +msgstr "Споредни 14" + +#: ../src/pulse/channelmap.c:138 +msgid "Auxiliary 15" +msgstr "Споредни 15" + +#: ../src/pulse/channelmap.c:139 +msgid "Auxiliary 16" +msgstr "Споредни 16" + +#: ../src/pulse/channelmap.c:140 +msgid "Auxiliary 17" +msgstr "Споредни 17" + +#: ../src/pulse/channelmap.c:141 +msgid "Auxiliary 18" +msgstr "Споредни 18" + +#: ../src/pulse/channelmap.c:142 +msgid "Auxiliary 19" +msgstr "Споредни 19" + +#: ../src/pulse/channelmap.c:143 +msgid "Auxiliary 20" +msgstr "Споредни 20" + +#: ../src/pulse/channelmap.c:144 +msgid "Auxiliary 21" +msgstr "Споредни 21" + +#: ../src/pulse/channelmap.c:145 +msgid "Auxiliary 22" +msgstr "Споредни 22" + +#: ../src/pulse/channelmap.c:146 +msgid "Auxiliary 23" +msgstr "Споредни 23" + +#: ../src/pulse/channelmap.c:147 +msgid "Auxiliary 24" +msgstr "Споредни 024" + +#: ../src/pulse/channelmap.c:148 +msgid "Auxiliary 25" +msgstr "Споредни 25" + +#: ../src/pulse/channelmap.c:149 +msgid "Auxiliary 26" +msgstr "Споредни 26" + +#: ../src/pulse/channelmap.c:150 +msgid "Auxiliary 27" +msgstr "Споредни 27" + +#: ../src/pulse/channelmap.c:151 +msgid "Auxiliary 28" +msgstr "Споредни 28" + +#: ../src/pulse/channelmap.c:152 +msgid "Auxiliary 29" +msgstr "Споредни 29" + +#: ../src/pulse/channelmap.c:153 +msgid "Auxiliary 30" +msgstr "Споредни 30" + +#: ../src/pulse/channelmap.c:154 +msgid "Auxiliary 31" +msgstr "Споредни 31" + +#: ../src/pulse/channelmap.c:156 +msgid "Top Center" +msgstr "Горњи централни" + +#: ../src/pulse/channelmap.c:158 +msgid "Top Front Center" +msgstr "Горњи предњи централни" + +#: ../src/pulse/channelmap.c:159 +msgid "Top Front Left" +msgstr "Горњи предњи леви" + +#: ../src/pulse/channelmap.c:160 +msgid "Top Front Right" +msgstr "Горњи предњи десни" + +#: ../src/pulse/channelmap.c:162 +msgid "Top Rear Center" +msgstr "Горњи позадински централни" + +#: ../src/pulse/channelmap.c:163 +msgid "Top Rear Left" +msgstr "Горњи позадински леви" + +#: ../src/pulse/channelmap.c:164 +msgid "Top Rear Right" +msgstr "Горњи позадински десни" + +#: ../src/pulse/channelmap.c:484 ../src/pulse/sample.c:170 +#: ../src/pulse/volume.c:295 ../src/pulse/volume.c:321 +#: ../src/pulse/volume.c:341 ../src/pulse/volume.c:371 +msgid "(invalid)" +msgstr "(неисправно)" + +#: ../src/pulse/channelmap.c:761 +msgid "Stereo" +msgstr "Стерео" + +#: ../src/pulse/channelmap.c:766 +msgid "Surround 4.0" +msgstr "Окружујући 4.0" + +#: ../src/pulse/channelmap.c:772 +msgid "Surround 4.1" +msgstr "Окружујући 4.1" + +#: ../src/pulse/channelmap.c:778 +msgid "Surround 5.0" +msgstr "Окружујући 5.0" + +#: ../src/pulse/channelmap.c:784 +msgid "Surround 5.1" +msgstr "Окружујући 5.1" + +#: ../src/pulse/channelmap.c:791 +msgid "Surround 7.1" +msgstr "Окружујући 7.1" + +#: ../src/pulse/error.c:43 +msgid "OK" +msgstr "У реду" + +#: ../src/pulse/error.c:44 +msgid "Access denied" +msgstr "Забрањен приступ" + +#: ../src/pulse/error.c:45 +msgid "Unknown command" +msgstr "Непозната наредба" + +#: ../src/pulse/error.c:46 +msgid "Invalid argument" +msgstr "Неисправан аргумент" + +#: ../src/pulse/error.c:47 +msgid "Entity exists" +msgstr "Ентитет постоји" + +#: ../src/pulse/error.c:48 +msgid "No such entity" +msgstr "Не постоји такав ентитет" + +#: ../src/pulse/error.c:49 +msgid "Connection refused" +msgstr "Веза одбијена" + +#: ../src/pulse/error.c:50 +msgid "Protocol error" +msgstr "Грешка у протоколу" + +#: ../src/pulse/error.c:51 +msgid "Timeout" +msgstr "Време истекло" + +#: ../src/pulse/error.c:52 +msgid "No authorization key" +msgstr "Нема кључа за овлашћење" + +#: ../src/pulse/error.c:53 +msgid "Internal error" +msgstr "Интерна грешка" + +#: ../src/pulse/error.c:54 +msgid "Connection terminated" +msgstr "Веза прекинута" + +#: ../src/pulse/error.c:55 +msgid "Entity killed" +msgstr "Ентитет убијен" + +#: ../src/pulse/error.c:56 +msgid "Invalid server" +msgstr "Сервер неисправан" + +#: ../src/pulse/error.c:57 +msgid "Module initalization failed" +msgstr "Иницијализација модула није успела" + +#: ../src/pulse/error.c:58 +msgid "Bad state" +msgstr "Лоше стање" + +#: ../src/pulse/error.c:59 +msgid "No data" +msgstr "Нема података" + +#: ../src/pulse/error.c:60 +msgid "Incompatible protocol version" +msgstr "Неусаглашена верзија протокола" + +#: ../src/pulse/error.c:61 +msgid "Too large" +msgstr "Превелико" + +#: ../src/pulse/error.c:62 +msgid "Not supported" +msgstr "Није подржано" + +#: ../src/pulse/error.c:63 +msgid "Unknown error code" +msgstr "Ко̑д грешке је непознат" + +#: ../src/pulse/error.c:64 +msgid "No such extension" +msgstr "Не постоји такво проширење" + +#: ../src/pulse/error.c:65 +msgid "Obsolete functionality" +msgstr "Избачена функционалност" + +#: ../src/pulse/error.c:66 +msgid "Missing implementation" +msgstr "Није одрађено" + +#: ../src/pulse/error.c:67 +msgid "Client forked" +msgstr "Клијент је израчван" + +#: ../src/pulse/error.c:68 +msgid "Input/Output error" +msgstr "Улазна/излазна грешка" + +#: ../src/pulse/error.c:69 +msgid "Device or resource busy" +msgstr "Уређај или ресурс је заузет" + +#: ../src/pulse/sample.c:172 +#, c-format +msgid "%s %uch %uHz" +msgstr "%s %uch %uHz" + +#: ../src/pulse/sample.c:184 +#, c-format +msgid "%0.1f GiB" +msgstr "%0.1f GiB" + +#: ../src/pulse/sample.c:186 +#, c-format +msgid "%0.1f MiB" +msgstr "%0.1f MiB" + +#: ../src/pulse/sample.c:188 +#, c-format +msgid "%0.1f KiB" +msgstr "%0.1f KiB" + +#: ../src/pulse/sample.c:190 +#, c-format +msgid "%u B" +msgstr "%u B" + +#: ../src/pulse/client-conf-x11.c:55 ../src/utils/pax11publish.c:100 +msgid "XOpenDisplay() failed" +msgstr "Неуспела функција XOpenDisplay()" + +#: ../src/pulse/client-conf-x11.c:93 +msgid "Failed to parse cookie data" +msgstr "Неуспешно тумачење података из колачића" + +#: ../src/pulse/client-conf.c:111 +#, c-format +msgid "Failed to open configuration file '%s': %s" +msgstr "Неуспешно отварање датотеке подешавања „%s“: %s" + +#: ../src/pulse/context.c:550 +msgid "No cookie loaded. Attempting to connect without." +msgstr "Колачић није учитан. Покушавам се повезати без колачића." + +#: ../src/pulse/context.c:693 +#, c-format +msgid "fork(): %s" +msgstr "fork(): %s" + +#: ../src/pulse/context.c:748 +#, c-format +msgid "waitpid(): %s" +msgstr "waitpid(): %s" + +#: ../src/pulse/context.c:1438 +#, c-format +msgid "Received message for unknown extension '%s'" +msgstr "Примио поруку за непознати локал „%s“" + +#: ../src/utils/pacat.c:108 +#, c-format +msgid "Failed to drain stream: %s" +msgstr "Неуспешно исушивање тока: %s" + +#: ../src/utils/pacat.c:113 +msgid "Playback stream drained." +msgstr "Репродукциони ток је исушен." + +#: ../src/utils/pacat.c:123 +msgid "Draining connection to server." +msgstr "Веза до сервера се исушује." + +#: ../src/utils/pacat.c:136 +#, c-format +msgid "pa_stream_drain(): %s" +msgstr "pa_stream_drain(): %s" + +#: ../src/utils/pacat.c:159 +#, c-format +msgid "pa_stream_write() failed: %s" +msgstr "Неуспела функција pa_stream_write(): %s" + +#: ../src/utils/pacat.c:197 +#, c-format +msgid "pa_stream_begin_write() failed: %s" +msgstr "Неуспела функција pa_stream_write(): %s" + +#: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267 +#, c-format +msgid "pa_stream_peek() failed: %s" +msgstr "Неуспела функција pa_stream_peek(): %s" + +#: ../src/utils/pacat.c:307 +msgid "Stream successfully created." +msgstr "Ток је успешно направљен." + +#: ../src/utils/pacat.c:310 +#, c-format +msgid "pa_stream_get_buffer_attr() failed: %s" +msgstr "Неуспела функција pa_stream_get_buffer_attr(): %s" + +#: ../src/utils/pacat.c:314 +#, c-format +msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u" +msgstr "Мере бафера: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u" + +#: ../src/utils/pacat.c:317 +#, c-format +msgid "Buffer metrics: maxlength=%u, fragsize=%u" +msgstr "Мере бафера: maxlength=%u, fragsize=%u" + +#: ../src/utils/pacat.c:321 +#, c-format +msgid "Using sample spec '%s', channel map '%s'." +msgstr "Користим следеће параметре узорка „%s“ и мапу канала „%s“." + +#: ../src/utils/pacat.c:325 +#, c-format +msgid "Connected to device %s (%u, %ssuspended)." +msgstr "Прикључен на уређај %s (%u, %s обустављено)." + +#: ../src/utils/pacat.c:335 +#, c-format +msgid "Stream error: %s" +msgstr "Грешка тока: %s" + +#: ../src/utils/pacat.c:345 +#, c-format +msgid "Stream device suspended.%s" +msgstr "Уређај тока обустављен.%s" + +#: ../src/utils/pacat.c:347 +#, c-format +msgid "Stream device resumed.%s" +msgstr "Уређај тока настављен.%s" + +#: ../src/utils/pacat.c:355 +#, c-format +msgid "Stream underrun.%s" +msgstr "Ток није попуњен.%s" + +#: ../src/utils/pacat.c:362 +#, c-format +msgid "Stream overrun.%s" +msgstr "Ток се прелива.%s" + +#: ../src/utils/pacat.c:369 +#, c-format +msgid "Stream started.%s" +msgstr "Ток је покренут.%s" + +#: ../src/utils/pacat.c:376 +#, c-format +msgid "Stream moved to device %s (%u, %ssuspended).%s" +msgstr "Ток пребачен на уређај %s (%u, %s обустављено).%s" + +#: ../src/utils/pacat.c:376 +msgid "not " +msgstr "није" + +#: ../src/utils/pacat.c:383 +#, c-format +msgid "Stream buffer attributes changed.%s" +msgstr "Параметри бафера тока су промењени.%s" + +#: ../src/utils/pacat.c:415 +#, c-format +msgid "Connection established.%s" +msgstr "Веза успостављена.%s" + +#: ../src/utils/pacat.c:418 +#, c-format +msgid "pa_stream_new() failed: %s" +msgstr "Неуспела функција pa_stream_new(): %s" + +#: ../src/utils/pacat.c:450 +#, c-format +msgid "pa_stream_connect_playback() failed: %s" +msgstr "Неуспела функција pa_stream_connect_playback(): %s" + +#: ../src/utils/pacat.c:456 +#, c-format +msgid "pa_stream_connect_record() failed: %s" +msgstr "Неуспела функција pa_stream_connect_record(): %s" + +#: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857 +#, c-format +msgid "Connection failure: %s" +msgstr "Неуспешно повезивање: %s" + +#: ../src/utils/pacat.c:503 +msgid "Got EOF." +msgstr "Добих EOF." + +#: ../src/utils/pacat.c:540 +#, c-format +msgid "write() failed: %s" +msgstr "Неуспела функција write(): %s" + +#: ../src/utils/pacat.c:561 +msgid "Got signal, exiting." +msgstr "Добих сигнал, излазим." + +#: ../src/utils/pacat.c:575 +#, c-format +msgid "Failed to get latency: %s" +msgstr "Не могу добити вредност кашњења: %s" + +#: ../src/utils/pacat.c:580 +#, c-format +msgid "Time: %0.3f sec; Latency: %0.0f usec." +msgstr "Време: %0.3f s; Кашњење: %0.0f us." + +#: ../src/utils/pacat.c:599 +#, c-format +msgid "pa_stream_update_timing_info() failed: %s" +msgstr "Неуспела функција pa_stream_update_timing_info(): %s" + +#: ../src/utils/pacat.c:609 +#, c-format +msgid "" +"%s [options]\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -r, --record Create a connection for recording\n" +" -p, --playback Create a connection for playback\n" +"\n" +" -v, --verbose Enable verbose operations\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -d, --device=DEVICE The name of the sink/source to " +"connect to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" +" --stream-name=NAME How to call this stream on the " +"server\n" +" --volume=VOLUME Specify the initial (linear) volume " +"in range 0...65536\n" +" --rate=SAMPLERATE The sample rate in Hz (defaults to " +"44100)\n" +" --format=SAMPLEFORMAT The sample type, one of s16le, " +"s16be, u8, float32le,\n" +" float32be, ulaw, alaw, s32le, s32be, " +"s24le, s24be,\n" +" s24-32le, s24-32be (defaults to " +"s16ne)\n" +" --channels=CHANNELS The number of channels, 1 for mono, " +"2 for stereo\n" +" (defaults to 2)\n" +" --channel-map=CHANNELMAP Channel map to use instead of the " +"default\n" +" --fix-format Take the sample format from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-rate Take the sampling rate from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-channels Take the number of channels and the " +"channel map\n" +" from the sink the stream is being " +"connected to.\n" +" --no-remix Don't upmix or downmix channels.\n" +" --no-remap Map channels by index instead of " +"name.\n" +" --latency=BYTES Request the specified latency in " +"bytes.\n" +" --process-time=BYTES Request the specified process time " +"per request in bytes.\n" +" --property=PROPERTY=VALUE Set the specified property to the " +"specified value.\n" +" --raw Record/play raw PCM data.\n" +" --file-format=FFORMAT Record/play formatted PCM data.\n" +" --list-file-formats List available file formats.\n" +msgstr "" +"%s [опције]\n" +"\n" +" -h, --help Прикажи ову помоћ\n" +" --version Прикажи верзију\n" +"\n" +" -r, --record Направи везу за снимање\n" +" -p, --playback Направи везу за репродукцију\n" +"\n" +" -v, --verbose Омогући опширан опис радње\n" +"\n" +" -s, --server=СЕРВЕР Име сервера на који се треба " +"повезати\n" +" -d, --device=УРЕЂАЈ Назив сливника/извора на који се " +"треба повезати\n" +" -n, --client-name=ИМЕ Како назвати овог клијента на " +"серверу\n" +" --stream-name=ИМЕ Како назвати овај ток на серверу\n" +" --volume=ЈАЧИНА Наведи почетну (линеарну) јачину " +"звука у опсегу 0...65536\n" +" --rate=УЧЕСТАНОСТ Учестаност дискретизације у Hz " +"(подразумевана 44100)\n" +" --format=ФОРМАТУЗОРКА Врста узорка, једна од s16le, s16be, " +"u8, float32le,\n" +" float32be, ulaw, alaw, s32le, s32be, " +"s24le, s24be,\n" +" s24-32le, s24-32be (подразумевано " +"s16ne)\n" +" --channels=КАНАЛИ Број канала, 1 за моно, 2 за стерео\n" +" (подразумевано 2)\n" +" --channel-map=МАПАКАНАЛА Мапу канала коју треба користити " +"уместо подразумеване\n" +" --fix-format Преузми формат узорка из сливника на " +"који се ток\n" +" прикључује.\n" +" --fix-rate Преузми учестаност дискретизације из " +"одлива на који\n" +" се ток прикључује.\n" +" --fix-channels Преузми број и мапу канала из " +"сливника на који се\n" +" ток прикључује.\n" +" --no-remix Без свођења или разлагања канала.\n" +" --no-remap Мапирај канале по индексу уместо по " +"називу.\n" +" --latency=БАЈТОВА Тражи наведено кашњење у бајтовима.\n" +" --process-time=БАЈТОВА Тражи наведено време процеса по " +"захтеву у бајтовима.\n" +" --property=СВОЈСТВО=ВРЕДНОСТ Постави наведено својство на " +"наведену вредност.\n" +" --raw Снимај/репродукуј сирове PCM " +"податке.\n" +" --file-format=ФОРМАТ Снимај/репродукуј форматиране PCM " +"податке.\n" +" --list-file-formats Испиши све доступне формате " +"података.\n" + +#: ../src/utils/pacat.c:731 +#, c-format +msgid "" +"pacat %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pacat %s\n" +"Компајлирано са libpulse %s\n" +"Повезано са libpulse %s\n" + +#: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953 +#, c-format +msgid "Invalid client name '%s'" +msgstr "Неисправно име клијента „%s“" + +#: ../src/utils/pacat.c:779 +#, c-format +msgid "Invalid stream name '%s'" +msgstr "Неисправно име тока „%s“" + +#: ../src/utils/pacat.c:816 +#, c-format +msgid "Invalid channel map '%s'" +msgstr "Неисправна мапа канала „%s“" + +#: ../src/utils/pacat.c:845 +#, c-format +msgid "Invalid latency specification '%s'" +msgstr "Неисправан параметар кашњења „%s“" + +#: ../src/utils/pacat.c:852 +#, c-format +msgid "Invalid process time specification '%s'" +msgstr "Неисправан параметар за време процеса „%s“" + +#: ../src/utils/pacat.c:864 +#, c-format +msgid "Invalid property '%s'" +msgstr "Неисправно својство „%s“" + +#: ../src/utils/pacat.c:881 +#, c-format +msgid "Unknown file format %s." +msgstr "Непознат %s формат датотеке." + +#: ../src/utils/pacat.c:900 +msgid "Invalid sample specification" +msgstr "Неисправан параметар узорка" + +#: ../src/utils/pacat.c:910 +#, c-format +msgid "open(): %s" +msgstr "open(): %s" + +#: ../src/utils/pacat.c:915 +#, c-format +msgid "dup2(): %s" +msgstr "dup2(): %s" + +#: ../src/utils/pacat.c:922 +msgid "Too many arguments." +msgstr "Превише аргумената." + +#: ../src/utils/pacat.c:933 +msgid "Failed to generate sample specification for file." +msgstr "Није успело прављење параметара узорка за датотеку." + +#: ../src/utils/pacat.c:953 +msgid "Failed to open audio file." +msgstr "Није успело отварање звучне датотеке." + +#: ../src/utils/pacat.c:959 +msgid "" +"Warning: specified sample specification will be overwritten with " +"specification from file." +msgstr "" +"Упозорење: наведени параметри узорка ће бити пребрисани параметрима из " +"датотеке." + +#: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997 +msgid "Failed to determine sample specification from file." +msgstr "Неуспешно утврђивање параметара узорка из датотеке." + +#: ../src/utils/pacat.c:971 +msgid "Warning: Failed to determine channel map from file." +msgstr "Упозорење: Неуспешно утврђивање мапе канала из датотеке." + +#: ../src/utils/pacat.c:982 +msgid "Channel map doesn't match sample specification" +msgstr "Мапа канала се не поклапа са параметрима узорка" + +#: ../src/utils/pacat.c:993 +msgid "Warning: failed to write channel map to file." +msgstr "Упозорење: Неуспешно записивање мапе канала у датотеку." + +#: ../src/utils/pacat.c:1008 +#, c-format +msgid "" +"Opening a %s stream with sample specification '%s' and channel map '%s'." +msgstr "Отварам ток %s са параметрима узорка „%s“ и мапом канала „%s“." + +#: ../src/utils/pacat.c:1009 +msgid "recording" +msgstr "снима" + +#: ../src/utils/pacat.c:1009 +msgid "playback" +msgstr "пушта" + +#: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267 +msgid "pa_mainloop_new() failed." +msgstr "Неуспела функција pa_mainloop_new()." + +#: ../src/utils/pacat.c:1054 +msgid "io_new() failed." +msgstr "Неуспела функција io_new()." + +#: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279 +msgid "pa_context_new() failed." +msgstr "Неуспела функција pa_context_new()." + +#: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285 +#, c-format +msgid "pa_context_connect() failed: %s" +msgstr "Неуспела функција pa_context_connect(): %s" + +#: ../src/utils/pacat.c:1075 +msgid "pa_context_rttime_new() failed." +msgstr "Неуспела функција pa_context_new()." + +#: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290 +msgid "pa_mainloop_run() failed." +msgstr "Неуспела функција pa_mainloop_run()." + +#: ../src/utils/pasuspender.c:81 +#, c-format +msgid "fork(): %s\n" +msgstr "fork(): %s\n" + +#: ../src/utils/pasuspender.c:92 +#, c-format +msgid "execvp(): %s\n" +msgstr "execvp(): %s\n" + +#: ../src/utils/pasuspender.c:109 +#, c-format +msgid "Failure to suspend: %s\n" +msgstr "Неуспешно заустављање: %s\n" + +#: ../src/utils/pasuspender.c:124 +#, c-format +msgid "Failure to resume: %s\n" +msgstr "Неуспешно настављање: %s\n" + +#: ../src/utils/pasuspender.c:147 +#, c-format +msgid "WARNING: Sound server is not local, not suspending.\n" +msgstr "УПОЗОРЕЊЕ: Звучни сервер није локални, не заустављам.\n" + +#: ../src/utils/pasuspender.c:159 +#, c-format +msgid "Connection failure: %s\n" +msgstr "Неуспешно повезивање: %s\n" + +#: ../src/utils/pasuspender.c:176 +#, c-format +msgid "Got SIGINT, exiting.\n" +msgstr "Добих SIGINT, излазим.\n" + +#: ../src/utils/pasuspender.c:194 +#, c-format +msgid "WARNING: Child process terminated by signal %u\n" +msgstr "УПОЗОРЕЊЕ: Потлачени процес је прекинут сигналом %u\n" + +#: ../src/utils/pasuspender.c:212 +#, c-format +msgid "" +"%s [options] ... \n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +"\n" +msgstr "" +"%s [опције] ... \n" +"\n" +" -h, --help Прикажи ову помоћ\n" +" --version Прикажи верзију\n" +" -s, --server=СЕРВЕР Име сервера на који се треба " +"повезати\n" +"\n" + +#: ../src/utils/pasuspender.c:248 +#, c-format +msgid "" +"pasuspender %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pasuspender %s\n" +"Компајлирано са libpulse %s\n" +"Повезано са libpulse %s\n" + +#: ../src/utils/pasuspender.c:277 +#, c-format +msgid "pa_mainloop_new() failed.\n" +msgstr "Неуспела функција pa_mainloop_new().\n" + +#: ../src/utils/pasuspender.c:290 +#, c-format +msgid "pa_context_new() failed.\n" +msgstr "Неуспела функција pa_context_new().\n" + +#: ../src/utils/pasuspender.c:298 +#, c-format +msgid "pa_mainloop_run() failed.\n" +msgstr "Неуспела функција pa_mainloop_run().\n" + +#: ../src/utils/pactl.c:135 +#, c-format +msgid "Failed to get statistics: %s" +msgstr "Неуспешно добављање статистике: %s" + +#: ../src/utils/pactl.c:141 +#, c-format +msgid "Currently in use: %u blocks containing %s bytes total.\n" +msgstr "Тренутно у употреби: %u блокова садржи укупно %s бајтова.\n" + +#: ../src/utils/pactl.c:144 +#, c-format +msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n" +msgstr "Смештено од покретања: %u блокова садржи укупно %s бајтова.\n" + +#: ../src/utils/pactl.c:147 +#, c-format +msgid "Sample cache size: %s\n" +msgstr "Величина кеш меморије узорка: %s\n" + +#: ../src/utils/pactl.c:156 +#, c-format +msgid "Failed to get server information: %s" +msgstr "Неуспешно добављање података о серверу: %s" + +#: ../src/utils/pactl.c:164 +#, c-format +msgid "" +"User name: %s\n" +"Host Name: %s\n" +"Server Name: %s\n" +"Server Version: %s\n" +"Default Sample Specification: %s\n" +"Default Channel Map: %s\n" +"Default Sink: %s\n" +"Default Source: %s\n" +"Cookie: %08x\n" +msgstr "" +"Корисничко име: %s\n" +"Име домаћина: %s\n" +"Име сервера: %s\n" +"Верзија сервера: %s\n" +"Подразумевани параметри узорка: %s\n" +"Подразумевана мапа канала: %s\n" +"Подразумевано сливник: %s\n" +"Подразумевани извор: %s\n" +"Колачић: %08x\n" + +#: ../src/utils/pactl.c:205 +#, c-format +msgid "Failed to get sink information: %s" +msgstr "Неуспешно добављање података о сливнику: %s" + +#: ../src/utils/pactl.c:221 +#, c-format +msgid "" +"Sink #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor Source: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Сливник #%u\n" +"\tСтање: %s\n" +"\tИме: %s\n" +"\tОпис: %s\n" +"\tУправљачки програм: %s\n" +"\tПараметри узорка: %s\n" +"\tМапа канала: %s\n" +"\tПрипада модулу: %u\n" +"\tИскључен тон: %s\n" +"\tЈачина звука: %s%s%s\n" +"\t баланс %0.2f\n" +"\tГласност баса: %s%s%s\n" +"\tИзвор контролора: %s\n" +"\tКашњење: %0.0f μs, подешено %0.0f μs\n" +"\tЗаставице: %s%s%s%s%s%s\n" +"\tСвојства:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360 +#, c-format +msgid "\tPorts:\n" +msgstr "\tПортови:\n" + +#: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366 +#, c-format +msgid "\tActive Port: %s\n" +msgstr "\tАктивни порт: %s\n" + +#: ../src/utils/pactl.c:297 +#, c-format +msgid "Failed to get source information: %s" +msgstr "Неуспешно добављање података о извору: %s" + +#: ../src/utils/pactl.c:313 +#, c-format +msgid "" +"Source #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor of Sink: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Извор #%u\n" +"\tСтање: %s\n" +"\tИме: %s\n" +"\tОпис: %s\n" +"\tУправљачки програм: %s\n" +"\tПараметри узорка: %s\n" +"\tМапа канала: %s\n" +"\tПрипада модулу: %u\n" +"\tИскључен тон: %s\n" +"\tЈачина звука: %s%s%s\n" +"\t баланс %0.2f\n" +"\tГласност баса: %s%s%s\n" +"\tКонтролер сливника: %s\n" +"\tКашњење: %0.0f μs, подешено %0.0f μs\n" +"\tЗаставице: %s%s%s%s%s%s\n" +"\tСвојства:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:345 ../src/utils/pactl.c:401 ../src/utils/pactl.c:436 +#: ../src/utils/pactl.c:473 ../src/utils/pactl.c:532 ../src/utils/pactl.c:533 +#: ../src/utils/pactl.c:543 ../src/utils/pactl.c:587 ../src/utils/pactl.c:588 +#: ../src/utils/pactl.c:594 ../src/utils/pactl.c:637 ../src/utils/pactl.c:638 +#: ../src/utils/pactl.c:645 +msgid "n/a" +msgstr "непознато" + +#: ../src/utils/pactl.c:375 +#, c-format +msgid "Failed to get module information: %s" +msgstr "Неуспешно добављање података о модулу: %s" + +#: ../src/utils/pactl.c:393 +#, c-format +msgid "" +"Module #%u\n" +"\tName: %s\n" +"\tArgument: %s\n" +"\tUsage counter: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Модул #%u\n" +"\tИме: %s\n" +"\tАргумент: %s\n" +"\tБројач коришћења: %s\n" +"\tСвојства:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:412 +#, c-format +msgid "Failed to get client information: %s" +msgstr "Неуспешно добављање података о клијенту: %s" + +#: ../src/utils/pactl.c:430 +#, c-format +msgid "" +"Client #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Клијент #%u\n" +"\tУправљачки програм: %s\n" +"\tПрипада модулу: %s\n" +"\tСвојства:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:447 +#, c-format +msgid "Failed to get card information: %s" +msgstr "Неуспешно добављање података о картици: %s" + +#: ../src/utils/pactl.c:465 +#, c-format +msgid "" +"Card #%u\n" +"\tName: %s\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Картица #%u\n" +"\tИме: %s\n" +"\tУправљачки програм: %s\n" +"\tВласник модула: %s\n" +"\tСвојства:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:479 +#, c-format +msgid "\tProfiles:\n" +msgstr "\tПрофили:\n" + +#: ../src/utils/pactl.c:485 +#, c-format +msgid "\tActive Profile: %s\n" +msgstr "\tАктивни профил: %s\n" + +#: ../src/utils/pactl.c:496 +#, c-format +msgid "Failed to get sink input information: %s" +msgstr "Неуспешно добављање података о улазу сливника: %s" + +#: ../src/utils/pactl.c:515 +#, c-format +msgid "" +"Sink Input #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSink: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tMute: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSink Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Улаз у сливник #%u\n" +"\tУправљачки програм: %s\n" +"\tПрипада модулу: %s\n" +"\tКлијент: %s\n" +"\tСливник: %u\n" +"\tПараметри узорка: %s\n" +"\tМапа канала: %s\n" +"\tИскључен тон: %s\n" +"\tЈачина звука: %s\n" +"\t %s\n" +"\t баланс %0.2f\n" +"\tКашњење бафера: %0.0f μs\n" +"\tКашњење сливника: %0.0f μs\n" +"\tНачин дискретизације: %s\n" +"\tСвојства:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:554 +#, c-format +msgid "Failed to get source output information: %s" +msgstr "Неуспешно добављање података о излазу извора: %s" + +#: ../src/utils/pactl.c:574 +#, c-format +msgid "" +"Source Output #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSource: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSource Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Излаз извора #%u\n" +"\tУправљачки програм: %s\n" +"\tПрипада модулу: %s\n" +"\tКлијент: %s\n" +"\tИзвор: %u\n" +"\tПараметри узорка: %s\n" +"\tМапа канала: %s\n" +"\tКашњење бафера: %0.0f μs\n" +"\tКашњење извора: %0.0f μs\n" +"\tНачин дискретизације: %s\n" +"\tСвојства:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:605 +#, c-format +msgid "Failed to get sample information: %s" +msgstr "Неуспешно добављање података о узорку: %s" + +#: ../src/utils/pactl.c:623 +#, c-format +msgid "" +"Sample #%u\n" +"\tName: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tDuration: %0.1fs\n" +"\tSize: %s\n" +"\tLazy: %s\n" +"\tFilename: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Узорак #%u\n" +"\tИме: %s\n" +"\tПараметри узорка: %s\n" +"\tМапа канала: %s\n" +"\tЈачина звука: %s\n" +"\t %s\n" +"\t баланс %0.2f\n" +"\tДужина: %0.1fs\n" +"\tВеличина: %s\n" +"\tЛењ: %s\n" +"\tИме датотеке: %s\n" +"\tСвојства:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663 +#, c-format +msgid "Failure: %s" +msgstr "Неуспех: %s" + +#: ../src/utils/pactl.c:687 +#, c-format +msgid "Failed to upload sample: %s" +msgstr "Није успело постављање узорка: %s" + +#: ../src/utils/pactl.c:704 +msgid "Premature end of file" +msgstr "Прерани крај датотеке" + +#: ../src/utils/pactl.c:863 +msgid "Got SIGINT, exiting." +msgstr "Добих SIGINT, излазим." + +#: ../src/utils/pactl.c:869 +#, c-format +msgid "" +"%s [options] stat\n" +"%s [options] list\n" +"%s [options] exit\n" +"%s [options] upload-sample FILENAME [NAME]\n" +"%s [options] play-sample NAME [SINK]\n" +"%s [options] remove-sample NAME\n" +"%s [options] move-sink-input SINKINPUT SINK\n" +"%s [options] move-source-output SOURCEOUTPUT SOURCE\n" +"%s [options] load-module NAME [ARGS ...]\n" +"%s [options] unload-module MODULE\n" +"%s [options] suspend-sink SINK 1|0\n" +"%s [options] suspend-source SOURCE 1|0\n" +"%s [options] set-card-profile CARD PROFILE\n" +"%s [options] set-sink-port SINK PORT\n" +"%s [options] set-source-port SOURCE PORT\n" +"%s [options] set-sink-volume SINK VOLUME\n" +"%s [options] set-source-volume SOURCE VOLUME\n" +"%s [options] set-sink-input-volume SINKINPUT VOLUME\n" +"%s [options] set-sink-mute SINK 1|0\n" +"%s [options] set-source-mute SOURCE 1|0\n" +"%s [options] set-sink-input-mute SINKINPUT 1|0\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" +msgstr "" +"%s [опције] stat\n" +"%s [опције] list\n" +"%s [опције] exit\n" +"%s [опције] upload-sample ИМЕДАТОТЕКЕ [ИМЕ]\n" +"%s [опције] play-sample ИМЕ [СЛИВНИК]\n" +"%s [опције] remove-sample ИМЕ\n" +"%s [опције] move-sink-input УЛАЗСЛИВНИКА СЛИВНИК\n" +"%s [опције] move-source-output ИЗЛАЗИЗВОРА ИЗВОР\n" +"%s [опције] load-module ИМЕ [АРГ ...]\n" +"%s [опције] unload-module МОДУЛ\n" +"%s [опције] suspend-sink СЛИВНИК 1|0\n" +"%s [опције] suspend-source ИЗВОР 1|0\n" +"%s [опције] set-card-profile КАРТИЦА ПРОФИЛ\n" +"%s [опције] set-sink-port СЛИВНИК ПОРТ\n" +"%s [опције] set-source-port ИЗВОР ПОРТ\n" +"%s [опције] set-sink-volume СЛИВНИК ЈАЧИНА\n" +"%s [опције] set-source-volume ИЗВОР ЈАЧИНА\n" +"%s [опције] set-sink-input-volume УЛАЗСЛИВНИКА ЈАЧИНА\n" +"%s [опције] set-sink-mute СЛИВНИК 1|0\n" +"%s [опције] set-source-mute ИЗВОР 1|0\n" +"%s [опције] set-sink-input-mute УЛАЗСЛИВНИКА 1|0\n" +"\n" +" -h, --help Прикажи ову помоћ\n" +" --version Прикажи верзију\n" +"\n" +" -s, --server=СЕРВЕР Име сервера на који се треба " +"повезати\n" +" -n, --client-name=ИМЕ Како назвати овог клијента на " +"серверу\n" + +#: ../src/utils/pactl.c:933 +#, c-format +msgid "" +"pactl %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pactl %s\n" +"Компајлирано са libpulse %s\n" +"Повезано са libpulse %s\n" + +#: ../src/utils/pactl.c:979 +msgid "Please specify a sample file to load" +msgstr "Наведите датотеку узорка коју треба учитати" + +#: ../src/utils/pactl.c:992 +msgid "Failed to open sound file." +msgstr "Није успело отварање звучне датотеке." + +#: ../src/utils/pactl.c:1004 +msgid "Warning: Failed to determine sample specification from file." +msgstr "Упозорење: Неуспешно утврђивање параметара узорка из датотеке." + +#: ../src/utils/pactl.c:1014 +msgid "You have to specify a sample name to play" +msgstr "Морате навести име узорка којег желите репродуковати" + +#: ../src/utils/pactl.c:1026 +msgid "You have to specify a sample name to remove" +msgstr "Морате навести име узорка којег желите уклонити" + +#: ../src/utils/pactl.c:1035 +msgid "You have to specify a sink input index and a sink" +msgstr "Морате навести индекс улаза сливника и сливник" + +#: ../src/utils/pactl.c:1045 +msgid "You have to specify a source output index and a source" +msgstr "Морате навести индекс излаза извора и извор" + +#: ../src/utils/pactl.c:1060 +msgid "You have to specify a module name and arguments." +msgstr "Морате навести име и аргументе модула." + +#: ../src/utils/pactl.c:1080 +msgid "You have to specify a module index" +msgstr "Морате навести индекс модула" + +#: ../src/utils/pactl.c:1090 +msgid "" +"You may not specify more than one sink. You have to specify a boolean value." +msgstr "" +"Не можете навести више од једног сливника. Морате навести логичку вредност." + +#: ../src/utils/pactl.c:1103 +msgid "" +"You may not specify more than one source. You have to specify a boolean " +"value." +msgstr "" +"Не можете навести више од једног извора. Морате навести логичку вредност." + +#: ../src/utils/pactl.c:1115 +msgid "You have to specify a card name/index and a profile name" +msgstr "Морате навести име/индекс картице и име профила" + +#: ../src/utils/pactl.c:1126 +msgid "You have to specify a sink name/index and a port name" +msgstr "Морате навести име/индекс сливника и име порта" + +#: ../src/utils/pactl.c:1137 +msgid "You have to specify a source name/index and a port name" +msgstr "Морате навести име/индекс извора и име порта" + +#: ../src/utils/pactl.c:1149 +msgid "You have to specify a sink name/index and a volume" +msgstr "Морате навести име/индекс сливника и јачину" + +#: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171 +#: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209 +#: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248 +msgid "Invalid volume specification" +msgstr "Неисправан параметар јачине" + +#: ../src/utils/pactl.c:1166 +msgid "You have to specify a source name/index and a volume" +msgstr "Морате навести име/индекс извора и јачину" + +#: ../src/utils/pactl.c:1183 +msgid "You have to specify a sink input index and a volume" +msgstr "Морате навести индекс улаза сливника и јачину" + +#: ../src/utils/pactl.c:1188 +msgid "Invalid sink input index" +msgstr "Неисправан индекс улаза сливника" + +#: ../src/utils/pactl.c:1204 +msgid "You have to specify a sink name/index and a mute boolean" +msgstr "Морате навести име/индекс сливника и логичку вредност за искључивање" + +#: ../src/utils/pactl.c:1221 +msgid "You have to specify a source name/index and a mute boolean" +msgstr "Морате навести име/индекс извора и логичку вредност за искључивање" + +#: ../src/utils/pactl.c:1238 +msgid "You have to specify a sink input index and a mute boolean" +msgstr "Морате навести индекс улаза сливника и логичку вредност за искључивање" + +#: ../src/utils/pactl.c:1243 +msgid "Invalid sink input index specification" +msgstr "Неисправан параметар индекса улаза сливника" + +#: ../src/utils/pactl.c:1262 +msgid "No valid command specified." +msgstr "Није наведена исправна наредба." + +#: ../src/utils/pax11publish.c:61 +#, c-format +msgid "" +"%s [-D display] [-S server] [-O sink] [-I source] [-c file] [-d|-e|-i|-r]\n" +"\n" +" -d Show current PulseAudio data attached to X11 display (default)\n" +" -e Export local PulseAudio data to X11 display\n" +" -i Import PulseAudio data from X11 display to local environment " +"variables and cookie file.\n" +" -r Remove PulseAudio data from X11 display\n" +msgstr "" +"%s [-D приказ] [-S сервер] [-O сливник] [-I извор] [-c датотека] [-d|-e|-i|-" +"r]\n" +"\n" +" -d Прикажи тренутне PulseAudio податке закачене за X11 приказ " +"(подразумевано)\n" +" -e Извези локалне PulseAudio податке на X11 приказ\n" +" -i Увези PulseAudio податке са X11 приказа у локалне променљиве окружења " +"и датотеке колачића.\n" +" -r Уклони PulseAudio податке са X11 приказа\n" + +#: ../src/utils/pax11publish.c:94 +#, c-format +msgid "Failed to parse command line.\n" +msgstr "Неуспешно тумачење командне линије.\n" + +#: ../src/utils/pax11publish.c:108 +#, c-format +msgid "Server: %s\n" +msgstr "Сервер: %s\n" + +#: ../src/utils/pax11publish.c:110 +#, c-format +msgid "Source: %s\n" +msgstr "Извор: %s\n" + +#: ../src/utils/pax11publish.c:112 +#, c-format +msgid "Sink: %s\n" +msgstr "Сливник: %s\n" + +#: ../src/utils/pax11publish.c:114 +#, c-format +msgid "Cookie: %s\n" +msgstr "Колачић: %s\n" + +#: ../src/utils/pax11publish.c:132 +#, c-format +msgid "Failed to parse cookie data\n" +msgstr "Неуспешно тумачење података из колачића\n" + +#: ../src/utils/pax11publish.c:137 +#, c-format +msgid "Failed to save cookie data\n" +msgstr "Неуспешно записивање података колачића\n" + +#: ../src/utils/pax11publish.c:152 +#, c-format +msgid "Failed to load client configuration file.\n" +msgstr "Неуспешно учитавање клијентове датотеке подешавања.\n" + +#: ../src/utils/pax11publish.c:157 +#, c-format +msgid "Failed to read environment configuration data.\n" +msgstr "Неуспешно читање података подешавања за окружење.\n" + +#: ../src/utils/pax11publish.c:174 +#, c-format +msgid "Failed to get FQDN.\n" +msgstr "Неуспешно добијање FQDN-а.\n" + +#: ../src/utils/pax11publish.c:194 +#, c-format +msgid "Failed to load cookie data\n" +msgstr "Неуспешно учитавање датотека колачића\n" + +#: ../src/utils/pax11publish.c:211 +#, c-format +msgid "Not yet implemented.\n" +msgstr "Није још имплементирано.\n" + +#: ../src/utils/pacmd.c:69 +msgid "No PulseAudio daemon running, or not running as session daemon." +msgstr "" +"Нема покренутог PulseAudio демона, или се не извршава као демон сесије." + +#: ../src/utils/pacmd.c:74 +#, c-format +msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s" +msgstr "socket(PF_UNIX, SOCK_STREAM, 0): %s" + +#: ../src/utils/pacmd.c:91 +#, c-format +msgid "connect(): %s" +msgstr "connect(): %s" + +#: ../src/utils/pacmd.c:99 +msgid "Failed to kill PulseAudio daemon." +msgstr "Није успело убијање PulseAudio демона." + +#: ../src/utils/pacmd.c:107 +msgid "Daemon not responding." +msgstr "Демон се не одазива." + +#: ../src/utils/pacmd.c:161 +#, c-format +msgid "poll(): %s" +msgstr "poll(): %s" + +#: ../src/utils/pacmd.c:171 ../src/utils/pacmd.c:188 +#, c-format +msgid "read(): %s" +msgstr "read(): %s" + +#: ../src/utils/pacmd.c:207 ../src/utils/pacmd.c:223 +#, c-format +msgid "write(): %s" +msgstr "write(): %s" + +#: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:219 +msgid "Cannot access autospawn lock." +msgstr "Није могуће приступити датотеци закључавања за самоумножавање." + +#: ../src/modules/alsa/alsa-sink.c:530 ../src/modules/alsa/alsa-sink.c:689 +#, c-format +msgid "" +"ALSA woke us up to write new data to the device, but there was actually " +"nothing to write!\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers.\n" +"We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() " +"returned 0 or another value < min_avail." +msgstr "" +"ALSA нас је пробудила да би записала нове податке на уређај, али нема ништа " +"да се запише!\n" +"Ово је највероватније грешка у ALSA управљачком програму „%s“. Пријавите " +"овај проблем програмерима ALSA-е.\n" +"Пробуђени смо са постављеним POLLOUT-ом -- али следећи snd_pcm_avail() је " +"вратио 0 или неку другу вредност мању од min_avail." + +#: ../src/modules/alsa/alsa-source.c:506 ../src/modules/alsa/alsa-source.c:656 +#, c-format +msgid "" +"ALSA woke us up to read new data from the device, but there was actually " +"nothing to read!\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers.\n" +"We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() " +"returned 0 or another value < min_avail." +msgstr "" +"ALSA нас је пробудила да би прочитала нове податке из уређаја, али нема " +"ништа да се прочита!\n" +"Ово је највероватније грешка у ALSA управљачком програму „%s“. Пријавите " +"овај проблем програмерима ALSA-е.\n" +"Пробуђени смо са постављеним POLLIN-ом -- али следећи snd_pcm_avail() је " +"вратио 0 или неку другу вредност мању од min_avail." + +#: ../src/modules/alsa/module-alsa-card.c:152 +#: ../src/modules/bluetooth/module-bluetooth-device.c:2228 +#: ../src/modules/alsa/alsa-mixer.c:2931 +msgid "Off" +msgstr "Искључено" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2184 +msgid "High Fidelity Playback (A2DP)" +msgstr "Репродукција високе тачности (A2DP)" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2198 +msgid "High Fidelity Capture (A2DP)" +msgstr "Снимање високе тачности (A2DP)" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2213 +msgid "Telephony Duplex (HSP/HFP)" +msgstr "Двосмерно телефонирање (HSP/HFP)" + +#: ../src/modules/reserve-wrap.c:151 +msgid "PulseAudio Sound Server" +msgstr "PulseAudio звучни систем" + +#: ../src/modules/module-rygel-media-server.c:569 +#: ../src/modules/module-rygel-media-server.c:583 +msgid "Output Devices" +msgstr "Излазни уређаји" + +#: ../src/modules/module-rygel-media-server.c:570 +#: ../src/modules/module-rygel-media-server.c:584 +msgid "Input Devices" +msgstr "Улазни уређаји" + +#: ../src/modules/module-rygel-media-server.c:774 +msgid "Audio on @HOSTNAME@" +msgstr "Аудио на @HOSTNAME@" + +#: ../src/modules/alsa/alsa-mixer.c:1701 +msgid "Input" +msgstr "Улаз" + +#: ../src/modules/alsa/alsa-mixer.c:1702 +msgid "Docking Station Input" +msgstr "Улаз прикључне станице" + +#: ../src/modules/alsa/alsa-mixer.c:1703 +msgid "Docking Station Microphone" +msgstr "Микрофон прикључне станице" + +#: ../src/modules/alsa/alsa-mixer.c:1704 +msgid "Line-In" +msgstr "Линија у" + +#: ../src/modules/alsa/alsa-mixer.c:1705 +msgid "Microphone" +msgstr "Микрофон" + +#: ../src/modules/alsa/alsa-mixer.c:1706 +msgid "External Microphone" +msgstr "Спољни микрофон" + +#: ../src/modules/alsa/alsa-mixer.c:1707 +msgid "Internal Microphone" +msgstr "Унутрашњи микрофон" + +#: ../src/modules/alsa/alsa-mixer.c:1708 +msgid "Radio" +msgstr "Радио" + +#: ../src/modules/alsa/alsa-mixer.c:1709 +msgid "Video" +msgstr "Видео" + +#: ../src/modules/alsa/alsa-mixer.c:1710 +msgid "Automatic Gain Control" +msgstr "Самостална контрола појачања" + +#: ../src/modules/alsa/alsa-mixer.c:1711 +msgid "No Automatic Gain Control" +msgstr "Без самосталне контроле појачања" + +#: ../src/modules/alsa/alsa-mixer.c:1712 +msgid "Boost" +msgstr "Подизање" + +#: ../src/modules/alsa/alsa-mixer.c:1713 +msgid "No Boost" +msgstr "Без подизања" + +#: ../src/modules/alsa/alsa-mixer.c:1714 +msgid "Amplifier" +msgstr "Појачало" + +#: ../src/modules/alsa/alsa-mixer.c:1715 +msgid "No Amplifier" +msgstr "Без појачала" + +#: ../src/modules/alsa/alsa-mixer.c:1773 +msgid "Analog Input" +msgstr "Аналогни улаз" + +#: ../src/modules/alsa/alsa-mixer.c:1774 +msgid "Analog Microphone" +msgstr "Аналогни микрофон" + +#: ../src/modules/alsa/alsa-mixer.c:1775 +msgid "Analog Line-In" +msgstr "Аналогна линија у" + +#: ../src/modules/alsa/alsa-mixer.c:1776 +msgid "Analog Radio" +msgstr "Аналогни радио" + +#: ../src/modules/alsa/alsa-mixer.c:1777 +msgid "Analog Video" +msgstr "Аналогни видео" + +#: ../src/modules/alsa/alsa-mixer.c:1778 +msgid "Analog Output" +msgstr "Аналогни излаз" + +#: ../src/modules/alsa/alsa-mixer.c:1779 +msgid "Analog Headphones" +msgstr "Аналогне слушалице" + +#: ../src/modules/alsa/alsa-mixer.c:1780 +msgid "Analog Output (LFE)" +msgstr "Аналогни излаз (LFE)" + +#: ../src/modules/alsa/alsa-mixer.c:1781 +msgid "Analog Mono Output" +msgstr "Аналогни моно излаз" + +#: ../src/modules/alsa/alsa-mixer.c:1981 +#, c-format +msgid "%s+%s" +msgstr "%s+%s" + +#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404 +#, c-format +msgid "%s / %s" +msgstr "%s / %s" + +#: ../src/modules/alsa/alsa-mixer.c:2790 +msgid "Analog Mono" +msgstr "Аналогни моно" + +#: ../src/modules/alsa/alsa-mixer.c:2791 +msgid "Analog Stereo" +msgstr "Аналогни стерео" + +#: ../src/modules/alsa/alsa-mixer.c:2792 +msgid "Analog Surround 2.1" +msgstr "Аналогни окружујући 2.1" + +#: ../src/modules/alsa/alsa-mixer.c:2793 +msgid "Analog Surround 3.0" +msgstr "Аналогни окружујући 3.0" + +#: ../src/modules/alsa/alsa-mixer.c:2794 +msgid "Analog Surround 3.1" +msgstr "Аналогни окружујући 3.1" + +#: ../src/modules/alsa/alsa-mixer.c:2795 +msgid "Analog Surround 4.0" +msgstr "Аналогни окружујући 4.0" + +#: ../src/modules/alsa/alsa-mixer.c:2796 +msgid "Analog Surround 4.1" +msgstr "Аналогни окружујући 4.1" + +#: ../src/modules/alsa/alsa-mixer.c:2797 +msgid "Analog Surround 5.0" +msgstr "Аналогни окружујући 5.0" + +#: ../src/modules/alsa/alsa-mixer.c:2798 +msgid "Analog Surround 5.1" +msgstr "Аналогни окружујући 5.1" + +#: ../src/modules/alsa/alsa-mixer.c:2799 +msgid "Analog Surround 6.0" +msgstr "Аналогни окружујући 6.0" + +#: ../src/modules/alsa/alsa-mixer.c:2800 +msgid "Analog Surround 6.1" +msgstr "Аналогни окружујући 6.1" + +#: ../src/modules/alsa/alsa-mixer.c:2801 +msgid "Analog Surround 7.0" +msgstr "Аналогни окружујући 7.0" + +#: ../src/modules/alsa/alsa-mixer.c:2802 +msgid "Analog Surround 7.1" +msgstr "Аналогни окружујући 7.1" + +#: ../src/modules/alsa/alsa-mixer.c:2803 +msgid "Digital Stereo (IEC958)" +msgstr "Дигитални стерео (IEC958)" + +#: ../src/modules/alsa/alsa-mixer.c:2804 +msgid "Digital Surround 4.0 (IEC958)" +msgstr "Дигитални окружујући 4.0 (IEC958)" + +#: ../src/modules/alsa/alsa-mixer.c:2805 +msgid "Digital Surround 4.0 (IEC958/AC3)" +msgstr "Дигитални окружујући 4.0 (IEC958/AC3)" + +#: ../src/modules/alsa/alsa-mixer.c:2806 +msgid "Digital Surround 5.1 (IEC958/AC3)" +msgstr "Дигитални окружујући 5.1 (IEC958/AC3)" + +#: ../src/modules/alsa/alsa-mixer.c:2807 +msgid "Digital Stereo (HDMI)" +msgstr "Дигитални стерео (HDMI)" + +#: ../src/modules/alsa/alsa-mixer.c:2928 +msgid "Analog Mono Duplex" +msgstr "Двосмерни аналогни моно" + +#: ../src/modules/alsa/alsa-mixer.c:2929 +msgid "Analog Stereo Duplex" +msgstr "Двосмерни аналогни стерео" + +#: ../src/modules/alsa/alsa-mixer.c:2930 +msgid "Digital Stereo Duplex (IEC958)" +msgstr "Двосмерни дигитални стерео (IEC958)" diff --git a/po/sr@latin.po b/po/sr@latin.po new file mode 100644 index 0000000..45e83d6 --- /dev/null +++ b/po/sr@latin.po @@ -0,0 +1,2582 @@ +# Serbian(Latin) translations for pulseaudio +# Copyright (C) 2006 Lennart Poettering +# This file is distributed under the same license as the pulseaudio package. +# Igor Miletic (Igor Miletić) , 2009. +# Miloš Komarčević , 2009. +# +msgid "" +msgstr "" +"Project-Id-Version: pulseaudio\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-10-30 10:22+0000\n" +"PO-Revision-Date: 2009-10-30 22:51+0100\n" +"Last-Translator: Miloš Komarčević \n" +"Language-Team: Serbian (sr) \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" +"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" + +#: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629 +#, c-format +msgid "%s %s" +msgstr "%s %s" + +#: ../src/modules/alsa/alsa-util.c:1106 +#, c-format +msgid "" +"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu " +"ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_avail() je vratio vrednost koja je neobično velika: %lu bajtova (%lu " +"ms).\n" +"Ovo je najverovatnije greška u „%s“ ALSA upravljačkom programu. Prijavite " +"ovaj problem ALSA programerima." + +#: ../src/modules/alsa/alsa-util.c:1147 +#, c-format +msgid "" +"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%" +"lu ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_delay() je vratio vrednost koja je neobično velika: %li bajtova (%s%" +"lu ms).\n" +"Ovo je najverovatnije greška u „%s“ ALSA upravljačkom programu. Prijavite " +"ovaj problem ALSA programerima." + +#: ../src/modules/alsa/alsa-util.c:1194 +#, c-format +msgid "" +"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes " +"(%lu ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_mmap_begin() je vratio vrednost koja je neobično velika: %lu " +"bajtova (%lu ms).\n" +"Ovo je najverovatnije greška u „%s“ ALSA upravljačkom programu. Prijavite " +"ovaj problem ALSA programerima." + +#: ../src/modules/module-always-sink.c:39 +msgid "Always keeps at least one sink loaded even if it's a null one" +msgstr "Uvek održava barem jedan slivnik opterećenim čak i kada je prazan" + +#: ../src/modules/module-always-sink.c:83 +msgid "Dummy Output" +msgstr "Lažan izlaz" + +#: ../src/modules/module-ladspa-sink.c:49 +msgid "Virtual LADSPA sink" +msgstr "Virtuelni LADSPA slivnik" + +#: ../src/modules/module-ladspa-sink.c:53 +msgid "" +"sink_name= sink_properties= " +"master= format= rate= " +"channels= channel_map= plugin= label= control=" +msgstr "" +"sink_name= sink_properties= master= format= rate= channels= channel_map= plugin= label= control=" + +#: ../src/modules/module-null-sink.c:55 +msgid "Clocked NULL sink" +msgstr "Uzorak NULL slivnika" + +#: ../src/modules/module-null-sink.c:291 +msgid "Null Output" +msgstr "Prazan izlaz" + +#: ../src/pulsecore/sink.c:2613 +msgid "Internal Audio" +msgstr "Unutrašnji zvuk" + +#: ../src/pulsecore/sink.c:2618 +msgid "Modem" +msgstr "Modem" + +#: ../src/daemon/ltdl-bind-now.c:124 +msgid "Failed to find original lt_dlopen loader." +msgstr "Neuspešna pretraga za originalnim lt_dlopen učitavačem." + +#: ../src/daemon/ltdl-bind-now.c:129 +msgid "Failed to allocate new dl loader." +msgstr "Neuspešno smeštanje novog dl učitavača." + +#: ../src/daemon/ltdl-bind-now.c:142 +msgid "Failed to add bind-now-loader." +msgstr "Neuspešno dodavanje „poveži odmah“ učitavača." + +#: ../src/daemon/main.c:141 +#, c-format +msgid "Got signal %s." +msgstr "Dobih signal %s." + +#: ../src/daemon/main.c:168 +msgid "Exiting." +msgstr "Napuštam." + +#: ../src/daemon/main.c:186 +#, c-format +msgid "Failed to find user '%s'." +msgstr "Ne mogu naći korisnika „%s“." + +#: ../src/daemon/main.c:191 +#, c-format +msgid "Failed to find group '%s'." +msgstr "Ne mogu naći grupu „%s“." + +#: ../src/daemon/main.c:195 +#, c-format +msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)." +msgstr "Nađeni su korisnik „%s“ (UID %lu) i grupa „%s“ (GID %lu)." + +#: ../src/daemon/main.c:200 +#, c-format +msgid "GID of user '%s' and of group '%s' don't match." +msgstr "GID korisnika „%s“ se ne poklapa sa grupom „%s“." + +#: ../src/daemon/main.c:205 +#, c-format +msgid "Home directory of user '%s' is not '%s', ignoring." +msgstr "Lični direktorijum korisnika „%s“ nije „%s“, zanemarujem." + +#: ../src/daemon/main.c:208 ../src/daemon/main.c:213 +#, c-format +msgid "Failed to create '%s': %s" +msgstr "Neuspešno pravljenje „%s“: %s" + +#: ../src/daemon/main.c:220 +#, c-format +msgid "Failed to change group list: %s" +msgstr "Neuspešna promena grupnog spiska: %s" + +#: ../src/daemon/main.c:236 +#, c-format +msgid "Failed to change GID: %s" +msgstr "Neuspešna promena GID-a: %s" + +#: ../src/daemon/main.c:252 +#, c-format +msgid "Failed to change UID: %s" +msgstr "Neuspešna promena UID-a: %s" + +#: ../src/daemon/main.c:271 +msgid "Successfully dropped root privileges." +msgstr "Uspešno odbačena root ovlašćenja." + +#: ../src/daemon/main.c:279 +msgid "System wide mode unsupported on this platform." +msgstr "Režim za čitav sistem nije podržan na ovoj platformi." + +#: ../src/daemon/main.c:297 +#, c-format +msgid "setrlimit(%s, (%u, %u)) failed: %s" +msgstr "setrlimit(%s, (%u, %u)) nije uspelo: %s" + +#: ../src/daemon/main.c:474 +msgid "Failed to parse command line." +msgstr "Neuspešno tumačenje komandne linije." + +#: ../src/daemon/main.c:541 +msgid "Daemon not running" +msgstr "Demon nije pokrenut" + +#: ../src/daemon/main.c:543 +#, c-format +msgid "Daemon running as PID %u" +msgstr "Demon je pokrenut sa PID-om %u" + +#: ../src/daemon/main.c:553 +#, c-format +msgid "Failed to kill daemon: %s" +msgstr "Neuspešno ubijanje demona: %s" + +#: ../src/daemon/main.c:571 +msgid "" +"This program is not intended to be run as root (unless --system is " +"specified)." +msgstr "" +"Nije nameravano da se ovaj program pokreće iz root naloga (osim u slučaju " +"kada je --system navedeno)" + +#: ../src/daemon/main.c:573 +msgid "Root privileges required." +msgstr "Potrebna su root ovlašćenja." + +#: ../src/daemon/main.c:578 +msgid "--start not supported for system instances." +msgstr "--start nije podržano za sistemske primerke." + +#: ../src/daemon/main.c:583 +msgid "Running in system mode, but --disallow-exit not set!" +msgstr "Pokrenuto u sistemskom režimu, ali --disallow-exit nije postavljeno!" + +#: ../src/daemon/main.c:586 +msgid "Running in system mode, but --disallow-module-loading not set!" +msgstr "" +"Pokrenuto u sistemskom režimu, ali --disallow-module-loading nije " +"postavljeno!" + +#: ../src/daemon/main.c:589 +msgid "Running in system mode, forcibly disabling SHM mode!" +msgstr "Pokrenuto u sistemskom režimu, prisilno onemogućujem SHM režim!" + +#: ../src/daemon/main.c:594 +msgid "Running in system mode, forcibly disabling exit idle time!" +msgstr "" +"Pokrenuto u sistemskom režimu, prisilno onemogućujem gašenje posle određenog " +"vremena mirovanja!" + +#: ../src/daemon/main.c:621 +msgid "Failed to acquire stdio." +msgstr "Neuspešno pronalaženje standardnog ulaza/izlaza." + +#: ../src/daemon/main.c:627 +#, c-format +msgid "pipe failed: %s" +msgstr "Neuspešno puštanje podataka kroz cev: %s" + +#: ../src/daemon/main.c:632 +#, c-format +msgid "fork() failed: %s" +msgstr "Neuspela funkcija fork(): %s" + +#: ../src/daemon/main.c:646 ../src/utils/pacat.c:508 +#, c-format +msgid "read() failed: %s" +msgstr "Neuspela funkcija read(): %s" + +#: ../src/daemon/main.c:652 +msgid "Daemon startup failed." +msgstr "Neuspešno pokretanje demona." + +#: ../src/daemon/main.c:654 +msgid "Daemon startup successful." +msgstr "Demon uspešno pokrenut." + +#: ../src/daemon/main.c:731 +#, c-format +msgid "This is PulseAudio %s" +msgstr "Ovo je PulseAudio %s" + +#: ../src/daemon/main.c:732 +#, c-format +msgid "Compilation host: %s" +msgstr "Domaćin kompajliranja: %s" + +#: ../src/daemon/main.c:733 +#, c-format +msgid "Compilation CFLAGS: %s" +msgstr "CFLAGS kompajliranja: %s" + +#: ../src/daemon/main.c:736 +#, c-format +msgid "Running on host: %s" +msgstr "Pokrenut na domaćinu: %s" + +#: ../src/daemon/main.c:739 +#, c-format +msgid "Found %u CPUs." +msgstr "Našao %u procesor(a)" + +#: ../src/daemon/main.c:741 +#, c-format +msgid "Page size is %lu bytes" +msgstr "Veličina stranice je %lu bajtova" + +#: ../src/daemon/main.c:744 +msgid "Compiled with Valgrind support: yes" +msgstr "Kompajlirano sa podrškom za Valgrind: da" + +#: ../src/daemon/main.c:746 +msgid "Compiled with Valgrind support: no" +msgstr "Kompajlirano sa podrškom za Valgrind: ne" + +#: ../src/daemon/main.c:749 +#, c-format +msgid "Running in valgrind mode: %s" +msgstr "Pokrenut u Valgrind režimu: %s" + +#: ../src/daemon/main.c:752 +msgid "Optimized build: yes" +msgstr "Optimizovana izgradnja: da" + +#: ../src/daemon/main.c:754 +msgid "Optimized build: no" +msgstr "Optimizovana izgradnja: ne" + +#: ../src/daemon/main.c:758 +msgid "NDEBUG defined, all asserts disabled." +msgstr "NDEBUG definisan, sva obaveštenja isključena." + +#: ../src/daemon/main.c:760 +msgid "FASTPATH defined, only fast path asserts disabled." +msgstr "FASTPATH definisan, samo obaveštenja brze putanje isključena." + +#: ../src/daemon/main.c:762 +msgid "All asserts enabled." +msgstr "Sva obaveštenja omogućena." + +#: ../src/daemon/main.c:766 +msgid "Failed to get machine ID" +msgstr "Neuspešno dobavljanje IB mašine" + +#: ../src/daemon/main.c:769 +#, c-format +msgid "Machine ID is %s." +msgstr "IB mašine je %s." + +#: ../src/daemon/main.c:773 +#, c-format +msgid "Session ID is %s." +msgstr "IB sesije je %s." + +#: ../src/daemon/main.c:779 +#, c-format +msgid "Using runtime directory %s." +msgstr "Koristi se %s izvršni direktorijum." + +#: ../src/daemon/main.c:784 +#, c-format +msgid "Using state directory %s." +msgstr "Koristi se %s direktorijum stanja." + +#: ../src/daemon/main.c:787 +#, c-format +msgid "Using modules directory %s." +msgstr "Koristi se %s direktorijum modula." + +#: ../src/daemon/main.c:789 +#, c-format +msgid "Running in system mode: %s" +msgstr "Pokrenuto u sistemskom režimu: %s" + +#: ../src/daemon/main.c:792 +msgid "" +"OK, so you are running PA in system mode. Please note that you most likely " +"shouldn't be doing that.\n" +"If you do it nonetheless then it's your own fault if things don't work as " +"expected.\n" +"Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an " +"explanation why system mode is usually a bad idea." +msgstr "" +"U redu, znači izvršavate PA u sistemskom režimu. Primite k znanju da to " +"verovatno ne bi trebalo da radite.\n" +"Ako to svejedno činite onda je vaša krivica ako stvari ne rade onako kako se " +"očekuje.\n" +"Pročitajte http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode radi " +"objašnjenja zašto je sistemski režim obično loša ideja." + +#: ../src/daemon/main.c:809 +msgid "pa_pid_file_create() failed." +msgstr "Neuspela funkcija pa_pid_file_create()." + +#: ../src/daemon/main.c:819 +msgid "Fresh high-resolution timers available! Bon appetit!" +msgstr "Dostupni su novi brojači visoke rezolucije! Prijatno!" + +#: ../src/daemon/main.c:821 +msgid "" +"Dude, your kernel stinks! The chef's recommendation today is Linux with high-" +"resolution timers enabled!" +msgstr "" +"Vaše jezgro nije dobro podešeno za pulseaudio! Preporučuje Vam se da " +"koristite Linux jezgro sa omogućenim brojačima visoke rezolucije." + +#: ../src/daemon/main.c:844 +msgid "pa_core_new() failed." +msgstr "Neuspela funkcija pa_core_new()." + +#: ../src/daemon/main.c:904 +msgid "Failed to initialize daemon." +msgstr "Neuspešno pokretanje demona." + +#: ../src/daemon/main.c:909 +msgid "Daemon startup without any loaded modules, refusing to work." +msgstr "Demon je pokrenut bez ijednog učitanog modula, odbija da radi." + +#: ../src/daemon/main.c:926 +msgid "Daemon startup complete." +msgstr "Pokretanje demona uspešno." + +#: ../src/daemon/main.c:932 +msgid "Daemon shutdown initiated." +msgstr "Pokrenuto gašenje demona." + +#: ../src/daemon/main.c:954 +msgid "Daemon terminated." +msgstr "Rad demona je prekinut." + +#: ../src/daemon/cmdline.c:115 +#, c-format +msgid "" +"%s [options]\n" +"\n" +"COMMANDS:\n" +" -h, --help Show this help\n" +" --version Show version\n" +" --dump-conf Dump default configuration\n" +" --dump-modules Dump list of available modules\n" +" --dump-resample-methods Dump available resample methods\n" +" --cleanup-shm Cleanup stale shared memory " +"segments\n" +" --start Start the daemon if it is not " +"running\n" +" -k --kill Kill a running daemon\n" +" --check Check for a running daemon (only " +"returns exit code)\n" +"\n" +"OPTIONS:\n" +" --system[=BOOL] Run as system-wide instance\n" +" -D, --daemonize[=BOOL] Daemonize after startup\n" +" --fail[=BOOL] Quit when startup fails\n" +" --high-priority[=BOOL] Try to set high nice level\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_NICE)\n" +" --realtime[=BOOL] Try to enable realtime scheduling\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_RTPRIO)\n" +" --disallow-module-loading[=BOOL] Disallow module user requested " +"module\n" +" loading/unloading after startup\n" +" --disallow-exit[=BOOL] Disallow user requested exit\n" +" --exit-idle-time=SECS Terminate the daemon when idle and " +"this\n" +" time passed\n" +" --module-idle-time=SECS Unload autoloaded modules when idle " +"and\n" +" this time passed\n" +" --scache-idle-time=SECS Unload autoloaded samples when idle " +"and\n" +" this time passed\n" +" --log-level[=LEVEL] Increase or set verbosity level\n" +" -v Increase the verbosity level\n" +" --log-target={auto,syslog,stderr} Specify the log target\n" +" --log-meta[=BOOL] Include code location in log " +"messages\n" +" --log-time[=BOOL] Include timestamps in log messages\n" +" --log-backtrace=FRAMES Include a backtrace in log messages\n" +" -p, --dl-search-path=PATH Set the search path for dynamic " +"shared\n" +" objects (plugins)\n" +" --resample-method=METHOD Use the specified resampling method\n" +" (See --dump-resample-methods for\n" +" possible values)\n" +" --use-pid-file[=BOOL] Create a PID file\n" +" --no-cpu-limit[=BOOL] Do not install CPU load limiter on\n" +" platforms that support it.\n" +" --disable-shm[=BOOL] Disable shared memory support.\n" +"\n" +"STARTUP SCRIPT:\n" +" -L, --load=\"MODULE ARGUMENTS\" Load the specified plugin module " +"with\n" +" the specified argument\n" +" -F, --file=FILENAME Run the specified script\n" +" -C Open a command line on the running " +"TTY\n" +" after startup\n" +"\n" +" -n Don't load default script file\n" +msgstr "" +"%s [opcije]\n" +"\n" +"NAREDBE:\n" +" -h, --help Prikaži ovu pomoć\n" +" --version Prikaži verziju\n" +" --dump-conf Ispiši podrazumevana podešavanja\n" +" --dump-modules Ispiši spisak dostupnih modula\n" +" --dump-resample-methods Ispiši dostupne vrednosti " +"diskretizacije\n" +" --cleanup-shm Očisti bajate delove deljene " +"memorije\n" +" --start Pokreni demon ako već nije pokrenut\n" +" -k --kill Ubij pokrenuti demon\n" +" --check Proveri postojanje pokrenutog demona " +"(vraća samo izlazni kȏd)\n" +"\n" +"OPCIJE:\n" +" --system[=logička vrednost] Pokreni kao sistemski primerak\n" +" -D, --daemonize[=log. vrednost] Pokreni u pozadini\n" +" --fail[=log. vrednost] Izađi posle neuspešnog pokretanja\n" +" --high-priority[=log. vrednost] Pokušaj postaviti visokoprioritetno " +"raspoređivanje\n" +" (dostupno samo rootu, ili preko SUID-" +"a ili\n" +" sa povišenim RLIMIT_NICE nivoom)\n" +" --realtime[=log. vrednost] Pokušaj omogućiti stvarnovremensko " +"raspoređivanje\n" +" (dostupno samo rootu, ili preko SUID-" +"a ili\n" +" sa povišenim RLIMIT_RTPRIO nivoom)\n" +" --disallow-module-loading[=log.] Ne dozvoljavaj učitavanje/uklanjanje " +"modula\n" +" na korisnički zahtev posle " +"pokretanja\n" +" --disallow-exit[=log. vrednost] Ne dozvoljavaj izlaz na korisnički " +"zahtev\n" +" --exit-idle-time=SEKUNDI Prekini rad demona posle mirovanja\n" +" od ovoliko sekundi\n" +" --module-idle-time=SEKUNDI Ukloni samoučitane module posle " +"mirovanja\n" +" od ovoliko sekundi\n" +" --scache-idle-time=SEKUNDI Ukloni samoučitane primerke posle " +"mirovanja\n" +" od ovoliko sekundi\n" +" --log-level[=NIVO] Povećaj ili postavi nivo opširnosti\n" +" -v Povećaj nivo opširnosti\n" +" --log-target={auto,syslog,stderr} Navedi ciljni dnevnik\n" +" --log-meta[=log. vrednost] Uključi mesto u kȏdu u porukama " +"dnevnika\n" +" --log-time[=log. vrednost] Uključi vreme u porukama dnevnika\n" +" --log-backtrace=FRAMES Uključi tragove u porukama dnevnika\n" +" -p, --dl-search-path=PUTANJA Postavi putanju pretrage za " +"dinamički deljene\n" +" objekte (dodaci)\n" +" --resample-method=NAČIN Koristi navedeni način " +"diskretizacije\n" +" (Pogledaj --dump-resample-methods " +"za\n" +" moguće vrednosti)\n" +" --use-pid-file[=log. vrednost] Napravi PID datoteku\n" +" --no-cpu-limit[=log. vrednost] Nemoj instalirati ograničavanje " +"procesorskog\n" +" tereta na platformama koje to " +"podržavaju.\n" +" --disable-shm[=log. vrednost] Onemogući podršku za deljenu " +"memoriju.\n" +"\n" +"STARTUP SCRIPT:\n" +" -L, --load=\"PARAMETRI MODULA\" Učitaj navedeni modul dodatka sa\n" +" navedenim parametrima\n" +" -F, --file=IMEDATOTEKE Pokreni navedenu skriptu\n" +" -C Otvori komandnu liniju na pokrenutom " +"TTY-u\n" +" posle pokretanja\n" +"\n" +" -n Ne učitavaj podrazumevanu datoteku " +"skripte.\n" + +#: ../src/daemon/cmdline.c:247 +msgid "--daemonize expects boolean argument" +msgstr "--daemonize očekuje logički argument" + +#: ../src/daemon/cmdline.c:254 +msgid "--fail expects boolean argument" +msgstr "--fail očekuje logički argument" + +#: ../src/daemon/cmdline.c:264 +msgid "" +"--log-level expects log level argument (either numeric in range 0..4 or one " +"of debug, info, notice, warn, error)." +msgstr "" +"--log-level očekuje argument za nivo zapisa (ili numerička vrednost u opsegu " +"0..4 ili jedno od debug, info, notice, warn, error)." + +#: ../src/daemon/cmdline.c:276 +msgid "--high-priority expects boolean argument" +msgstr "--high-priority očekuje logički argument" + +#: ../src/daemon/cmdline.c:283 +msgid "--realtime expects boolean argument" +msgstr "--realtime očekuje logički argument" + +#: ../src/daemon/cmdline.c:290 +msgid "--disallow-module-loading expects boolean argument" +msgstr "--disallow-module-loading očekuje logički argument" + +#: ../src/daemon/cmdline.c:297 +msgid "--disallow-exit expects boolean argument" +msgstr "--disallow-exit očekuje logički argument" + +#: ../src/daemon/cmdline.c:304 +msgid "--use-pid-file expects boolean argument" +msgstr "--use-pid-file očekuje logički argument" + +#: ../src/daemon/cmdline.c:321 +msgid "Invalid log target: use either 'syslog', 'stderr' or 'auto'." +msgstr "" +"Neispravan ciljni dnevnik: koristite jedno od „syslog“, „stderr“ ili „auto“." + +#: ../src/daemon/cmdline.c:328 +msgid "--log-time expects boolean argument" +msgstr "--log-time očekuje logički argument" + +#: ../src/daemon/cmdline.c:335 +msgid "--log-meta expects boolean argument" +msgstr "--log-meta očekuje logički argument" + +#: ../src/daemon/cmdline.c:354 +#, c-format +msgid "Invalid resample method '%s'." +msgstr "Neispravan način diskretizacije „%s“." + +#: ../src/daemon/cmdline.c:361 +msgid "--system expects boolean argument" +msgstr "--system očekuje logički argument" + +#: ../src/daemon/cmdline.c:368 +msgid "--no-cpu-limit expects boolean argument" +msgstr "--no-cpu-limit očekuje logički argument" + +#: ../src/daemon/cmdline.c:375 +msgid "--disable-shm expects boolean argument" +msgstr "--disable-shm očekuje logički argument" + +#: ../src/daemon/dumpmodules.c:60 +#, c-format +msgid "Name: %s\n" +msgstr "Ime: %s\n" + +#: ../src/daemon/dumpmodules.c:63 +#, c-format +msgid "No module information available\n" +msgstr "Podaci o modulu nisu dostupni\n" + +#: ../src/daemon/dumpmodules.c:66 +#, c-format +msgid "Version: %s\n" +msgstr "Verzija: %s\n" + +#: ../src/daemon/dumpmodules.c:68 +#, c-format +msgid "Description: %s\n" +msgstr "Opis: %s\n" + +#: ../src/daemon/dumpmodules.c:70 +#, c-format +msgid "Author: %s\n" +msgstr "Autor: %s\n" + +#: ../src/daemon/dumpmodules.c:72 +#, c-format +msgid "Usage: %s\n" +msgstr "Upotreba: %s\n" + +#: ../src/daemon/dumpmodules.c:73 +#, c-format +msgid "Load Once: %s\n" +msgstr "Učitaj jednom: %s\n" + +#: ../src/daemon/dumpmodules.c:75 +#, c-format +msgid "DEPRECATION WARNING: %s\n" +msgstr "UPOZORENJE O PREVAZILAŽENJU: %s\n" + +#: ../src/daemon/dumpmodules.c:79 +#, c-format +msgid "Path: %s\n" +msgstr "Putanja: %s\n" + +#: ../src/daemon/daemon-conf.c:232 +#, c-format +msgid "[%s:%u] Invalid log target '%s'." +msgstr "[%s:%u] Neispravan ciljni dnevnik „%s“." + +#: ../src/daemon/daemon-conf.c:248 +#, c-format +msgid "[%s:%u] Invalid log level '%s'." +msgstr "[%s:%u] Neispravan nivo opširnosti u dnevniku „%s“." + +#: ../src/daemon/daemon-conf.c:264 +#, c-format +msgid "[%s:%u] Invalid resample method '%s'." +msgstr "[%s:%u] Neispravan način diskretizacije „%s“." + +#: ../src/daemon/daemon-conf.c:287 +#, c-format +msgid "[%s:%u] Invalid rlimit '%s'." +msgstr "[%s:%u] Neispravan rlimit „%s“." + +#: ../src/daemon/daemon-conf.c:294 +#, c-format +msgid "[%s:%u] rlimit not supported on this platform." +msgstr "[%s:%u] rlimit nije podržan na ovoj platformi." + +#: ../src/daemon/daemon-conf.c:310 +#, c-format +msgid "[%s:%u] Invalid sample format '%s'." +msgstr "[%s:%u] Neispravan format uzorka „%s“." + +#: ../src/daemon/daemon-conf.c:328 +#, c-format +msgid "[%s:%u] Invalid sample rate '%s'." +msgstr "[%s:%u] Neispravna učestanost diskretizacije „%s“." + +#: ../src/daemon/daemon-conf.c:352 +#, c-format +msgid "[%s:%u] Invalid sample channels '%s'." +msgstr "[%s:%u] Neispravni kanali uzorka „%s“." + +#: ../src/daemon/daemon-conf.c:370 +#, c-format +msgid "[%s:%u] Invalid channel map '%s'." +msgstr "[%s:%u] Neispravna mapa kanala „%s“." + +#: ../src/daemon/daemon-conf.c:388 +#, c-format +msgid "[%s:%u] Invalid number of fragments '%s'." +msgstr "[%s:%u] Neispravan broj odlomaka „%s“." + +#: ../src/daemon/daemon-conf.c:406 +#, c-format +msgid "[%s:%u] Invalid fragment size '%s'." +msgstr "[%s:%u] Neispravna veličina odlomka „%s“." + +#: ../src/daemon/daemon-conf.c:424 +#, c-format +msgid "[%s:%u] Invalid nice level '%s'." +msgstr "[%s:%u] Neispravan nivo prioriteta „%s“." + +#: ../src/daemon/daemon-conf.c:546 +#, c-format +msgid "Failed to open configuration file: %s" +msgstr "Neuspelo otvaranje datoteke podešavanja: %s" + +#: ../src/daemon/daemon-conf.c:562 +msgid "" +"The specified default channel map has a different number of channels than " +"the specified default number of channels." +msgstr "" +"Navedena mapa kanala ima nema isti broj kanala kao što je navedeno u " +"podrazumevanom broju kanala." + +#: ../src/daemon/daemon-conf.c:638 +#, c-format +msgid "### Read from configuration file: %s ###\n" +msgstr "### Pročitaj iz datoteke podešavanja: %s ###\n" + +#: ../src/daemon/caps.c:62 +msgid "Cleaning up privileges." +msgstr "Čistim povlastice." + +#: ../src/daemon/pulseaudio.desktop.in.h:1 +msgid "PulseAudio Sound System" +msgstr "PulseAudio zvučni sistem" + +#: ../src/daemon/pulseaudio.desktop.in.h:2 +msgid "Start the PulseAudio Sound System" +msgstr "Pokreni PulseAudio zvučni sistem" + +#: ../src/pulse/channelmap.c:105 ../src/pulse/channelmap.c:757 +msgid "Mono" +msgstr "Mono" + +#: ../src/pulse/channelmap.c:107 +msgid "Front Center" +msgstr "Prednji centralni" + +#: ../src/pulse/channelmap.c:108 +msgid "Front Left" +msgstr "Prednji levi" + +#: ../src/pulse/channelmap.c:109 +msgid "Front Right" +msgstr "Prednji desni" + +#: ../src/pulse/channelmap.c:111 +msgid "Rear Center" +msgstr "Pozadinski centralni" + +#: ../src/pulse/channelmap.c:112 +msgid "Rear Left" +msgstr "Pozadinski levi" + +#: ../src/pulse/channelmap.c:113 +msgid "Rear Right" +msgstr "Pozadinski desni" + +#: ../src/pulse/channelmap.c:115 +msgid "Low Frequency Emmiter" +msgstr "Zvučnik za niske frekvencije" + +#: ../src/pulse/channelmap.c:117 +msgid "Front Left-of-center" +msgstr "Prednji levo od centra" + +#: ../src/pulse/channelmap.c:118 +msgid "Front Right-of-center" +msgstr "Prednji desno od centra" + +#: ../src/pulse/channelmap.c:120 +msgid "Side Left" +msgstr "Leva strana" + +#: ../src/pulse/channelmap.c:121 +msgid "Side Right" +msgstr "Desna strana" + +#: ../src/pulse/channelmap.c:123 +msgid "Auxiliary 0" +msgstr "Sporedni 0" + +#: ../src/pulse/channelmap.c:124 +msgid "Auxiliary 1" +msgstr "Sporedni 1" + +#: ../src/pulse/channelmap.c:125 +msgid "Auxiliary 2" +msgstr "Sporedni 2" + +#: ../src/pulse/channelmap.c:126 +msgid "Auxiliary 3" +msgstr "Sporedni 3" + +#: ../src/pulse/channelmap.c:127 +msgid "Auxiliary 4" +msgstr "Sporedni 4" + +#: ../src/pulse/channelmap.c:128 +msgid "Auxiliary 5" +msgstr "Sporedni 5" + +#: ../src/pulse/channelmap.c:129 +msgid "Auxiliary 6" +msgstr "Sporedni 6" + +#: ../src/pulse/channelmap.c:130 +msgid "Auxiliary 7" +msgstr "Sporedni 7" + +#: ../src/pulse/channelmap.c:131 +msgid "Auxiliary 8" +msgstr "Sporedni 8" + +#: ../src/pulse/channelmap.c:132 +msgid "Auxiliary 9" +msgstr "Sporedni 9" + +#: ../src/pulse/channelmap.c:133 +msgid "Auxiliary 10" +msgstr "Sporedni 10" + +#: ../src/pulse/channelmap.c:134 +msgid "Auxiliary 11" +msgstr "Sporedni 11" + +#: ../src/pulse/channelmap.c:135 +msgid "Auxiliary 12" +msgstr "Sporedni 12" + +#: ../src/pulse/channelmap.c:136 +msgid "Auxiliary 13" +msgstr "Sporedni 13" + +#: ../src/pulse/channelmap.c:137 +msgid "Auxiliary 14" +msgstr "Sporedni 14" + +#: ../src/pulse/channelmap.c:138 +msgid "Auxiliary 15" +msgstr "Sporedni 15" + +#: ../src/pulse/channelmap.c:139 +msgid "Auxiliary 16" +msgstr "Sporedni 16" + +#: ../src/pulse/channelmap.c:140 +msgid "Auxiliary 17" +msgstr "Sporedni 17" + +#: ../src/pulse/channelmap.c:141 +msgid "Auxiliary 18" +msgstr "Sporedni 18" + +#: ../src/pulse/channelmap.c:142 +msgid "Auxiliary 19" +msgstr "Sporedni 19" + +#: ../src/pulse/channelmap.c:143 +msgid "Auxiliary 20" +msgstr "Sporedni 20" + +#: ../src/pulse/channelmap.c:144 +msgid "Auxiliary 21" +msgstr "Sporedni 21" + +#: ../src/pulse/channelmap.c:145 +msgid "Auxiliary 22" +msgstr "Sporedni 22" + +#: ../src/pulse/channelmap.c:146 +msgid "Auxiliary 23" +msgstr "Sporedni 23" + +#: ../src/pulse/channelmap.c:147 +msgid "Auxiliary 24" +msgstr "Sporedni 024" + +#: ../src/pulse/channelmap.c:148 +msgid "Auxiliary 25" +msgstr "Sporedni 25" + +#: ../src/pulse/channelmap.c:149 +msgid "Auxiliary 26" +msgstr "Sporedni 26" + +#: ../src/pulse/channelmap.c:150 +msgid "Auxiliary 27" +msgstr "Sporedni 27" + +#: ../src/pulse/channelmap.c:151 +msgid "Auxiliary 28" +msgstr "Sporedni 28" + +#: ../src/pulse/channelmap.c:152 +msgid "Auxiliary 29" +msgstr "Sporedni 29" + +#: ../src/pulse/channelmap.c:153 +msgid "Auxiliary 30" +msgstr "Sporedni 30" + +#: ../src/pulse/channelmap.c:154 +msgid "Auxiliary 31" +msgstr "Sporedni 31" + +#: ../src/pulse/channelmap.c:156 +msgid "Top Center" +msgstr "Gornji centralni" + +#: ../src/pulse/channelmap.c:158 +msgid "Top Front Center" +msgstr "Gornji prednji centralni" + +#: ../src/pulse/channelmap.c:159 +msgid "Top Front Left" +msgstr "Gornji prednji levi" + +#: ../src/pulse/channelmap.c:160 +msgid "Top Front Right" +msgstr "Gornji prednji desni" + +#: ../src/pulse/channelmap.c:162 +msgid "Top Rear Center" +msgstr "Gornji pozadinski centralni" + +#: ../src/pulse/channelmap.c:163 +msgid "Top Rear Left" +msgstr "Gornji pozadinski levi" + +#: ../src/pulse/channelmap.c:164 +msgid "Top Rear Right" +msgstr "Gornji pozadinski desni" + +#: ../src/pulse/channelmap.c:484 ../src/pulse/sample.c:170 +#: ../src/pulse/volume.c:295 ../src/pulse/volume.c:321 +#: ../src/pulse/volume.c:341 ../src/pulse/volume.c:371 +msgid "(invalid)" +msgstr "(neispravno)" + +#: ../src/pulse/channelmap.c:761 +msgid "Stereo" +msgstr "Stereo" + +#: ../src/pulse/channelmap.c:766 +msgid "Surround 4.0" +msgstr "Okružujući 4.0" + +#: ../src/pulse/channelmap.c:772 +msgid "Surround 4.1" +msgstr "Okružujući 4.1" + +#: ../src/pulse/channelmap.c:778 +msgid "Surround 5.0" +msgstr "Okružujući 5.0" + +#: ../src/pulse/channelmap.c:784 +msgid "Surround 5.1" +msgstr "Okružujući 5.1" + +#: ../src/pulse/channelmap.c:791 +msgid "Surround 7.1" +msgstr "Okružujući 7.1" + +#: ../src/pulse/error.c:43 +msgid "OK" +msgstr "U redu" + +#: ../src/pulse/error.c:44 +msgid "Access denied" +msgstr "Zabranjen pristup" + +#: ../src/pulse/error.c:45 +msgid "Unknown command" +msgstr "Nepoznata naredba" + +#: ../src/pulse/error.c:46 +msgid "Invalid argument" +msgstr "Neispravan argument" + +#: ../src/pulse/error.c:47 +msgid "Entity exists" +msgstr "Entitet postoji" + +#: ../src/pulse/error.c:48 +msgid "No such entity" +msgstr "Ne postoji takav entitet" + +#: ../src/pulse/error.c:49 +msgid "Connection refused" +msgstr "Veza odbijena" + +#: ../src/pulse/error.c:50 +msgid "Protocol error" +msgstr "Greška u protokolu" + +#: ../src/pulse/error.c:51 +msgid "Timeout" +msgstr "Vreme isteklo" + +#: ../src/pulse/error.c:52 +msgid "No authorization key" +msgstr "Nema ključa za ovlašćenje" + +#: ../src/pulse/error.c:53 +msgid "Internal error" +msgstr "Interna greška" + +#: ../src/pulse/error.c:54 +msgid "Connection terminated" +msgstr "Veza prekinuta" + +#: ../src/pulse/error.c:55 +msgid "Entity killed" +msgstr "Entitet ubijen" + +#: ../src/pulse/error.c:56 +msgid "Invalid server" +msgstr "Server neispravan" + +#: ../src/pulse/error.c:57 +msgid "Module initalization failed" +msgstr "Inicijalizacija modula nije uspela" + +#: ../src/pulse/error.c:58 +msgid "Bad state" +msgstr "Loše stanje" + +#: ../src/pulse/error.c:59 +msgid "No data" +msgstr "Nema podataka" + +#: ../src/pulse/error.c:60 +msgid "Incompatible protocol version" +msgstr "Neusaglašena verzija protokola" + +#: ../src/pulse/error.c:61 +msgid "Too large" +msgstr "Preveliko" + +#: ../src/pulse/error.c:62 +msgid "Not supported" +msgstr "Nije podržano" + +#: ../src/pulse/error.c:63 +msgid "Unknown error code" +msgstr "Kȏd greške je nepoznat" + +#: ../src/pulse/error.c:64 +msgid "No such extension" +msgstr "Ne postoji takvo proširenje" + +#: ../src/pulse/error.c:65 +msgid "Obsolete functionality" +msgstr "Izbačena funkcionalnost" + +#: ../src/pulse/error.c:66 +msgid "Missing implementation" +msgstr "Nije odrađeno" + +#: ../src/pulse/error.c:67 +msgid "Client forked" +msgstr "Klijent je izračvan" + +#: ../src/pulse/error.c:68 +msgid "Input/Output error" +msgstr "Ulazna/izlazna greška" + +#: ../src/pulse/error.c:69 +msgid "Device or resource busy" +msgstr "Uređaj ili resurs je zauzet" + +#: ../src/pulse/sample.c:172 +#, c-format +msgid "%s %uch %uHz" +msgstr "%s %uch %uHz" + +#: ../src/pulse/sample.c:184 +#, c-format +msgid "%0.1f GiB" +msgstr "%0.1f GiB" + +#: ../src/pulse/sample.c:186 +#, c-format +msgid "%0.1f MiB" +msgstr "%0.1f MiB" + +#: ../src/pulse/sample.c:188 +#, c-format +msgid "%0.1f KiB" +msgstr "%0.1f KiB" + +#: ../src/pulse/sample.c:190 +#, c-format +msgid "%u B" +msgstr "%u B" + +#: ../src/pulse/client-conf-x11.c:55 ../src/utils/pax11publish.c:100 +msgid "XOpenDisplay() failed" +msgstr "Neuspela funkcija XOpenDisplay()" + +#: ../src/pulse/client-conf-x11.c:93 +msgid "Failed to parse cookie data" +msgstr "Neuspešno tumačenje podataka iz kolačića" + +#: ../src/pulse/client-conf.c:111 +#, c-format +msgid "Failed to open configuration file '%s': %s" +msgstr "Neuspešno otvaranje datoteke podešavanja „%s“: %s" + +#: ../src/pulse/context.c:550 +msgid "No cookie loaded. Attempting to connect without." +msgstr "Kolačić nije učitan. Pokušavam se povezati bez kolačića." + +#: ../src/pulse/context.c:693 +#, c-format +msgid "fork(): %s" +msgstr "fork(): %s" + +#: ../src/pulse/context.c:748 +#, c-format +msgid "waitpid(): %s" +msgstr "waitpid(): %s" + +#: ../src/pulse/context.c:1438 +#, c-format +msgid "Received message for unknown extension '%s'" +msgstr "Primio poruku za nepoznati lokal „%s“" + +#: ../src/utils/pacat.c:108 +#, c-format +msgid "Failed to drain stream: %s" +msgstr "Neuspešno isušivanje toka: %s" + +#: ../src/utils/pacat.c:113 +msgid "Playback stream drained." +msgstr "Reprodukcioni tok je isušen." + +#: ../src/utils/pacat.c:123 +msgid "Draining connection to server." +msgstr "Veza do servera se isušuje." + +#: ../src/utils/pacat.c:136 +#, c-format +msgid "pa_stream_drain(): %s" +msgstr "pa_stream_drain(): %s" + +#: ../src/utils/pacat.c:159 +#, c-format +msgid "pa_stream_write() failed: %s" +msgstr "Neuspela funkcija pa_stream_write(): %s" + +#: ../src/utils/pacat.c:197 +#, c-format +msgid "pa_stream_begin_write() failed: %s" +msgstr "Neuspela funkcija pa_stream_write(): %s" + +#: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267 +#, c-format +msgid "pa_stream_peek() failed: %s" +msgstr "Neuspela funkcija pa_stream_peek(): %s" + +#: ../src/utils/pacat.c:307 +msgid "Stream successfully created." +msgstr "Tok je uspešno napravljen." + +#: ../src/utils/pacat.c:310 +#, c-format +msgid "pa_stream_get_buffer_attr() failed: %s" +msgstr "Neuspela funkcija pa_stream_get_buffer_attr(): %s" + +#: ../src/utils/pacat.c:314 +#, c-format +msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u" +msgstr "Mere bafera: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u" + +#: ../src/utils/pacat.c:317 +#, c-format +msgid "Buffer metrics: maxlength=%u, fragsize=%u" +msgstr "Mere bafera: maxlength=%u, fragsize=%u" + +#: ../src/utils/pacat.c:321 +#, c-format +msgid "Using sample spec '%s', channel map '%s'." +msgstr "Koristim sledeće parametre uzorka „%s“ i mapu kanala „%s“." + +#: ../src/utils/pacat.c:325 +#, c-format +msgid "Connected to device %s (%u, %ssuspended)." +msgstr "Priključen na uređaj %s (%u, %s obustavljeno)." + +#: ../src/utils/pacat.c:335 +#, c-format +msgid "Stream error: %s" +msgstr "Greška toka: %s" + +#: ../src/utils/pacat.c:345 +#, c-format +msgid "Stream device suspended.%s" +msgstr "Uređaj toka obustavljen.%s" + +#: ../src/utils/pacat.c:347 +#, c-format +msgid "Stream device resumed.%s" +msgstr "Uređaj toka nastavljen.%s" + +#: ../src/utils/pacat.c:355 +#, c-format +msgid "Stream underrun.%s" +msgstr "Tok nije popunjen.%s" + +#: ../src/utils/pacat.c:362 +#, c-format +msgid "Stream overrun.%s" +msgstr "Tok se preliva.%s" + +#: ../src/utils/pacat.c:369 +#, c-format +msgid "Stream started.%s" +msgstr "Tok je pokrenut.%s" + +#: ../src/utils/pacat.c:376 +#, c-format +msgid "Stream moved to device %s (%u, %ssuspended).%s" +msgstr "Tok prebačen na uređaj %s (%u, %s obustavljeno).%s" + +#: ../src/utils/pacat.c:376 +msgid "not " +msgstr "nije" + +#: ../src/utils/pacat.c:383 +#, c-format +msgid "Stream buffer attributes changed.%s" +msgstr "Parametri bafera toka su promenjeni.%s" + +#: ../src/utils/pacat.c:415 +#, c-format +msgid "Connection established.%s" +msgstr "Veza uspostavljena.%s" + +#: ../src/utils/pacat.c:418 +#, c-format +msgid "pa_stream_new() failed: %s" +msgstr "Neuspela funkcija pa_stream_new(): %s" + +#: ../src/utils/pacat.c:450 +#, c-format +msgid "pa_stream_connect_playback() failed: %s" +msgstr "Neuspela funkcija pa_stream_connect_playback(): %s" + +#: ../src/utils/pacat.c:456 +#, c-format +msgid "pa_stream_connect_record() failed: %s" +msgstr "Neuspela funkcija pa_stream_connect_record(): %s" + +#: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857 +#, c-format +msgid "Connection failure: %s" +msgstr "Neuspešno povezivanje: %s" + +#: ../src/utils/pacat.c:503 +msgid "Got EOF." +msgstr "Dobih EOF." + +#: ../src/utils/pacat.c:540 +#, c-format +msgid "write() failed: %s" +msgstr "Neuspela funkcija write(): %s" + +#: ../src/utils/pacat.c:561 +msgid "Got signal, exiting." +msgstr "Dobih signal, izlazim." + +#: ../src/utils/pacat.c:575 +#, c-format +msgid "Failed to get latency: %s" +msgstr "Ne mogu dobiti vrednost kašnjenja: %s" + +#: ../src/utils/pacat.c:580 +#, c-format +msgid "Time: %0.3f sec; Latency: %0.0f usec." +msgstr "Vreme: %0.3f s; Kašnjenje: %0.0f us." + +#: ../src/utils/pacat.c:599 +#, c-format +msgid "pa_stream_update_timing_info() failed: %s" +msgstr "Neuspela funkcija pa_stream_update_timing_info(): %s" + +#: ../src/utils/pacat.c:609 +#, c-format +msgid "" +"%s [options]\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -r, --record Create a connection for recording\n" +" -p, --playback Create a connection for playback\n" +"\n" +" -v, --verbose Enable verbose operations\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -d, --device=DEVICE The name of the sink/source to " +"connect to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" +" --stream-name=NAME How to call this stream on the " +"server\n" +" --volume=VOLUME Specify the initial (linear) volume " +"in range 0...65536\n" +" --rate=SAMPLERATE The sample rate in Hz (defaults to " +"44100)\n" +" --format=SAMPLEFORMAT The sample type, one of s16le, " +"s16be, u8, float32le,\n" +" float32be, ulaw, alaw, s32le, s32be, " +"s24le, s24be,\n" +" s24-32le, s24-32be (defaults to " +"s16ne)\n" +" --channels=CHANNELS The number of channels, 1 for mono, " +"2 for stereo\n" +" (defaults to 2)\n" +" --channel-map=CHANNELMAP Channel map to use instead of the " +"default\n" +" --fix-format Take the sample format from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-rate Take the sampling rate from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-channels Take the number of channels and the " +"channel map\n" +" from the sink the stream is being " +"connected to.\n" +" --no-remix Don't upmix or downmix channels.\n" +" --no-remap Map channels by index instead of " +"name.\n" +" --latency=BYTES Request the specified latency in " +"bytes.\n" +" --process-time=BYTES Request the specified process time " +"per request in bytes.\n" +" --property=PROPERTY=VALUE Set the specified property to the " +"specified value.\n" +" --raw Record/play raw PCM data.\n" +" --file-format=FFORMAT Record/play formatted PCM data.\n" +" --list-file-formats List available file formats.\n" +msgstr "" +"%s [opcije]\n" +"\n" +" -h, --help Prikaži ovu pomoć\n" +" --version Prikaži verziju\n" +"\n" +" -r, --record Napravi vezu za snimanje\n" +" -p, --playback Napravi vezu za reprodukciju\n" +"\n" +" -v, --verbose Omogući opširan opis radnje\n" +"\n" +" -s, --server=SERVER Ime servera na koji se treba " +"povezati\n" +" -d, --device=UREĐAJ Naziv slivnika/izvora na koji se " +"treba povezati\n" +" -n, --client-name=IME Kako nazvati ovog klijenta na " +"serveru\n" +" --stream-name=IME Kako nazvati ovaj tok na serveru\n" +" --volume=JAČINA Navedi početnu (linearnu) jačinu " +"zvuka u opsegu 0...65536\n" +" --rate=UČESTANOST Učestanost diskretizacije u Hz " +"(podrazumevana 44100)\n" +" --format=FORMATUZORKA Vrsta uzorka, jedna od s16le, s16be, " +"u8, float32le,\n" +" float32be, ulaw, alaw, s32le, s32be, " +"s24le, s24be,\n" +" s24-32le, s24-32be (podrazumevano " +"s16ne)\n" +" --channels=KANALI Broj kanala, 1 za mono, 2 za stereo\n" +" (podrazumevano 2)\n" +" --channel-map=MAPAKANALA Mapu kanala koju treba koristiti " +"umesto podrazumevane\n" +" --fix-format Preuzmi format uzorka iz slivnika na " +"koji se tok\n" +" priključuje.\n" +" --fix-rate Preuzmi učestanost diskretizacije iz " +"odliva na koji\n" +" se tok priključuje.\n" +" --fix-channels Preuzmi broj i mapu kanala iz " +"slivnika na koji se\n" +" tok priključuje.\n" +" --no-remix Bez svođenja ili razlaganja kanala.\n" +" --no-remap Mapiraj kanale po indeksu umesto po " +"nazivu.\n" +" --latency=BAJTOVA Traži navedeno kašnjenje u " +"bajtovima.\n" +" --process-time=BAJTOVA Traži navedeno vreme procesa po " +"zahtevu u bajtovima.\n" +" --property=SVOJSTVO=VREDNOST Postavi navedeno svojstvo na " +"navedenu vrednost.\n" +" --raw Snimaj/reprodukuj sirove PCM " +"podatke.\n" +" --file-format=FORMAT Snimaj/reprodukuj formatirane PCM " +"podatke.\n" +" --list-file-formats Ispiši sve dostupne formate " +"podataka.\n" + +#: ../src/utils/pacat.c:731 +#, c-format +msgid "" +"pacat %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pacat %s\n" +"Kompajlirano sa libpulse %s\n" +"Povezano sa libpulse %s\n" + +#: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953 +#, c-format +msgid "Invalid client name '%s'" +msgstr "Neispravno ime klijenta „%s“" + +#: ../src/utils/pacat.c:779 +#, c-format +msgid "Invalid stream name '%s'" +msgstr "Neispravno ime toka „%s“" + +#: ../src/utils/pacat.c:816 +#, c-format +msgid "Invalid channel map '%s'" +msgstr "Neispravna mapa kanala „%s“" + +#: ../src/utils/pacat.c:845 +#, c-format +msgid "Invalid latency specification '%s'" +msgstr "Neispravan parametar kašnjenja „%s“" + +#: ../src/utils/pacat.c:852 +#, c-format +msgid "Invalid process time specification '%s'" +msgstr "Neispravan parametar za vreme procesa „%s“" + +#: ../src/utils/pacat.c:864 +#, c-format +msgid "Invalid property '%s'" +msgstr "Neispravno svojstvo „%s“" + +#: ../src/utils/pacat.c:881 +#, c-format +msgid "Unknown file format %s." +msgstr "Nepoznat %s format datoteke." + +#: ../src/utils/pacat.c:900 +msgid "Invalid sample specification" +msgstr "Neispravan parametar uzorka" + +#: ../src/utils/pacat.c:910 +#, c-format +msgid "open(): %s" +msgstr "open(): %s" + +#: ../src/utils/pacat.c:915 +#, c-format +msgid "dup2(): %s" +msgstr "dup2(): %s" + +#: ../src/utils/pacat.c:922 +msgid "Too many arguments." +msgstr "Previše argumenata." + +#: ../src/utils/pacat.c:933 +msgid "Failed to generate sample specification for file." +msgstr "Nije uspelo pravljenje parametara uzorka za datoteku." + +#: ../src/utils/pacat.c:953 +msgid "Failed to open audio file." +msgstr "Nije uspelo otvaranje zvučne datoteke." + +#: ../src/utils/pacat.c:959 +msgid "" +"Warning: specified sample specification will be overwritten with " +"specification from file." +msgstr "" +"Upozorenje: navedeni parametri uzorka će biti prebrisani parametrima iz " +"datoteke." + +#: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997 +msgid "Failed to determine sample specification from file." +msgstr "Neuspešno utvrđivanje parametara uzorka iz datoteke." + +#: ../src/utils/pacat.c:971 +msgid "Warning: Failed to determine channel map from file." +msgstr "Upozorenje: Neuspešno utvrđivanje mape kanala iz datoteke." + +#: ../src/utils/pacat.c:982 +msgid "Channel map doesn't match sample specification" +msgstr "Mapa kanala se ne poklapa sa parametrima uzorka" + +#: ../src/utils/pacat.c:993 +msgid "Warning: failed to write channel map to file." +msgstr "Upozorenje: Neuspešno zapisivanje mape kanala u datoteku." + +#: ../src/utils/pacat.c:1008 +#, c-format +msgid "" +"Opening a %s stream with sample specification '%s' and channel map '%s'." +msgstr "Otvaram tok %s sa parametrima uzorka „%s“ i mapom kanala „%s“." + +#: ../src/utils/pacat.c:1009 +msgid "recording" +msgstr "snima" + +#: ../src/utils/pacat.c:1009 +msgid "playback" +msgstr "pušta" + +#: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267 +msgid "pa_mainloop_new() failed." +msgstr "Neuspela funkcija pa_mainloop_new()." + +#: ../src/utils/pacat.c:1054 +msgid "io_new() failed." +msgstr "Neuspela funkcija io_new()." + +#: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279 +msgid "pa_context_new() failed." +msgstr "Neuspela funkcija pa_context_new()." + +#: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285 +#, c-format +msgid "pa_context_connect() failed: %s" +msgstr "Neuspela funkcija pa_context_connect(): %s" + +#: ../src/utils/pacat.c:1075 +msgid "pa_context_rttime_new() failed." +msgstr "Neuspela funkcija pa_context_new()." + +#: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290 +msgid "pa_mainloop_run() failed." +msgstr "Neuspela funkcija pa_mainloop_run()." + +#: ../src/utils/pasuspender.c:81 +#, c-format +msgid "fork(): %s\n" +msgstr "fork(): %s\n" + +#: ../src/utils/pasuspender.c:92 +#, c-format +msgid "execvp(): %s\n" +msgstr "execvp(): %s\n" + +#: ../src/utils/pasuspender.c:109 +#, c-format +msgid "Failure to suspend: %s\n" +msgstr "Neuspešno zaustavljanje: %s\n" + +#: ../src/utils/pasuspender.c:124 +#, c-format +msgid "Failure to resume: %s\n" +msgstr "Neuspešno nastavljanje: %s\n" + +#: ../src/utils/pasuspender.c:147 +#, c-format +msgid "WARNING: Sound server is not local, not suspending.\n" +msgstr "UPOZORENJE: Zvučni server nije lokalni, ne zaustavljam.\n" + +#: ../src/utils/pasuspender.c:159 +#, c-format +msgid "Connection failure: %s\n" +msgstr "Neuspešno povezivanje: %s\n" + +#: ../src/utils/pasuspender.c:176 +#, c-format +msgid "Got SIGINT, exiting.\n" +msgstr "Dobih SIGINT, izlazim.\n" + +#: ../src/utils/pasuspender.c:194 +#, c-format +msgid "WARNING: Child process terminated by signal %u\n" +msgstr "UPOZORENJE: Potlačeni proces je prekinut signalom %u\n" + +#: ../src/utils/pasuspender.c:212 +#, c-format +msgid "" +"%s [options] ... \n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +"\n" +msgstr "" +"%s [opcije] ... \n" +"\n" +" -h, --help Prikaži ovu pomoć\n" +" --version Prikaži verziju\n" +" -s, --server=SERVER Ime servera na koji se treba " +"povezati\n" +"\n" + +#: ../src/utils/pasuspender.c:248 +#, c-format +msgid "" +"pasuspender %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pasuspender %s\n" +"Kompajlirano sa libpulse %s\n" +"Povezano sa libpulse %s\n" + +#: ../src/utils/pasuspender.c:277 +#, c-format +msgid "pa_mainloop_new() failed.\n" +msgstr "Neuspela funkcija pa_mainloop_new().\n" + +#: ../src/utils/pasuspender.c:290 +#, c-format +msgid "pa_context_new() failed.\n" +msgstr "Neuspela funkcija pa_context_new().\n" + +#: ../src/utils/pasuspender.c:298 +#, c-format +msgid "pa_mainloop_run() failed.\n" +msgstr "Neuspela funkcija pa_mainloop_run().\n" + +#: ../src/utils/pactl.c:135 +#, c-format +msgid "Failed to get statistics: %s" +msgstr "Neuspešno dobavljanje statistike: %s" + +#: ../src/utils/pactl.c:141 +#, c-format +msgid "Currently in use: %u blocks containing %s bytes total.\n" +msgstr "Trenutno u upotrebi: %u blokova sadrži ukupno %s bajtova.\n" + +#: ../src/utils/pactl.c:144 +#, c-format +msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n" +msgstr "Smešteno od pokretanja: %u blokova sadrži ukupno %s bajtova.\n" + +#: ../src/utils/pactl.c:147 +#, c-format +msgid "Sample cache size: %s\n" +msgstr "Veličina keš memorije uzorka: %s\n" + +#: ../src/utils/pactl.c:156 +#, c-format +msgid "Failed to get server information: %s" +msgstr "Neuspešno dobavljanje podataka o serveru: %s" + +#: ../src/utils/pactl.c:164 +#, c-format +msgid "" +"User name: %s\n" +"Host Name: %s\n" +"Server Name: %s\n" +"Server Version: %s\n" +"Default Sample Specification: %s\n" +"Default Channel Map: %s\n" +"Default Sink: %s\n" +"Default Source: %s\n" +"Cookie: %08x\n" +msgstr "" +"Korisničko ime: %s\n" +"Ime domaćina: %s\n" +"Ime servera: %s\n" +"Verzija servera: %s\n" +"Podrazumevani parametri uzorka: %s\n" +"Podrazumevana mapa kanala: %s\n" +"Podrazumevano slivnik: %s\n" +"Podrazumevani izvor: %s\n" +"Kolačić: %08x\n" + +#: ../src/utils/pactl.c:205 +#, c-format +msgid "Failed to get sink information: %s" +msgstr "Neuspešno dobavljanje podataka o slivniku: %s" + +#: ../src/utils/pactl.c:221 +#, c-format +msgid "" +"Sink #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor Source: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Slivnik #%u\n" +"\tStanje: %s\n" +"\tIme: %s\n" +"\tOpis: %s\n" +"\tUpravljački program: %s\n" +"\tParametri uzorka: %s\n" +"\tMapa kanala: %s\n" +"\tPripada modulu: %u\n" +"\tIsključen ton: %s\n" +"\tJačina zvuka: %s%s%s\n" +"\t balans %0.2f\n" +"\tGlasnost basa: %s%s%s\n" +"\tIzvor kontrolora: %s\n" +"\tKašnjenje: %0.0f μs, podešeno %0.0f μs\n" +"\tZastavice: %s%s%s%s%s%s\n" +"\tSvojstva:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360 +#, c-format +msgid "\tPorts:\n" +msgstr "\tPortovi:\n" + +#: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366 +#, c-format +msgid "\tActive Port: %s\n" +msgstr "\tAktivni port: %s\n" + +#: ../src/utils/pactl.c:297 +#, c-format +msgid "Failed to get source information: %s" +msgstr "Neuspešno dobavljanje podataka o izvoru: %s" + +#: ../src/utils/pactl.c:313 +#, c-format +msgid "" +"Source #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor of Sink: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Izvor #%u\n" +"\tStanje: %s\n" +"\tIme: %s\n" +"\tOpis: %s\n" +"\tUpravljački program: %s\n" +"\tParametri uzorka: %s\n" +"\tMapa kanala: %s\n" +"\tPripada modulu: %u\n" +"\tIsključen ton: %s\n" +"\tJačina zvuka: %s%s%s\n" +"\t balans %0.2f\n" +"\tGlasnost basa: %s%s%s\n" +"\tKontroler slivnika: %s\n" +"\tKašnjenje: %0.0f μs, podešeno %0.0f μs\n" +"\tZastavice: %s%s%s%s%s%s\n" +"\tSvojstva:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:345 ../src/utils/pactl.c:401 ../src/utils/pactl.c:436 +#: ../src/utils/pactl.c:473 ../src/utils/pactl.c:532 ../src/utils/pactl.c:533 +#: ../src/utils/pactl.c:543 ../src/utils/pactl.c:587 ../src/utils/pactl.c:588 +#: ../src/utils/pactl.c:594 ../src/utils/pactl.c:637 ../src/utils/pactl.c:638 +#: ../src/utils/pactl.c:645 +msgid "n/a" +msgstr "nepoznato" + +#: ../src/utils/pactl.c:375 +#, c-format +msgid "Failed to get module information: %s" +msgstr "Neuspešno dobavljanje podataka o modulu: %s" + +#: ../src/utils/pactl.c:393 +#, c-format +msgid "" +"Module #%u\n" +"\tName: %s\n" +"\tArgument: %s\n" +"\tUsage counter: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Modul #%u\n" +"\tIme: %s\n" +"\tArgument: %s\n" +"\tBrojač korišćenja: %s\n" +"\tSvojstva:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:412 +#, c-format +msgid "Failed to get client information: %s" +msgstr "Neuspešno dobavljanje podataka o klijentu: %s" + +#: ../src/utils/pactl.c:430 +#, c-format +msgid "" +"Client #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Klijent #%u\n" +"\tUpravljački program: %s\n" +"\tPripada modulu: %s\n" +"\tSvojstva:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:447 +#, c-format +msgid "Failed to get card information: %s" +msgstr "Neuspešno dobavljanje podataka o kartici: %s" + +#: ../src/utils/pactl.c:465 +#, c-format +msgid "" +"Card #%u\n" +"\tName: %s\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Kartica #%u\n" +"\tIme: %s\n" +"\tUpravljački program: %s\n" +"\tVlasnik modula: %s\n" +"\tSvojstva:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:479 +#, c-format +msgid "\tProfiles:\n" +msgstr "\tProfili:\n" + +#: ../src/utils/pactl.c:485 +#, c-format +msgid "\tActive Profile: %s\n" +msgstr "\tAktivni profil: %s\n" + +#: ../src/utils/pactl.c:496 +#, c-format +msgid "Failed to get sink input information: %s" +msgstr "Neuspešno dobavljanje podataka o ulazu slivnika: %s" + +#: ../src/utils/pactl.c:515 +#, c-format +msgid "" +"Sink Input #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSink: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tMute: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSink Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Ulaz u slivnik #%u\n" +"\tUpravljački program: %s\n" +"\tPripada modulu: %s\n" +"\tKlijent: %s\n" +"\tSlivnik: %u\n" +"\tParametri uzorka: %s\n" +"\tMapa kanala: %s\n" +"\tIsključen ton: %s\n" +"\tJačina zvuka: %s\n" +"\t %s\n" +"\t balans %0.2f\n" +"\tKašnjenje bafera: %0.0f μs\n" +"\tKašnjenje slivnika: %0.0f μs\n" +"\tNačin diskretizacije: %s\n" +"\tSvojstva:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:554 +#, c-format +msgid "Failed to get source output information: %s" +msgstr "Neuspešno dobavljanje podataka o izlazu izvora: %s" + +#: ../src/utils/pactl.c:574 +#, c-format +msgid "" +"Source Output #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSource: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSource Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Izlaz izvora #%u\n" +"\tUpravljački program: %s\n" +"\tPripada modulu: %s\n" +"\tKlijent: %s\n" +"\tIzvor: %u\n" +"\tParametri uzorka: %s\n" +"\tMapa kanala: %s\n" +"\tKašnjenje bafera: %0.0f μs\n" +"\tKašnjenje izvora: %0.0f μs\n" +"\tNačin diskretizacije: %s\n" +"\tSvojstva:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:605 +#, c-format +msgid "Failed to get sample information: %s" +msgstr "Neuspešno dobavljanje podataka o uzorku: %s" + +#: ../src/utils/pactl.c:623 +#, c-format +msgid "" +"Sample #%u\n" +"\tName: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tDuration: %0.1fs\n" +"\tSize: %s\n" +"\tLazy: %s\n" +"\tFilename: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Uzorak #%u\n" +"\tIme: %s\n" +"\tParametri uzorka: %s\n" +"\tMapa kanala: %s\n" +"\tJačina zvuka: %s\n" +"\t %s\n" +"\t balans %0.2f\n" +"\tDužina: %0.1fs\n" +"\tVeličina: %s\n" +"\tLenj: %s\n" +"\tIme datoteke: %s\n" +"\tSvojstva:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663 +#, c-format +msgid "Failure: %s" +msgstr "Neuspeh: %s" + +#: ../src/utils/pactl.c:687 +#, c-format +msgid "Failed to upload sample: %s" +msgstr "Nije uspelo postavljanje uzorka: %s" + +#: ../src/utils/pactl.c:704 +msgid "Premature end of file" +msgstr "Prerani kraj datoteke" + +#: ../src/utils/pactl.c:863 +msgid "Got SIGINT, exiting." +msgstr "Dobih SIGINT, izlazim." + +#: ../src/utils/pactl.c:869 +#, c-format +msgid "" +"%s [options] stat\n" +"%s [options] list\n" +"%s [options] exit\n" +"%s [options] upload-sample FILENAME [NAME]\n" +"%s [options] play-sample NAME [SINK]\n" +"%s [options] remove-sample NAME\n" +"%s [options] move-sink-input SINKINPUT SINK\n" +"%s [options] move-source-output SOURCEOUTPUT SOURCE\n" +"%s [options] load-module NAME [ARGS ...]\n" +"%s [options] unload-module MODULE\n" +"%s [options] suspend-sink SINK 1|0\n" +"%s [options] suspend-source SOURCE 1|0\n" +"%s [options] set-card-profile CARD PROFILE\n" +"%s [options] set-sink-port SINK PORT\n" +"%s [options] set-source-port SOURCE PORT\n" +"%s [options] set-sink-volume SINK VOLUME\n" +"%s [options] set-source-volume SOURCE VOLUME\n" +"%s [options] set-sink-input-volume SINKINPUT VOLUME\n" +"%s [options] set-sink-mute SINK 1|0\n" +"%s [options] set-source-mute SOURCE 1|0\n" +"%s [options] set-sink-input-mute SINKINPUT 1|0\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" +msgstr "" +"%s [opcije] stat\n" +"%s [opcije] list\n" +"%s [opcije] exit\n" +"%s [opcije] upload-sample IMEDATOTEKE [IME]\n" +"%s [opcije] play-sample IME [SLIVNIK]\n" +"%s [opcije] remove-sample IME\n" +"%s [opcije] move-sink-input ULAZSLIVNIKA SLIVNIK\n" +"%s [opcije] move-source-output IZLAZIZVORA IZVOR\n" +"%s [opcije] load-module IME [ARG ...]\n" +"%s [opcije] unload-module MODUL\n" +"%s [opcije] suspend-sink SLIVNIK 1|0\n" +"%s [opcije] suspend-source IZVOR 1|0\n" +"%s [opcije] set-card-profile KARTICA PROFIL\n" +"%s [opcije] set-sink-port SLIVNIK PORT\n" +"%s [opcije] set-source-port IZVOR PORT\n" +"%s [opcije] set-sink-volume SLIVNIK JAČINA\n" +"%s [opcije] set-source-volume IZVOR JAČINA\n" +"%s [opcije] set-sink-input-volume ULAZSLIVNIKA JAČINA\n" +"%s [opcije] set-sink-mute SLIVNIK 1|0\n" +"%s [opcije] set-source-mute IZVOR 1|0\n" +"%s [opcije] set-sink-input-mute ULAZSLIVNIKA 1|0\n" +"\n" +" -h, --help Prikaži ovu pomoć\n" +" --version Prikaži verziju\n" +"\n" +" -s, --server=SERVER Ime servera na koji se treba " +"povezati\n" +" -n, --client-name=IME Kako nazvati ovog klijenta na " +"serveru\n" + +#: ../src/utils/pactl.c:933 +#, c-format +msgid "" +"pactl %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pactl %s\n" +"Kompajlirano sa libpulse %s\n" +"Povezano sa libpulse %s\n" + +#: ../src/utils/pactl.c:979 +msgid "Please specify a sample file to load" +msgstr "Navedite datoteku uzorka koju treba učitati" + +#: ../src/utils/pactl.c:992 +msgid "Failed to open sound file." +msgstr "Nije uspelo otvaranje zvučne datoteke." + +#: ../src/utils/pactl.c:1004 +msgid "Warning: Failed to determine sample specification from file." +msgstr "Upozorenje: Neuspešno utvrđivanje parametara uzorka iz datoteke." + +#: ../src/utils/pactl.c:1014 +msgid "You have to specify a sample name to play" +msgstr "Morate navesti ime uzorka kojeg želite reprodukovati" + +#: ../src/utils/pactl.c:1026 +msgid "You have to specify a sample name to remove" +msgstr "Morate navesti ime uzorka kojeg želite ukloniti" + +#: ../src/utils/pactl.c:1035 +msgid "You have to specify a sink input index and a sink" +msgstr "Morate navesti indeks ulaza slivnika i slivnik" + +#: ../src/utils/pactl.c:1045 +msgid "You have to specify a source output index and a source" +msgstr "Morate navesti indeks izlaza izvora i izvor" + +#: ../src/utils/pactl.c:1060 +msgid "You have to specify a module name and arguments." +msgstr "Morate navesti ime i argumente modula." + +#: ../src/utils/pactl.c:1080 +msgid "You have to specify a module index" +msgstr "Morate navesti indeks modula" + +#: ../src/utils/pactl.c:1090 +msgid "" +"You may not specify more than one sink. You have to specify a boolean value." +msgstr "" +"Ne možete navesti više od jednog slivnika. Morate navesti logičku vrednost." + +#: ../src/utils/pactl.c:1103 +msgid "" +"You may not specify more than one source. You have to specify a boolean " +"value." +msgstr "" +"Ne možete navesti više od jednog izvora. Morate navesti logičku vrednost." + +#: ../src/utils/pactl.c:1115 +msgid "You have to specify a card name/index and a profile name" +msgstr "Morate navesti ime/indeks kartice i ime profila" + +#: ../src/utils/pactl.c:1126 +msgid "You have to specify a sink name/index and a port name" +msgstr "Morate navesti ime/indeks slivnika i ime porta" + +#: ../src/utils/pactl.c:1137 +msgid "You have to specify a source name/index and a port name" +msgstr "Morate navesti ime/indeks izvora i ime porta" + +#: ../src/utils/pactl.c:1149 +msgid "You have to specify a sink name/index and a volume" +msgstr "Morate navesti ime/indeks slivnika i jačinu" + +#: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171 +#: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209 +#: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248 +msgid "Invalid volume specification" +msgstr "Neispravan parametar jačine" + +#: ../src/utils/pactl.c:1166 +msgid "You have to specify a source name/index and a volume" +msgstr "Morate navesti ime/indeks izvora i jačinu" + +#: ../src/utils/pactl.c:1183 +msgid "You have to specify a sink input index and a volume" +msgstr "Morate navesti indeks ulaza slivnika i jačinu" + +#: ../src/utils/pactl.c:1188 +msgid "Invalid sink input index" +msgstr "Neispravan indeks ulaza slivnika" + +#: ../src/utils/pactl.c:1204 +msgid "You have to specify a sink name/index and a mute boolean" +msgstr "Morate navesti ime/indeks slivnika i logičku vrednost za isključivanje" + +#: ../src/utils/pactl.c:1221 +msgid "You have to specify a source name/index and a mute boolean" +msgstr "Morate navesti ime/indeks izvora i logičku vrednost za isključivanje" + +#: ../src/utils/pactl.c:1238 +msgid "You have to specify a sink input index and a mute boolean" +msgstr "" +"Morate navesti indeks ulaza slivnika i logičku vrednost za isključivanje" + +#: ../src/utils/pactl.c:1243 +msgid "Invalid sink input index specification" +msgstr "Neispravan parametar indeksa ulaza slivnika" + +#: ../src/utils/pactl.c:1262 +msgid "No valid command specified." +msgstr "Nije navedena ispravna naredba." + +#: ../src/utils/pax11publish.c:61 +#, c-format +msgid "" +"%s [-D display] [-S server] [-O sink] [-I source] [-c file] [-d|-e|-i|-r]\n" +"\n" +" -d Show current PulseAudio data attached to X11 display (default)\n" +" -e Export local PulseAudio data to X11 display\n" +" -i Import PulseAudio data from X11 display to local environment " +"variables and cookie file.\n" +" -r Remove PulseAudio data from X11 display\n" +msgstr "" +"%s [-D prikaz] [-S server] [-O slivnik] [-I izvor] [-c datoteka] [-d|-e|-i|-" +"r]\n" +"\n" +" -d Prikaži trenutne PulseAudio podatke zakačene za X11 prikaz " +"(podrazumevano)\n" +" -e Izvezi lokalne PulseAudio podatke na X11 prikaz\n" +" -i Uvezi PulseAudio podatke sa X11 prikaza u lokalne promenljive " +"okruženja i datoteke kolačića.\n" +" -r Ukloni PulseAudio podatke sa X11 prikaza\n" + +#: ../src/utils/pax11publish.c:94 +#, c-format +msgid "Failed to parse command line.\n" +msgstr "Neuspešno tumačenje komandne linije.\n" + +#: ../src/utils/pax11publish.c:108 +#, c-format +msgid "Server: %s\n" +msgstr "Server: %s\n" + +#: ../src/utils/pax11publish.c:110 +#, c-format +msgid "Source: %s\n" +msgstr "Izvor: %s\n" + +#: ../src/utils/pax11publish.c:112 +#, c-format +msgid "Sink: %s\n" +msgstr "Slivnik: %s\n" + +#: ../src/utils/pax11publish.c:114 +#, c-format +msgid "Cookie: %s\n" +msgstr "Kolačić: %s\n" + +#: ../src/utils/pax11publish.c:132 +#, c-format +msgid "Failed to parse cookie data\n" +msgstr "Neuspešno tumačenje podataka iz kolačića\n" + +#: ../src/utils/pax11publish.c:137 +#, c-format +msgid "Failed to save cookie data\n" +msgstr "Neuspešno zapisivanje podataka kolačića\n" + +#: ../src/utils/pax11publish.c:152 +#, c-format +msgid "Failed to load client configuration file.\n" +msgstr "Neuspešno učitavanje klijentove datoteke podešavanja.\n" + +#: ../src/utils/pax11publish.c:157 +#, c-format +msgid "Failed to read environment configuration data.\n" +msgstr "Neuspešno čitanje podataka podešavanja za okruženje.\n" + +#: ../src/utils/pax11publish.c:174 +#, c-format +msgid "Failed to get FQDN.\n" +msgstr "Neuspešno dobijanje FQDN-a.\n" + +#: ../src/utils/pax11publish.c:194 +#, c-format +msgid "Failed to load cookie data\n" +msgstr "Neuspešno učitavanje datoteka kolačića\n" + +#: ../src/utils/pax11publish.c:211 +#, c-format +msgid "Not yet implemented.\n" +msgstr "Nije još implementirano.\n" + +#: ../src/utils/pacmd.c:69 +msgid "No PulseAudio daemon running, or not running as session daemon." +msgstr "" +"Nema pokrenutog PulseAudio demona, ili se ne izvršava kao demon sesije." + +#: ../src/utils/pacmd.c:74 +#, c-format +msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s" +msgstr "socket(PF_UNIX, SOCK_STREAM, 0): %s" + +#: ../src/utils/pacmd.c:91 +#, c-format +msgid "connect(): %s" +msgstr "connect(): %s" + +#: ../src/utils/pacmd.c:99 +msgid "Failed to kill PulseAudio daemon." +msgstr "Nije uspelo ubijanje PulseAudio demona." + +#: ../src/utils/pacmd.c:107 +msgid "Daemon not responding." +msgstr "Demon se ne odaziva." + +#: ../src/utils/pacmd.c:161 +#, c-format +msgid "poll(): %s" +msgstr "poll(): %s" + +#: ../src/utils/pacmd.c:171 ../src/utils/pacmd.c:188 +#, c-format +msgid "read(): %s" +msgstr "read(): %s" + +#: ../src/utils/pacmd.c:207 ../src/utils/pacmd.c:223 +#, c-format +msgid "write(): %s" +msgstr "write(): %s" + +#: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:219 +msgid "Cannot access autospawn lock." +msgstr "Nije moguće pristupiti datoteci zaključavanja za samoumnožavanje." + +#: ../src/modules/alsa/alsa-sink.c:530 ../src/modules/alsa/alsa-sink.c:689 +#, c-format +msgid "" +"ALSA woke us up to write new data to the device, but there was actually " +"nothing to write!\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers.\n" +"We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() " +"returned 0 or another value < min_avail." +msgstr "" +"ALSA nas je probudila da bi zapisala nove podatke na uređaj, ali nema ništa " +"da se zapiše!\n" +"Ovo je najverovatnije greška u ALSA upravljačkom programu „%s“. Prijavite " +"ovaj problem programerima ALSA-e.\n" +"Probuđeni smo sa postavljenim POLLOUT-om -- ali sledeći snd_pcm_avail() je " +"vratio 0 ili neku drugu vrednost manju od min_avail." + +#: ../src/modules/alsa/alsa-source.c:506 ../src/modules/alsa/alsa-source.c:656 +#, c-format +msgid "" +"ALSA woke us up to read new data from the device, but there was actually " +"nothing to read!\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers.\n" +"We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() " +"returned 0 or another value < min_avail." +msgstr "" +"ALSA nas je probudila da bi pročitala nove podatke iz uređaja, ali nema " +"ništa da se pročita!\n" +"Ovo je najverovatnije greška u ALSA upravljačkom programu „%s“. Prijavite " +"ovaj problem programerima ALSA-e.\n" +"Probuđeni smo sa postavljenim POLLIN-om -- ali sledeći snd_pcm_avail() je " +"vratio 0 ili neku drugu vrednost manju od min_avail." + +#: ../src/modules/alsa/module-alsa-card.c:152 +#: ../src/modules/bluetooth/module-bluetooth-device.c:2228 +#: ../src/modules/alsa/alsa-mixer.c:2931 +msgid "Off" +msgstr "Isključeno" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2184 +msgid "High Fidelity Playback (A2DP)" +msgstr "Reprodukcija visoke tačnosti (A2DP)" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2198 +msgid "High Fidelity Capture (A2DP)" +msgstr "Snimanje visoke tačnosti (A2DP)" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2213 +msgid "Telephony Duplex (HSP/HFP)" +msgstr "Dvosmerno telefoniranje (HSP/HFP)" + +#: ../src/modules/reserve-wrap.c:151 +msgid "PulseAudio Sound Server" +msgstr "PulseAudio zvučni sistem" + +#: ../src/modules/module-rygel-media-server.c:569 +#: ../src/modules/module-rygel-media-server.c:583 +msgid "Output Devices" +msgstr "Izlazni uređaji" + +#: ../src/modules/module-rygel-media-server.c:570 +#: ../src/modules/module-rygel-media-server.c:584 +msgid "Input Devices" +msgstr "Ulazni uređaji" + +#: ../src/modules/module-rygel-media-server.c:774 +msgid "Audio on @HOSTNAME@" +msgstr "Audio na @HOSTNAME@" + +#: ../src/modules/alsa/alsa-mixer.c:1701 +msgid "Input" +msgstr "Ulaz" + +#: ../src/modules/alsa/alsa-mixer.c:1702 +msgid "Docking Station Input" +msgstr "Ulaz priključne stanice" + +#: ../src/modules/alsa/alsa-mixer.c:1703 +msgid "Docking Station Microphone" +msgstr "Mikrofon priključne stanice" + +#: ../src/modules/alsa/alsa-mixer.c:1704 +msgid "Line-In" +msgstr "Linija u" + +#: ../src/modules/alsa/alsa-mixer.c:1705 +msgid "Microphone" +msgstr "Mikrofon" + +#: ../src/modules/alsa/alsa-mixer.c:1706 +msgid "External Microphone" +msgstr "Spoljni mikrofon" + +#: ../src/modules/alsa/alsa-mixer.c:1707 +msgid "Internal Microphone" +msgstr "Unutrašnji mikrofon" + +#: ../src/modules/alsa/alsa-mixer.c:1708 +msgid "Radio" +msgstr "Radio" + +#: ../src/modules/alsa/alsa-mixer.c:1709 +msgid "Video" +msgstr "Video" + +#: ../src/modules/alsa/alsa-mixer.c:1710 +msgid "Automatic Gain Control" +msgstr "Samostalna kontrola pojačanja" + +#: ../src/modules/alsa/alsa-mixer.c:1711 +msgid "No Automatic Gain Control" +msgstr "Bez samostalne kontrole pojačanja" + +#: ../src/modules/alsa/alsa-mixer.c:1712 +msgid "Boost" +msgstr "Podizanje" + +#: ../src/modules/alsa/alsa-mixer.c:1713 +msgid "No Boost" +msgstr "Bez podizanja" + +#: ../src/modules/alsa/alsa-mixer.c:1714 +msgid "Amplifier" +msgstr "Pojačalo" + +#: ../src/modules/alsa/alsa-mixer.c:1715 +msgid "No Amplifier" +msgstr "Bez pojačala" + +#: ../src/modules/alsa/alsa-mixer.c:1773 +msgid "Analog Input" +msgstr "Analogni ulaz" + +#: ../src/modules/alsa/alsa-mixer.c:1774 +msgid "Analog Microphone" +msgstr "Analogni mikrofon" + +#: ../src/modules/alsa/alsa-mixer.c:1775 +msgid "Analog Line-In" +msgstr "Analogna linija u" + +#: ../src/modules/alsa/alsa-mixer.c:1776 +msgid "Analog Radio" +msgstr "Analogni radio" + +#: ../src/modules/alsa/alsa-mixer.c:1777 +msgid "Analog Video" +msgstr "Analogni video" + +#: ../src/modules/alsa/alsa-mixer.c:1778 +msgid "Analog Output" +msgstr "Analogni izlaz" + +#: ../src/modules/alsa/alsa-mixer.c:1779 +msgid "Analog Headphones" +msgstr "Analogne slušalice" + +#: ../src/modules/alsa/alsa-mixer.c:1780 +msgid "Analog Output (LFE)" +msgstr "Analogni izlaz (LFE)" + +#: ../src/modules/alsa/alsa-mixer.c:1781 +msgid "Analog Mono Output" +msgstr "Analogni mono izlaz" + +#: ../src/modules/alsa/alsa-mixer.c:1981 +#, c-format +msgid "%s+%s" +msgstr "%s+%s" + +#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404 +#, c-format +msgid "%s / %s" +msgstr "%s / %s" + +#: ../src/modules/alsa/alsa-mixer.c:2790 +msgid "Analog Mono" +msgstr "Analogni mono" + +#: ../src/modules/alsa/alsa-mixer.c:2791 +msgid "Analog Stereo" +msgstr "Analogni stereo" + +#: ../src/modules/alsa/alsa-mixer.c:2792 +msgid "Analog Surround 2.1" +msgstr "Analogni okružujući 2.1" + +#: ../src/modules/alsa/alsa-mixer.c:2793 +msgid "Analog Surround 3.0" +msgstr "Analogni okružujući 3.0" + +#: ../src/modules/alsa/alsa-mixer.c:2794 +msgid "Analog Surround 3.1" +msgstr "Analogni okružujući 3.1" + +#: ../src/modules/alsa/alsa-mixer.c:2795 +msgid "Analog Surround 4.0" +msgstr "Analogni okružujući 4.0" + +#: ../src/modules/alsa/alsa-mixer.c:2796 +msgid "Analog Surround 4.1" +msgstr "Analogni okružujući 4.1" + +#: ../src/modules/alsa/alsa-mixer.c:2797 +msgid "Analog Surround 5.0" +msgstr "Analogni okružujući 5.0" + +#: ../src/modules/alsa/alsa-mixer.c:2798 +msgid "Analog Surround 5.1" +msgstr "Analogni okružujući 5.1" + +#: ../src/modules/alsa/alsa-mixer.c:2799 +msgid "Analog Surround 6.0" +msgstr "Analogni okružujući 6.0" + +#: ../src/modules/alsa/alsa-mixer.c:2800 +msgid "Analog Surround 6.1" +msgstr "Analogni okružujući 6.1" + +#: ../src/modules/alsa/alsa-mixer.c:2801 +msgid "Analog Surround 7.0" +msgstr "Analogni okružujući 7.0" + +#: ../src/modules/alsa/alsa-mixer.c:2802 +msgid "Analog Surround 7.1" +msgstr "Analogni okružujući 7.1" + +#: ../src/modules/alsa/alsa-mixer.c:2803 +msgid "Digital Stereo (IEC958)" +msgstr "Digitalni stereo (IEC958)" + +#: ../src/modules/alsa/alsa-mixer.c:2804 +msgid "Digital Surround 4.0 (IEC958)" +msgstr "Digitalni okružujući 4.0 (IEC958)" + +#: ../src/modules/alsa/alsa-mixer.c:2805 +msgid "Digital Surround 4.0 (IEC958/AC3)" +msgstr "Digitalni okružujući 4.0 (IEC958/AC3)" + +#: ../src/modules/alsa/alsa-mixer.c:2806 +msgid "Digital Surround 5.1 (IEC958/AC3)" +msgstr "Digitalni okružujući 5.1 (IEC958/AC3)" + +#: ../src/modules/alsa/alsa-mixer.c:2807 +msgid "Digital Stereo (HDMI)" +msgstr "Digitalni stereo (HDMI)" + +#: ../src/modules/alsa/alsa-mixer.c:2928 +msgid "Analog Mono Duplex" +msgstr "Dvosmerni analogni mono" + +#: ../src/modules/alsa/alsa-mixer.c:2929 +msgid "Analog Stereo Duplex" +msgstr "Dvosmerni analogni stereo" + +#: ../src/modules/alsa/alsa-mixer.c:2930 +msgid "Digital Stereo Duplex (IEC958)" +msgstr "Dvosmerni digitalni stereo (IEC958)" diff --git a/po/sv.po b/po/sv.po new file mode 100644 index 0000000..d08b30e --- /dev/null +++ b/po/sv.po @@ -0,0 +1,2323 @@ +# Swedish translation for pulseaudio. +# Copyright (C) 2008 Free Software Foundation, Inc. +# This file is distributed under the same license as the pulseaudio package. +# Daniel Nylander , 2008. +# +msgid "" +msgstr "" +"Project-Id-Version: pulseaudio\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-09-29 23:47+0200\n" +"PO-Revision-Date: 2008-09-05 18:24+0100\n" +"Last-Translator: Daniel Nylander \n" +"Language-Team: Swedish \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629 +#, c-format +msgid "%s %s" +msgstr "" + +#: ../src/modules/alsa/alsa-util.c:1106 +#, c-format +msgid "" +"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu " +"ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" + +#: ../src/modules/alsa/alsa-util.c:1147 +#, c-format +msgid "" +"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%" +"lu ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" + +#: ../src/modules/alsa/alsa-util.c:1194 +#, c-format +msgid "" +"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes " +"(%lu ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" + +#: ../src/modules/module-always-sink.c:39 +msgid "Always keeps at least one sink loaded even if it's a null one" +msgstr "" + +#: ../src/modules/module-always-sink.c:83 +msgid "Dummy Output" +msgstr "" + +#: ../src/modules/module-ladspa-sink.c:49 +msgid "Virtual LADSPA sink" +msgstr "" + +#: ../src/modules/module-ladspa-sink.c:53 +msgid "" +"sink_name= sink_properties= " +"master= format= rate= " +"channels= channel_map= plugin= label= control=" +msgstr "" + +#: ../src/modules/module-null-sink.c:55 +msgid "Clocked NULL sink" +msgstr "" + +#: ../src/modules/module-null-sink.c:291 +msgid "Null Output" +msgstr "" + +#: ../src/pulsecore/sink.c:2613 +#, fuzzy +msgid "Internal Audio" +msgstr "Internt fel" + +#: ../src/pulsecore/sink.c:2618 +msgid "Modem" +msgstr "" + +#: ../src/daemon/ltdl-bind-now.c:124 +msgid "Failed to find original lt_dlopen loader." +msgstr "" + +#: ../src/daemon/ltdl-bind-now.c:129 +#, fuzzy +msgid "Failed to allocate new dl loader." +msgstr "Misslyckades med att öppna ljudfil.\n" + +#: ../src/daemon/ltdl-bind-now.c:142 +msgid "Failed to add bind-now-loader." +msgstr "" + +#: ../src/daemon/main.c:141 +#, c-format +msgid "Got signal %s." +msgstr "Fick signal %s." + +#: ../src/daemon/main.c:168 +msgid "Exiting." +msgstr "Avslutar." + +#: ../src/daemon/main.c:186 +#, c-format +msgid "Failed to find user '%s'." +msgstr "Misslyckades med att hitta användaren \"%s\"." + +#: ../src/daemon/main.c:191 +#, c-format +msgid "Failed to find group '%s'." +msgstr "Misslyckades med att hitta gruppen \"%s\"." + +#: ../src/daemon/main.c:195 +#, c-format +msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)." +msgstr "" + +#: ../src/daemon/main.c:200 +#, c-format +msgid "GID of user '%s' and of group '%s' don't match." +msgstr "" + +#: ../src/daemon/main.c:205 +#, c-format +msgid "Home directory of user '%s' is not '%s', ignoring." +msgstr "Hemkatalogen för användaren \"%s\" är inte \"%s\", ignorerar." + +#: ../src/daemon/main.c:208 ../src/daemon/main.c:213 +#, c-format +msgid "Failed to create '%s': %s" +msgstr "Misslyckades med att skapa \"%s\": %s" + +#: ../src/daemon/main.c:220 +#, c-format +msgid "Failed to change group list: %s" +msgstr "" + +#: ../src/daemon/main.c:236 +#, c-format +msgid "Failed to change GID: %s" +msgstr "" + +#: ../src/daemon/main.c:252 +#, c-format +msgid "Failed to change UID: %s" +msgstr "" + +#: ../src/daemon/main.c:271 +msgid "Successfully dropped root privileges." +msgstr "" + +#: ../src/daemon/main.c:279 +msgid "System wide mode unsupported on this platform." +msgstr "" + +#: ../src/daemon/main.c:297 +#, c-format +msgid "setrlimit(%s, (%u, %u)) failed: %s" +msgstr "setrlimit(%s, (%u, %u)) misslyckades: %s" + +#: ../src/daemon/main.c:474 +msgid "Failed to parse command line." +msgstr "" + +#: ../src/daemon/main.c:541 +msgid "Daemon not running" +msgstr "" + +#: ../src/daemon/main.c:543 +#, c-format +msgid "Daemon running as PID %u" +msgstr "" + +#: ../src/daemon/main.c:553 +#, c-format +msgid "Failed to kill daemon: %s" +msgstr "" + +#: ../src/daemon/main.c:571 +msgid "" +"This program is not intended to be run as root (unless --system is " +"specified)." +msgstr "" +"Detta program är inte tänkt att köras som root (såvida inte --system har " +"angivits)." + +#: ../src/daemon/main.c:573 +#, fuzzy +msgid "Root privileges required." +msgstr "Root-behörighet krävs." + +#: ../src/daemon/main.c:578 +msgid "--start not supported for system instances." +msgstr "--start stöds inte för systeminstanser." + +#: ../src/daemon/main.c:583 +msgid "Running in system mode, but --disallow-exit not set!" +msgstr "" + +#: ../src/daemon/main.c:586 +msgid "Running in system mode, but --disallow-module-loading not set!" +msgstr "" + +#: ../src/daemon/main.c:589 +msgid "Running in system mode, forcibly disabling SHM mode!" +msgstr "" + +#: ../src/daemon/main.c:594 +msgid "Running in system mode, forcibly disabling exit idle time!" +msgstr "" + +#: ../src/daemon/main.c:621 +msgid "Failed to acquire stdio." +msgstr "" + +#: ../src/daemon/main.c:627 +#, c-format +msgid "pipe failed: %s" +msgstr "pipe misslyckades: %s" + +#: ../src/daemon/main.c:632 +#, c-format +msgid "fork() failed: %s" +msgstr "fork() misslyckades: %s" + +#: ../src/daemon/main.c:646 ../src/utils/pacat.c:508 +#, c-format +msgid "read() failed: %s" +msgstr "read() misslyckades: %s" + +#: ../src/daemon/main.c:652 +msgid "Daemon startup failed." +msgstr "" + +#: ../src/daemon/main.c:654 +msgid "Daemon startup successful." +msgstr "" + +#: ../src/daemon/main.c:731 +#, c-format +msgid "This is PulseAudio %s" +msgstr "Detta är PulseAudio %s" + +#: ../src/daemon/main.c:732 +#, c-format +msgid "Compilation host: %s" +msgstr "" + +#: ../src/daemon/main.c:733 +#, c-format +msgid "Compilation CFLAGS: %s" +msgstr "" + +#: ../src/daemon/main.c:736 +#, c-format +msgid "Running on host: %s" +msgstr "" + +#: ../src/daemon/main.c:739 +#, c-format +msgid "Found %u CPUs." +msgstr "" + +#: ../src/daemon/main.c:741 +#, c-format +msgid "Page size is %lu bytes" +msgstr "" + +#: ../src/daemon/main.c:744 +msgid "Compiled with Valgrind support: yes" +msgstr "" + +#: ../src/daemon/main.c:746 +msgid "Compiled with Valgrind support: no" +msgstr "" + +#: ../src/daemon/main.c:749 +#, c-format +msgid "Running in valgrind mode: %s" +msgstr "" + +#: ../src/daemon/main.c:752 +msgid "Optimized build: yes" +msgstr "" + +#: ../src/daemon/main.c:754 +msgid "Optimized build: no" +msgstr "" + +#: ../src/daemon/main.c:758 +msgid "NDEBUG defined, all asserts disabled." +msgstr "" + +#: ../src/daemon/main.c:760 +msgid "FASTPATH defined, only fast path asserts disabled." +msgstr "" + +#: ../src/daemon/main.c:762 +msgid "All asserts enabled." +msgstr "" + +#: ../src/daemon/main.c:766 +msgid "Failed to get machine ID" +msgstr "" + +#: ../src/daemon/main.c:769 +#, c-format +msgid "Machine ID is %s." +msgstr "" + +#: ../src/daemon/main.c:773 +#, c-format +msgid "Session ID is %s." +msgstr "" + +#: ../src/daemon/main.c:779 +#, c-format +msgid "Using runtime directory %s." +msgstr "" + +#: ../src/daemon/main.c:784 +#, c-format +msgid "Using state directory %s." +msgstr "" + +#: ../src/daemon/main.c:787 +#, c-format +msgid "Using modules directory %s." +msgstr "" + +#: ../src/daemon/main.c:789 +#, c-format +msgid "Running in system mode: %s" +msgstr "" + +#: ../src/daemon/main.c:792 +msgid "" +"OK, so you are running PA in system mode. Please note that you most likely " +"shouldn't be doing that.\n" +"If you do it nonetheless then it's your own fault if things don't work as " +"expected.\n" +"Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an " +"explanation why system mode is usually a bad idea." +msgstr "" + +#: ../src/daemon/main.c:809 +msgid "pa_pid_file_create() failed." +msgstr "pa_pid_file_create() misslyckades." + +#: ../src/daemon/main.c:819 +msgid "Fresh high-resolution timers available! Bon appetit!" +msgstr "" + +#: ../src/daemon/main.c:821 +msgid "" +"Dude, your kernel stinks! The chef's recommendation today is Linux with high-" +"resolution timers enabled!" +msgstr "" + +#: ../src/daemon/main.c:844 +msgid "pa_core_new() failed." +msgstr "pa_core_new() misslyckades." + +#: ../src/daemon/main.c:904 +msgid "Failed to initialize daemon." +msgstr "" + +#: ../src/daemon/main.c:909 +msgid "Daemon startup without any loaded modules, refusing to work." +msgstr "" + +#: ../src/daemon/main.c:926 +msgid "Daemon startup complete." +msgstr "" + +#: ../src/daemon/main.c:932 +msgid "Daemon shutdown initiated." +msgstr "" + +#: ../src/daemon/main.c:954 +msgid "Daemon terminated." +msgstr "" + +#: ../src/daemon/cmdline.c:115 +#, c-format +msgid "" +"%s [options]\n" +"\n" +"COMMANDS:\n" +" -h, --help Show this help\n" +" --version Show version\n" +" --dump-conf Dump default configuration\n" +" --dump-modules Dump list of available modules\n" +" --dump-resample-methods Dump available resample methods\n" +" --cleanup-shm Cleanup stale shared memory " +"segments\n" +" --start Start the daemon if it is not " +"running\n" +" -k --kill Kill a running daemon\n" +" --check Check for a running daemon (only " +"returns exit code)\n" +"\n" +"OPTIONS:\n" +" --system[=BOOL] Run as system-wide instance\n" +" -D, --daemonize[=BOOL] Daemonize after startup\n" +" --fail[=BOOL] Quit when startup fails\n" +" --high-priority[=BOOL] Try to set high nice level\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_NICE)\n" +" --realtime[=BOOL] Try to enable realtime scheduling\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_RTPRIO)\n" +" --disallow-module-loading[=BOOL] Disallow module user requested " +"module\n" +" loading/unloading after startup\n" +" --disallow-exit[=BOOL] Disallow user requested exit\n" +" --exit-idle-time=SECS Terminate the daemon when idle and " +"this\n" +" time passed\n" +" --module-idle-time=SECS Unload autoloaded modules when idle " +"and\n" +" this time passed\n" +" --scache-idle-time=SECS Unload autoloaded samples when idle " +"and\n" +" this time passed\n" +" --log-level[=LEVEL] Increase or set verbosity level\n" +" -v Increase the verbosity level\n" +" --log-target={auto,syslog,stderr} Specify the log target\n" +" --log-meta[=BOOL] Include code location in log " +"messages\n" +" --log-time[=BOOL] Include timestamps in log messages\n" +" --log-backtrace=FRAMES Include a backtrace in log messages\n" +" -p, --dl-search-path=PATH Set the search path for dynamic " +"shared\n" +" objects (plugins)\n" +" --resample-method=METHOD Use the specified resampling method\n" +" (See --dump-resample-methods for\n" +" possible values)\n" +" --use-pid-file[=BOOL] Create a PID file\n" +" --no-cpu-limit[=BOOL] Do not install CPU load limiter on\n" +" platforms that support it.\n" +" --disable-shm[=BOOL] Disable shared memory support.\n" +"\n" +"STARTUP SCRIPT:\n" +" -L, --load=\"MODULE ARGUMENTS\" Load the specified plugin module " +"with\n" +" the specified argument\n" +" -F, --file=FILENAME Run the specified script\n" +" -C Open a command line on the running " +"TTY\n" +" after startup\n" +"\n" +" -n Don't load default script file\n" +msgstr "" + +#: ../src/daemon/cmdline.c:247 +msgid "--daemonize expects boolean argument" +msgstr "--daemonize förväntar sig ett booleskt argument" + +#: ../src/daemon/cmdline.c:254 +msgid "--fail expects boolean argument" +msgstr "--fail förväntar sig ett booleskt argument" + +#: ../src/daemon/cmdline.c:264 +msgid "" +"--log-level expects log level argument (either numeric in range 0..4 or one " +"of debug, info, notice, warn, error)." +msgstr "" + +#: ../src/daemon/cmdline.c:276 +msgid "--high-priority expects boolean argument" +msgstr "--high-priority förväntar sig ett booleskt argument" + +#: ../src/daemon/cmdline.c:283 +msgid "--realtime expects boolean argument" +msgstr "--realtime förväntar sig ett booleskt argument" + +#: ../src/daemon/cmdline.c:290 +msgid "--disallow-module-loading expects boolean argument" +msgstr "--disallow-module-loading förväntar sig ett booleskt argument" + +#: ../src/daemon/cmdline.c:297 +#, fuzzy +msgid "--disallow-exit expects boolean argument" +msgstr "--disallow-exit booleskt argument" + +#: ../src/daemon/cmdline.c:304 +msgid "--use-pid-file expects boolean argument" +msgstr "--use-pid-file förväntar sig ett booleskt argument" + +#: ../src/daemon/cmdline.c:321 +msgid "Invalid log target: use either 'syslog', 'stderr' or 'auto'." +msgstr "" + +#: ../src/daemon/cmdline.c:328 +#, fuzzy +msgid "--log-time expects boolean argument" +msgstr "--realtime förväntar sig ett booleskt argument" + +#: ../src/daemon/cmdline.c:335 +#, fuzzy +msgid "--log-meta expects boolean argument" +msgstr "--disallow-exit booleskt argument" + +#: ../src/daemon/cmdline.c:354 +#, c-format +msgid "Invalid resample method '%s'." +msgstr "" + +#: ../src/daemon/cmdline.c:361 +msgid "--system expects boolean argument" +msgstr "--system förväntar sig ett booleskt argument" + +#: ../src/daemon/cmdline.c:368 +msgid "--no-cpu-limit expects boolean argument" +msgstr "--no-cpu-limit förväntar sig ett booleskt argument" + +#: ../src/daemon/cmdline.c:375 +msgid "--disable-shm expects boolean argument" +msgstr "--disable-shm förväntar sig ett booleskt argument" + +#: ../src/daemon/dumpmodules.c:60 +#, c-format +msgid "Name: %s\n" +msgstr "Namn: %s\n" + +#: ../src/daemon/dumpmodules.c:63 +#, c-format +msgid "No module information available\n" +msgstr "" + +#: ../src/daemon/dumpmodules.c:66 +#, c-format +msgid "Version: %s\n" +msgstr "Version: %s\n" + +#: ../src/daemon/dumpmodules.c:68 +#, c-format +msgid "Description: %s\n" +msgstr "Beskrivning: %s\n" + +#: ../src/daemon/dumpmodules.c:70 +#, c-format +msgid "Author: %s\n" +msgstr "Upphovsman: %s\n" + +#: ../src/daemon/dumpmodules.c:72 +#, c-format +msgid "Usage: %s\n" +msgstr "Användning: %s\n" + +#: ../src/daemon/dumpmodules.c:73 +#, c-format +msgid "Load Once: %s\n" +msgstr "" + +#: ../src/daemon/dumpmodules.c:75 +#, c-format +msgid "DEPRECATION WARNING: %s\n" +msgstr "" + +#: ../src/daemon/dumpmodules.c:79 +#, c-format +msgid "Path: %s\n" +msgstr "Sökväg: %s\n" + +#: ../src/daemon/daemon-conf.c:232 +#, c-format +msgid "[%s:%u] Invalid log target '%s'." +msgstr "" + +#: ../src/daemon/daemon-conf.c:248 +#, c-format +msgid "[%s:%u] Invalid log level '%s'." +msgstr "" + +#: ../src/daemon/daemon-conf.c:264 +#, c-format +msgid "[%s:%u] Invalid resample method '%s'." +msgstr "" + +#: ../src/daemon/daemon-conf.c:287 +#, c-format +msgid "[%s:%u] Invalid rlimit '%s'." +msgstr "" + +#: ../src/daemon/daemon-conf.c:294 +#, c-format +msgid "[%s:%u] rlimit not supported on this platform." +msgstr "" + +#: ../src/daemon/daemon-conf.c:310 +#, c-format +msgid "[%s:%u] Invalid sample format '%s'." +msgstr "" + +#: ../src/daemon/daemon-conf.c:328 +#, c-format +msgid "[%s:%u] Invalid sample rate '%s'." +msgstr "" + +#: ../src/daemon/daemon-conf.c:352 +#, c-format +msgid "[%s:%u] Invalid sample channels '%s'." +msgstr "" + +#: ../src/daemon/daemon-conf.c:370 +#, c-format +msgid "[%s:%u] Invalid channel map '%s'." +msgstr "" + +#: ../src/daemon/daemon-conf.c:388 +#, c-format +msgid "[%s:%u] Invalid number of fragments '%s'." +msgstr "" + +#: ../src/daemon/daemon-conf.c:406 +#, c-format +msgid "[%s:%u] Invalid fragment size '%s'." +msgstr "" + +#: ../src/daemon/daemon-conf.c:424 +#, c-format +msgid "[%s:%u] Invalid nice level '%s'." +msgstr "" + +#: ../src/daemon/daemon-conf.c:546 +#, c-format +msgid "Failed to open configuration file: %s" +msgstr "Misslyckades med att öppna konfigurationsfil: %s" + +#: ../src/daemon/daemon-conf.c:562 +msgid "" +"The specified default channel map has a different number of channels than " +"the specified default number of channels." +msgstr "" + +#: ../src/daemon/daemon-conf.c:638 +#, c-format +msgid "### Read from configuration file: %s ###\n" +msgstr "" + +#: ../src/daemon/caps.c:62 +#, fuzzy +msgid "Cleaning up privileges." +msgstr "Släpper root-behörighet." + +#: ../src/daemon/pulseaudio.desktop.in.h:1 +msgid "PulseAudio Sound System" +msgstr "" + +#: ../src/daemon/pulseaudio.desktop.in.h:2 +msgid "Start the PulseAudio Sound System" +msgstr "" + +#: ../src/pulse/channelmap.c:105 ../src/pulse/channelmap.c:757 +msgid "Mono" +msgstr "Mono" + +#: ../src/pulse/channelmap.c:107 +msgid "Front Center" +msgstr "Center fram" + +#: ../src/pulse/channelmap.c:108 +msgid "Front Left" +msgstr "Vänster fram" + +#: ../src/pulse/channelmap.c:109 +msgid "Front Right" +msgstr "Höger fram" + +#: ../src/pulse/channelmap.c:111 +msgid "Rear Center" +msgstr "Center bak" + +#: ../src/pulse/channelmap.c:112 +msgid "Rear Left" +msgstr "Vänster bak" + +#: ../src/pulse/channelmap.c:113 +msgid "Rear Right" +msgstr "Höger bak" + +#: ../src/pulse/channelmap.c:115 +msgid "Low Frequency Emmiter" +msgstr "" + +#: ../src/pulse/channelmap.c:117 +msgid "Front Left-of-center" +msgstr "Vänster-om-center fram" + +#: ../src/pulse/channelmap.c:118 +msgid "Front Right-of-center" +msgstr "Höger-om-center fram" + +#: ../src/pulse/channelmap.c:120 +msgid "Side Left" +msgstr "Vänster sida" + +#: ../src/pulse/channelmap.c:121 +msgid "Side Right" +msgstr "Höger sida" + +#: ../src/pulse/channelmap.c:123 +msgid "Auxiliary 0" +msgstr "" + +#: ../src/pulse/channelmap.c:124 +msgid "Auxiliary 1" +msgstr "" + +#: ../src/pulse/channelmap.c:125 +msgid "Auxiliary 2" +msgstr "" + +#: ../src/pulse/channelmap.c:126 +msgid "Auxiliary 3" +msgstr "" + +#: ../src/pulse/channelmap.c:127 +msgid "Auxiliary 4" +msgstr "" + +#: ../src/pulse/channelmap.c:128 +msgid "Auxiliary 5" +msgstr "" + +#: ../src/pulse/channelmap.c:129 +msgid "Auxiliary 6" +msgstr "" + +#: ../src/pulse/channelmap.c:130 +msgid "Auxiliary 7" +msgstr "" + +#: ../src/pulse/channelmap.c:131 +msgid "Auxiliary 8" +msgstr "" + +#: ../src/pulse/channelmap.c:132 +msgid "Auxiliary 9" +msgstr "" + +#: ../src/pulse/channelmap.c:133 +msgid "Auxiliary 10" +msgstr "" + +#: ../src/pulse/channelmap.c:134 +msgid "Auxiliary 11" +msgstr "" + +#: ../src/pulse/channelmap.c:135 +msgid "Auxiliary 12" +msgstr "" + +#: ../src/pulse/channelmap.c:136 +msgid "Auxiliary 13" +msgstr "" + +#: ../src/pulse/channelmap.c:137 +msgid "Auxiliary 14" +msgstr "" + +#: ../src/pulse/channelmap.c:138 +msgid "Auxiliary 15" +msgstr "" + +#: ../src/pulse/channelmap.c:139 +msgid "Auxiliary 16" +msgstr "" + +#: ../src/pulse/channelmap.c:140 +msgid "Auxiliary 17" +msgstr "" + +#: ../src/pulse/channelmap.c:141 +msgid "Auxiliary 18" +msgstr "" + +#: ../src/pulse/channelmap.c:142 +msgid "Auxiliary 19" +msgstr "" + +#: ../src/pulse/channelmap.c:143 +msgid "Auxiliary 20" +msgstr "" + +#: ../src/pulse/channelmap.c:144 +msgid "Auxiliary 21" +msgstr "" + +#: ../src/pulse/channelmap.c:145 +msgid "Auxiliary 22" +msgstr "" + +#: ../src/pulse/channelmap.c:146 +msgid "Auxiliary 23" +msgstr "" + +#: ../src/pulse/channelmap.c:147 +msgid "Auxiliary 24" +msgstr "" + +#: ../src/pulse/channelmap.c:148 +msgid "Auxiliary 25" +msgstr "" + +#: ../src/pulse/channelmap.c:149 +msgid "Auxiliary 26" +msgstr "" + +#: ../src/pulse/channelmap.c:150 +msgid "Auxiliary 27" +msgstr "" + +#: ../src/pulse/channelmap.c:151 +msgid "Auxiliary 28" +msgstr "" + +#: ../src/pulse/channelmap.c:152 +msgid "Auxiliary 29" +msgstr "" + +#: ../src/pulse/channelmap.c:153 +msgid "Auxiliary 30" +msgstr "" + +#: ../src/pulse/channelmap.c:154 +msgid "Auxiliary 31" +msgstr "" + +#: ../src/pulse/channelmap.c:156 +msgid "Top Center" +msgstr "" + +#: ../src/pulse/channelmap.c:158 +msgid "Top Front Center" +msgstr "" + +#: ../src/pulse/channelmap.c:159 +msgid "Top Front Left" +msgstr "" + +#: ../src/pulse/channelmap.c:160 +msgid "Top Front Right" +msgstr "" + +#: ../src/pulse/channelmap.c:162 +msgid "Top Rear Center" +msgstr "" + +#: ../src/pulse/channelmap.c:163 +msgid "Top Rear Left" +msgstr "" + +#: ../src/pulse/channelmap.c:164 +msgid "Top Rear Right" +msgstr "" + +#: ../src/pulse/channelmap.c:484 ../src/pulse/sample.c:170 +#: ../src/pulse/volume.c:295 ../src/pulse/volume.c:321 +#: ../src/pulse/volume.c:341 ../src/pulse/volume.c:371 +#, fuzzy +msgid "(invalid)" +msgstr "Ogiltig" + +#: ../src/pulse/channelmap.c:761 +msgid "Stereo" +msgstr "" + +#: ../src/pulse/channelmap.c:766 +msgid "Surround 4.0" +msgstr "" + +#: ../src/pulse/channelmap.c:772 +msgid "Surround 4.1" +msgstr "" + +#: ../src/pulse/channelmap.c:778 +msgid "Surround 5.0" +msgstr "" + +#: ../src/pulse/channelmap.c:784 +msgid "Surround 5.1" +msgstr "" + +#: ../src/pulse/channelmap.c:791 +msgid "Surround 7.1" +msgstr "" + +#: ../src/pulse/error.c:43 +msgid "OK" +msgstr "OK" + +#: ../src/pulse/error.c:44 +msgid "Access denied" +msgstr "Åtkomst nekad" + +#: ../src/pulse/error.c:45 +msgid "Unknown command" +msgstr "Okänt kommando" + +#: ../src/pulse/error.c:46 +msgid "Invalid argument" +msgstr "Ogiltigt argument" + +#: ../src/pulse/error.c:47 +msgid "Entity exists" +msgstr "Entiteten finns" + +#: ../src/pulse/error.c:48 +msgid "No such entity" +msgstr "Ingen sådan entitet" + +#: ../src/pulse/error.c:49 +msgid "Connection refused" +msgstr "Anslutning nekades" + +#: ../src/pulse/error.c:50 +msgid "Protocol error" +msgstr "Protokollfel" + +#: ../src/pulse/error.c:51 +msgid "Timeout" +msgstr "Tidsgräns nåddes" + +#: ../src/pulse/error.c:52 +msgid "No authorization key" +msgstr "" + +#: ../src/pulse/error.c:53 +msgid "Internal error" +msgstr "Internt fel" + +#: ../src/pulse/error.c:54 +msgid "Connection terminated" +msgstr "Anslutningen terminerad" + +#: ../src/pulse/error.c:55 +msgid "Entity killed" +msgstr "" + +#: ../src/pulse/error.c:56 +msgid "Invalid server" +msgstr "Ogiltig server" + +#: ../src/pulse/error.c:57 +msgid "Module initalization failed" +msgstr "" + +#: ../src/pulse/error.c:58 +msgid "Bad state" +msgstr "Felaktigt tillstånd" + +#: ../src/pulse/error.c:59 +msgid "No data" +msgstr "Inget data" + +#: ../src/pulse/error.c:60 +msgid "Incompatible protocol version" +msgstr "" + +#: ../src/pulse/error.c:61 +msgid "Too large" +msgstr "För stor" + +#: ../src/pulse/error.c:62 +msgid "Not supported" +msgstr "Stöds inte" + +#: ../src/pulse/error.c:63 +msgid "Unknown error code" +msgstr "Okänd felkod" + +#: ../src/pulse/error.c:64 +msgid "No such extension" +msgstr "" + +#: ../src/pulse/error.c:65 +msgid "Obsolete functionality" +msgstr "" + +#: ../src/pulse/error.c:66 +msgid "Missing implementation" +msgstr "" + +#: ../src/pulse/error.c:67 +msgid "Client forked" +msgstr "" + +#: ../src/pulse/error.c:68 +msgid "Input/Output error" +msgstr "" + +#: ../src/pulse/error.c:69 +msgid "Device or resource busy" +msgstr "" + +#: ../src/pulse/sample.c:172 +#, c-format +msgid "%s %uch %uHz" +msgstr "" + +#: ../src/pulse/sample.c:184 +#, c-format +msgid "%0.1f GiB" +msgstr "" + +#: ../src/pulse/sample.c:186 +#, c-format +msgid "%0.1f MiB" +msgstr "" + +#: ../src/pulse/sample.c:188 +#, c-format +msgid "%0.1f KiB" +msgstr "" + +#: ../src/pulse/sample.c:190 +#, c-format +msgid "%u B" +msgstr "" + +#: ../src/pulse/client-conf-x11.c:55 ../src/utils/pax11publish.c:100 +msgid "XOpenDisplay() failed" +msgstr "XOpenDisplay() misslyckades" + +#: ../src/pulse/client-conf-x11.c:93 +msgid "Failed to parse cookie data" +msgstr "" + +#: ../src/pulse/client-conf.c:111 +#, c-format +msgid "Failed to open configuration file '%s': %s" +msgstr "Misslyckades med att öppna konfigurationsfilen \"%s\": %s" + +#: ../src/pulse/context.c:550 +msgid "No cookie loaded. Attempting to connect without." +msgstr "" + +#: ../src/pulse/context.c:693 +#, c-format +msgid "fork(): %s" +msgstr "fork(): %s" + +#: ../src/pulse/context.c:748 +#, c-format +msgid "waitpid(): %s" +msgstr "waitpid(): %s" + +#: ../src/pulse/context.c:1438 +#, c-format +msgid "Received message for unknown extension '%s'" +msgstr "" + +#: ../src/utils/pacat.c:108 +#, fuzzy, c-format +msgid "Failed to drain stream: %s" +msgstr "Misslyckades med att hitta användaren \"%s\"." + +#: ../src/utils/pacat.c:113 +msgid "Playback stream drained." +msgstr "" + +#: ../src/utils/pacat.c:123 +msgid "Draining connection to server." +msgstr "" + +#: ../src/utils/pacat.c:136 +#, fuzzy, c-format +msgid "pa_stream_drain(): %s" +msgstr "pa_stream_drain(): %s\n" + +#: ../src/utils/pacat.c:159 +#, fuzzy, c-format +msgid "pa_stream_write() failed: %s" +msgstr "pa_stream_write() misslyckades: %s\n" + +#: ../src/utils/pacat.c:197 +#, fuzzy, c-format +msgid "pa_stream_begin_write() failed: %s" +msgstr "pa_stream_write() misslyckades: %s\n" + +#: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267 +#, fuzzy, c-format +msgid "pa_stream_peek() failed: %s" +msgstr "pa_stream_peek() misslyckades: %s\n" + +#: ../src/utils/pacat.c:307 +msgid "Stream successfully created." +msgstr "" + +#: ../src/utils/pacat.c:310 +#, fuzzy, c-format +msgid "pa_stream_get_buffer_attr() failed: %s" +msgstr "pa_stream_get_buffer_attr() misslyckades: %s\n" + +#: ../src/utils/pacat.c:314 +#, c-format +msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u" +msgstr "" + +#: ../src/utils/pacat.c:317 +#, c-format +msgid "Buffer metrics: maxlength=%u, fragsize=%u" +msgstr "" + +#: ../src/utils/pacat.c:321 +#, c-format +msgid "Using sample spec '%s', channel map '%s'." +msgstr "" + +#: ../src/utils/pacat.c:325 +#, c-format +msgid "Connected to device %s (%u, %ssuspended)." +msgstr "" + +#: ../src/utils/pacat.c:335 +#, fuzzy, c-format +msgid "Stream error: %s" +msgstr "Strömfel: %s\n" + +#: ../src/utils/pacat.c:345 +#, c-format +msgid "Stream device suspended.%s" +msgstr "" + +#: ../src/utils/pacat.c:347 +#, c-format +msgid "Stream device resumed.%s" +msgstr "" + +#: ../src/utils/pacat.c:355 +#, fuzzy, c-format +msgid "Stream underrun.%s" +msgstr "Strömfel: %s\n" + +#: ../src/utils/pacat.c:362 +#, fuzzy, c-format +msgid "Stream overrun.%s" +msgstr "Strömfel: %s\n" + +#: ../src/utils/pacat.c:369 +#, c-format +msgid "Stream started.%s" +msgstr "" + +#: ../src/utils/pacat.c:376 +#, c-format +msgid "Stream moved to device %s (%u, %ssuspended).%s" +msgstr "" + +#: ../src/utils/pacat.c:376 +msgid "not " +msgstr "inte " + +#: ../src/utils/pacat.c:383 +#, c-format +msgid "Stream buffer attributes changed.%s" +msgstr "" + +#: ../src/utils/pacat.c:415 +#, fuzzy, c-format +msgid "Connection established.%s" +msgstr "Anslutning etablerad.\n" + +#: ../src/utils/pacat.c:418 +#, fuzzy, c-format +msgid "pa_stream_new() failed: %s" +msgstr "pa_stream_new() misslyckades: %s\n" + +#: ../src/utils/pacat.c:450 +#, fuzzy, c-format +msgid "pa_stream_connect_playback() failed: %s" +msgstr "pa_stream_connect_playback() misslyckades: %s\n" + +#: ../src/utils/pacat.c:456 +#, fuzzy, c-format +msgid "pa_stream_connect_record() failed: %s" +msgstr "pa_stream_connect_record() misslyckades: %s\n" + +#: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857 +#, fuzzy, c-format +msgid "Connection failure: %s" +msgstr "Anslutningsfel: %s\n" + +#: ../src/utils/pacat.c:503 +#, fuzzy +msgid "Got EOF." +msgstr "Fick filslut.\n" + +#: ../src/utils/pacat.c:540 +#, fuzzy, c-format +msgid "write() failed: %s" +msgstr "write() misslyckades: %s\n" + +#: ../src/utils/pacat.c:561 +#, fuzzy +msgid "Got signal, exiting." +msgstr "Fick signal %s." + +#: ../src/utils/pacat.c:575 +#, fuzzy, c-format +msgid "Failed to get latency: %s" +msgstr "Misslyckades med att få statistik: %s\n" + +#: ../src/utils/pacat.c:580 +#, fuzzy, c-format +msgid "Time: %0.3f sec; Latency: %0.0f usec." +msgstr "Tid: %0.3f sec; Latens: %0.0f ms \r" + +#: ../src/utils/pacat.c:599 +#, fuzzy, c-format +msgid "pa_stream_update_timing_info() failed: %s" +msgstr "pa_stream_update_timing_info() misslyckades: %s\n" + +#: ../src/utils/pacat.c:609 +#, c-format +msgid "" +"%s [options]\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -r, --record Create a connection for recording\n" +" -p, --playback Create a connection for playback\n" +"\n" +" -v, --verbose Enable verbose operations\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -d, --device=DEVICE The name of the sink/source to " +"connect to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" +" --stream-name=NAME How to call this stream on the " +"server\n" +" --volume=VOLUME Specify the initial (linear) volume " +"in range 0...65536\n" +" --rate=SAMPLERATE The sample rate in Hz (defaults to " +"44100)\n" +" --format=SAMPLEFORMAT The sample type, one of s16le, " +"s16be, u8, float32le,\n" +" float32be, ulaw, alaw, s32le, s32be, " +"s24le, s24be,\n" +" s24-32le, s24-32be (defaults to " +"s16ne)\n" +" --channels=CHANNELS The number of channels, 1 for mono, " +"2 for stereo\n" +" (defaults to 2)\n" +" --channel-map=CHANNELMAP Channel map to use instead of the " +"default\n" +" --fix-format Take the sample format from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-rate Take the sampling rate from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-channels Take the number of channels and the " +"channel map\n" +" from the sink the stream is being " +"connected to.\n" +" --no-remix Don't upmix or downmix channels.\n" +" --no-remap Map channels by index instead of " +"name.\n" +" --latency=BYTES Request the specified latency in " +"bytes.\n" +" --process-time=BYTES Request the specified process time " +"per request in bytes.\n" +" --property=PROPERTY=VALUE Set the specified property to the " +"specified value.\n" +" --raw Record/play raw PCM data.\n" +" --file-format=FFORMAT Record/play formatted PCM data.\n" +" --list-file-formats List available file formats.\n" +msgstr "" + +#: ../src/utils/pacat.c:731 +#, c-format +msgid "" +"pacat %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" + +#: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953 +#, fuzzy, c-format +msgid "Invalid client name '%s'" +msgstr "Ogiltig server" + +#: ../src/utils/pacat.c:779 +#, fuzzy, c-format +msgid "Invalid stream name '%s'" +msgstr "Ogiltig server" + +#: ../src/utils/pacat.c:816 +#, fuzzy, c-format +msgid "Invalid channel map '%s'" +msgstr "Ogiltig server" + +#: ../src/utils/pacat.c:845 +#, c-format +msgid "Invalid latency specification '%s'" +msgstr "" + +#: ../src/utils/pacat.c:852 +#, fuzzy, c-format +msgid "Invalid process time specification '%s'" +msgstr "Ogiltig server" + +#: ../src/utils/pacat.c:864 +#, fuzzy, c-format +msgid "Invalid property '%s'" +msgstr "Ogiltig server" + +#: ../src/utils/pacat.c:881 +#, c-format +msgid "Unknown file format %s." +msgstr "" + +#: ../src/utils/pacat.c:900 +#, fuzzy +msgid "Invalid sample specification" +msgstr "Misslyckades med att få modulinformation: %s\n" + +#: ../src/utils/pacat.c:910 +#, fuzzy, c-format +msgid "open(): %s" +msgstr "open(): %s\n" + +#: ../src/utils/pacat.c:915 +#, fuzzy, c-format +msgid "dup2(): %s" +msgstr "dup2(): %s\n" + +#: ../src/utils/pacat.c:922 +#, fuzzy +msgid "Too many arguments." +msgstr "För många argument.\n" + +#: ../src/utils/pacat.c:933 +#, fuzzy +msgid "Failed to generate sample specification for file." +msgstr "Misslyckades med att få modulinformation: %s\n" + +#: ../src/utils/pacat.c:953 +#, fuzzy +msgid "Failed to open audio file." +msgstr "Misslyckades med att öppna ljudfil.\n" + +#: ../src/utils/pacat.c:959 +msgid "" +"Warning: specified sample specification will be overwritten with " +"specification from file." +msgstr "" + +#: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997 +#, fuzzy +msgid "Failed to determine sample specification from file." +msgstr "Misslyckades med att få modulinformation: %s\n" + +#: ../src/utils/pacat.c:971 +msgid "Warning: Failed to determine channel map from file." +msgstr "" + +#: ../src/utils/pacat.c:982 +#, fuzzy +msgid "Channel map doesn't match sample specification" +msgstr "Misslyckades med att få modulinformation: %s\n" + +#: ../src/utils/pacat.c:993 +msgid "Warning: failed to write channel map to file." +msgstr "" + +#: ../src/utils/pacat.c:1008 +#, c-format +msgid "" +"Opening a %s stream with sample specification '%s' and channel map '%s'." +msgstr "" + +#: ../src/utils/pacat.c:1009 +msgid "recording" +msgstr "" + +#: ../src/utils/pacat.c:1009 +msgid "playback" +msgstr "" + +#: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267 +#, fuzzy +msgid "pa_mainloop_new() failed." +msgstr "pa_mainloop_new() misslyckades.\n" + +#: ../src/utils/pacat.c:1054 +#, fuzzy +msgid "io_new() failed." +msgstr "io_new() misslyckades.\n" + +#: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279 +#, fuzzy +msgid "pa_context_new() failed." +msgstr "pa_context_new() misslyckades.\n" + +#: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285 +#, fuzzy, c-format +msgid "pa_context_connect() failed: %s" +msgstr "pa_context_new() misslyckades.\n" + +#: ../src/utils/pacat.c:1075 +#, fuzzy +msgid "pa_context_rttime_new() failed." +msgstr "pa_context_new() misslyckades.\n" + +#: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290 +#, fuzzy +msgid "pa_mainloop_run() failed." +msgstr "pa_mainloop_run() misslyckades.\n" + +#: ../src/utils/pasuspender.c:81 +#, c-format +msgid "fork(): %s\n" +msgstr "fork(): %s\n" + +#: ../src/utils/pasuspender.c:92 +#, c-format +msgid "execvp(): %s\n" +msgstr "execvp(): %s\n" + +#: ../src/utils/pasuspender.c:109 +#, c-format +msgid "Failure to suspend: %s\n" +msgstr "" + +#: ../src/utils/pasuspender.c:124 +#, c-format +msgid "Failure to resume: %s\n" +msgstr "" + +#: ../src/utils/pasuspender.c:147 +#, c-format +msgid "WARNING: Sound server is not local, not suspending.\n" +msgstr "" + +#: ../src/utils/pasuspender.c:159 +#, c-format +msgid "Connection failure: %s\n" +msgstr "Anslutningsfel: %s\n" + +#: ../src/utils/pasuspender.c:176 +#, c-format +msgid "Got SIGINT, exiting.\n" +msgstr "" + +#: ../src/utils/pasuspender.c:194 +#, c-format +msgid "WARNING: Child process terminated by signal %u\n" +msgstr "" + +#: ../src/utils/pasuspender.c:212 +#, c-format +msgid "" +"%s [options] ... \n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +"\n" +msgstr "" + +#: ../src/utils/pasuspender.c:248 +#, c-format +msgid "" +"pasuspender %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pasuspender %s\n" +"Kompilerad med libpulse %s\n" +"Länkad med libpulse %s\n" + +#: ../src/utils/pasuspender.c:277 +#, c-format +msgid "pa_mainloop_new() failed.\n" +msgstr "pa_mainloop_new() misslyckades.\n" + +#: ../src/utils/pasuspender.c:290 +#, c-format +msgid "pa_context_new() failed.\n" +msgstr "pa_context_new() misslyckades.\n" + +#: ../src/utils/pasuspender.c:298 +#, c-format +msgid "pa_mainloop_run() failed.\n" +msgstr "pa_mainloop_run() misslyckades.\n" + +#: ../src/utils/pactl.c:135 +#, fuzzy, c-format +msgid "Failed to get statistics: %s" +msgstr "Misslyckades med att få statistik: %s\n" + +#: ../src/utils/pactl.c:141 +#, c-format +msgid "Currently in use: %u blocks containing %s bytes total.\n" +msgstr "" + +#: ../src/utils/pactl.c:144 +#, c-format +msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n" +msgstr "" + +#: ../src/utils/pactl.c:147 +#, c-format +msgid "Sample cache size: %s\n" +msgstr "" + +#: ../src/utils/pactl.c:156 +#, fuzzy, c-format +msgid "Failed to get server information: %s" +msgstr "Misslyckades med att få modulinformation: %s\n" + +#: ../src/utils/pactl.c:164 +#, c-format +msgid "" +"User name: %s\n" +"Host Name: %s\n" +"Server Name: %s\n" +"Server Version: %s\n" +"Default Sample Specification: %s\n" +"Default Channel Map: %s\n" +"Default Sink: %s\n" +"Default Source: %s\n" +"Cookie: %08x\n" +msgstr "" + +#: ../src/utils/pactl.c:205 +#, fuzzy, c-format +msgid "Failed to get sink information: %s" +msgstr "Misslyckades med att få klientinformation: %s\n" + +#: ../src/utils/pactl.c:221 +#, c-format +msgid "" +"Sink #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor Source: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" + +#: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360 +#, c-format +msgid "\tPorts:\n" +msgstr "" + +#: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366 +#, fuzzy, c-format +msgid "\tActive Port: %s\n" +msgstr "pipe misslyckades: %s" + +#: ../src/utils/pactl.c:297 +#, fuzzy, c-format +msgid "Failed to get source information: %s" +msgstr "Misslyckades med att få modulinformation: %s\n" + +#: ../src/utils/pactl.c:313 +#, c-format +msgid "" +"Source #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor of Sink: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" + +#: ../src/utils/pactl.c:345 ../src/utils/pactl.c:401 ../src/utils/pactl.c:436 +#: ../src/utils/pactl.c:473 ../src/utils/pactl.c:532 ../src/utils/pactl.c:533 +#: ../src/utils/pactl.c:543 ../src/utils/pactl.c:587 ../src/utils/pactl.c:588 +#: ../src/utils/pactl.c:594 ../src/utils/pactl.c:637 ../src/utils/pactl.c:638 +#: ../src/utils/pactl.c:645 +msgid "n/a" +msgstr "" + +#: ../src/utils/pactl.c:375 +#, fuzzy, c-format +msgid "Failed to get module information: %s" +msgstr "Misslyckades med att få modulinformation: %s\n" + +#: ../src/utils/pactl.c:393 +#, c-format +msgid "" +"Module #%u\n" +"\tName: %s\n" +"\tArgument: %s\n" +"\tUsage counter: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" + +#: ../src/utils/pactl.c:412 +#, fuzzy, c-format +msgid "Failed to get client information: %s" +msgstr "Misslyckades med att få klientinformation: %s\n" + +#: ../src/utils/pactl.c:430 +#, c-format +msgid "" +"Client #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" + +#: ../src/utils/pactl.c:447 +#, fuzzy, c-format +msgid "Failed to get card information: %s" +msgstr "Misslyckades med att få modulinformation: %s\n" + +#: ../src/utils/pactl.c:465 +#, c-format +msgid "" +"Card #%u\n" +"\tName: %s\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" + +#: ../src/utils/pactl.c:479 +#, c-format +msgid "\tProfiles:\n" +msgstr "" + +#: ../src/utils/pactl.c:485 +#, fuzzy, c-format +msgid "\tActive Profile: %s\n" +msgstr "pipe misslyckades: %s" + +#: ../src/utils/pactl.c:496 +#, fuzzy, c-format +msgid "Failed to get sink input information: %s" +msgstr "Misslyckades med att få klientinformation: %s\n" + +#: ../src/utils/pactl.c:515 +#, c-format +msgid "" +"Sink Input #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSink: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tMute: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSink Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" + +#: ../src/utils/pactl.c:554 +#, fuzzy, c-format +msgid "Failed to get source output information: %s" +msgstr "Misslyckades med att få modulinformation: %s\n" + +#: ../src/utils/pactl.c:574 +#, c-format +msgid "" +"Source Output #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSource: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSource Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" + +#: ../src/utils/pactl.c:605 +#, fuzzy, c-format +msgid "Failed to get sample information: %s" +msgstr "Misslyckades med att få modulinformation: %s\n" + +#: ../src/utils/pactl.c:623 +#, c-format +msgid "" +"Sample #%u\n" +"\tName: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tDuration: %0.1fs\n" +"\tSize: %s\n" +"\tLazy: %s\n" +"\tFilename: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" + +#: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663 +#, fuzzy, c-format +msgid "Failure: %s" +msgstr "Fel: %s\n" + +#: ../src/utils/pactl.c:687 +#, fuzzy, c-format +msgid "Failed to upload sample: %s" +msgstr "Misslyckades med att hitta användaren \"%s\"." + +#: ../src/utils/pactl.c:704 +msgid "Premature end of file" +msgstr "" + +#: ../src/utils/pactl.c:863 +#, fuzzy +msgid "Got SIGINT, exiting." +msgstr "Fick signal %s." + +#: ../src/utils/pactl.c:869 +#, c-format +msgid "" +"%s [options] stat\n" +"%s [options] list\n" +"%s [options] exit\n" +"%s [options] upload-sample FILENAME [NAME]\n" +"%s [options] play-sample NAME [SINK]\n" +"%s [options] remove-sample NAME\n" +"%s [options] move-sink-input SINKINPUT SINK\n" +"%s [options] move-source-output SOURCEOUTPUT SOURCE\n" +"%s [options] load-module NAME [ARGS ...]\n" +"%s [options] unload-module MODULE\n" +"%s [options] suspend-sink SINK 1|0\n" +"%s [options] suspend-source SOURCE 1|0\n" +"%s [options] set-card-profile CARD PROFILE\n" +"%s [options] set-sink-port SINK PORT\n" +"%s [options] set-source-port SOURCE PORT\n" +"%s [options] set-sink-volume SINK VOLUME\n" +"%s [options] set-source-volume SOURCE VOLUME\n" +"%s [options] set-sink-input-volume SINKINPUT VOLUME\n" +"%s [options] set-sink-mute SINK 1|0\n" +"%s [options] set-source-mute SOURCE 1|0\n" +"%s [options] set-sink-input-mute SINKINPUT 1|0\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" +msgstr "" + +#: ../src/utils/pactl.c:933 +#, c-format +msgid "" +"pactl %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pactl %s\n" +"Kompilerad med libpulse %s\n" +"Länkad med libpulse %s\n" + +#: ../src/utils/pactl.c:979 +msgid "Please specify a sample file to load" +msgstr "" + +#: ../src/utils/pactl.c:992 +#, fuzzy +msgid "Failed to open sound file." +msgstr "Misslyckades med att öppna ljudfil.\n" + +#: ../src/utils/pactl.c:1004 +#, fuzzy +msgid "Warning: Failed to determine sample specification from file." +msgstr "Misslyckades med att få modulinformation: %s\n" + +#: ../src/utils/pactl.c:1014 +msgid "You have to specify a sample name to play" +msgstr "" + +#: ../src/utils/pactl.c:1026 +msgid "You have to specify a sample name to remove" +msgstr "" + +#: ../src/utils/pactl.c:1035 +msgid "You have to specify a sink input index and a sink" +msgstr "" + +#: ../src/utils/pactl.c:1045 +msgid "You have to specify a source output index and a source" +msgstr "" + +#: ../src/utils/pactl.c:1060 +msgid "You have to specify a module name and arguments." +msgstr "" + +#: ../src/utils/pactl.c:1080 +msgid "You have to specify a module index" +msgstr "" + +#: ../src/utils/pactl.c:1090 +msgid "" +"You may not specify more than one sink. You have to specify a boolean value." +msgstr "" + +#: ../src/utils/pactl.c:1103 +msgid "" +"You may not specify more than one source. You have to specify a boolean " +"value." +msgstr "" + +#: ../src/utils/pactl.c:1115 +msgid "You have to specify a card name/index and a profile name" +msgstr "" + +#: ../src/utils/pactl.c:1126 +msgid "You have to specify a sink name/index and a port name" +msgstr "" + +#: ../src/utils/pactl.c:1137 +msgid "You have to specify a source name/index and a port name" +msgstr "" + +#: ../src/utils/pactl.c:1149 +msgid "You have to specify a sink name/index and a volume" +msgstr "" + +#: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171 +#: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209 +#: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248 +#, fuzzy +msgid "Invalid volume specification" +msgstr "Misslyckades med att få modulinformation: %s\n" + +#: ../src/utils/pactl.c:1166 +msgid "You have to specify a source name/index and a volume" +msgstr "" + +#: ../src/utils/pactl.c:1183 +msgid "You have to specify a sink input index and a volume" +msgstr "" + +#: ../src/utils/pactl.c:1188 +msgid "Invalid sink input index" +msgstr "" + +#: ../src/utils/pactl.c:1204 +msgid "You have to specify a sink name/index and a mute boolean" +msgstr "" + +#: ../src/utils/pactl.c:1221 +msgid "You have to specify a source name/index and a mute boolean" +msgstr "" + +#: ../src/utils/pactl.c:1238 +msgid "You have to specify a sink input index and a mute boolean" +msgstr "" + +#: ../src/utils/pactl.c:1243 +#, fuzzy +msgid "Invalid sink input index specification" +msgstr "Misslyckades med att få modulinformation: %s\n" + +#: ../src/utils/pactl.c:1262 +msgid "No valid command specified." +msgstr "" + +#: ../src/utils/pax11publish.c:61 +#, c-format +msgid "" +"%s [-D display] [-S server] [-O sink] [-I source] [-c file] [-d|-e|-i|-r]\n" +"\n" +" -d Show current PulseAudio data attached to X11 display (default)\n" +" -e Export local PulseAudio data to X11 display\n" +" -i Import PulseAudio data from X11 display to local environment " +"variables and cookie file.\n" +" -r Remove PulseAudio data from X11 display\n" +msgstr "" + +#: ../src/utils/pax11publish.c:94 +#, c-format +msgid "Failed to parse command line.\n" +msgstr "Misslyckades med att tolka kommandorad.\n" + +#: ../src/utils/pax11publish.c:108 +#, c-format +msgid "Server: %s\n" +msgstr "Server: %s\n" + +#: ../src/utils/pax11publish.c:110 +#, c-format +msgid "Source: %s\n" +msgstr "Källa: %s\n" + +#: ../src/utils/pax11publish.c:112 +#, c-format +msgid "Sink: %s\n" +msgstr "Sink: %s\n" + +#: ../src/utils/pax11publish.c:114 +#, c-format +msgid "Cookie: %s\n" +msgstr "Kaka: %s\n" + +#: ../src/utils/pax11publish.c:132 +#, c-format +msgid "Failed to parse cookie data\n" +msgstr "" + +#: ../src/utils/pax11publish.c:137 +#, c-format +msgid "Failed to save cookie data\n" +msgstr "" + +#: ../src/utils/pax11publish.c:152 +#, c-format +msgid "Failed to load client configuration file.\n" +msgstr "" + +#: ../src/utils/pax11publish.c:157 +#, c-format +msgid "Failed to read environment configuration data.\n" +msgstr "" + +#: ../src/utils/pax11publish.c:174 +#, c-format +msgid "Failed to get FQDN.\n" +msgstr "" + +#: ../src/utils/pax11publish.c:194 +#, c-format +msgid "Failed to load cookie data\n" +msgstr "" + +#: ../src/utils/pax11publish.c:211 +#, c-format +msgid "Not yet implemented.\n" +msgstr "Ännu inte implementerad.\n" + +#: ../src/utils/pacmd.c:69 +msgid "No PulseAudio daemon running, or not running as session daemon." +msgstr "" + +#: ../src/utils/pacmd.c:74 +#, c-format +msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s" +msgstr "" + +#: ../src/utils/pacmd.c:91 +#, c-format +msgid "connect(): %s" +msgstr "connect(): %s" + +#: ../src/utils/pacmd.c:99 +msgid "Failed to kill PulseAudio daemon." +msgstr "" + +#: ../src/utils/pacmd.c:107 +msgid "Daemon not responding." +msgstr "" + +#: ../src/utils/pacmd.c:161 +#, fuzzy, c-format +msgid "poll(): %s" +msgstr "fork(): %s" + +#: ../src/utils/pacmd.c:171 ../src/utils/pacmd.c:188 +#, c-format +msgid "read(): %s" +msgstr "read(): %s" + +#: ../src/utils/pacmd.c:207 ../src/utils/pacmd.c:223 +#, c-format +msgid "write(): %s" +msgstr "write(): %s" + +#: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:219 +msgid "Cannot access autospawn lock." +msgstr "" + +#: ../src/modules/alsa/alsa-sink.c:530 ../src/modules/alsa/alsa-sink.c:689 +#, c-format +msgid "" +"ALSA woke us up to write new data to the device, but there was actually " +"nothing to write!\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers.\n" +"We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() " +"returned 0 or another value < min_avail." +msgstr "" + +#: ../src/modules/alsa/alsa-source.c:506 ../src/modules/alsa/alsa-source.c:656 +#, c-format +msgid "" +"ALSA woke us up to read new data from the device, but there was actually " +"nothing to read!\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers.\n" +"We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() " +"returned 0 or another value < min_avail." +msgstr "" + +#: ../src/modules/alsa/module-alsa-card.c:152 +#: ../src/modules/bluetooth/module-bluetooth-device.c:2228 +#: ../src/modules/alsa/alsa-mixer.c:2931 +msgid "Off" +msgstr "" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2184 +msgid "High Fidelity Playback (A2DP)" +msgstr "" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2198 +msgid "High Fidelity Capture (A2DP)" +msgstr "" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2213 +msgid "Telephony Duplex (HSP/HFP)" +msgstr "" + +#: ../src/modules/reserve-wrap.c:151 +msgid "PulseAudio Sound Server" +msgstr "" + +#: ../src/modules/module-rygel-media-server.c:569 +#: ../src/modules/module-rygel-media-server.c:583 +msgid "Output Devices" +msgstr "" + +#: ../src/modules/module-rygel-media-server.c:570 +#: ../src/modules/module-rygel-media-server.c:584 +msgid "Input Devices" +msgstr "" + +#: ../src/modules/module-rygel-media-server.c:774 +msgid "Audio on @HOSTNAME@" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1701 +msgid "Input" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1702 +msgid "Docking Station Input" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1703 +msgid "Docking Station Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1704 +msgid "Line-In" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1705 +msgid "Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1706 +msgid "External Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1707 +#, fuzzy +msgid "Internal Microphone" +msgstr "Internt fel" + +#: ../src/modules/alsa/alsa-mixer.c:1708 +msgid "Radio" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1709 +msgid "Video" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1710 +msgid "Automatic Gain Control" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1711 +msgid "No Automatic Gain Control" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1712 +msgid "Boost" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1713 +msgid "No Boost" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1714 +msgid "Amplifier" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1715 +msgid "No Amplifier" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1773 +msgid "Analog Input" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1774 +msgid "Analog Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1775 +msgid "Analog Line-In" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1776 +msgid "Analog Radio" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1777 +msgid "Analog Video" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1778 +msgid "Analog Output" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1779 +msgid "Analog Headphones" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1780 +msgid "Analog Output (LFE)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1781 +msgid "Analog Mono Output" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1981 +#, c-format +msgid "%s+%s" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404 +#, c-format +msgid "%s / %s" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2790 +msgid "Analog Mono" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2791 +msgid "Analog Stereo" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2792 +msgid "Analog Surround 2.1" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2793 +msgid "Analog Surround 3.0" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2794 +msgid "Analog Surround 3.1" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2795 +msgid "Analog Surround 4.0" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2796 +msgid "Analog Surround 4.1" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2797 +msgid "Analog Surround 5.0" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2798 +msgid "Analog Surround 5.1" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2799 +msgid "Analog Surround 6.0" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2800 +msgid "Analog Surround 6.1" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2801 +msgid "Analog Surround 7.0" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2802 +msgid "Analog Surround 7.1" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2803 +msgid "Digital Stereo (IEC958)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2804 +msgid "Digital Surround 4.0 (IEC958)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2805 +msgid "Digital Surround 4.0 (IEC958/AC3)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2806 +msgid "Digital Surround 5.1 (IEC958/AC3)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2807 +msgid "Digital Stereo (HDMI)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2928 +msgid "Analog Mono Duplex" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2929 +msgid "Analog Stereo Duplex" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2930 +msgid "Digital Stereo Duplex (IEC958)" +msgstr "" + +#~ msgid "select(): %s" +#~ msgstr "select(): %s" + +#~ msgid "PolicyKit responded with '%s'" +#~ msgstr "PolicyKit svarade med \"%s\"" + +#~ msgid "read() failed: %s\n" +#~ msgstr "read() misslyckades: %s\n" + +#, fuzzy +#~ msgid "pa_context_connect() failed: %s\n" +#~ msgstr "pa_context_new() misslyckades.\n" + +#~ msgid "RLIMIT_RTPRIO failed: %s" +#~ msgstr "RLIMIT_RTPRIO misslyckades: %s" + +#~ msgid "time_new() failed.\n" +#~ msgstr "time_new() misslyckades.\n" + +#~ msgid "" +#~ "paplay %s\n" +#~ "Compiled with libpulse %s\n" +#~ "Linked with libpulse %s\n" +#~ msgstr "" +#~ "paplay %s\n" +#~ "Kompilerad med libpulse %s\n" +#~ "Länkad med libpulse %s\n" + +#~ msgid "Failed to open file '%s'\n" +#~ msgstr "Misslyckades med att öppna filen \"%s\"\n" + +#, fuzzy +#~ msgid "--log-time boolean argument" +#~ msgstr "--disallow-exit booleskt argument" + +#~ msgid "pa_stream_drop() failed: %s\n" +#~ msgstr "pa_stream_drop() misslyckades: %s\n" + +#~ msgid "muted" +#~ msgstr "tystad" + +#~ msgid "sink" +#~ msgstr "sink" + +#~ msgid "source" +#~ msgstr "källa" + +#~ msgid "socketpair(): %s" +#~ msgstr "socketpair(): %s" diff --git a/po/ta.po b/po/ta.po new file mode 100644 index 0000000..000b559 --- /dev/null +++ b/po/ta.po @@ -0,0 +1,2598 @@ +# translation of pulseaudio.master-tx.ta.po to Tamil +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# I. Felix , 2009. +msgid "" +msgstr "" +"Project-Id-Version: pulseaudio.master-tx.ta\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-09-29 23:47+0200\n" +"PO-Revision-Date: 2009-09-18 13:43+0530\n" +"Last-Translator: I. Felix \n" +"Language-Team: Tamil \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=2; plural=(n!=1);\\n\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" + +#: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629 +#, c-format +msgid "%s %s" +msgstr "%s %s" + +#: ../src/modules/alsa/alsa-util.c:1106 +#, c-format +msgid "" +"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu " +"ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu " +"ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." + +#: ../src/modules/alsa/alsa-util.c:1147 +#, c-format +msgid "" +"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%" +"lu ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%" +"lu ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." + +#: ../src/modules/alsa/alsa-util.c:1194 +#, c-format +msgid "" +"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes " +"(%lu ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes " +"(%lu ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." + +#: ../src/modules/module-always-sink.c:39 +msgid "Always keeps at least one sink loaded even if it's a null one" +msgstr "ஒரு பூஜ்ஜியம் இருந்தாலும் குறைந்தது ஒன்றை மட்டும் வைத்திருக்கவும்" + +#: ../src/modules/module-always-sink.c:83 +msgid "Dummy Output" +msgstr "டம்மி வெளிப்பாடு" + +#: ../src/modules/module-ladspa-sink.c:49 +msgid "Virtual LADSPA sink" +msgstr "மெய்நிகர் LADSPA சின்க்" + +#: ../src/modules/module-ladspa-sink.c:53 +msgid "" +"sink_name= sink_properties= " +"master= format= rate= " +"channels= channel_map= plugin= label= control=" +msgstr "" +"sink_name= sink_properties= " +"master= format= rate= " +"channels= channel_map= plugin= label= control=" + +#: ../src/modules/module-null-sink.c:55 +msgid "Clocked NULL sink" +msgstr "கடிகார பூஜ்ஜிய சிங்" + +#: ../src/modules/module-null-sink.c:291 +msgid "Null Output" +msgstr "பூஜ்ஜிய வெளிப்பாடு" + +#: ../src/pulsecore/sink.c:2613 +msgid "Internal Audio" +msgstr "உட்புற ஆடியோ" + +#: ../src/pulsecore/sink.c:2618 +msgid "Modem" +msgstr "மாதிரி" + +#: ../src/daemon/ltdl-bind-now.c:124 +msgid "Failed to find original lt_dlopen loader." +msgstr "அசல் lt_dlopen ஏற்றியை காண முடியவில்லை." + +#: ../src/daemon/ltdl-bind-now.c:129 +msgid "Failed to allocate new dl loader." +msgstr "புதிய dl ஏற்றுபவரை ஒதுக்கிருவதில் தோல்வி." + +#: ../src/daemon/ltdl-bind-now.c:142 +msgid "Failed to add bind-now-loader." +msgstr "இப்போது பிணைக்கும் ஏற்பியை சேர்ப்பதில் தோல்வி." + +#: ../src/daemon/main.c:141 +#, c-format +msgid "Got signal %s." +msgstr "%sக்கு சிக்னல் கிடைத்துவிட்டது." + +#: ../src/daemon/main.c:168 +msgid "Exiting." +msgstr "வெளியேறுதல்." + +#: ../src/daemon/main.c:186 +#, c-format +msgid "Failed to find user '%s'." +msgstr "'%s' பயனரை கண்டுபிடிப்பதில் தோல்வி." + +#: ../src/daemon/main.c:191 +#, c-format +msgid "Failed to find group '%s'." +msgstr "'%s' குழுவை கண்டுபிடிப்பதில் தோல்வி." + +#: ../src/daemon/main.c:195 +#, c-format +msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)." +msgstr "'%s'பயனர் கண்டுபிடிக்கப்பட்டார் (UID %lu) மற்றும் குழு '%s' (GID %lu)." + +#: ../src/daemon/main.c:200 +#, c-format +msgid "GID of user '%s' and of group '%s' don't match." +msgstr "GID ன் பயனர் '%s' மற்றும் '%s' குழுவுடன் ஒத்து போகவில்லை." + +#: ../src/daemon/main.c:205 +#, c-format +msgid "Home directory of user '%s' is not '%s', ignoring." +msgstr "முகப்பு அடைவு பயனரான'%s' '%s'ஆல், புறக்கணிக்கப்படவில்லை." + +#: ../src/daemon/main.c:208 ../src/daemon/main.c:213 +#, c-format +msgid "Failed to create '%s': %s" +msgstr "'%s'ஐ உருவாக்க முடியவில்லை: %s" + +#: ../src/daemon/main.c:220 +#, c-format +msgid "Failed to change group list: %s" +msgstr "குழுப் பட்டியலை மாற்ற முடியவில்லை: %s" + +#: ../src/daemon/main.c:236 +#, c-format +msgid "Failed to change GID: %s" +msgstr "GIDக்கு மாற்றுவதில் தோல்வி: %s" + +#: ../src/daemon/main.c:252 +#, c-format +msgid "Failed to change UID: %s" +msgstr "UIDக்கு மாற்றுவதில் தோல்வி: %s" + +#: ../src/daemon/main.c:271 +msgid "Successfully dropped root privileges." +msgstr "ரூட் முன்னுரிமைகள் வெற்றிகரமாக விடப்பட்டது." + +#: ../src/daemon/main.c:279 +msgid "System wide mode unsupported on this platform." +msgstr "இந்த தளத்தில் கணினியின் திறந்த முறைமை துணைபுரியவில்லை." + +#: ../src/daemon/main.c:297 +#, c-format +msgid "setrlimit(%s, (%u, %u)) failed: %s" +msgstr "setrlimit(%s, (%u, %u)) தோல்வியுற்றது: %s" + +#: ../src/daemon/main.c:474 +msgid "Failed to parse command line." +msgstr "கட்டளை வரியை மாற்றுவதில் தோல்வி." + +#: ../src/daemon/main.c:541 +msgid "Daemon not running" +msgstr "டோமோன் இயங்கவில்லை" + +#: ../src/daemon/main.c:543 +#, c-format +msgid "Daemon running as PID %u" +msgstr "PID %uவாக டோமோன் இயங்குகிறது" + +#: ../src/daemon/main.c:553 +#, c-format +msgid "Failed to kill daemon: %s" +msgstr "டோமோனுக்கு முடிவு கட்டுவதில் தோல்வி: %s" + +#: ../src/daemon/main.c:571 +msgid "" +"This program is not intended to be run as root (unless --system is " +"specified)." +msgstr "இந்த நிரல் ரூட்டாக இயங்க முடியவில்லை (--system குறிப்பிடாத வரை)." + +#: ../src/daemon/main.c:573 +msgid "Root privileges required." +msgstr "ரூட் முன்னுரிமைகள் தேவைப்படுகிறது." + +#: ../src/daemon/main.c:578 +msgid "--start not supported for system instances." +msgstr "--start கணினி நிகழ்வில் துணைபுரியவில்லை." + +#: ../src/daemon/main.c:583 +msgid "Running in system mode, but --disallow-exit not set!" +msgstr "கணினி முறைமையில் இயங்குகிறது, ஆனால் --disallow-exit அமைக்கப்படவில்லை!" + +#: ../src/daemon/main.c:586 +msgid "Running in system mode, but --disallow-module-loading not set!" +msgstr "" +"கணினி முறைமையில் இயங்குகிறது, ஆனால் --disallow-module-loading அமைக்கப்படவில்லை!" + +#: ../src/daemon/main.c:589 +msgid "Running in system mode, forcibly disabling SHM mode!" +msgstr "கணினி முறைமையில் இயங்குகிறது, SHM முறைமை செயல்நீக்குதல் கட்டாயப்படுத்துகிறது!" + +#: ../src/daemon/main.c:594 +msgid "Running in system mode, forcibly disabling exit idle time!" +msgstr "கணினி முறைமையில் இயங்குகிறது, வெறுமை நேரத்தை செயல்நீக்க கட்டாயப்படுத்துகிறது!" + +#: ../src/daemon/main.c:621 +msgid "Failed to acquire stdio." +msgstr "stdioஐ பெற முடியவில்லை." + +#: ../src/daemon/main.c:627 +#, c-format +msgid "pipe failed: %s" +msgstr "பைப் தோல்வியுற்றது: %s" + +#: ../src/daemon/main.c:632 +#, c-format +msgid "fork() failed: %s" +msgstr "fork() தோல்வியுற்றது: %s" + +#: ../src/daemon/main.c:646 ../src/utils/pacat.c:508 +#, c-format +msgid "read() failed: %s" +msgstr "வாசிப்பதில்() தோல்வியுற்றது: %s" + +#: ../src/daemon/main.c:652 +msgid "Daemon startup failed." +msgstr "டோமோனை துவக்குவதில் தோல்வியுற்றது." + +#: ../src/daemon/main.c:654 +msgid "Daemon startup successful." +msgstr "டோமோனை வெற்றிகரமாக துவக்ககப்பட்டது." + +#: ../src/daemon/main.c:731 +#, c-format +msgid "This is PulseAudio %s" +msgstr "இது தான் பள்ஸ் ஆடியோ %s" + +#: ../src/daemon/main.c:732 +#, c-format +msgid "Compilation host: %s" +msgstr "தொகுக்கப்பட்ட புரவலன்: %s" + +#: ../src/daemon/main.c:733 +#, c-format +msgid "Compilation CFLAGS: %s" +msgstr "தொகுப்பு CFLAGS: %s" + +#: ../src/daemon/main.c:736 +#, c-format +msgid "Running on host: %s" +msgstr "புரவலனாக இயங்குகிறத: %s" + +#: ../src/daemon/main.c:739 +#, c-format +msgid "Found %u CPUs." +msgstr "CPUs %uவில் காணப்படுகிறது ." + +#: ../src/daemon/main.c:741 +#, c-format +msgid "Page size is %lu bytes" +msgstr "பக்க அளவுகள் %lu பைட்ஸ்" + +#: ../src/daemon/main.c:744 +msgid "Compiled with Valgrind support: yes" +msgstr "Compiled with Valgrind support: yes" + +#: ../src/daemon/main.c:746 +msgid "Compiled with Valgrind support: no" +msgstr "Compiled with Valgrind support: no" + +#: ../src/daemon/main.c:749 +#, c-format +msgid "Running in valgrind mode: %s" +msgstr "valgrind முறைமையில் இயங்குகிறது: %s" + +#: ../src/daemon/main.c:752 +msgid "Optimized build: yes" +msgstr "Optimized build: yes" + +#: ../src/daemon/main.c:754 +msgid "Optimized build: no" +msgstr "சுருக்கமான உருவாக்கம்: இல்லை" + +#: ../src/daemon/main.c:758 +msgid "NDEBUG defined, all asserts disabled." +msgstr "NDEBUG வரையறுக்கப்பட்டது, அனைத்தும் உறுதியாக செயல்நீக்கப்பட்டது." + +#: ../src/daemon/main.c:760 +msgid "FASTPATH defined, only fast path asserts disabled." +msgstr "FASTPATH வரையறுக்கப்பட்டது, விரைவு பாதை மட்டும் உறுதியாக செயல்நீக்கப்பட்டது." + +#: ../src/daemon/main.c:762 +msgid "All asserts enabled." +msgstr "அனைத்து உறுதியாக செயல்படுகிறது." + +#: ../src/daemon/main.c:766 +msgid "Failed to get machine ID" +msgstr "கணினி குறியீடை பெறுவதில் தோல்வி" + +#: ../src/daemon/main.c:769 +#, c-format +msgid "Machine ID is %s." +msgstr "கணினி குறியீடு %s." + +#: ../src/daemon/main.c:773 +#, c-format +msgid "Session ID is %s." +msgstr "அமர்வு குறியீடு %s." + +#: ../src/daemon/main.c:779 +#, c-format +msgid "Using runtime directory %s." +msgstr "ஓடும்நேரம் %s அடைவை பயன்படுத்துகிறது." + +#: ../src/daemon/main.c:784 +#, c-format +msgid "Using state directory %s." +msgstr "%s நிலை அடைவினை பயன்படுத்துகிறது." + +#: ../src/daemon/main.c:787 +#, c-format +msgid "Using modules directory %s." +msgstr "தொகுதி %s அடைவை பயன்படுத்துகிறது." + +#: ../src/daemon/main.c:789 +#, c-format +msgid "Running in system mode: %s" +msgstr "கணினியின் முறைமையில் இயங்குகிறது: %s" + +#: ../src/daemon/main.c:792 +msgid "" +"OK, so you are running PA in system mode. Please note that you most likely " +"shouldn't be doing that.\n" +"If you do it nonetheless then it's your own fault if things don't work as " +"expected.\n" +"Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an " +"explanation why system mode is usually a bad idea." +msgstr "" +"OK, so you are running PA in system mode. Please note that you most likely " +"shouldn't be doing that.\n" +"If you do it nonetheless then it's your own fault if things don't work as " +"expected.\n" +"Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an " +"explanation why system mode is usually a bad idea." + +#: ../src/daemon/main.c:809 +msgid "pa_pid_file_create() failed." +msgstr "pa_pid_file_create() தோல்வியுற்றது." + +#: ../src/daemon/main.c:819 +msgid "Fresh high-resolution timers available! Bon appetit!" +msgstr "உயர்ந்த திரைத்திறன் நேரம்காட்டி கிடைக்கிளது! Bon appetit!" + +#: ../src/daemon/main.c:821 +msgid "" +"Dude, your kernel stinks! The chef's recommendation today is Linux with high-" +"resolution timers enabled!" +msgstr "" +"Dude, your kernel stinks! The chef's recommendation today is Linux with high-" +"resolution timers enabled!" + +#: ../src/daemon/main.c:844 +msgid "pa_core_new() failed." +msgstr "pa_core_new() தோல்வியுற்றது." + +#: ../src/daemon/main.c:904 +msgid "Failed to initialize daemon." +msgstr "டோமோனை ஆரம்பிப்பதில் தோல்வி." + +#: ../src/daemon/main.c:909 +msgid "Daemon startup without any loaded modules, refusing to work." +msgstr "டீமான் துவக்கம் எந்த தொகுதிகளும் ஏற்றப்படாமல், வேலையை நிராகரிக்கிறது." + +#: ../src/daemon/main.c:926 +msgid "Daemon startup complete." +msgstr "டோமோன் துவக்குவது முடிவடைந்தது." + +#: ../src/daemon/main.c:932 +msgid "Daemon shutdown initiated." +msgstr "டோமோன் பணிநிறுத்தம் முனைகிறது." + +#: ../src/daemon/main.c:954 +msgid "Daemon terminated." +msgstr "டோமோன் நீக்கப்பட்டுது." + +#: ../src/daemon/cmdline.c:115 +#, c-format +msgid "" +"%s [options]\n" +"\n" +"COMMANDS:\n" +" -h, --help Show this help\n" +" --version Show version\n" +" --dump-conf Dump default configuration\n" +" --dump-modules Dump list of available modules\n" +" --dump-resample-methods Dump available resample methods\n" +" --cleanup-shm Cleanup stale shared memory " +"segments\n" +" --start Start the daemon if it is not " +"running\n" +" -k --kill Kill a running daemon\n" +" --check Check for a running daemon (only " +"returns exit code)\n" +"\n" +"OPTIONS:\n" +" --system[=BOOL] Run as system-wide instance\n" +" -D, --daemonize[=BOOL] Daemonize after startup\n" +" --fail[=BOOL] Quit when startup fails\n" +" --high-priority[=BOOL] Try to set high nice level\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_NICE)\n" +" --realtime[=BOOL] Try to enable realtime scheduling\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_RTPRIO)\n" +" --disallow-module-loading[=BOOL] Disallow module user requested " +"module\n" +" loading/unloading after startup\n" +" --disallow-exit[=BOOL] Disallow user requested exit\n" +" --exit-idle-time=SECS Terminate the daemon when idle and " +"this\n" +" time passed\n" +" --module-idle-time=SECS Unload autoloaded modules when idle " +"and\n" +" this time passed\n" +" --scache-idle-time=SECS Unload autoloaded samples when idle " +"and\n" +" this time passed\n" +" --log-level[=LEVEL] Increase or set verbosity level\n" +" -v Increase the verbosity level\n" +" --log-target={auto,syslog,stderr} Specify the log target\n" +" --log-meta[=BOOL] Include code location in log " +"messages\n" +" --log-time[=BOOL] Include timestamps in log messages\n" +" --log-backtrace=FRAMES Include a backtrace in log messages\n" +" -p, --dl-search-path=PATH Set the search path for dynamic " +"shared\n" +" objects (plugins)\n" +" --resample-method=METHOD Use the specified resampling method\n" +" (See --dump-resample-methods for\n" +" possible values)\n" +" --use-pid-file[=BOOL] Create a PID file\n" +" --no-cpu-limit[=BOOL] Do not install CPU load limiter on\n" +" platforms that support it.\n" +" --disable-shm[=BOOL] Disable shared memory support.\n" +"\n" +"STARTUP SCRIPT:\n" +" -L, --load=\"MODULE ARGUMENTS\" Load the specified plugin module " +"with\n" +" the specified argument\n" +" -F, --file=FILENAME Run the specified script\n" +" -C Open a command line on the running " +"TTY\n" +" after startup\n" +"\n" +" -n Don't load default script file\n" +msgstr "" +"%s [options]\n" +"\n" +"COMMANDS:\n" +" -h, --help Show this help\n" +" --version Show version\n" +" --dump-conf Dump default configuration\n" +" --dump-modules Dump list of available modules\n" +" --dump-resample-methods Dump available resample methods\n" +" --cleanup-shm Cleanup stale shared memory " +"segments\n" +" --start Start the daemon if it is not " +"running\n" +" -k --kill Kill a running daemon\n" +" --check Check for a running daemon (only " +"returns exit code)\n" +"\n" +"OPTIONS:\n" +" --system[=BOOL] Run as system-wide instance\n" +" -D, --daemonize[=BOOL] Daemonize after startup\n" +" --fail[=BOOL] Quit when startup fails\n" +" --high-priority[=BOOL] Try to set high nice level\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_NICE)\n" +" --realtime[=BOOL] Try to enable realtime scheduling\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_RTPRIO)\n" +" --disallow-module-loading[=BOOL] Disallow module user requested " +"module\n" +" loading/unloading after startup\n" +" --disallow-exit[=BOOL] Disallow user requested exit\n" +" --exit-idle-time=SECS Terminate the daemon when idle and " +"this\n" +" time passed\n" +" --module-idle-time=SECS Unload autoloaded modules when idle " +"and\n" +" this time passed\n" +" --scache-idle-time=SECS Unload autoloaded samples when idle " +"and\n" +" this time passed\n" +" --log-level[=LEVEL] Increase or set verbosity level\n" +" -v Increase the verbosity level\n" +" --log-target={auto,syslog,stderr} Specify the log target\n" +" --log-meta[=BOOL] Include code location in log " +"messages\n" +" --log-time[=BOOL] Include timestamps in log messages\n" +" --log-backtrace=FRAMES Include a backtrace in log messages\n" +" -p, --dl-search-path=PATH Set the search path for dynamic " +"shared\n" +" objects (plugins)\n" +" --resample-method=METHOD Use the specified resampling method\n" +" (See --dump-resample-methods for\n" +" possible values)\n" +" --use-pid-file[=BOOL] Create a PID file\n" +" --no-cpu-limit[=BOOL] Do not install CPU load limiter on\n" +" platforms that support it.\n" +" --disable-shm[=BOOL] Disable shared memory support.\n" +"\n" +"STARTUP SCRIPT:\n" +" -L, --load=\"MODULE ARGUMENTS\" Load the specified plugin module " +"with\n" +" the specified argument\n" +" -F, --file=FILENAME Run the specified script\n" +" -C Open a command line on the running " +"TTY\n" +" after startup\n" +"\n" +" -n Don't load default script file\n" + +#: ../src/daemon/cmdline.c:247 +msgid "--daemonize expects boolean argument" +msgstr "--daemonize பூலியன் அளவுரு எதிர்பார்க்கிறது" + +#: ../src/daemon/cmdline.c:254 +msgid "--fail expects boolean argument" +msgstr "--fail பூலியன் அளவுரு எதிர்பார்க்கிறது" + +#: ../src/daemon/cmdline.c:264 +msgid "" +"--log-level expects log level argument (either numeric in range 0..4 or one " +"of debug, info, notice, warn, error)." +msgstr "" +"--log-level பதிவு நிலை அளவுருவை எதிர்பார்க்கிறது (எண் 0..4 அல்லது debug, info, " +"notice, warn, errorஇல் ஒன்று)." + +#: ../src/daemon/cmdline.c:276 +msgid "--high-priority expects boolean argument" +msgstr "--high-priority பூலியன் அளவுரு எதிர்பார்க்கிறது" + +#: ../src/daemon/cmdline.c:283 +msgid "--realtime expects boolean argument" +msgstr "--realtime பூலியன் அளவுரு எதிர்பார்க்கிறது" + +#: ../src/daemon/cmdline.c:290 +msgid "--disallow-module-loading expects boolean argument" +msgstr "--disallow-module-loading பூலியன் அளவுரு எதிர்பார்க்கிறது" + +#: ../src/daemon/cmdline.c:297 +msgid "--disallow-exit expects boolean argument" +msgstr "--disallow-exit பூலியன் அளவுரு எதிர்பார்க்கிறது" + +#: ../src/daemon/cmdline.c:304 +msgid "--use-pid-file expects boolean argument" +msgstr "--use-pid-file பூலியன் அளவுரு எதிர்பார்க்கிறது" + +#: ../src/daemon/cmdline.c:321 +msgid "Invalid log target: use either 'syslog', 'stderr' or 'auto'." +msgstr "தவறான பதிவு இலக்கு: 'syslog', 'stderr' அல்லது 'auto'ஐ பயன்படுத்தவும்." + +#: ../src/daemon/cmdline.c:328 +msgid "--log-time expects boolean argument" +msgstr "--log-time பூலியன் அளவுரு எதிர்பார்க்கிறது" + +#: ../src/daemon/cmdline.c:335 +msgid "--log-meta expects boolean argument" +msgstr "--log-meta பூலியன் அளவுரு எதிர்பார்க்கிறது" + +#: ../src/daemon/cmdline.c:354 +#, c-format +msgid "Invalid resample method '%s'." +msgstr "தவறான மறுமாதிரி முறை '%s'." + +#: ../src/daemon/cmdline.c:361 +msgid "--system expects boolean argument" +msgstr "--system பூலியன் அளவுரு எதிர்பார்க்கிறது" + +#: ../src/daemon/cmdline.c:368 +msgid "--no-cpu-limit expects boolean argument" +msgstr "--no-cpu-limit பூலியன் அளவுரு எதிர்பார்க்கிறது" + +#: ../src/daemon/cmdline.c:375 +msgid "--disable-shm expects boolean argument" +msgstr "--disable-shm பூலியன் அளவுரு எதிர்பார்க்கிறது" + +#: ../src/daemon/dumpmodules.c:60 +#, c-format +msgid "Name: %s\n" +msgstr "பெயர்: %s\n" + +#: ../src/daemon/dumpmodules.c:63 +#, c-format +msgid "No module information available\n" +msgstr "தொகுதி தகவல் கிடைக்கப் பெறவில்லை\n" + +#: ../src/daemon/dumpmodules.c:66 +#, c-format +msgid "Version: %s\n" +msgstr "பதிப்பு: %s\n" + +#: ../src/daemon/dumpmodules.c:68 +#, c-format +msgid "Description: %s\n" +msgstr "விளக்கம்: %s\n" + +#: ../src/daemon/dumpmodules.c:70 +#, c-format +msgid "Author: %s\n" +msgstr "ஆசிரியர்: %s\n" + +#: ../src/daemon/dumpmodules.c:72 +#, c-format +msgid "Usage: %s\n" +msgstr "பயன்பாடு: %s\n" + +#: ../src/daemon/dumpmodules.c:73 +#, c-format +msgid "Load Once: %s\n" +msgstr "ஒருமுறை ஏற்றப்பட்டது: %s\n" + +#: ../src/daemon/dumpmodules.c:75 +#, c-format +msgid "DEPRECATION WARNING: %s\n" +msgstr "DEPRECATION WARNING: %s\n" + +#: ../src/daemon/dumpmodules.c:79 +#, c-format +msgid "Path: %s\n" +msgstr "பாதை: %s\n" + +#: ../src/daemon/daemon-conf.c:232 +#, c-format +msgid "[%s:%u] Invalid log target '%s'." +msgstr "[%s:%u] தவறான பதிவு இலக்கு '%s'." + +#: ../src/daemon/daemon-conf.c:248 +#, c-format +msgid "[%s:%u] Invalid log level '%s'." +msgstr "[%s:%u] தவறான பதிவு இலக்கு '%s'." + +#: ../src/daemon/daemon-conf.c:264 +#, c-format +msgid "[%s:%u] Invalid resample method '%s'." +msgstr "[%s:%u] தவறான மறுமாதிரி முறை '%s'." + +#: ../src/daemon/daemon-conf.c:287 +#, c-format +msgid "[%s:%u] Invalid rlimit '%s'." +msgstr "[%s:%u] தவறான rlimit '%s'." + +#: ../src/daemon/daemon-conf.c:294 +#, c-format +msgid "[%s:%u] rlimit not supported on this platform." +msgstr "[%s:%u] rlimit இந்த தளத்தில் துணைபுரியவில்லை." + +#: ../src/daemon/daemon-conf.c:310 +#, c-format +msgid "[%s:%u] Invalid sample format '%s'." +msgstr "[%s:%u] தவறான மாதிரி முறை '%s'." + +#: ../src/daemon/daemon-conf.c:328 +#, c-format +msgid "[%s:%u] Invalid sample rate '%s'." +msgstr "[%s:%u] தவறான மாதிரி விலை '%s'." + +#: ../src/daemon/daemon-conf.c:352 +#, c-format +msgid "[%s:%u] Invalid sample channels '%s'." +msgstr "[%s:%u] தவறான மாதிரி சேனல்கள் '%s'." + +#: ../src/daemon/daemon-conf.c:370 +#, c-format +msgid "[%s:%u] Invalid channel map '%s'." +msgstr "[%s:%u] தவறான சேனல் படம் '%s'." + +#: ../src/daemon/daemon-conf.c:388 +#, c-format +msgid "[%s:%u] Invalid number of fragments '%s'." +msgstr "[%s:%u] பகுப்பு '%s'க்கு தவறான எண்" + +#: ../src/daemon/daemon-conf.c:406 +#, c-format +msgid "[%s:%u] Invalid fragment size '%s'." +msgstr "[%s:%u] தவறான பகுப்பு அளவு '%s'." + +#: ../src/daemon/daemon-conf.c:424 +#, c-format +msgid "[%s:%u] Invalid nice level '%s'." +msgstr "[%s:%u] தவறான நல்ல நிலை '%s'." + +#: ../src/daemon/daemon-conf.c:546 +#, c-format +msgid "Failed to open configuration file: %s" +msgstr "கட்டமைக்கப்பட்ட கோப்பினை திறப்பதில் தோல்வி: %s" + +#: ../src/daemon/daemon-conf.c:562 +msgid "" +"The specified default channel map has a different number of channels than " +"the specified default number of channels." +msgstr "" +"குறிப்பிட்ட முன்னிருப்பு சேனல் மேப் வேறுபட்ட சேனல்களின் எண்ணிக்கையை குறிப்பிட்ட " +"முன்னிருப்பு சேனல்களின் எண்ணிக்கையை விட கொண்டுள்ளது" + +#: ../src/daemon/daemon-conf.c:638 +#, c-format +msgid "### Read from configuration file: %s ###\n" +msgstr "### கட்டமைப்பு கோப்பிலிருந்து வாசிக்கவும்: %s ###\n" + +#: ../src/daemon/caps.c:62 +msgid "Cleaning up privileges." +msgstr "முன்னுரிமைகளை துடைக்கிறது." + +#: ../src/daemon/pulseaudio.desktop.in.h:1 +msgid "PulseAudio Sound System" +msgstr "பள்ஸ் ஆடியோ ஒலி கணினி" + +#: ../src/daemon/pulseaudio.desktop.in.h:2 +msgid "Start the PulseAudio Sound System" +msgstr "பள்ஸ் ஆடியோ ஒலி கணினியை துவக்கவும" + +#: ../src/pulse/channelmap.c:105 ../src/pulse/channelmap.c:757 +msgid "Mono" +msgstr "மோனோ" + +#: ../src/pulse/channelmap.c:107 +msgid "Front Center" +msgstr "முன் நடுவில்" + +#: ../src/pulse/channelmap.c:108 +msgid "Front Left" +msgstr "முன் இடது" + +#: ../src/pulse/channelmap.c:109 +msgid "Front Right" +msgstr "முன் வலது" + +#: ../src/pulse/channelmap.c:111 +msgid "Rear Center" +msgstr "பின் நடுவில்" + +#: ../src/pulse/channelmap.c:112 +msgid "Rear Left" +msgstr "பின் இடது" + +#: ../src/pulse/channelmap.c:113 +msgid "Rear Right" +msgstr "பின் வலது" + +#: ../src/pulse/channelmap.c:115 +msgid "Low Frequency Emmiter" +msgstr "குறைந்த அலைவரிசை எம்மிட்டர்" + +#: ../src/pulse/channelmap.c:117 +msgid "Front Left-of-center" +msgstr "முன் இடது பக்கத்தின் நடுவில்" + +#: ../src/pulse/channelmap.c:118 +msgid "Front Right-of-center" +msgstr "முன் வலது பக்கத்தின் நடுவில்" + +#: ../src/pulse/channelmap.c:120 +msgid "Side Left" +msgstr "இடது பக்கம்" + +#: ../src/pulse/channelmap.c:121 +msgid "Side Right" +msgstr "வலது பக்கம்" + +#: ../src/pulse/channelmap.c:123 +msgid "Auxiliary 0" +msgstr "Auxiliary 0" + +#: ../src/pulse/channelmap.c:124 +msgid "Auxiliary 1" +msgstr "Auxiliary 1" + +#: ../src/pulse/channelmap.c:125 +msgid "Auxiliary 2" +msgstr "Auxiliary 2" + +#: ../src/pulse/channelmap.c:126 +msgid "Auxiliary 3" +msgstr "Auxiliary 3" + +#: ../src/pulse/channelmap.c:127 +msgid "Auxiliary 4" +msgstr "Auxiliary 4" + +#: ../src/pulse/channelmap.c:128 +msgid "Auxiliary 5" +msgstr "Auxiliary 5" + +#: ../src/pulse/channelmap.c:129 +msgid "Auxiliary 6" +msgstr "Auxiliary 6" + +#: ../src/pulse/channelmap.c:130 +msgid "Auxiliary 7" +msgstr "Auxiliary 7" + +#: ../src/pulse/channelmap.c:131 +msgid "Auxiliary 8" +msgstr "Auxiliary 8" + +#: ../src/pulse/channelmap.c:132 +msgid "Auxiliary 9" +msgstr "Auxiliary 9" + +#: ../src/pulse/channelmap.c:133 +msgid "Auxiliary 10" +msgstr "Auxiliary 10" + +#: ../src/pulse/channelmap.c:134 +msgid "Auxiliary 11" +msgstr "Auxiliary 11" + +#: ../src/pulse/channelmap.c:135 +msgid "Auxiliary 12" +msgstr "Auxiliary 12" + +#: ../src/pulse/channelmap.c:136 +msgid "Auxiliary 13" +msgstr "Auxiliary 13" + +#: ../src/pulse/channelmap.c:137 +msgid "Auxiliary 14" +msgstr "Auxiliary 14" + +#: ../src/pulse/channelmap.c:138 +msgid "Auxiliary 15" +msgstr "Auxiliary 15" + +#: ../src/pulse/channelmap.c:139 +msgid "Auxiliary 16" +msgstr "Auxiliary 16" + +#: ../src/pulse/channelmap.c:140 +msgid "Auxiliary 17" +msgstr "Auxiliary 17" + +#: ../src/pulse/channelmap.c:141 +msgid "Auxiliary 18" +msgstr "Auxiliary 18" + +#: ../src/pulse/channelmap.c:142 +msgid "Auxiliary 19" +msgstr "Auxiliary 19" + +#: ../src/pulse/channelmap.c:143 +msgid "Auxiliary 20" +msgstr "Auxiliary 20" + +#: ../src/pulse/channelmap.c:144 +msgid "Auxiliary 21" +msgstr "Auxiliary 21" + +#: ../src/pulse/channelmap.c:145 +msgid "Auxiliary 22" +msgstr "Auxiliary 22" + +#: ../src/pulse/channelmap.c:146 +msgid "Auxiliary 23" +msgstr "Auxiliary 23" + +#: ../src/pulse/channelmap.c:147 +msgid "Auxiliary 24" +msgstr "Auxiliary 24" + +#: ../src/pulse/channelmap.c:148 +msgid "Auxiliary 25" +msgstr "Auxiliary 25" + +#: ../src/pulse/channelmap.c:149 +msgid "Auxiliary 26" +msgstr "Auxiliary 26" + +#: ../src/pulse/channelmap.c:150 +msgid "Auxiliary 27" +msgstr "Auxiliary 27" + +#: ../src/pulse/channelmap.c:151 +msgid "Auxiliary 28" +msgstr "Auxiliary 28" + +#: ../src/pulse/channelmap.c:152 +msgid "Auxiliary 29" +msgstr "Auxiliary 29" + +#: ../src/pulse/channelmap.c:153 +msgid "Auxiliary 30" +msgstr "Auxiliary 30" + +#: ../src/pulse/channelmap.c:154 +msgid "Auxiliary 31" +msgstr "Auxiliary 31" + +#: ../src/pulse/channelmap.c:156 +msgid "Top Center" +msgstr "மேல் நடுவில" + +#: ../src/pulse/channelmap.c:158 +msgid "Top Front Center" +msgstr "மேலை முன் நடுவில்" + +#: ../src/pulse/channelmap.c:159 +msgid "Top Front Left" +msgstr "மேலே முன் இடது" + +#: ../src/pulse/channelmap.c:160 +msgid "Top Front Right" +msgstr "மேலே முன் வலது" + +#: ../src/pulse/channelmap.c:162 +msgid "Top Rear Center" +msgstr "மேலே பின் நடுவில்" + +#: ../src/pulse/channelmap.c:163 +msgid "Top Rear Left" +msgstr "மேலே பின் இடது" + +#: ../src/pulse/channelmap.c:164 +msgid "Top Rear Right" +msgstr "மேலே பின் வலது" + +#: ../src/pulse/channelmap.c:484 ../src/pulse/sample.c:170 +#: ../src/pulse/volume.c:295 ../src/pulse/volume.c:321 +#: ../src/pulse/volume.c:341 ../src/pulse/volume.c:371 +msgid "(invalid)" +msgstr "(தவறான)" + +#: ../src/pulse/channelmap.c:761 +msgid "Stereo" +msgstr "ஸ்டிரியோ" + +#: ../src/pulse/channelmap.c:766 +msgid "Surround 4.0" +msgstr "Surround 4.0" + +#: ../src/pulse/channelmap.c:772 +msgid "Surround 4.1" +msgstr "Surround 4.1" + +#: ../src/pulse/channelmap.c:778 +msgid "Surround 5.0" +msgstr "Surround 5.0" + +#: ../src/pulse/channelmap.c:784 +msgid "Surround 5.1" +msgstr "Surround 5.1" + +#: ../src/pulse/channelmap.c:791 +msgid "Surround 7.1" +msgstr "Surround 7.1" + +#: ../src/pulse/error.c:43 +msgid "OK" +msgstr "சரி" + +#: ../src/pulse/error.c:44 +msgid "Access denied" +msgstr "அணுகல் மறுக்கப்பட்டது" + +#: ../src/pulse/error.c:45 +msgid "Unknown command" +msgstr "தெரியாத கட்டளை" + +#: ../src/pulse/error.c:46 +msgid "Invalid argument" +msgstr "தவறான விவாதம்" + +#: ../src/pulse/error.c:47 +msgid "Entity exists" +msgstr "உருப்படி உள்ளது" + +#: ../src/pulse/error.c:48 +msgid "No such entity" +msgstr "உருப்படி எதுவும் இல்லை" + +#: ../src/pulse/error.c:49 +msgid "Connection refused" +msgstr "இணைப்பு மறுக்கப்பட்டது" + +#: ../src/pulse/error.c:50 +msgid "Protocol error" +msgstr "அறிக்கை பிழை" + +#: ../src/pulse/error.c:51 +msgid "Timeout" +msgstr "நேரம் முடிவுற்றது" + +#: ../src/pulse/error.c:52 +msgid "No authorization key" +msgstr "அங்கீகார விசை இல்லை" + +#: ../src/pulse/error.c:53 +msgid "Internal error" +msgstr "உட்புற பிழை" + +#: ../src/pulse/error.c:54 +msgid "Connection terminated" +msgstr "இணைப்பு துண்டிக்கப்பட்டது" + +#: ../src/pulse/error.c:55 +msgid "Entity killed" +msgstr "உருப்படி நீக்கப்பட்டது" + +#: ../src/pulse/error.c:56 +msgid "Invalid server" +msgstr "தவறான புரவலன்" + +#: ../src/pulse/error.c:57 +msgid "Module initalization failed" +msgstr "தொகுதியை துவக்க முடியவில்லை" + +#: ../src/pulse/error.c:58 +msgid "Bad state" +msgstr "தவறான நிலை" + +#: ../src/pulse/error.c:59 +msgid "No data" +msgstr "தரவு இல்லை" + +#: ../src/pulse/error.c:60 +msgid "Incompatible protocol version" +msgstr "நெறிமுறை பதிப்பு உகந்ததல்ல" + +#: ../src/pulse/error.c:61 +msgid "Too large" +msgstr "மிகப் பெரியது" + +#: ../src/pulse/error.c:62 +msgid "Not supported" +msgstr "துணைப்புரியாத" + +#: ../src/pulse/error.c:63 +msgid "Unknown error code" +msgstr "தெரியாத பிழைக் குறியீடு" + +#: ../src/pulse/error.c:64 +msgid "No such extension" +msgstr "இது போன்ற தொடர்ச்சி இல்லை" + +#: ../src/pulse/error.c:65 +msgid "Obsolete functionality" +msgstr "நீக்கப்படும் செயல்பாடு" + +#: ../src/pulse/error.c:66 +msgid "Missing implementation" +msgstr "விடுபட்ட செயல்பாடு" + +#: ../src/pulse/error.c:67 +msgid "Client forked" +msgstr "கிளையன் நீக்கப்பட்டது" + +#: ../src/pulse/error.c:68 +msgid "Input/Output error" +msgstr "உள்ளீடு/வெளிப்பாடு பிழை" + +#: ../src/pulse/error.c:69 +msgid "Device or resource busy" +msgstr "சாதனம் அல்லது மூலம் பணிமிகுதியில்" + +#: ../src/pulse/sample.c:172 +#, c-format +msgid "%s %uch %uHz" +msgstr "%s %uch %uHz" + +#: ../src/pulse/sample.c:184 +#, c-format +msgid "%0.1f GiB" +msgstr "%0.1f GiB" + +#: ../src/pulse/sample.c:186 +#, c-format +msgid "%0.1f MiB" +msgstr "%0.1f MiB" + +#: ../src/pulse/sample.c:188 +#, c-format +msgid "%0.1f KiB" +msgstr "%0.1f KiB" + +#: ../src/pulse/sample.c:190 +#, c-format +msgid "%u B" +msgstr "%u B" + +#: ../src/pulse/client-conf-x11.c:55 ../src/utils/pax11publish.c:100 +msgid "XOpenDisplay() failed" +msgstr "XOpenகாட்சி() தோல்வியுற்றது" + +#: ../src/pulse/client-conf-x11.c:93 +msgid "Failed to parse cookie data" +msgstr "குக்கீ தரவை மாற்றுவதில் தோல்வியுற்றது" + +#: ../src/pulse/client-conf.c:111 +#, c-format +msgid "Failed to open configuration file '%s': %s" +msgstr "'%s'கட்டமைக்கப்பட்ட கோப்பினை திறக்க முடியவில்லை: %s" + +#: ../src/pulse/context.c:550 +msgid "No cookie loaded. Attempting to connect without." +msgstr "குக்கி ஏற்றப்படவில்லை. இணைப்பில்லாமல் முயற்சிக்கிறது." + +#: ../src/pulse/context.c:693 +#, c-format +msgid "fork(): %s" +msgstr "fork(): %s" + +#: ../src/pulse/context.c:748 +#, c-format +msgid "waitpid(): %s" +msgstr "waitpid(): %s" + +#: ../src/pulse/context.c:1438 +#, c-format +msgid "Received message for unknown extension '%s'" +msgstr "தெரியாத தொடரிச்சியிலிருந்து '%s'க்கு செய்திகள் பெறப்பட்டன" + +#: ../src/utils/pacat.c:108 +#, c-format +msgid "Failed to drain stream: %s" +msgstr "ஸ்டீரிமை இழக்க முடியவில்லை: %s" + +#: ../src/utils/pacat.c:113 +msgid "Playback stream drained." +msgstr "பின்னணி ஸ்டீரிம் இழக்கப்படுகிறது." + +#: ../src/utils/pacat.c:123 +msgid "Draining connection to server." +msgstr "சேவையகத்திற்கு இணைப்பு இழக்கப்படுகிறது." + +#: ../src/utils/pacat.c:136 +#, c-format +msgid "pa_stream_drain(): %s" +msgstr "pa_stream_drain(): %s" + +#: ../src/utils/pacat.c:159 +#, c-format +msgid "pa_stream_write() failed: %s" +msgstr "pa_stream_write() தோல்வியுற்றது: %s" + +#: ../src/utils/pacat.c:197 +#, c-format +msgid "pa_stream_begin_write() failed: %s" +msgstr "pa_stream_write() தோல்வியுற்றது: %s" + +#: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267 +#, c-format +msgid "pa_stream_peek() failed: %s" +msgstr "pa_stream_peek() தோல்வியுற்றது: %s" + +#: ../src/utils/pacat.c:307 +msgid "Stream successfully created." +msgstr "ஸ்டிரீம் வெற்றிகரமாக உருவாக்கப்பட்டது." + +#: ../src/utils/pacat.c:310 +#, c-format +msgid "pa_stream_get_buffer_attr() failed: %s" +msgstr "pa_stream_get_buffer_attr() தோல்வியுற்றது: %s" + +#: ../src/utils/pacat.c:314 +#, c-format +msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u" +msgstr "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u" + +#: ../src/utils/pacat.c:317 +#, c-format +msgid "Buffer metrics: maxlength=%u, fragsize=%u" +msgstr "Buffer metrics: maxlength=%u, fragsize=%u" + +#: ../src/utils/pacat.c:321 +#, c-format +msgid "Using sample spec '%s', channel map '%s'." +msgstr "குறிப்பிட்ட குறிப்பு '%s', சேனல் வரைபடத்தை '%s'ஐ பயன்படுத்துகிறது." + +#: ../src/utils/pacat.c:325 +#, c-format +msgid "Connected to device %s (%u, %ssuspended)." +msgstr "%s சாதனத்துடன் இணைக்கப்பட்டது (%u, %ssuspended)." + +#: ../src/utils/pacat.c:335 +#, c-format +msgid "Stream error: %s" +msgstr "ஸ்டிரீம் பிழை: %s" + +#: ../src/utils/pacat.c:345 +#, c-format +msgid "Stream device suspended.%s" +msgstr "ஸ்டீரிம் சாதனம் இடைநீக்கப்பட்டது.%s" + +#: ../src/utils/pacat.c:347 +#, c-format +msgid "Stream device resumed.%s" +msgstr "ஸ்டீரிம் சாதனம் தொடர்கிறது.%s" + +#: ../src/utils/pacat.c:355 +#, c-format +msgid "Stream underrun.%s" +msgstr "ஸ்டீரிம் இயங்குகிறது.%s" + +#: ../src/utils/pacat.c:362 +#, c-format +msgid "Stream overrun.%s" +msgstr "ஸ்டீரிம் அதிகளவு இயங்கியது.%s" + +#: ../src/utils/pacat.c:369 +#, c-format +msgid "Stream started.%s" +msgstr "ஸ்டிரீம் %s துவக்கப்பட்டது" + +#: ../src/utils/pacat.c:376 +#, c-format +msgid "Stream moved to device %s (%u, %ssuspended).%s" +msgstr "ஸ்டிரீம் %s சாதனத்திற்கு நகர்ந்தது (%u, %ssuspended).%s" + +#: ../src/utils/pacat.c:376 +msgid "not " +msgstr "இல்லை" + +#: ../src/utils/pacat.c:383 +#, c-format +msgid "Stream buffer attributes changed.%s" +msgstr "ஸ்டீரிம் ஃபப்பர் பண்புகளை மாற்றப்பட்டது.%s" + +#: ../src/utils/pacat.c:415 +#, c-format +msgid "Connection established.%s" +msgstr "இணைப்பு துவக்கப்பட்டது.%s" + +#: ../src/utils/pacat.c:418 +#, c-format +msgid "pa_stream_new() failed: %s" +msgstr "pa_stream_new() தோல்வியுற்றது: %s" + +#: ../src/utils/pacat.c:450 +#, c-format +msgid "pa_stream_connect_playback() failed: %s" +msgstr "pa_stream_connect_playback() தோல்வியுற்றது: %s" + +#: ../src/utils/pacat.c:456 +#, c-format +msgid "pa_stream_connect_record() failed: %s" +msgstr "pa_stream_connect_record() தோல்வியுற்றது: %s" + +#: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857 +#, c-format +msgid "Connection failure: %s" +msgstr "இணைப்பதில் தோல்வி: %s" + +#: ../src/utils/pacat.c:503 +msgid "Got EOF." +msgstr "EOF கிடைக்கப் பெற்றது" + +#: ../src/utils/pacat.c:540 +#, c-format +msgid "write() failed: %s" +msgstr "எழுதுவதில் () தோல்வியுற்றது: %s" + +#: ../src/utils/pacat.c:561 +msgid "Got signal, exiting." +msgstr "சிக்னல் கிடைத்தது, வெளியேறுகிறது." + +#: ../src/utils/pacat.c:575 +#, c-format +msgid "Failed to get latency: %s" +msgstr "லடன்சியை பெற முடியவில்லை: %s" + +#: ../src/utils/pacat.c:580 +#, c-format +msgid "Time: %0.3f sec; Latency: %0.0f usec." +msgstr "Time: %0.3f sec; Latency: %0.0f usec." + +#: ../src/utils/pacat.c:599 +#, c-format +msgid "pa_stream_update_timing_info() failed: %s" +msgstr "pa_stream_update_timing_info() தோல்வி: %s" + +#: ../src/utils/pacat.c:609 +#, c-format +msgid "" +"%s [options]\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -r, --record Create a connection for recording\n" +" -p, --playback Create a connection for playback\n" +"\n" +" -v, --verbose Enable verbose operations\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -d, --device=DEVICE The name of the sink/source to " +"connect to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" +" --stream-name=NAME How to call this stream on the " +"server\n" +" --volume=VOLUME Specify the initial (linear) volume " +"in range 0...65536\n" +" --rate=SAMPLERATE The sample rate in Hz (defaults to " +"44100)\n" +" --format=SAMPLEFORMAT The sample type, one of s16le, " +"s16be, u8, float32le,\n" +" float32be, ulaw, alaw, s32le, s32be, " +"s24le, s24be,\n" +" s24-32le, s24-32be (defaults to " +"s16ne)\n" +" --channels=CHANNELS The number of channels, 1 for mono, " +"2 for stereo\n" +" (defaults to 2)\n" +" --channel-map=CHANNELMAP Channel map to use instead of the " +"default\n" +" --fix-format Take the sample format from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-rate Take the sampling rate from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-channels Take the number of channels and the " +"channel map\n" +" from the sink the stream is being " +"connected to.\n" +" --no-remix Don't upmix or downmix channels.\n" +" --no-remap Map channels by index instead of " +"name.\n" +" --latency=BYTES Request the specified latency in " +"bytes.\n" +" --process-time=BYTES Request the specified process time " +"per request in bytes.\n" +" --property=PROPERTY=VALUE Set the specified property to the " +"specified value.\n" +" --raw Record/play raw PCM data.\n" +" --file-format=FFORMAT Record/play formatted PCM data.\n" +" --list-file-formats List available file formats.\n" +msgstr "" +"%s [options]\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -r, --record Create a connection for recording\n" +" -p, --playback Create a connection for playback\n" +"\n" +" -v, --verbose Enable verbose operations\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -d, --device=DEVICE The name of the sink/source to " +"connect to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" +" --stream-name=NAME How to call this stream on the " +"server\n" +" --volume=VOLUME Specify the initial (linear) volume " +"in range 0...65536\n" +" --rate=SAMPLERATE The sample rate in Hz (defaults to " +"44100)\n" +" --format=SAMPLEFORMAT The sample type, one of s16le, " +"s16be, u8, float32le,\n" +" float32be, ulaw, alaw, s32le, s32be, " +"s24le, s24be,\n" +" s24-32le, s24-32be (defaults to " +"s16ne)\n" +" --channels=CHANNELS The number of channels, 1 for mono, " +"2 for stereo\n" +" (defaults to 2)\n" +" --channel-map=CHANNELMAP Channel map to use instead of the " +"default\n" +" --fix-format Take the sample format from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-rate Take the sampling rate from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-channels Take the number of channels and the " +"channel map\n" +" from the sink the stream is being " +"connected to.\n" +" --no-remix Don't upmix or downmix channels.\n" +" --no-remap Map channels by index instead of " +"name.\n" +" --latency=BYTES Request the specified latency in " +"bytes.\n" +" --process-time=BYTES Request the specified process time " +"per request in bytes.\n" +" --property=PROPERTY=VALUE Set the specified property to the " +"specified value.\n" +" --raw Record/play raw PCM data.\n" +" --file-format=FFORMAT Record/play formatted PCM data.\n" +" --list-file-formats List available file formats.\n" + +#: ../src/utils/pacat.c:731 +#, c-format +msgid "" +"pacat %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pacat %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" + +#: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953 +#, c-format +msgid "Invalid client name '%s'" +msgstr "தவறான கிளையன் பெயர் '%s'" + +#: ../src/utils/pacat.c:779 +#, c-format +msgid "Invalid stream name '%s'" +msgstr "தவறான ஸ்டீரீம் பெயர் '%s'." + +#: ../src/utils/pacat.c:816 +#, c-format +msgid "Invalid channel map '%s'" +msgstr "தவறான சேனல் வரைபடம் '%s'" + +#: ../src/utils/pacat.c:845 +#, c-format +msgid "Invalid latency specification '%s'" +msgstr "தவறான லேடன்சி குறிப்பீடு '%s'" + +#: ../src/utils/pacat.c:852 +#, c-format +msgid "Invalid process time specification '%s'" +msgstr "தவறான செயல் நேர குறிப்பீடு '%s'" + +#: ../src/utils/pacat.c:864 +#, c-format +msgid "Invalid property '%s'" +msgstr "தவறான தன்மை '%s'." + +#: ../src/utils/pacat.c:881 +#, c-format +msgid "Unknown file format %s." +msgstr "தெரியாத கோப்பு வடிவம் %s." + +#: ../src/utils/pacat.c:900 +msgid "Invalid sample specification" +msgstr "தவறான மாதிரி குறிப்பீடு" + +#: ../src/utils/pacat.c:910 +#, c-format +msgid "open(): %s" +msgstr "open(): %s" + +#: ../src/utils/pacat.c:915 +#, c-format +msgid "dup2(): %s" +msgstr "dup2(): %s" + +#: ../src/utils/pacat.c:922 +msgid "Too many arguments." +msgstr "நிறைய விவாதங்கள்." + +#: ../src/utils/pacat.c:933 +msgid "Failed to generate sample specification for file." +msgstr "மாதிரி தகவலை பெற முடியவில்லை.: %s" + +#: ../src/utils/pacat.c:953 +msgid "Failed to open audio file." +msgstr "ஒலி கோப்பினை திறக்க முடியவில்லை." + +#: ../src/utils/pacat.c:959 +msgid "" +"Warning: specified sample specification will be overwritten with " +"specification from file." +msgstr "" +"எச்சரிக்கை: கோப்பிலிருந்து குறிப்பீட்டுடன் குறிக்கிட்ட மாதிரி குறிப்பீடு மேலெழுதப்படலாம்." + +#: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997 +msgid "Failed to determine sample specification from file." +msgstr "கோப்பிலிருந்து மாதிரி குறிப்பீட்டை வரையறுக்க முடியவில்லை." + +#: ../src/utils/pacat.c:971 +msgid "Warning: Failed to determine channel map from file." +msgstr "எச்சரிக்கை: கோப்பிலிருந்து சேனல் வரைபடத்தை வரையறுக்க முடியவில்லை." + +#: ../src/utils/pacat.c:982 +msgid "Channel map doesn't match sample specification" +msgstr "சேனல் வரைபடம் மாதிரி குறிப்பீட்டுடன் பொருந்தவில்லை" + +#: ../src/utils/pacat.c:993 +msgid "Warning: failed to write channel map to file." +msgstr "எச்சரிக்கை: கோப்புக்கு சேனல் வரைபடத்தை எழுத முடியவில்லை." + +#: ../src/utils/pacat.c:1008 +#, c-format +msgid "" +"Opening a %s stream with sample specification '%s' and channel map '%s'." +msgstr "" +"ஒரு %s ஸ்டீரம் மாதிரி குறிப்பீட்டை '%s' மற்றும் சேனல் வரைபட்டம் '%s' உடன் திறக்கிறது." + +#: ../src/utils/pacat.c:1009 +msgid "recording" +msgstr "ஒலிப்பதிவு" + +#: ../src/utils/pacat.c:1009 +msgid "playback" +msgstr "பிண்ணனி" + +#: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267 +msgid "pa_mainloop_new() failed." +msgstr "pa_mainloop_new() தோல்வி." + +#: ../src/utils/pacat.c:1054 +msgid "io_new() failed." +msgstr "io_new() தோல்வியுற்றது." + +#: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279 +msgid "pa_context_new() failed." +msgstr "pa_context_new() தோல்வி." + +#: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285 +#, c-format +msgid "pa_context_connect() failed: %s" +msgstr "pa_context_connect() தோல்வி: %s" + +#: ../src/utils/pacat.c:1075 +msgid "pa_context_rttime_new() failed." +msgstr "pa_context_rttime_new() தோல்வியுற்றது." + +#: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290 +msgid "pa_mainloop_run() failed." +msgstr "pa_mainloop_run() தோல்வி." + +#: ../src/utils/pasuspender.c:81 +#, c-format +msgid "fork(): %s\n" +msgstr "fork(): %s\n" + +#: ../src/utils/pasuspender.c:92 +#, c-format +msgid "execvp(): %s\n" +msgstr "execvp(): %s\n" + +#: ../src/utils/pasuspender.c:109 +#, c-format +msgid "Failure to suspend: %s\n" +msgstr "நீக்க முடியவில்லை: %s\n" + +#: ../src/utils/pasuspender.c:124 +#, c-format +msgid "Failure to resume: %s\n" +msgstr "தொடர முடியவில்லை: %s\n" + +#: ../src/utils/pasuspender.c:147 +#, c-format +msgid "WARNING: Sound server is not local, not suspending.\n" +msgstr "எச்சரிக்கை: ஒலி சேவையம் உள்ளமைவாக இல்லை, இடைநிறுத்தப்படவில்லை.\n" + +#: ../src/utils/pasuspender.c:159 +#, c-format +msgid "Connection failure: %s\n" +msgstr "இணைப்பதில் தோல்வி: %s\n" + +#: ../src/utils/pasuspender.c:176 +#, c-format +msgid "Got SIGINT, exiting.\n" +msgstr "SIGINT பெறப்பட்டது, வெளியேறுகிறது.\n" + +#: ../src/utils/pasuspender.c:194 +#, c-format +msgid "WARNING: Child process terminated by signal %u\n" +msgstr "எச்சரிக்கை: சேய் செயல் சிக்னல் %uஆல் முடிக்கப்பட்டது\n" + +#: ../src/utils/pasuspender.c:212 +#, c-format +msgid "" +"%s [options] ... \n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +"\n" +msgstr "" +"%s [விருப்பங்கள்] ... \n" +"\n" +" -h, --உதவி இந்த உதவியை காட்டு\n" +" --பதிப்பு பதிப்பினைக் காட்டு\n" +" -s, --சேவையகம்=SERVER பெயரிடப்பட்ட சேவையகம் இணைக்கப்பட வேண்டும்\n" +"\n" + +#: ../src/utils/pasuspender.c:248 +#, c-format +msgid "" +"pasuspender %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pasuspender %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" + +#: ../src/utils/pasuspender.c:277 +#, c-format +msgid "pa_mainloop_new() failed.\n" +msgstr "pa_mainloop_new() தோல்வி.\n" + +#: ../src/utils/pasuspender.c:290 +#, c-format +msgid "pa_context_new() failed.\n" +msgstr "pa_context_new() தோல்வி.\n" + +#: ../src/utils/pasuspender.c:298 +#, c-format +msgid "pa_mainloop_run() failed.\n" +msgstr "pa_mainloop_run() தோல்வி.\n" + +#: ../src/utils/pactl.c:135 +#, c-format +msgid "Failed to get statistics: %s" +msgstr "புள்ளிவிவரத்தை பெற முடியவில்லை: %s" + +#: ../src/utils/pactl.c:141 +#, c-format +msgid "Currently in use: %u blocks containing %s bytes total.\n" +msgstr "தற்போது பயனிலுள்ளது: %u தொகுதிகள் %s பைட்களை மொத்தமாக கொண்டுள்ளது.\n" + +#: ../src/utils/pactl.c:144 +#, c-format +msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n" +msgstr "" +"வாழ்க்கை முழுவதும் ஒதுக்கப்பட்டது: %u தொகுதிகள் %s பைட்களை மொத்தமாக கொண்டுள்ளது.\n" + +#: ../src/utils/pactl.c:147 +#, c-format +msgid "Sample cache size: %s\n" +msgstr "மாதிரி இடையக அளவு: %s\n" + +#: ../src/utils/pactl.c:156 +#, c-format +msgid "Failed to get server information: %s" +msgstr "சேவையகத்தின் தகவலை பெற முடியவில்லை: %s" + +#: ../src/utils/pactl.c:164 +#, c-format +msgid "" +"User name: %s\n" +"Host Name: %s\n" +"Server Name: %s\n" +"Server Version: %s\n" +"Default Sample Specification: %s\n" +"Default Channel Map: %s\n" +"Default Sink: %s\n" +"Default Source: %s\n" +"Cookie: %08x\n" +msgstr "" +"பயனர் பெயர்: %s\n" +"புரவலன் பெயர்: %s\n" +"Server பெயர்: %s\n" +"Server பதிப்பு: %s\n" +"Default Sample Specification: %s\n" +"Default Channel Map: %s\n" +"Default Sink: %s\n" +"முன்னிருப்பு மூலங்கள்: %s\n" +"கூக்கி: %08x\n" + +#: ../src/utils/pactl.c:205 +#, c-format +msgid "Failed to get sink information: %s" +msgstr "சுருக்கமான தகவலை பெறு முடியவில்லை: %s" + +#: ../src/utils/pactl.c:221 +#, c-format +msgid "" +"Sink #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor Source: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"சுருக்கம் #%u\n" +"\tமாநிலம்: %s\n" +"\tபெயர்: %s\n" +"\tவிளக்கம்: %s\n" +"\tஇயக்கி: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner முறைமை: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t மீதி %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor Source: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360 +#, c-format +msgid "\tPorts:\n" +msgstr "\tPorts:\n" + +#: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366 +#, c-format +msgid "\tActive Port: %s\n" +msgstr "\tசெயல்பாட்டிலுள்ள விவரக்குறிப்புகள்: %s\n" + +#: ../src/utils/pactl.c:297 +#, c-format +msgid "Failed to get source information: %s" +msgstr "மூலத்தின் தகவலை பெற இயலவில்லை: %s" + +#: ../src/utils/pactl.c:313 +#, c-format +msgid "" +"Source #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor of Sink: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"மூலம் #%u\n" +"\tநிலை: %s\n" +"\tபெயர்: %s\n" +"\tவிளக்கம்: %s\n" +"\tஇயக்கி: %s\n" +"\tமாதிரி குறிப்பிடுதல்: %s\n" +"\tசேனல் வரைபடம்.: %s\n" +"\tஉரிமையாளர் தொகுதி: %u\n" +"\tநிறுத்தப்பட்டது: %s\n" +"\tஒலி: %s%s%s\n" +"\t மீதி %0.2f\n" +"\tஅடிப்படை ஒலி: %s%s%s\n" +"\tகணினி சுருங்கப்பட்டது: %s\n" +"\tLatency: %0.0f usec, கட்டமைக்கப்பட்டது %0.0f usec\n" +"\tகொடிகள்: %s%s%s%s%s%s\n" +"\tபண்புகள்:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:345 ../src/utils/pactl.c:401 ../src/utils/pactl.c:436 +#: ../src/utils/pactl.c:473 ../src/utils/pactl.c:532 ../src/utils/pactl.c:533 +#: ../src/utils/pactl.c:543 ../src/utils/pactl.c:587 ../src/utils/pactl.c:588 +#: ../src/utils/pactl.c:594 ../src/utils/pactl.c:637 ../src/utils/pactl.c:638 +#: ../src/utils/pactl.c:645 +msgid "n/a" +msgstr "n/a" + +#: ../src/utils/pactl.c:375 +#, c-format +msgid "Failed to get module information: %s" +msgstr "தொகுதி தகவலை பெற முடியவில்லை: %s" + +#: ../src/utils/pactl.c:393 +#, c-format +msgid "" +"Module #%u\n" +"\tName: %s\n" +"\tArgument: %s\n" +"\tUsage counter: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"தொகுதி #%u\n" +"\tபெயர்: %s\n" +"\tவிவாதம்: %s\n" +"\tபயன்படுத்தும் கவுன்டர்: %s\n" +"\tபண்புகள்:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:412 +#, c-format +msgid "Failed to get client information: %s" +msgstr "கிளையன்ட் தகவலை பெற முடியவில்லை: %s" + +#: ../src/utils/pactl.c:430 +#, c-format +msgid "" +"Client #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"கிளையன்ட் #%u\n" +"\tஇயக்கி: %s\n" +"\tஉரிமையாளர் தொகுதி: %s\n" +"\tபண்புகள்:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:447 +#, c-format +msgid "Failed to get card information: %s" +msgstr "அட்டை தகவலை பெற முடியவில்லை: %s" + +#: ../src/utils/pactl.c:465 +#, c-format +msgid "" +"Card #%u\n" +"\tName: %s\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Card #%u\n" +"\tName: %s\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:479 +#, c-format +msgid "\tProfiles:\n" +msgstr "\tவிவரக்குறிப்புகள்:\n" + +#: ../src/utils/pactl.c:485 +#, c-format +msgid "\tActive Profile: %s\n" +msgstr "\tசெயல்பாட்டிலுள்ள விவரக்குறிப்புகள்: %s\n" + +#: ../src/utils/pactl.c:496 +#, c-format +msgid "Failed to get sink input information: %s" +msgstr "சிங்க் தகவலை பெற முடியவில்லை: %s" + +#: ../src/utils/pactl.c:515 +#, c-format +msgid "" +"Sink Input #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSink: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tMute: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSink Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Sink Input #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSink: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tMute: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSink Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:554 +#, c-format +msgid "Failed to get source output information: %s" +msgstr "மூல வெளிப்பாடு தகவலை பெற முடியவில்லை: %s" + +#: ../src/utils/pactl.c:574 +#, c-format +msgid "" +"Source Output #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSource: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSource Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Source Output #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSource: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSource Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:605 +#, c-format +msgid "Failed to get sample information: %s" +msgstr "மாதிரி தகவலை பெற முடியவில்லை.: %s" + +#: ../src/utils/pactl.c:623 +#, c-format +msgid "" +"Sample #%u\n" +"\tName: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tDuration: %0.1fs\n" +"\tSize: %s\n" +"\tLazy: %s\n" +"\tFilename: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Sample #%u\n" +"\tName: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tDuration: %0.1fs\n" +"\tSize: %s\n" +"\tLazy: %s\n" +"\tFilename: %s\n" +"\tProperties:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663 +#, c-format +msgid "Failure: %s" +msgstr "தோல்வி: %s" + +#: ../src/utils/pactl.c:687 +#, c-format +msgid "Failed to upload sample: %s" +msgstr "மாதிரியை மேம்படுத்த முடியவில்லை: %s" + +#: ../src/utils/pactl.c:704 +msgid "Premature end of file" +msgstr "முன்னாக கோப்பு முடித்தல்" + +#: ../src/utils/pactl.c:863 +msgid "Got SIGINT, exiting." +msgstr "SIGINT பெறப்பட்டது, வெளியேறுகிறது." + +#: ../src/utils/pactl.c:869 +#, c-format +msgid "" +"%s [options] stat\n" +"%s [options] list\n" +"%s [options] exit\n" +"%s [options] upload-sample FILENAME [NAME]\n" +"%s [options] play-sample NAME [SINK]\n" +"%s [options] remove-sample NAME\n" +"%s [options] move-sink-input SINKINPUT SINK\n" +"%s [options] move-source-output SOURCEOUTPUT SOURCE\n" +"%s [options] load-module NAME [ARGS ...]\n" +"%s [options] unload-module MODULE\n" +"%s [options] suspend-sink SINK 1|0\n" +"%s [options] suspend-source SOURCE 1|0\n" +"%s [options] set-card-profile CARD PROFILE\n" +"%s [options] set-sink-port SINK PORT\n" +"%s [options] set-source-port SOURCE PORT\n" +"%s [options] set-sink-volume SINK VOLUME\n" +"%s [options] set-source-volume SOURCE VOLUME\n" +"%s [options] set-sink-input-volume SINKINPUT VOLUME\n" +"%s [options] set-sink-mute SINK 1|0\n" +"%s [options] set-source-mute SOURCE 1|0\n" +"%s [options] set-sink-input-mute SINKINPUT 1|0\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" +msgstr "" +"%s [options] stat\n" +"%s [options] list\n" +"%s [options] exit\n" +"%s [options] upload-sample FILENAME [NAME]\n" +"%s [options] play-sample NAME [SINK]\n" +"%s [options] remove-sample NAME\n" +"%s [options] move-sink-input SINKINPUT SINK\n" +"%s [options] move-source-output SOURCEOUTPUT SOURCE\n" +"%s [options] load-module NAME [ARGS ...]\n" +"%s [options] unload-module MODULE\n" +"%s [options] suspend-sink SINK 1|0\n" +"%s [options] suspend-source SOURCE 1|0\n" +"%s [options] set-card-profile CARD PROFILE\n" +"%s [options] set-sink-port SINK PORT\n" +"%s [options] set-source-port SOURCE PORT\n" +"%s [options] set-sink-volume SINK VOLUME\n" +"%s [options] set-source-volume SOURCE VOLUME\n" +"%s [options] set-sink-input-volume SINKINPUT VOLUME\n" +"%s [options] set-sink-mute SINK 1|0\n" +"%s [options] set-source-mute SOURCE 1|0\n" +"%s [options] set-sink-input-mute SINKINPUT 1|0\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" + +#: ../src/utils/pactl.c:933 +#, c-format +msgid "" +"pactl %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pactl %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" + +#: ../src/utils/pactl.c:979 +msgid "Please specify a sample file to load" +msgstr "ஏற்றுவதற்கு ஒரு மாதிரி கோப்பினை குறிப்பிடவும்" + +#: ../src/utils/pactl.c:992 +msgid "Failed to open sound file." +msgstr "ஒலி கோப்பினை திறக்க முடியவில்லை." + +#: ../src/utils/pactl.c:1004 +msgid "Warning: Failed to determine sample specification from file." +msgstr "எச்சரிக்கை: கோப்பிலிருந்து மாதிரி குறிப்பீட்டை வரையறுக்க முடியவில்லை." + +#: ../src/utils/pactl.c:1014 +msgid "You have to specify a sample name to play" +msgstr "இயக்கிவதற்கு நீங்கள் ஒரு மாதிரி பெயர் குறிப்பிட வேண்டும்" + +#: ../src/utils/pactl.c:1026 +msgid "You have to specify a sample name to remove" +msgstr "நீக்குவதற்கு நீங்கள் ஒரு மாதிரி பெயர் குறிப்பிட வேண்டும்" + +#: ../src/utils/pactl.c:1035 +msgid "You have to specify a sink input index and a sink" +msgstr "நீங்கள் ஒரு சிங்க் உள்ளீடு சுட்டி மற்றும் ஒரு சிங்கை குறிப்பிட வேண்டும்" + +#: ../src/utils/pactl.c:1045 +msgid "You have to specify a source output index and a source" +msgstr "நீங்கள் ஒரு மூல வெளிப்பாடு சுட்டி மற்றும் ஒரு மூலத்தை குறிப்பிட வேண்டும்" + +#: ../src/utils/pactl.c:1060 +msgid "You have to specify a module name and arguments." +msgstr "தொகுதி பெயர் மற்றும் விவாதங்களை நீங்கள் குறிப்பிட வேண்டும்." + +#: ../src/utils/pactl.c:1080 +msgid "You have to specify a module index" +msgstr "தொகுதி அட்டவணையை நீங்கள் குறிப்பிட வேண்டும்" + +#: ../src/utils/pactl.c:1090 +msgid "" +"You may not specify more than one sink. You have to specify a boolean value." +msgstr "" +"ஒரு சிங்கிற்கு மேல் நீங்கள் குறிப்பிடக் கூடாது. பூலியன் மதிப்பை நீங்கள் குறிப்பிட வேண்டும்." + +#: ../src/utils/pactl.c:1103 +msgid "" +"You may not specify more than one source. You have to specify a boolean " +"value." +msgstr "" +"ஒரு மூலத்திற்கு மேல் நீங்கள் குறிப்பிடக் கூடாது. பூலியன் மதிப்பை நீங்கள் குறிப்பிட வேண்டும்." + +#: ../src/utils/pactl.c:1115 +msgid "You have to specify a card name/index and a profile name" +msgstr "ஒரு அட்டை பெயர்/ முன்பக்கம் மற்றும் ஒரு விவரச்சீட்டு பெயர் நீங்கள் குறிப்பிட வேண்டும்" + +#: ../src/utils/pactl.c:1126 +msgid "You have to specify a sink name/index and a port name" +msgstr "நீங்கள் ஒரு சிங்க் பெயர்/ முன்பக்கம் மற்றும் ஒரு துறைப் பெயரை குறிப்பிட வேண்டும்" + +#: ../src/utils/pactl.c:1137 +msgid "You have to specify a source name/index and a port name" +msgstr "ஒரு மூலப் பெயர்/ முன்பக்கம் மற்றும் ஒரு துறைப் பெயர் நீங்கள் குறிப்பிட வேண்டும்" + +#: ../src/utils/pactl.c:1149 +msgid "You have to specify a sink name/index and a volume" +msgstr "நீங்கள் ஒரு சிங்க் பெயர்/ முன்பக்கம் மற்றும் ஒரு துறைப் பெயரை குறிப்பிட வேண்டும்" + +#: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171 +#: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209 +#: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248 +msgid "Invalid volume specification" +msgstr "தவறான தொகுதி குறிப்பீடு" + +#: ../src/utils/pactl.c:1166 +msgid "You have to specify a source name/index and a volume" +msgstr "ஒரு மூலப் பெயர்/ முன்பக்கம் மற்றும் ஒரு துறைப் பெயர் நீங்கள் குறிப்பிட வேண்டும்" + +#: ../src/utils/pactl.c:1183 +msgid "You have to specify a sink input index and a volume" +msgstr "நீங்கள் ஒரு சிங்க் உள்ளீடு சுட்டி மற்றும் ஒரு சிங்கை குறிப்பிட வேண்டும்" + +#: ../src/utils/pactl.c:1188 +msgid "Invalid sink input index" +msgstr "தவறான சுருக்க உள்ளீடு அட்டவணை" + +#: ../src/utils/pactl.c:1204 +msgid "You have to specify a sink name/index and a mute boolean" +msgstr "நீங்கள் ஒரு சிங்க் பெயர்/ முன்பக்கம் மற்றும் ஒரு துறைப் பெயரை குறிப்பிட வேண்டும்" + +#: ../src/utils/pactl.c:1221 +msgid "You have to specify a source name/index and a mute boolean" +msgstr "ஒரு மூலப் பெயர்/ முன்பக்கம் மற்றும் ஒரு துறைப் பெயர் நீங்கள் குறிப்பிட வேண்டும்" + +#: ../src/utils/pactl.c:1238 +msgid "You have to specify a sink input index and a mute boolean" +msgstr "நீங்கள் ஒரு சிங்க் உள்ளீடு சுட்டி மற்றும் ஒரு சிங்கை குறிப்பிட வேண்டும்" + +#: ../src/utils/pactl.c:1243 +msgid "Invalid sink input index specification" +msgstr "தவறான சுருக்க உள்ளீடு அட்டவணை குறிப்பீடு" + +#: ../src/utils/pactl.c:1262 +msgid "No valid command specified." +msgstr "சரியான கட்டளை குறிப்பிடபடவில்லை" + +#: ../src/utils/pax11publish.c:61 +#, c-format +msgid "" +"%s [-D display] [-S server] [-O sink] [-I source] [-c file] [-d|-e|-i|-r]\n" +"\n" +" -d Show current PulseAudio data attached to X11 display (default)\n" +" -e Export local PulseAudio data to X11 display\n" +" -i Import PulseAudio data from X11 display to local environment " +"variables and cookie file.\n" +" -r Remove PulseAudio data from X11 display\n" +msgstr "" +"%s [-D display] [-S server] [-O sink] [-I source] [-c file] [-d|-e|-i|-r]\n" +"\n" +" -d Show current PulseAudio data attached to X11 display (default)\n" +" -e Export local PulseAudio data to X11 display\n" +" -i Import PulseAudio data from X11 display to local environment " +"variables and cookie file.\n" +" -r Remove PulseAudio data from X11 display\n" + +#: ../src/utils/pax11publish.c:94 +#, c-format +msgid "Failed to parse command line.\n" +msgstr "கட்டளை வரியை மாற்ற முடியவில்லை \n" + +#: ../src/utils/pax11publish.c:108 +#, c-format +msgid "Server: %s\n" +msgstr "சேவையகம்: %s\n" + +#: ../src/utils/pax11publish.c:110 +#, c-format +msgid "Source: %s\n" +msgstr "மூலம்: %s\n" + +#: ../src/utils/pax11publish.c:112 +#, c-format +msgid "Sink: %s\n" +msgstr "சுருங்குதல்: %s\n" + +#: ../src/utils/pax11publish.c:114 +#, c-format +msgid "Cookie: %s\n" +msgstr "கூக்கீ: %s\n" + +#: ../src/utils/pax11publish.c:132 +#, c-format +msgid "Failed to parse cookie data\n" +msgstr "குக்கீ தரவை மாற்ற முடியவில்லை\n" + +#: ../src/utils/pax11publish.c:137 +#, c-format +msgid "Failed to save cookie data\n" +msgstr "குக்கீ தரவை சேமிக்க முடியவில்லை\n" + +#: ../src/utils/pax11publish.c:152 +#, c-format +msgid "Failed to load client configuration file.\n" +msgstr "கிளையன்ட் கட்டமைப்பு கோப்பினை ஏற்ற முடியவில்லை.\n" + +#: ../src/utils/pax11publish.c:157 +#, c-format +msgid "Failed to read environment configuration data.\n" +msgstr "சுற்றுப்புற கட்டமைப்பு தரவினை வாணிக்க முடியவில்லை.\n" + +#: ../src/utils/pax11publish.c:174 +#, c-format +msgid "Failed to get FQDN.\n" +msgstr "FQDNஐ பெற முடியவில்லை.\n" + +#: ../src/utils/pax11publish.c:194 +#, c-format +msgid "Failed to load cookie data\n" +msgstr "குக்கீ தரவை ஏற்ற முடியவில்லை\n" + +#: ../src/utils/pax11publish.c:211 +#, c-format +msgid "Not yet implemented.\n" +msgstr "இன்னும் செயல்படுத்தபடவில்லை.\n" + +#: ../src/utils/pacmd.c:69 +msgid "No PulseAudio daemon running, or not running as session daemon." +msgstr "PulseAudio டீமான் இயங்கவில்லை, அல்லது அமர்வு டீமானாக இயங்கவில்லை." + +#: ../src/utils/pacmd.c:74 +#, c-format +msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s" +msgstr "socket(PF_UNIX, SOCK_STREAM, 0): %s" + +#: ../src/utils/pacmd.c:91 +#, c-format +msgid "connect(): %s" +msgstr "connect(): %s" + +#: ../src/utils/pacmd.c:99 +msgid "Failed to kill PulseAudio daemon." +msgstr "PulseAudio daemonஐ நிறுத்த முடியவில்லை." + +#: ../src/utils/pacmd.c:107 +msgid "Daemon not responding." +msgstr "டோமோன் பதிலளிக்க மறுக்கிறது." + +#: ../src/utils/pacmd.c:161 +#, c-format +msgid "poll(): %s" +msgstr "poll(): %s" + +#: ../src/utils/pacmd.c:171 ../src/utils/pacmd.c:188 +#, c-format +msgid "read(): %s" +msgstr "read(): %s" + +#: ../src/utils/pacmd.c:207 ../src/utils/pacmd.c:223 +#, c-format +msgid "write(): %s" +msgstr "write(): %s" + +#: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:219 +msgid "Cannot access autospawn lock." +msgstr "autospawn பூட்டை அணுக முடியவில்லை." + +#: ../src/modules/alsa/alsa-sink.c:530 ../src/modules/alsa/alsa-sink.c:689 +#, c-format +msgid "" +"ALSA woke us up to write new data to the device, but there was actually " +"nothing to write!\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers.\n" +"We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() " +"returned 0 or another value < min_avail." +msgstr "" +"ALSA சாதனத்திற்கு புதிய தரவை எழுதுவதற்கு எங்களை எழுப்பி இருக்கவாம், ஆனால் இங்கே " +"சரியாக எழுதுவதற்கு எதுவும் இல்லை!\n" +"இந்த ஒரு பிழையானது ALSA இயக்கி '%s'. இந்த வெளிப்பாட்டை ALSA வல்லுநர்களுக்கு " +"அறிக்கையிடவும்.\n" +"POLLOUT அமைவுடன் நாங்கள் எழுந்திருந்தோம்-- எப்படியிருந்தும் அடுத்தடுத்து snd_pcm_avail" +"() r0 அல்லது வேறொரு மதிப்பு < min_avail திரும்பியது." + +#: ../src/modules/alsa/alsa-source.c:506 ../src/modules/alsa/alsa-source.c:656 +#, c-format +msgid "" +"ALSA woke us up to read new data from the device, but there was actually " +"nothing to read!\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers.\n" +"We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() " +"returned 0 or another value < min_avail." +msgstr "" +"ALSA சாதனத்திற்கு புதிய தரவை எழுதுவதற்கு எங்களை எழுப்பி இருக்கவாம், ஆனால் இங்கே " +"சரியாக எழுதுவதற்கு எதுவும் இல்லை!\n" +"இந்த ஒரு பிழையானது ALSA இயக்கி '%s'. இந்த வெளிப்பாட்டை ALSA வல்லுநர்களுக்கு " +"அறிக்கையிடவும்.\n" +"POLLOUT அமைவுடன் நாங்கள் எழுந்திருந்தோம்-- எப்படியிருந்தும் அடுத்தடுத்து snd_pcm_avail" +"() 0 அல்லது வேறொரு மதிப்பு < min_avail திரும்பியது." + +#: ../src/modules/alsa/module-alsa-card.c:152 +#: ../src/modules/bluetooth/module-bluetooth-device.c:2228 +#: ../src/modules/alsa/alsa-mixer.c:2931 +msgid "Off" +msgstr "ஆஃப்" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2184 +msgid "High Fidelity Playback (A2DP)" +msgstr "High Fidelity Playback (A2DP)" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2198 +msgid "High Fidelity Capture (A2DP)" +msgstr "High Fidelity Capture (A2DP)" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2213 +msgid "Telephony Duplex (HSP/HFP)" +msgstr "Telephony Duplex (HSP/HFP)" + +#: ../src/modules/reserve-wrap.c:151 +msgid "PulseAudio Sound Server" +msgstr "PulseAudio ஒலி சேவையகம்" + +#: ../src/modules/module-rygel-media-server.c:569 +#: ../src/modules/module-rygel-media-server.c:583 +msgid "Output Devices" +msgstr "" + +#: ../src/modules/module-rygel-media-server.c:570 +#: ../src/modules/module-rygel-media-server.c:584 +msgid "Input Devices" +msgstr "" + +#: ../src/modules/module-rygel-media-server.c:774 +msgid "Audio on @HOSTNAME@" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1701 +msgid "Input" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1702 +msgid "Docking Station Input" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1703 +msgid "Docking Station Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1704 +msgid "Line-In" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1705 +msgid "Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1706 +msgid "External Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1707 +#, fuzzy +msgid "Internal Microphone" +msgstr "உட்புற ஆடியோ" + +#: ../src/modules/alsa/alsa-mixer.c:1708 +msgid "Radio" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1709 +msgid "Video" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1710 +msgid "Automatic Gain Control" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1711 +msgid "No Automatic Gain Control" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1712 +msgid "Boost" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1713 +msgid "No Boost" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1714 +msgid "Amplifier" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1715 +msgid "No Amplifier" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1773 +msgid "Analog Input" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1774 +msgid "Analog Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1775 +msgid "Analog Line-In" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1776 +msgid "Analog Radio" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1777 +msgid "Analog Video" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1778 +#, fuzzy +msgid "Analog Output" +msgstr "பூஜ்ஜிய வெளிப்பாடு" + +#: ../src/modules/alsa/alsa-mixer.c:1779 +msgid "Analog Headphones" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1780 +msgid "Analog Output (LFE)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1781 +msgid "Analog Mono Output" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1981 +#, fuzzy, c-format +msgid "%s+%s" +msgstr "%s %s" + +#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404 +#, fuzzy, c-format +msgid "%s / %s" +msgstr "%s %s" + +#: ../src/modules/alsa/alsa-mixer.c:2790 +msgid "Analog Mono" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2791 +#, fuzzy +msgid "Analog Stereo" +msgstr "ஸ்டிரியோ" + +#: ../src/modules/alsa/alsa-mixer.c:2792 +#, fuzzy +msgid "Analog Surround 2.1" +msgstr "Surround 4.1" + +#: ../src/modules/alsa/alsa-mixer.c:2793 +#, fuzzy +msgid "Analog Surround 3.0" +msgstr "Surround 4.0" + +#: ../src/modules/alsa/alsa-mixer.c:2794 +#, fuzzy +msgid "Analog Surround 3.1" +msgstr "Surround 4.1" + +#: ../src/modules/alsa/alsa-mixer.c:2795 +#, fuzzy +msgid "Analog Surround 4.0" +msgstr "Surround 4.0" + +#: ../src/modules/alsa/alsa-mixer.c:2796 +#, fuzzy +msgid "Analog Surround 4.1" +msgstr "Surround 4.1" + +#: ../src/modules/alsa/alsa-mixer.c:2797 +#, fuzzy +msgid "Analog Surround 5.0" +msgstr "Surround 5.0" + +#: ../src/modules/alsa/alsa-mixer.c:2798 +#, fuzzy +msgid "Analog Surround 5.1" +msgstr "Surround 5.1" + +#: ../src/modules/alsa/alsa-mixer.c:2799 +#, fuzzy +msgid "Analog Surround 6.0" +msgstr "Surround 4.0" + +#: ../src/modules/alsa/alsa-mixer.c:2800 +#, fuzzy +msgid "Analog Surround 6.1" +msgstr "Surround 4.1" + +#: ../src/modules/alsa/alsa-mixer.c:2801 +#, fuzzy +msgid "Analog Surround 7.0" +msgstr "Surround 4.0" + +#: ../src/modules/alsa/alsa-mixer.c:2802 +#, fuzzy +msgid "Analog Surround 7.1" +msgstr "Surround 7.1" + +#: ../src/modules/alsa/alsa-mixer.c:2803 +msgid "Digital Stereo (IEC958)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2804 +msgid "Digital Surround 4.0 (IEC958)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2805 +msgid "Digital Surround 4.0 (IEC958/AC3)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2806 +msgid "Digital Surround 5.1 (IEC958/AC3)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2807 +msgid "Digital Stereo (HDMI)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2928 +msgid "Analog Mono Duplex" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2929 +msgid "Analog Stereo Duplex" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2930 +msgid "Digital Stereo Duplex (IEC958)" +msgstr "" diff --git a/po/te.po b/po/te.po new file mode 100644 index 0000000..31fa09a --- /dev/null +++ b/po/te.po @@ -0,0 +1,2570 @@ +# translation of pulseaudio.master-tx.te.po to Telugu +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Krishna Babu K , 2009. +msgid "" +msgstr "" +"Project-Id-Version: pulseaudio.master-tx.te\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-09-29 23:47+0200\n" +"PO-Revision-Date: 2009-09-21 17:28+0530\n" +"Last-Translator: Krishna Babu K \n" +"Language-Team: Telugu \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=2; plural=(n!=1);\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" + +#: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629 +#, c-format +msgid "%s %s" +msgstr "%s %s" + +#: ../src/modules/alsa/alsa-util.c:1106 +#, c-format +msgid "" +"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu " +"ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_avail() అనునది పెద్ద విలువను యిచ్చినది: %lu bytes (%lu ms).\n" +"సాదారణంగా యిది ALSA డ్రైవర్ '%s' నందలి బగ్ కావచ్చును. దయచేసి దీనిని ALSA అభివృద్ది కారులకు " +"నివేదించుము." + +#: ../src/modules/alsa/alsa-util.c:1147 +#, c-format +msgid "" +"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%" +"lu ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_delay() అనునది పెద్ద విలువను యిచ్చినది: %li bytes (%s%lu ms).\n" +"సాదారణంగా యిది ALSA డ్రైవర్ '%s' నందు బగ్ కావచ్చును . దయచేసి దీనిని ALSA అభివృద్దికారులక " +"నివేదించుము." + +#: ../src/modules/alsa/alsa-util.c:1194 +#, c-format +msgid "" +"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes " +"(%lu ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_mmap_begin() అనునది పెద్ద విలువను యిచ్చినది: %lu bytes (%lu ms).\n" +"సాదారణంగా యిది ALSA డ్రైవర్ '%s'నందలి బగ్ కావచ్చును. దయచేసి దీనిని ALSA అభివృద్దికారులను నివేదించండి." + +#: ../src/modules/module-always-sink.c:39 +msgid "Always keeps at least one sink loaded even if it's a null one" +msgstr "ఒకవేళ అది null అయినా కూడా యెల్లప్పుడూ కనీసం వొక సింకు లోడైనట్లు వుంచుతుంది" + +#: ../src/modules/module-always-sink.c:83 +msgid "Dummy Output" +msgstr "డమ్మీ అవుట్పుట్" + +#: ../src/modules/module-ladspa-sink.c:49 +msgid "Virtual LADSPA sink" +msgstr "వర్చ్యువల్ LADSPA సింకు" + +#: ../src/modules/module-ladspa-sink.c:53 +msgid "" +"sink_name= sink_properties= " +"master= format= rate= " +"channels= channel_map= plugin= label= control=" +msgstr "" +"sink_name=<సింక్ నామము> sink_properties=<సింకు లక్షణములు> master=<ఫిల్టర్‌కు సింకు " +"నామము> format=<మాదిరి ఫార్మాట్> rate=<మాదిరి రేటు> channels=<చానల్సు సంఖ్య> " +"channel_map=<చానల్ మాప్> plugin= label= " +"control=<ఇన్పుట్ నియంత్రణ విలువలయొక్క జాబితా>" + +#: ../src/modules/module-null-sink.c:55 +msgid "Clocked NULL sink" +msgstr "NULL సింక్ క్లాక్‌చేయబడింది" + +#: ../src/modules/module-null-sink.c:291 +msgid "Null Output" +msgstr "Null అవుట్పుట్" + +#: ../src/pulsecore/sink.c:2613 +msgid "Internal Audio" +msgstr "అంతర్గత ఆడియో" + +#: ../src/pulsecore/sink.c:2618 +msgid "Modem" +msgstr "మోడెమ్" + +#: ../src/daemon/ltdl-bind-now.c:124 +msgid "Failed to find original lt_dlopen loader." +msgstr "వాస్తవ lt_dlopen లోడర్ కనుగొనుటలో విఫలమైంది." + +#: ../src/daemon/ltdl-bind-now.c:129 +msgid "Failed to allocate new dl loader." +msgstr "కొత్త dl లోడర్ కేటాయించుటలో విఫలమైంది." + +#: ../src/daemon/ltdl-bind-now.c:142 +msgid "Failed to add bind-now-loader." +msgstr "bind-now-loader జతచేయుటకు విఫలమైంది." + +#: ../src/daemon/main.c:141 +#, c-format +msgid "Got signal %s." +msgstr "సంకేతము %s పొందినది." + +#: ../src/daemon/main.c:168 +msgid "Exiting." +msgstr "నిష్క్రమించుచున్నది." + +#: ../src/daemon/main.c:186 +#, c-format +msgid "Failed to find user '%s'." +msgstr "వినియోగదారి '%s'ను కనుగొనుటకు విఫలమైంది." + +#: ../src/daemon/main.c:191 +#, c-format +msgid "Failed to find group '%s'." +msgstr "సమూహం '%s' కనుగొనుటకు విఫలమైంది." + +#: ../src/daemon/main.c:195 +#, c-format +msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)." +msgstr "వినియోగదారి '%s' (UID %lu) మరియు సమూహము '%s' (GID %lu) కనబడినవి." + +#: ../src/daemon/main.c:200 +#, c-format +msgid "GID of user '%s' and of group '%s' don't match." +msgstr "వినియోగదారి '%s' మరియు సమూహము '%s' యొక్క GID సరితూగలేదు." + +#: ../src/daemon/main.c:205 +#, c-format +msgid "Home directory of user '%s' is not '%s', ignoring." +msgstr "వినియోగదారి '%s' యొక్క నివాస డైరెక్టరీ '%s' కాదు, వదిలివేయుచున్నది." + +#: ../src/daemon/main.c:208 ../src/daemon/main.c:213 +#, c-format +msgid "Failed to create '%s': %s" +msgstr "'%s' సృష్టించుటకు విఫలమైంది: %s" + +#: ../src/daemon/main.c:220 +#, c-format +msgid "Failed to change group list: %s" +msgstr "సమూహ జాబితా మార్చుటకు విఫలమైంది: %s" + +#: ../src/daemon/main.c:236 +#, c-format +msgid "Failed to change GID: %s" +msgstr "GID మార్చుటకు విఫలమైంది: %s" + +#: ../src/daemon/main.c:252 +#, c-format +msgid "Failed to change UID: %s" +msgstr "UID మార్చటకు విఫలమైంది: %s" + +#: ../src/daemon/main.c:271 +msgid "Successfully dropped root privileges." +msgstr "root అనుమతులు విజయవంతంగా తిసివేయబడినాయి." + +#: ../src/daemon/main.c:279 +msgid "System wide mode unsupported on this platform." +msgstr "ఈ ప్లాట్‌ఫాం నందు సిస్టమ్ తరహా రీతి మద్దతీయబడదు." + +#: ../src/daemon/main.c:297 +#, c-format +msgid "setrlimit(%s, (%u, %u)) failed: %s" +msgstr "setrlimit(%s, (%u, %u)) విఫలమైంది: %s" + +#: ../src/daemon/main.c:474 +msgid "Failed to parse command line." +msgstr "ఆదేశ వరుసను పార్శ్ చేయుటకు విఫలమైంది." + +#: ../src/daemon/main.c:541 +msgid "Daemon not running" +msgstr "డెమోన్ నడుచుట లేదు" + +#: ../src/daemon/main.c:543 +#, c-format +msgid "Daemon running as PID %u" +msgstr "డెమోన్ PID %u వలె నడుచుచున్నది" + +#: ../src/daemon/main.c:553 +#, c-format +msgid "Failed to kill daemon: %s" +msgstr "డెమోన్ చంపుటకు విఫలమైంది: %s" + +#: ../src/daemon/main.c:571 +msgid "" +"This program is not intended to be run as root (unless --system is " +"specified)." +msgstr "ఈ ప్రోగ్రామ్ root లా నడుపవలసింది కాదు (--system తెలిపితే తప్ప)" + +#: ../src/daemon/main.c:573 +msgid "Root privileges required." +msgstr "Root అనుమతులు అవసరము." + +#: ../src/daemon/main.c:578 +msgid "--start not supported for system instances." +msgstr "--start సిస్టమ్ సంభవాల ద్వారా మద్దతీయబడదు." + +#: ../src/daemon/main.c:583 +msgid "Running in system mode, but --disallow-exit not set!" +msgstr "సిస్టమ్ మోడ్ నందు నడుపుతోంది, అయితే --disallow-exit అమర్చలేదు!" + +#: ../src/daemon/main.c:586 +msgid "Running in system mode, but --disallow-module-loading not set!" +msgstr "సిస్టమ్ రీతినందు నడుచుచున్నది, అయితే --disallow-module-loading అమర్చలేదు!" + +#: ../src/daemon/main.c:589 +msgid "Running in system mode, forcibly disabling SHM mode!" +msgstr "సిస్టమ్ రీతినందు నడుపుచున్నది, బలవంతంగా SHM రీతిని అచేతనము చేస్తోంది!" + +#: ../src/daemon/main.c:594 +msgid "Running in system mode, forcibly disabling exit idle time!" +msgstr "సిస్టమ్ రీతినందు నడుచుచున్నది, బలవంతంగా నిష్క్రమణ వృధా సమయాన్ని అచేతనము చేయుచున్నది!" + +#: ../src/daemon/main.c:621 +msgid "Failed to acquire stdio." +msgstr "stdio పొందుటకు విఫలమైంది." + +#: ../src/daemon/main.c:627 +#, c-format +msgid "pipe failed: %s" +msgstr "పైర్ విఫలమైంది: %s" + +#: ../src/daemon/main.c:632 +#, c-format +msgid "fork() failed: %s" +msgstr "fork() విఫలమైంది: %s" + +#: ../src/daemon/main.c:646 ../src/utils/pacat.c:508 +#, c-format +msgid "read() failed: %s" +msgstr "read() విఫలమైంది: %s" + +#: ../src/daemon/main.c:652 +msgid "Daemon startup failed." +msgstr "డెమోన్ ప్రారంభం విఫలమైంది." + +#: ../src/daemon/main.c:654 +msgid "Daemon startup successful." +msgstr "డెమోన్ ప్రారంభము సఫలమైంది." + +#: ../src/daemon/main.c:731 +#, c-format +msgid "This is PulseAudio %s" +msgstr "ఇది PulseAudio %s" + +#: ../src/daemon/main.c:732 +#, c-format +msgid "Compilation host: %s" +msgstr "నిర్వర్తన హోస్టు: %s" + +#: ../src/daemon/main.c:733 +#, c-format +msgid "Compilation CFLAGS: %s" +msgstr "నిర్వర్తన CFLAGS: %s" + +#: ../src/daemon/main.c:736 +#, c-format +msgid "Running on host: %s" +msgstr "హోస్టును నడుపుచున్నది: %s" + +#: ../src/daemon/main.c:739 +#, c-format +msgid "Found %u CPUs." +msgstr "%u CPUలను కనుగొన్నది." + +#: ../src/daemon/main.c:741 +#, c-format +msgid "Page size is %lu bytes" +msgstr "పేజీ పరిమాణము %lu బైట్లు" + +#: ../src/daemon/main.c:744 +msgid "Compiled with Valgrind support: yes" +msgstr "Valgrind మద్దతుతో నిర్వర్తించబడింది: అవును" + +#: ../src/daemon/main.c:746 +msgid "Compiled with Valgrind support: no" +msgstr "Valgrind మద్దతుతో నిర్వర్తించబడింది: లేదు" + +#: ../src/daemon/main.c:749 +#, c-format +msgid "Running in valgrind mode: %s" +msgstr "valgrind రీతినందు నడుపుచున్నది: %s" + +#: ../src/daemon/main.c:752 +msgid "Optimized build: yes" +msgstr "ఆప్టిమైజ్డు బుల్డు: అవును" + +#: ../src/daemon/main.c:754 +msgid "Optimized build: no" +msgstr "ఆప్టిమైజ్డు బుల్డు: కాదు" + +#: ../src/daemon/main.c:758 +msgid "NDEBUG defined, all asserts disabled." +msgstr "NDEBUG నిర్వచించబడింది, అన్ని స్థిరరాశులు అచేతనమైనవి." + +#: ../src/daemon/main.c:760 +msgid "FASTPATH defined, only fast path asserts disabled." +msgstr "FASTPATH నిర్వచించబడింది, ఫాస్ట్ పాత్ స్థిరరాశులు మాత్రమే అచేతనమైనవి." + +#: ../src/daemon/main.c:762 +msgid "All asserts enabled." +msgstr "అన్ని స్థిరరాశులు చేతనమైనవి." + +#: ../src/daemon/main.c:766 +msgid "Failed to get machine ID" +msgstr "మిషన్ ID పొందుటకు విఫలమైంది" + +#: ../src/daemon/main.c:769 +#, c-format +msgid "Machine ID is %s." +msgstr "మిషన్ ID %s." + +#: ../src/daemon/main.c:773 +#, c-format +msgid "Session ID is %s." +msgstr "సెషన్ ID %s." + +#: ../src/daemon/main.c:779 +#, c-format +msgid "Using runtime directory %s." +msgstr "రన్‌టైమ్ డైరెక్టరీను వుపయోగించుచున్నది %s." + +#: ../src/daemon/main.c:784 +#, c-format +msgid "Using state directory %s." +msgstr "స్థితి డైరెక్టరీను వుపయోగించుచున్నది %s." + +#: ../src/daemon/main.c:787 +#, c-format +msgid "Using modules directory %s." +msgstr "మాడ్యూళ్ళ డైరెక్టరీ %s వుపయోగిస్తోంది." + +#: ../src/daemon/main.c:789 +#, c-format +msgid "Running in system mode: %s" +msgstr "సిస్టమ్ రీతినందు వుపయోగించుచున్నది: %s" + +#: ../src/daemon/main.c:792 +msgid "" +"OK, so you are running PA in system mode. Please note that you most likely " +"shouldn't be doing that.\n" +"If you do it nonetheless then it's your own fault if things don't work as " +"expected.\n" +"Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an " +"explanation why system mode is usually a bad idea." +msgstr "" +"సరే, అయితే మీరు PAను సిస్టమ్ రీతినందు నడుపుతున్నారు. మీరు అలా చేయకూడదని దయచేసి గమనించండి.\n" +"ఒకవేళ మీరు అలా చేస్తే తరువాత మీరు అనుకొన్నట్లు పనిచేయకపోతే అది యిక మీ తప్పే.\n" +"సిస్టమ్ రీతి అనునది సరైనటువంటిది యెందుకు కాదో వివరణ కొరకు దయచేసి యిక్కడ చదవండి http://" +"pulseaudio.org/wiki/WhatIsWrongWithSystemMode" + +#: ../src/daemon/main.c:809 +msgid "pa_pid_file_create() failed." +msgstr "pa_pid_file_create() విఫలమైంది." + +#: ../src/daemon/main.c:819 +msgid "Fresh high-resolution timers available! Bon appetit!" +msgstr "తాజా అధిక-తీవ్రత కాలసూచికలు అందుబాటులో వున్నాయి! బాన్ ఎపటైట్!" + +#: ../src/daemon/main.c:821 +msgid "" +"Dude, your kernel stinks! The chef's recommendation today is Linux with high-" +"resolution timers enabled!" +msgstr "మిత్రమా, నీ కెర్నల్ చెడిపోయింది! అధిక-తీవ్రత కాలసూచకిలను చేతనము చేయమని సూచించడమైనది!" + +#: ../src/daemon/main.c:844 +msgid "pa_core_new() failed." +msgstr "pa_core_new() విఫలమైంది." + +#: ../src/daemon/main.c:904 +msgid "Failed to initialize daemon." +msgstr "డెమోన్ సిద్దముచేయుటకు విఫలమైంది." + +#: ../src/daemon/main.c:909 +msgid "Daemon startup without any loaded modules, refusing to work." +msgstr "ఏవిధమైన మాడ్యూళ్ళు లోడవకుండా డెమోన్ ప్రారంభము, పనిచేయుటకు తిరస్కరించబడింది." + +#: ../src/daemon/main.c:926 +msgid "Daemon startup complete." +msgstr "డెమోన్ ప్రారంభము పూర్తైనది." + +#: ../src/daemon/main.c:932 +msgid "Daemon shutdown initiated." +msgstr "డెమోన్ మూసివేత సిద్దముచేయబడింది." + +#: ../src/daemon/main.c:954 +msgid "Daemon terminated." +msgstr "డెమోన్ అంతముచేయబడింది." + +#: ../src/daemon/cmdline.c:115 +#, c-format +msgid "" +"%s [options]\n" +"\n" +"COMMANDS:\n" +" -h, --help Show this help\n" +" --version Show version\n" +" --dump-conf Dump default configuration\n" +" --dump-modules Dump list of available modules\n" +" --dump-resample-methods Dump available resample methods\n" +" --cleanup-shm Cleanup stale shared memory " +"segments\n" +" --start Start the daemon if it is not " +"running\n" +" -k --kill Kill a running daemon\n" +" --check Check for a running daemon (only " +"returns exit code)\n" +"\n" +"OPTIONS:\n" +" --system[=BOOL] Run as system-wide instance\n" +" -D, --daemonize[=BOOL] Daemonize after startup\n" +" --fail[=BOOL] Quit when startup fails\n" +" --high-priority[=BOOL] Try to set high nice level\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_NICE)\n" +" --realtime[=BOOL] Try to enable realtime scheduling\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_RTPRIO)\n" +" --disallow-module-loading[=BOOL] Disallow module user requested " +"module\n" +" loading/unloading after startup\n" +" --disallow-exit[=BOOL] Disallow user requested exit\n" +" --exit-idle-time=SECS Terminate the daemon when idle and " +"this\n" +" time passed\n" +" --module-idle-time=SECS Unload autoloaded modules when idle " +"and\n" +" this time passed\n" +" --scache-idle-time=SECS Unload autoloaded samples when idle " +"and\n" +" this time passed\n" +" --log-level[=LEVEL] Increase or set verbosity level\n" +" -v Increase the verbosity level\n" +" --log-target={auto,syslog,stderr} Specify the log target\n" +" --log-meta[=BOOL] Include code location in log " +"messages\n" +" --log-time[=BOOL] Include timestamps in log messages\n" +" --log-backtrace=FRAMES Include a backtrace in log messages\n" +" -p, --dl-search-path=PATH Set the search path for dynamic " +"shared\n" +" objects (plugins)\n" +" --resample-method=METHOD Use the specified resampling method\n" +" (See --dump-resample-methods for\n" +" possible values)\n" +" --use-pid-file[=BOOL] Create a PID file\n" +" --no-cpu-limit[=BOOL] Do not install CPU load limiter on\n" +" platforms that support it.\n" +" --disable-shm[=BOOL] Disable shared memory support.\n" +"\n" +"STARTUP SCRIPT:\n" +" -L, --load=\"MODULE ARGUMENTS\" Load the specified plugin module " +"with\n" +" the specified argument\n" +" -F, --file=FILENAME Run the specified script\n" +" -C Open a command line on the running " +"TTY\n" +" after startup\n" +"\n" +" -n Don't load default script file\n" +msgstr "" +"%s [options]\n" +"\n" +"COMMANDS:\n" +" -h, --help Show this help\n" +" --version Show version\n" +" --dump-conf Dump default configuration\n" +" --dump-modules Dump list of available modules\n" +" --dump-resample-methods Dump available resample methods\n" +" --cleanup-shm Cleanup stale shared memory " +"segments\n" +" --start Start the daemon if it is not " +"running\n" +" -k --kill Kill a running daemon\n" +" --check Check for a running daemon (only " +"returns exit code)\n" +"\n" +"OPTIONS:\n" +" --system[=BOOL] Run as system-wide instance\n" +" -D, --daemonize[=BOOL] Daemonize after startup\n" +" --fail[=BOOL] Quit when startup fails\n" +" --high-priority[=BOOL] Try to set high nice level\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_NICE)\n" +" --realtime[=BOOL] Try to enable realtime scheduling\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_RTPRIO)\n" +" --disallow-module-loading[=BOOL] Disallow module user requested " +"module\n" +" loading/unloading after startup\n" +" --disallow-exit[=BOOL] Disallow user requested exit\n" +" --exit-idle-time=SECS Terminate the daemon when idle and " +"this\n" +" time passed\n" +" --module-idle-time=SECS Unload autoloaded modules when idle " +"and\n" +" this time passed\n" +" --scache-idle-time=SECS Unload autoloaded samples when idle " +"and\n" +" this time passed\n" +" --log-level[=LEVEL] Increase or set verbosity level\n" +" -v Increase the verbosity level\n" +" --log-target={auto,syslog,stderr} Specify the log target\n" +" --log-meta[=BOOL] Include code location in log " +"messages\n" +" --log-time[=BOOL] Include timestamps in log messages\n" +" --log-backtrace=FRAMES Include a backtrace in log messages\n" +" -p, --dl-search-path=PATH Set the search path for dynamic " +"shared\n" +" objects (plugins)\n" +" --resample-method=METHOD Use the specified resampling method\n" +" (See --dump-resample-methods for\n" +" possible values)\n" +" --use-pid-file[=BOOL] Create a PID file\n" +" --no-cpu-limit[=BOOL] Do not install CPU load limiter on\n" +" platforms that support it.\n" +" --disable-shm[=BOOL] Disable shared memory support.\n" +"\n" +"STARTUP SCRIPT:\n" +" -L, --load=\"MODULE ARGUMENTS\" Load the specified plugin module " +"with\n" +" the specified argument\n" +" -F, --file=FILENAME Run the specified script\n" +" -C Open a command line on the running " +"TTY\n" +" after startup\n" +"\n" +" -n Don't load default script file\n" + +#: ../src/daemon/cmdline.c:247 +msgid "--daemonize expects boolean argument" +msgstr "--daemonize బూలియన్ ఆర్గుమెంటును కోరుకుంటుంది" + +#: ../src/daemon/cmdline.c:254 +msgid "--fail expects boolean argument" +msgstr "--fail బూలియన్ ఆర్గుమెంటును కోరుకుంటుంది" + +#: ../src/daemon/cmdline.c:264 +msgid "" +"--log-level expects log level argument (either numeric in range 0..4 or one " +"of debug, info, notice, warn, error)." +msgstr "" +"--log-level లాగ్ స్థాయి ఆర్గుమెంట్‌ను కోరుకుంటోంది (సహజసంఖ్యను 0..4 విస్తృతిలో కాని లేదా డీబగ్‌, " +"సమాచారము, నోటీసు, హెచ్చరిక, దోషము వీటిలో వొకటికాని)." + +#: ../src/daemon/cmdline.c:276 +msgid "--high-priority expects boolean argument" +msgstr "--high-priority బూలియన్ ఆర్గుమెంటును కోరుకుంటుంది" + +#: ../src/daemon/cmdline.c:283 +msgid "--realtime expects boolean argument" +msgstr "--realtime బూలియన్ ఆర్గుమెంటును కోరుకుంటుంది" + +#: ../src/daemon/cmdline.c:290 +msgid "--disallow-module-loading expects boolean argument" +msgstr "--disallow-module-loading బూలియన్ ఆర్గుమెంటును కోరుకుంటుంది" + +#: ../src/daemon/cmdline.c:297 +msgid "--disallow-exit expects boolean argument" +msgstr "--disallow-exit బూలియన్ ఆర్గుమెంటును కోరుకుంటుంది" + +#: ../src/daemon/cmdline.c:304 +msgid "--use-pid-file expects boolean argument" +msgstr "--use-pid-file బూలియన్ ఆర్గుమెంటును కోరుకుంటుంది" + +#: ../src/daemon/cmdline.c:321 +msgid "Invalid log target: use either 'syslog', 'stderr' or 'auto'." +msgstr "చెల్లని లాగ్ టార్గెట్: 'syslog', 'stderr' లేదా 'auto' వుపయోగించుము." + +#: ../src/daemon/cmdline.c:328 +msgid "--log-time expects boolean argument" +msgstr "--log-time బూలియన్ ఆర్గుమెంటును కోరుకుంటుంది" + +#: ../src/daemon/cmdline.c:335 +msgid "--log-meta expects boolean argument" +msgstr "--log-meta బూలియన్ ఆర్గుమెంటును కోరుకుంటుంది" + +#: ../src/daemon/cmdline.c:354 +#, c-format +msgid "Invalid resample method '%s'." +msgstr "చెల్లని పునఃవుదాహరణ పద్దతి '%s'." + +#: ../src/daemon/cmdline.c:361 +msgid "--system expects boolean argument" +msgstr "--system బూలియన్ ఆర్గుమెంటును కోరుకుంటుంది" + +#: ../src/daemon/cmdline.c:368 +msgid "--no-cpu-limit expects boolean argument" +msgstr "--no-cpu-limit బూలియన్ ఆర్గుమెంటును కోరుకుంటుంది" + +#: ../src/daemon/cmdline.c:375 +msgid "--disable-shm expects boolean argument" +msgstr "--disable-shm బూలియన్ ఆర్గుమెంటును కోరుకుంటుంది" + +#: ../src/daemon/dumpmodules.c:60 +#, c-format +msgid "Name: %s\n" +msgstr "నామము: %s\n" + +#: ../src/daemon/dumpmodules.c:63 +#, c-format +msgid "No module information available\n" +msgstr "ఎటువంటి మాడ్యూల్ సమాచారము అందుబాటులోలేదు\n" + +#: ../src/daemon/dumpmodules.c:66 +#, c-format +msgid "Version: %s\n" +msgstr "వర్షన్: %s\n" + +#: ../src/daemon/dumpmodules.c:68 +#, c-format +msgid "Description: %s\n" +msgstr "వివరణ: %s\n" + +#: ../src/daemon/dumpmodules.c:70 +#, c-format +msgid "Author: %s\n" +msgstr "మూలకర్త: %s\n" + +#: ../src/daemon/dumpmodules.c:72 +#, c-format +msgid "Usage: %s\n" +msgstr "వాడుక: %s\n" + +#: ../src/daemon/dumpmodules.c:73 +#, c-format +msgid "Load Once: %s\n" +msgstr "ఒకసారి లోడుచేయుము: %s\n" + +#: ../src/daemon/dumpmodules.c:75 +#, c-format +msgid "DEPRECATION WARNING: %s\n" +msgstr "తీసివేత హెచ్చరిక: %s\n" + +#: ../src/daemon/dumpmodules.c:79 +#, c-format +msgid "Path: %s\n" +msgstr "పాత్: %s\n" + +#: ../src/daemon/daemon-conf.c:232 +#, c-format +msgid "[%s:%u] Invalid log target '%s'." +msgstr "[%s:%u] చెల్లని లాగ్ లక్ష్యము '%s'." + +#: ../src/daemon/daemon-conf.c:248 +#, c-format +msgid "[%s:%u] Invalid log level '%s'." +msgstr "[%s:%u] చెల్లని లాగ్ స్థాయి '%s'." + +#: ../src/daemon/daemon-conf.c:264 +#, c-format +msgid "[%s:%u] Invalid resample method '%s'." +msgstr "[%s:%u] చెల్లని పునఃవుదాహరణ పద్దతి '%s'." + +#: ../src/daemon/daemon-conf.c:287 +#, c-format +msgid "[%s:%u] Invalid rlimit '%s'." +msgstr "[%s:%u] చెల్లని rlimit '%s'." + +#: ../src/daemon/daemon-conf.c:294 +#, c-format +msgid "[%s:%u] rlimit not supported on this platform." +msgstr "[%s:%u] rlimit అనునది ఈ ప్లాట్‌ఫాం నందు మద్దతివ్వబడదు." + +#: ../src/daemon/daemon-conf.c:310 +#, c-format +msgid "[%s:%u] Invalid sample format '%s'." +msgstr "[%s:%u] చెల్లని మాదిరి ఫార్మాట్ '%s'." + +#: ../src/daemon/daemon-conf.c:328 +#, c-format +msgid "[%s:%u] Invalid sample rate '%s'." +msgstr "[%s:%u] చెల్లని మాదిరి రేటు '%s'." + +#: ../src/daemon/daemon-conf.c:352 +#, c-format +msgid "[%s:%u] Invalid sample channels '%s'." +msgstr "[%s:%u] చెల్లని మాదిరి చానళ్ళు '%s'." + +#: ../src/daemon/daemon-conf.c:370 +#, c-format +msgid "[%s:%u] Invalid channel map '%s'." +msgstr "[%s:%u] చెల్లని ఛానల్ మాప్ '%s'." + +#: ../src/daemon/daemon-conf.c:388 +#, c-format +msgid "[%s:%u] Invalid number of fragments '%s'." +msgstr "[%s:%u] చెల్లని ముక్కలు సంఖ్య '%s'." + +#: ../src/daemon/daemon-conf.c:406 +#, c-format +msgid "[%s:%u] Invalid fragment size '%s'." +msgstr "[%s:%u] చెల్లని ముక్క పరిమాణము '%s'." + +#: ../src/daemon/daemon-conf.c:424 +#, c-format +msgid "[%s:%u] Invalid nice level '%s'." +msgstr "[%s:%u] చెల్లని సాదా స్థాయి '%s'." + +#: ../src/daemon/daemon-conf.c:546 +#, c-format +msgid "Failed to open configuration file: %s" +msgstr "ఆకృతీకరణ దస్త్రమును తెరుచుటకు విఫలమైంది: %s" + +#: ../src/daemon/daemon-conf.c:562 +msgid "" +"The specified default channel map has a different number of channels than " +"the specified default number of channels." +msgstr "" +"తెలుపబడిన అప్రమేయ ప్రాసారమార్గం మాప్ తెలుపబడిన అప్రమేయ ప్రసారమార్గముల కన్నా విభిన్న ప్రసారమార్గముల " +"సంఖ్యను కలిగివుంది." + +#: ../src/daemon/daemon-conf.c:638 +#, c-format +msgid "### Read from configuration file: %s ###\n" +msgstr "### ఆకృతీకరణ దస్త్రమునుండి చదువుము: %s ###\n" + +#: ../src/daemon/caps.c:62 +msgid "Cleaning up privileges." +msgstr "అనుమతులను శుభ్రపరచుచున్నది." + +#: ../src/daemon/pulseaudio.desktop.in.h:1 +msgid "PulseAudio Sound System" +msgstr "PulseAudio శబ్దపు సిస్టమ్" + +#: ../src/daemon/pulseaudio.desktop.in.h:2 +msgid "Start the PulseAudio Sound System" +msgstr "PulseAudio శబ్దపు సిస్టమ్‌ను ప్రారంభించుము" + +#: ../src/pulse/channelmap.c:105 ../src/pulse/channelmap.c:757 +msgid "Mono" +msgstr "మోనో" + +#: ../src/pulse/channelmap.c:107 +msgid "Front Center" +msgstr "ముందు మధ్యన" + +#: ../src/pulse/channelmap.c:108 +msgid "Front Left" +msgstr "ముందు ఎడమవైపు" + +#: ../src/pulse/channelmap.c:109 +msgid "Front Right" +msgstr "ముందు కుడివైపు" + +#: ../src/pulse/channelmap.c:111 +msgid "Rear Center" +msgstr "వెనుక మధ్యన" + +#: ../src/pulse/channelmap.c:112 +msgid "Rear Left" +msgstr "వెనుక ఎడమవైపు" + +#: ../src/pulse/channelmap.c:113 +msgid "Rear Right" +msgstr "వెనుక కుడివైపు" + +#: ../src/pulse/channelmap.c:115 +msgid "Low Frequency Emmiter" +msgstr "తక్కువ తరచుదనం వెలువరించునది" + +#: ../src/pulse/channelmap.c:117 +msgid "Front Left-of-center" +msgstr "ముందు ఎడమ-మధ్య" + +#: ../src/pulse/channelmap.c:118 +msgid "Front Right-of-center" +msgstr "ముందు కుడి-మధ్య" + +#: ../src/pulse/channelmap.c:120 +msgid "Side Left" +msgstr "ఎడమ ప్రక్క" + +#: ../src/pulse/channelmap.c:121 +msgid "Side Right" +msgstr "కుడి ప్రక్క" + +#: ../src/pulse/channelmap.c:123 +msgid "Auxiliary 0" +msgstr "ఆక్సిలరి 0" + +#: ../src/pulse/channelmap.c:124 +msgid "Auxiliary 1" +msgstr "ఆక్సిలరి 1" + +#: ../src/pulse/channelmap.c:125 +msgid "Auxiliary 2" +msgstr "ఆక్సిలరి 2" + +#: ../src/pulse/channelmap.c:126 +msgid "Auxiliary 3" +msgstr "ఆక్సిలరి 3" + +#: ../src/pulse/channelmap.c:127 +msgid "Auxiliary 4" +msgstr "ఆక్సిలరి 4" + +#: ../src/pulse/channelmap.c:128 +msgid "Auxiliary 5" +msgstr "ఆక్సిలరి 5" + +#: ../src/pulse/channelmap.c:129 +msgid "Auxiliary 6" +msgstr "ఆక్సిలరి 6" + +#: ../src/pulse/channelmap.c:130 +msgid "Auxiliary 7" +msgstr "ఆక్సిలరి 7" + +#: ../src/pulse/channelmap.c:131 +msgid "Auxiliary 8" +msgstr "ఆక్సిలరి 8" + +#: ../src/pulse/channelmap.c:132 +msgid "Auxiliary 9" +msgstr "ఆక్సిలరి 9" + +#: ../src/pulse/channelmap.c:133 +msgid "Auxiliary 10" +msgstr "ఆక్సిలరి 10" + +#: ../src/pulse/channelmap.c:134 +msgid "Auxiliary 11" +msgstr "ఆక్సిలరి 11" + +#: ../src/pulse/channelmap.c:135 +msgid "Auxiliary 12" +msgstr "ఆక్సిలరి 12" + +#: ../src/pulse/channelmap.c:136 +msgid "Auxiliary 13" +msgstr "ఆక్సిలరి 13" + +#: ../src/pulse/channelmap.c:137 +msgid "Auxiliary 14" +msgstr "ఆక్సిలరి 14" + +#: ../src/pulse/channelmap.c:138 +msgid "Auxiliary 15" +msgstr "ఆక్సిలరి 15" + +#: ../src/pulse/channelmap.c:139 +msgid "Auxiliary 16" +msgstr "ఆక్సిలరి 16" + +#: ../src/pulse/channelmap.c:140 +msgid "Auxiliary 17" +msgstr "ఆక్సిలరి 17" + +#: ../src/pulse/channelmap.c:141 +msgid "Auxiliary 18" +msgstr "ఆక్సిలరి 18" + +#: ../src/pulse/channelmap.c:142 +msgid "Auxiliary 19" +msgstr "ఆక్సిలరి 19" + +#: ../src/pulse/channelmap.c:143 +msgid "Auxiliary 20" +msgstr "ఆక్సిలరి 20" + +#: ../src/pulse/channelmap.c:144 +msgid "Auxiliary 21" +msgstr "ఆక్సిలరి 21" + +#: ../src/pulse/channelmap.c:145 +msgid "Auxiliary 22" +msgstr "ఆక్సిలరి 22" + +#: ../src/pulse/channelmap.c:146 +msgid "Auxiliary 23" +msgstr "ఆక్సిలరి 23" + +#: ../src/pulse/channelmap.c:147 +msgid "Auxiliary 24" +msgstr "ఆక్సిలరి 24" + +#: ../src/pulse/channelmap.c:148 +msgid "Auxiliary 25" +msgstr "ఆక్సిలరి 25" + +#: ../src/pulse/channelmap.c:149 +msgid "Auxiliary 26" +msgstr "ఆక్సిలరి 26" + +#: ../src/pulse/channelmap.c:150 +msgid "Auxiliary 27" +msgstr "ఆక్సిలరి 27" + +#: ../src/pulse/channelmap.c:151 +msgid "Auxiliary 28" +msgstr "ఆక్సిలరి 28" + +#: ../src/pulse/channelmap.c:152 +msgid "Auxiliary 29" +msgstr "ఆక్సిలరి 29" + +#: ../src/pulse/channelmap.c:153 +msgid "Auxiliary 30" +msgstr "ఆక్సిలరి 30" + +#: ../src/pulse/channelmap.c:154 +msgid "Auxiliary 31" +msgstr "ఆక్సిలరి 31" + +#: ../src/pulse/channelmap.c:156 +msgid "Top Center" +msgstr "పై మధ్యన" + +#: ../src/pulse/channelmap.c:158 +msgid "Top Front Center" +msgstr "పైన ముందు మధ్యన" + +#: ../src/pulse/channelmap.c:159 +msgid "Top Front Left" +msgstr "పైన ముందు ఎడమవైపు" + +#: ../src/pulse/channelmap.c:160 +msgid "Top Front Right" +msgstr "పైన ముందు కుడివైపు" + +#: ../src/pulse/channelmap.c:162 +msgid "Top Rear Center" +msgstr "పైన వెనుక మధ్యన" + +#: ../src/pulse/channelmap.c:163 +msgid "Top Rear Left" +msgstr "పైన వెనుక ఎడమవైపు" + +#: ../src/pulse/channelmap.c:164 +msgid "Top Rear Right" +msgstr "పైన వెనుక కుడివైపున" + +#: ../src/pulse/channelmap.c:484 ../src/pulse/sample.c:170 +#: ../src/pulse/volume.c:295 ../src/pulse/volume.c:321 +#: ../src/pulse/volume.c:341 ../src/pulse/volume.c:371 +msgid "(invalid)" +msgstr "(చెల్లని)" + +#: ../src/pulse/channelmap.c:761 +msgid "Stereo" +msgstr "స్టీరియో" + +#: ../src/pulse/channelmap.c:766 +msgid "Surround 4.0" +msgstr "సరౌండ్ 4.0" + +#: ../src/pulse/channelmap.c:772 +msgid "Surround 4.1" +msgstr "సరౌండ్ 4.1" + +#: ../src/pulse/channelmap.c:778 +msgid "Surround 5.0" +msgstr "సరౌండ్ 5.0" + +#: ../src/pulse/channelmap.c:784 +msgid "Surround 5.1" +msgstr "సరౌండ్ 5.1" + +#: ../src/pulse/channelmap.c:791 +msgid "Surround 7.1" +msgstr "సరౌండ్ 7.1" + +#: ../src/pulse/error.c:43 +msgid "OK" +msgstr "సరే" + +#: ../src/pulse/error.c:44 +msgid "Access denied" +msgstr "సాంగత్యం తిరస్కరించబడినది" + +#: ../src/pulse/error.c:45 +msgid "Unknown command" +msgstr "తెలియని ఆదేశము" + +#: ../src/pulse/error.c:46 +msgid "Invalid argument" +msgstr "నిస్సారమైన క్రమానుగత సంకేతం" + +#: ../src/pulse/error.c:47 +msgid "Entity exists" +msgstr "ఎంటిటి నిష్క్రమించినది" + +#: ../src/pulse/error.c:48 +msgid "No such entity" +msgstr "అటువంటి యెంటిటి లేదు" + +#: ../src/pulse/error.c:49 +msgid "Connection refused" +msgstr "కనెక్షన్ తిరస్కరించబడింది" + +#: ../src/pulse/error.c:50 +msgid "Protocol error" +msgstr "నియమం దోషం" + +#: ../src/pulse/error.c:51 +msgid "Timeout" +msgstr "సమయంముగిసింది" + +#: ../src/pulse/error.c:52 +msgid "No authorization key" +msgstr "ఎటువంటి ధృవీకృత కీ లేదు" + +#: ../src/pulse/error.c:53 +msgid "Internal error" +msgstr "అంతర్గత దోషము" + +#: ../src/pulse/error.c:54 +msgid "Connection terminated" +msgstr "అనుసంధానము అంతముచేయబడింది" + +#: ../src/pulse/error.c:55 +msgid "Entity killed" +msgstr "ఎంటిటి నాశనంచేయబడింది" + +#: ../src/pulse/error.c:56 +msgid "Invalid server" +msgstr "చెల్లని సేవిక" + +#: ../src/pulse/error.c:57 +msgid "Module initalization failed" +msgstr "మాడ్యూల్ సిద్దీకరణ విఫలమైంది" + +#: ../src/pulse/error.c:58 +msgid "Bad state" +msgstr "చెడ్డ స్థితి" + +#: ../src/pulse/error.c:59 +msgid "No data" +msgstr "దత్తాంశం లేదు" + +#: ../src/pulse/error.c:60 +msgid "Incompatible protocol version" +msgstr "సారూప్యతలేని ప్రోటోకాల్ వర్షన్" + +#: ../src/pulse/error.c:61 +msgid "Too large" +msgstr "మరీ పెద్దది" + +#: ../src/pulse/error.c:62 +msgid "Not supported" +msgstr "మద్దతీయబడదు" + +#: ../src/pulse/error.c:63 +msgid "Unknown error code" +msgstr "తెలియని దోషము కోడ్" + +#: ../src/pulse/error.c:64 +msgid "No such extension" +msgstr "అటువంటి పొడిగింపు లేదు" + +#: ../src/pulse/error.c:65 +msgid "Obsolete functionality" +msgstr "పనితీరు తీసివేయి" + +#: ../src/pulse/error.c:66 +msgid "Missing implementation" +msgstr "తప్పిపోయిన యింప్లిమెంటేషన్" + +#: ../src/pulse/error.c:67 +msgid "Client forked" +msgstr "కక్షిదారి పోర్క్ చేసిన" + +#: ../src/pulse/error.c:68 +msgid "Input/Output error" +msgstr "ఇన్పుట్/అవుట్పుట్ దోషము" + +#: ../src/pulse/error.c:69 +msgid "Device or resource busy" +msgstr "పరికరము లేదా వనరు రద్దీగావుంది" + +#: ../src/pulse/sample.c:172 +#, c-format +msgid "%s %uch %uHz" +msgstr "%s %uch %uHz" + +#: ../src/pulse/sample.c:184 +#, c-format +msgid "%0.1f GiB" +msgstr "%0.1f GiB" + +#: ../src/pulse/sample.c:186 +#, c-format +msgid "%0.1f MiB" +msgstr "%0.1f MiB" + +#: ../src/pulse/sample.c:188 +#, c-format +msgid "%0.1f KiB" +msgstr "%0.1f KiB" + +#: ../src/pulse/sample.c:190 +#, c-format +msgid "%u B" +msgstr "%u B" + +#: ../src/pulse/client-conf-x11.c:55 ../src/utils/pax11publish.c:100 +msgid "XOpenDisplay() failed" +msgstr "XOpenDisplay() విఫలమైంది" + +#: ../src/pulse/client-conf-x11.c:93 +msgid "Failed to parse cookie data" +msgstr "కుకీ డాటా పార్శ్ చేయుటకు విఫలమైంది" + +#: ../src/pulse/client-conf.c:111 +#, c-format +msgid "Failed to open configuration file '%s': %s" +msgstr "ఆకృతీకరణ దస్త్రము '%s' తెరువుటకు విఫలమైంది: %s" + +#: ../src/pulse/context.c:550 +msgid "No cookie loaded. Attempting to connect without." +msgstr "ఏ కుకీ లోడవలేదు. లేకుండా అనుసంధానమగుటకు ప్రయత్నిస్తోంది." + +#: ../src/pulse/context.c:693 +#, c-format +msgid "fork(): %s" +msgstr "fork(): %s" + +#: ../src/pulse/context.c:748 +#, c-format +msgid "waitpid(): %s" +msgstr "waitpid(): %s" + +#: ../src/pulse/context.c:1438 +#, c-format +msgid "Received message for unknown extension '%s'" +msgstr "తెలియని పొడిగింపు కొరకు సందేశము స్వీకరించింది '%s'" + +#: ../src/utils/pacat.c:108 +#, c-format +msgid "Failed to drain stream: %s" +msgstr "స్ట్రీమ్‌ను డ్రైయిన్ చేయుటకు విఫలమైంది: %s" + +#: ../src/utils/pacat.c:113 +msgid "Playback stream drained." +msgstr "ప్లేబ్యాక్ స్ట్రీమ్ డ్రెయిన్ అయినది." + +#: ../src/utils/pacat.c:123 +msgid "Draining connection to server." +msgstr "సేవికకు అనుసంధానమును ఎండగట్టుచున్నది." + +#: ../src/utils/pacat.c:136 +#, c-format +msgid "pa_stream_drain(): %s" +msgstr "pa_stream_drain(): %s" + +#: ../src/utils/pacat.c:159 +#, c-format +msgid "pa_stream_write() failed: %s" +msgstr "pa_stream_write() విఫలమైంది: %s" + +#: ../src/utils/pacat.c:197 +#, c-format +msgid "pa_stream_begin_write() failed: %s" +msgstr "pa_stream_begin_write() విఫలమైంది: %s" + +#: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267 +#, c-format +msgid "pa_stream_peek() failed: %s" +msgstr "pa_stream_peek() విఫలమైంది: %s" + +#: ../src/utils/pacat.c:307 +msgid "Stream successfully created." +msgstr "స్ట్రీమ్ సమర్ధవంతంగా సృష్టించబడింది." + +#: ../src/utils/pacat.c:310 +#, c-format +msgid "pa_stream_get_buffer_attr() failed: %s" +msgstr "pa_stream_get_buffer_attr() విఫలమైంది: %s" + +#: ../src/utils/pacat.c:314 +#, c-format +msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u" +msgstr "బఫర్ ప్రమాణాలు: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u" + +#: ../src/utils/pacat.c:317 +#, c-format +msgid "Buffer metrics: maxlength=%u, fragsize=%u" +msgstr "బఫర్ ప్రమాణాలు: maxlength=%u, fragsize=%u" + +#: ../src/utils/pacat.c:321 +#, c-format +msgid "Using sample spec '%s', channel map '%s'." +msgstr "సాదారణ విశదీకరణ(స్పెక్) '%s' వుపయోగిస్తోంది, ప్రసారమార్గం మాప్ '%s'." + +#: ../src/utils/pacat.c:325 +#, c-format +msgid "Connected to device %s (%u, %ssuspended)." +msgstr "పరికరము %s (%u, %ssuspended) కు అనుసంధానించబడింది." + +#: ../src/utils/pacat.c:335 +#, c-format +msgid "Stream error: %s" +msgstr "స్ట్రీమ్ దోషము: %s" + +#: ../src/utils/pacat.c:345 +#, c-format +msgid "Stream device suspended.%s" +msgstr "స్ట్రీమ్ పరికరము అర్దాంతరముగా నిలిపివేయబడింది.%s" + +#: ../src/utils/pacat.c:347 +#, c-format +msgid "Stream device resumed.%s" +msgstr "స్ట్రీమ్ పరికరము తిరిగికొనసాగించబడింది.%s" + +#: ../src/utils/pacat.c:355 +#, c-format +msgid "Stream underrun.%s" +msgstr "స్ట్రీమ్ తక్కువగానడుచుచున్నది.%s" + +#: ../src/utils/pacat.c:362 +#, c-format +msgid "Stream overrun.%s" +msgstr "స్ట్రీమ్ మించినడుచుచున్నది.%s" + +#: ../src/utils/pacat.c:369 +#, c-format +msgid "Stream started.%s" +msgstr "స్ట్రీమ్ ప్రారంభమైంది.%s" + +#: ../src/utils/pacat.c:376 +#, c-format +msgid "Stream moved to device %s (%u, %ssuspended).%s" +msgstr "స్ట్రీమ్ పరికరము %s (%u, %ssuspended) కు కదుపబడింది.%s" + +#: ../src/utils/pacat.c:376 +msgid "not " +msgstr "కాదు " + +#: ../src/utils/pacat.c:383 +#, c-format +msgid "Stream buffer attributes changed.%s" +msgstr "స్ట్రీమ్ బఫర్ యాట్రిబ్యూట్లు మార్చబడినవి.%s" + +#: ../src/utils/pacat.c:415 +#, c-format +msgid "Connection established.%s" +msgstr "అనుసంధానము ఏర్పడినది.%s" + +#: ../src/utils/pacat.c:418 +#, c-format +msgid "pa_stream_new() failed: %s" +msgstr "pa_stream_new() విఫలమైంది: %s" + +#: ../src/utils/pacat.c:450 +#, c-format +msgid "pa_stream_connect_playback() failed: %s" +msgstr "pa_stream_connect_playback() విఫలమైంది: %s" + +#: ../src/utils/pacat.c:456 +#, c-format +msgid "pa_stream_connect_record() failed: %s" +msgstr "pa_stream_connect_record() విఫలమైంది: %s" + +#: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857 +#, c-format +msgid "Connection failure: %s" +msgstr "అనుసంధానము వైఫల్యము: %s" + +#: ../src/utils/pacat.c:503 +msgid "Got EOF." +msgstr "EOF పొందింది." + +#: ../src/utils/pacat.c:540 +#, c-format +msgid "write() failed: %s" +msgstr "write() విఫలమైంది: %s" + +#: ../src/utils/pacat.c:561 +msgid "Got signal, exiting." +msgstr "సంకేతము పొందినది, నిష్క్రమించుచున్నది." + +#: ../src/utils/pacat.c:575 +#, c-format +msgid "Failed to get latency: %s" +msgstr "లేటెన్సీని పొందుటలో విఫలమైంది: %s" + +#: ../src/utils/pacat.c:580 +#, c-format +msgid "Time: %0.3f sec; Latency: %0.0f usec." +msgstr "సమయం: %0.3f సెకను; లెటెన్సీ: %0.0f usec." + +#: ../src/utils/pacat.c:599 +#, c-format +msgid "pa_stream_update_timing_info() failed: %s" +msgstr "pa_stream_update_timing_info() విఫలమైంది: %s" + +#: ../src/utils/pacat.c:609 +#, c-format +msgid "" +"%s [options]\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -r, --record Create a connection for recording\n" +" -p, --playback Create a connection for playback\n" +"\n" +" -v, --verbose Enable verbose operations\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -d, --device=DEVICE The name of the sink/source to " +"connect to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" +" --stream-name=NAME How to call this stream on the " +"server\n" +" --volume=VOLUME Specify the initial (linear) volume " +"in range 0...65536\n" +" --rate=SAMPLERATE The sample rate in Hz (defaults to " +"44100)\n" +" --format=SAMPLEFORMAT The sample type, one of s16le, " +"s16be, u8, float32le,\n" +" float32be, ulaw, alaw, s32le, s32be, " +"s24le, s24be,\n" +" s24-32le, s24-32be (defaults to " +"s16ne)\n" +" --channels=CHANNELS The number of channels, 1 for mono, " +"2 for stereo\n" +" (defaults to 2)\n" +" --channel-map=CHANNELMAP Channel map to use instead of the " +"default\n" +" --fix-format Take the sample format from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-rate Take the sampling rate from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-channels Take the number of channels and the " +"channel map\n" +" from the sink the stream is being " +"connected to.\n" +" --no-remix Don't upmix or downmix channels.\n" +" --no-remap Map channels by index instead of " +"name.\n" +" --latency=BYTES Request the specified latency in " +"bytes.\n" +" --process-time=BYTES Request the specified process time " +"per request in bytes.\n" +" --property=PROPERTY=VALUE Set the specified property to the " +"specified value.\n" +" --raw Record/play raw PCM data.\n" +" --file-format=FFORMAT Record/play formatted PCM data.\n" +" --list-file-formats List available file formats.\n" +msgstr "" +"%s [options]\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -r, --record Create a connection for recording\n" +" -p, --playback Create a connection for playback\n" +"\n" +" -v, --verbose Enable verbose operations\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -d, --device=DEVICE The name of the sink/source to " +"connect to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" +" --stream-name=NAME How to call this stream on the " +"server\n" +" --volume=VOLUME Specify the initial (linear) volume " +"in range 0...65536\n" +" --rate=SAMPLERATE The sample rate in Hz (defaults to " +"44100)\n" +" --format=SAMPLEFORMAT The sample type, one of s16le, " +"s16be, u8, float32le,\n" +" float32be, ulaw, alaw, s32le, s32be, " +"s24le, s24be,\n" +" s24-32le, s24-32be (defaults to " +"s16ne)\n" +" --channels=CHANNELS The number of channels, 1 for mono, " +"2 for stereo\n" +" (defaults to 2)\n" +" --channel-map=CHANNELMAP Channel map to use instead of the " +"default\n" +" --fix-format Take the sample format from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-rate Take the sampling rate from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-channels Take the number of channels and the " +"channel map\n" +" from the sink the stream is being " +"connected to.\n" +" --no-remix Don't upmix or downmix channels.\n" +" --no-remap Map channels by index instead of " +"name.\n" +" --latency=BYTES Request the specified latency in " +"bytes.\n" +" --process-time=BYTES Request the specified process time " +"per request in bytes.\n" +" --property=PROPERTY=VALUE Set the specified property to the " +"specified value.\n" +" --raw Record/play raw PCM data.\n" +" --file-format=FFORMAT Record/play formatted PCM data.\n" +" --list-file-formats List available file formats.\n" + +#: ../src/utils/pacat.c:731 +#, c-format +msgid "" +"pacat %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pacat %s\n" +"libpulse తో నిర్వర్తించబడింది %s\n" +"libpulse లింకైనది %s\n" + +#: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953 +#, c-format +msgid "Invalid client name '%s'" +msgstr "చెల్లని కక్షిదారి నామము '%s'" + +#: ../src/utils/pacat.c:779 +#, c-format +msgid "Invalid stream name '%s'" +msgstr "చెల్లని స్ట్రీమ్ నామము '%s'" + +#: ../src/utils/pacat.c:816 +#, c-format +msgid "Invalid channel map '%s'" +msgstr "చెల్లని ప్రసారమార్గ మాప్ '%s'" + +#: ../src/utils/pacat.c:845 +#, c-format +msgid "Invalid latency specification '%s'" +msgstr "చెల్లని లేటెన్సీ విశదీకరణము '%s'" + +#: ../src/utils/pacat.c:852 +#, c-format +msgid "Invalid process time specification '%s'" +msgstr "చెల్లని కార్యక్రమము సమయ విశదీకరణ '%s'" + +#: ../src/utils/pacat.c:864 +#, c-format +msgid "Invalid property '%s'" +msgstr "చెల్లని లక్షణము '%s'" + +#: ../src/utils/pacat.c:881 +#, c-format +msgid "Unknown file format %s." +msgstr "తెలియని ఫైలు ఫార్మాట్ %s." + +#: ../src/utils/pacat.c:900 +msgid "Invalid sample specification" +msgstr "చెల్లనటువంటి మాదిరి విశదీకరణ" + +#: ../src/utils/pacat.c:910 +#, c-format +msgid "open(): %s" +msgstr "open(): %s" + +#: ../src/utils/pacat.c:915 +#, c-format +msgid "dup2(): %s" +msgstr "dup2(): %s" + +#: ../src/utils/pacat.c:922 +msgid "Too many arguments." +msgstr "చాలా యెక్కువ ఆర్గుమెంట్లు." + +#: ../src/utils/pacat.c:933 +msgid "Failed to generate sample specification for file." +msgstr "దస్త్రము కొరకు మాదిరి సమాచారము జనియింపచేయుటలో విఫలమైంది." + +#: ../src/utils/pacat.c:953 +msgid "Failed to open audio file." +msgstr "ఆడియో ఫైలును తెరువుటకు విఫలమైంది." + +#: ../src/utils/pacat.c:959 +msgid "" +"Warning: specified sample specification will be overwritten with " +"specification from file." +msgstr "హెచ్చరిక: తెలుపబడిన మాదిరి విశదీకరణ దస్త్రమునుండి వచ్చు విశదీకరణతో తిరిగివ్రాయబడుతుంది." + +#: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997 +msgid "Failed to determine sample specification from file." +msgstr "దస్త్రమునుండి మాదిరి విశదీకరణను నిర్ధారించుటలో విఫలమైంది." + +#: ../src/utils/pacat.c:971 +msgid "Warning: Failed to determine channel map from file." +msgstr "హెచ్చరిక: దస్త్రమునుండి ప్రసారమార్గ మాప్ నిర్ధారించుటలో విఫలమైంది." + +#: ../src/utils/pacat.c:982 +msgid "Channel map doesn't match sample specification" +msgstr "ప్రసారమార్గ మాప్ మాదిరి విశదీకరణితో సరిపోలుటలేదు" + +#: ../src/utils/pacat.c:993 +msgid "Warning: failed to write channel map to file." +msgstr "హెచ్చరిక: ప్రసారమార్గ మాప్‌ను దస్త్రముకు వ్రాయుటలో విఫలమైంది." + +#: ../src/utils/pacat.c:1008 +#, c-format +msgid "" +"Opening a %s stream with sample specification '%s' and channel map '%s'." +msgstr "%s స్ట్రీమ్‌ను మాదిరి విశదీకరణ '%s' మరియు ప్రసారమార్గ మాప్ '%s'తో తెరుచుచున్నది." + +#: ../src/utils/pacat.c:1009 +msgid "recording" +msgstr "రికార్డింగు" + +#: ../src/utils/pacat.c:1009 +msgid "playback" +msgstr "ప్లేబాక్" + +#: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267 +msgid "pa_mainloop_new() failed." +msgstr "pa_mainloop_new() విఫలమైంది." + +#: ../src/utils/pacat.c:1054 +msgid "io_new() failed." +msgstr "io_new() విఫలమైంది." + +#: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279 +msgid "pa_context_new() failed." +msgstr "pa_context_new() విఫలమైంది." + +#: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285 +#, c-format +msgid "pa_context_connect() failed: %s" +msgstr "pa_context_connect() విఫలమైంది: %s" + +#: ../src/utils/pacat.c:1075 +msgid "pa_context_rttime_new() failed." +msgstr "pa_context_rttime_new() విఫలమైంది." + +#: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290 +msgid "pa_mainloop_run() failed." +msgstr "pa_mainloop_run() విఫలమైంది." + +#: ../src/utils/pasuspender.c:81 +#, c-format +msgid "fork(): %s\n" +msgstr "fork(): %s\n" + +#: ../src/utils/pasuspender.c:92 +#, c-format +msgid "execvp(): %s\n" +msgstr "execvp(): %s\n" + +#: ../src/utils/pasuspender.c:109 +#, c-format +msgid "Failure to suspend: %s\n" +msgstr "అర్ధాంతరనిలుపుదల వైఫల్యం: %s\n" + +#: ../src/utils/pasuspender.c:124 +#, c-format +msgid "Failure to resume: %s\n" +msgstr "తిరిగికొనసాగింపు వైఫల్యము: %s\n" + +#: ../src/utils/pasuspender.c:147 +#, c-format +msgid "WARNING: Sound server is not local, not suspending.\n" +msgstr "హెచ్చరిక: శబ్ధపు సేవిక స్థానికం కాదు, అర్ధాంతరనిలుపుదల కావడంలేదు.\n" + +#: ../src/utils/pasuspender.c:159 +#, c-format +msgid "Connection failure: %s\n" +msgstr "అనుసంధానము వైఫల్యము: %s\n" + +#: ../src/utils/pasuspender.c:176 +#, c-format +msgid "Got SIGINT, exiting.\n" +msgstr "SIGINT పొందింది, నిష్క్రమించుచున్నది.\n" + +#: ../src/utils/pasuspender.c:194 +#, c-format +msgid "WARNING: Child process terminated by signal %u\n" +msgstr "హెచ్చరిక: చైల్డు కార్యక్రమము సంకేతము %u ద్వారా అంతముచేయబడింది\n" + +#: ../src/utils/pasuspender.c:212 +#, c-format +msgid "" +"%s [options] ... \n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +"\n" +msgstr "" +"%s [options] ... \n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +"\n" + +#: ../src/utils/pasuspender.c:248 +#, c-format +msgid "" +"pasuspender %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pasuspender %s\n" +"libpulse తో నిర్వర్తించబడింది %s\n" +"libpulse తో నిర్వర్తించబడింది %s\n" + +#: ../src/utils/pasuspender.c:277 +#, c-format +msgid "pa_mainloop_new() failed.\n" +msgstr "pa_mainloop_new() విఫలమైంది.\n" + +#: ../src/utils/pasuspender.c:290 +#, c-format +msgid "pa_context_new() failed.\n" +msgstr "pa_context_new() విఫలమైంది.\n" + +#: ../src/utils/pasuspender.c:298 +#, c-format +msgid "pa_mainloop_run() failed.\n" +msgstr "pa_mainloop_run() విఫలమైంది.\n" + +#: ../src/utils/pactl.c:135 +#, c-format +msgid "Failed to get statistics: %s" +msgstr "గణాంకాలను పొందుటకు విఫలమైంది: %s" + +#: ../src/utils/pactl.c:141 +#, c-format +msgid "Currently in use: %u blocks containing %s bytes total.\n" +msgstr "ప్రస్తుతం వుపయోగంలోవుంది: %u బ్లాక్‌లు %s బైట్లను మొత్తంగా కలిగి వున్నాయి.\n" + +#: ../src/utils/pactl.c:144 +#, c-format +msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n" +msgstr "మొత్తం లైఫ్‌టైములో కేటాయించబడింది: %u బ్లాకులు %s బైట్లను మొత్తంగా కలిగివున్నాయి.\n" + +#: ../src/utils/pactl.c:147 +#, c-format +msgid "Sample cache size: %s\n" +msgstr "మాదిరి క్యాచి పరిమాణము: %s\n" + +#: ../src/utils/pactl.c:156 +#, c-format +msgid "Failed to get server information: %s" +msgstr "సేవిక సమాచారమును పొందుటకు విఫలమైంది: %s" + +#: ../src/utils/pactl.c:164 +#, c-format +msgid "" +"User name: %s\n" +"Host Name: %s\n" +"Server Name: %s\n" +"Server Version: %s\n" +"Default Sample Specification: %s\n" +"Default Channel Map: %s\n" +"Default Sink: %s\n" +"Default Source: %s\n" +"Cookie: %08x\n" +msgstr "" +"వినియోగదారి నామము: %s\n" +"హోస్టు నామము: %s\n" +"సేవిక నామము: %s\n" +"సేవిక వర్షన్: %s\n" +"అప్రమేయ మాదిరి విశదీకరణ: %s\n" +"అప్రమేయ ప్రసారమార్గ మాప్: %s\n" +"అప్రమేయ సింకు: %s\n" +"అప్రమేయ మూలము: %s\n" +"కుకీ: %08x\n" + +#: ../src/utils/pactl.c:205 +#, c-format +msgid "Failed to get sink information: %s" +msgstr "సింక్ సమాచారమును పొందుటకు విఫలమైంది: %s" + +#: ../src/utils/pactl.c:221 +#, c-format +msgid "" +"Sink #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor Source: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"సింక్ #%u\n" +"\tస్థితి: %s\n" +"\tనామము: %s\n" +"\tవివరణ: %s\n" +"\tడ్రైవర్: %s\n" +"\tమాదిరి విశదీకరణ: %s\n" +"\tప్రసారమార్గ మాప్: %s\n" +"\tయజమాని మాడ్యూల్: %u\n" +"\tనిశ్శబ్దము: %s\n" +"\tధ్వని: %s%s%s\n" +"\t సమతుల్యత %0.2f\n" +"\tబేస్ ధ్వని: %s%s%s\n" +"\tమానిటర్ మూలము: %s\n" +"\tక్రియాహీనత: %0.0f usec, ఆకృతీకరించిన %0.0f usec\n" +"\tఫ్లాగ్‌లు: %s%s%s%s%s%s\n" +"\tలక్షణాలు:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360 +#, c-format +msgid "\tPorts:\n" +msgstr "\tపోర్టులు:\n" + +#: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366 +#, c-format +msgid "\tActive Port: %s\n" +msgstr "\tక్రియాశీల పోర్టు: %s\n" + +#: ../src/utils/pactl.c:297 +#, c-format +msgid "Failed to get source information: %s" +msgstr "మూలము సమాచారము పొందుటకు విఫలమైంది: %s" + +#: ../src/utils/pactl.c:313 +#, c-format +msgid "" +"Source #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor of Sink: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"మూలము #%u\n" +"\tస్థితి: %s\n" +"\tనామము: %s\n" +"\tవివరణ: %s\n" +"\tడ్రైవర్: %s\n" +"\tమాదిరి విశదీకరణ: %s\n" +"\tప్రసారమార్గ మాప్: %s\n" +"\tయజమాని మాడ్యూల్: %u\n" +"\tనిశ్శబ్దము: %s\n" +"\tధ్వని: %s%s%s\n" +"\t సమతుల్యత %0.2f\n" +"\tబేస్ ధ్వని: %s%s%s\n" +"\tసింక్ యొక్క మానిటర్: %s\n" +"\tక్రియాహీన: %0.0f usec, ఆకృతీకరించిన %0.0f usec\n" +"\tఫ్లాగ్‌లు: %s%s%s%s%s%s\n" +"\tలక్షణాలు:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:345 ../src/utils/pactl.c:401 ../src/utils/pactl.c:436 +#: ../src/utils/pactl.c:473 ../src/utils/pactl.c:532 ../src/utils/pactl.c:533 +#: ../src/utils/pactl.c:543 ../src/utils/pactl.c:587 ../src/utils/pactl.c:588 +#: ../src/utils/pactl.c:594 ../src/utils/pactl.c:637 ../src/utils/pactl.c:638 +#: ../src/utils/pactl.c:645 +msgid "n/a" +msgstr "వర్తించదు" + +#: ../src/utils/pactl.c:375 +#, c-format +msgid "Failed to get module information: %s" +msgstr "మాడ్యూల్ సమాచారము పొందుటకు విఫలమైంది: %s" + +#: ../src/utils/pactl.c:393 +#, c-format +msgid "" +"Module #%u\n" +"\tName: %s\n" +"\tArgument: %s\n" +"\tUsage counter: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"మాడ్యూల్ #%u\n" +"\tనామము: %s\n" +"\tఆర్గుమెంట్: %s\n" +"\tవినియోగం లెక్కించునది: %s\n" +"\tలక్షణాలు:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:412 +#, c-format +msgid "Failed to get client information: %s" +msgstr "కక్షిదారి సమాచారము పొందుటలో విఫలమైంది: %s" + +#: ../src/utils/pactl.c:430 +#, c-format +msgid "" +"Client #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"కక్షిదారి #%u\n" +"\tడ్రైవర్: %s\n" +"\tయజమాని మాడ్యూల్: %s\n" +"\tలక్షణాలు:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:447 +#, c-format +msgid "Failed to get card information: %s" +msgstr "కార్డు సమాచారము పొందుటకు విఫలమైంది: %s" + +#: ../src/utils/pactl.c:465 +#, c-format +msgid "" +"Card #%u\n" +"\tName: %s\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"కార్డు #%u\n" +"\tనామము: %s\n" +"\tడ్రైవర్: %s\n" +"\tయజమాని మాడ్యూల్: %s\n" +"\tలక్షణాలు:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:479 +#, c-format +msgid "\tProfiles:\n" +msgstr "\tప్రోఫైల్సు:\n" + +#: ../src/utils/pactl.c:485 +#, c-format +msgid "\tActive Profile: %s\n" +msgstr "\tక్రియాశీల ప్రొఫైల్: %s\n" + +#: ../src/utils/pactl.c:496 +#, c-format +msgid "Failed to get sink input information: %s" +msgstr "సింక్ ఇన్పుట్ సమాచారము పొందుటకు విఫలమైంది: %s" + +#: ../src/utils/pactl.c:515 +#, c-format +msgid "" +"Sink Input #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSink: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tMute: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSink Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"సింక్ ఇన్పుట్ #%u\n" +"\tడ్రైవర్: %s\n" +"\tయజమాని మాడ్యూల్: %s\n" +"\tకక్షిదారి: %s\n" +"\tసింక్: %u\n" +"\tమాదిరి విశదీకరణము: %s\n" +"\tప్రసారమార్గ మాప్: %s\n" +"\tనిశ్శబ్ధము: %s\n" +"\tవాల్యూమ్: %s\n" +"\t %s\n" +"\t సమతుల్యత %0.2f\n" +"\tబఫర్ క్రియాహీనత: %0.0f usec\n" +"\tసింక్ క్రియాహీనత: %0.0f usec\n" +"\tపునఃవుదాహరణ పద్దతి: %s\n" +"\tలక్షణాలు:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:554 +#, c-format +msgid "Failed to get source output information: %s" +msgstr "మూలపు అవుట్పుట్ సమాచారము పొందుటకు విఫలమైంది: %s" + +#: ../src/utils/pactl.c:574 +#, c-format +msgid "" +"Source Output #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSource: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSource Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"మూలము అవుట్పుట్ #%u\n" +"\tడ్రైవర్: %s\n" +"\tయజమాని మాడ్యూల్: %s\n" +"\tకక్షిదారి: %s\n" +"\tమూలము: %u\n" +"\tమాదిరి విశదీకరణ: %s\n" +"\tప్రసారమార్గ మాప్: %s\n" +"\tబఫర్ క్రియాహీనత: %0.0f usec\n" +"\tమూలము క్రియాహీనత: %0.0f usec\n" +"\tపునఃవుదాహరణ విశదీకరణ: %s\n" +"\tలక్షణాలు:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:605 +#, c-format +msgid "Failed to get sample information: %s" +msgstr "మాదిరి సమాచారము పొందుటకు విఫలమైంది: %s" + +#: ../src/utils/pactl.c:623 +#, c-format +msgid "" +"Sample #%u\n" +"\tName: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tDuration: %0.1fs\n" +"\tSize: %s\n" +"\tLazy: %s\n" +"\tFilename: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"మాదిరి #%u\n" +"\tనామము: %s\n" +"\tమాదిరి విశదీకరణ: %s\n" +"\tప్రసారమార్గము మాప్: %s\n" +"\tధ్వని: %s\n" +"\t %s\n" +"\t సమతుల్యత %0.2f\n" +"\tనిడివి: %0.1fs\n" +"\tపరిమాణము: %s\n" +"\tలేటు: %s\n" +"\tదస్త్రనామము: %s\n" +"\tలక్షణాలు:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663 +#, c-format +msgid "Failure: %s" +msgstr "వైఫైల్యము: %s" + +#: ../src/utils/pactl.c:687 +#, c-format +msgid "Failed to upload sample: %s" +msgstr "మాదిరి అప్‌లోడు చేయుటకు విఫలమైంది: %s" + +#: ../src/utils/pactl.c:704 +msgid "Premature end of file" +msgstr "దస్త్రము యొక్క అపరిపక్వ ముగింపు" + +#: ../src/utils/pactl.c:863 +msgid "Got SIGINT, exiting." +msgstr "SIGINT పొందింది, నిష్క్రమించుచున్నది." + +#: ../src/utils/pactl.c:869 +#, c-format +msgid "" +"%s [options] stat\n" +"%s [options] list\n" +"%s [options] exit\n" +"%s [options] upload-sample FILENAME [NAME]\n" +"%s [options] play-sample NAME [SINK]\n" +"%s [options] remove-sample NAME\n" +"%s [options] move-sink-input SINKINPUT SINK\n" +"%s [options] move-source-output SOURCEOUTPUT SOURCE\n" +"%s [options] load-module NAME [ARGS ...]\n" +"%s [options] unload-module MODULE\n" +"%s [options] suspend-sink SINK 1|0\n" +"%s [options] suspend-source SOURCE 1|0\n" +"%s [options] set-card-profile CARD PROFILE\n" +"%s [options] set-sink-port SINK PORT\n" +"%s [options] set-source-port SOURCE PORT\n" +"%s [options] set-sink-volume SINK VOLUME\n" +"%s [options] set-source-volume SOURCE VOLUME\n" +"%s [options] set-sink-input-volume SINKINPUT VOLUME\n" +"%s [options] set-sink-mute SINK 1|0\n" +"%s [options] set-source-mute SOURCE 1|0\n" +"%s [options] set-sink-input-mute SINKINPUT 1|0\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" +msgstr "" +"%s [options] stat\n" +"%s [options] list\n" +"%s [options] exit\n" +"%s [options] upload-sample FILENAME [NAME]\n" +"%s [options] play-sample NAME [SINK]\n" +"%s [options] remove-sample NAME\n" +"%s [options] move-sink-input SINKINPUT SINK\n" +"%s [options] move-source-output SOURCEOUTPUT SOURCE\n" +"%s [options] load-module NAME [ARGS ...]\n" +"%s [options] unload-module MODULE\n" +"%s [options] suspend-sink SINK 1|0\n" +"%s [options] suspend-source SOURCE 1|0\n" +"%s [options] set-card-profile CARD PROFILE\n" +"%s [options] set-sink-port SINK PORT\n" +"%s [options] set-source-port SOURCE PORT\n" +"%s [options] set-sink-volume SINK VOLUME\n" +"%s [options] set-source-volume SOURCE VOLUME\n" +"%s [options] set-sink-input-volume SINKINPUT VOLUME\n" +"%s [options] set-sink-mute SINK 1|0\n" +"%s [options] set-source-mute SOURCE 1|0\n" +"%s [options] set-sink-input-mute SINKINPUT 1|0\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" + +#: ../src/utils/pactl.c:933 +#, c-format +msgid "" +"pactl %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pactl %s\n" +"libpulse తో నిర్వర్తించబడింది%s\n" +"libpulse తో లింకుచేయబడింది %s\n" + +#: ../src/utils/pactl.c:979 +msgid "Please specify a sample file to load" +msgstr "లోడువ్వుటకు దయచేసి మాదిరి దస్త్రమును తెలుపుము" + +#: ../src/utils/pactl.c:992 +msgid "Failed to open sound file." +msgstr "శబ్దపు దస్త్రమును తెరువుటకు విఫలమైంది." + +#: ../src/utils/pactl.c:1004 +msgid "Warning: Failed to determine sample specification from file." +msgstr "హెచ్చరిక: దస్త్రమునుండి మాదిరి విశదీకరణను నిర్ణయించుటకు విఫలమైంది." + +#: ../src/utils/pactl.c:1014 +msgid "You have to specify a sample name to play" +msgstr "ప్లే చేయుటకు మీరు మాదిరి నామమును తెలుపవలసి వుంది" + +#: ../src/utils/pactl.c:1026 +msgid "You have to specify a sample name to remove" +msgstr "తొలగించుటకు మీరు మాదిరి నామమును తెలుపవలసి వుంది" + +#: ../src/utils/pactl.c:1035 +msgid "You have to specify a sink input index and a sink" +msgstr "మీరు సింక్ ఇన్పుట్ విషయసూచిక మరియు సింక్ తెలుపవలసి వుంది" + +#: ../src/utils/pactl.c:1045 +msgid "You have to specify a source output index and a source" +msgstr "మీరు మూలము అవుట్పుట్ విషయసూచిక మరియు మూలము తెలుపవలసి వుంది" + +#: ../src/utils/pactl.c:1060 +msgid "You have to specify a module name and arguments." +msgstr "మీరు మాడ్యూల్ నామము మరియు ఆర్గుమెంట్లు తెలుపవలసి వుంది." + +#: ../src/utils/pactl.c:1080 +msgid "You have to specify a module index" +msgstr "మీరు మాడ్యూల్ విషయసూచిక తెలుపవలసి వుంది" + +#: ../src/utils/pactl.c:1090 +msgid "" +"You may not specify more than one sink. You have to specify a boolean value." +msgstr "" +"మీరు వొక సింకు కన్నా యెక్కువ తెలుపవలసి వుండకపోవచ్చు. మీరు బూలియన్ విలువను తెలుపవలసి వుంది." + +#: ../src/utils/pactl.c:1103 +msgid "" +"You may not specify more than one source. You have to specify a boolean " +"value." +msgstr "" +"మీరు వొక మూలము కన్నా యెక్కువ తెలుపవలసి వుండకపోవచ్చు. మీరు బూలియన్ విలువను తెలుపవలసి వుంది." + +#: ../src/utils/pactl.c:1115 +msgid "You have to specify a card name/index and a profile name" +msgstr "మీరు కార్డ్ నామము/విషయసూచిక మరియు ప్రొఫైల్ నామము తెలుపవలసి వుంది" + +#: ../src/utils/pactl.c:1126 +msgid "You have to specify a sink name/index and a port name" +msgstr "మీరు సింక్‌ నామము/విషయసూచిక మరియు ప్రొఫైల్ నామము తెలుపవలసి వుంది" + +#: ../src/utils/pactl.c:1137 +msgid "You have to specify a source name/index and a port name" +msgstr "మీరు మూలము నామము/విషయసూచిక మరియు ప్రొఫైల్ నామము తెలుపవలసి వుంది" + +#: ../src/utils/pactl.c:1149 +msgid "You have to specify a sink name/index and a volume" +msgstr "మీరు సింక్ నామము/విషయసూచిక మరియు ప్రొఫైల్ నామము తెలుపవలసి వుంది" + +#: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171 +#: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209 +#: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248 +msgid "Invalid volume specification" +msgstr "చెల్లనటువంటి వాల్యూమ్ విశదీకరణ" + +#: ../src/utils/pactl.c:1166 +msgid "You have to specify a source name/index and a volume" +msgstr "మీరు మూలము నామము/విషయసూచిక మరియు ప్రొఫైల్ నామము తెలుపవలసి వుంది" + +#: ../src/utils/pactl.c:1183 +msgid "You have to specify a sink input index and a volume" +msgstr "మీరు సింక్ ఇన్పుట్ విషయసూచిక మరియు వాల్యూమ్ తెలుపవలసి వుంది" + +#: ../src/utils/pactl.c:1188 +msgid "Invalid sink input index" +msgstr "చెల్లని సింకు యిన్పుట్ విషయసూచిక" + +#: ../src/utils/pactl.c:1204 +msgid "You have to specify a sink name/index and a mute boolean" +msgstr "మీరు సింక్‌ నామము/విషయసూచిక మరియు మ్యూట్ బూలియన్ తెలుపవలసి వుంది" + +#: ../src/utils/pactl.c:1221 +msgid "You have to specify a source name/index and a mute boolean" +msgstr "మీరు మూలపు నామము/విషయసూచిక మరియు మ్యూట్ బూలియన్ తెలుపవలసివుంది" + +#: ../src/utils/pactl.c:1238 +msgid "You have to specify a sink input index and a mute boolean" +msgstr "మీరు సింక్ ఇన్పుట్ విషయసూచిక మరియు మ్యూట్ బూలియన్ తెలుపవలసివుంది" + +#: ../src/utils/pactl.c:1243 +msgid "Invalid sink input index specification" +msgstr "చెల్లనటువంటి సింకు యిన్పుట్ విషయసూచిక విశదీకరణ" + +#: ../src/utils/pactl.c:1262 +msgid "No valid command specified." +msgstr "ఎటువంటి విలువైన ఆదేశము తెలుపబడలేదు." + +#: ../src/utils/pax11publish.c:61 +#, c-format +msgid "" +"%s [-D display] [-S server] [-O sink] [-I source] [-c file] [-d|-e|-i|-r]\n" +"\n" +" -d Show current PulseAudio data attached to X11 display (default)\n" +" -e Export local PulseAudio data to X11 display\n" +" -i Import PulseAudio data from X11 display to local environment " +"variables and cookie file.\n" +" -r Remove PulseAudio data from X11 display\n" +msgstr "" +"%s [-D display] [-S server] [-O sink] [-I source] [-c file] [-d|-e|-i|-r]\n" +"\n" +" -d Show current PulseAudio data attached to X11 display (default)\n" +" -e Export local PulseAudio data to X11 display\n" +" -i Import PulseAudio data from X11 display to local environment " +"variables and cookie file.\n" +" -r Remove PulseAudio data from X11 display\n" + +#: ../src/utils/pax11publish.c:94 +#, c-format +msgid "Failed to parse command line.\n" +msgstr "ఆదేశ వరుసను పార్శ్ చేయుటకు విఫలమైంది.\n" + +#: ../src/utils/pax11publish.c:108 +#, c-format +msgid "Server: %s\n" +msgstr "సేవిక: %s\n" + +#: ../src/utils/pax11publish.c:110 +#, c-format +msgid "Source: %s\n" +msgstr "మూలము: %s\n" + +#: ../src/utils/pax11publish.c:112 +#, c-format +msgid "Sink: %s\n" +msgstr "సింక్: %s\n" + +#: ../src/utils/pax11publish.c:114 +#, c-format +msgid "Cookie: %s\n" +msgstr "కుకీ: %s\n" + +#: ../src/utils/pax11publish.c:132 +#, c-format +msgid "Failed to parse cookie data\n" +msgstr "కుకీ డాటా పార్శ్ చేయుటకు విఫలమైంది\n" + +#: ../src/utils/pax11publish.c:137 +#, c-format +msgid "Failed to save cookie data\n" +msgstr "కుకీ డాటా దాయుటకు విఫలమైంది\n" + +#: ../src/utils/pax11publish.c:152 +#, c-format +msgid "Failed to load client configuration file.\n" +msgstr "కక్షిదారి ఆకృతీకరణ దస్త్రమును లోడు చేయుటకు విఫలమైంది.\n" + +#: ../src/utils/pax11publish.c:157 +#, c-format +msgid "Failed to read environment configuration data.\n" +msgstr "ఎన్విరాన్మెంట్ ఆకృతీకరణ డాటాను చదువుటకు విఫలమైంది.\n" + +#: ../src/utils/pax11publish.c:174 +#, c-format +msgid "Failed to get FQDN.\n" +msgstr "FQDN పొందుటకు విఫలమైంది.\n" + +#: ../src/utils/pax11publish.c:194 +#, c-format +msgid "Failed to load cookie data\n" +msgstr "కుకీ డాటా లోడు చేయుటకు విఫలమైంది\n" + +#: ../src/utils/pax11publish.c:211 +#, c-format +msgid "Not yet implemented.\n" +msgstr "ఇంకా యింప్లిమెంట్ చేయలేదు\n" + +#: ../src/utils/pacmd.c:69 +msgid "No PulseAudio daemon running, or not running as session daemon." +msgstr "PulseAudio డెమోన్ నడుచుటలేదు, లేదా సెషన్ డెమోన్ వలె నడుచుటలేదు." + +#: ../src/utils/pacmd.c:74 +#, c-format +msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s" +msgstr "socket(PF_UNIX, SOCK_STREAM, 0): %s" + +#: ../src/utils/pacmd.c:91 +#, c-format +msgid "connect(): %s" +msgstr "connect(): %s" + +#: ../src/utils/pacmd.c:99 +msgid "Failed to kill PulseAudio daemon." +msgstr "PulseAudio డెమోన్ నాశనం చేయుటలో విఫలమైంది." + +#: ../src/utils/pacmd.c:107 +msgid "Daemon not responding." +msgstr "డెమోన్ స్పందించుటలేదు." + +#: ../src/utils/pacmd.c:161 +#, c-format +msgid "poll(): %s" +msgstr "poll(): %s" + +#: ../src/utils/pacmd.c:171 ../src/utils/pacmd.c:188 +#, c-format +msgid "read(): %s" +msgstr "read(): %s" + +#: ../src/utils/pacmd.c:207 ../src/utils/pacmd.c:223 +#, c-format +msgid "write(): %s" +msgstr "write(): %s" + +#: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:219 +msgid "Cannot access autospawn lock." +msgstr "ఆటోస్పాన్ తాళంను యాక్సిస్ చేయలేదు." + +#: ../src/modules/alsa/alsa-sink.c:530 ../src/modules/alsa/alsa-sink.c:689 +#, c-format +msgid "" +"ALSA woke us up to write new data to the device, but there was actually " +"nothing to write!\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers.\n" +"We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() " +"returned 0 or another value < min_avail." +msgstr "" +"ALSA కొత్త డాటాను పరికరముకు వ్రాయుటకు మనలను జాగరూక పరిచింది, అయితే అక్కడ వాస్తవంగా వ్రాయుటకు యేమి " +"లేదు!\n" +"సాదారణం యిది ALSA డ్రైవర్ %s నందు బగ్ కావచ్చును. దయచేసి దీనిని ALSA అభివృద్దికారులకు తెలియపరచండి.\n" +"మనము POLLOUT అమర్పు ద్వారా జాగరూక పరచబడినాము -- ఏమైనప్పటికి snd_pcm_avail() అనునది 0 ను " +"యిస్తుంది లేదా వేరొక విలువ < min_avail యిస్తుంది." + +#: ../src/modules/alsa/alsa-source.c:506 ../src/modules/alsa/alsa-source.c:656 +#, c-format +msgid "" +"ALSA woke us up to read new data from the device, but there was actually " +"nothing to read!\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers.\n" +"We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() " +"returned 0 or another value < min_avail." +msgstr "" +"ALSA కొత్త డాటాను పరికరమునుండి చదువుటకు మనలను జాగరూక పరిచింది, అయితే అక్కడ వాస్తవంగా " +"చదువుటకు యేమి లేదు!\n" +"సాదారణం యిది ALSA డ్రైవర్ %s నందు బగ్ కావచ్చును. దయచేసి దీనిని ALSA అభివృద్దికారులకు తెలియపరచండి.\n" +"మనము POLLOUT అమర్పు ద్వారా జాగరూక పరచబడినాము -- ఏమైనప్పటికి snd_pcm_avail() అనునది 0 ను " +"యిస్తుంది లేదా వేరొక విలువ < min_avail యిస్తుంది." + +#: ../src/modules/alsa/module-alsa-card.c:152 +#: ../src/modules/bluetooth/module-bluetooth-device.c:2228 +#: ../src/modules/alsa/alsa-mixer.c:2931 +msgid "Off" +msgstr "ఆఫ్" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2184 +msgid "High Fidelity Playback (A2DP)" +msgstr "హై ఫెడిలిటి ప్లేబ్యాక్ (A2DP)" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2198 +msgid "High Fidelity Capture (A2DP)" +msgstr "హై ఫెడిలిటి కాప్చర్ (A2DP)" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2213 +msgid "Telephony Duplex (HSP/HFP)" +msgstr "టెలిఫోనీ డూప్లెక్స్ (HSP/HFP)" + +#: ../src/modules/reserve-wrap.c:151 +msgid "PulseAudio Sound Server" +msgstr "పల్స్ ఆడియో సౌండ్ సేవిక" + +#: ../src/modules/module-rygel-media-server.c:569 +#: ../src/modules/module-rygel-media-server.c:583 +msgid "Output Devices" +msgstr "" + +#: ../src/modules/module-rygel-media-server.c:570 +#: ../src/modules/module-rygel-media-server.c:584 +msgid "Input Devices" +msgstr "" + +#: ../src/modules/module-rygel-media-server.c:774 +msgid "Audio on @HOSTNAME@" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1701 +msgid "Input" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1702 +msgid "Docking Station Input" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1703 +msgid "Docking Station Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1704 +msgid "Line-In" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1705 +msgid "Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1706 +msgid "External Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1707 +#, fuzzy +msgid "Internal Microphone" +msgstr "అంతర్గత ఆడియో" + +#: ../src/modules/alsa/alsa-mixer.c:1708 +msgid "Radio" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1709 +msgid "Video" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1710 +msgid "Automatic Gain Control" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1711 +msgid "No Automatic Gain Control" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1712 +msgid "Boost" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1713 +msgid "No Boost" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1714 +msgid "Amplifier" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1715 +msgid "No Amplifier" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1773 +msgid "Analog Input" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1774 +msgid "Analog Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1775 +msgid "Analog Line-In" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1776 +msgid "Analog Radio" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1777 +msgid "Analog Video" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1778 +#, fuzzy +msgid "Analog Output" +msgstr "Null అవుట్పుట్" + +#: ../src/modules/alsa/alsa-mixer.c:1779 +msgid "Analog Headphones" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1780 +msgid "Analog Output (LFE)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1781 +msgid "Analog Mono Output" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1981 +#, fuzzy, c-format +msgid "%s+%s" +msgstr "%s %s" + +#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404 +#, fuzzy, c-format +msgid "%s / %s" +msgstr "%s %s" + +#: ../src/modules/alsa/alsa-mixer.c:2790 +msgid "Analog Mono" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2791 +#, fuzzy +msgid "Analog Stereo" +msgstr "స్టీరియో" + +#: ../src/modules/alsa/alsa-mixer.c:2792 +#, fuzzy +msgid "Analog Surround 2.1" +msgstr "సరౌండ్ 4.1" + +#: ../src/modules/alsa/alsa-mixer.c:2793 +#, fuzzy +msgid "Analog Surround 3.0" +msgstr "సరౌండ్ 4.0" + +#: ../src/modules/alsa/alsa-mixer.c:2794 +#, fuzzy +msgid "Analog Surround 3.1" +msgstr "సరౌండ్ 4.1" + +#: ../src/modules/alsa/alsa-mixer.c:2795 +#, fuzzy +msgid "Analog Surround 4.0" +msgstr "సరౌండ్ 4.0" + +#: ../src/modules/alsa/alsa-mixer.c:2796 +#, fuzzy +msgid "Analog Surround 4.1" +msgstr "సరౌండ్ 4.1" + +#: ../src/modules/alsa/alsa-mixer.c:2797 +#, fuzzy +msgid "Analog Surround 5.0" +msgstr "సరౌండ్ 5.0" + +#: ../src/modules/alsa/alsa-mixer.c:2798 +#, fuzzy +msgid "Analog Surround 5.1" +msgstr "సరౌండ్ 5.1" + +#: ../src/modules/alsa/alsa-mixer.c:2799 +#, fuzzy +msgid "Analog Surround 6.0" +msgstr "సరౌండ్ 4.0" + +#: ../src/modules/alsa/alsa-mixer.c:2800 +#, fuzzy +msgid "Analog Surround 6.1" +msgstr "సరౌండ్ 4.1" + +#: ../src/modules/alsa/alsa-mixer.c:2801 +#, fuzzy +msgid "Analog Surround 7.0" +msgstr "సరౌండ్ 4.0" + +#: ../src/modules/alsa/alsa-mixer.c:2802 +#, fuzzy +msgid "Analog Surround 7.1" +msgstr "సరౌండ్ 7.1" + +#: ../src/modules/alsa/alsa-mixer.c:2803 +msgid "Digital Stereo (IEC958)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2804 +msgid "Digital Surround 4.0 (IEC958)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2805 +msgid "Digital Surround 4.0 (IEC958/AC3)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2806 +msgid "Digital Surround 5.1 (IEC958/AC3)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2807 +msgid "Digital Stereo (HDMI)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2928 +msgid "Analog Mono Duplex" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2929 +msgid "Analog Stereo Duplex" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2930 +msgid "Digital Stereo Duplex (IEC958)" +msgstr "" diff --git a/po/uk.po b/po/uk.po new file mode 100644 index 0000000..aacdf94 --- /dev/null +++ b/po/uk.po @@ -0,0 +1,2598 @@ +# Copyright (C) 2009 Free Software Foundation, Inc. +# This file is distributed under the same license as the pulseaudio.master-tx package. +# +# Yuri Chornoivan , 2009. +msgid "" +msgstr "" +"Project-Id-Version: pulseaudio.master-tx\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-10-03 10:02+0000\n" +"PO-Revision-Date: 2009-10-03 19:28+0300\n" +"Last-Translator: Yuri Chornoivan \n" +"Language-Team: Ukrainian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Lokalize 0.3\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 " +"&& (n%100<10 || n%100>=20) ? 1 : 2);\n" + +#: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629 +#, c-format +msgid "%s %s" +msgstr "%s %s" + +#: ../src/modules/alsa/alsa-util.c:1106 +#, c-format +msgid "" +"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu " +"ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"Функція snd_pcm_avail() повернула винятково велике значення: %lu байтів (%lu " +"мс).\n" +"Ймовірно, ви натрапили на ваду у драйвері ALSA «%s». Будь ласка, повідомте " +"про цю ваду розробникам ALSA." + +#: ../src/modules/alsa/alsa-util.c:1147 +#, c-format +msgid "" +"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%" +"lu ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"Функція snd_pcm_delay() повернула винятково велике значення: %li байтів (%s%" +"lu мс).\n" +"Ймовірно, ви натрапили на ваду у драйвері ALSA «%s». Будь ласка, повідомте " +"про цю ваду розробникам ALSA." + +#: ../src/modules/alsa/alsa-util.c:1194 +#, c-format +msgid "" +"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes " +"(%lu ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"Функція snd_pcm_mmap_begin() повернула винятково велике значення: %lu байтів " +"(%lu мс).\n" +"Ймовірно, ви натрапили на ваду у драйвері ALSA «%s». Будь ласка, повідомте " +"про цю ваду розробникам ALSA." + +#: ../src/modules/module-always-sink.c:39 +msgid "Always keeps at least one sink loaded even if it's a null one" +msgstr "" +"Завжди підтримувати принаймні один завантажений приймач, навіть якщо він " +"буде нульовим" + +#: ../src/modules/module-always-sink.c:83 +msgid "Dummy Output" +msgstr "Тестове відтворення" + +#: ../src/modules/module-ladspa-sink.c:49 +msgid "Virtual LADSPA sink" +msgstr "Віртуальний приймач LADSPA" + +#: ../src/modules/module-ladspa-sink.c:53 +msgid "" +"sink_name= sink_properties= " +"master= format= rate= " +"channels= channel_map= plugin= label= control=" +msgstr "" +"sink_name=<назва приймача> sink_properties=<властивості приймача> " +"master=<назва приймача для фільтрування> format=<формат семплу> " +"rate=<частота вибірки> channels=<кількість каналів> channel_map=<карта " +"каналів> plugin=<назва додатка ladspa> label=<мітка додатка ladspa> " +"control=<розділений комами список значень вхідних параметрів>" + +#: ../src/modules/module-null-sink.c:55 +msgid "Clocked NULL sink" +msgstr "NULL-приймач з годинником" + +#: ../src/modules/module-null-sink.c:291 +msgid "Null Output" +msgstr "Нуль-відтворення" + +#: ../src/pulsecore/sink.c:2613 +msgid "Internal Audio" +msgstr "Вбудоване аудіо" + +#: ../src/pulsecore/sink.c:2618 +msgid "Modem" +msgstr "Модем" + +#: ../src/daemon/ltdl-bind-now.c:124 +msgid "Failed to find original lt_dlopen loader." +msgstr "" +"Спроба знайти початковий інструмент завантаження lt_dlopen зазнала невдачі." + +#: ../src/daemon/ltdl-bind-now.c:129 +msgid "Failed to allocate new dl loader." +msgstr "" +"Спроба виділення пам’яті для нового інструменту завантаження dl зазнала " +"невдачі." + +#: ../src/daemon/ltdl-bind-now.c:142 +msgid "Failed to add bind-now-loader." +msgstr "Не вдалося додати bind-now-loader." + +#: ../src/daemon/main.c:141 +#, c-format +msgid "Got signal %s." +msgstr "Отримано сигнал %s." + +#: ../src/daemon/main.c:168 +msgid "Exiting." +msgstr "Завершення роботи." + +#: ../src/daemon/main.c:186 +#, c-format +msgid "Failed to find user '%s'." +msgstr "Не вдалося знайти користувача «%s»." + +#: ../src/daemon/main.c:191 +#, c-format +msgid "Failed to find group '%s'." +msgstr "Не вдалося знайти групу «%s»." + +#: ../src/daemon/main.c:195 +#, c-format +msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)." +msgstr "Знайдено користувача «%s» (UID %lu) і групу «%s» (GID %lu)." + +#: ../src/daemon/main.c:200 +#, c-format +msgid "GID of user '%s' and of group '%s' don't match." +msgstr "GID користувача «%s» і групи «%s» не збігаються." + +#: ../src/daemon/main.c:205 +#, c-format +msgid "Home directory of user '%s' is not '%s', ignoring." +msgstr "Домашнім каталогом користувача «%s» не є «%s», дані проігноровано." + +#: ../src/daemon/main.c:208 ../src/daemon/main.c:213 +#, c-format +msgid "Failed to create '%s': %s" +msgstr "Не вдалося створити «%s»: %s" + +#: ../src/daemon/main.c:220 +#, c-format +msgid "Failed to change group list: %s" +msgstr "Не вдалося змінити список груп: %s" + +#: ../src/daemon/main.c:236 +#, c-format +msgid "Failed to change GID: %s" +msgstr "Не вдалося змінити GID: %s" + +#: ../src/daemon/main.c:252 +#, c-format +msgid "Failed to change UID: %s" +msgstr "Не вдалося змінити UID: %s" + +#: ../src/daemon/main.c:271 +msgid "Successfully dropped root privileges." +msgstr "Програма успішно позбулася прав доступу користувача root." + +#: ../src/daemon/main.c:279 +msgid "System wide mode unsupported on this platform." +msgstr "Загальносистемний режим не підтримується на цій платформі." + +#: ../src/daemon/main.c:297 +#, c-format +msgid "setrlimit(%s, (%u, %u)) failed: %s" +msgstr "Спроба виконати setrlimit(%s, (%u, %u)) була невдалою: %s" + +#: ../src/daemon/main.c:474 +msgid "Failed to parse command line." +msgstr "Не вдалося обробити рядок команди." + +#: ../src/daemon/main.c:541 +msgid "Daemon not running" +msgstr "Фонову службу не запущено" + +#: ../src/daemon/main.c:543 +#, c-format +msgid "Daemon running as PID %u" +msgstr "Фонову службу запущено як PID %u" + +#: ../src/daemon/main.c:553 +#, c-format +msgid "Failed to kill daemon: %s" +msgstr "Не вдалося завершити роботу фонової служби: %s" + +#: ../src/daemon/main.c:571 +msgid "" +"This program is not intended to be run as root (unless --system is " +"specified)." +msgstr "" +"Цю програму не призначено для запуску від імені користувача root (якщо не " +"вказано параметра --system)." + +#: ../src/daemon/main.c:573 +msgid "Root privileges required." +msgstr "Потрібні права доступу користувача root." + +#: ../src/daemon/main.c:578 +msgid "--start not supported for system instances." +msgstr "" +"Параметр --start не підтримується для загальносистемних екземплярів програми." + +#: ../src/daemon/main.c:583 +msgid "Running in system mode, but --disallow-exit not set!" +msgstr "Запуск у загальносистемному режимі, але не встановлено --disallow-exit!" + +#: ../src/daemon/main.c:586 +msgid "Running in system mode, but --disallow-module-loading not set!" +msgstr "" +"Запуск у загальносистемному режимі, але не встановлено --disallow-module-" +"loading!" + +#: ../src/daemon/main.c:589 +msgid "Running in system mode, forcibly disabling SHM mode!" +msgstr "Запуск у загальносистемному режимі, примусове вимикання режиму SHM!" + +#: ../src/daemon/main.c:594 +msgid "Running in system mode, forcibly disabling exit idle time!" +msgstr "" +"Запуск у загальносистемному режимі, примусове вимикання режиму параметрів " +"часу виходу за відсутності активності!" + +#: ../src/daemon/main.c:621 +msgid "Failed to acquire stdio." +msgstr "Не вдалося отримати stdio." + +#: ../src/daemon/main.c:627 +#, c-format +msgid "pipe failed: %s" +msgstr "Спроба створення каналу завершилася невдало: %s" + +#: ../src/daemon/main.c:632 +#, c-format +msgid "fork() failed: %s" +msgstr "Спроба виконання fork() завершилася невдало: %s" + +#: ../src/daemon/main.c:646 ../src/utils/pacat.c:508 +#, c-format +msgid "read() failed: %s" +msgstr "Спроба виконання read() завершилася невдало: %s" + +#: ../src/daemon/main.c:652 +msgid "Daemon startup failed." +msgstr "Спроба запуску фонової служби завершилася невдало." + +#: ../src/daemon/main.c:654 +msgid "Daemon startup successful." +msgstr "Фонову службу успішно запущено." + +#: ../src/daemon/main.c:731 +#, c-format +msgid "This is PulseAudio %s" +msgstr "Це PulseAudio %s" + +#: ../src/daemon/main.c:732 +#, c-format +msgid "Compilation host: %s" +msgstr "Вузол збирання: %s" + +#: ../src/daemon/main.c:733 +#, c-format +msgid "Compilation CFLAGS: %s" +msgstr "CFLAGS збирання: %s" + +#: ../src/daemon/main.c:736 +#, c-format +msgid "Running on host: %s" +msgstr "Запущено на вузлі: %s" + +#: ../src/daemon/main.c:739 +#, c-format +msgid "Found %u CPUs." +msgstr "Знайдено %u процесорів." + +#: ../src/daemon/main.c:741 +#, c-format +msgid "Page size is %lu bytes" +msgstr "Розмір сторінки дорівнює %lu байтам" + +#: ../src/daemon/main.c:744 +msgid "Compiled with Valgrind support: yes" +msgstr "Зібрано з підтримкою Valgrind: так" + +#: ../src/daemon/main.c:746 +msgid "Compiled with Valgrind support: no" +msgstr "Зібрано з підтримкою Valgrind: ні" + +#: ../src/daemon/main.c:749 +#, c-format +msgid "Running in valgrind mode: %s" +msgstr "Запуск у режимі valgrind: %s" + +#: ../src/daemon/main.c:752 +msgid "Optimized build: yes" +msgstr "Зібрано з оптимізацією: так" + +#: ../src/daemon/main.c:754 +msgid "Optimized build: no" +msgstr "Зібрано з оптимізацією: ні" + +#: ../src/daemon/main.c:758 +msgid "NDEBUG defined, all asserts disabled." +msgstr "Визначено NDEBUG, всі додавання вимкнено." + +#: ../src/daemon/main.c:760 +msgid "FASTPATH defined, only fast path asserts disabled." +msgstr "Визначено FASTPATH, вимкнено лише додавання швидких шляхів." + +#: ../src/daemon/main.c:762 +msgid "All asserts enabled." +msgstr "Увімкнено всі додавання." + +#: ../src/daemon/main.c:766 +msgid "Failed to get machine ID" +msgstr "Спроба отримати ідентифікатор системи завершилася невдало" + +#: ../src/daemon/main.c:769 +#, c-format +msgid "Machine ID is %s." +msgstr "Ідентифікатор системи %s." + +#: ../src/daemon/main.c:773 +#, c-format +msgid "Session ID is %s." +msgstr "Ідентифікатор сеансу — %s." + +#: ../src/daemon/main.c:779 +#, c-format +msgid "Using runtime directory %s." +msgstr "Каталог запуску: %s." + +#: ../src/daemon/main.c:784 +#, c-format +msgid "Using state directory %s." +msgstr "Каталог стану: %s." + +#: ../src/daemon/main.c:787 +#, c-format +msgid "Using modules directory %s." +msgstr "Каталог модулів: %s." + +#: ../src/daemon/main.c:789 +#, c-format +msgid "Running in system mode: %s" +msgstr "Запуску у загальносистемному режимі: %s" + +#: ../src/daemon/main.c:792 +msgid "" +"OK, so you are running PA in system mode. Please note that you most likely " +"shouldn't be doing that.\n" +"If you do it nonetheless then it's your own fault if things don't work as " +"expected.\n" +"Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an " +"explanation why system mode is usually a bad idea." +msgstr "" +"Гаразд, ви запустили PA у системному режимі. Будь ласка, зауважте, що " +"здебільшого у цьому немає потреби.\n" +"Якщо ви все ж це зробили, відповідальність за всі негаразди лягає саме на " +"вас.\n" +"Будь ласка, ознайомтеся зі статтею http://pulseaudio.org/wiki/" +"WhatIsWrongWithSystemMode, щоб дізнатися про те, чому не варто " +"використовувати системний режим." + +#: ../src/daemon/main.c:809 +msgid "pa_pid_file_create() failed." +msgstr "Спроба виконання pa_pid_file_create() зазнала невдачі." + +#: ../src/daemon/main.c:819 +msgid "Fresh high-resolution timers available! Bon appetit!" +msgstr "Доступні свіжі високоточні таймери! Смачного!" + +#: ../src/daemon/main.c:821 +msgid "" +"Dude, your kernel stinks! The chef's recommendation today is Linux with high-" +"resolution timers enabled!" +msgstr "" +"Чувак, твоє ядро — лайно! Круті пацани рекомендують Linux з увімкненими " +"високоточними таймерами!" + +#: ../src/daemon/main.c:844 +msgid "pa_core_new() failed." +msgstr "Спроба виконання pa_core_new() зазнала невдачі." + +#: ../src/daemon/main.c:904 +msgid "Failed to initialize daemon." +msgstr "Не вдалося ініціалізувати фонову службу." + +#: ../src/daemon/main.c:909 +msgid "Daemon startup without any loaded modules, refusing to work." +msgstr "" +"Запуск фонової служби без жодного завантаженого модуля, служба не буде " +"працездатною." + +#: ../src/daemon/main.c:926 +msgid "Daemon startup complete." +msgstr "Запуск фонової служби завершено." + +#: ../src/daemon/main.c:932 +msgid "Daemon shutdown initiated." +msgstr "Ініційовано завершення роботи фонової служби." + +#: ../src/daemon/main.c:954 +msgid "Daemon terminated." +msgstr "Виконання фонової служби перервано." + +#: ../src/daemon/cmdline.c:115 +#, c-format +msgid "" +"%s [options]\n" +"\n" +"COMMANDS:\n" +" -h, --help Show this help\n" +" --version Show version\n" +" --dump-conf Dump default configuration\n" +" --dump-modules Dump list of available modules\n" +" --dump-resample-methods Dump available resample methods\n" +" --cleanup-shm Cleanup stale shared memory " +"segments\n" +" --start Start the daemon if it is not " +"running\n" +" -k --kill Kill a running daemon\n" +" --check Check for a running daemon (only " +"returns exit code)\n" +"\n" +"OPTIONS:\n" +" --system[=BOOL] Run as system-wide instance\n" +" -D, --daemonize[=BOOL] Daemonize after startup\n" +" --fail[=BOOL] Quit when startup fails\n" +" --high-priority[=BOOL] Try to set high nice level\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_NICE)\n" +" --realtime[=BOOL] Try to enable realtime scheduling\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_RTPRIO)\n" +" --disallow-module-loading[=BOOL] Disallow module user requested " +"module\n" +" loading/unloading after startup\n" +" --disallow-exit[=BOOL] Disallow user requested exit\n" +" --exit-idle-time=SECS Terminate the daemon when idle and " +"this\n" +" time passed\n" +" --module-idle-time=SECS Unload autoloaded modules when idle " +"and\n" +" this time passed\n" +" --scache-idle-time=SECS Unload autoloaded samples when idle " +"and\n" +" this time passed\n" +" --log-level[=LEVEL] Increase or set verbosity level\n" +" -v Increase the verbosity level\n" +" --log-target={auto,syslog,stderr} Specify the log target\n" +" --log-meta[=BOOL] Include code location in log " +"messages\n" +" --log-time[=BOOL] Include timestamps in log messages\n" +" --log-backtrace=FRAMES Include a backtrace in log messages\n" +" -p, --dl-search-path=PATH Set the search path for dynamic " +"shared\n" +" objects (plugins)\n" +" --resample-method=METHOD Use the specified resampling method\n" +" (See --dump-resample-methods for\n" +" possible values)\n" +" --use-pid-file[=BOOL] Create a PID file\n" +" --no-cpu-limit[=BOOL] Do not install CPU load limiter on\n" +" platforms that support it.\n" +" --disable-shm[=BOOL] Disable shared memory support.\n" +"\n" +"STARTUP SCRIPT:\n" +" -L, --load=\"MODULE ARGUMENTS\" Load the specified plugin module " +"with\n" +" the specified argument\n" +" -F, --file=FILENAME Run the specified script\n" +" -C Open a command line on the running " +"TTY\n" +" after startup\n" +"\n" +" -n Don't load default script file\n" +msgstr "" +"%s [параметри]\n" +"\n" +"COMMANDS:\n" +" -h, --help Показати цю довідку\n" +" --version Показати дані щодо версії\n" +" --dump-conf Створити знімок поточних " +"налаштувань\n" +" --dump-modules Створити перелік можливих модулів\n" +" --dump-resample-methods Створити перелік можливих методів " +"зміни частотних характеристик\n" +" --cleanup-shm Спорожнити непотрібні сегменти " +"пам’яті спільного використання\n" +" --start Запустити фонову службу, якщо її ще " +"не запущено\n" +" -k --kill Завершити роботу запущеної фонової " +"служби\n" +" --check Перевірити, чи запущено фонову " +"службу (буде повернуто лише код виходу)\n" +"\n" +"ПАРАМЕТРИ:\n" +" --system[=BOOL] Загальносистемний режим\n" +" -D, --daemonize[=BOOL] Перетворити на фонову службу після " +"запуску\n" +" --fail[=BOOL] Завершити роботу, якщо запуск був " +"невдалим\n" +" --high-priority[=BOOL] Спробувати встановити вищий рівень " +"nice\n" +" (доступне лише для root, з SUID або\n" +" підвищеним RLIMIT_NICE)\n" +" --realtime[=BOOL] Спробувати увімкнути планування у " +"режимі реального часу\n" +" (доступне лише для root, з SUID або\n" +" підвищеним RLIMIT_RTPRIO)\n" +" --disallow-module-loading[=BOOL] Заборонити для вказаного " +"користувачем модуля\n" +" завантаження/вивантаження після " +"запуску\n" +" --disallow-exit[=BOOL] Заборонити завершення роботи " +"користувачем\n" +" --exit-idle-time=СЕК. Перервати виконання фонової служби, " +"якщо не спостерігатиметься\n" +" активності протягом вказаного часу\n" +" --module-idle-time=СЕК. Вивантажити автоматично завантажені " +"модулі, якщо не спостерігатиметься\n" +" активності протягом вказаного часу\n" +" --scache-idle-time=СЕК. Вивантажити автоматично завантажені " +"фрагменти, якщо не спостерігатиметься\n" +" активності протягом вказаного часу\n" +" --log-level[=РІВЕНЬ] Підвищити або встановити рівень " +"докладності виводу\n" +" -v Підвищити рівень докладності виводу\n" +" --log-target={auto,syslog,stderr} Вказати журнал\n" +" --log-meta[=BOOL] Додати повідомлення про місце у коді " +"до повідомлень журналу\n" +" --log-time[=BOOL] Додати час до повідомлень журналу\n" +" --log-backtrace=FRAMES Додати зворотне трасування до " +"повідомлень журналу\n" +" -p, --dl-search-path=ШЛЯХ Встановити шлях пошуку для об’єктів " +"динамічного\n" +" спільного використання (додатків)\n" +" --resample-method=МЕТОД Використовувати вказаний метод зміни " +"частотних характеристик\n" +" (Про можливі варіанти можна " +"дізнатися за допомогою\n" +" параметра --dump-resample-methods)\n" +" --use-pid-file[=BOOL] Створювати файл PID\n" +" --no-cpu-limit[=BOOL] Не встановлювати обмеження на " +"використання процесора\n" +" на платформах, які його " +"підтримують.\n" +" --disable-shm[=BOOL] Вимкнути підтримку спільного " +"використання пам’яті.\n" +"\n" +"СКРИПТ ЗАПУСКУ:\n" +" -L, --load=\"ПАРАМЕТРИ МОДУЛЯ\" Завантажити вказаний модуль " +"додатка з\n" +" вказаними параметрами\n" +" -F, --file=НАЗВА_ФАЙЛА Виконати вказаний скрипт\n" +" -C Відкрити командний рядок на " +"запущеному TTY\n" +" після запуску\n" +"\n" +" -n Не завантажувати типовий файл " +"скрипту\n" + +#: ../src/daemon/cmdline.c:247 +msgid "--daemonize expects boolean argument" +msgstr "Для параметра --daemonize слід вказувати булівський аргумент" + +#: ../src/daemon/cmdline.c:254 +msgid "--fail expects boolean argument" +msgstr "Для параметра --fail слід вказувати булівський аргумент" + +#: ../src/daemon/cmdline.c:264 +msgid "" +"--log-level expects log level argument (either numeric in range 0..4 or one " +"of debug, info, notice, warn, error)." +msgstr "" +"Для параметра --log-level слід вказувати значення рівня журналювання " +"(числове у діапазоні 0..4 або одне зі значень debug, info, notice, warn, " +"error)." + +#: ../src/daemon/cmdline.c:276 +msgid "--high-priority expects boolean argument" +msgstr "Для параметра --high-priority слід вказувати булівський аргумент" + +#: ../src/daemon/cmdline.c:283 +msgid "--realtime expects boolean argument" +msgstr "Для параметра --realtime слід вказувати булівський аргумент" + +#: ../src/daemon/cmdline.c:290 +msgid "--disallow-module-loading expects boolean argument" +msgstr "" +"Для параметра --disallow-module-loading слід вказувати булівський аргумент" + +#: ../src/daemon/cmdline.c:297 +msgid "--disallow-exit expects boolean argument" +msgstr "Для параметра --disallow-exit слід вказувати булівський аргумент" + +#: ../src/daemon/cmdline.c:304 +msgid "--use-pid-file expects boolean argument" +msgstr "Для параметра --use-pid-file слід вказувати булівський аргумент" + +#: ../src/daemon/cmdline.c:321 +msgid "Invalid log target: use either 'syslog', 'stderr' or 'auto'." +msgstr "Журнал вказано неправильно: можливі варіанти «syslog», «stderr» і «auto»." + +#: ../src/daemon/cmdline.c:328 +msgid "--log-time expects boolean argument" +msgstr "Для параметра --log-time слід вказувати булівський аргумент" + +#: ../src/daemon/cmdline.c:335 +msgid "--log-meta expects boolean argument" +msgstr "Для параметра --log-meta слід вказувати булівський аргумент" + +#: ../src/daemon/cmdline.c:354 +#, c-format +msgid "Invalid resample method '%s'." +msgstr "Некоректний метод зміни частотних характеристик «%s»." + +#: ../src/daemon/cmdline.c:361 +msgid "--system expects boolean argument" +msgstr "Для параметра --system слід вказувати булівський аргумент" + +#: ../src/daemon/cmdline.c:368 +msgid "--no-cpu-limit expects boolean argument" +msgstr "Для параметра --no-cpu-limit слід вказувати булівський аргумент" + +#: ../src/daemon/cmdline.c:375 +msgid "--disable-shm expects boolean argument" +msgstr "Для параметра --disable-shm слід вказувати булівський аргумент" + +#: ../src/daemon/dumpmodules.c:60 +#, c-format +msgid "Name: %s\n" +msgstr "Назва: %s\n" + +#: ../src/daemon/dumpmodules.c:63 +#, c-format +msgid "No module information available\n" +msgstr "Дані щодо модуля недоступні\n" + +#: ../src/daemon/dumpmodules.c:66 +#, c-format +msgid "Version: %s\n" +msgstr "Версія: %s\n" + +#: ../src/daemon/dumpmodules.c:68 +#, c-format +msgid "Description: %s\n" +msgstr "Опис: %s\n" + +#: ../src/daemon/dumpmodules.c:70 +#, c-format +msgid "Author: %s\n" +msgstr "Автор: %s\n" + +#: ../src/daemon/dumpmodules.c:72 +#, c-format +msgid "Usage: %s\n" +msgstr "Використання: %s\n" + +#: ../src/daemon/dumpmodules.c:73 +#, c-format +msgid "Load Once: %s\n" +msgstr "Завантаження при: %s\n" + +#: ../src/daemon/dumpmodules.c:75 +#, c-format +msgid "DEPRECATION WARNING: %s\n" +msgstr "ПОПЕРЕДЖЕННЯ ПРО ЗАСТАРІЛІСТЬ: %s\n" + +#: ../src/daemon/dumpmodules.c:79 +#, c-format +msgid "Path: %s\n" +msgstr "Шлях: %s\n" + +#: ../src/daemon/daemon-conf.c:232 +#, c-format +msgid "[%s:%u] Invalid log target '%s'." +msgstr "[%s:%u] Некоректний журнал «%s»." + +#: ../src/daemon/daemon-conf.c:248 +#, c-format +msgid "[%s:%u] Invalid log level '%s'." +msgstr "[%s:%u] Некоректний рівень журналювання «%s»." + +#: ../src/daemon/daemon-conf.c:264 +#, c-format +msgid "[%s:%u] Invalid resample method '%s'." +msgstr "[%s:%u] Некоректний метод зміни частотних характеристик «%s»." + +#: ../src/daemon/daemon-conf.c:287 +#, c-format +msgid "[%s:%u] Invalid rlimit '%s'." +msgstr "[%s:%u] Некоректне значення rlimit «%s»." + +#: ../src/daemon/daemon-conf.c:294 +#, c-format +msgid "[%s:%u] rlimit not supported on this platform." +msgstr "[%s:%u] rlimit не підтримується на цій платформі." + +#: ../src/daemon/daemon-conf.c:310 +#, c-format +msgid "[%s:%u] Invalid sample format '%s'." +msgstr "[%s:%u] Некоректний формат фрагмента «%s»." + +#: ../src/daemon/daemon-conf.c:328 +#, c-format +msgid "[%s:%u] Invalid sample rate '%s'." +msgstr "[%s:%u] Некоректна частота вибірки «%s»." + +#: ../src/daemon/daemon-conf.c:352 +#, c-format +msgid "[%s:%u] Invalid sample channels '%s'." +msgstr "[%s:%u] Некоректні канали фрагмента «%s»." + +#: ../src/daemon/daemon-conf.c:370 +#, c-format +msgid "[%s:%u] Invalid channel map '%s'." +msgstr "[%s:%u] Некоректна карта каналів «%s»'." + +#: ../src/daemon/daemon-conf.c:388 +#, c-format +msgid "[%s:%u] Invalid number of fragments '%s'." +msgstr "[%s:%u] Некоректна кількість фрагментів «%s»." + +#: ../src/daemon/daemon-conf.c:406 +#, c-format +msgid "[%s:%u] Invalid fragment size '%s'." +msgstr "[%s:%u] Некоректний розмір фрагмента «%s»." + +#: ../src/daemon/daemon-conf.c:424 +#, c-format +msgid "[%s:%u] Invalid nice level '%s'." +msgstr "[%s:%u] Некоректний рівень nice «%s»." + +#: ../src/daemon/daemon-conf.c:546 +#, c-format +msgid "Failed to open configuration file: %s" +msgstr "Не вдалося відкрити файл налаштувань: %s" + +#: ../src/daemon/daemon-conf.c:562 +msgid "" +"The specified default channel map has a different number of channels than " +"the specified default number of channels." +msgstr "" +"У вказаній типовій карті каналів визначається інша кількість каналів, ніж " +"типова кількість каналів." + +#: ../src/daemon/daemon-conf.c:638 +#, c-format +msgid "### Read from configuration file: %s ###\n" +msgstr "### Прочитано з файла налаштувань: %s ###\n" + +#: ../src/daemon/caps.c:62 +msgid "Cleaning up privileges." +msgstr "Позбуваємося прав доступу." + +#: ../src/daemon/pulseaudio.desktop.in.h:1 +msgid "PulseAudio Sound System" +msgstr "Звукова система PulseAudio" + +#: ../src/daemon/pulseaudio.desktop.in.h:2 +msgid "Start the PulseAudio Sound System" +msgstr "Запустити звукову систему PulseAudio" + +#: ../src/pulse/channelmap.c:105 ../src/pulse/channelmap.c:757 +msgid "Mono" +msgstr "Моно" + +#: ../src/pulse/channelmap.c:107 +msgid "Front Center" +msgstr "Передній центральний" + +#: ../src/pulse/channelmap.c:108 +msgid "Front Left" +msgstr "Передній лівий" + +#: ../src/pulse/channelmap.c:109 +msgid "Front Right" +msgstr "Передній правий" + +#: ../src/pulse/channelmap.c:111 +msgid "Rear Center" +msgstr "Задній центральний" + +#: ../src/pulse/channelmap.c:112 +msgid "Rear Left" +msgstr "Задній лівий" + +#: ../src/pulse/channelmap.c:113 +msgid "Rear Right" +msgstr "Задній правий" + +#: ../src/pulse/channelmap.c:115 +msgid "Low Frequency Emmiter" +msgstr "Джерело низьких частот" + +#: ../src/pulse/channelmap.c:117 +msgid "Front Left-of-center" +msgstr "Передній лівоцентральний" + +#: ../src/pulse/channelmap.c:118 +msgid "Front Right-of-center" +msgstr "Передній правоцентральний" + +#: ../src/pulse/channelmap.c:120 +msgid "Side Left" +msgstr "Боковий лівий" + +#: ../src/pulse/channelmap.c:121 +msgid "Side Right" +msgstr "Боковий правий" + +#: ../src/pulse/channelmap.c:123 +msgid "Auxiliary 0" +msgstr "Допоміжний 0" + +#: ../src/pulse/channelmap.c:124 +msgid "Auxiliary 1" +msgstr "Допоміжний 1" + +#: ../src/pulse/channelmap.c:125 +msgid "Auxiliary 2" +msgstr "Допоміжний 2" + +#: ../src/pulse/channelmap.c:126 +msgid "Auxiliary 3" +msgstr "Допоміжний 3" + +#: ../src/pulse/channelmap.c:127 +msgid "Auxiliary 4" +msgstr "Допоміжний 4" + +#: ../src/pulse/channelmap.c:128 +msgid "Auxiliary 5" +msgstr "Допоміжний 5" + +#: ../src/pulse/channelmap.c:129 +msgid "Auxiliary 6" +msgstr "Допоміжний 6" + +#: ../src/pulse/channelmap.c:130 +msgid "Auxiliary 7" +msgstr "Допоміжний 7" + +#: ../src/pulse/channelmap.c:131 +msgid "Auxiliary 8" +msgstr "Допоміжний 8" + +#: ../src/pulse/channelmap.c:132 +msgid "Auxiliary 9" +msgstr "Допоміжний 9" + +#: ../src/pulse/channelmap.c:133 +msgid "Auxiliary 10" +msgstr "Допоміжний 10" + +#: ../src/pulse/channelmap.c:134 +msgid "Auxiliary 11" +msgstr "Допоміжний 11" + +#: ../src/pulse/channelmap.c:135 +msgid "Auxiliary 12" +msgstr "Допоміжний 12" + +#: ../src/pulse/channelmap.c:136 +msgid "Auxiliary 13" +msgstr "Допоміжний 13" + +#: ../src/pulse/channelmap.c:137 +msgid "Auxiliary 14" +msgstr "Допоміжний 14" + +#: ../src/pulse/channelmap.c:138 +msgid "Auxiliary 15" +msgstr "Допоміжний 15" + +#: ../src/pulse/channelmap.c:139 +msgid "Auxiliary 16" +msgstr "Допоміжний 16" + +#: ../src/pulse/channelmap.c:140 +msgid "Auxiliary 17" +msgstr "Допоміжний 17" + +#: ../src/pulse/channelmap.c:141 +msgid "Auxiliary 18" +msgstr "Допоміжний 18" + +#: ../src/pulse/channelmap.c:142 +msgid "Auxiliary 19" +msgstr "Допоміжний 19" + +#: ../src/pulse/channelmap.c:143 +msgid "Auxiliary 20" +msgstr "Допоміжний 20" + +#: ../src/pulse/channelmap.c:144 +msgid "Auxiliary 21" +msgstr "Допоміжний 21" + +#: ../src/pulse/channelmap.c:145 +msgid "Auxiliary 22" +msgstr "Допоміжний 22" + +#: ../src/pulse/channelmap.c:146 +msgid "Auxiliary 23" +msgstr "Допоміжний 23" + +#: ../src/pulse/channelmap.c:147 +msgid "Auxiliary 24" +msgstr "Допоміжний 24" + +#: ../src/pulse/channelmap.c:148 +msgid "Auxiliary 25" +msgstr "Допоміжний 25" + +#: ../src/pulse/channelmap.c:149 +msgid "Auxiliary 26" +msgstr "Допоміжний 26" + +#: ../src/pulse/channelmap.c:150 +msgid "Auxiliary 27" +msgstr "Допоміжний 27" + +#: ../src/pulse/channelmap.c:151 +msgid "Auxiliary 28" +msgstr "Допоміжний 28" + +#: ../src/pulse/channelmap.c:152 +msgid "Auxiliary 29" +msgstr "Допоміжний 29" + +#: ../src/pulse/channelmap.c:153 +msgid "Auxiliary 30" +msgstr "Допоміжний 30" + +#: ../src/pulse/channelmap.c:154 +msgid "Auxiliary 31" +msgstr "Допоміжний 31" + +#: ../src/pulse/channelmap.c:156 +msgid "Top Center" +msgstr "Верхній центральний" + +#: ../src/pulse/channelmap.c:158 +msgid "Top Front Center" +msgstr "Верхній передній центральний" + +#: ../src/pulse/channelmap.c:159 +msgid "Top Front Left" +msgstr "Верхній передній лівий" + +#: ../src/pulse/channelmap.c:160 +msgid "Top Front Right" +msgstr "Верхній передній правий" + +#: ../src/pulse/channelmap.c:162 +msgid "Top Rear Center" +msgstr "Верхній задній центральний" + +#: ../src/pulse/channelmap.c:163 +msgid "Top Rear Left" +msgstr "Верхній задній лівий" + +#: ../src/pulse/channelmap.c:164 +msgid "Top Rear Right" +msgstr "Верхній задній правий" + +#: ../src/pulse/channelmap.c:484 ../src/pulse/sample.c:170 +#: ../src/pulse/volume.c:295 ../src/pulse/volume.c:321 +#: ../src/pulse/volume.c:341 ../src/pulse/volume.c:371 +msgid "(invalid)" +msgstr "(некоректний)" + +#: ../src/pulse/channelmap.c:761 +msgid "Stereo" +msgstr "Стерео" + +#: ../src/pulse/channelmap.c:766 +msgid "Surround 4.0" +msgstr "Об'ємний 4.0" + +#: ../src/pulse/channelmap.c:772 +msgid "Surround 4.1" +msgstr "Об'ємний 4.1" + +#: ../src/pulse/channelmap.c:778 +msgid "Surround 5.0" +msgstr "Об'ємний 5.0" + +#: ../src/pulse/channelmap.c:784 +msgid "Surround 5.1" +msgstr "Об'ємний 5.1" + +#: ../src/pulse/channelmap.c:791 +msgid "Surround 7.1" +msgstr "Об'ємний 7.1" + +#: ../src/pulse/error.c:43 +msgid "OK" +msgstr "Гаразд" + +#: ../src/pulse/error.c:44 +msgid "Access denied" +msgstr "Доступ заборонено" + +#: ../src/pulse/error.c:45 +msgid "Unknown command" +msgstr "Невідома команда" + +#: ../src/pulse/error.c:46 +msgid "Invalid argument" +msgstr "Некоректний аргумент" + +#: ../src/pulse/error.c:47 +msgid "Entity exists" +msgstr "Об’єкт існує" + +#: ../src/pulse/error.c:48 +msgid "No such entity" +msgstr "Такого об’єкта не існує" + +#: ../src/pulse/error.c:49 +msgid "Connection refused" +msgstr "У з'єднанні відмовлено" + +#: ../src/pulse/error.c:50 +msgid "Protocol error" +msgstr "Помилка протоколу" + +#: ../src/pulse/error.c:51 +msgid "Timeout" +msgstr "Перевищення часу очікування" + +#: ../src/pulse/error.c:52 +msgid "No authorization key" +msgstr "Не вказано ключа розпізнавання" + +#: ../src/pulse/error.c:53 +msgid "Internal error" +msgstr "Внутрішня помилка" + +#: ../src/pulse/error.c:54 +msgid "Connection terminated" +msgstr "З’єднання перервано" + +#: ../src/pulse/error.c:55 +msgid "Entity killed" +msgstr "Об’єкт вилучено" + +#: ../src/pulse/error.c:56 +msgid "Invalid server" +msgstr "Некоректний сервер" + +#: ../src/pulse/error.c:57 +msgid "Module initalization failed" +msgstr "Спроба ініціалізації модуля завершилася невдало" + +#: ../src/pulse/error.c:58 +msgid "Bad state" +msgstr "Стан помилки" + +#: ../src/pulse/error.c:59 +msgid "No data" +msgstr "Немає даних" + +#: ../src/pulse/error.c:60 +msgid "Incompatible protocol version" +msgstr "Несумісна версія протоколу" + +#: ../src/pulse/error.c:61 +msgid "Too large" +msgstr "Завеликий" + +#: ../src/pulse/error.c:62 +msgid "Not supported" +msgstr "Не підтримується" + +#: ../src/pulse/error.c:63 +msgid "Unknown error code" +msgstr "Помилка з невідомим кодом" + +#: ../src/pulse/error.c:64 +msgid "No such extension" +msgstr "Такого додатка немає" + +#: ../src/pulse/error.c:65 +msgid "Obsolete functionality" +msgstr "Застарілі функціональні можливості" + +#: ../src/pulse/error.c:66 +msgid "Missing implementation" +msgstr "Відсутня реалізація" + +#: ../src/pulse/error.c:67 +msgid "Client forked" +msgstr "Клієнт розгалужено" + +#: ../src/pulse/error.c:68 +msgid "Input/Output error" +msgstr "Помилка вводу/виводу" + +#: ../src/pulse/error.c:69 +msgid "Device or resource busy" +msgstr "Пристрій або ресурс зайнято" + +#: ../src/pulse/sample.c:172 +#, c-format +msgid "%s %uch %uHz" +msgstr "%s %uкан. %uГц" + +#: ../src/pulse/sample.c:184 +#, c-format +msgid "%0.1f GiB" +msgstr "%0.1f ГБ" + +#: ../src/pulse/sample.c:186 +#, c-format +msgid "%0.1f MiB" +msgstr "%0.1f МБ" + +#: ../src/pulse/sample.c:188 +#, c-format +msgid "%0.1f KiB" +msgstr "%0.1f кБ" + +#: ../src/pulse/sample.c:190 +#, c-format +msgid "%u B" +msgstr "%u Б" + +#: ../src/pulse/client-conf-x11.c:55 ../src/utils/pax11publish.c:100 +msgid "XOpenDisplay() failed" +msgstr "Спроба виконання XOpenDisplay() завершилася невдало" + +#: ../src/pulse/client-conf-x11.c:93 +msgid "Failed to parse cookie data" +msgstr "Не вдалося обробити дані куки" + +#: ../src/pulse/client-conf.c:111 +#, c-format +msgid "Failed to open configuration file '%s': %s" +msgstr "Не вдалося відкрити файл налаштування «%s»: %s" + +#: ../src/pulse/context.c:550 +msgid "No cookie loaded. Attempting to connect without." +msgstr "Куків не завантажено. Буде виконано спробу з’єднання за їх відсутності." + +#: ../src/pulse/context.c:693 +#, c-format +msgid "fork(): %s" +msgstr "fork(): %s" + +#: ../src/pulse/context.c:748 +#, c-format +msgid "waitpid(): %s" +msgstr "waitpid(): %s" + +#: ../src/pulse/context.c:1438 +#, c-format +msgid "Received message for unknown extension '%s'" +msgstr "Отримано повідомлення про невідомий додаток «%s»" + +#: ../src/utils/pacat.c:108 +#, c-format +msgid "Failed to drain stream: %s" +msgstr "Не вдалося створити тунель для потоку: %s" + +#: ../src/utils/pacat.c:113 +msgid "Playback stream drained." +msgstr "Потік відтворення тунельовано." + +#: ../src/utils/pacat.c:123 +msgid "Draining connection to server." +msgstr "Тунельне з’єднання з сервером." + +#: ../src/utils/pacat.c:136 +#, c-format +msgid "pa_stream_drain(): %s" +msgstr "pa_stream_drain(): %s" + +#: ../src/utils/pacat.c:159 +#, c-format +msgid "pa_stream_write() failed: %s" +msgstr "Спроба виконання pa_stream_write() завершилася невдало: %s" + +#: ../src/utils/pacat.c:197 +#, c-format +msgid "pa_stream_begin_write() failed: %s" +msgstr "Спроба виконання pa_stream_write() завершилася невдало: %s" + +#: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267 +#, c-format +msgid "pa_stream_peek() failed: %s" +msgstr "Спроба виконання pa_stream_peek() завершилася невдало: %s" + +#: ../src/utils/pacat.c:307 +msgid "Stream successfully created." +msgstr "Потік було успішно створено." + +#: ../src/utils/pacat.c:310 +#, c-format +msgid "pa_stream_get_buffer_attr() failed: %s" +msgstr "Спроба виконання pa_stream_get_buffer_attr() завершилася невдало: %s" + +#: ../src/utils/pacat.c:314 +#, c-format +msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u" +msgstr "Метрика буфера: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u" + +#: ../src/utils/pacat.c:317 +#, c-format +msgid "Buffer metrics: maxlength=%u, fragsize=%u" +msgstr "Метрика буфера: maxlength=%u, fragsize=%u" + +#: ../src/utils/pacat.c:321 +#, c-format +msgid "Using sample spec '%s', channel map '%s'." +msgstr "Використання частотної специфікації «%s», карта каналів «%s»." + +#: ../src/utils/pacat.c:325 +#, c-format +msgid "Connected to device %s (%u, %ssuspended)." +msgstr "З’єднано з пристроєм %s (%u, %s призупинено)." + +#: ../src/utils/pacat.c:335 +#, c-format +msgid "Stream error: %s" +msgstr "Помилка потоку: %s" + +#: ../src/utils/pacat.c:345 +#, c-format +msgid "Stream device suspended.%s" +msgstr "Призупинено пристрій потоку. %s" + +#: ../src/utils/pacat.c:347 +#, c-format +msgid "Stream device resumed.%s" +msgstr "Відновлено пристрій потоку. %s" + +#: ../src/utils/pacat.c:355 +#, c-format +msgid "Stream underrun.%s" +msgstr "Недовантаження потоку. %s" + +#: ../src/utils/pacat.c:362 +#, c-format +msgid "Stream overrun.%s" +msgstr "Перевантаження потоку. %s" + +#: ../src/utils/pacat.c:369 +#, c-format +msgid "Stream started.%s" +msgstr "Потік запущено. %s" + +#: ../src/utils/pacat.c:376 +#, c-format +msgid "Stream moved to device %s (%u, %ssuspended).%s" +msgstr "Потік пересунуто на пристрій %s (%u, %s призупинено). %s" + +#: ../src/utils/pacat.c:376 +msgid "not " +msgstr "не " + +#: ../src/utils/pacat.c:383 +#, c-format +msgid "Stream buffer attributes changed.%s" +msgstr "Недовантаження потоку. %s" + +#: ../src/utils/pacat.c:415 +#, c-format +msgid "Connection established.%s" +msgstr "Встановлено з’єднання. %s" + +#: ../src/utils/pacat.c:418 +#, c-format +msgid "pa_stream_new() failed: %s" +msgstr "Спроба виконання pa_stream_new() зазнала невдачі: %s" + +#: ../src/utils/pacat.c:450 +#, c-format +msgid "pa_stream_connect_playback() failed: %s" +msgstr "Спроба виконання pa_stream_connect_playback() зазнала невдачі: %s" + +#: ../src/utils/pacat.c:456 +#, c-format +msgid "pa_stream_connect_record() failed: %s" +msgstr "Спроба виконання pa_stream_connect_record() зазнала невдачі: %s" + +#: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857 +#, c-format +msgid "Connection failure: %s" +msgstr "Спроба встановлення з’єднання зазнала невдачі: %s" + +#: ../src/utils/pacat.c:503 +msgid "Got EOF." +msgstr "Отримано EOF." + +#: ../src/utils/pacat.c:540 +#, c-format +msgid "write() failed: %s" +msgstr "Спроба виконання write() завершилася невдало: %s" + +#: ../src/utils/pacat.c:561 +msgid "Got signal, exiting." +msgstr "Отримано сигнал, завершення роботи." + +#: ../src/utils/pacat.c:575 +#, c-format +msgid "Failed to get latency: %s" +msgstr "Не вдалося отримати латентність: %s" + +#: ../src/utils/pacat.c:580 +#, c-format +msgid "Time: %0.3f sec; Latency: %0.0f usec." +msgstr "Час: %0.3f сек.; Латентність: %0.0f мкс." + +#: ../src/utils/pacat.c:599 +#, c-format +msgid "pa_stream_update_timing_info() failed: %s" +msgstr "Спроба виконання pa_stream_update_timing_info() завершилася невдало: %s" + +#: ../src/utils/pacat.c:609 +#, c-format +msgid "" +"%s [options]\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -r, --record Create a connection for recording\n" +" -p, --playback Create a connection for playback\n" +"\n" +" -v, --verbose Enable verbose operations\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -d, --device=DEVICE The name of the sink/source to " +"connect to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" +" --stream-name=NAME How to call this stream on the " +"server\n" +" --volume=VOLUME Specify the initial (linear) volume " +"in range 0...65536\n" +" --rate=SAMPLERATE The sample rate in Hz (defaults to " +"44100)\n" +" --format=SAMPLEFORMAT The sample type, one of s16le, " +"s16be, u8, float32le,\n" +" float32be, ulaw, alaw, s32le, s32be, " +"s24le, s24be,\n" +" s24-32le, s24-32be (defaults to " +"s16ne)\n" +" --channels=CHANNELS The number of channels, 1 for mono, " +"2 for stereo\n" +" (defaults to 2)\n" +" --channel-map=CHANNELMAP Channel map to use instead of the " +"default\n" +" --fix-format Take the sample format from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-rate Take the sampling rate from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-channels Take the number of channels and the " +"channel map\n" +" from the sink the stream is being " +"connected to.\n" +" --no-remix Don't upmix or downmix channels.\n" +" --no-remap Map channels by index instead of " +"name.\n" +" --latency=BYTES Request the specified latency in " +"bytes.\n" +" --process-time=BYTES Request the specified process time " +"per request in bytes.\n" +" --property=PROPERTY=VALUE Set the specified property to the " +"specified value.\n" +" --raw Record/play raw PCM data.\n" +" --file-format=FFORMAT Record/play formatted PCM data.\n" +" --list-file-formats List available file formats.\n" +msgstr "" +"%s [параметри]\n" +"\n" +" -h, --help Показати цю довідку\n" +" --version Показати дані щодо версії\n" +"\n" +" -r, --record Створити з’єднання для запису\n" +" -p, --playback Створити з’єднання для відтворення\n" +"\n" +" -v, --verbose Увімкнути докладні повідомлення\n" +"\n" +" -s, --server=СЕРВЕР Назва сервера, з яким слід " +"встановити з’єднання\n" +" -d, --device=ПРИСТРІЙ Назва пристрою приймача/джерела, з " +"яким слід встановити з’єднання\n" +" -n, --client-name=НАЗВА Спосіб виклику клієнта на сервері\n" +" --stream-name=НАЗВА Спосіб виклику потоку на сервері\n" +" --volume=ГУЧНІСТЬ Вказати початкову (лінійну) гучність " +"у діапазоні 0..65536\n" +" --rate=ЧАСТОТА_ВИБІРКИ Частота вибірки у Гц (типовим є " +"значення 44100)\n" +" --format=ФОРМАТ Тип вибірки, можливі значення: " +"s16le, s16be, u8, float32le,\n" +" float32be, ulaw, alaw, s32le, s32be " +"(типовим є значення s16ne)\n" +" --channels=КАНАЛИ Кількість каналів, 1 — моно, 2 — " +"стерео\n" +" (типовим є значення 2)\n" +" --channel-map=КАРТА_КАНАЛІВ Карта каналів, яку слід " +"використовувати замість типової\n" +" --fix-format Визначити формат за даними приймача, " +"з яким буде з’єднано\n" +" потік.\n" +" --fix-rate Визначити частоту вибірки за даними " +"з приймача, з яким буде\n" +" з’єднано потік.\n" +" --fix-channels Визначити кількість каналів і карту " +"каналів\n" +" за даними з приймача, з яким буде " +"з’єднано потік.\n" +" --no-remix Не мікшувати канали.\n" +" --no-remap Розподіляти канали за індексом, а не " +"за назвою.\n" +" --latency=БАЙТИ Надіслати запит на вказану " +"латентність у байтах.\n" +" --process-time=БАЙТИ Надіслати запит щодо вказаного часу " +"обробки на запит у байтах.\n" +" --property=ВЛАСТИВІСТЬ=ЗНАЧЕННЯ Встановити для вказаної властивості " +"вказане значення.\n" +" --raw Записати/Відтворити не оброблені " +"дані PCM.\n" +" --file-format=ФОРМАТ Записати/Відтворити форматовані дані " +"PCM.\n" +" --list-file-formats Показати список можливих форматів " +"файлів.\n" + +#: ../src/utils/pacat.c:731 +#, c-format +msgid "" +"pacat %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pacat %s\n" +"Зібрано з libpulse %s\n" +"З’єднано з libpulse %s\n" + +#: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953 +#, c-format +msgid "Invalid client name '%s'" +msgstr "Некоректна назва клієнта «%s»" + +#: ../src/utils/pacat.c:779 +#, c-format +msgid "Invalid stream name '%s'" +msgstr "Некоректна назва потоку «%s»" + +#: ../src/utils/pacat.c:816 +#, c-format +msgid "Invalid channel map '%s'" +msgstr "Некоректна карта каналів «%s»" + +#: ../src/utils/pacat.c:845 +#, c-format +msgid "Invalid latency specification '%s'" +msgstr "Некоректна специфікація латентності «%s»" + +#: ../src/utils/pacat.c:852 +#, c-format +msgid "Invalid process time specification '%s'" +msgstr "Некоректна часова специфікація «%s»" + +#: ../src/utils/pacat.c:864 +#, c-format +msgid "Invalid property '%s'" +msgstr "Некоректна властивість «%s»" + +#: ../src/utils/pacat.c:881 +#, c-format +msgid "Unknown file format %s." +msgstr "Невідомий формат файлів %s." + +#: ../src/utils/pacat.c:900 +msgid "Invalid sample specification" +msgstr "Некоректна частотна специфікація" + +#: ../src/utils/pacat.c:910 +#, c-format +msgid "open(): %s" +msgstr "open(): %s" + +#: ../src/utils/pacat.c:915 +#, c-format +msgid "dup2(): %s" +msgstr "dup2(): %s" + +#: ../src/utils/pacat.c:922 +msgid "Too many arguments." +msgstr "Забагато аргументів." + +#: ../src/utils/pacat.c:933 +msgid "Failed to generate sample specification for file." +msgstr "Не вдалося створити частотну специфікацію для файла." + +#: ../src/utils/pacat.c:953 +msgid "Failed to open audio file." +msgstr "Не вдалося відкрити звуковий файл." + +#: ../src/utils/pacat.c:959 +msgid "" +"Warning: specified sample specification will be overwritten with " +"specification from file." +msgstr "" +"Попередження: вказану частотну специфікацію буде перезаписано специфікацією " +"з файла." + +#: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997 +msgid "Failed to determine sample specification from file." +msgstr "Не вдалося отримати дані щодо частотної специфікації з файла." + +#: ../src/utils/pacat.c:971 +msgid "Warning: Failed to determine channel map from file." +msgstr "Попередження: не вдалося отримати дані щодо карти каналів з файла." + +#: ../src/utils/pacat.c:982 +msgid "Channel map doesn't match sample specification" +msgstr "Карта каналів не відповідає частотній специфікації" + +#: ../src/utils/pacat.c:993 +msgid "Warning: failed to write channel map to file." +msgstr "Попередження: не вдалося записати карту каналів до файла." + +#: ../src/utils/pacat.c:1008 +#, c-format +msgid "Opening a %s stream with sample specification '%s' and channel map '%s'." +msgstr "Відкриття потоку %s з частотною специфікацією «%s» і картою каналів «%s»." + +#: ../src/utils/pacat.c:1009 +msgid "recording" +msgstr "запис" + +#: ../src/utils/pacat.c:1009 +msgid "playback" +msgstr "відтворення" + +#: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267 +msgid "pa_mainloop_new() failed." +msgstr "Спроба виконання pa_mainloop_new() завершилася невдало." + +#: ../src/utils/pacat.c:1054 +msgid "io_new() failed." +msgstr "Спроба виконання io_new() завершилася невдало." + +#: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279 +msgid "pa_context_new() failed." +msgstr "Спроба виконання pa_context_new() завершилася невдало." + +#: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285 +#, c-format +msgid "pa_context_connect() failed: %s" +msgstr "Спроба виконання pa_context_connect() завершилася невдало: %s" + +#: ../src/utils/pacat.c:1075 +msgid "pa_context_rttime_new() failed." +msgstr "Спроба виконання pa_context_new() завершилася невдало." + +#: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290 +msgid "pa_mainloop_run() failed." +msgstr "Спроба виконання pa_mainloop_run() завершилася невдало." + +#: ../src/utils/pasuspender.c:81 +#, c-format +msgid "fork(): %s\n" +msgstr "fork(): %s\n" + +#: ../src/utils/pasuspender.c:92 +#, c-format +msgid "execvp(): %s\n" +msgstr "execvp(): %s\n" + +#: ../src/utils/pasuspender.c:109 +#, c-format +msgid "Failure to suspend: %s\n" +msgstr "Невдала спроба призупинки: %s\n" + +#: ../src/utils/pasuspender.c:124 +#, c-format +msgid "Failure to resume: %s\n" +msgstr "Невдала спроба відновлення: %s\n" + +#: ../src/utils/pasuspender.c:147 +#, c-format +msgid "WARNING: Sound server is not local, not suspending.\n" +msgstr "" +"ПОПЕРЕДЖЕННЯ: звуковий сервер не є локальним, його не можна призупинити.\n" + +#: ../src/utils/pasuspender.c:159 +#, c-format +msgid "Connection failure: %s\n" +msgstr "Спроба встановлення з’єднання зазнала невдачі: %s\n" + +#: ../src/utils/pasuspender.c:176 +#, c-format +msgid "Got SIGINT, exiting.\n" +msgstr "Отримано сигнал SIGINT, завершення роботи.\n" + +#: ../src/utils/pasuspender.c:194 +#, c-format +msgid "WARNING: Child process terminated by signal %u\n" +msgstr "ПОПЕРЕДЖЕННЯ: виконання дочірнього процесу було перервано з сигналом %u\n" + +#: ../src/utils/pasuspender.c:212 +#, c-format +msgid "" +"%s [options] ... \n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +"\n" +msgstr "" +"%s [параметри] ... \n" +"\n" +" -h, --help Показати цю довідку\n" +" --version Показати відомості щодо версії\n" +" -s, --server=СЕРВЕР Назва сервера, з яким слід " +"з’єднатися\n" +"\n" + +#: ../src/utils/pasuspender.c:248 +#, c-format +msgid "" +"pasuspender %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pasuspender %s\n" +"Зібрано з libpulse %s\n" +"З’єднано з libpulse %s\n" + +#: ../src/utils/pasuspender.c:277 +#, c-format +msgid "pa_mainloop_new() failed.\n" +msgstr "Спроба виконання pa_mainloop_new() завершилася невдало.\n" + +#: ../src/utils/pasuspender.c:290 +#, c-format +msgid "pa_context_new() failed.\n" +msgstr "Спроба виконання pa_context_new() завершилася невдало.\n" + +#: ../src/utils/pasuspender.c:298 +#, c-format +msgid "pa_mainloop_run() failed.\n" +msgstr "Спроба виконання pa_mainloop_run() завершилася невдало.\n" + +#: ../src/utils/pactl.c:135 +#, c-format +msgid "Failed to get statistics: %s" +msgstr "Не вдалося отримати статистичні дані: %s" + +#: ../src/utils/pactl.c:141 +#, c-format +msgid "Currently in use: %u blocks containing %s bytes total.\n" +msgstr "Зараз використано: %u блоків, що містять загалом %s байтів.\n" + +#: ../src/utils/pactl.c:144 +#, c-format +msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n" +msgstr "Виділено протягом виконання загалом: %u блоків, що містять %s байтів.\n" + +#: ../src/utils/pactl.c:147 +#, c-format +msgid "Sample cache size: %s\n" +msgstr "Розмір кешу фрагментів: %s\n" + +#: ../src/utils/pactl.c:156 +#, c-format +msgid "Failed to get server information: %s" +msgstr "Не вдалося отримати дані щодо сервера: %s" + +#: ../src/utils/pactl.c:164 +#, c-format +msgid "" +"User name: %s\n" +"Host Name: %s\n" +"Server Name: %s\n" +"Server Version: %s\n" +"Default Sample Specification: %s\n" +"Default Channel Map: %s\n" +"Default Sink: %s\n" +"Default Source: %s\n" +"Cookie: %08x\n" +msgstr "" +"Користувач: %s\n" +"Назва вузла: %s\n" +"Назва сервера: %s\n" +"Версія сервера: %s\n" +"Типова частотна специфікація: %s\n" +"Типова карта каналів: %s\n" +"Типовий приймач: %s\n" +"Типове джерело: %s\n" +"Кука: %08x\n" + +#: ../src/utils/pactl.c:205 +#, c-format +msgid "Failed to get sink information: %s" +msgstr "Не вдалося отримати дані щодо приймача: %s" + +#: ../src/utils/pactl.c:221 +#, c-format +msgid "" +"Sink #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor Source: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Приймач даних №%u\n" +"\tСтан: %s\n" +"\tНазва: %s\n" +"\tОпис: %s\n" +"\tДрайвер: %s\n" +"\tЧастотна специфікація: %s\n" +"\tКарта каналів: %s\n" +"\tМодуль власника: %u\n" +"\tСтан вимикання: %s\n" +"\tГучність: %s%s%s\n" +"\t баланс %0.2f\n" +"\tБазова гучність: %s%s%s\n" +"\tСпостереження: %s\n" +"\tЛатентність: %0.0f мкс, налаштовано %0.0f мкс\n" +"\tПрапорці: %s%s%s%s%s%s\n" +"\tВластивості:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360 +#, c-format +msgid "\tPorts:\n" +msgstr "\tПорти:\n" + +#: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366 +#, c-format +msgid "\tActive Port: %s\n" +msgstr "\tАктивний порт: %s\n" + +#: ../src/utils/pactl.c:297 +#, c-format +msgid "Failed to get source information: %s" +msgstr "Не вдалося отримати дані щодо джерела: %s" + +#: ../src/utils/pactl.c:313 +#, c-format +msgid "" +"Source #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor of Sink: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Джерело №%u\n" +"\tСтан: %s\n" +"\tНазва: %s\n" +"\tОпис: %s\n" +"\tДрайвер: %s\n" +"\tЧастотна специфікація: %s\n" +"\tКарта каналів: %s\n" +"\tМодуль власника: %u\n" +"\tСтан вимикання: %s\n" +"\tГучність: %s%s%s\n" +"\t баланс %0.2f\n" +"\tБазова гучність: %s%s%s\n" +"\tСпостереження: %s\n" +"\tЛатентність: %0.0f мкс, налаштовано %0.0f мкс\n" +"\tПрапорці: %s%s%s%s%s%s\n" +"\tВластивості:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:345 ../src/utils/pactl.c:401 ../src/utils/pactl.c:436 +#: ../src/utils/pactl.c:473 ../src/utils/pactl.c:532 ../src/utils/pactl.c:533 +#: ../src/utils/pactl.c:543 ../src/utils/pactl.c:587 ../src/utils/pactl.c:588 +#: ../src/utils/pactl.c:594 ../src/utils/pactl.c:637 ../src/utils/pactl.c:638 +#: ../src/utils/pactl.c:645 +msgid "n/a" +msgstr "н/д" + +#: ../src/utils/pactl.c:375 +#, c-format +msgid "Failed to get module information: %s" +msgstr "Не вдалося отримати дані щодо модуля: %s" + +#: ../src/utils/pactl.c:393 +#, c-format +msgid "" +"Module #%u\n" +"\tName: %s\n" +"\tArgument: %s\n" +"\tUsage counter: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Модуль №%u\n" +"\tНазва: %s\n" +"\tАргумент: %s\n" +"\tЛічильник використання: %s\n" +"\tВластивості:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:412 +#, c-format +msgid "Failed to get client information: %s" +msgstr "Не вдалося отримати дані щодо клієнта: %s" + +#: ../src/utils/pactl.c:430 +#, c-format +msgid "" +"Client #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Клієнт №%u\n" +"\tДрайвер: %s\n" +"\tМодуль власника: %s\n" +"\tВластивості:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:447 +#, c-format +msgid "Failed to get card information: %s" +msgstr "Не вдалося отримати дані щодо карти: %s" + +#: ../src/utils/pactl.c:465 +#, c-format +msgid "" +"Card #%u\n" +"\tName: %s\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Карта №%u\n" +"\tНазва: %s\n" +"\tДрайвер: %s\n" +"\tМодуль власника: %s\n" +"\tВластивості:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:479 +#, c-format +msgid "\tProfiles:\n" +msgstr "\tПрофілі:\n" + +#: ../src/utils/pactl.c:485 +#, c-format +msgid "\tActive Profile: %s\n" +msgstr "\tАктивний профіль: %s\n" + +#: ../src/utils/pactl.c:496 +#, c-format +msgid "Failed to get sink input information: %s" +msgstr "Не вдалося отримати відомостей щодо приймача: %s" + +#: ../src/utils/pactl.c:515 +#, c-format +msgid "" +"Sink Input #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSink: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tMute: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSink Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Приймач даних №%u\n" +"\tДрайвер: %s\n" +"\tМодуль власника: %s\n" +"\tКлієнт: %s\n" +"\tПриймач: %u\n" +"\tЧастотна специфікація: %s\n" +"\tКарта каналів: %s\n" +"\tСтан вимикання: %s\n" +"\tГучність: %s\n" +"\t %s\n" +"\t баланс %0.2f\n" +"\tЛатентність буфера: %0.0f мкс\n" +"\tЛатентність приймача: %0.0f мкс\n" +"\tМетод зміни частоти: %s\n" +"\tВластивості:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:554 +#, c-format +msgid "Failed to get source output information: %s" +msgstr "Не вдалося отримати дані щодо відтворення джерела: %s" + +#: ../src/utils/pactl.c:574 +#, c-format +msgid "" +"Source Output #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSource: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSource Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Відтворення джерела #%u\n" +"\tДрайвер: %s\n" +"\tМодуль власника: %s\n" +"\tКлієнт: %s\n" +"\tДжерело: %u\n" +"\tЧастотна специфікація: %s\n" +"\tКарта каналів: %s\n" +"\tЛатентність буфера: %0.0f мкс\n" +"\tЛатентність джерела: %0.0f мкс\n" +"\tСпосіб зміни частоти: %s\n" +"\tВластивості:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:605 +#, c-format +msgid "Failed to get sample information: %s" +msgstr "Не вдалося отримати дані щодо фрагмента: %s" + +#: ../src/utils/pactl.c:623 +#, c-format +msgid "" +"Sample #%u\n" +"\tName: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tDuration: %0.1fs\n" +"\tSize: %s\n" +"\tLazy: %s\n" +"\tFilename: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Фрагмент №%u\n" +"\tНазва: %s\n" +"\tЧастотна специфікація: %s\n" +"\tКарта каналів: %s\n" +"\tГучність: %s\n" +"\t %s\n" +"\t баланс %0.2f\n" +"\tТривалість: %0.1fs\n" +"\tРозмір: %s\n" +"\tЛінивість: %s\n" +"\tНазва файла: %s\n" +"\tВластивості:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663 +#, c-format +msgid "Failure: %s" +msgstr "Помилка: %s" + +#: ../src/utils/pactl.c:687 +#, c-format +msgid "Failed to upload sample: %s" +msgstr "Не вдалося вивантажити зразок: %s" + +#: ../src/utils/pactl.c:704 +msgid "Premature end of file" +msgstr "Передчасне завершення файла" + +#: ../src/utils/pactl.c:863 +msgid "Got SIGINT, exiting." +msgstr "Отримано сигнал SIGINT, завершення роботи." + +#: ../src/utils/pactl.c:869 +#, c-format +msgid "" +"%s [options] stat\n" +"%s [options] list\n" +"%s [options] exit\n" +"%s [options] upload-sample FILENAME [NAME]\n" +"%s [options] play-sample NAME [SINK]\n" +"%s [options] remove-sample NAME\n" +"%s [options] move-sink-input SINKINPUT SINK\n" +"%s [options] move-source-output SOURCEOUTPUT SOURCE\n" +"%s [options] load-module NAME [ARGS ...]\n" +"%s [options] unload-module MODULE\n" +"%s [options] suspend-sink SINK 1|0\n" +"%s [options] suspend-source SOURCE 1|0\n" +"%s [options] set-card-profile CARD PROFILE\n" +"%s [options] set-sink-port SINK PORT\n" +"%s [options] set-source-port SOURCE PORT\n" +"%s [options] set-sink-volume SINK VOLUME\n" +"%s [options] set-source-volume SOURCE VOLUME\n" +"%s [options] set-sink-input-volume SINKINPUT VOLUME\n" +"%s [options] set-sink-mute SINK 1|0\n" +"%s [options] set-source-mute SOURCE 1|0\n" +"%s [options] set-sink-input-mute SINKINPUT 1|0\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" +msgstr "" +"%s [параметри] stat\n" +"%s [параметри] list\n" +"%s [параметри] exit\n" +"%s [параметри] upload-sample НАЗВА_ФАЙЛА [НАЗВА]\n" +"%s [параметри] play-sample НАЗВА [ПРИЙМАЧ]\n" +"%s [параметри] remove-sample НАЗВА\n" +"%s [параметри] move-sink-input ІДЕНТИФІКАТОР ПРИЙМАЧ\n" +"%s [параметри] move-source-output ІДЕНТИФІКАТОР ДЖЕРЕЛО\n" +"%s [параметри] load-module НАЗВА [АРГУМЕНТИ ...]\n" +"%s [параметри] unload-module ІДЕНТИФІКАТОР\n" +"%s [параметри] suspend-sink ПРИЙМАЧ 1|0\n" +"%s [параметри] suspend-source ДЖЕРЕЛО 1|0\n" +"%s [параметри] set-card-profile КАРТА ПРОФІЛЬ \n" +"%s [параметри] set-sink-port ПРИЙМАЧ ПОРТ \n" +"%s [параметри] set-source-port ДЖЕРЕЛО ПОРТ\n" +"%s [параметри] set-sink-volume ПРИЙМАЧ ГУЧНІСТЬ\n" +"%s [параметри] set-source-volume ДЖЕРЕЛО ГУЧНІСТЬ\n" +"%s [параметри] set-sink-input-volume ВХІДПРИЙМАЧА ГУЧНІСТЬ\n" +"%s [параметри] set-sink-mute ПРИЙМАЧ 1|0\n" +"%s [параметри] set-source-mute ДЖЕРЕЛО 1|0\n" +"%s [параметри] set-sink-input-mute ВХІДПРИЙМАЧА 1|0\n" +"\n" +" -h, --help Показати цю довідку\n" +" --version Показати дані щодо версії\n" +"\n" +" -s, --server=СЕРВЕР Назва сервера, з яким слід " +"з’єднатися\n" +" -n, --client-name=НАЗВА Спосіб виклику клієнта на сервері\n" + +#: ../src/utils/pactl.c:933 +#, c-format +msgid "" +"pactl %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pactl %s\n" +"Зібрано з libpulse %s\n" +"З’єднано з libpulse %s\n" + +#: ../src/utils/pactl.c:979 +msgid "Please specify a sample file to load" +msgstr "Будь ласка, вкажіть зразковий файл для завантаження" + +#: ../src/utils/pactl.c:992 +msgid "Failed to open sound file." +msgstr "Не вдалося відкрити звуковий файл." + +#: ../src/utils/pactl.c:1004 +msgid "Warning: Failed to determine sample specification from file." +msgstr "" +"Попередження: не вдалося отримати дані щодо частотної специфікації з файла." + +#: ../src/utils/pactl.c:1014 +msgid "You have to specify a sample name to play" +msgstr "Вам слід вказати назву зразкового файла, який слід відтворити" + +#: ../src/utils/pactl.c:1026 +msgid "You have to specify a sample name to remove" +msgstr "Вам слід вказати назву зразкового файла, який слід вилучити" + +#: ../src/utils/pactl.c:1035 +msgid "You have to specify a sink input index and a sink" +msgstr "Вам слід вказати індекс приймача даних і приймач" + +#: ../src/utils/pactl.c:1045 +msgid "You have to specify a source output index and a source" +msgstr "Вам слід вказати індекс джерела відтворення і джерело" + +#: ../src/utils/pactl.c:1060 +msgid "You have to specify a module name and arguments." +msgstr "Вам слід вказати назву модуля і аргументи." + +#: ../src/utils/pactl.c:1080 +msgid "You have to specify a module index" +msgstr "Вам слід вказати індекс модуля" + +#: ../src/utils/pactl.c:1090 +msgid "" +"You may not specify more than one sink. You have to specify a boolean value." +msgstr "" +"Не можна вказувати більше одного приймача. Вам слід вказати булівське " +"значення." + +#: ../src/utils/pactl.c:1103 +msgid "" +"You may not specify more than one source. You have to specify a boolean " +"value." +msgstr "" +"Не можна вказувати більше одного джерела. Вам слід вказати булівське " +"значення." + +#: ../src/utils/pactl.c:1115 +msgid "You have to specify a card name/index and a profile name" +msgstr "Вам слід вказати назву/індекс карти і назву профілю" + +#: ../src/utils/pactl.c:1126 +msgid "You have to specify a sink name/index and a port name" +msgstr "Вам слід вказати назву/індекс приймача і назву порту" + +#: ../src/utils/pactl.c:1137 +msgid "You have to specify a source name/index and a port name" +msgstr "Вам слід вказати назву/індекс джерела і назву порту" + +#: ../src/utils/pactl.c:1149 +msgid "You have to specify a sink name/index and a volume" +msgstr "Вам слід вказати назву/індекс приймача і гучність" + +#: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171 +#: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209 +#: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248 +msgid "Invalid volume specification" +msgstr "Некоректна специфікація гучності" + +#: ../src/utils/pactl.c:1166 +msgid "You have to specify a source name/index and a volume" +msgstr "Вам слід вказати назву/індекс джерела і гучність" + +#: ../src/utils/pactl.c:1183 +msgid "You have to specify a sink input index and a volume" +msgstr "Вам слід вказати індекс приймача даних і гучність" + +#: ../src/utils/pactl.c:1188 +msgid "Invalid sink input index" +msgstr "Некоректний індекс вхідних даних приймача" + +#: ../src/utils/pactl.c:1204 +msgid "You have to specify a sink name/index and a mute boolean" +msgstr "Вам слід вказати назву/індекс приймача і булеве значення вимикання звуку" + +#: ../src/utils/pactl.c:1221 +msgid "You have to specify a source name/index and a mute boolean" +msgstr "Вам слід вказати назву/індекс джерела і булеве значення вимикання звуку" + +#: ../src/utils/pactl.c:1238 +msgid "You have to specify a sink input index and a mute boolean" +msgstr "Вам слід вказати індекс приймача даних і булеве значення вимикання звуку" + +#: ../src/utils/pactl.c:1243 +msgid "Invalid sink input index specification" +msgstr "Некоректна специфікація індексу приймача даних" + +#: ../src/utils/pactl.c:1262 +msgid "No valid command specified." +msgstr "Не вказано коректної команди." + +#: ../src/utils/pax11publish.c:61 +#, c-format +msgid "" +"%s [-D display] [-S server] [-O sink] [-I source] [-c file] [-d|-e|-i|-r]\n" +"\n" +" -d Show current PulseAudio data attached to X11 display (default)\n" +" -e Export local PulseAudio data to X11 display\n" +" -i Import PulseAudio data from X11 display to local environment " +"variables and cookie file.\n" +" -r Remove PulseAudio data from X11 display\n" +msgstr "" +"%s [-D клієнт] [-S сервер] [-O приймач] [-I джерело] [-c файл] [-d|-e|-i|-" +"r]\n" +"\n" +" -d Показати поточні дані PulseAudio, приєднаного до клієнта X11 " +"(типово)\n" +" -e Експортувати локальні дані PulseAudio на клієнт X11\n" +" -i Імпортувати дані PulseAudio з клієнта X11 до локальних змінних і " +"файла кук.\n" +" -r Вилучити дані PulseAudio з клієнта X11\n" + +#: ../src/utils/pax11publish.c:94 +#, c-format +msgid "Failed to parse command line.\n" +msgstr "Не вдалося обробити рядок команди.\n" + +#: ../src/utils/pax11publish.c:108 +#, c-format +msgid "Server: %s\n" +msgstr "Сервер: %s\n" + +#: ../src/utils/pax11publish.c:110 +#, c-format +msgid "Source: %s\n" +msgstr "Джерело: %s\n" + +#: ../src/utils/pax11publish.c:112 +#, c-format +msgid "Sink: %s\n" +msgstr "Приймач: %s\n" + +#: ../src/utils/pax11publish.c:114 +#, c-format +msgid "Cookie: %s\n" +msgstr "Кука: %s\n" + +#: ../src/utils/pax11publish.c:132 +#, c-format +msgid "Failed to parse cookie data\n" +msgstr "Не вдалося обробити дані куки\n" + +#: ../src/utils/pax11publish.c:137 +#, c-format +msgid "Failed to save cookie data\n" +msgstr "Не вдалося зберегти дані куки\n" + +#: ../src/utils/pax11publish.c:152 +#, c-format +msgid "Failed to load client configuration file.\n" +msgstr "Не вдалося завантажити файл налаштувань клієнта.\n" + +#: ../src/utils/pax11publish.c:157 +#, c-format +msgid "Failed to read environment configuration data.\n" +msgstr "Не вдалося прочитати дані налаштування середовища.\n" + +#: ../src/utils/pax11publish.c:174 +#, c-format +msgid "Failed to get FQDN.\n" +msgstr "Не вдалося отримати FQDN.\n" + +#: ../src/utils/pax11publish.c:194 +#, c-format +msgid "Failed to load cookie data\n" +msgstr "Не вдалося завантажити дані куки\n" + +#: ../src/utils/pax11publish.c:211 +#, c-format +msgid "Not yet implemented.\n" +msgstr "Ще не реалізовано.\n" + +#: ../src/utils/pacmd.c:69 +msgid "No PulseAudio daemon running, or not running as session daemon." +msgstr "" +"Фонову службу PulseAudio не запущено, або цю службу не запущено як фонову " +"службу сеансу." + +#: ../src/utils/pacmd.c:74 +#, c-format +msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s" +msgstr "socket(PF_UNIX, SOCK_STREAM, 0): %s" + +#: ../src/utils/pacmd.c:91 +#, c-format +msgid "connect(): %s" +msgstr "connect(): %s" + +#: ../src/utils/pacmd.c:99 +msgid "Failed to kill PulseAudio daemon." +msgstr "Спроба завершення роботи фонової служби PulseAudio завершилася невдало." + +#: ../src/utils/pacmd.c:107 +msgid "Daemon not responding." +msgstr "Фонова служба не відповідає." + +#: ../src/utils/pacmd.c:161 +#, c-format +msgid "poll(): %s" +msgstr "poll(): %s" + +#: ../src/utils/pacmd.c:171 ../src/utils/pacmd.c:188 +#, c-format +msgid "read(): %s" +msgstr "read(): %s" + +#: ../src/utils/pacmd.c:207 ../src/utils/pacmd.c:223 +#, c-format +msgid "write(): %s" +msgstr "write(): %s" + +#: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:219 +msgid "Cannot access autospawn lock." +msgstr "Не вдалося зняти блокування автоматичного розгалуження." + +#: ../src/modules/alsa/alsa-sink.c:530 ../src/modules/alsa/alsa-sink.c:689 +#, c-format +msgid "" +"ALSA woke us up to write new data to the device, but there was actually " +"nothing to write!\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers.\n" +"We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() " +"returned 0 or another value < min_avail." +msgstr "" +"ALSA викликала службу запису нових даних на пристрій, але насправді ніяких " +"даних для запису не виявлено!\n" +"Ймовірно, це пов’язано з вадою у драйвері ALSA «%s». Будь ласка, повідомте " +"про цю ваду розробникам ALSA.\n" +"Службу було викликано зі встановленим POLLOUT, але наступний виклик " +"snd_pcm_avail() повернув 0 або інше значення < min_avail." + +#: ../src/modules/alsa/alsa-source.c:506 ../src/modules/alsa/alsa-source.c:656 +#, c-format +msgid "" +"ALSA woke us up to read new data from the device, but there was actually " +"nothing to read!\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers.\n" +"We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() " +"returned 0 or another value < min_avail." +msgstr "" +"ALSA викликала службу читання нових даних з пристрою, але насправді ніяких " +"даних для читання не виявлено!\n" +"Ймовірно, це пов’язано з вадою у драйвері ALSA «%s». Будь ласка, повідомте " +"про цю ваду розробникам ALSA.\n" +"Службу було викликано зі встановленим POLLIN, але наступний виклик " +"snd_pcm_avail() повернув 0 або інше значення < min_avail." + +#: ../src/modules/alsa/module-alsa-card.c:152 +#: ../src/modules/bluetooth/module-bluetooth-device.c:2228 +#: ../src/modules/alsa/alsa-mixer.c:2931 +msgid "Off" +msgstr "Вимкнено" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2184 +msgid "High Fidelity Playback (A2DP)" +msgstr "Високоточне відтворення (A2DP)" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2198 +msgid "High Fidelity Capture (A2DP)" +msgstr "Високоточне захоплення (A2DP)" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2213 +msgid "Telephony Duplex (HSP/HFP)" +msgstr "Телефонний дуплекс (HSP/HFP)" + +#: ../src/modules/reserve-wrap.c:151 +msgid "PulseAudio Sound Server" +msgstr "Звуковий сервер PulseAudio" + +#: ../src/modules/module-rygel-media-server.c:569 +#: ../src/modules/module-rygel-media-server.c:583 +msgid "Output Devices" +msgstr "Пристрої відтворення" + +#: ../src/modules/module-rygel-media-server.c:570 +#: ../src/modules/module-rygel-media-server.c:584 +msgid "Input Devices" +msgstr "Пристрої отримання" + +#: ../src/modules/module-rygel-media-server.c:774 +msgid "Audio on @HOSTNAME@" +msgstr "Звук на @НАЗВАВУЗЛА@" + +#: ../src/modules/alsa/alsa-mixer.c:1701 +msgid "Input" +msgstr "Вхід" + +#: ../src/modules/alsa/alsa-mixer.c:1702 +msgid "Docking Station Input" +msgstr "Вхідний канал стикувальної станції" + +#: ../src/modules/alsa/alsa-mixer.c:1703 +msgid "Docking Station Microphone" +msgstr "Мікрофон стикувальної станції" + +#: ../src/modules/alsa/alsa-mixer.c:1704 +msgid "Line-In" +msgstr "Лінійний вхід" + +#: ../src/modules/alsa/alsa-mixer.c:1705 +msgid "Microphone" +msgstr "Мікрофон" + +#: ../src/modules/alsa/alsa-mixer.c:1706 +msgid "External Microphone" +msgstr "Зовнішній мікрофон" + +#: ../src/modules/alsa/alsa-mixer.c:1707 +msgid "Internal Microphone" +msgstr "Вбудований мікрофон" + +#: ../src/modules/alsa/alsa-mixer.c:1708 +msgid "Radio" +msgstr "Радіо" + +#: ../src/modules/alsa/alsa-mixer.c:1709 +msgid "Video" +msgstr "Відео" + +#: ../src/modules/alsa/alsa-mixer.c:1710 +msgid "Automatic Gain Control" +msgstr "Автоматичне керування підсиленням" + +#: ../src/modules/alsa/alsa-mixer.c:1711 +msgid "No Automatic Gain Control" +msgstr "Без автоматичного керування підсиленням" + +#: ../src/modules/alsa/alsa-mixer.c:1712 +msgid "Boost" +msgstr "Підсилення" + +#: ../src/modules/alsa/alsa-mixer.c:1713 +msgid "No Boost" +msgstr "Без пісилення" + +#: ../src/modules/alsa/alsa-mixer.c:1714 +msgid "Amplifier" +msgstr "Підсилювач" + +#: ../src/modules/alsa/alsa-mixer.c:1715 +msgid "No Amplifier" +msgstr "Без підсилювача" + +#: ../src/modules/alsa/alsa-mixer.c:1773 +msgid "Analog Input" +msgstr "Аналогових вхід" + +#: ../src/modules/alsa/alsa-mixer.c:1774 +msgid "Analog Microphone" +msgstr "Аналоговий мікрофон" + +#: ../src/modules/alsa/alsa-mixer.c:1775 +msgid "Analog Line-In" +msgstr "Аналоговий лінійний вхід" + +#: ../src/modules/alsa/alsa-mixer.c:1776 +msgid "Analog Radio" +msgstr "Аналогове радіо" + +#: ../src/modules/alsa/alsa-mixer.c:1777 +msgid "Analog Video" +msgstr "Аналогове відео" + +#: ../src/modules/alsa/alsa-mixer.c:1778 +msgid "Analog Output" +msgstr "Аналогове відтворення" + +#: ../src/modules/alsa/alsa-mixer.c:1779 +msgid "Analog Headphones" +msgstr "Аналогові навушники" + +#: ../src/modules/alsa/alsa-mixer.c:1780 +msgid "Analog Output (LFE)" +msgstr "Аналоговий вихід (сабвуфер)" + +#: ../src/modules/alsa/alsa-mixer.c:1781 +msgid "Analog Mono Output" +msgstr "Аналоговий моно-вихід" + +#: ../src/modules/alsa/alsa-mixer.c:1981, c-format +msgid "%s+%s" +msgstr "%s+%s" + +#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404, c-format +msgid "%s / %s" +msgstr "%s / %s" + +#: ../src/modules/alsa/alsa-mixer.c:2790 +msgid "Analog Mono" +msgstr "Аналогове моно" + +#: ../src/modules/alsa/alsa-mixer.c:2791 +msgid "Analog Stereo" +msgstr "Аналогове стерео" + +#: ../src/modules/alsa/alsa-mixer.c:2792 +msgid "Analog Surround 2.1" +msgstr "Аналоговий об'ємний 2.1" + +#: ../src/modules/alsa/alsa-mixer.c:2793 +msgid "Analog Surround 3.0" +msgstr "Аналоговий об'ємний 3.0" + +#: ../src/modules/alsa/alsa-mixer.c:2794 +msgid "Analog Surround 3.1" +msgstr "Аналоговий об'ємний 3.1" + +#: ../src/modules/alsa/alsa-mixer.c:2795 +msgid "Analog Surround 4.0" +msgstr "Аналоговий об'ємний 4.0" + +#: ../src/modules/alsa/alsa-mixer.c:2796 +msgid "Analog Surround 4.1" +msgstr "Аналоговий об'ємний 4.1" + +#: ../src/modules/alsa/alsa-mixer.c:2797 +msgid "Analog Surround 5.0" +msgstr "Аналоговий об'ємний 5.0" + +#: ../src/modules/alsa/alsa-mixer.c:2798 +msgid "Analog Surround 5.1" +msgstr "Аналоговий об'ємний 5.1" + +#: ../src/modules/alsa/alsa-mixer.c:2799 +msgid "Analog Surround 6.0" +msgstr "Аналоговий об'ємний 6.0" + +#: ../src/modules/alsa/alsa-mixer.c:2800 +msgid "Analog Surround 6.1" +msgstr "Аналоговий об'ємний 6.1" + +#: ../src/modules/alsa/alsa-mixer.c:2801 +msgid "Analog Surround 7.0" +msgstr "Аналоговий об'ємний 7.0" + +#: ../src/modules/alsa/alsa-mixer.c:2802 +msgid "Analog Surround 7.1" +msgstr "Аналоговий об'ємний 7.1" + +#: ../src/modules/alsa/alsa-mixer.c:2803 +msgid "Digital Stereo (IEC958)" +msgstr "Цифрове стерео (IEC958)" + +#: ../src/modules/alsa/alsa-mixer.c:2804 +msgid "Digital Surround 4.0 (IEC958)" +msgstr "Цифровий об’ємний 4.0 (IEC958)" + +#: ../src/modules/alsa/alsa-mixer.c:2805 +msgid "Digital Surround 4.0 (IEC958/AC3)" +msgstr "Цифровий об’ємний 4.0 (IEC958/AC3)" + +#: ../src/modules/alsa/alsa-mixer.c:2806 +msgid "Digital Surround 5.1 (IEC958/AC3)" +msgstr "Цифровий об’ємний 5.1 (IEC958/AC3)" + +#: ../src/modules/alsa/alsa-mixer.c:2807 +msgid "Digital Stereo (HDMI)" +msgstr "Цифровий стерео (HDMI)" + +#: ../src/modules/alsa/alsa-mixer.c:2928 +msgid "Analog Mono Duplex" +msgstr "Аналогове двобічне моно" + +#: ../src/modules/alsa/alsa-mixer.c:2929 +msgid "Analog Stereo Duplex" +msgstr "Аналогове двобічне стерео" + +#: ../src/modules/alsa/alsa-mixer.c:2930 +msgid "Digital Stereo Duplex (IEC958)" +msgstr "Цифрове двобічне стерео (IEC958)" + diff --git a/po/zh_CN.po b/po/zh_CN.po new file mode 100644 index 0000000..a273066 --- /dev/null +++ b/po/zh_CN.po @@ -0,0 +1,2755 @@ +# translation of pulseaudio.master-tx.po to Simplified Chinese +# 简体中文翻译 +# Copyright (C) 2008 THE 'S COPYRIGHT HOLDER +# This file is distributed under the same license as the package. +# 闫丰刚 (sainry) 2008 +# +# +# 闫丰刚 , 2009. +# Leah Liu , 2009. +msgid "" +msgstr "" +"Project-Id-Version: pulseaudio.master-tx\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-09-29 23:47+0200\n" +"PO-Revision-Date: 2009-04-06 10:26+1000\n" +"Last-Translator: Leah Liu \n" +"Language-Team: Simplified Chinese \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" + +#: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629 +#, c-format +msgid "%s %s" +msgstr "" + +#: ../src/modules/alsa/alsa-util.c:1106 +#, c-format +msgid "" +"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu " +"ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_avail() 返回的值非常大:%lu 字节(%lu ms)。\n" +"很可能是 ALSA 驱动程序 '%s' 中的 bug。请向 ALSA 开发者举报这个问题。" + +#: ../src/modules/alsa/alsa-util.c:1147 +#, c-format +msgid "" +"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%" +"lu ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_delay() 返回的值非常大:%li 字节(%s%lu ms)。\n" +"很可能是 ALSA 驱动程序 '%s' 中的 bug。请向 ALSA 开发者举报这个问题。" + +#: ../src/modules/alsa/alsa-util.c:1194 +#, c-format +msgid "" +"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes " +"(%lu ms).\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers." +msgstr "" +"snd_pcm_mmap_begin() 返回的值非常大:%lu 字节(%lu ms)。\n" +"很可能是 ALSA 驱动程序 '%s' 中的 bug。请向 ALSA 开发者举报这个问题。" + +#: ../src/modules/module-always-sink.c:39 +msgid "Always keeps at least one sink loaded even if it's a null one" +msgstr "" + +#: ../src/modules/module-always-sink.c:83 +msgid "Dummy Output" +msgstr "" + +#: ../src/modules/module-ladspa-sink.c:49 +msgid "Virtual LADSPA sink" +msgstr "" + +#: ../src/modules/module-ladspa-sink.c:53 +msgid "" +"sink_name= sink_properties= " +"master= format= rate= " +"channels= channel_map= plugin= label= control=" +msgstr "" + +#: ../src/modules/module-null-sink.c:55 +msgid "Clocked NULL sink" +msgstr "" + +#: ../src/modules/module-null-sink.c:291 +#, fuzzy +msgid "Null Output" +msgstr "输出 %s" + +#: ../src/pulsecore/sink.c:2613 +msgid "Internal Audio" +msgstr "内部音频" + +#: ../src/pulsecore/sink.c:2618 +msgid "Modem" +msgstr "调制解调器" + +#: ../src/daemon/ltdl-bind-now.c:124 +msgid "Failed to find original lt_dlopen loader." +msgstr "查找原始 lt_dlopen 加载器失败。" + +#: ../src/daemon/ltdl-bind-now.c:129 +msgid "Failed to allocate new dl loader." +msgstr "分配新的 dl 加载器失败。" + +#: ../src/daemon/ltdl-bind-now.c:142 +msgid "Failed to add bind-now-loader." +msgstr "添加 bind-now-loader 失败。" + +#: ../src/daemon/main.c:141 +#, c-format +msgid "Got signal %s." +msgstr "获得信号%s" + +#: ../src/daemon/main.c:168 +msgid "Exiting." +msgstr "退出" + +#: ../src/daemon/main.c:186 +#, c-format +msgid "Failed to find user '%s'." +msgstr "找不到用户 `%s' " + +#: ../src/daemon/main.c:191 +#, c-format +msgid "Failed to find group '%s'." +msgstr "找不到用户组 `%s'" + +#: ../src/daemon/main.c:195 +#, c-format +msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)." +msgstr "发现用户'%s' (UID %lu)和组'%s' (GID %lu)." + +#: ../src/daemon/main.c:200 +#, c-format +msgid "GID of user '%s' and of group '%s' don't match." +msgstr "用户'%s'与组'%s'的GID不匹配." + +#: ../src/daemon/main.c:205 +#, c-format +msgid "Home directory of user '%s' is not '%s', ignoring." +msgstr "用户'%s'的主文件夹不是'%s',忽略。" + +#: ../src/daemon/main.c:208 ../src/daemon/main.c:213 +#, c-format +msgid "Failed to create '%s': %s" +msgstr "创建'%s'失败: %s" + +#: ../src/daemon/main.c:220 +#, c-format +msgid "Failed to change group list: %s" +msgstr "更改组列表失败:%s" + +#: ../src/daemon/main.c:236 +#, c-format +msgid "Failed to change GID: %s" +msgstr "更改GID失败:%s" + +#: ../src/daemon/main.c:252 +#, c-format +msgid "Failed to change UID: %s" +msgstr "更改UID失败:%s" + +#: ../src/daemon/main.c:271 +msgid "Successfully dropped root privileges." +msgstr "成功放弃root权限。" + +#: ../src/daemon/main.c:279 +msgid "System wide mode unsupported on this platform." +msgstr "此平台不支持system-wide模式。" + +#: ../src/daemon/main.c:297 +#, c-format +msgid "setrlimit(%s, (%u, %u)) failed: %s" +msgstr "setrlimit(%s, (%u, %u)) 失败:%s" + +#: ../src/daemon/main.c:474 +msgid "Failed to parse command line." +msgstr "分析命令行失败。" + +#: ../src/daemon/main.c:541 +msgid "Daemon not running" +msgstr "后台程序没有运行" + +#: ../src/daemon/main.c:543 +#, c-format +msgid "Daemon running as PID %u" +msgstr "后台程序正在运行,PID %u" + +#: ../src/daemon/main.c:553 +#, c-format +msgid "Failed to kill daemon: %s" +msgstr "杀死后台程序失败:%s" + +#: ../src/daemon/main.c:571 +msgid "" +"This program is not intended to be run as root (unless --system is " +"specified)." +msgstr "不应以root身份运行本程序(除非指定 --system)。" + +#: ../src/daemon/main.c:573 +msgid "Root privileges required." +msgstr "需要 root 权限。" + +#: ../src/daemon/main.c:578 +msgid "--start not supported for system instances." +msgstr "系统实例不支持 --start。" + +#: ../src/daemon/main.c:583 +msgid "Running in system mode, but --disallow-exit not set!" +msgstr "正在以系统模式运行,但是 --disallow-exit 未设定!" + +#: ../src/daemon/main.c:586 +msgid "Running in system mode, but --disallow-module-loading not set!" +msgstr "正在以系统模式运行,但是 --disallow-module-loading 未设定!" + +#: ../src/daemon/main.c:589 +msgid "Running in system mode, forcibly disabling SHM mode!" +msgstr "正在以系统模式运行,强制禁用SHM模式!" + +#: ../src/daemon/main.c:594 +msgid "Running in system mode, forcibly disabling exit idle time!" +msgstr "正在以系统模式运行,强制禁用退出空闲时间!" + +#: ../src/daemon/main.c:621 +msgid "Failed to acquire stdio." +msgstr "获取stdio失败。" + +#: ../src/daemon/main.c:627 +#, c-format +msgid "pipe failed: %s" +msgstr "管道失败:%s" + +#: ../src/daemon/main.c:632 +#, c-format +msgid "fork() failed: %s" +msgstr "fork()失败:%s" + +#: ../src/daemon/main.c:646 ../src/utils/pacat.c:508 +#, c-format +msgid "read() failed: %s" +msgstr "read()失败:%s" + +#: ../src/daemon/main.c:652 +msgid "Daemon startup failed." +msgstr "后台程序启动失败。" + +#: ../src/daemon/main.c:654 +msgid "Daemon startup successful." +msgstr "后台程序启动成功。" + +#: ../src/daemon/main.c:731 +#, c-format +msgid "This is PulseAudio %s" +msgstr "这是 PulseAudio %s" + +#: ../src/daemon/main.c:732 +#, c-format +msgid "Compilation host: %s" +msgstr "编译主机:%s" + +#: ../src/daemon/main.c:733 +#, c-format +msgid "Compilation CFLAGS: %s" +msgstr "编译CFLAGS:%s" + +#: ../src/daemon/main.c:736 +#, c-format +msgid "Running on host: %s" +msgstr "正在主机上运行:%s" + +#: ../src/daemon/main.c:739 +#, c-format +msgid "Found %u CPUs." +msgstr "找到 %u CPU。" + +#: ../src/daemon/main.c:741 +#, c-format +msgid "Page size is %lu bytes" +msgstr "页面大小为%lu字节" + +#: ../src/daemon/main.c:744 +msgid "Compiled with Valgrind support: yes" +msgstr "编译启用Valgrind支持:是" + +#: ../src/daemon/main.c:746 +msgid "Compiled with Valgrind support: no" +msgstr "编译启用Valgrind支持:否" + +#: ../src/daemon/main.c:749 +#, c-format +msgid "Running in valgrind mode: %s" +msgstr "正在以valgrind模式运行:%s" + +#: ../src/daemon/main.c:752 +msgid "Optimized build: yes" +msgstr "优化生成:是" + +#: ../src/daemon/main.c:754 +msgid "Optimized build: no" +msgstr "优化生成:否" + +#: ../src/daemon/main.c:758 +msgid "NDEBUG defined, all asserts disabled." +msgstr "拒绝 NDEBUG,禁用所有 assert" + +#: ../src/daemon/main.c:760 +msgid "FASTPATH defined, only fast path asserts disabled." +msgstr "拒绝 FASTPATH,只禁用快速路径 assert。" + +#: ../src/daemon/main.c:762 +msgid "All asserts enabled." +msgstr "启用所有 assert。" + +#: ../src/daemon/main.c:766 +msgid "Failed to get machine ID" +msgstr "获取machine ID失败" + +#: ../src/daemon/main.c:769 +#, c-format +msgid "Machine ID is %s." +msgstr "machine ID是%s。" + +#: ../src/daemon/main.c:773 +#, fuzzy, c-format +msgid "Session ID is %s." +msgstr "machine ID是%s。" + +#: ../src/daemon/main.c:779 +#, c-format +msgid "Using runtime directory %s." +msgstr "正在使用运行时文件夹%s。" + +#: ../src/daemon/main.c:784 +#, c-format +msgid "Using state directory %s." +msgstr "正在使用状态文件夹%s。" + +#: ../src/daemon/main.c:787 +#, fuzzy, c-format +msgid "Using modules directory %s." +msgstr "正在使用运行时文件夹%s。" + +#: ../src/daemon/main.c:789 +#, c-format +msgid "Running in system mode: %s" +msgstr "正在以系统模式运行:%s" + +#: ../src/daemon/main.c:792 +msgid "" +"OK, so you are running PA in system mode. Please note that you most likely " +"shouldn't be doing that.\n" +"If you do it nonetheless then it's your own fault if things don't work as " +"expected.\n" +"Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an " +"explanation why system mode is usually a bad idea." +msgstr "" + +#: ../src/daemon/main.c:809 +msgid "pa_pid_file_create() failed." +msgstr "pa_pid_file_create()失败。" + +#: ../src/daemon/main.c:819 +msgid "Fresh high-resolution timers available! Bon appetit!" +msgstr "新鲜的高分辨率计时器开锅了!吃个饱!" + +#: ../src/daemon/main.c:821 +msgid "" +"Dude, your kernel stinks! The chef's recommendation today is Linux with high-" +"resolution timers enabled!" +msgstr "老兄,你的内核真臭!现在流行的是启用了高分辩率计分器的Linux!" + +#: ../src/daemon/main.c:844 +msgid "pa_core_new() failed." +msgstr "pa_core_new()失败。" + +#: ../src/daemon/main.c:904 +msgid "Failed to initialize daemon." +msgstr "后台程序初始化失败。" + +#: ../src/daemon/main.c:909 +msgid "Daemon startup without any loaded modules, refusing to work." +msgstr "后台程序启动未加载任何模块,拒绝工作。" + +#: ../src/daemon/main.c:926 +msgid "Daemon startup complete." +msgstr "后台程序启动完成。" + +#: ../src/daemon/main.c:932 +msgid "Daemon shutdown initiated." +msgstr "开始关闭后台程序。" + +#: ../src/daemon/main.c:954 +msgid "Daemon terminated." +msgstr "后台程序已终止。" + +#: ../src/daemon/cmdline.c:115 +#, c-format +msgid "" +"%s [options]\n" +"\n" +"COMMANDS:\n" +" -h, --help Show this help\n" +" --version Show version\n" +" --dump-conf Dump default configuration\n" +" --dump-modules Dump list of available modules\n" +" --dump-resample-methods Dump available resample methods\n" +" --cleanup-shm Cleanup stale shared memory " +"segments\n" +" --start Start the daemon if it is not " +"running\n" +" -k --kill Kill a running daemon\n" +" --check Check for a running daemon (only " +"returns exit code)\n" +"\n" +"OPTIONS:\n" +" --system[=BOOL] Run as system-wide instance\n" +" -D, --daemonize[=BOOL] Daemonize after startup\n" +" --fail[=BOOL] Quit when startup fails\n" +" --high-priority[=BOOL] Try to set high nice level\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_NICE)\n" +" --realtime[=BOOL] Try to enable realtime scheduling\n" +" (only available as root, when SUID " +"or\n" +" with elevated RLIMIT_RTPRIO)\n" +" --disallow-module-loading[=BOOL] Disallow module user requested " +"module\n" +" loading/unloading after startup\n" +" --disallow-exit[=BOOL] Disallow user requested exit\n" +" --exit-idle-time=SECS Terminate the daemon when idle and " +"this\n" +" time passed\n" +" --module-idle-time=SECS Unload autoloaded modules when idle " +"and\n" +" this time passed\n" +" --scache-idle-time=SECS Unload autoloaded samples when idle " +"and\n" +" this time passed\n" +" --log-level[=LEVEL] Increase or set verbosity level\n" +" -v Increase the verbosity level\n" +" --log-target={auto,syslog,stderr} Specify the log target\n" +" --log-meta[=BOOL] Include code location in log " +"messages\n" +" --log-time[=BOOL] Include timestamps in log messages\n" +" --log-backtrace=FRAMES Include a backtrace in log messages\n" +" -p, --dl-search-path=PATH Set the search path for dynamic " +"shared\n" +" objects (plugins)\n" +" --resample-method=METHOD Use the specified resampling method\n" +" (See --dump-resample-methods for\n" +" possible values)\n" +" --use-pid-file[=BOOL] Create a PID file\n" +" --no-cpu-limit[=BOOL] Do not install CPU load limiter on\n" +" platforms that support it.\n" +" --disable-shm[=BOOL] Disable shared memory support.\n" +"\n" +"STARTUP SCRIPT:\n" +" -L, --load=\"MODULE ARGUMENTS\" Load the specified plugin module " +"with\n" +" the specified argument\n" +" -F, --file=FILENAME Run the specified script\n" +" -C Open a command line on the running " +"TTY\n" +" after startup\n" +"\n" +" -n Don't load default script file\n" +msgstr "" +"%s [options]\n" +"\n" +"COMMANDS:\n" +" -h, --help 显示此帮助\n" +" --version 显示版本号\n" +" --dump-conf 转储默认设置\n" +" --dump-modules 转储可用的模块列表\n" +" --dump-resample-methods 转储可用的重采样方法\n" +" --cleanup-shm 清理滞留的共享内存段\n" +" --start 如果后台程序没有运行则启动后台程序\n" +" -k --kill 杀死运行中的后台程序\n" +" --check 检查运行中的后台程序\n" +"\n" +"OPTIONS:\n" +" --system[=BOOL] 作为系统范围事件运行\n" +" -D, --daemonize[=BOOL] 启动后转为后台运行\n" +" --fail[=BOOL] 启动失败则退出\n" +" --high-priority[=BOOL] 尝试设定高nice level\n" +" (仅以root运行时,处于SUID或者\n" +" 在RLIMIT_NICE提升时可用)\n" +" --realtime[=BOOL] 尝试启用实时调度\n" +" (仅以root运行时,处于SUID或者\n" +" 在RLIMIT_PTPRIO提升时可用)\n" +" --disallow-module-loading[=BOOL] 启动后不批准模块用户的\n" +" 加载/卸载请求\n" +" --disallow-exit[=BOOL] 不批准用户的退出请求\n" +" --exit-idle-time=SECS 空闲指定时长后终止后台程序\n" +" --module-idle-time=SECS 空闲指定时长后卸载\n" +" 自动加载的模块\n" +" --scache-idle-time=SECS 空闲指定时长后卸载\n" +" 自动加载的样品\n" +" --log-level[=LEVEL] 提高或者设定verbosity level\n" +" -v 提高verbosity level\n" +" --log-target={auto,syslog,stderr} 提定日志目标\n" +" -p, --dl-search-path=PATH 为动态共享对象(插件)设定\n" +" 搜索路径\n" +" --resample-method=METHOD 使用指定的重采样方法\n" +" (使用 --dump-resample-methods 查看\n" +" 可能的值)\n" +" --use-pid-file[=BOOL] 创建一个PID文件\n" +" --no-cpu-limit[=BOOL] 不在支持它的平台中安装 CPU 载入限制程" +"序。\n" +" --disable-shm" +"[=BOOL] 禁用共享内存支持\n" +"\n" +"STARTUP SCRIPT:\n" +" -L, --load=\"MODULE ARGUMENTS\" 用指令参数加载\n" +" 指定插件模块\n" +" -F, --file=FILENAME 运行指定脚本\n" +" -C 启动后在运行的虚拟终端上\n" +" 打开命令行\n" +"\n" +" -n 不加载默认的脚本文件\n" + +#: ../src/daemon/cmdline.c:247 +msgid "--daemonize expects boolean argument" +msgstr "--daemonize 期待布尔参数" + +#: ../src/daemon/cmdline.c:254 +msgid "--fail expects boolean argument" +msgstr "--fail 期待布尔参数" + +#: ../src/daemon/cmdline.c:264 +msgid "" +"--log-level expects log level argument (either numeric in range 0..4 or one " +"of debug, info, notice, warn, error)." +msgstr "" +"--log-level 期待日志级别参数(可以是数字0~4或者debug,info,notice,warn," +"error中的一个)" + +#: ../src/daemon/cmdline.c:276 +msgid "--high-priority expects boolean argument" +msgstr "--high-priority 期待布尔参数" + +#: ../src/daemon/cmdline.c:283 +msgid "--realtime expects boolean argument" +msgstr "--realtime 期待布尔参数" + +#: ../src/daemon/cmdline.c:290 +msgid "--disallow-module-loading expects boolean argument" +msgstr "--disallow-module-loading 期待布尔参数" + +#: ../src/daemon/cmdline.c:297 +msgid "--disallow-exit expects boolean argument" +msgstr "--disallow-exit 需要布尔值参数" + +#: ../src/daemon/cmdline.c:304 +msgid "--use-pid-file expects boolean argument" +msgstr "--use-pid-file 期待布尔参数" + +#: ../src/daemon/cmdline.c:321 +msgid "Invalid log target: use either 'syslog', 'stderr' or 'auto'." +msgstr "无效的日志目标:从syslog,stderr和auto中选取一个" + +#: ../src/daemon/cmdline.c:328 +msgid "--log-time expects boolean argument" +msgstr "--log-time 需要布尔值参数" + +#: ../src/daemon/cmdline.c:335 +msgid "--log-meta expects boolean argument" +msgstr "--log-meta 需要布尔值参数" + +#: ../src/daemon/cmdline.c:354 +#, c-format +msgid "Invalid resample method '%s'." +msgstr "无效的重采样方法'%s'。" + +#: ../src/daemon/cmdline.c:361 +msgid "--system expects boolean argument" +msgstr "--system 期待布尔参数" + +#: ../src/daemon/cmdline.c:368 +msgid "--no-cpu-limit expects boolean argument" +msgstr "--no-cpu-limit 期待布尔参数" + +#: ../src/daemon/cmdline.c:375 +msgid "--disable-shm expects boolean argument" +msgstr "--disable-shm 期待布尔参数" + +#: ../src/daemon/dumpmodules.c:60 +#, c-format +msgid "Name: %s\n" +msgstr "名称:%s\n" + +#: ../src/daemon/dumpmodules.c:63 +#, c-format +msgid "No module information available\n" +msgstr "没有可用的模块信息\n" + +#: ../src/daemon/dumpmodules.c:66 +#, c-format +msgid "Version: %s\n" +msgstr "版本号:%s\n" + +#: ../src/daemon/dumpmodules.c:68 +#, c-format +msgid "Description: %s\n" +msgstr "描述:%s\n" + +#: ../src/daemon/dumpmodules.c:70 +#, c-format +msgid "Author: %s\n" +msgstr "作者:%s\n" + +#: ../src/daemon/dumpmodules.c:72 +#, c-format +msgid "Usage: %s\n" +msgstr "用法:%s\n" + +#: ../src/daemon/dumpmodules.c:73 +#, c-format +msgid "Load Once: %s\n" +msgstr "加载一次:%s\n" + +#: ../src/daemon/dumpmodules.c:75 +#, c-format +msgid "DEPRECATION WARNING: %s\n" +msgstr "" + +#: ../src/daemon/dumpmodules.c:79 +#, c-format +msgid "Path: %s\n" +msgstr "路径:%s\n" + +#: ../src/daemon/daemon-conf.c:232 +#, c-format +msgid "[%s:%u] Invalid log target '%s'." +msgstr "[%s:%u] 无效的日志目标'%s'。" + +#: ../src/daemon/daemon-conf.c:248 +#, c-format +msgid "[%s:%u] Invalid log level '%s'." +msgstr "[%s:%u] 无效的日志级别'%s'。" + +#: ../src/daemon/daemon-conf.c:264 +#, c-format +msgid "[%s:%u] Invalid resample method '%s'." +msgstr "[%s:%u] 无效的重采样方法'%s'。" + +#: ../src/daemon/daemon-conf.c:287 +#, c-format +msgid "[%s:%u] Invalid rlimit '%s'." +msgstr "[%s:%u] 无效的rlimit '%s'。" + +#: ../src/daemon/daemon-conf.c:294 +#, c-format +msgid "[%s:%u] rlimit not supported on this platform." +msgstr "[%s:%u] 此平台不支持rlimit。" + +#: ../src/daemon/daemon-conf.c:310 +#, c-format +msgid "[%s:%u] Invalid sample format '%s'." +msgstr "[%s:%u] 无效的样品格式'%s'。" + +#: ../src/daemon/daemon-conf.c:328 +#, c-format +msgid "[%s:%u] Invalid sample rate '%s'." +msgstr "[%s:%u] 无效的样品率'%s'。" + +#: ../src/daemon/daemon-conf.c:352 +#, c-format +msgid "[%s:%u] Invalid sample channels '%s'." +msgstr "[%s:%u] 无效的样品通道'%s'。" + +#: ../src/daemon/daemon-conf.c:370 +#, c-format +msgid "[%s:%u] Invalid channel map '%s'." +msgstr "[%s:%u] 无效频道地图 '%s'。" + +#: ../src/daemon/daemon-conf.c:388 +#, c-format +msgid "[%s:%u] Invalid number of fragments '%s'." +msgstr "[%s:%u] 无效的分段数'%s'。" + +#: ../src/daemon/daemon-conf.c:406 +#, c-format +msgid "[%s:%u] Invalid fragment size '%s'." +msgstr "[%s:%u] 无效的分段大小'%s'。" + +#: ../src/daemon/daemon-conf.c:424 +#, c-format +msgid "[%s:%u] Invalid nice level '%s'." +msgstr "[%s:%u] 无效的nice level '%s'。" + +#: ../src/daemon/daemon-conf.c:546 +#, c-format +msgid "Failed to open configuration file: %s" +msgstr "打开配置文件失败:%s" + +#: ../src/daemon/daemon-conf.c:562 +msgid "" +"The specified default channel map has a different number of channels than " +"the specified default number of channels." +msgstr "指定的默认频道地图的频道数与指定的默认频道数不同。" + +#: ../src/daemon/daemon-conf.c:638 +#, c-format +msgid "### Read from configuration file: %s ###\n" +msgstr "### 从配置文件读取:%s ###\n" + +#: ../src/daemon/caps.c:62 +#, fuzzy +msgid "Cleaning up privileges." +msgstr "正在取消 root 特权。" + +#: ../src/daemon/pulseaudio.desktop.in.h:1 +msgid "PulseAudio Sound System" +msgstr "PulseAudio 声音系统" + +#: ../src/daemon/pulseaudio.desktop.in.h:2 +msgid "Start the PulseAudio Sound System" +msgstr "启动 PulseAudio 声音系统" + +#: ../src/pulse/channelmap.c:105 ../src/pulse/channelmap.c:757 +msgid "Mono" +msgstr "单声道" + +#: ../src/pulse/channelmap.c:107 +msgid "Front Center" +msgstr "中前" + +#: ../src/pulse/channelmap.c:108 +msgid "Front Left" +msgstr "左前" + +#: ../src/pulse/channelmap.c:109 +msgid "Front Right" +msgstr "右前" + +#: ../src/pulse/channelmap.c:111 +msgid "Rear Center" +msgstr "中后" + +#: ../src/pulse/channelmap.c:112 +msgid "Rear Left" +msgstr "左后" + +#: ../src/pulse/channelmap.c:113 +msgid "Rear Right" +msgstr "右后" + +#: ../src/pulse/channelmap.c:115 +msgid "Low Frequency Emmiter" +msgstr "低频脉冲" + +#: ../src/pulse/channelmap.c:117 +msgid "Front Left-of-center" +msgstr "前左中央" + +#: ../src/pulse/channelmap.c:118 +msgid "Front Right-of-center" +msgstr "前右中央" + +#: ../src/pulse/channelmap.c:120 +msgid "Side Left" +msgstr "左侧" + +#: ../src/pulse/channelmap.c:121 +msgid "Side Right" +msgstr "右侧" + +#: ../src/pulse/channelmap.c:123 +msgid "Auxiliary 0" +msgstr "辅助 0" + +#: ../src/pulse/channelmap.c:124 +msgid "Auxiliary 1" +msgstr "辅助 1" + +#: ../src/pulse/channelmap.c:125 +msgid "Auxiliary 2" +msgstr "辅助 2" + +#: ../src/pulse/channelmap.c:126 +msgid "Auxiliary 3" +msgstr "辅助 3" + +#: ../src/pulse/channelmap.c:127 +msgid "Auxiliary 4" +msgstr "辅助 4" + +#: ../src/pulse/channelmap.c:128 +msgid "Auxiliary 5" +msgstr "辅助 5" + +#: ../src/pulse/channelmap.c:129 +msgid "Auxiliary 6" +msgstr "辅助 6" + +#: ../src/pulse/channelmap.c:130 +msgid "Auxiliary 7" +msgstr "辅助 7" + +#: ../src/pulse/channelmap.c:131 +msgid "Auxiliary 8" +msgstr "辅助 7" + +#: ../src/pulse/channelmap.c:132 +msgid "Auxiliary 9" +msgstr "辅助 9" + +#: ../src/pulse/channelmap.c:133 +msgid "Auxiliary 10" +msgstr "辅助 10" + +#: ../src/pulse/channelmap.c:134 +msgid "Auxiliary 11" +msgstr "辅助 11" + +#: ../src/pulse/channelmap.c:135 +msgid "Auxiliary 12" +msgstr "辅助 12" + +#: ../src/pulse/channelmap.c:136 +msgid "Auxiliary 13" +msgstr "辅助 13" + +#: ../src/pulse/channelmap.c:137 +msgid "Auxiliary 14" +msgstr "辅助 14" + +#: ../src/pulse/channelmap.c:138 +msgid "Auxiliary 15" +msgstr "辅助 15" + +#: ../src/pulse/channelmap.c:139 +msgid "Auxiliary 16" +msgstr "辅助 16" + +#: ../src/pulse/channelmap.c:140 +msgid "Auxiliary 17" +msgstr "辅助 17" + +#: ../src/pulse/channelmap.c:141 +msgid "Auxiliary 18" +msgstr "辅助 18" + +#: ../src/pulse/channelmap.c:142 +msgid "Auxiliary 19" +msgstr "辅助 19" + +#: ../src/pulse/channelmap.c:143 +msgid "Auxiliary 20" +msgstr "辅助 20" + +#: ../src/pulse/channelmap.c:144 +msgid "Auxiliary 21" +msgstr "辅助 21" + +#: ../src/pulse/channelmap.c:145 +msgid "Auxiliary 22" +msgstr "辅助 22" + +#: ../src/pulse/channelmap.c:146 +msgid "Auxiliary 23" +msgstr "辅助 23" + +#: ../src/pulse/channelmap.c:147 +msgid "Auxiliary 24" +msgstr "辅助 24" + +#: ../src/pulse/channelmap.c:148 +msgid "Auxiliary 25" +msgstr "辅助 25" + +#: ../src/pulse/channelmap.c:149 +msgid "Auxiliary 26" +msgstr "辅助 26" + +#: ../src/pulse/channelmap.c:150 +msgid "Auxiliary 27" +msgstr "辅助 27" + +#: ../src/pulse/channelmap.c:151 +msgid "Auxiliary 28" +msgstr "辅助 28" + +#: ../src/pulse/channelmap.c:152 +msgid "Auxiliary 29" +msgstr "辅助 29" + +#: ../src/pulse/channelmap.c:153 +msgid "Auxiliary 30" +msgstr "辅助 30" + +#: ../src/pulse/channelmap.c:154 +msgid "Auxiliary 31" +msgstr "辅助 31" + +#: ../src/pulse/channelmap.c:156 +msgid "Top Center" +msgstr "上中" + +#: ../src/pulse/channelmap.c:158 +msgid "Top Front Center" +msgstr "上中前" + +#: ../src/pulse/channelmap.c:159 +msgid "Top Front Left" +msgstr "上左前" + +#: ../src/pulse/channelmap.c:160 +msgid "Top Front Right" +msgstr "上右前" + +#: ../src/pulse/channelmap.c:162 +msgid "Top Rear Center" +msgstr "上中后" + +#: ../src/pulse/channelmap.c:163 +msgid "Top Rear Left" +msgstr "上左后" + +#: ../src/pulse/channelmap.c:164 +msgid "Top Rear Right" +msgstr "上右后" + +#: ../src/pulse/channelmap.c:484 ../src/pulse/sample.c:170 +#: ../src/pulse/volume.c:295 ../src/pulse/volume.c:321 +#: ../src/pulse/volume.c:341 ../src/pulse/volume.c:371 +msgid "(invalid)" +msgstr "(无效)" + +#: ../src/pulse/channelmap.c:761 +msgid "Stereo" +msgstr "立体声" + +#: ../src/pulse/channelmap.c:766 +msgid "Surround 4.0" +msgstr "环绕 4.0 " + +#: ../src/pulse/channelmap.c:772 +msgid "Surround 4.1" +msgstr "环绕 4.1" + +#: ../src/pulse/channelmap.c:778 +msgid "Surround 5.0" +msgstr "环绕 5.0" + +#: ../src/pulse/channelmap.c:784 +msgid "Surround 5.1" +msgstr "环绕 5.1" + +#: ../src/pulse/channelmap.c:791 +msgid "Surround 7.1" +msgstr "环绕 7.1" + +#: ../src/pulse/error.c:43 +msgid "OK" +msgstr "确定" + +#: ../src/pulse/error.c:44 +msgid "Access denied" +msgstr "拒绝访问" + +#: ../src/pulse/error.c:45 +msgid "Unknown command" +msgstr "未知命令" + +#: ../src/pulse/error.c:46 +msgid "Invalid argument" +msgstr "无效参数" + +#: ../src/pulse/error.c:47 +msgid "Entity exists" +msgstr "实体存在" + +#: ../src/pulse/error.c:48 +msgid "No such entity" +msgstr "没有该实体" + +#: ../src/pulse/error.c:49 +msgid "Connection refused" +msgstr "拒绝连接" + +#: ../src/pulse/error.c:50 +msgid "Protocol error" +msgstr "协议错误" + +#: ../src/pulse/error.c:51 +msgid "Timeout" +msgstr "超时" + +#: ../src/pulse/error.c:52 +msgid "No authorization key" +msgstr "没有授权密钥" + +#: ../src/pulse/error.c:53 +msgid "Internal error" +msgstr "内部错误" + +#: ../src/pulse/error.c:54 +msgid "Connection terminated" +msgstr "连接终止" + +#: ../src/pulse/error.c:55 +msgid "Entity killed" +msgstr "实体已杀死" + +#: ../src/pulse/error.c:56 +msgid "Invalid server" +msgstr "无效服务器" + +#: ../src/pulse/error.c:57 +msgid "Module initalization failed" +msgstr "模块初始化失败" + +#: ../src/pulse/error.c:58 +msgid "Bad state" +msgstr "坏状态" + +#: ../src/pulse/error.c:59 +msgid "No data" +msgstr "没有数据" + +#: ../src/pulse/error.c:60 +msgid "Incompatible protocol version" +msgstr "不兼容的协议版本" + +#: ../src/pulse/error.c:61 +msgid "Too large" +msgstr "太大" + +#: ../src/pulse/error.c:62 +msgid "Not supported" +msgstr "不支持" + +#: ../src/pulse/error.c:63 +msgid "Unknown error code" +msgstr "未知错误码" + +#: ../src/pulse/error.c:64 +msgid "No such extension" +msgstr "没有该扩展" + +#: ../src/pulse/error.c:65 +msgid "Obsolete functionality" +msgstr "废弃的功能性" + +#: ../src/pulse/error.c:66 +msgid "Missing implementation" +msgstr "缺少部署" + +#: ../src/pulse/error.c:67 +msgid "Client forked" +msgstr "客户端分支" + +#: ../src/pulse/error.c:68 +msgid "Input/Output error" +msgstr "" + +#: ../src/pulse/error.c:69 +msgid "Device or resource busy" +msgstr "" + +#: ../src/pulse/sample.c:172 +#, c-format +msgid "%s %uch %uHz" +msgstr "%s %uch %uHz" + +#: ../src/pulse/sample.c:184 +#, c-format +msgid "%0.1f GiB" +msgstr "%0.1f GiB" + +#: ../src/pulse/sample.c:186 +#, c-format +msgid "%0.1f MiB" +msgstr "%0.1f MiB" + +#: ../src/pulse/sample.c:188 +#, c-format +msgid "%0.1f KiB" +msgstr "%0.1f KiB" + +#: ../src/pulse/sample.c:190 +#, c-format +msgid "%u B" +msgstr "%u B" + +#: ../src/pulse/client-conf-x11.c:55 ../src/utils/pax11publish.c:100 +msgid "XOpenDisplay() failed" +msgstr "XOpenDisplay()失败" + +#: ../src/pulse/client-conf-x11.c:93 +msgid "Failed to parse cookie data" +msgstr "cookie数据分析失败" + +#: ../src/pulse/client-conf.c:111 +#, c-format +msgid "Failed to open configuration file '%s': %s" +msgstr "打开配置文件'%s'失败:%s" + +#: ../src/pulse/context.c:550 +msgid "No cookie loaded. Attempting to connect without." +msgstr "没有加载cookie。尝试不加载cookie进行连接。" + +#: ../src/pulse/context.c:693 +#, c-format +msgid "fork(): %s" +msgstr "fork():%s" + +#: ../src/pulse/context.c:748 +#, c-format +msgid "waitpid(): %s" +msgstr "waitpid():%s" + +#: ../src/pulse/context.c:1438 +#, c-format +msgid "Received message for unknown extension '%s'" +msgstr "收到未知扩展'%s'的信息" + +#: ../src/utils/pacat.c:108 +#, fuzzy, c-format +msgid "Failed to drain stream: %s" +msgstr "排出流失败:%s\n" + +#: ../src/utils/pacat.c:113 +#, fuzzy +msgid "Playback stream drained." +msgstr "流播放完毕。\n" + +#: ../src/utils/pacat.c:123 +#, fuzzy +msgid "Draining connection to server." +msgstr "Draining 连接到服务器。\n" + +#: ../src/utils/pacat.c:136 +#, fuzzy, c-format +msgid "pa_stream_drain(): %s" +msgstr "pa_stream_drain():%s\n" + +#: ../src/utils/pacat.c:159 +#, fuzzy, c-format +msgid "pa_stream_write() failed: %s" +msgstr "pa_stream_write()失败:%s\n" + +#: ../src/utils/pacat.c:197 +#, fuzzy, c-format +msgid "pa_stream_begin_write() failed: %s" +msgstr "pa_stream_write()失败:%s\n" + +#: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267 +#, fuzzy, c-format +msgid "pa_stream_peek() failed: %s" +msgstr "pa_stream_peek()失败:%s\n" + +#: ../src/utils/pacat.c:307 +#, fuzzy +msgid "Stream successfully created." +msgstr "流创建成功。\n" + +#: ../src/utils/pacat.c:310 +#, fuzzy, c-format +msgid "pa_stream_get_buffer_attr() failed: %s" +msgstr "pa_stream_get_buffer_attr()失败:%s\n" + +#: ../src/utils/pacat.c:314 +#, fuzzy, c-format +msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u" +msgstr "缓冲计量:maxlength=%u,tlength=%u,prebuf=%u,minreq=%u\n" + +#: ../src/utils/pacat.c:317 +#, fuzzy, c-format +msgid "Buffer metrics: maxlength=%u, fragsize=%u" +msgstr "缓冲计量:maxlength=%u,fragsize=%u\n" + +#: ../src/utils/pacat.c:321 +#, fuzzy, c-format +msgid "Using sample spec '%s', channel map '%s'." +msgstr "正在使用样品规格'%s',通道映射'%s'。\n" + +#: ../src/utils/pacat.c:325 +#, fuzzy, c-format +msgid "Connected to device %s (%u, %ssuspended)." +msgstr "已连接至设备%s (%u,%s挂起)。\n" + +#: ../src/utils/pacat.c:335 +#, fuzzy, c-format +msgid "Stream error: %s" +msgstr "流错误:%s\n" + +#: ../src/utils/pacat.c:345 +#, fuzzy, c-format +msgid "Stream device suspended.%s" +msgstr "流设备挂起。%s\n" + +#: ../src/utils/pacat.c:347 +#, fuzzy, c-format +msgid "Stream device resumed.%s" +msgstr "流设备恢复。%s\n" + +#: ../src/utils/pacat.c:355 +#, fuzzy, c-format +msgid "Stream underrun.%s" +msgstr "流欠载运行。%s\n" + +#: ../src/utils/pacat.c:362 +#, fuzzy, c-format +msgid "Stream overrun.%s" +msgstr "流超限运行。%s\n" + +#: ../src/utils/pacat.c:369 +#, fuzzy, c-format +msgid "Stream started.%s" +msgstr "流已启动。%s\n" + +#: ../src/utils/pacat.c:376 +#, fuzzy, c-format +msgid "Stream moved to device %s (%u, %ssuspended).%s" +msgstr "流移至设备%s (%u,%s挂起)。%s\n" + +#: ../src/utils/pacat.c:376 +msgid "not " +msgstr "not " + +#: ../src/utils/pacat.c:383 +#, fuzzy, c-format +msgid "Stream buffer attributes changed.%s" +msgstr "更改流换出属性。%s\n" + +#: ../src/utils/pacat.c:415 +#, fuzzy, c-format +msgid "Connection established.%s" +msgstr "连接已建立。%s \n" + +#: ../src/utils/pacat.c:418 +#, fuzzy, c-format +msgid "pa_stream_new() failed: %s" +msgstr "pa_stream_new()失败:%s\n" + +#: ../src/utils/pacat.c:450 +#, fuzzy, c-format +msgid "pa_stream_connect_playback() failed: %s" +msgstr "pa_stream_connect_playback()失败:%s\n" + +#: ../src/utils/pacat.c:456 +#, fuzzy, c-format +msgid "pa_stream_connect_record() failed: %s" +msgstr "pa_stream_connect_playback()失败:%s\n" + +#: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857 +#, fuzzy, c-format +msgid "Connection failure: %s" +msgstr "连接失败:%s\n" + +#: ../src/utils/pacat.c:503 +#, fuzzy +msgid "Got EOF." +msgstr "收到EOF。\n" + +#: ../src/utils/pacat.c:540 +#, fuzzy, c-format +msgid "write() failed: %s" +msgstr "write()失败:%s\n" + +#: ../src/utils/pacat.c:561 +#, fuzzy +msgid "Got signal, exiting." +msgstr "收到信号,正在退出。\n" + +#: ../src/utils/pacat.c:575 +#, fuzzy, c-format +msgid "Failed to get latency: %s" +msgstr "获取传输延迟失败:%s\n" + +#: ../src/utils/pacat.c:580 +#, fuzzy, c-format +msgid "Time: %0.3f sec; Latency: %0.0f usec." +msgstr "时间:%0.3f秒;延迟:%0.0f 微秒。 \r" + +#: ../src/utils/pacat.c:599 +#, fuzzy, c-format +msgid "pa_stream_update_timing_info() failed: %s" +msgstr "pa_stream_update_timing_info()失败:%s\n" + +#: ../src/utils/pacat.c:609 +#, fuzzy, c-format +msgid "" +"%s [options]\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -r, --record Create a connection for recording\n" +" -p, --playback Create a connection for playback\n" +"\n" +" -v, --verbose Enable verbose operations\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -d, --device=DEVICE The name of the sink/source to " +"connect to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" +" --stream-name=NAME How to call this stream on the " +"server\n" +" --volume=VOLUME Specify the initial (linear) volume " +"in range 0...65536\n" +" --rate=SAMPLERATE The sample rate in Hz (defaults to " +"44100)\n" +" --format=SAMPLEFORMAT The sample type, one of s16le, " +"s16be, u8, float32le,\n" +" float32be, ulaw, alaw, s32le, s32be, " +"s24le, s24be,\n" +" s24-32le, s24-32be (defaults to " +"s16ne)\n" +" --channels=CHANNELS The number of channels, 1 for mono, " +"2 for stereo\n" +" (defaults to 2)\n" +" --channel-map=CHANNELMAP Channel map to use instead of the " +"default\n" +" --fix-format Take the sample format from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-rate Take the sampling rate from the sink " +"the stream is\n" +" being connected to.\n" +" --fix-channels Take the number of channels and the " +"channel map\n" +" from the sink the stream is being " +"connected to.\n" +" --no-remix Don't upmix or downmix channels.\n" +" --no-remap Map channels by index instead of " +"name.\n" +" --latency=BYTES Request the specified latency in " +"bytes.\n" +" --process-time=BYTES Request the specified process time " +"per request in bytes.\n" +" --property=PROPERTY=VALUE Set the specified property to the " +"specified value.\n" +" --raw Record/play raw PCM data.\n" +" --file-format=FFORMAT Record/play formatted PCM data.\n" +" --list-file-formats List available file formats.\n" +msgstr "" +"%s [options]\n" +"\n" +" -h, --help 显示此帮助\n" +" --version 显示版本号\n" +"\n" +" -r, --record 为录制创建连接\n" +" -p, --playback 为回放创建连接\n" +"\n" +" -v, --verbose 启用详述操作\n" +"\n" +" -s, --server=SERVER 要连接的服务器名\n" +" -d, --device=DEVICE 要连接的sink/source名\n" +" -n, --client-name=NAME 指定客户端在服务器上的名称\n" +" --stream-name=NAME 指定流在服务器上的名称\n" +" --volume=VOLUME 指定初始(线性)音量,取值在0...65536" +"之间\n" +" --rate=SAMPLERATE 采样频率(单位Hz,默认为44100)\n" +" --format=SAMPLEFORMAT 采样类型,从s16le,s16be,u8," +"float32le,\n" +" float32be,ulaw,alaw,s32le,s32be中" +"取(默认为s16ne)\n" +" --channels=CHANNELS 通道数,1为单声道,2为立体声(默认为" +"2)\n" +" --channel-map=CHANNELMAP 取代默认值的通道映射表\n" +" --fix-format 从流连接的音频出口处取采样格式。\n" +" --fix-rate 从流连接的音频出口处取采样率。\n" +" --fix-channels 从流连接的音频出口处取通道数和通道映" +"射表。\n" +" --no-remix Don't upmix or downmix channels.\n" +" --no-remap 根据下标而非名称来映射通道。\n" +" --latency=BYTES 请求指定字节数的延迟。\n" +" --process-time=BYTES 每次请求指定字节数的处理时间。\n" + +#: ../src/utils/pacat.c:731 +#, c-format +msgid "" +"pacat %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pacat %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" + +#: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953 +#, fuzzy, c-format +msgid "Invalid client name '%s'" +msgstr "无效的通道映射描述'%s'\n" + +#: ../src/utils/pacat.c:779 +#, fuzzy, c-format +msgid "Invalid stream name '%s'" +msgstr "无效的重采样方法'%s'。" + +#: ../src/utils/pacat.c:816 +#, fuzzy, c-format +msgid "Invalid channel map '%s'" +msgstr "无效的通道映射描述'%s'\n" + +#: ../src/utils/pacat.c:845 +#, fuzzy, c-format +msgid "Invalid latency specification '%s'" +msgstr "无效的延迟规格描述 %s'\n" + +#: ../src/utils/pacat.c:852 +#, fuzzy, c-format +msgid "Invalid process time specification '%s'" +msgstr "无效的处理时间描述 '%s'\n" + +#: ../src/utils/pacat.c:864 +#, fuzzy, c-format +msgid "Invalid property '%s'" +msgstr "无效的重采样方法'%s'。" + +#: ../src/utils/pacat.c:881 +#, c-format +msgid "Unknown file format %s." +msgstr "" + +#: ../src/utils/pacat.c:900 +#, fuzzy +msgid "Invalid sample specification" +msgstr "无效的采样描述\n" + +#: ../src/utils/pacat.c:910 +#, fuzzy, c-format +msgid "open(): %s" +msgstr "open():%s\n" + +#: ../src/utils/pacat.c:915 +#, fuzzy, c-format +msgid "dup2(): %s" +msgstr "dup2():%s\n" + +#: ../src/utils/pacat.c:922 +#, fuzzy +msgid "Too many arguments." +msgstr "参数过多。\n" + +#: ../src/utils/pacat.c:933 +#, fuzzy +msgid "Failed to generate sample specification for file." +msgstr "获取采样信息失败:%s\n" + +#: ../src/utils/pacat.c:953 +#, fuzzy +msgid "Failed to open audio file." +msgstr "打开声音文件失败。\n" + +#: ../src/utils/pacat.c:959 +#, fuzzy +msgid "" +"Warning: specified sample specification will be overwritten with " +"specification from file." +msgstr "以采样规格'%s'打开%s流。\n" + +#: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997 +#, fuzzy +msgid "Failed to determine sample specification from file." +msgstr "获取采样信息失败:%s\n" + +#: ../src/utils/pacat.c:971 +#, fuzzy +msgid "Warning: Failed to determine channel map from file." +msgstr "以采样规格'%s'打开%s流。\n" + +#: ../src/utils/pacat.c:982 +#, fuzzy +msgid "Channel map doesn't match sample specification" +msgstr "通道映射与采样描述不匹配\n" + +#: ../src/utils/pacat.c:993 +#, fuzzy +msgid "Warning: failed to write channel map to file." +msgstr "以采样规格'%s'打开%s流。\n" + +#: ../src/utils/pacat.c:1008 +#, fuzzy, c-format +msgid "" +"Opening a %s stream with sample specification '%s' and channel map '%s'." +msgstr "以采样规格'%s'打开%s流。\n" + +#: ../src/utils/pacat.c:1009 +msgid "recording" +msgstr "正在录制" + +#: ../src/utils/pacat.c:1009 +msgid "playback" +msgstr "回放" + +#: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267 +#, fuzzy +msgid "pa_mainloop_new() failed." +msgstr "pa_mainloop_new()失败。\n" + +#: ../src/utils/pacat.c:1054 +#, fuzzy +msgid "io_new() failed." +msgstr "io_new()失败。\n" + +#: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279 +#, fuzzy +msgid "pa_context_new() failed." +msgstr "pa_context_new()失败。\n" + +#: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285 +#, c-format +msgid "pa_context_connect() failed: %s" +msgstr "pa_context_connect()失败:%s" + +#: ../src/utils/pacat.c:1075 +#, fuzzy +msgid "pa_context_rttime_new() failed." +msgstr "pa_context_new()失败。\n" + +#: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290 +#, fuzzy +msgid "pa_mainloop_run() failed." +msgstr "pa_mainloop_run()失败。\n" + +#: ../src/utils/pasuspender.c:81 +#, c-format +msgid "fork(): %s\n" +msgstr "fork():%s\n" + +#: ../src/utils/pasuspender.c:92 +#, c-format +msgid "execvp(): %s\n" +msgstr "execvp():%s\n" + +#: ../src/utils/pasuspender.c:109 +#, c-format +msgid "Failure to suspend: %s\n" +msgstr "挂起失败:%s\n" + +#: ../src/utils/pasuspender.c:124 +#, c-format +msgid "Failure to resume: %s\n" +msgstr "恢复失败:%s\n" + +#: ../src/utils/pasuspender.c:147 +#, c-format +msgid "WARNING: Sound server is not local, not suspending.\n" +msgstr "警告:非本地声音服务器,不会挂起。\n" + +#: ../src/utils/pasuspender.c:159 +#, c-format +msgid "Connection failure: %s\n" +msgstr "连接失败:%s\n" + +#: ../src/utils/pasuspender.c:176 +#, c-format +msgid "Got SIGINT, exiting.\n" +msgstr "收到SIGINT,正在退出。\n" + +#: ../src/utils/pasuspender.c:194 +#, c-format +msgid "WARNING: Child process terminated by signal %u\n" +msgstr "警告:子进程被信号%u终止\n" + +#: ../src/utils/pasuspender.c:212 +#, c-format +msgid "" +"%s [options] ... \n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +"\n" +msgstr "" +"%s [options] ... \n" +"\n" +" -h, --help 显示此帮助\n" +" --version 显示版本\n" +" -s, --server=SERVER 要连接的服务器名\n" +"\n" + +#: ../src/utils/pasuspender.c:248 +#, c-format +msgid "" +"pasuspender %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pasuspender %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" + +#: ../src/utils/pasuspender.c:277 +#, c-format +msgid "pa_mainloop_new() failed.\n" +msgstr "pa_mainloop_new()失败。\n" + +#: ../src/utils/pasuspender.c:290 +#, c-format +msgid "pa_context_new() failed.\n" +msgstr "pa_context_new()失败。\n" + +#: ../src/utils/pasuspender.c:298 +#, c-format +msgid "pa_mainloop_run() failed.\n" +msgstr "pa_mainloop_run()失败。\n" + +#: ../src/utils/pactl.c:135 +#, fuzzy, c-format +msgid "Failed to get statistics: %s" +msgstr "获取统计数据失败:%s\n" + +#: ../src/utils/pactl.c:141 +#, c-format +msgid "Currently in use: %u blocks containing %s bytes total.\n" +msgstr "当前使用:%u块,总共%s字节。\n" + +#: ../src/utils/pactl.c:144 +#, c-format +msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n" +msgstr "整个生命周期所得分配:%u块,总共%s字节。\n" + +#: ../src/utils/pactl.c:147 +#, c-format +msgid "Sample cache size: %s\n" +msgstr "采样缓存大小:%s\n" + +#: ../src/utils/pactl.c:156 +#, fuzzy, c-format +msgid "Failed to get server information: %s" +msgstr "获取服务器信息失败:%s\n" + +#: ../src/utils/pactl.c:164 +#, c-format +msgid "" +"User name: %s\n" +"Host Name: %s\n" +"Server Name: %s\n" +"Server Version: %s\n" +"Default Sample Specification: %s\n" +"Default Channel Map: %s\n" +"Default Sink: %s\n" +"Default Source: %s\n" +"Cookie: %08x\n" +msgstr "" +"用户名:%s\n" +"主机名:%s\n" +"服务器名:%s\n" +"服务器版本:%s\n" +"默认采样规格:%s\n" +"默认频道地图:%s\n" +"默认音频入口:%s\n" +"默认源: %s\n" +"Cookie:%08x\n" + +#: ../src/utils/pactl.c:205 +#, fuzzy, c-format +msgid "Failed to get sink information: %s" +msgstr "获取音频出口信息失败:%s\n" + +#: ../src/utils/pactl.c:221 +#, c-format +msgid "" +"Sink #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor Source: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Sink #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor Source: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360 +#, fuzzy, c-format +msgid "\tPorts:\n" +msgstr "\tProfiles:\n" + +#: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366 +#, fuzzy, c-format +msgid "\tActive Port: %s\n" +msgstr "\tActive Profile: %s\n" + +#: ../src/utils/pactl.c:297 +#, fuzzy, c-format +msgid "Failed to get source information: %s" +msgstr "获取音频入口信息失败:%s\n" + +#: ../src/utils/pactl.c:313 +#, c-format +msgid "" +"Source #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor of Sink: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Source #%u\n" +"\tState: %s\n" +"\tName: %s\n" +"\tDescription: %s\n" +"\tDriver: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tOwner Module: %u\n" +"\tMute: %s\n" +"\tVolume: %s%s%s\n" +"\t balance %0.2f\n" +"\tBase Volume: %s%s%s\n" +"\tMonitor of Sink: %s\n" +"\tLatency: %0.0f usec, configured %0.0f usec\n" +"\tFlags: %s%s%s%s%s%s\n" +"\tProperties:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:345 ../src/utils/pactl.c:401 ../src/utils/pactl.c:436 +#: ../src/utils/pactl.c:473 ../src/utils/pactl.c:532 ../src/utils/pactl.c:533 +#: ../src/utils/pactl.c:543 ../src/utils/pactl.c:587 ../src/utils/pactl.c:588 +#: ../src/utils/pactl.c:594 ../src/utils/pactl.c:637 ../src/utils/pactl.c:638 +#: ../src/utils/pactl.c:645 +msgid "n/a" +msgstr "n/a" + +#: ../src/utils/pactl.c:375 +#, fuzzy, c-format +msgid "Failed to get module information: %s" +msgstr "获取模块信息失败:%s\n" + +#: ../src/utils/pactl.c:393 +#, c-format +msgid "" +"Module #%u\n" +"\tName: %s\n" +"\tArgument: %s\n" +"\tUsage counter: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Module #%u\n" +"\tName: %s\n" +"\tArgument: %s\n" +"\tUsage counter: %s\n" +"\tProperties:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:412 +#, fuzzy, c-format +msgid "Failed to get client information: %s" +msgstr "获取客户端信息失败:%s\n" + +#: ../src/utils/pactl.c:430 +#, c-format +msgid "" +"Client #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Client #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:447 +#, fuzzy, c-format +msgid "Failed to get card information: %s" +msgstr "获取声卡信息失败:%s\n" + +#: ../src/utils/pactl.c:465 +#, c-format +msgid "" +"Card #%u\n" +"\tName: %s\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Card #%u\n" +"\tName: %s\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tProperties:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:479 +#, c-format +msgid "\tProfiles:\n" +msgstr "\tProfiles:\n" + +#: ../src/utils/pactl.c:485 +#, c-format +msgid "\tActive Profile: %s\n" +msgstr "\tActive Profile: %s\n" + +#: ../src/utils/pactl.c:496 +#, fuzzy, c-format +msgid "Failed to get sink input information: %s" +msgstr "获取音频出口输入信息失败:%s\n" + +#: ../src/utils/pactl.c:515 +#, c-format +msgid "" +"Sink Input #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSink: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tMute: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSink Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Sink Input #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSink: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tMute: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSink Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:554 +#, fuzzy, c-format +msgid "Failed to get source output information: %s" +msgstr "获取音频入口输出信息失败:%s\n" + +#: ../src/utils/pactl.c:574 +#, c-format +msgid "" +"Source Output #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSource: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSource Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Source Output #%u\n" +"\tDriver: %s\n" +"\tOwner Module: %s\n" +"\tClient: %s\n" +"\tSource: %u\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tBuffer Latency: %0.0f usec\n" +"\tSource Latency: %0.0f usec\n" +"\tResample method: %s\n" +"\tProperties:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:605 +#, fuzzy, c-format +msgid "Failed to get sample information: %s" +msgstr "获取采样信息失败:%s\n" + +#: ../src/utils/pactl.c:623 +#, c-format +msgid "" +"Sample #%u\n" +"\tName: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tDuration: %0.1fs\n" +"\tSize: %s\n" +"\tLazy: %s\n" +"\tFilename: %s\n" +"\tProperties:\n" +"\t\t%s\n" +msgstr "" +"Sample #%u\n" +"\tName: %s\n" +"\tSample Specification: %s\n" +"\tChannel Map: %s\n" +"\tVolume: %s\n" +"\t %s\n" +"\t balance %0.2f\n" +"\tDuration: %0.1fs\n" +"\tSize: %s\n" +"\tLazy: %s\n" +"\tFilename: %s\n" +"\tProperties:\n" +"\t\t%s\n" + +#: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663 +#, fuzzy, c-format +msgid "Failure: %s" +msgstr "失败:%s\n" + +#: ../src/utils/pactl.c:687 +#, fuzzy, c-format +msgid "Failed to upload sample: %s" +msgstr "上传采样失败:%s\n" + +#: ../src/utils/pactl.c:704 +#, fuzzy +msgid "Premature end of file" +msgstr "文件过早结束\n" + +#: ../src/utils/pactl.c:863 +#, fuzzy +msgid "Got SIGINT, exiting." +msgstr "收到SIGINT,正在退出。\n" + +#: ../src/utils/pactl.c:869 +#, fuzzy, c-format +msgid "" +"%s [options] stat\n" +"%s [options] list\n" +"%s [options] exit\n" +"%s [options] upload-sample FILENAME [NAME]\n" +"%s [options] play-sample NAME [SINK]\n" +"%s [options] remove-sample NAME\n" +"%s [options] move-sink-input SINKINPUT SINK\n" +"%s [options] move-source-output SOURCEOUTPUT SOURCE\n" +"%s [options] load-module NAME [ARGS ...]\n" +"%s [options] unload-module MODULE\n" +"%s [options] suspend-sink SINK 1|0\n" +"%s [options] suspend-source SOURCE 1|0\n" +"%s [options] set-card-profile CARD PROFILE\n" +"%s [options] set-sink-port SINK PORT\n" +"%s [options] set-source-port SOURCE PORT\n" +"%s [options] set-sink-volume SINK VOLUME\n" +"%s [options] set-source-volume SOURCE VOLUME\n" +"%s [options] set-sink-input-volume SINKINPUT VOLUME\n" +"%s [options] set-sink-mute SINK 1|0\n" +"%s [options] set-source-mute SOURCE 1|0\n" +"%s [options] set-sink-input-mute SINKINPUT 1|0\n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" +msgstr "" +"%s [options] stat\n" +"%s [options] list\n" +"%s [options] exit\n" +"%s [options] upload-sample FILENAME [NAME]\n" +"%s [options] play-sample NAME [SINK]\n" +"%s [options] remove-sample NAME\n" +"%s [options] move-sink-input ID SINK\n" +"%s [options] move-source-output ID SOURCE\n" +"%s [options] load-module NAME [ARGS ...]\n" +"%s [options] unload-module ID\n" +"%s [options] suspend-sink [SINK] 1|0\n" +"%s [options] suspend-source [SOURCE] 1|0\n" +"%s [options] set-card-profile [CARD] [PROFILE] \n" +"\n" +" -h, --help Show this help\n" +" --version Show version\n" +"\n" +" -s, --server=SERVER The name of the server to connect " +"to\n" +" -n, --client-name=NAME How to call this client on the " +"server\n" + +#: ../src/utils/pactl.c:933 +#, c-format +msgid "" +"pactl %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" +msgstr "" +"pactl %s\n" +"Compiled with libpulse %s\n" +"Linked with libpulse %s\n" + +#: ../src/utils/pactl.c:979 +#, fuzzy +msgid "Please specify a sample file to load" +msgstr "请指定要加载的采样文件\n" + +#: ../src/utils/pactl.c:992 +#, fuzzy +msgid "Failed to open sound file." +msgstr "打开声音文件失败。\n" + +#: ../src/utils/pactl.c:1004 +#, fuzzy +msgid "Warning: Failed to determine sample specification from file." +msgstr "以采样规格'%s'打开%s流。\n" + +#: ../src/utils/pactl.c:1014 +#, fuzzy +msgid "You have to specify a sample name to play" +msgstr "你必须指定要播放的采样名\n" + +#: ../src/utils/pactl.c:1026 +#, fuzzy +msgid "You have to specify a sample name to remove" +msgstr "你必须指定要删除的采样名\n" + +#: ../src/utils/pactl.c:1035 +#, fuzzy +msgid "You have to specify a sink input index and a sink" +msgstr "你必须指定音频出口索引和音频出口\n" + +#: ../src/utils/pactl.c:1045 +#, fuzzy +msgid "You have to specify a source output index and a source" +msgstr "你必须指定音频入口输出索引和音频入口\n" + +#: ../src/utils/pactl.c:1060 +#, fuzzy +msgid "You have to specify a module name and arguments." +msgstr "必须指定模块名和参数。\n" + +#: ../src/utils/pactl.c:1080 +#, fuzzy +msgid "You have to specify a module index" +msgstr "必须指定模块索引\n" + +#: ../src/utils/pactl.c:1090 +#, fuzzy +msgid "" +"You may not specify more than one sink. You have to specify a boolean value." +msgstr "不可指定多个音频出口。必须指定一个布尔值。\n" + +#: ../src/utils/pactl.c:1103 +#, fuzzy +msgid "" +"You may not specify more than one source. You have to specify a boolean " +"value." +msgstr "不可指定多个源。必须指定一个布尔值。\n" + +#: ../src/utils/pactl.c:1115 +#, fuzzy +msgid "You have to specify a card name/index and a profile name" +msgstr "你必须指定声卡名称/索引和侧写名称\n" + +#: ../src/utils/pactl.c:1126 +#, fuzzy +msgid "You have to specify a sink name/index and a port name" +msgstr "你必须指定声卡名称/索引和侧写名称\n" + +#: ../src/utils/pactl.c:1137 +#, fuzzy +msgid "You have to specify a source name/index and a port name" +msgstr "你必须指定声卡名称/索引和侧写名称\n" + +#: ../src/utils/pactl.c:1149 +#, fuzzy +msgid "You have to specify a sink name/index and a volume" +msgstr "你必须指定声卡名称/索引和侧写名称\n" + +#: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171 +#: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209 +#: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248 +#, fuzzy +msgid "Invalid volume specification" +msgstr "无效的采样描述\n" + +#: ../src/utils/pactl.c:1166 +#, fuzzy +msgid "You have to specify a source name/index and a volume" +msgstr "你必须指定声卡名称/索引和侧写名称\n" + +#: ../src/utils/pactl.c:1183 +#, fuzzy +msgid "You have to specify a sink input index and a volume" +msgstr "你必须指定音频出口索引和音频出口\n" + +#: ../src/utils/pactl.c:1188 +msgid "Invalid sink input index" +msgstr "" + +#: ../src/utils/pactl.c:1204 +#, fuzzy +msgid "You have to specify a sink name/index and a mute boolean" +msgstr "你必须指定声卡名称/索引和侧写名称\n" + +#: ../src/utils/pactl.c:1221 +#, fuzzy +msgid "You have to specify a source name/index and a mute boolean" +msgstr "你必须指定声卡名称/索引和侧写名称\n" + +#: ../src/utils/pactl.c:1238 +#, fuzzy +msgid "You have to specify a sink input index and a mute boolean" +msgstr "你必须指定音频出口索引和音频出口\n" + +#: ../src/utils/pactl.c:1243 +#, fuzzy +msgid "Invalid sink input index specification" +msgstr "无效的采样描述\n" + +#: ../src/utils/pactl.c:1262 +#, fuzzy +msgid "No valid command specified." +msgstr "未指定有效的命令。\n" + +#: ../src/utils/pax11publish.c:61 +#, c-format +msgid "" +"%s [-D display] [-S server] [-O sink] [-I source] [-c file] [-d|-e|-i|-r]\n" +"\n" +" -d Show current PulseAudio data attached to X11 display (default)\n" +" -e Export local PulseAudio data to X11 display\n" +" -i Import PulseAudio data from X11 display to local environment " +"variables and cookie file.\n" +" -r Remove PulseAudio data from X11 display\n" +msgstr "" +"%s [-D display] [-S server] [-O sink] [-I source] [-c file] [-d|-e|-i|-r]\n" +"\n" +" -d 显示与X11显示器关联的当前PulseAudio数据(默认)\n" +" -e 将本地PulseAudio数据导出至X11显示器\n" +" -i 将PulseAudio数据由X11显示器导入至本地环境变量和cookie文件。\n" +" -r 从X11显示器清除PulseAudio数据\n" + +#: ../src/utils/pax11publish.c:94 +#, c-format +msgid "Failed to parse command line.\n" +msgstr "分析命令行失败。\n" + +#: ../src/utils/pax11publish.c:108 +#, c-format +msgid "Server: %s\n" +msgstr "服务器:%s\n" + +#: ../src/utils/pax11publish.c:110 +#, c-format +msgid "Source: %s\n" +msgstr "音频入口:%s\n" + +#: ../src/utils/pax11publish.c:112 +#, c-format +msgid "Sink: %s\n" +msgstr "音频出口:%s\n" + +#: ../src/utils/pax11publish.c:114 +#, c-format +msgid "Cookie: %s\n" +msgstr "Cookie:%s\n" + +#: ../src/utils/pax11publish.c:132 +#, c-format +msgid "Failed to parse cookie data\n" +msgstr "分析cookie数据失败\n" + +#: ../src/utils/pax11publish.c:137 +#, c-format +msgid "Failed to save cookie data\n" +msgstr "保存cookie数据失败\n" + +#: ../src/utils/pax11publish.c:152 +#, c-format +msgid "Failed to load client configuration file.\n" +msgstr "加载客户端配置文件失败。\n" + +#: ../src/utils/pax11publish.c:157 +#, c-format +msgid "Failed to read environment configuration data.\n" +msgstr "读取环境配置数据失败。\n" + +#: ../src/utils/pax11publish.c:174 +#, c-format +msgid "Failed to get FQDN.\n" +msgstr "获取FQDN失败。\n" + +#: ../src/utils/pax11publish.c:194 +#, c-format +msgid "Failed to load cookie data\n" +msgstr "加载cookie数据失败\n" + +#: ../src/utils/pax11publish.c:211 +#, c-format +msgid "Not yet implemented.\n" +msgstr "尚未实现。\n" + +#: ../src/utils/pacmd.c:69 +msgid "No PulseAudio daemon running, or not running as session daemon." +msgstr "" + +#: ../src/utils/pacmd.c:74 +#, c-format +msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s" +msgstr "socket(PF_UNIX, SOCK_STREAM, 0):%s" + +#: ../src/utils/pacmd.c:91 +#, c-format +msgid "connect(): %s" +msgstr "connect():%s" + +#: ../src/utils/pacmd.c:99 +msgid "Failed to kill PulseAudio daemon." +msgstr "杀死PulseAudio后台程序失败。" + +#: ../src/utils/pacmd.c:107 +msgid "Daemon not responding." +msgstr "后台程序未响应。" + +#: ../src/utils/pacmd.c:161 +#, fuzzy, c-format +msgid "poll(): %s" +msgstr "fork():%s" + +#: ../src/utils/pacmd.c:171 ../src/utils/pacmd.c:188 +#, c-format +msgid "read(): %s" +msgstr "read():%s" + +#: ../src/utils/pacmd.c:207 ../src/utils/pacmd.c:223 +#, c-format +msgid "write(): %s" +msgstr "write():%s" + +#: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:219 +msgid "Cannot access autospawn lock." +msgstr "不能访问autospawn锁。" + +#: ../src/modules/alsa/alsa-sink.c:530 ../src/modules/alsa/alsa-sink.c:689 +#, c-format +msgid "" +"ALSA woke us up to write new data to the device, but there was actually " +"nothing to write!\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers.\n" +"We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() " +"returned 0 or another value < min_avail." +msgstr "" +"ALSA 提醒我们在该设备中写入新数据,但实际上没有什么可以写入的!\n" +"这很可能是 ALSA 驱动程序 '%s' 中的一个 bug。请向 ALSA 开发人员报告这个问" +"题。\n" +"提醒我们设置 POLLOUT -- 但结果是 snd_pcm_avail() 返回 0 或者另一个小于最小可" +"用值的数值。" + +#: ../src/modules/alsa/alsa-source.c:506 ../src/modules/alsa/alsa-source.c:656 +#, c-format +msgid "" +"ALSA woke us up to read new data from the device, but there was actually " +"nothing to read!\n" +"Most likely this is a bug in the ALSA driver '%s'. Please report this issue " +"to the ALSA developers.\n" +"We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() " +"returned 0 or another value < min_avail." +msgstr "" +"ALSA 提醒我们从该设备中读取新数据,但实际上没有什么可以读取的!\n" +"这很可能是 ALSA 驱动程序 '%s' 中的一个 bug。请向 ALSA 开发人员报告这个问" +"题。\n" +"提醒我们设置 POLLOUT -- 但结果是 snd_pcm_avail() 返回 0 或者另一个小于最小可" +"用值的数值。" + +#: ../src/modules/alsa/module-alsa-card.c:152 +#: ../src/modules/bluetooth/module-bluetooth-device.c:2228 +#: ../src/modules/alsa/alsa-mixer.c:2931 +msgid "Off" +msgstr "关闭" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2184 +msgid "High Fidelity Playback (A2DP)" +msgstr "高保真回放(A2DP)" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2198 +#, fuzzy +msgid "High Fidelity Capture (A2DP)" +msgstr "高保真回放(A2DP)" + +#: ../src/modules/bluetooth/module-bluetooth-device.c:2213 +msgid "Telephony Duplex (HSP/HFP)" +msgstr "双工电话(HSP/HFP)" + +#: ../src/modules/reserve-wrap.c:151 +msgid "PulseAudio Sound Server" +msgstr "PulseAudio 声音服务器" + +#: ../src/modules/module-rygel-media-server.c:569 +#: ../src/modules/module-rygel-media-server.c:583 +msgid "Output Devices" +msgstr "" + +#: ../src/modules/module-rygel-media-server.c:570 +#: ../src/modules/module-rygel-media-server.c:584 +#, fuzzy +msgid "Input Devices" +msgstr "输入 %s" + +#: ../src/modules/module-rygel-media-server.c:774 +msgid "Audio on @HOSTNAME@" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1701 +#, fuzzy +msgid "Input" +msgstr "输入 %s" + +#: ../src/modules/alsa/alsa-mixer.c:1702 +msgid "Docking Station Input" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1703 +msgid "Docking Station Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1704 +msgid "Line-In" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1705 +msgid "Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1706 +msgid "External Microphone" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1707 +#, fuzzy +msgid "Internal Microphone" +msgstr "内部音频" + +#: ../src/modules/alsa/alsa-mixer.c:1708 +msgid "Radio" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1709 +msgid "Video" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1710 +msgid "Automatic Gain Control" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1711 +msgid "No Automatic Gain Control" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1712 +msgid "Boost" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1713 +msgid "No Boost" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1714 +msgid "Amplifier" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1715 +msgid "No Amplifier" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1773 +#, fuzzy +msgid "Analog Input" +msgstr "模拟单声道" + +#: ../src/modules/alsa/alsa-mixer.c:1774 +#, fuzzy +msgid "Analog Microphone" +msgstr "模拟单声道" + +#: ../src/modules/alsa/alsa-mixer.c:1775 +#, fuzzy +msgid "Analog Line-In" +msgstr "模拟单声道" + +#: ../src/modules/alsa/alsa-mixer.c:1776 +#, fuzzy +msgid "Analog Radio" +msgstr "模拟单声道" + +#: ../src/modules/alsa/alsa-mixer.c:1777 +#, fuzzy +msgid "Analog Video" +msgstr "模拟立体声" + +#: ../src/modules/alsa/alsa-mixer.c:1778 +#, fuzzy +msgid "Analog Output" +msgstr "输出 %s" + +#: ../src/modules/alsa/alsa-mixer.c:1779 +#, fuzzy +msgid "Analog Headphones" +msgstr "模拟单声道" + +#: ../src/modules/alsa/alsa-mixer.c:1780 +msgid "Analog Output (LFE)" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1781 +#, fuzzy +msgid "Analog Mono Output" +msgstr "模拟单声道" + +#: ../src/modules/alsa/alsa-mixer.c:1981 +#, c-format +msgid "%s+%s" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404 +#, c-format +msgid "%s / %s" +msgstr "" + +#: ../src/modules/alsa/alsa-mixer.c:2790 +msgid "Analog Mono" +msgstr "模拟单声道" + +#: ../src/modules/alsa/alsa-mixer.c:2791 +msgid "Analog Stereo" +msgstr "模拟立体声" + +#: ../src/modules/alsa/alsa-mixer.c:2792 +#, fuzzy +msgid "Analog Surround 2.1" +msgstr "模拟环绕 4.1" + +#: ../src/modules/alsa/alsa-mixer.c:2793 +#, fuzzy +msgid "Analog Surround 3.0" +msgstr "模拟环绕 4.0" + +#: ../src/modules/alsa/alsa-mixer.c:2794 +#, fuzzy +msgid "Analog Surround 3.1" +msgstr "模拟环绕 4.1" + +#: ../src/modules/alsa/alsa-mixer.c:2795 +msgid "Analog Surround 4.0" +msgstr "模拟环绕 4.0" + +#: ../src/modules/alsa/alsa-mixer.c:2796 +msgid "Analog Surround 4.1" +msgstr "模拟环绕 4.1" + +#: ../src/modules/alsa/alsa-mixer.c:2797 +msgid "Analog Surround 5.0" +msgstr "模拟环绕 5.0" + +#: ../src/modules/alsa/alsa-mixer.c:2798 +msgid "Analog Surround 5.1" +msgstr "模拟环绕 5.1" + +#: ../src/modules/alsa/alsa-mixer.c:2799 +#, fuzzy +msgid "Analog Surround 6.0" +msgstr "模拟环绕 4.0" + +#: ../src/modules/alsa/alsa-mixer.c:2800 +#, fuzzy +msgid "Analog Surround 6.1" +msgstr "模拟环绕 4.1" + +#: ../src/modules/alsa/alsa-mixer.c:2801 +#, fuzzy +msgid "Analog Surround 7.0" +msgstr "模拟环绕 4.0" + +#: ../src/modules/alsa/alsa-mixer.c:2802 +msgid "Analog Surround 7.1" +msgstr "模拟环绕 7.1" + +#: ../src/modules/alsa/alsa-mixer.c:2803 +msgid "Digital Stereo (IEC958)" +msgstr "数字立体声(IEC958)" + +#: ../src/modules/alsa/alsa-mixer.c:2804 +#, fuzzy +msgid "Digital Surround 4.0 (IEC958)" +msgstr "数字环绕 4.0(IEC958/AC3)" + +#: ../src/modules/alsa/alsa-mixer.c:2805 +msgid "Digital Surround 4.0 (IEC958/AC3)" +msgstr "数字环绕 4.0(IEC958/AC3)" + +#: ../src/modules/alsa/alsa-mixer.c:2806 +msgid "Digital Surround 5.1 (IEC958/AC3)" +msgstr "数字环绕 5.1(IEC958/AC3)" + +#: ../src/modules/alsa/alsa-mixer.c:2807 +msgid "Digital Stereo (HDMI)" +msgstr "数字立体声(HDMI)" + +#: ../src/modules/alsa/alsa-mixer.c:2928 +#, fuzzy +msgid "Analog Mono Duplex" +msgstr "模拟单声道" + +#: ../src/modules/alsa/alsa-mixer.c:2929 +#, fuzzy +msgid "Analog Stereo Duplex" +msgstr "模拟立体声" + +#: ../src/modules/alsa/alsa-mixer.c:2930 +#, fuzzy +msgid "Digital Stereo Duplex (IEC958)" +msgstr "数字立体声(IEC958)" + +#, fuzzy +#~ msgid "Invalid client name '%s'\n" +#~ msgstr "无效的通道映射描述'%s'\n" + +#, fuzzy +#~ msgid "Failed to determine sample specification from file.\n" +#~ msgstr "获取采样信息失败:%s\n" + +#~ msgid "select(): %s" +#~ msgstr "select():%s" + +#~ msgid "Cannot connect to system bus: %s" +#~ msgstr "无法连接到系统总线:%s" + +#~ msgid "Cannot get caller from PID: %s" +#~ msgstr "无法从PID获取调用者:%s" + +#~ msgid "Cannot set UID on caller object." +#~ msgstr "无法为调用者设定UID。" + +#~ msgid "Failed to get CK session." +#~ msgstr "获取CK会话失败。" + +#~ msgid "Cannot set UID on session object." +#~ msgstr "无法为会话对象设定UID。" + +#~ msgid "Cannot allocate PolKitAction." +#~ msgstr "不能分配PolKitAction。" + +#~ msgid "Cannot set action_id" +#~ msgstr "无法设定action_id" + +#~ msgid "Cannot allocate PolKitContext." +#~ msgstr "无法分配PolKitContext。" + +#~ msgid "Cannot initialize PolKitContext: %s" +#~ msgstr "无法初使化PolKitContext: %s" + +#~ msgid "Could not determine whether caller is authorized: %s" +#~ msgstr "无法判断调用者是否已获得授权: %s" + +#~ msgid "Cannot obtain auth: %s" +#~ msgstr "无法获取授权: %s" + +#~ msgid "PolicyKit responded with '%s'" +#~ msgstr "PolicyKit回复'%s'" + +#~ msgid "" +#~ "High-priority scheduling (negative Unix nice level) for the PulseAudio " +#~ "daemon" +#~ msgstr "PulseAudio 守护进程的高优先调度(负的 Unix nic 等级)" + +#~ msgid "Real-time scheduling for the PulseAudio daemon" +#~ msgstr "PulseAudio 守护进程的实时调度。" + +#~ msgid "" +#~ "System policy prevents PulseAudio from acquiring high-priority scheduling." +#~ msgstr "系统策略防止 PulseAudio 获得高优先调度。" + +#~ msgid "" +#~ "System policy prevents PulseAudio from acquiring real-time scheduling." +#~ msgstr "系统策略防止 PulseAudio 获得实时调度。" + +#~ msgid "read() failed: %s\n" +#~ msgstr "read()失败:%s\n" + +#, fuzzy +#~ msgid "pa_context_connect() failed: %s\n" +#~ msgstr "pa_context_connect()失败:%s" + +#~ msgid "We're in the group '%s', allowing high-priority scheduling." +#~ msgstr "我们在'%s'组中,允许高优先级调度。" + +#~ msgid "We're in the group '%s', allowing real-time scheduling." +#~ msgstr "我们在'%s'组中,允许实时调度。" + +#~ msgid "PolicyKit grants us acquire-high-priority privilege." +#~ msgstr "PolicyKit授予我们“获取高优先级”权限。" + +#~ msgid "PolicyKit refuses acquire-high-priority privilege." +#~ msgstr "PolicyKit拒绝“获取高优先级”权限。" + +#~ msgid "PolicyKit grants us acquire-real-time privilege." +#~ msgstr "PolicyKit授予我们“获取实时”权限。" + +#~ msgid "PolicyKit refuses acquire-real-time privilege." +#~ msgstr "PolicyKit拒绝我们“获取实时”权限。" + +#~ msgid "" +#~ "Called SUID root and real-time and/or high-priority scheduling was " +#~ "requested in the configuration. However, we lack the necessary " +#~ "privileges:\n" +#~ "We are not in group '%s', PolicyKit refuse to grant us the requested " +#~ "privileges and we have no increase RLIMIT_NICE/RLIMIT_RTPRIO resource " +#~ "limits.\n" +#~ "For enabling real-time/high-priority scheduling please acquire the " +#~ "appropriate PolicyKit privileges, or become a member of '%s', or increase " +#~ "the RLIMIT_NICE/RLIMIT_RTPRIO resource limits for this user." +#~ msgstr "" +#~ "配置中需要调用 SUID root、实时和/或者高优先调度。但是我们缺少必要的特" +#~ "权:\n" +#~ "我们不属于组群 '%s',PolicyKit 拒绝赋予我们要求的特权,而我们无法增加 " +#~ "RLIMIT_NICE/RLIMIT_RTPRIO 资源限制。\n" +#~ "要启用实时/高优先调度,请获得适当的 PolicyKit 特权,或者成为 '%s' 成员,也" +#~ "可以为这个用户增加 RLIMIT_NICE/RLIMIT_RTPRIO 资源限制。" + +#~ msgid "" +#~ "High-priority scheduling enabled in configuration but not allowed by " +#~ "policy." +#~ msgstr "配置中已启用高优先级调度,但策略未允许。" + +#~ msgid "Successfully increased RLIMIT_RTPRIO" +#~ msgstr "提高RLIMIT_RTPRIO成功。" + +#~ msgid "RLIMIT_RTPRIO failed: %s" +#~ msgstr "RLIMIT_RTPRIO失败:%s" + +#~ msgid "Giving up CAP_NICE" +#~ msgstr "正在放弃CAP_NICE" + +#~ msgid "" +#~ "Real-time scheduling enabled in configuration but not allowed by policy." +#~ msgstr "配置中已启用实时调度,但策略未允许。" + +#~ msgid "Limited capabilities successfully to CAP_SYS_NICE." +#~ msgstr "性能成功限制到CAP_SYS_NICE。" + +#~ msgid "time_new() failed.\n" +#~ msgstr "time_new()失败。\n" + +#~ msgid "Output %s + Input %s" +#~ msgstr "输出 %s + 输入 %s" + +#~ msgid "Stream successfully created\n" +#~ msgstr "成功创建流\n" + +#~ msgid "Stream errror: %s\n" +#~ msgstr "流错误:%s\n" + +#~ msgid "Connection established.\n" +#~ msgstr "连接已建立。\n" + +#~ msgid "" +#~ "%s [options] [FILE]\n" +#~ "\n" +#~ " -h, --help Show this help\n" +#~ " --version Show version\n" +#~ "\n" +#~ " -v, --verbose Enable verbose operation\n" +#~ "\n" +#~ " -s, --server=SERVER The name of the server to connect " +#~ "to\n" +#~ " -d, --device=DEVICE The name of the sink to connect " +#~ "to\n" +#~ " -n, --client-name=NAME How to call this client on the " +#~ "server\n" +#~ " --stream-name=NAME How to call this stream on the " +#~ "server\n" +#~ " --volume=VOLUME Specify the initial (linear) " +#~ "volume in range 0...65536\n" +#~ " --channel-map=CHANNELMAP Set the channel map to the use\n" +#~ msgstr "" +#~ "%s [options] [FILE]\n" +#~ "\n" +#~ " -h, --help 显示此帮助\n" +#~ " --version 显示版本\n" +#~ "\n" +#~ " -v, --verbose 启用详述操作\n" +#~ "\n" +#~ " -s, --server=SERVER 要连接的服务器名\n" +#~ " -d, --device=DEVICE 要连接的音频出口名\n" +#~ " -n, --client-name=NAME 此客户端在服务器上的名称\n" +#~ " --stream-name=NAME 此流在服务器上的名称\n" +#~ " --volume=VOLUME 指定初始(线性)音量,取值在" +#~ "0...65536之间\n" +#~ " --channel-map=CHANNELMAP 设定使用的通道映射表\n" + +#~ msgid "" +#~ "paplay %s\n" +#~ "Compiled with libpulse %s\n" +#~ "Linked with libpulse %s\n" +#~ msgstr "" +#~ "paplay %s\n" +#~ "Compiled with libpulse %s\n" +#~ "Linked with libpulse %s\n" + +#~ msgid "Invalid channel map\n" +#~ msgstr "无效的通道映射表\n" + +#~ msgid "Failed to open file '%s'\n" +#~ msgstr "打开文件'%s'失败\n" + +#~ msgid "Channel map doesn't match file.\n" +#~ msgstr "通道映射表与文件不匹配。\n" + +#~ msgid "Using sample spec '%s'\n" +#~ msgstr "正在使用采样规格'%s'\n" diff --git a/pulseaudio.sh.in b/pulseaudio.sh.in new file mode 100755 index 0000000..b093e8f --- /dev/null +++ b/pulseaudio.sh.in @@ -0,0 +1,5 @@ +#!/bin/sh +if [ -x /usr/bin/pulseaudio ]; then + /usr/bin/pulseaudio --log-level=4 --system -D + vconftool set -t int memory/hibernation/pulseaudio_ready 1 +fi diff --git a/src/Makefile.am b/src/Makefile.am new file mode 100644 index 0000000..559c8e4 --- /dev/null +++ b/src/Makefile.am @@ -0,0 +1,1878 @@ +# This file is part of PulseAudio. +# +# Copyright 2004-2006 Lennart Poettering +# Copyright 2006 Pierre Ossman for Cendio AB +# Copyright 2006 Diego Pettenò +# +# PulseAudio is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA. + + +################################### +# Extra directories # +################################### + +pulseincludedir=$(includedir)/pulse +pulsecoreincludedir=$(includedir)/pulsecore +pulseconfdir=$(sysconfdir)/pulse +pulselibexecdir=$(libexecdir)/pulse +xdgautostartdir=$(sysconfdir)/xdg/autostart +alsaprofilesetsdir=$(datadir)/pulseaudio/alsa-mixer/profile-sets +alsapathsdir=$(datadir)/pulseaudio/alsa-mixer/paths +udevrulesdir=/lib/udev/rules.d +dbuspolicydir=$(sysconfdir)/dbus-1/system.d + +################################### +# Defines # +################################### + +PA_BINARY=$(bindir)/pulseaudio$(EXEEXT) +if OS_IS_WIN32 +PA_DEFAULT_CONFIG_DIR=%PULSE_ROOT% +else +PA_DEFAULT_CONFIG_DIR=$(pulseconfdir) +endif + +################################### +# Compiler/linker flags # +################################### + +AM_CFLAGS = \ + -I$(top_srcdir)/src \ + -I$(top_builddir)/src \ + -I$(top_srcdir)/src/modules \ + -I$(top_builddir)/src/modules \ + -I$(top_srcdir)/src/modules/rtp \ + -I$(top_builddir)/src/modules/rtp \ + -I$(top_srcdir)/src/modules/gconf \ + -I$(top_builddir)/src/modules/gconf \ + -I$(top_srcdir)/src/modules/bluetooth \ + -I$(top_builddir)/src/modules/bluetooth \ + -I$(top_srcdir)/src/modules/oss \ + -I$(top_builddir)/src/modules/oss \ + -I$(top_srcdir)/src/modules/alsa \ + -I$(top_builddir)/src/modules/alsa \ + -I$(top_srcdir)/src/modules/raop \ + -I$(top_builddir)/src/modules/raop \ + -I$(top_srcdir)/src/modules/x11 \ + -I$(top_builddir)/src/modules/x11 \ + -I$(top_srcdir)/src/modules/jack \ + -I$(top_builddir)/src/modules/jack \ + $(PTHREAD_CFLAGS) -D_POSIX_PTHREAD_SEMANTICS \ + $(LIBSAMPLERATE_CFLAGS) \ + $(LIBSNDFILE_CFLAGS) \ + $(LIBSPEEX_CFLAGS) \ + -DPA_BUILDDIR=\"$(abs_builddir)\" \ + -DPA_DLSEARCHPATH=\"$(modlibexecdir)\" \ + -DPA_DEFAULT_CONFIG_DIR=\"$(PA_DEFAULT_CONFIG_DIR)\" \ + -DPA_BINARY=\"$(PA_BINARY)\" \ + -DPA_SYSTEM_RUNTIME_PATH=\"$(PA_SYSTEM_RUNTIME_PATH)\" \ + -DPA_SYSTEM_CONFIG_PATH=\"$(PA_SYSTEM_CONFIG_PATH)\" \ + -DPA_SYSTEM_STATE_PATH=\"$(PA_SYSTEM_STATE_PATH)\" \ + -DAO_REQUIRE_CAS \ + -DPULSE_LOCALEDIR=\"$(pulselocaledir)\" \ + -DPA_MACHINE_ID=\"$(localstatedir)/lib/dbus/machine-id\" \ + -DPA_ALSA_PATHS_DIR=\"$(alsapathsdir)\" \ + -DPA_ALSA_PROFILE_SETS_DIR=\"$(alsaprofilesetsdir)\" \ + $(LTDLINCL) + +AM_LIBADD = $(PTHREAD_LIBS) $(INTLLIBS) +AM_LDADD = $(PTHREAD_LIBS) $(INTLLIBS) +AM_LDFLAGS = $(NODELETE_LDFLAGS) -Wl,-rpath-link,$(top_srcdir)/src/.libs -Wl,-rpath-link,$(libdir) + +if STATIC_BINS +BINLDFLAGS = -static +endif + +if OS_IS_WIN32 +AM_LDFLAGS+=-Wl,--export-all-symbols +WINSOCK_LIBS=-lwsock32 -lws2_32 -lwininet +endif + +FOREIGN_CFLAGS = -w +MODULE_LDFLAGS = -module -disable-static -avoid-version $(LDFLAGS_NOUNDEFINED) + +################################### +# Extra files # +################################### + +ALSA_PROFILES = \ + modules/alsa/mixer/profile-sets/default.conf \ + modules/alsa/mixer/profile-sets/native-instruments-audio4dj.conf \ + modules/alsa/mixer/profile-sets/native-instruments-audio8dj.conf + +ALSA_PATHS = \ + modules/alsa/mixer/paths/analog-input-aux.conf \ + modules/alsa/mixer/paths/analog-input.conf \ + modules/alsa/mixer/paths/analog-input.conf.common \ + modules/alsa/mixer/paths/analog-input-fm.conf \ + modules/alsa/mixer/paths/analog-input-linein.conf \ + modules/alsa/mixer/paths/analog-input-mic.conf \ + modules/alsa/mixer/paths/analog-input-mic.conf.common \ + modules/alsa/mixer/paths/analog-input-mic-line.conf \ + modules/alsa/mixer/paths/analog-input-tvtuner.conf \ + modules/alsa/mixer/paths/analog-input-video.conf \ + modules/alsa/mixer/paths/analog-output.conf \ + modules/alsa/mixer/paths/analog-output-speaker.conf \ + modules/alsa/mixer/paths/analog-output.conf.common \ + modules/alsa/mixer/paths/analog-output-headphones.conf \ + modules/alsa/mixer/paths/analog-output-headphones-2.conf \ + modules/alsa/mixer/paths/analog-output-lfe-on-mono.conf \ + modules/alsa/mixer/paths/analog-output-mono.conf + +EXTRA_DIST = \ + pulse/client.conf.in \ + pulse/version.h.in \ + daemon/daemon.conf.in \ + daemon/default.pa.in \ + daemon/system.pa.in \ + daemon/default.pa.win32 \ + depmod.py \ + daemon/esdcompat.in \ + daemon/start-pulseaudio-x11.in \ + daemon/start-pulseaudio-kde.in \ + utils/padsp \ + modules/module-defs.h.m4 \ + daemon/pulseaudio.desktop.in \ + daemon/pulseaudio-kde.desktop.in \ + map-file \ + daemon/pulseaudio-system.conf \ + modules/echo-cancel/adrian-license.txt + modules/alsa/mixer/profile-sets/90-pulseaudio.rules \ + ${ALSA_PROFILES} \ + ${ALSA_PATHS} + +pulseconf_DATA = \ + default.pa \ + system.pa \ + daemon.conf \ + client.conf + + +dbuspolicy_DATA = \ + daemon/pulseaudio-system.conf + +if HAVE_X11 +xdgautostart_in_files = \ + daemon/pulseaudio.desktop.in \ + daemon/pulseaudio-kde.desktop.in +endif +xdgautostart_DATA = $(xdgautostart_in_files:.desktop.in=.desktop) +@INTLTOOL_DESKTOP_RULE@ + + +BUILT_SOURCES = \ + pulse/version.h + +################################### +# Main daemon # +################################### + +bin_PROGRAMS = pulseaudio + +pulseaudio_SOURCES = \ + daemon/caps.h daemon/caps.c \ + daemon/cmdline.c daemon/cmdline.h \ + daemon/cpulimit.c daemon/cpulimit.h \ + daemon/daemon-conf.c daemon/daemon-conf.h \ + daemon/dumpmodules.c daemon/dumpmodules.h \ + daemon/ltdl-bind-now.c daemon/ltdl-bind-now.h \ + daemon/main.c + +pulseaudio_CFLAGS = $(AM_CFLAGS) $(LIBSAMPLERATE_CFLAGS) $(LIBSPEEX_CFLAGS) $(LIBSNDFILE_CFLAGS) $(CAP_CFLAGS) $(DBUS_CFLAGS) +pulseaudio_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la $(LIBLTDL) $(LIBSAMPLERATE_LIBS) $(LIBSPEEX_LIBS) $(LIBSNDFILE_LIBS) $(CAP_LIBS) $(DBUS_LIBS) +# This is needed because automake doesn't properly expand the foreach below +pulseaudio_DEPENDENCIES = libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la $(PREOPEN_LIBS) $(LTDLDEPS) + +if PREOPEN_MODS +PREOPEN_LIBS = $(PREOPEN_MODS) +else +PREOPEN_LIBS = $(modlibexec_LTLIBRARIES) +endif + +if FORCE_PREOPEN +pulseaudio_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(IMMEDIATE_LDFLAGS) -dlpreopen force $(foreach f,$(PREOPEN_LIBS),-dlpreopen $(f)) -export-dynamic +else +pulseaudio_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(IMMEDIATE_LDFLAGS) -dlopen force $(foreach f,$(PREOPEN_LIBS),-dlopen $(f)) -export-dynamic +endif + +if USE_DLOG +pulseaudio_CFLAGS += -DUSE_DLOG +endif + + +################################### +# Utility programs # +################################### + +bin_PROGRAMS += \ + pacat \ + pactl \ + pasuspender + +if HAVE_AF_UNIX +bin_PROGRAMS += pacmd +endif + +if HAVE_X11 +bin_PROGRAMS += pax11publish +endif + +if HAVE_AVAHI +bin_PROGRAMS += pabrowse +endif + +bin_SCRIPTS = esdcompat start-pulseaudio-x11 start-pulseaudio-kde + +pacat_SOURCES = utils/pacat.c +pacat_LDADD = $(AM_LDADD) libpulse.la libpulsecommon-@PA_MAJORMINORMICRO@.la $(LIBSNDFILE_LIBS) +pacat_CFLAGS = $(AM_CFLAGS) $(LIBSNDFILE_CFLAGS) +pacat_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) + +pactl_SOURCES = utils/pactl.c +pactl_LDADD = $(AM_LDADD) libpulse.la libpulsecommon-@PA_MAJORMINORMICRO@.la $(LIBSNDFILE_LIBS) +pactl_CFLAGS = $(AM_CFLAGS) $(LIBSNDFILE_CFLAGS) +pactl_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) + +pasuspender_SOURCES = utils/pasuspender.c +pasuspender_LDADD = $(AM_LDADD) libpulse.la libpulsecommon-@PA_MAJORMINORMICRO@.la +pasuspender_CFLAGS = $(AM_CFLAGS) +pasuspender_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) + +pacmd_SOURCES = utils/pacmd.c +pacmd_CFLAGS = $(AM_CFLAGS) +pacmd_LDADD = $(AM_LDADD) libpulse.la libpulsecommon-@PA_MAJORMINORMICRO@.la +pacmd_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) + +pax11publish_SOURCES = utils/pax11publish.c +pax11publish_CFLAGS = $(AM_CFLAGS) $(X11_CFLAGS) +pax11publish_LDADD = $(AM_LDADD) libpulse.la libpulsecommon-@PA_MAJORMINORMICRO@.la $(X11_LIBS) +pax11publish_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) + +pabrowse_SOURCES = utils/pabrowse.c +pabrowse_LDADD = $(AM_LDADD) libpulse.la libpulse-browse.la libpulsecommon-@PA_MAJORMINORMICRO@.la +pabrowse_CFLAGS = $(AM_CFLAGS) +pabrowse_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) + +################################### +# Test programs # +################################### + +# missing: mcalign-test flist-test pacat-simple parec-simple sync-playback rtstutter stripnul interpol-test thread-test + +TESTS = \ + mainloop-test \ + strlist-test \ + close-test \ + voltest \ + vector-test \ + memblockq-test \ + channelmap-test \ + thread-mainloop-test \ + utf8-test \ + get-binary-name-test \ + ipacl-test \ + hook-list-test \ + memblock-test \ + asyncq-test \ + asyncmsgq-test \ + queue-test \ + rtpoll-test \ + sig2str-test \ + resampler-test \ + smoother-test \ + mix-test \ + remix-test \ + envelope-test \ + proplist-test \ + lock-autospawn-test \ + prioq-test \ + sigbus-test \ + usergroup-test + +TESTS_BINARIES = \ + mainloop-test \ + mcalign-test \ + pacat-simple \ + parec-simple \ + strlist-test \ + close-test \ + voltest \ + vector-test \ + memblockq-test \ + sync-playback \ + interpol-test \ + channelmap-test \ + thread-mainloop-test \ + utf8-test \ + get-binary-name-test \ + ipacl-test \ + hook-list-test \ + memblock-test \ + thread-test \ + flist-test \ + asyncq-test \ + asyncmsgq-test \ + queue-test \ + rtpoll-test \ + sig2str-test \ + resampler-test \ + smoother-test \ + mix-test \ + remix-test \ + envelope-test \ + proplist-test \ + rtstutter \ + stripnul \ + lock-autospawn-test \ + prioq-test \ + sigbus-test \ + usergroup-test + +if HAVE_SIGXCPU +#TESTS += \ +# cpulimit-test \ +# cpulimit-test2 +TESTS_BINARIES += \ + cpulimit-test \ + cpulimit-test2 +endif + +if HAVE_GLIB20 +TESTS += \ + mainloop-test-glib +TESTS_BINARIES += \ + mainloop-test-glib +endif + +if HAVE_GTK20 +TESTS_BINARIES += \ + gtk-test +endif + +if HAVE_ALSA +TESTS_BINARIES += \ + alsa-time-test +endif + +if BUILD_TESTS_DEFAULT +noinst_PROGRAMS = $(TESTS_BINARIES) +else +check_PROGRAMS = $(TESTS_BINARIES) +endif + +mainloop_test_SOURCES = tests/mainloop-test.c +mainloop_test_CFLAGS = $(AM_CFLAGS) +mainloop_test_LDADD = $(AM_LDADD) libpulse.la libpulsecommon-@PA_MAJORMINORMICRO@.la +mainloop_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) + +thread_mainloop_test_SOURCES = tests/thread-mainloop-test.c +thread_mainloop_test_CFLAGS = $(AM_CFLAGS) +thread_mainloop_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINORMICRO@.la libpulse.la libpulsecommon-@PA_MAJORMINORMICRO@.la +thread_mainloop_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) + +utf8_test_SOURCES = tests/utf8-test.c +utf8_test_CFLAGS = $(AM_CFLAGS) +utf8_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la +utf8_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) + +get_binary_name_test_SOURCES = tests/get-binary-name-test.c +get_binary_name_test_CFLAGS = $(AM_CFLAGS) +get_binary_name_test_LDADD = $(AM_LDADD) libpulse.la libpulsecommon-@PA_MAJORMINORMICRO@.la +get_binary_name_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) + +ipacl_test_SOURCES = tests/ipacl-test.c +ipacl_test_CFLAGS = $(AM_CFLAGS) +ipacl_test_LDADD = $(AM_LDADD) libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la libpulsecore-@PA_MAJORMINORMICRO@.la +ipacl_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) + +hook_list_test_SOURCES = tests/hook-list-test.c +hook_list_test_CFLAGS = $(AM_CFLAGS) +hook_list_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la +hook_list_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) + +memblock_test_SOURCES = tests/memblock-test.c +memblock_test_CFLAGS = $(AM_CFLAGS) +memblock_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la +memblock_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) + +thread_test_SOURCES = tests/thread-test.c +thread_test_CFLAGS = $(AM_CFLAGS) +thread_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la +thread_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) + +flist_test_SOURCES = tests/flist-test.c +flist_test_CFLAGS = $(AM_CFLAGS) +flist_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la +flist_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) + +asyncq_test_SOURCES = tests/asyncq-test.c +asyncq_test_CFLAGS = $(AM_CFLAGS) +asyncq_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la +asyncq_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) + +asyncmsgq_test_SOURCES = tests/asyncmsgq-test.c +asyncmsgq_test_CFLAGS = $(AM_CFLAGS) +asyncmsgq_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la +asyncmsgq_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) + +queue_test_SOURCES = tests/queue-test.c +queue_test_CFLAGS = $(AM_CFLAGS) +queue_test_LDADD = $(AM_LDADD) libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la libpulsecore-@PA_MAJORMINORMICRO@.la +queue_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) + +rtpoll_test_SOURCES = tests/rtpoll-test.c +rtpoll_test_CFLAGS = $(AM_CFLAGS) +rtpoll_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la +rtpoll_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) + +mcalign_test_SOURCES = tests/mcalign-test.c +mcalign_test_CFLAGS = $(AM_CFLAGS) +mcalign_test_LDADD = $(AM_LDADD) $(WINSOCK_LIBS) libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la libpulsecore-@PA_MAJORMINORMICRO@.la +mcalign_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) + +pacat_simple_SOURCES = tests/pacat-simple.c +pacat_simple_LDADD = $(AM_LDADD) libpulse.la libpulse-simple.la libpulsecommon-@PA_MAJORMINORMICRO@.la +pacat_simple_CFLAGS = $(AM_CFLAGS) +pacat_simple_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) + +parec_simple_SOURCES = tests/parec-simple.c +parec_simple_LDADD = $(AM_LDADD) libpulse.la libpulse-simple.la libpulsecommon-@PA_MAJORMINORMICRO@.la +parec_simple_CFLAGS = $(AM_CFLAGS) +parec_simple_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) + +strlist_test_SOURCES = tests/strlist-test.c +strlist_test_CFLAGS = $(AM_CFLAGS) +strlist_test_LDADD = $(AM_LDADD) $(WINSOCK_LIBS) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la +strlist_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) + +close_test_SOURCES = tests/close-test.c +close_test_CFLAGS = $(AM_CFLAGS) +close_test_LDADD = $(AM_LDADD) $(WINSOCK_LIBS) libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la libpulsecore-@PA_MAJORMINORMICRO@.la +close_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) + +voltest_SOURCES = tests/voltest.c +voltest_CFLAGS = $(AM_CFLAGS) +voltest_LDADD = $(AM_LDADD) libpulse.la libpulsecommon-@PA_MAJORMINORMICRO@.la +voltest_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) + +vector_test_SOURCES = tests/vector-test.c +vector_test_CFLAGS = $(AM_CFLAGS) +vector_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la +vector_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) + +channelmap_test_SOURCES = tests/channelmap-test.c +channelmap_test_CFLAGS = $(AM_CFLAGS) +channelmap_test_LDADD = $(AM_LDADD) libpulse.la libpulsecommon-@PA_MAJORMINORMICRO@.la +channelmap_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) + +cpulimit_test_SOURCES = tests/cpulimit-test.c daemon/cpulimit.c daemon/cpulimit.h +cpulimit_test_CFLAGS = $(AM_CFLAGS) +cpulimit_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la +cpulimit_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) + +cpulimit_test2_SOURCES = tests/cpulimit-test.c daemon/cpulimit.c daemon/cpulimit.h +cpulimit_test2_CFLAGS = $(AM_CFLAGS) -DTEST2 +cpulimit_test2_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la +cpulimit_test2_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) + +mainloop_test_glib_SOURCES = $(mainloop_test_SOURCES) +mainloop_test_glib_CFLAGS = $(mainloop_test_CFLAGS) $(GLIB20_CFLAGS) -DGLIB_MAIN_LOOP +mainloop_test_glib_LDADD = $(mainloop_test_LDADD) $(GLIB20_LIBS) libpulse-mainloop-glib.la +mainloop_test_glib_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) + +memblockq_test_SOURCES = tests/memblockq-test.c +memblockq_test_CFLAGS = $(AM_CFLAGS) +memblockq_test_LDADD = $(AM_LDADD) $(WINSOCK_LIBS) libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la libpulsecore-@PA_MAJORMINORMICRO@.la +memblockq_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) + +sync_playback_SOURCES = tests/sync-playback.c +sync_playback_LDADD = $(AM_LDADD) libpulse.la libpulsecommon-@PA_MAJORMINORMICRO@.la +sync_playback_CFLAGS = $(AM_CFLAGS) +sync_playback_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) + +interpol_test_SOURCES = tests/interpol-test.c +interpol_test_LDADD = $(AM_LDADD) libpulse.la libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la +interpol_test_CFLAGS = $(AM_CFLAGS) +interpol_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) + +sig2str_test_SOURCES = tests/sig2str-test.c +sig2str_test_LDADD = $(AM_LDADD) libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la libpulsecore-@PA_MAJORMINORMICRO@.la +sig2str_test_CFLAGS = $(AM_CFLAGS) +sig2str_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) + +resampler_test_SOURCES = tests/resampler-test.c +resampler_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la +resampler_test_CFLAGS = $(AM_CFLAGS) +resampler_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) + +mix_test_SOURCES = tests/mix-test.c +mix_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la +mix_test_CFLAGS = $(AM_CFLAGS) +mix_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) + +remix_test_SOURCES = tests/remix-test.c +remix_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la +remix_test_CFLAGS = $(AM_CFLAGS) +remix_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) + +smoother_test_SOURCES = tests/smoother-test.c +smoother_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la +smoother_test_CFLAGS = $(AM_CFLAGS) +smoother_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) + +envelope_test_SOURCES = tests/envelope-test.c +envelope_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la +envelope_test_CFLAGS = $(AM_CFLAGS) +envelope_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) + +proplist_test_SOURCES = tests/proplist-test.c +proplist_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la +proplist_test_CFLAGS = $(AM_CFLAGS) +proplist_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) + +rtstutter_SOURCES = tests/rtstutter.c +rtstutter_LDADD = $(AM_LDADD) libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la libpulsecore-@PA_MAJORMINORMICRO@.la +rtstutter_CFLAGS = $(AM_CFLAGS) +rtstutter_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) + +stripnul_SOURCES = tests/stripnul.c +stripnul_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la +stripnul_CFLAGS = $(AM_CFLAGS) +stripnul_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) + +lock_autospawn_test_SOURCES = tests/lock-autospawn-test.c +lock_autospawn_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la +lock_autospawn_test_CFLAGS = $(AM_CFLAGS) +lock_autospawn_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) + +prioq_test_SOURCES = tests/prioq-test.c +prioq_test_LDADD = $(AM_LDADD) libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la libpulsecore-@PA_MAJORMINORMICRO@.la +prioq_test_CFLAGS = $(AM_CFLAGS) +prioq_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) + +sigbus_test_SOURCES = tests/sigbus-test.c +sigbus_test_LDADD = $(AM_LDADD) libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la libpulsecore-@PA_MAJORMINORMICRO@.la +sigbus_test_CFLAGS = $(AM_CFLAGS) +sigbus_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) + +gtk_test_SOURCES = tests/gtk-test.c +gtk_test_LDADD = $(AM_LDADD) libpulse.la libpulse-mainloop-glib.la libpulsecommon-@PA_MAJORMINORMICRO@.la +gtk_test_CFLAGS = $(AM_CFLAGS) $(GTK20_CFLAGS) +gtk_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(GTK20_LIBS) + +alsa_time_test_SOURCES = tests/alsa-time-test.c +alsa_time_test_LDADD = $(AM_LDADD) +alsa_time_test_CFLAGS = $(AM_CFLAGS) $(ASOUNDLIB_CFLAGS) +alsa_time_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(ASOUNDLIB_LIBS) + +usergroup_test_SOURCES = tests/usergroup-test.c +usergroup_test_LDADD = $(AM_LDADD) libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la libpulsecore-@PA_MAJORMINORMICRO@.la +usergroup_test_CFLAGS = $(AM_CFLAGS) +usergroup_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) + +################################### +# Common library # +################################### + +lib_LTLIBRARIES = \ + libpulsecommon-@PA_MAJORMINORMICRO@.la + +libpulsecommon_@PA_MAJORMINORMICRO@_la_SOURCES = \ + pulse/client-conf.c pulse/client-conf.h \ + pulse/i18n.c pulse/i18n.h \ + pulse/fork-detect.c pulse/fork-detect.h \ + pulsecore/atomic.h \ + pulsecore/authkey.c pulsecore/authkey.h \ + pulsecore/conf-parser.c pulsecore/conf-parser.h \ + pulsecore/core-error.c pulsecore/core-error.h \ + pulsecore/core-rtclock.c pulsecore/core-rtclock.h \ + pulsecore/core-util.c pulsecore/core-util.h \ + pulsecore/creds.h \ + pulsecore/dynarray.c pulsecore/dynarray.h \ + pulsecore/endianmacros.h \ + pulsecore/flist.c pulsecore/flist.h \ + pulsecore/hashmap.c pulsecore/hashmap.h \ + pulsecore/idxset.c pulsecore/idxset.h \ + pulsecore/inet_ntop.c pulsecore/inet_ntop.h \ + pulsecore/inet_pton.c pulsecore/inet_pton.h \ + pulsecore/iochannel.c pulsecore/iochannel.h \ + pulsecore/ioline.c pulsecore/ioline.h \ + pulsecore/ipacl.h pulsecore/ipacl.c \ + pulsecore/llist.h \ + pulsecore/lock-autospawn.c pulsecore/lock-autospawn.h \ + pulsecore/log.c pulsecore/log.h \ + pulsecore/ratelimit.c pulsecore/ratelimit.h \ + pulsecore/macro.h pulsecore/vector.h \ + pulsecore/mcalign.c pulsecore/mcalign.h \ + pulsecore/memblock.c pulsecore/memblock.h \ + pulsecore/memblockq.c pulsecore/memblockq.h \ + pulsecore/memchunk.c pulsecore/memchunk.h \ + pulsecore/native-common.h \ + pulsecore/once.c pulsecore/once.h \ + pulsecore/packet.c pulsecore/packet.h \ + pulsecore/parseaddr.c pulsecore/parseaddr.h \ + pulsecore/pdispatch.c pulsecore/pdispatch.h \ + pulsecore/pid.c pulsecore/pid.h \ + pulsecore/pipe.c pulsecore/pipe.h \ + pulsecore/poll.c pulsecore/poll.h \ + pulsecore/prioq.c pulsecore/prioq.h \ + pulsecore/memtrap.c pulsecore/memtrap.h \ + pulsecore/aupdate.c pulsecore/aupdate.h \ + pulsecore/proplist-util.c pulsecore/proplist-util.h \ + pulsecore/pstream-util.c pulsecore/pstream-util.h \ + pulsecore/pstream.c pulsecore/pstream.h \ + pulsecore/queue.c pulsecore/queue.h \ + pulsecore/random.c pulsecore/random.h \ + pulsecore/refcnt.h \ + pulsecore/shm.c pulsecore/shm.h \ + pulsecore/bitset.c pulsecore/bitset.h \ + pulsecore/socket-client.c pulsecore/socket-client.h \ + pulsecore/socket-server.c pulsecore/socket-server.h \ + pulsecore/socket-util.c pulsecore/socket-util.h \ + pulsecore/strbuf.c pulsecore/strbuf.h \ + pulsecore/strlist.c pulsecore/strlist.h \ + pulsecore/tagstruct.c pulsecore/tagstruct.h \ + pulsecore/time-smoother.c pulsecore/time-smoother.h \ + pulsecore/tokenizer.c pulsecore/tokenizer.h \ + pulsecore/usergroup.c pulsecore/usergroup.h \ + pulsecore/sndfile-util.c pulsecore/sndfile-util.h \ + pulsecore/winsock.h + +libpulsecommon_@PA_MAJORMINORMICRO@_la_CFLAGS = $(AM_CFLAGS) +libpulsecommon_@PA_MAJORMINORMICRO@_la_LDFLAGS = $(AM_LDFLAGS) -avoid-version +libpulsecommon_@PA_MAJORMINORMICRO@_la_LIBADD = $(AM_LIBADD) $(LIBWRAP_LIBS) $(WINSOCK_LIBS) $(LTLIBICONV) $(LIBSNDFILE_LIBS) + +# proplist-util.h uses these header files, but not the library itself! +libpulsecommon_@PA_MAJORMINORMICRO@_la_CFLAGS += $(GLIB20_CFLAGS) $(GTK20_CFLAGS) + +## Please note that libpulsecommon implicitly also depends on< +## libpulse! i.e. we have a cyclic dependancy here. Which is intended +## since libpulse only includes stable, official APIs, while +## libpulsecommon only includes unofficial APIs. + +if OS_IS_WIN32 +libpulsecommon_@PA_MAJORMINORMICRO@_la_SOURCES += \ + pulsecore/mutex-win32.c pulsecore/mutex.h \ + pulsecore/thread-win32.c pulsecore/thread.h \ + pulsecore/semaphore-win32.c pulsecore/semaphore.h +else +libpulsecommon_@PA_MAJORMINORMICRO@_la_SOURCES += \ + pulsecore/mutex-posix.c pulsecore/mutex.h \ + pulsecore/thread-posix.c pulsecore/thread.h \ + pulsecore/semaphore-posix.c pulsecore/semaphore.h +endif + +if HAVE_X11 +libpulsecommon_@PA_MAJORMINORMICRO@_la_SOURCES += pulsecore/x11prop.c pulsecore/x11prop.h +libpulsecommon_@PA_MAJORMINORMICRO@_la_CFLAGS += $(X11_CFLAGS) +libpulsecommon_@PA_MAJORMINORMICRO@_la_LDFLAGS += $(X11_LIBS) +endif + +if HAVE_LIBASYNCNS +libpulsecommon_@PA_MAJORMINORMICRO@_la_CFLAGS += $(LIBASYNCNS_CFLAGS) +libpulsecommon_@PA_MAJORMINORMICRO@_la_LIBADD += $(LIBASYNCNS_LIBS) +endif + +if OS_IS_WIN32 +libpulsecommon_@PA_MAJORMINORMICRO@_la_SOURCES += pulsecore/dllmain.c +endif + +if HAVE_DBUS +libpulsecommon_@PA_MAJORMINORMICRO@_la_SOURCES += \ + pulsecore/dbus-util.c pulsecore/dbus-util.h \ + pulsecore/rtkit.c pulsecore/rtkit.h +libpulsecommon_@PA_MAJORMINORMICRO@_la_CFLAGS += $(DBUS_CFLAGS) +libpulsecommon_@PA_MAJORMINORMICRO@_la_LIBADD += $(DBUS_LIBS) +endif + +if USE_DLOG +libpulsecommon_@PA_MAJORMINORMICRO@_la_CFLAGS += $(DLOG_CFLAGS) -DUSE_DLOG +libpulsecommon_@PA_MAJORMINORMICRO@_la_LIBADD += $(DLOG_LIBS) +endif + + +################################### +# Client library # +################################### + +pulseinclude_HEADERS = \ + pulse/cdecl.h \ + pulse/channelmap.h \ + pulse/context.h \ + pulse/def.h \ + pulse/error.h \ + pulse/ext-device-manager.h \ + pulse/ext-stream-restore.h \ + pulse/ext-policy.h \ + pulse/gccmacro.h \ + pulse/introspect.h \ + pulse/mainloop-api.h \ + pulse/mainloop-signal.h \ + pulse/mainloop.h \ + pulse/operation.h \ + pulse/proplist.h \ + pulse/pulseaudio.h \ + pulse/rtclock.h \ + pulse/sample.h \ + pulse/scache.h \ + pulse/simple.h \ + pulse/stream.h \ + pulse/subscribe.h \ + pulse/thread-mainloop.h \ + pulse/timeval.h \ + pulse/utf8.h \ + pulse/util.h \ + pulse/version.h \ + pulse/volume.h \ + pulse/xmalloc.h + +lib_LTLIBRARIES += \ + libpulse.la \ + libpulse-simple.la + +if HAVE_AVAHI +pulseinclude_HEADERS += \ + pulse/browser.h + +lib_LTLIBRARIES += \ + libpulse-browse.la +endif + +if HAVE_GLIB20 +pulseinclude_HEADERS += \ + pulse/glib-mainloop.h + +lib_LTLIBRARIES += \ + libpulse-mainloop-glib.la +endif + +# Public interface +libpulse_la_SOURCES = \ + pulse/cdecl.h \ + pulse/channelmap.c pulse/channelmap.h \ + pulse/context.c pulse/context.h \ + pulse/def.h \ + pulse/error.c pulse/error.h \ + pulse/ext-device-manager.c pulse/ext-device-manager.h \ + pulse/ext-stream-restore.c pulse/ext-stream-restore.h \ + pulse/ext-policy.c pulse/ext-policy.h \ + pulse/gccmacro.h \ + pulse/internal.h \ + pulse/introspect.c pulse/introspect.h \ + pulse/mainloop-api.c pulse/mainloop-api.h \ + pulse/mainloop-signal.c pulse/mainloop-signal.h \ + pulse/mainloop.c pulse/mainloop.h \ + pulse/operation.c pulse/operation.h \ + pulse/proplist.c pulse/proplist.h \ + pulse/pulseaudio.h \ + pulse/rtclock.c pulse/rtclock.h \ + pulse/sample.c pulse/sample.h \ + pulse/scache.c pulse/scache.h \ + pulse/stream.c pulse/stream.h \ + pulse/subscribe.c pulse/subscribe.h \ + pulse/thread-mainloop.c pulse/thread-mainloop.h \ + pulse/timeval.c pulse/timeval.h \ + pulse/utf8.c pulse/utf8.h \ + pulse/util.c pulse/util.h \ + pulse/volume.c pulse/volume.h \ + pulse/xmalloc.c pulse/xmalloc.h + +libpulse_la_CFLAGS = $(AM_CFLAGS) $(DBUS_CFLAGS) +libpulse_la_LIBADD = $(AM_LIBADD) $(WINSOCK_LIBS) $(LTLIBICONV) libpulsecommon-@PA_MAJORMINORMICRO@.la +libpulse_la_LDFLAGS = $(AM_LDFLAGS) $(VERSIONING_LDFLAGS) -version-info $(LIBPULSE_VERSION_INFO) + +if HAVE_X11 +libpulse_la_SOURCES += pulse/client-conf-x11.c pulse/client-conf-x11.h +libpulse_la_CFLAGS += $(X11_CFLAGS) +libpulse_la_LDFLAGS += $(X11_LIBS) +endif + +libpulse_simple_la_SOURCES = pulse/simple.c pulse/simple.h +libpulse_simple_la_CFLAGS = $(AM_CFLAGS) $(DBUS_CFLAGS) +libpulse_simple_la_LIBADD = $(AM_LIBADD) libpulse.la libpulsecommon-@PA_MAJORMINORMICRO@.la +libpulse_simple_la_LDFLAGS = $(AM_LDFLAGS) $(VERSIONING_LDFLAGS) -version-info $(LIBPULSE_SIMPLE_VERSION_INFO) + +libpulse_browse_la_SOURCES = pulse/browser.c pulse/browser.h pulsecore/avahi-wrap.c pulsecore/avahi-wrap.h +libpulse_browse_la_CFLAGS = $(AM_CFLAGS) $(AVAHI_CFLAGS) +libpulse_browse_la_LIBADD = $(AM_LIBADD) libpulse.la libpulsecommon-@PA_MAJORMINORMICRO@.la $(AVAHI_LIBS) +libpulse_browse_la_LDFLAGS = $(AM_LDFLAGS) $(VERSIONING_LDFLAGS) -version-info $(LIBPULSE_BROWSE_VERSION_INFO) + +libpulse_mainloop_glib_la_SOURCES = pulse/glib-mainloop.h pulse/glib-mainloop.c +libpulse_mainloop_glib_la_CFLAGS = $(AM_CFLAGS) $(GLIB20_CFLAGS) +libpulse_mainloop_glib_la_LIBADD = $(AM_LIBADD) libpulse.la libpulsecommon-@PA_MAJORMINORMICRO@.la $(GLIB20_LIBS) +libpulse_mainloop_glib_la_LDFLAGS = $(AM_LDFLAGS) $(VERSIONING_LDFLAGS) -version-info $(LIBPULSE_MAINLOOP_GLIB_VERSION_INFO) + +################################### +# OSS emulation # +################################### + +if HAVE_OSS_WRAPPER +lib_LTLIBRARIES += libpulsedsp.la +bin_SCRIPTS += utils/padsp +endif + +libpulsedsp_la_SOURCES = utils/padsp.c +libpulsedsp_la_CFLAGS = $(AM_CFLAGS) +libpulsedsp_la_LIBADD = $(AM_LIBADD) libpulse.la libpulsecommon-@PA_MAJORMINORMICRO@.la +libpulsedsp_la_LDFLAGS = $(AM_LDFLAGS) -avoid-version -disable-static + +################################### +# Daemon core library # +################################### + +lib_LTLIBRARIES += libpulsecore-@PA_MAJORMINORMICRO@.la + +# Pure core stuff +libpulsecore_@PA_MAJORMINORMICRO@_la_SOURCES = \ + pulsecore/asyncmsgq.c pulsecore/asyncmsgq.h \ + pulsecore/asyncq.c pulsecore/asyncq.h \ + pulsecore/auth-cookie.c pulsecore/auth-cookie.h \ + pulsecore/cli-command.c pulsecore/cli-command.h \ + pulsecore/cli-text.c pulsecore/cli-text.h \ + pulsecore/client.c pulsecore/client.h \ + pulsecore/card.c pulsecore/card.h \ + pulsecore/core-scache.c pulsecore/core-scache.h \ + pulsecore/core-subscribe.c pulsecore/core-subscribe.h \ + pulsecore/core.c pulsecore/core.h \ + pulsecore/envelope.c pulsecore/envelope.h \ + pulsecore/fdsem.c pulsecore/fdsem.h \ + pulsecore/g711.c pulsecore/g711.h \ + pulsecore/hook-list.c pulsecore/hook-list.h \ + pulsecore/ltdl-helper.c pulsecore/ltdl-helper.h \ + pulsecore/modargs.c pulsecore/modargs.h \ + pulsecore/modinfo.c pulsecore/modinfo.h \ + pulsecore/module.c pulsecore/module.h \ + pulsecore/msgobject.c pulsecore/msgobject.h \ + pulsecore/namereg.c pulsecore/namereg.h \ + pulsecore/object.c pulsecore/object.h \ + pulsecore/play-memblockq.c pulsecore/play-memblockq.h \ + pulsecore/play-memchunk.c pulsecore/play-memchunk.h \ + pulsecore/remap.c pulsecore/remap.h \ + pulsecore/remap_mmx.c pulsecore/remap_sse.c \ + pulsecore/resampler.c pulsecore/resampler.h \ + pulsecore/rtpoll.c pulsecore/rtpoll.h \ + pulsecore/sample-util.c pulsecore/sample-util.h \ + pulsecore/cpu-arm.c pulsecore/cpu-arm.h \ + pulsecore/cpu-x86.c pulsecore/cpu-x86.h \ + pulsecore/svolume_c.c pulsecore/svolume_arm.c \ + pulsecore/svolume_mmx.c pulsecore/svolume_sse.c \ + pulsecore/sconv-s16be.c pulsecore/sconv-s16be.h \ + pulsecore/sconv-s16le.c pulsecore/sconv-s16le.h \ + pulsecore/sconv_sse.c \ + pulsecore/sconv.c pulsecore/sconv.h \ + pulsecore/shared.c pulsecore/shared.h \ + pulsecore/shm.c pulsecore/shm.h \ + pulsecore/sink-input.c pulsecore/sink-input.h \ + pulsecore/sink.c pulsecore/sink.h \ + pulsecore/sioman.c pulsecore/sioman.h \ + pulsecore/sound-file-stream.c pulsecore/sound-file-stream.h \ + pulsecore/sound-file.c pulsecore/sound-file.h \ + pulsecore/source-output.c pulsecore/source-output.h \ + pulsecore/source.c pulsecore/source.h \ + pulsecore/start-child.c pulsecore/start-child.h \ + pulsecore/thread-mq.c pulsecore/thread-mq.h \ + pulsecore/time-smoother.c pulsecore/time-smoother.h \ + pulsecore/database.h + +libpulsecore_@PA_MAJORMINORMICRO@_la_CFLAGS = $(AM_CFLAGS) $(LIBSAMPLERATE_CFLAGS) $(LIBSPEEX_CFLAGS) $(WINSOCK_CFLAGS) +libpulsecore_@PA_MAJORMINORMICRO@_la_LDFLAGS = -avoid-version +libpulsecore_@PA_MAJORMINORMICRO@_la_LIBADD = $(AM_LIBADD) $(LIBLTDL) $(LIBSAMPLERATE_LIBS) $(LIBSPEEX_LIBS) $(WINSOCK_LIBS) $(LTLIBICONV) libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la libpulsecore-foreign.la + +if HAVE_X11 +libpulsecore_@PA_MAJORMINORMICRO@_la_SOURCES += pulsecore/x11wrap.c pulsecore/x11wrap.h +libpulsecore_@PA_MAJORMINORMICRO@_la_CFLAGS += $(X11_CFLAGS) +libpulsecore_@PA_MAJORMINORMICRO@_la_LDFLAGS += $(X11_LIBS) +endif + +if HAVE_DBUS +libpulsecore_@PA_MAJORMINORMICRO@_la_SOURCES += pulsecore/dbus-shared.c pulsecore/dbus-shared.h +libpulsecore_@PA_MAJORMINORMICRO@_la_CFLAGS += $(DBUS_CFLAGS) +libpulsecore_@PA_MAJORMINORMICRO@_la_LIBADD += $(DBUS_LIBS) +endif + +if HAVE_GDBM +libpulsecore_@PA_MAJORMINORMICRO@_la_SOURCES += pulsecore/database-gdbm.c +libpulsecore_@PA_MAJORMINORMICRO@_la_CFLAGS += $(GDBM_CFLAGS) +libpulsecore_@PA_MAJORMINORMICRO@_la_LIBADD += $(GDBM_LIBS) +endif + +if HAVE_TDB +libpulsecore_@PA_MAJORMINORMICRO@_la_SOURCES += pulsecore/database-tdb.c +libpulsecore_@PA_MAJORMINORMICRO@_la_CFLAGS += $(TDB_CFLAGS) +libpulsecore_@PA_MAJORMINORMICRO@_la_LIBADD += $(TDB_LIBS) +endif + +if HAVE_SIMPLEDB +libpulsecore_@PA_MAJORMINORMICRO@_la_SOURCES += pulsecore/database-simple.c +endif + +# We split the foreign code off to not be annoyed by warnings we don't care about +noinst_LTLIBRARIES = libpulsecore-foreign.la + +libpulsecore_foreign_la_SOURCES = \ + pulsecore/ffmpeg/resample2.c pulsecore/ffmpeg/avcodec.h pulsecore/ffmpeg/dsputil.h + +libpulsecore_foreign_la_CFLAGS = $(AM_CFLAGS) $(FOREIGN_CFLAGS) + +################################### +# Plug-in support libraries # +################################### + +### Warning! Due to an obscure bug in libtool/automake it is required +### that the libraries in modlibexec_LTLIBRARIES are specified in-order, +### i.e. libraries near the end of the list depend on libraries near +### the head, and not the other way! + +modlibexec_LTLIBRARIES = \ + libcli.la \ + libprotocol-cli.la \ + libprotocol-simple.la \ + libprotocol-http.la \ + libprotocol-native.la \ + libprotocol-esound.la + +# We need to emulate sendmsg/recvmsg to support this on Win32 +if !OS_IS_WIN32 +modlibexec_LTLIBRARIES += \ + librtp.la +endif + +if HAVE_AVAHI +modlibexec_LTLIBRARIES += \ + libavahi-wrap.la +endif + +libprotocol_simple_la_SOURCES = pulsecore/protocol-simple.c pulsecore/protocol-simple.h +libprotocol_simple_la_LDFLAGS = -avoid-version +libprotocol_simple_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la + +libcli_la_SOURCES = pulsecore/cli.c pulsecore/cli.h +libcli_la_LDFLAGS = -avoid-version +libcli_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la + +libprotocol_cli_la_SOURCES = pulsecore/protocol-cli.c pulsecore/protocol-cli.h +libprotocol_cli_la_LDFLAGS = -avoid-version +libprotocol_cli_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la libcli.la + +libprotocol_http_la_SOURCES = pulsecore/protocol-http.c pulsecore/protocol-http.h pulsecore/mime-type.c pulsecore/mime-type.h +libprotocol_http_la_LDFLAGS = -avoid-version +libprotocol_http_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la + +libprotocol_native_la_SOURCES = pulsecore/protocol-native.c pulsecore/protocol-native.h pulsecore/native-common.h +libprotocol_native_la_LDFLAGS = -avoid-version +libprotocol_native_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la + +libprotocol_esound_la_SOURCES = pulsecore/protocol-esound.c pulsecore/protocol-esound.h pulsecore/esound.h +libprotocol_esound_la_LDFLAGS = -avoid-version +libprotocol_esound_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la + +librtp_la_SOURCES = \ + modules/rtp/rtp.c modules/rtp/rtp.h \ + modules/rtp/sdp.c modules/rtp/sdp.h \ + modules/rtp/sap.c modules/rtp/sap.h \ + modules/rtp/rtsp_client.c modules/rtp/rtsp_client.h \ + modules/rtp/headerlist.c modules/rtp/headerlist.h +librtp_la_LDFLAGS = -avoid-version +librtp_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la + +libraop_la_SOURCES = \ + modules/raop/raop_client.c modules/raop/raop_client.h \ + modules/raop/base64.c modules/raop/base64.h +libraop_la_CFLAGS = $(AM_CFLAGS) $(OPENSSL_CFLAGS) +libraop_la_LDFLAGS = -avoid-version +libraop_la_LIBADD = $(AM_LIBADD) $(OPENSSL_LIBS) libpulsecore-@PA_MAJORMINORMICRO@.la librtp.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la + +# Avahi +libavahi_wrap_la_SOURCES = pulsecore/avahi-wrap.c pulsecore/avahi-wrap.h +libavahi_wrap_la_LDFLAGS = -avoid-version +libavahi_wrap_la_CFLAGS = $(AM_CFLAGS) $(AVAHI_CFLAGS) +libavahi_wrap_la_LIBADD = $(AM_LIBADD) $(AVAHI_CFLAGS) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la + +################################### +# Plug-in libraries # +################################### + +if HAVE_DBUS +# Serveral module (e.g. libalsa-util.la) +modlibexec_LTLIBRARIES += \ + module-console-kit.la \ + module-policy.la +endif + +modlibexec_LTLIBRARIES += \ + module-cli.la \ + module-cli-protocol-tcp.la \ + module-simple-protocol-tcp.la \ + module-null-sink.la \ + module-sine-source.la \ + module-detect.la \ + module-volume-restore.la \ + module-device-manager.la \ + module-device-restore.la \ + module-stream-restore.la \ + module-card-restore.la \ + module-default-device-restore.la \ + module-always-sink.la \ + module-rescue-streams.la \ + module-intended-roles.la \ + module-suspend-on-idle.la \ + module-echo-cancel.la \ + module-http-protocol-tcp.la \ + module-sine.la \ + module-native-protocol-tcp.la \ + module-native-protocol-fd.la \ + module-esound-protocol-tcp.la \ + module-combine.la \ + module-remap-sink.la \ + module-ladspa-sink.la \ + module-esound-sink.la \ + module-tunnel-sink.la \ + module-tunnel-source.la \ + module-position-event-sounds.la \ + module-augment-properties.la \ + module-cork-music-on-phone.la \ + module-loopback.la \ + module-virtual-sink.la \ + module-virtual-source.la + +# See comment at librtp.la above +if !OS_IS_WIN32 +modlibexec_LTLIBRARIES += \ + module-rtp-send.la \ + module-rtp-recv.la +endif + +if HAVE_AF_UNIX +modlibexec_LTLIBRARIES += \ + module-cli-protocol-unix.la \ + module-simple-protocol-unix.la \ + module-http-protocol-unix.la \ + module-native-protocol-unix.la \ + module-esound-protocol-unix.la +endif + +if HAVE_MKFIFO +modlibexec_LTLIBRARIES += \ + module-pipe-sink.la \ + module-pipe-source.la +endif + +if !OS_IS_WIN32 +modlibexec_LTLIBRARIES += \ + module-esound-compat-spawnfd.la \ + module-esound-compat-spawnpid.la +endif + +if HAVE_REGEX +modlibexec_LTLIBRARIES += \ + module-match.la +endif + +if HAVE_X11 +modlibexec_LTLIBRARIES += \ + module-x11-bell.la \ + module-x11-publish.la \ + module-x11-xsmp.la \ + module-x11-cork-request.la +endif + +if HAVE_OSS_OUTPUT +modlibexec_LTLIBRARIES += \ + liboss-util.la \ + module-oss.la +endif + +pulselibexec_PROGRAMS = + +if HAVE_ALSA +modlibexec_LTLIBRARIES += \ + libalsa-util.la \ + module-alsa-sink.la \ + module-alsa-source.la \ + module-alsa-card.la + +alsaprofilesets_DATA = ${ALSA_PROFILES} + +if HAVE_UDEV +udevrules_DATA = \ + modules/alsa/mixer/profile-sets/90-pulseaudio.rules +endif + +alsapaths_DATA = ${ALSA_PATHS} + +endif + +if HAVE_SOLARIS +modlibexec_LTLIBRARIES += \ + module-solaris.la +endif + +if HAVE_AVAHI +modlibexec_LTLIBRARIES += \ + module-zeroconf-publish.la \ + module-zeroconf-discover.la +endif + +if HAVE_LIRC +modlibexec_LTLIBRARIES += \ + module-lirc.la +endif + +if HAVE_EVDEV +modlibexec_LTLIBRARIES += \ + module-mmkbd-evdev.la +endif + +if HAVE_JACK +modlibexec_LTLIBRARIES += \ + module-jack-sink.la \ + module-jack-source.la +endif + +if HAVE_GCONF +modlibexec_LTLIBRARIES += \ + module-gconf.la + +pulselibexec_PROGRAMS += \ + gconf-helper +endif + +#if OS_IS_WIN32 +#modlibexec_LTLIBRARIES += \ +# module-waveout.la +#endif + +if HAVE_HAL +modlibexec_LTLIBRARIES += \ + module-hal-detect.la +endif + +if HAVE_HAL_COMPAT +modlibexec_LTLIBRARIES += \ + module-hal-detect.la +endif + +if HAVE_UDEV +modlibexec_LTLIBRARIES += \ + module-udev-detect.la +endif + +if HAVE_DBUS +modlibexec_LTLIBRARIES += \ + module-rygel-media-server.la +endif + +if HAVE_BLUEZ +modlibexec_LTLIBRARIES += \ + libbluetooth-util.la \ + module-bluetooth-proximity.la \ + module-bluetooth-discover.la \ + libbluetooth-ipc.la \ + libbluetooth-sbc.la \ + module-bluetooth-device.la + +pulselibexec_PROGRAMS += \ + proximity-helper +endif + +if HAVE_OPENSSL +modlibexec_LTLIBRARIES += \ + libraop.la \ + module-raop-sink.la +if HAVE_AVAHI +modlibexec_LTLIBRARIES += \ + module-raop-discover.la +endif +endif + +# These are generated by an M4 script +SYMDEF_FILES = \ + modules/module-cli-symdef.h \ + modules/module-cli-protocol-tcp-symdef.h \ + modules/module-cli-protocol-unix-symdef.h \ + modules/module-pipe-sink-symdef.h \ + modules/module-pipe-source-symdef.h \ + modules/module-simple-protocol-tcp-symdef.h \ + modules/module-simple-protocol-unix-symdef.h \ + modules/module-esound-protocol-tcp-symdef.h \ + modules/module-esound-protocol-unix-symdef.h \ + modules/module-native-protocol-tcp-symdef.h \ + modules/module-native-protocol-unix-symdef.h \ + modules/module-native-protocol-fd-symdef.h \ + modules/module-sine-symdef.h \ + modules/module-combine-symdef.h \ + modules/module-remap-sink-symdef.h \ + modules/module-ladspa-sink-symdef.h \ + modules/module-esound-compat-spawnfd-symdef.h \ + modules/module-esound-compat-spawnpid-symdef.h \ + modules/module-match-symdef.h \ + modules/module-tunnel-sink-symdef.h \ + modules/module-tunnel-source-symdef.h \ + modules/module-null-sink-symdef.h \ + modules/module-sine-source-symdef.h \ + modules/module-esound-sink-symdef.h \ + modules/module-zeroconf-publish-symdef.h \ + modules/module-zeroconf-discover-symdef.h \ + modules/module-lirc-symdef.h \ + modules/module-mmkbd-evdev-symdef.h \ + modules/module-http-protocol-tcp-symdef.h \ + modules/module-http-protocol-unix-symdef.h \ + modules/module-rygel-media-server-symdef.h \ + modules/x11/module-x11-bell-symdef.h \ + modules/x11/module-x11-publish-symdef.h \ + modules/x11/module-x11-xsmp-symdef.h \ + modules/x11/module-x11-cork-request-symdef.h \ + modules/oss/module-oss-symdef.h \ + modules/alsa/module-alsa-sink-symdef.h \ + modules/alsa/module-alsa-source-symdef.h \ + modules/alsa/module-alsa-card-symdef.h \ + modules/module-solaris-symdef.h \ + modules/module-waveout-symdef.h \ + modules/module-detect-symdef.h \ + modules/rtp/module-rtp-send-symdef.h \ + modules/rtp/module-rtp-recv-symdef.h \ + modules/jack/module-jack-sink-symdef.h \ + modules/jack/module-jack-source-symdef.h \ + modules/module-volume-restore-symdef.h \ + modules/module-device-manager-symdef.h \ + modules/module-device-restore-symdef.h \ + modules/module-stream-restore-symdef.h \ + modules/module-card-restore-symdef.h \ + modules/module-default-device-restore-symdef.h \ + modules/module-always-sink-symdef.h \ + modules/module-rescue-streams-symdef.h \ + modules/module-intended-roles-symdef.h \ + modules/module-suspend-on-idle-symdef.h \ + modules/echo-cancel/module-echo-cancel-symdef.h \ + modules/module-hal-detect-symdef.h \ + modules/module-udev-detect-symdef.h \ + modules/bluetooth/module-bluetooth-proximity-symdef.h \ + modules/bluetooth/module-bluetooth-discover-symdef.h \ + modules/bluetooth/module-bluetooth-device-symdef.h \ + modules/raop/module-raop-sink-symdef.h \ + modules/raop/module-raop-discover-symdef.h \ + modules/gconf/module-gconf-symdef.h \ + modules/module-position-event-sounds-symdef.h \ + modules/module-augment-properties-symdef.h \ + modules/module-cork-music-on-phone-symdef.h \ + modules/module-console-kit-symdef.h \ + modules/module-loopback-symdef.h \ + modules/module-policy-symdef.h \ + modules/module-virtual-sink-symdef.h \ + modules/module-virtual-source-symdef.h + +EXTRA_DIST += $(SYMDEF_FILES) +BUILT_SOURCES += $(SYMDEF_FILES) + +$(SYMDEF_FILES): modules/module-defs.h.m4 + $(MKDIR_P) $(dir $@) + $(M4) -Dfname="$@" $< > $@ + +# Simple protocol + +module_simple_protocol_tcp_la_SOURCES = modules/module-protocol-stub.c +module_simple_protocol_tcp_la_CFLAGS = -DUSE_TCP_SOCKETS -DUSE_PROTOCOL_SIMPLE $(AM_CFLAGS) +module_simple_protocol_tcp_la_LDFLAGS = $(MODULE_LDFLAGS) +module_simple_protocol_tcp_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINORMICRO@.la libprotocol-simple.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la + +module_simple_protocol_unix_la_SOURCES = modules/module-protocol-stub.c +module_simple_protocol_unix_la_CFLAGS = -DUSE_UNIX_SOCKETS -DUSE_PROTOCOL_SIMPLE $(AM_CFLAGS) +module_simple_protocol_unix_la_LDFLAGS = $(MODULE_LDFLAGS) +module_simple_protocol_unix_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINORMICRO@.la libprotocol-simple.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la + +# CLI protocol + +module_cli_la_SOURCES = modules/module-cli.c +module_cli_la_LDFLAGS = $(MODULE_LDFLAGS) +module_cli_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINORMICRO@.la libcli.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la + +module_cli_protocol_tcp_la_SOURCES = modules/module-protocol-stub.c +module_cli_protocol_tcp_la_CFLAGS = -DUSE_TCP_SOCKETS -DUSE_PROTOCOL_CLI $(AM_CFLAGS) +module_cli_protocol_tcp_la_LDFLAGS = $(MODULE_LDFLAGS) +module_cli_protocol_tcp_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINORMICRO@.la libprotocol-cli.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la + +module_cli_protocol_unix_la_SOURCES = modules/module-protocol-stub.c +module_cli_protocol_unix_la_CFLAGS = -DUSE_UNIX_SOCKETS -DUSE_PROTOCOL_CLI $(AM_CFLAGS) +module_cli_protocol_unix_la_LDFLAGS = $(MODULE_LDFLAGS) +module_cli_protocol_unix_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINORMICRO@.la libprotocol-cli.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la + +# HTTP protocol + +module_http_protocol_tcp_la_SOURCES = modules/module-protocol-stub.c +module_http_protocol_tcp_la_CFLAGS = -DUSE_TCP_SOCKETS -DUSE_PROTOCOL_HTTP $(AM_CFLAGS) +module_http_protocol_tcp_la_LDFLAGS = $(MODULE_LDFLAGS) +module_http_protocol_tcp_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINORMICRO@.la libprotocol-http.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la + +module_http_protocol_unix_la_SOURCES = modules/module-protocol-stub.c +module_http_protocol_unix_la_CFLAGS = -DUSE_UNIX_SOCKETS -DUSE_PROTOCOL_HTTP $(AM_CFLAGS) +module_http_protocol_unix_la_LDFLAGS = $(MODULE_LDFLAGS) +module_http_protocol_unix_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINORMICRO@.la libprotocol-http.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la + +# Native protocol + +module_native_protocol_tcp_la_SOURCES = modules/module-protocol-stub.c +module_native_protocol_tcp_la_CFLAGS = -DUSE_TCP_SOCKETS -DUSE_PROTOCOL_NATIVE $(AM_CFLAGS) +module_native_protocol_tcp_la_LDFLAGS = $(MODULE_LDFLAGS) +module_native_protocol_tcp_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINORMICRO@.la libprotocol-native.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la + +module_native_protocol_unix_la_SOURCES = modules/module-protocol-stub.c +module_native_protocol_unix_la_CFLAGS = -DUSE_UNIX_SOCKETS -DUSE_PROTOCOL_NATIVE $(AM_CFLAGS) +module_native_protocol_unix_la_LDFLAGS = $(MODULE_LDFLAGS) +module_native_protocol_unix_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINORMICRO@.la libprotocol-native.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la + +module_native_protocol_fd_la_SOURCES = modules/module-native-protocol-fd.c +module_native_protocol_fd_la_CFLAGS = $(AM_CFLAGS) +module_native_protocol_fd_la_LDFLAGS = $(MODULE_LDFLAGS) +module_native_protocol_fd_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINORMICRO@.la libprotocol-native.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la + +# EsounD protocol + +module_esound_protocol_tcp_la_SOURCES = modules/module-protocol-stub.c +module_esound_protocol_tcp_la_CFLAGS = -DUSE_TCP_SOCKETS -DUSE_PROTOCOL_ESOUND $(AM_CFLAGS) +module_esound_protocol_tcp_la_LDFLAGS = $(MODULE_LDFLAGS) +module_esound_protocol_tcp_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINORMICRO@.la libprotocol-esound.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la + +module_esound_protocol_unix_la_SOURCES = modules/module-protocol-stub.c +module_esound_protocol_unix_la_CFLAGS = -DUSE_UNIX_SOCKETS -DUSE_PROTOCOL_ESOUND $(AM_CFLAGS) +module_esound_protocol_unix_la_LDFLAGS = $(MODULE_LDFLAGS) +module_esound_protocol_unix_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINORMICRO@.la libprotocol-esound.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la + +module_esound_compat_spawnfd_la_SOURCES = modules/module-esound-compat-spawnfd.c +module_esound_compat_spawnfd_la_LDFLAGS = $(MODULE_LDFLAGS) +module_esound_compat_spawnfd_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la + +module_esound_compat_spawnpid_la_SOURCES = modules/module-esound-compat-spawnpid.c +module_esound_compat_spawnpid_la_LDFLAGS = $(MODULE_LDFLAGS) +module_esound_compat_spawnpid_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la + +module_esound_sink_la_SOURCES = modules/module-esound-sink.c +module_esound_sink_la_LDFLAGS = $(MODULE_LDFLAGS) +module_esound_sink_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la + +# Pipes + +module_pipe_sink_la_SOURCES = modules/module-pipe-sink.c +module_pipe_sink_la_LDFLAGS = $(MODULE_LDFLAGS) +module_pipe_sink_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la + +module_pipe_source_la_SOURCES = modules/module-pipe-source.c +module_pipe_source_la_LDFLAGS = $(MODULE_LDFLAGS) +module_pipe_source_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la + +# Fake sources/sinks + +module_sine_la_SOURCES = modules/module-sine.c +module_sine_la_LDFLAGS = $(MODULE_LDFLAGS) +module_sine_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la + +module_null_sink_la_SOURCES = modules/module-null-sink.c +module_null_sink_la_LDFLAGS = $(MODULE_LDFLAGS) +module_null_sink_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la + +module_sine_source_la_SOURCES = modules/module-sine-source.c +module_sine_source_la_LDFLAGS = -module -avoid-version +module_sine_source_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la + +# Couplings + +module_combine_la_SOURCES = modules/module-combine.c +module_combine_la_LDFLAGS = $(MODULE_LDFLAGS) +module_combine_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la + +module_remap_sink_la_SOURCES = modules/module-remap-sink.c +module_remap_sink_la_LDFLAGS = $(MODULE_LDFLAGS) +module_remap_sink_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la + +module_ladspa_sink_la_SOURCES = modules/module-ladspa-sink.c modules/ladspa.h +module_ladspa_sink_la_CFLAGS = -DLADSPA_PATH=\"$(libdir)/ladspa:/usr/local/lib/ladspa:/usr/lib/ladspa:/usr/local/lib64/ladspa:/usr/lib64/ladspa\" $(AM_CFLAGS) +module_ladspa_sink_la_LDFLAGS = $(MODULE_LDFLAGS) +module_ladspa_sink_la_LIBADD = $(AM_LIBADD) $(LIBLTDL) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la + +module_match_la_SOURCES = modules/module-match.c +module_match_la_LDFLAGS = $(MODULE_LDFLAGS) +module_match_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la + +module_tunnel_sink_la_SOURCES = modules/module-tunnel.c +module_tunnel_sink_la_CFLAGS = -DTUNNEL_SINK=1 $(AM_CFLAGS) +module_tunnel_sink_la_LDFLAGS = $(MODULE_LDFLAGS) +module_tunnel_sink_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la + +module_tunnel_source_la_SOURCES = modules/module-tunnel.c +module_tunnel_source_la_LDFLAGS = $(MODULE_LDFLAGS) +module_tunnel_source_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la + +module_loopback_la_SOURCES = modules/module-loopback.c +module_loopback_la_LDFLAGS = $(MODULE_LDFLAGS) +module_loopback_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la + +module_virtual_sink_la_SOURCES = modules/module-virtual-sink.c +module_virtual_sink_la_LDFLAGS = $(MODULE_LDFLAGS) +module_virtual_sink_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la + +module_virtual_source_la_SOURCES = modules/module-virtual-source.c +module_virtual_source_la_LDFLAGS = $(MODULE_LDFLAGS) +module_virtual_source_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la + +# X11 + +module_x11_bell_la_SOURCES = modules/x11/module-x11-bell.c +module_x11_bell_la_CFLAGS = $(AM_CFLAGS) $(X11_CFLAGS) +module_x11_bell_la_LDFLAGS = $(MODULE_LDFLAGS) +module_x11_bell_la_LIBADD = $(AM_LIBADD) $(X11_LIBS) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la + +module_x11_publish_la_SOURCES = modules/x11/module-x11-publish.c +module_x11_publish_la_CFLAGS = $(AM_CFLAGS) $(X11_CFLAGS) +module_x11_publish_la_LDFLAGS = $(MODULE_LDFLAGS) +module_x11_publish_la_LIBADD = $(AM_LIBADD) $(X11_LIBS) libprotocol-native.la libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la + +module_x11_xsmp_la_SOURCES = modules/x11/module-x11-xsmp.c +module_x11_xsmp_la_CFLAGS = $(AM_CFLAGS) $(X11_CFLAGS) +module_x11_xsmp_la_LDFLAGS = $(MODULE_LDFLAGS) +module_x11_xsmp_la_LIBADD = $(AM_LIBADD) $(X11_LIBS) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la + +module_x11_cork_request_la_SOURCES = modules/x11/module-x11-cork-request.c +module_x11_cork_request_la_CFLAGS = $(AM_CFLAGS) $(X11_CFLAGS) +module_x11_cork_request_la_LDFLAGS = $(MODULE_LDFLAGS) +module_x11_cork_request_la_LIBADD = $(AM_LIBADD) $(X11_LIBS) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la + +# OSS + +liboss_util_la_SOURCES = modules/oss/oss-util.c modules/oss/oss-util.h +liboss_util_la_LDFLAGS = -avoid-version +liboss_util_la_LIBADD = libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la + +module_oss_la_SOURCES = modules/oss/module-oss.c +module_oss_la_LDFLAGS = $(MODULE_LDFLAGS) +module_oss_la_LIBADD = $(AM_LIBADD) liboss-util.la libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la + +# ALSA + +libalsa_util_la_SOURCES = modules/alsa/alsa-util.c modules/alsa/alsa-util.h modules/alsa/alsa-mixer.c modules/alsa/alsa-mixer.h modules/alsa/alsa-sink.c modules/alsa/alsa-sink.h modules/alsa/alsa-source.c modules/alsa/alsa-source.h modules/reserve-wrap.c modules/reserve-wrap.h +libalsa_util_la_LDFLAGS = -avoid-version +libalsa_util_la_LIBADD = $(AM_LIBADD) $(ASOUNDLIB_LIBS) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la +libalsa_util_la_CFLAGS = $(AM_CFLAGS) $(ASOUNDLIB_CFLAGS) + +if HAVE_HAL +libalsa_util_la_SOURCES += modules/hal-util.h modules/hal-util.c +libalsa_util_la_LIBADD += $(HAL_LIBS) +libalsa_util_la_CFLAGS += $(HAL_CFLAGS) +endif + +if HAVE_UDEV +libalsa_util_la_SOURCES += modules/udev-util.h modules/udev-util.c +libalsa_util_la_LIBADD += $(UDEV_LIBS) +libalsa_util_la_CFLAGS += $(UDEV_CFLAGS) +endif + +if HAVE_DBUS +libalsa_util_la_SOURCES += modules/reserve.h modules/reserve.c modules/reserve-monitor.h modules/reserve-monitor.c +libalsa_util_la_LIBADD += $(DBUS_LIBS) +libalsa_util_la_CFLAGS += $(DBUS_CFLAGS) +endif + +module_alsa_sink_la_SOURCES = modules/alsa/module-alsa-sink.c +module_alsa_sink_la_LDFLAGS = $(MODULE_LDFLAGS) +module_alsa_sink_la_LIBADD = $(AM_LIBADD) $(ASOUNDLIB_LIBS) libalsa-util.la libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la +module_alsa_sink_la_CFLAGS = $(AM_CFLAGS) $(ASOUNDLIB_CFLAGS) + +module_alsa_source_la_SOURCES = modules/alsa/module-alsa-source.c +module_alsa_source_la_LDFLAGS = $(MODULE_LDFLAGS) +module_alsa_source_la_LIBADD = $(AM_LIBADD) $(ASOUNDLIB_LIBS) libalsa-util.la libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la +module_alsa_source_la_CFLAGS = $(AM_CFLAGS) $(ASOUNDLIB_CFLAGS) + +module_alsa_card_la_SOURCES = modules/alsa/module-alsa-card.c +module_alsa_card_la_LDFLAGS = $(MODULE_LDFLAGS) +module_alsa_card_la_LIBADD = $(AM_LIBADD) $(ASOUNDLIB_LIBS) libalsa-util.la libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la +module_alsa_card_la_CFLAGS = $(AM_CFLAGS) $(ASOUNDLIB_CFLAGS) + +# Solaris + +module_solaris_la_SOURCES = modules/module-solaris.c +module_solaris_la_LDFLAGS = $(MODULE_LDFLAGS) +module_solaris_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la + +# Avahi + +module_zeroconf_publish_la_SOURCES = modules/module-zeroconf-publish.c +module_zeroconf_publish_la_LDFLAGS = $(MODULE_LDFLAGS) +module_zeroconf_publish_la_LIBADD = $(AM_LIBADD) $(AVAHI_LIBS) libavahi-wrap.la libprotocol-native.la libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la +module_zeroconf_publish_la_CFLAGS = $(AM_CFLAGS) $(AVAHI_CFLAGS) + +module_zeroconf_discover_la_SOURCES = modules/module-zeroconf-discover.c +module_zeroconf_discover_la_LDFLAGS = $(MODULE_LDFLAGS) +module_zeroconf_discover_la_LIBADD = $(AM_LIBADD) $(AVAHI_LIBS) libavahi-wrap.la libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la +module_zeroconf_discover_la_CFLAGS = $(AM_CFLAGS) $(AVAHI_CFLAGS) + +# LIRC + +module_lirc_la_SOURCES = modules/module-lirc.c +module_lirc_la_LDFLAGS = $(MODULE_LDFLAGS) +module_lirc_la_LIBADD = $(AM_LIBADD) $(LIRC_LIBS) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la +module_lirc_la_CFLAGS = $(AM_CFLAGS) $(LIRC_CFLAGS) + +# Linux evdev + +module_mmkbd_evdev_la_SOURCES = modules/module-mmkbd-evdev.c +module_mmkbd_evdev_la_LDFLAGS = $(MODULE_LDFLAGS) +module_mmkbd_evdev_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la +module_mmkbd_evdev_la_CFLAGS = $(AM_CFLAGS) + +# Windows waveout + +#module_waveout_la_SOURCES = modules/module-waveout.c +#module_waveout_la_LDFLAGS = $(MODULE_LDFLAGS) +#module_waveout_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINORMICRO@.la -lwinmm libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la +#module_waveout_la_CFLAGS = $(AM_CFLAGS) + +# Hardware autodetection module +module_detect_la_SOURCES = modules/module-detect.c +module_detect_la_LDFLAGS = $(MODULE_LDFLAGS) +module_detect_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la +module_detect_la_CFLAGS = $(AM_CFLAGS) + +# Volume restore module +module_volume_restore_la_SOURCES = modules/module-volume-restore.c +module_volume_restore_la_LDFLAGS = $(MODULE_LDFLAGS) +module_volume_restore_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la +module_volume_restore_la_CFLAGS = $(AM_CFLAGS) + +# Position event sounds in space +module_position_event_sounds_la_SOURCES = modules/module-position-event-sounds.c +module_position_event_sounds_la_LDFLAGS = $(MODULE_LDFLAGS) +module_position_event_sounds_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la +module_position_event_sounds_la_CFLAGS = $(AM_CFLAGS) + +# Augment properties from XDG .desktop files +module_augment_properties_la_SOURCES = modules/module-augment-properties.c +module_augment_properties_la_LDFLAGS = $(MODULE_LDFLAGS) +module_augment_properties_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la +#module_augment_properties_la_CFLAGS = $(AM_CFLAGS) -DDESKTOPFILEDIR=\"$(datadir)/applications\" +module_augment_properties_la_CFLAGS = $(AM_CFLAGS) -DDESKTOPFILEDIR=\"/usr/share/applications\" + +# Cork music streams while a phone stream is active +module_cork_music_on_phone_la_SOURCES = modules/module-cork-music-on-phone.c +module_cork_music_on_phone_la_LDFLAGS = $(MODULE_LDFLAGS) +module_cork_music_on_phone_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la +module_cork_music_on_phone_la_CFLAGS = $(AM_CFLAGS) + +# Device description restore module +module_device_manager_la_SOURCES = modules/module-device-manager.c +module_device_manager_la_LDFLAGS = $(MODULE_LDFLAGS) +module_device_manager_la_LIBADD = $(AM_LIBADD) libprotocol-native.la libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la +module_device_manager_la_CFLAGS = $(AM_CFLAGS) + +# Device volume/muted restore module +module_device_restore_la_SOURCES = modules/module-device-restore.c +module_device_restore_la_LDFLAGS = $(MODULE_LDFLAGS) +module_device_restore_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la +module_device_restore_la_CFLAGS = $(AM_CFLAGS) + +# Stream volume/muted/device restore module +module_stream_restore_la_SOURCES = modules/module-stream-restore.c +module_stream_restore_la_LDFLAGS = $(MODULE_LDFLAGS) +module_stream_restore_la_LIBADD = $(AM_LIBADD) libprotocol-native.la libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la +module_stream_restore_la_CFLAGS = $(AM_CFLAGS) + +# Card profile restore module +module_card_restore_la_SOURCES = modules/module-card-restore.c +module_card_restore_la_LDFLAGS = $(MODULE_LDFLAGS) +module_card_restore_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la +module_card_restore_la_CFLAGS = $(AM_CFLAGS) + +# Default sink/source restore module +module_default_device_restore_la_SOURCES = modules/module-default-device-restore.c +module_default_device_restore_la_LDFLAGS = $(MODULE_LDFLAGS) +module_default_device_restore_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la +module_default_device_restore_la_CFLAGS = $(AM_CFLAGS) + +# Always Sink module +module_always_sink_la_SOURCES = modules/module-always-sink.c +module_always_sink_la_LDFLAGS = $(MODULE_LDFLAGS) +module_always_sink_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la +module_always_sink_la_CFLAGS = $(AM_CFLAGS) + +# Rescue streams module +module_rescue_streams_la_SOURCES = modules/module-rescue-streams.c +module_rescue_streams_la_LDFLAGS = $(MODULE_LDFLAGS) +module_rescue_streams_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la +module_rescue_streams_la_CFLAGS = $(AM_CFLAGS) + +# Automatically move streams to devices that are intended for their roles +module_intended_roles_la_SOURCES = modules/module-intended-roles.c +module_intended_roles_la_LDFLAGS = $(MODULE_LDFLAGS) +module_intended_roles_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la +module_intended_roles_la_CFLAGS = $(AM_CFLAGS) + +# Suspend-on-idle module +module_suspend_on_idle_la_SOURCES = modules/module-suspend-on-idle.c +module_suspend_on_idle_la_LDFLAGS = $(MODULE_LDFLAGS) +module_suspend_on_idle_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la +module_suspend_on_idle_la_CFLAGS = $(AM_CFLAGS) + +module_suspend_on_idle_la_LDFLAGS += $(PMAPI_LIBS) +module_suspend_on_idle_la_CFLAGS += $(PMAPI_CFLAGS) + +# echo-cancel module +ORC_SOURCE=modules/echo-cancel/adrian-aec-orc +include $(top_srcdir)/build/orc.mak +module_echo_cancel_la_SOURCES = modules/echo-cancel/module-echo-cancel.c modules/echo-cancel/echo-cancel.h \ + modules/echo-cancel/speex.c \ + modules/echo-cancel/adrian-aec.c modules/echo-cancel/adrian-aec.h \ + modules/echo-cancel/adrian.c modules/echo-cancel/adrian.h \ + $(ORC_SOURCE).orc +nodist_module_echo_cancel_la_SOURCES = $(ORC_NODIST_SOURCES) +module_echo_cancel_la_LDFLAGS = $(MODULE_LDFLAGS) +module_echo_cancel_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la $(LIBSPEEX_LIBS) $(ORC_LIBS) +module_echo_cancel_la_CFLAGS = $(AM_CFLAGS) $(LIBSPEEX_CFLAGS) $(ORC_CFLAGS) -DDISABLE_ORC + +# RTP modules +module_rtp_send_la_SOURCES = modules/rtp/module-rtp-send.c +module_rtp_send_la_LDFLAGS = $(MODULE_LDFLAGS) +module_rtp_send_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINORMICRO@.la librtp.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la +module_rtp_send_la_CFLAGS = $(AM_CFLAGS) + +module_rtp_recv_la_SOURCES = modules/rtp/module-rtp-recv.c +module_rtp_recv_la_LDFLAGS = $(MODULE_LDFLAGS) +module_rtp_recv_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINORMICRO@.la librtp.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la +module_rtp_recv_la_CFLAGS = $(AM_CFLAGS) + +# JACK + +module_jack_sink_la_SOURCES = modules/jack/module-jack-sink.c +module_jack_sink_la_LDFLAGS = $(MODULE_LDFLAGS) +module_jack_sink_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINORMICRO@.la $(JACK_LIBS) libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la +module_jack_sink_la_CFLAGS = $(AM_CFLAGS) $(JACK_CFLAGS) + +module_jack_source_la_SOURCES = modules/jack/module-jack-source.c +module_jack_source_la_LDFLAGS = $(MODULE_LDFLAGS) +module_jack_source_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINORMICRO@.la $(JACK_LIBS) libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la +module_jack_source_la_CFLAGS = $(AM_CFLAGS) $(JACK_CFLAGS) + +if HAVE_HAL_COMPAT +module_hal_detect_la_SOURCES = modules/module-hal-detect-compat.c +module_hal_detect_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la +module_hal_detect_la_CFLAGS = $(AM_CFLAGS) +else +module_hal_detect_la_SOURCES = modules/module-hal-detect.c +module_hal_detect_la_LIBADD = $(AM_LIBADD) $(HAL_LIBS) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la +module_hal_detect_la_CFLAGS = $(AM_CFLAGS) $(HAL_CFLAGS) +endif +module_hal_detect_la_LDFLAGS = $(MODULE_LDFLAGS) + +module_udev_detect_la_SOURCES = modules/module-udev-detect.c +module_udev_detect_la_LDFLAGS = $(MODULE_LDFLAGS) +module_udev_detect_la_LIBADD = $(AM_LIBADD) $(UDEV_LIBS) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la +module_udev_detect_la_CFLAGS = $(AM_CFLAGS) $(UDEV_CFLAGS) + +module_console_kit_la_SOURCES = modules/module-console-kit.c +module_console_kit_la_LDFLAGS = $(MODULE_LDFLAGS) +module_console_kit_la_LIBADD = $(AM_LIBADD) $(DBUS_LIBS) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la +module_console_kit_la_CFLAGS = $(AM_CFLAGS) $(DBUS_CFLAGS) + +# GConf support +module_gconf_la_SOURCES = modules/gconf/module-gconf.c +module_gconf_la_LDFLAGS = $(MODULE_LDFLAGS) +module_gconf_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la +module_gconf_la_CFLAGS = $(AM_CFLAGS) -DPA_GCONF_HELPER=\"$(pulselibexecdir)/gconf-helper\" + +gconf_helper_SOURCES = modules/gconf/gconf-helper.c +gconf_helper_LDADD = $(AM_LDADD) $(GCONF_LIBS) libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la libpulsecore-@PA_MAJORMINORMICRO@.la +gconf_helper_CFLAGS = $(AM_CFLAGS) $(GCONF_CFLAGS) +gconf_helper_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) + +# Bluetooth proximity +module_bluetooth_proximity_la_SOURCES = modules/bluetooth/module-bluetooth-proximity.c +module_bluetooth_proximity_la_LDFLAGS = $(MODULE_LDFLAGS) +module_bluetooth_proximity_la_LIBADD = $(AM_LIBADD) $(DBUS_LIBS) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la +module_bluetooth_proximity_la_CFLAGS = $(AM_CFLAGS) $(DBUS_CFLAGS) -DPA_BT_PROXIMITY_HELPER=\"$(pulselibexecdir)/proximity-helper\" + +proximity_helper_SOURCES = modules/bluetooth/proximity-helper.c +proximity_helper_LDADD = $(AM_LDADD) $(BLUEZ_LIBS) +proximity_helper_CFLAGS = $(AM_CFLAGS) $(BLUEZ_CFLAGS) +proximity_helper_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) + +# Bluetooth sink / source +module_bluetooth_discover_la_SOURCES = modules/bluetooth/module-bluetooth-discover.c +module_bluetooth_discover_la_LDFLAGS = $(MODULE_LDFLAGS) +module_bluetooth_discover_la_LIBADD = $(AM_LIBADD) $(DBUS_LIBS) libpulsecore-@PA_MAJORMINORMICRO@.la libbluetooth-util.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la +if HAVE_BT_A2DP_APTX +module_bluetooth_discover_la_CFLAGS = $(AM_CFLAGS) $(DBUS_CFLAGS) -DUSE_APTX +else +module_bluetooth_discover_la_CFLAGS = $(AM_CFLAGS) $(DBUS_CFLAGS) +endif + +libbluetooth_sbc_la_SOURCES = \ + modules/bluetooth/sbc/sbc.c modules/bluetooth/sbc/sbc.h \ + modules/bluetooth/sbc/sbc_primitives.c modules/bluetooth/sbc/sbc_primitives.h \ + modules/bluetooth/sbc/sbc_primitives_armv6.h modules/bluetooth/sbc/sbc_primitives_armv6.c \ + modules/bluetooth/sbc/sbc_primitives_iwmmxt.h modules/bluetooth/sbc/sbc_primitives_iwmmxt.c \ + modules/bluetooth/sbc/sbc_primitives_mmx.c modules/bluetooth/sbc/sbc_primitives_mmx.h \ + modules/bluetooth/sbc/sbc_primitives_neon.c modules/bluetooth/sbc/sbc_primitives_neon.h \ + modules/bluetooth/sbc/sbc_math.h \ + modules/bluetooth/sbc/sbc_tables.h +libbluetooth_sbc_la_LDFLAGS = -avoid-version +libbluetooth_sbc_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la +libbluetooth_sbc_la_CFLAGS = $(AM_CFLAGS) -I$(top_srcdir)/src/modules/bluetooth/sbc +BLUETOOTH_SBC_FILES = $(subst modules/bluetooth/,,$(libbluetooth_sbc_la_SOURCES)) + +libbluetooth_ipc_la_SOURCES = \ + modules/bluetooth/ipc.c modules/bluetooth/ipc.h +libbluetooth_ipc_la_LDFLAGS = -avoid-version +libbluetooth_ipc_la_LIBADD = $(AM_LIBADD)libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la +libbluetooth_ipc_la_CFLAGS = $(AM_CFLAGS) +BLUETOOTH_IPC_FILES = $(subst modules/bluetooth/,,$(libbluetooth_ipc_la_SOURCES)) rtp.h + +libbluetooth_util_la_SOURCES = modules/bluetooth/bluetooth-util.c modules/bluetooth/bluetooth-util.h +libbluetooth_util_la_LDFLAGS = -avoid-version +libbluetooth_util_la_LIBADD = $(AM_LIBADD) $(DBUS_LIBS) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la +libbluetooth_util_la_CFLAGS = $(AM_CFLAGS) $(DBUS_CFLAGS) + +module_bluetooth_device_la_SOURCES = modules/bluetooth/module-bluetooth-device.c modules/bluetooth/rtp.h +if HAVE_BT_A2DP_APTX +module_bluetooth_device_la_LDFLAGS = $(MODULE_LDFLAGS) -Lmodules/bluetooth -lbtaptx-armv6L +module_bluetooth_device_la_CFLAGS = $(AM_CFLAGS) $(DBUS_CFLAGS) -DUSE_APTX + +bluetooth_aptxdir=$(modlibexecdir) +bluetooth_aptx_DATA = modules/bluetooth/libbtaptx-armv6L.so +else +module_bluetooth_device_la_LDFLAGS = $(MODULE_LDFLAGS) -Lmodules/bluetooth +module_bluetooth_device_la_CFLAGS = $(AM_CFLAGS) $(DBUS_CFLAGS) -I$(top_srcdir)/src/modules/bluetooth/sbc +endif +module_bluetooth_device_la_LIBADD = $(AM_LIBADD) $(DBUS_LIBS) libpulsecore-@PA_MAJORMINORMICRO@.la libbluetooth-util.la libbluetooth-ipc.la libbluetooth-sbc.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la + +# Apple Airtunes/RAOP +module_raop_sink_la_SOURCES = modules/raop/module-raop-sink.c +module_raop_sink_la_LDFLAGS = $(MODULE_LDFLAGS) +module_raop_sink_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINORMICRO@.la librtp.la libraop.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la + +module_raop_discover_la_SOURCES = modules/raop/module-raop-discover.c +module_raop_discover_la_LDFLAGS = $(MODULE_LDFLAGS) +module_raop_discover_la_LIBADD = $(AM_LIBADD) $(AVAHI_LIBS) libavahi-wrap.la libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la +module_raop_discover_la_CFLAGS = $(AM_CFLAGS) $(AVAHI_CFLAGS) + +# Rygel +module_rygel_media_server_la_SOURCES = modules/module-rygel-media-server.c +module_rygel_media_server_la_LDFLAGS = $(MODULE_LDFLAGS) +module_rygel_media_server_la_LIBADD = $(AM_LIBADD) $(DBUS_LIBS) libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la libprotocol-http.la +module_rygel_media_server_la_CFLAGS = $(AM_CFLAGS) $(DBUS_CFLAGS) + +module_policy_la_SOURCES = modules/module-policy.c +module_policy_la_LDFLAGS = $(MODULE_LDFLAGS) +module_policy_la_LIBADD = $(AM_LIBADD) $(DBUS_LIBS) $(VCONF_LIBS) libprotocol-native.la libpulsecore-@PA_MAJORMINORMICRO@.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la +module_policy_la_CFLAGS = $(AM_CFLAGS) $(DBUS_CFLAGS) $(VCONF_CFLAGS) + +################################### +# Some minor stuff # +################################### + +CLEANFILES = esdcompat client.conf default.pa system.pa daemon.conf start-pulseaudio-x11 start-pulseaudio-kde daemon/pulseaudio.desktop daemon/pulseaudio-kde.desktop + +esdcompat: daemon/esdcompat.in Makefile + sed -e 's,@PACKAGE_VERSION\@,$(PACKAGE_VERSION),g' \ + -e 's,@PACKAGE_NAME\@,$(PACKAGE_NAME),g' \ + -e 's,@PA_BINARY\@,$(PA_BINARY),g' < $< > $@ + chmod +x esdcompat + +start-pulseaudio-x11: daemon/start-pulseaudio-x11.in Makefile + sed -e 's,@PA_BINARY\@,$(PA_BINARY),g' \ + -e 's,@PACTL_BINARY\@,$(bindir)/pactl,g' < $< > $@ + chmod +x start-pulseaudio-x11 + +start-pulseaudio-kde: daemon/start-pulseaudio-kde.in Makefile + sed -e 's,@PA_BINARY\@,$(PA_BINARY),g' \ + -e 's,@PACTL_BINARY\@,$(bindir)/pactl,g' < $< > $@ + chmod +x start-pulseaudio-kde + +client.conf: pulse/client.conf.in Makefile + sed -e 's,@PA_BINARY\@,$(PA_BINARY),g' < $< > $@ + +if OS_IS_WIN32 +default.pa: daemon/default.pa.win32 + cp $< $@ +system.pa: daemon/default.pa.win32 + cp $< $@ +else +default.pa: daemon/default.pa.in Makefile + sed -e 's,@PA_BINARY\@,$(PA_BINARY),g' \ + -e 's,@PA_DLSEARCHPATH\@,$(modlibexecdir),g' \ + -e 's,@PA_SOEXT\@,.so,g' < $< > $@ +system.pa: daemon/system.pa.in Makefile + sed -e 's,@PA_BINARY\@,$(PA_BINARY),g' \ + -e 's,@PA_DLSEARCHPATH\@,$(modlibexecdir),g' \ + -e 's,@PA_SOEXT\@,.so,g' < $< > $@ +endif + +daemon.conf: daemon/daemon.conf.in Makefile + sed -e 's,@PA_DLSEARCHPATH\@,$(modlibexecdir),g' \ + -e 's,@PA_DEFAULT_CONFIG_FILE\@,$(DEFAULT_CONFIG_DIR),g' < $< > $@ + +install-exec-hook: + -chown root $(DESTDIR)$(pulselibexecdir)/proximity-helper + -chmod u+s $(DESTDIR)$(pulselibexecdir)/proximity-helper + ln -sf pacat $(DESTDIR)$(bindir)/parec + ln -sf pacat $(DESTDIR)$(bindir)/pamon + ln -sf pacat $(DESTDIR)$(bindir)/paplay + ln -sf pacat $(DESTDIR)$(bindir)/parecord + rm -f $(DESTDIR)$(libdir)/libpulsedsp.la + rm -f $(DESTDIR)$(modlibexecdir)/*.la + +uninstall-hook: + rm -f $(DESTDIR)$(bindir)/parec + rm -f $(DESTDIR)$(bindir)/pamon + rm -f $(DESTDIR)$(bindir)/paplay + rm -f $(DESTDIR)$(bindir)/parecord + rm -f $(DESTDIR)$(libdir)/libpulsedsp.* + rm -f $(DESTDIR)$(modlibexecdir)/*.so + +massif: pulseaudio + libtool --mode=execute valgrind --tool=massif --depth=6 --alloc-fn=pa_xmalloc --alloc-fn=pa_xmalloc0 --alloc-fn=pa_xrealloc --alloc-fn=dbus_realloc --alloc-fn=pa_xnew0_internal --alloc-fn=pa_xnew_internal ./pulseaudio + +update-ffmpeg: + wget -O pulsecore/ffmpeg/resample2.c http://svn.mplayerhq.hu/ffmpeg/trunk/libavcodec/resample2.c?view=co + +# We get things twice here, because sometimes gitweb will us just give a "Generating..." otherwise. +update-sbc: + for i in $(BLUETOOTH_SBC_FILES) ; do \ + wget -O /dev/null http://git.kernel.org/\?p=bluetooth/bluez.git\;a=blob_plain\;f=sbc/$$i ; \ + wget -O modules/bluetooth/$$i http://git.kernel.org/\?p=bluetooth/bluez.git\;a=blob_plain\;f=sbc/$$i ; \ + done + for i in $(BLUETOOTH_IPC_FILES); do \ + wget -O /dev/null http://git.kernel.org/\?p=bluetooth/bluez.git\;a=blob_plain\;f=audio/$$i ; \ + wget -O modules/bluetooth/$$i http://git.kernel.org/\?p=bluetooth/bluez.git\;a=blob_plain\;f=audio/$$i ; \ + done + +update-reserve: + for i in reserve.c reserve.h reserve-monitor.c reserve-monitor.h ; do \ + wget -O modules/$$i http://git.0pointer.de/\?p=reserve.git\;a=blob_plain\;f=$$i\;hb=master ; \ + done + +update-rtkit: + for i in rtkit.c rtkit.h ; do \ + wget -O pulsecore/$$i http://git.0pointer.de/\?p=rtkit.git\;a=blob_plain\;f=$$i\;hb=master ; \ + done + +# Automatically generate linker version script. We use the same one for all public .sos +update-map-file: + ( echo "PULSE_0 {" ; \ + echo "global:" ; \ + ctags -I PA_GCC_MALLOC,PA_GCC_ALLOC_SIZE2,PA_GCC_ALLOC_SIZE,PA_GCC_PURE,PA_GCC_CONST,PA_GCC_DEPRECATED,PA_GCC_PRINTF_ATTR -f - --c-kinds=p $(pulseinclude_HEADERS) | awk '/^pa_/ { print $$1 ";" }' | sort ; \ + echo "local:" ; \ + echo "*;" ; \ + echo "};" ) > $(srcdir)/map-file + +update-all: update-ffmpeg update-sbc update-map-file + +.PHONY: utils/padsp massif update-all update-ffmpeg update-sbc update-map-file diff --git a/src/daemon/caps.c b/src/daemon/caps.c new file mode 100644 index 0000000..76b62e0 --- /dev/null +++ b/src/daemon/caps.c @@ -0,0 +1,98 @@ +/*** + This file is part of PulseAudio. + + Copyright 2004-2006 Lennart Poettering + Copyright 2006 Pierre Ossman for Cendio AB + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include + +#include + +#include +#include +#include +#include + +#ifdef HAVE_SYS_CAPABILITY_H +#include +#endif + +#ifdef HAVE_SYS_PRCTL_H +#include +#endif + +#include "caps.h" + +/* Glibc <= 2.2 has broken unistd.h */ +#if defined(linux) && (__GLIBC__ <= 2 && __GLIBC_MINOR__ <= 2) +int setresgid(gid_t r, gid_t e, gid_t s); +int setresuid(uid_t r, uid_t e, uid_t s); +#endif + +/* Drop root rights when called SUID root */ +void pa_drop_root(void) { + +#ifdef HAVE_GETUID + uid_t uid; + gid_t gid; + + pa_log_debug(_("Cleaning up privileges.")); + uid = getuid(); + gid = getgid(); + +#if defined(HAVE_SETRESUID) + pa_assert_se(setresuid(uid, uid, uid) >= 0); + pa_assert_se(setresgid(gid, gid, gid) >= 0); +#elif defined(HAVE_SETREUID) + pa_assert_se(setreuid(uid, uid) >= 0); + pa_assert_se(setregid(gid, gid) >= 0); +#else + pa_assert_se(setuid(uid) >= 0); + pa_assert_se(seteuid(uid) >= 0); + pa_assert_se(setgid(gid) >= 0); + pa_assert_se(setegid(gid) >= 0); +#endif + + pa_assert_se(getuid() == uid); + pa_assert_se(geteuid() == uid); + pa_assert_se(getgid() == gid); + pa_assert_se(getegid() == gid); +#endif + +#ifdef HAVE_SYS_PRCTL_H + pa_assert_se(prctl(PR_SET_KEEPCAPS, 0, 0, 0, 0) == 0); +#endif + +#ifdef HAVE_SYS_CAPABILITY_H + if (uid != 0) { + cap_t caps; + pa_assert_se(caps = cap_init()); + pa_assert_se(cap_clear(caps) == 0); + pa_assert_se(cap_set_proc(caps) == 0); + pa_assert_se(cap_free(caps) == 0); + } +#endif +} diff --git a/src/daemon/caps.h b/src/daemon/caps.h new file mode 100644 index 0000000..5d0ee62 --- /dev/null +++ b/src/daemon/caps.h @@ -0,0 +1,29 @@ +#ifndef foocapshfoo +#define foocapshfoo + +/*** + This file is part of PulseAudio. + + Copyright 2004 Lennart Poettering + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#include + +void pa_drop_root(void); + +#endif diff --git a/src/daemon/cmdline.c b/src/daemon/cmdline.c new file mode 100644 index 0000000..f6cdcdc --- /dev/null +++ b/src/daemon/cmdline.c @@ -0,0 +1,397 @@ +/*** + This file is part of PulseAudio. + + Copyright 2004-2006 Lennart Poettering + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include + +#include "cmdline.h" + +/* Argument codes for getopt_long() */ +enum { + ARG_HELP = 256, + ARG_VERSION, + ARG_DUMP_CONF, + ARG_DUMP_MODULES, + ARG_DAEMONIZE, + ARG_FAIL, + ARG_LOG_LEVEL, + ARG_HIGH_PRIORITY, + ARG_REALTIME, + ARG_DISALLOW_MODULE_LOADING, + ARG_DISALLOW_EXIT, + ARG_EXIT_IDLE_TIME, + ARG_SCACHE_IDLE_TIME, + ARG_LOG_TARGET, + ARG_LOG_META, + ARG_LOG_TIME, + ARG_LOG_BACKTRACE, + ARG_LOAD, + ARG_FILE, + ARG_DL_SEARCH_PATH, + ARG_RESAMPLE_METHOD, + ARG_KILL, + ARG_USE_PID_FILE, + ARG_CHECK, + ARG_NO_CPU_LIMIT, + ARG_DISABLE_SHM, + ARG_DUMP_RESAMPLE_METHODS, + ARG_SYSTEM, + ARG_CLEANUP_SHM, + ARG_START +}; + +/* Tabel for getopt_long() */ +static const struct option long_options[] = { + {"help", 0, 0, ARG_HELP}, + {"version", 0, 0, ARG_VERSION}, + {"dump-conf", 0, 0, ARG_DUMP_CONF}, + {"dump-modules", 0, 0, ARG_DUMP_MODULES}, + {"daemonize", 2, 0, ARG_DAEMONIZE}, + {"fail", 2, 0, ARG_FAIL}, + {"verbose", 2, 0, ARG_LOG_LEVEL}, + {"log-level", 2, 0, ARG_LOG_LEVEL}, + {"high-priority", 2, 0, ARG_HIGH_PRIORITY}, + {"realtime", 2, 0, ARG_REALTIME}, + {"disallow-module-loading", 2, 0, ARG_DISALLOW_MODULE_LOADING}, + {"disallow-exit", 2, 0, ARG_DISALLOW_EXIT}, + {"exit-idle-time", 2, 0, ARG_EXIT_IDLE_TIME}, + {"scache-idle-time", 2, 0, ARG_SCACHE_IDLE_TIME}, + {"log-target", 1, 0, ARG_LOG_TARGET}, + {"log-meta", 2, 0, ARG_LOG_META}, + {"log-time", 2, 0, ARG_LOG_TIME}, + {"log-backtrace", 1, 0, ARG_LOG_BACKTRACE}, + {"load", 1, 0, ARG_LOAD}, + {"file", 1, 0, ARG_FILE}, + {"dl-search-path", 1, 0, ARG_DL_SEARCH_PATH}, + {"resample-method", 1, 0, ARG_RESAMPLE_METHOD}, + {"kill", 0, 0, ARG_KILL}, + {"start", 0, 0, ARG_START}, + {"use-pid-file", 2, 0, ARG_USE_PID_FILE}, + {"check", 0, 0, ARG_CHECK}, + {"system", 2, 0, ARG_SYSTEM}, + {"no-cpu-limit", 2, 0, ARG_NO_CPU_LIMIT}, + {"disable-shm", 2, 0, ARG_DISABLE_SHM}, + {"dump-resample-methods", 2, 0, ARG_DUMP_RESAMPLE_METHODS}, + {"cleanup-shm", 2, 0, ARG_CLEANUP_SHM}, + {NULL, 0, 0, 0} +}; + +void pa_cmdline_help(const char *argv0) { + pa_assert(argv0); + + printf(_("%s [options]\n\n" + "COMMANDS:\n" + " -h, --help Show this help\n" + " --version Show version\n" + " --dump-conf Dump default configuration\n" + " --dump-modules Dump list of available modules\n" + " --dump-resample-methods Dump available resample methods\n" + " --cleanup-shm Cleanup stale shared memory segments\n" + " --start Start the daemon if it is not running\n" + " -k --kill Kill a running daemon\n" + " --check Check for a running daemon (only returns exit code)\n\n" + + "OPTIONS:\n" + " --system[=BOOL] Run as system-wide instance\n" + " -D, --daemonize[=BOOL] Daemonize after startup\n" + " --fail[=BOOL] Quit when startup fails\n" + " --high-priority[=BOOL] Try to set high nice level\n" + " (only available as root, when SUID or\n" + " with elevated RLIMIT_NICE)\n" + " --realtime[=BOOL] Try to enable realtime scheduling\n" + " (only available as root, when SUID or\n" + " with elevated RLIMIT_RTPRIO)\n" + " --disallow-module-loading[=BOOL] Disallow module user requested module\n" + " loading/unloading after startup\n" + " --disallow-exit[=BOOL] Disallow user requested exit\n" + " --exit-idle-time=SECS Terminate the daemon when idle and this\n" + " time passed\n" + " --module-idle-time=SECS Unload autoloaded modules when idle and\n" + " this time passed\n" + " --scache-idle-time=SECS Unload autoloaded samples when idle and\n" + " this time passed\n" + " --log-level[=LEVEL] Increase or set verbosity level\n" + " -v Increase the verbosity level\n" + " --log-target={auto,syslog,stderr} Specify the log target\n" + " --log-meta[=BOOL] Include code location in log messages\n" + " --log-time[=BOOL] Include timestamps in log messages\n" + " --log-backtrace=FRAMES Include a backtrace in log messages\n" + " -p, --dl-search-path=PATH Set the search path for dynamic shared\n" + " objects (plugins)\n" + " --resample-method=METHOD Use the specified resampling method\n" + " (See --dump-resample-methods for\n" + " possible values)\n" + " --use-pid-file[=BOOL] Create a PID file\n" + " --no-cpu-limit[=BOOL] Do not install CPU load limiter on\n" + " platforms that support it.\n" + " --disable-shm[=BOOL] Disable shared memory support.\n\n" + + "STARTUP SCRIPT:\n" + " -L, --load=\"MODULE ARGUMENTS\" Load the specified plugin module with\n" + " the specified argument\n" + " -F, --file=FILENAME Run the specified script\n" + " -C Open a command line on the running TTY\n" + " after startup\n\n" + + " -n Don't load default script file\n"), + pa_path_get_filename(argv0)); +} + +int pa_cmdline_parse(pa_daemon_conf *conf, int argc, char *const argv [], int *d) { + pa_strbuf *buf = NULL; + int c; + + pa_assert(conf); + pa_assert(argc > 0); + pa_assert(argv); + + buf = pa_strbuf_new(); + + if (conf->script_commands) + pa_strbuf_puts(buf, conf->script_commands); + + while ((c = getopt_long(argc, argv, "L:F:ChDnp:kv", long_options, NULL)) != -1) { + switch (c) { + case ARG_HELP: + case 'h': + conf->cmd = PA_CMD_HELP; + break; + + case ARG_VERSION: + conf->cmd = PA_CMD_VERSION; + break; + + case ARG_DUMP_CONF: + conf->cmd = PA_CMD_DUMP_CONF; + break; + + case ARG_DUMP_MODULES: + conf->cmd = PA_CMD_DUMP_MODULES; + break; + + case ARG_DUMP_RESAMPLE_METHODS: + conf->cmd = PA_CMD_DUMP_RESAMPLE_METHODS; + break; + + case ARG_CLEANUP_SHM: + conf->cmd = PA_CMD_CLEANUP_SHM; + break; + + case 'k': + case ARG_KILL: + conf->cmd = PA_CMD_KILL; + break; + + case ARG_START: + conf->cmd = PA_CMD_START; + conf->daemonize = TRUE; + break; + + case ARG_CHECK: + conf->cmd = PA_CMD_CHECK; + break; + + case ARG_LOAD: + case 'L': + pa_strbuf_printf(buf, "load-module %s\n", optarg); + break; + + case ARG_FILE: + case 'F': { + char *p; + pa_strbuf_printf(buf, ".include %s\n", p = pa_make_path_absolute(optarg)); + pa_xfree(p); + break; + } + + case 'C': + pa_strbuf_puts(buf, "load-module module-cli exit_on_eof=1\n"); + break; + + case ARG_DAEMONIZE: + case 'D': + if ((conf->daemonize = optarg ? pa_parse_boolean(optarg) : TRUE) < 0) { + pa_log(_("--daemonize expects boolean argument")); + goto fail; + } + break; + + case ARG_FAIL: + if ((conf->fail = optarg ? pa_parse_boolean(optarg) : TRUE) < 0) { + pa_log(_("--fail expects boolean argument")); + goto fail; + } + break; + + case 'v': + case ARG_LOG_LEVEL: + + if (optarg) { + if (pa_daemon_conf_set_log_level(conf, optarg) < 0) { + pa_log(_("--log-level expects log level argument (either numeric in range 0..4 or one of debug, info, notice, warn, error).")); + goto fail; + } + } else { + if (conf->log_level < PA_LOG_LEVEL_MAX-1) + conf->log_level++; + } + + break; + + case ARG_HIGH_PRIORITY: + if ((conf->high_priority = optarg ? pa_parse_boolean(optarg) : TRUE) < 0) { + pa_log(_("--high-priority expects boolean argument")); + goto fail; + } + break; + + case ARG_REALTIME: + if ((conf->realtime_scheduling = optarg ? pa_parse_boolean(optarg) : TRUE) < 0) { + pa_log(_("--realtime expects boolean argument")); + goto fail; + } + break; + + case ARG_DISALLOW_MODULE_LOADING: + if ((conf->disallow_module_loading = optarg ? pa_parse_boolean(optarg) : TRUE) < 0) { + pa_log(_("--disallow-module-loading expects boolean argument")); + goto fail; + } + break; + + case ARG_DISALLOW_EXIT: + if ((conf->disallow_exit = optarg ? pa_parse_boolean(optarg) : TRUE) < 0) { + pa_log(_("--disallow-exit expects boolean argument")); + goto fail; + } + break; + + case ARG_USE_PID_FILE: + if ((conf->use_pid_file = optarg ? pa_parse_boolean(optarg) : TRUE) < 0) { + pa_log(_("--use-pid-file expects boolean argument")); + goto fail; + } + break; + + case 'p': + case ARG_DL_SEARCH_PATH: + pa_xfree(conf->dl_search_path); + conf->dl_search_path = *optarg ? pa_xstrdup(optarg) : NULL; + break; + + case 'n': + conf->load_default_script_file = FALSE; + break; + + case ARG_LOG_TARGET: + if (pa_daemon_conf_set_log_target(conf, optarg) < 0) { + pa_log(_("Invalid log target: use either 'syslog', 'stderr' or 'auto'.")); + goto fail; + } + break; + + case ARG_LOG_TIME: + if ((conf->log_time = optarg ? pa_parse_boolean(optarg) : TRUE) < 0) { + pa_log(_("--log-time expects boolean argument")); + goto fail; + } + break; + + case ARG_LOG_META: + if ((conf->log_meta = optarg ? pa_parse_boolean(optarg) : TRUE) < 0) { + pa_log(_("--log-meta expects boolean argument")); + goto fail; + } + break; + + case ARG_LOG_BACKTRACE: + conf->log_backtrace = (unsigned) atoi(optarg); + break; + + case ARG_EXIT_IDLE_TIME: + conf->exit_idle_time = atoi(optarg); + break; + + case ARG_SCACHE_IDLE_TIME: + conf->scache_idle_time = atoi(optarg); + break; + + case ARG_RESAMPLE_METHOD: + if (pa_daemon_conf_set_resample_method(conf, optarg) < 0) { + pa_log(_("Invalid resample method '%s'."), optarg); + goto fail; + } + break; + + case ARG_SYSTEM: + if ((conf->system_instance = optarg ? pa_parse_boolean(optarg) : TRUE) < 0) { + pa_log(_("--system expects boolean argument")); + goto fail; + } + break; + + case ARG_NO_CPU_LIMIT: + if ((conf->no_cpu_limit = optarg ? pa_parse_boolean(optarg) : TRUE) < 0) { + pa_log(_("--no-cpu-limit expects boolean argument")); + goto fail; + } + break; + + case ARG_DISABLE_SHM: + if ((conf->disable_shm = optarg ? pa_parse_boolean(optarg) : TRUE) < 0) { + pa_log(_("--disable-shm expects boolean argument")); + goto fail; + } + break; + + default: + goto fail; + } + } + + pa_xfree(conf->script_commands); + conf->script_commands = pa_strbuf_tostring_free(buf); + + *d = optind; + + return 0; + +fail: + if (buf) + pa_strbuf_free(buf); + + return -1; +} diff --git a/src/daemon/cmdline.h b/src/daemon/cmdline.h new file mode 100644 index 0000000..e34d7f5 --- /dev/null +++ b/src/daemon/cmdline.h @@ -0,0 +1,35 @@ +#ifndef foocmdlinehfoo +#define foocmdlinehfoo + +/*** + This file is part of PulseAudio. + + Copyright 2004-2006 Lennart Poettering + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#include "daemon-conf.h" + +/* Parese the command line and store its data in *c. Return the index + * of the first unparsed argument in *d. */ +int pa_cmdline_parse(pa_daemon_conf*c, int argc, char *const argv [], int *d); + +/* Show the command line help. The command name is extracted from + * argv[0] which should be passed in argv0. */ +void pa_cmdline_help(const char *argv0); + +#endif diff --git a/src/daemon/cpulimit.c b/src/daemon/cpulimit.c new file mode 100644 index 0000000..c2877ec --- /dev/null +++ b/src/daemon/cpulimit.c @@ -0,0 +1,251 @@ +/*** + This file is part of PulseAudio. + + Copyright 2004-2006 Lennart Poettering + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation; either version 2.1 of the + License, or (at your option) any later version. + + PulseAudio 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 Lesser General Public + License along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "cpulimit.h" + +#ifdef HAVE_SIGXCPU + +#include +#include +#include +#include +#include +#include + +#ifdef HAVE_SYS_RESOURCE_H +#include +#endif + +/* This module implements a watchdog that makes sure that the current + * process doesn't consume more than 70% CPU time for 10 seconds. This + * is very useful when using SCHED_FIFO scheduling which effectively + * disables multitasking. */ + +/* Method of operation: Using SIGXCPU a signal handler is called every + * 10s process CPU time. That function checks if less than 14s system + * time have passed. In that case, it tries to contact the main event + * loop through a pipe. After two additional seconds it is checked + * whether the main event loop contact was successful. If not, the + * program is terminated forcibly. */ + +/* Utilize this much CPU time at maximum */ +#define CPUTIME_PERCENT 70 + +/* Check every 10s */ +#define CPUTIME_INTERVAL_SOFT (10) + +/* Recheck after 5s */ +#define CPUTIME_INTERVAL_HARD (5) + +/* Time of the last CPU load check */ +static pa_usec_t last_time = 0; + +/* Pipe for communicating with the main loop */ +static int the_pipe[2] = {-1, -1}; + +/* Main event loop and IO event for the FIFO */ +static pa_mainloop_api *api = NULL; +static pa_io_event *io_event = NULL; + +/* Saved sigaction struct for SIGXCPU */ +static struct sigaction sigaction_prev; + +/* Nonzero after pa_cpu_limit_init() */ +static pa_bool_t installed = FALSE; + +/* The current state of operation */ +static enum { + PHASE_IDLE, /* Normal state */ + PHASE_SOFT /* After CPU overload has been detected */ +} phase = PHASE_IDLE; + +/* Reset the SIGXCPU timer to the next t seconds */ +static void reset_cpu_time(int t) { + long n; + struct rlimit rl; + struct rusage ru; + + /* Get the current CPU time of the current process */ + pa_assert_se(getrusage(RUSAGE_SELF, &ru) >= 0); + + n = ru.ru_utime.tv_sec + ru.ru_stime.tv_sec + t; + pa_assert_se(getrlimit(RLIMIT_CPU, &rl) >= 0); + + rl.rlim_cur = (rlim_t) n; + pa_assert_se(setrlimit(RLIMIT_CPU, &rl) >= 0); +} + +/* A simple, thread-safe puts() work-alike */ +static void write_err(const char *p) { + pa_loop_write(2, p, strlen(p), NULL); +} + +/* The signal handler, called on every SIGXCPU */ +static void signal_handler(int sig) { + int saved_errno; + + saved_errno = errno; + pa_assert(sig == SIGXCPU); + + if (phase == PHASE_IDLE) { + pa_usec_t now, elapsed; + +#ifdef PRINT_CPU_LOAD + char t[256]; +#endif + + now = pa_rtclock_now(); + elapsed = now - last_time; + +#ifdef PRINT_CPU_LOAD + pa_snprintf(t, sizeof(t), "Using %0.1f%% CPU\n", ((double) CPUTIME_INTERVAL_SOFT * (double) PA_USEC_PER_SEC) / (double) elapsed * 100.0); + write_err(t); +#endif + + if (((double) CPUTIME_INTERVAL_SOFT * (double) PA_USEC_PER_SEC) >= ((double) elapsed * (double) CPUTIME_PERCENT / 100.0)) { + static const char c = 'X'; + + write_err("Soft CPU time limit exhausted, terminating.\n"); + + /* Try a soft cleanup */ + (void) write(the_pipe[1], &c, sizeof(c)); + phase = PHASE_SOFT; + reset_cpu_time(CPUTIME_INTERVAL_HARD); + + } else { + + /* Everything's fine */ + reset_cpu_time(CPUTIME_INTERVAL_SOFT); + last_time = now; + } + + } else if (phase == PHASE_SOFT) { + write_err("Hard CPU time limit exhausted, terminating forcibly.\n"); + abort(); /* Forced exit */ + } + + errno = saved_errno; +} + +/* Callback for IO events on the FIFO */ +static void callback(pa_mainloop_api*m, pa_io_event*e, int fd, pa_io_event_flags_t f, void *userdata) { + char c; + pa_assert(m); + pa_assert(e); + pa_assert(f == PA_IO_EVENT_INPUT); + pa_assert(e == io_event); + pa_assert(fd == the_pipe[0]); + + pa_log("Received request to terminate due to CPU overload."); + + pa_read(the_pipe[0], &c, sizeof(c), NULL); + m->quit(m, 1); /* Quit the main loop */ +} + +/* Initializes CPU load limiter */ +int pa_cpu_limit_init(pa_mainloop_api *m) { + struct sigaction sa; + + pa_assert(m); + pa_assert(!api); + pa_assert(!io_event); + pa_assert(the_pipe[0] == -1); + pa_assert(the_pipe[1] == -1); + pa_assert(!installed); + + last_time = pa_rtclock_now(); + + /* Prepare the main loop pipe */ + if (pipe(the_pipe) < 0) { + pa_log("pipe() failed: %s", pa_cstrerror(errno)); + return -1; + } + + pa_make_fd_nonblock(the_pipe[0]); + pa_make_fd_nonblock(the_pipe[1]); + pa_make_fd_cloexec(the_pipe[0]); + pa_make_fd_cloexec(the_pipe[1]); + + api = m; + io_event = api->io_new(m, the_pipe[0], PA_IO_EVENT_INPUT, callback, NULL); + + phase = PHASE_IDLE; + + /* Install signal handler for SIGXCPU */ + memset(&sa, 0, sizeof(sa)); + sa.sa_handler = signal_handler; + sigemptyset(&sa.sa_mask); + sa.sa_flags = SA_RESTART; + + if (sigaction(SIGXCPU, &sa, &sigaction_prev) < 0) { + pa_cpu_limit_done(); + return -1; + } + + installed = TRUE; + + reset_cpu_time(CPUTIME_INTERVAL_SOFT); + + return 0; +} + +/* Shutdown CPU load limiter */ +void pa_cpu_limit_done(void) { + + if (io_event) { + pa_assert(api); + api->io_free(io_event); + io_event = NULL; + api = NULL; + } + + pa_close_pipe(the_pipe); + + if (installed) { + pa_assert_se(sigaction(SIGXCPU, &sigaction_prev, NULL) >= 0); + installed = FALSE; + } +} + +#else /* HAVE_SIGXCPU */ + +int pa_cpu_limit_init(pa_mainloop_api *m) { + return 0; +} + +void pa_cpu_limit_done(void) { +} + +#endif diff --git a/src/daemon/cpulimit.h b/src/daemon/cpulimit.h new file mode 100644 index 0000000..ce78d48 --- /dev/null +++ b/src/daemon/cpulimit.h @@ -0,0 +1,34 @@ +#ifndef foocpulimithfoo +#define foocpulimithfoo + +/*** + This file is part of PulseAudio. + + Copyright 2004-2006 Lennart Poettering + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#include + +/* This kills the pulseaudio process if it eats more than 70% of the + * CPU time. This is build around setrlimit() and SIGXCPU. It is handy + * in case of using SCHED_FIFO which may freeze the whole machine */ + +int pa_cpu_limit_init(pa_mainloop_api *m); +void pa_cpu_limit_done(void); + +#endif diff --git a/src/daemon/daemon-conf.c b/src/daemon/daemon-conf.c new file mode 100644 index 0000000..5ca8a4a --- /dev/null +++ b/src/daemon/daemon-conf.c @@ -0,0 +1,725 @@ +/*** + This file is part of PulseAudio. + + Copyright 2004-2006 Lennart Poettering + Copyright 2006 Pierre Ossman for Cendio AB + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include "daemon-conf.h" + +#define DEFAULT_SCRIPT_FILE PA_DEFAULT_CONFIG_DIR PA_PATH_SEP "default.pa" +#define DEFAULT_SCRIPT_FILE_USER PA_PATH_SEP "default.pa" +#define DEFAULT_SYSTEM_SCRIPT_FILE PA_DEFAULT_CONFIG_DIR PA_PATH_SEP "system.pa" + +#define DEFAULT_CONFIG_FILE PA_DEFAULT_CONFIG_DIR PA_PATH_SEP "daemon.conf" +#define DEFAULT_CONFIG_FILE_USER PA_PATH_SEP "daemon.conf" + +#define ENV_SCRIPT_FILE "PULSE_SCRIPT" +#define ENV_CONFIG_FILE "PULSE_CONFIG" +#define ENV_DL_SEARCH_PATH "PULSE_DLPATH" + +static const pa_daemon_conf default_conf = { + .cmd = PA_CMD_DAEMON, + .daemonize = FALSE, + .fail = TRUE, + .high_priority = TRUE, + .nice_level = -11, + .realtime_scheduling = TRUE, + .realtime_priority = 5, /* Half of JACK's default rtprio */ + .disallow_module_loading = FALSE, + .disallow_exit = FALSE, + .flat_volumes = TRUE, + .exit_idle_time = 20, + .scache_idle_time = 20, + .auto_log_target = 1, + .script_commands = NULL, + .dl_search_path = NULL, + .load_default_script_file = TRUE, + .default_script_file = NULL, + .log_target = PA_LOG_SYSLOG, + .log_level = PA_LOG_NOTICE, + .log_backtrace = 0, + .log_meta = FALSE, + .log_time = FALSE, + .resample_method = PA_RESAMPLER_AUTO, + .disable_remixing = FALSE, + .disable_lfe_remixing = TRUE, + .config_file = NULL, + .use_pid_file = TRUE, + .system_instance = FALSE, + .no_cpu_limit = TRUE, + .disable_shm = FALSE, + .lock_memory = FALSE, + .default_n_fragments = 4, + .default_fragment_size_msec = 25, + .default_sample_spec = { .format = PA_SAMPLE_S16NE, .rate = 44100, .channels = 2 }, + .default_channel_map = { .channels = 2, .map = { PA_CHANNEL_POSITION_LEFT, PA_CHANNEL_POSITION_RIGHT } }, + .shm_size = 0 +#ifdef HAVE_SYS_RESOURCE_H + ,.rlimit_fsize = { .value = 0, .is_set = FALSE }, + .rlimit_data = { .value = 0, .is_set = FALSE }, + .rlimit_stack = { .value = 0, .is_set = FALSE }, + .rlimit_core = { .value = 0, .is_set = FALSE } +#ifdef RLIMIT_RSS + ,.rlimit_rss = { .value = 0, .is_set = FALSE } +#endif +#ifdef RLIMIT_NPROC + ,.rlimit_nproc = { .value = 0, .is_set = FALSE } +#endif +#ifdef RLIMIT_NOFILE + ,.rlimit_nofile = { .value = 256, .is_set = TRUE } +#endif +#ifdef RLIMIT_MEMLOCK + ,.rlimit_memlock = { .value = 0, .is_set = FALSE } +#endif +#ifdef RLIMIT_AS + ,.rlimit_as = { .value = 0, .is_set = FALSE } +#endif +#ifdef RLIMIT_LOCKS + ,.rlimit_locks = { .value = 0, .is_set = FALSE } +#endif +#ifdef RLIMIT_SIGPENDING + ,.rlimit_sigpending = { .value = 0, .is_set = FALSE } +#endif +#ifdef RLIMIT_MSGQUEUE + ,.rlimit_msgqueue = { .value = 0, .is_set = FALSE } +#endif +#ifdef RLIMIT_NICE + ,.rlimit_nice = { .value = 31, .is_set = TRUE } /* nice level of -11 */ +#endif +#ifdef RLIMIT_RTPRIO + ,.rlimit_rtprio = { .value = 9, .is_set = TRUE } /* One below JACK's default for the server */ +#endif +#ifdef RLIMIT_RTTIME + ,.rlimit_rttime = { .value = PA_USEC_PER_SEC, .is_set = TRUE } +#endif +#endif +}; + +pa_daemon_conf* pa_daemon_conf_new(void) { + pa_daemon_conf *c; + + c = pa_xnewdup(pa_daemon_conf, &default_conf, 1); + +#if defined(__linux__) && !defined(__OPTIMIZE__) + + /* We abuse __OPTIMIZE__ as a check whether we are a debug build + * or not. If we are and are run from the build tree then we + * override the search path to point to our build tree */ + + if (pa_run_from_build_tree()) { + pa_log_notice("Detected that we are run from the build tree, fixing search path."); + c->dl_search_path = pa_xstrdup(PA_BUILDDIR "/.libs/"); + + } else + +#endif + c->dl_search_path = pa_xstrdup(PA_DLSEARCHPATH); + + return c; +} + +void pa_daemon_conf_free(pa_daemon_conf *c) { + pa_assert(c); + pa_xfree(c->script_commands); + pa_xfree(c->dl_search_path); + pa_xfree(c->default_script_file); + pa_xfree(c->config_file); + pa_xfree(c); +} + +int pa_daemon_conf_set_log_target(pa_daemon_conf *c, const char *string) { + pa_assert(c); + pa_assert(string); + + if (!strcmp(string, "auto")) + c->auto_log_target = 1; + else if (!strcmp(string, "syslog")) { + c->auto_log_target = 0; + c->log_target = PA_LOG_SYSLOG; + } else if (!strcmp(string, "stderr")) { + c->auto_log_target = 0; + c->log_target = PA_LOG_STDERR; +#ifdef USE_DLOG + } else if (!strcmp(string, "dlog")) { + c->auto_log_target = 0; + c->log_target = PA_LOG_DLOG; + } else if (!strcmp(string, "dlog-color")) { + c->auto_log_target = 0; + c->log_target = PA_LOG_DLOG_COLOR; +#endif + } else + return -1; + + return 0; +} + +int pa_daemon_conf_set_log_level(pa_daemon_conf *c, const char *string) { + uint32_t u; + pa_assert(c); + pa_assert(string); + + if (pa_atou(string, &u) >= 0) { + if (u >= PA_LOG_LEVEL_MAX) + return -1; + + c->log_level = (pa_log_level_t) u; + } else if (pa_startswith(string, "debug")) + c->log_level = PA_LOG_DEBUG; + else if (pa_startswith(string, "info")) + c->log_level = PA_LOG_INFO; + else if (pa_startswith(string, "notice")) + c->log_level = PA_LOG_NOTICE; + else if (pa_startswith(string, "warn")) + c->log_level = PA_LOG_WARN; + else if (pa_startswith(string, "err")) + c->log_level = PA_LOG_ERROR; + else + return -1; + + return 0; +} + +int pa_daemon_conf_set_resample_method(pa_daemon_conf *c, const char *string) { + int m; + pa_assert(c); + pa_assert(string); + + if ((m = pa_parse_resample_method(string)) < 0) + return -1; + + c->resample_method = m; + return 0; +} + +static int parse_log_target(const char *filename, unsigned line, const char *section, const char *lvalue, const char *rvalue, void *data, void *userdata) { + pa_daemon_conf *c = data; + + pa_assert(filename); + pa_assert(lvalue); + pa_assert(rvalue); + pa_assert(data); + + if (pa_daemon_conf_set_log_target(c, rvalue) < 0) { + pa_log(_("[%s:%u] Invalid log target '%s'."), filename, line, rvalue); + return -1; + } + + return 0; +} + +static int parse_log_level(const char *filename, unsigned line, const char *section, const char *lvalue, const char *rvalue, void *data, void *userdata) { + pa_daemon_conf *c = data; + + pa_assert(filename); + pa_assert(lvalue); + pa_assert(rvalue); + pa_assert(data); + + if (pa_daemon_conf_set_log_level(c, rvalue) < 0) { + pa_log(_("[%s:%u] Invalid log level '%s'."), filename, line, rvalue); + return -1; + } + + return 0; +} + +static int parse_resample_method(const char *filename, unsigned line, const char *section, const char *lvalue, const char *rvalue, void *data, void *userdata) { + pa_daemon_conf *c = data; + + pa_assert(filename); + pa_assert(lvalue); + pa_assert(rvalue); + pa_assert(data); + + if (pa_daemon_conf_set_resample_method(c, rvalue) < 0) { + pa_log(_("[%s:%u] Invalid resample method '%s'."), filename, line, rvalue); + return -1; + } + + return 0; +} + +static int parse_rlimit(const char *filename, unsigned line, const char *section, const char *lvalue, const char *rvalue, void *data, void *userdata) { +#ifdef HAVE_SYS_RESOURCE_H + struct pa_rlimit *r = data; + + pa_assert(filename); + pa_assert(lvalue); + pa_assert(rvalue); + pa_assert(r); + + if (rvalue[strspn(rvalue, "\t ")] == 0) { + /* Empty string */ + r->is_set = 0; + r->value = 0; + } else { + int32_t k; + if (pa_atoi(rvalue, &k) < 0) { + pa_log(_("[%s:%u] Invalid rlimit '%s'."), filename, line, rvalue); + return -1; + } + r->is_set = k >= 0; + r->value = k >= 0 ? (rlim_t) k : 0; + } +#else + pa_log_warn(_("[%s:%u] rlimit not supported on this platform."), filename, line); +#endif + + return 0; +} + +static int parse_sample_format(const char *filename, unsigned line, const char *section, const char *lvalue, const char *rvalue, void *data, void *userdata) { + pa_daemon_conf *c = data; + pa_sample_format_t f; + + pa_assert(filename); + pa_assert(lvalue); + pa_assert(rvalue); + pa_assert(data); + + if ((f = pa_parse_sample_format(rvalue)) < 0) { + pa_log(_("[%s:%u] Invalid sample format '%s'."), filename, line, rvalue); + return -1; + } + + c->default_sample_spec.format = f; + return 0; +} + +static int parse_sample_rate(const char *filename, unsigned line, const char *section, const char *lvalue, const char *rvalue, void *data, void *userdata) { + pa_daemon_conf *c = data; + uint32_t r; + + pa_assert(filename); + pa_assert(lvalue); + pa_assert(rvalue); + pa_assert(data); + + if (pa_atou(rvalue, &r) < 0 || r > (uint32_t) PA_RATE_MAX || r <= 0) { + pa_log(_("[%s:%u] Invalid sample rate '%s'."), filename, line, rvalue); + return -1; + } + + c->default_sample_spec.rate = r; + return 0; +} + +struct channel_conf_info { + pa_daemon_conf *conf; + pa_bool_t default_sample_spec_set; + pa_bool_t default_channel_map_set; +}; + +static int parse_sample_channels(const char *filename, unsigned line, const char *section, const char *lvalue, const char *rvalue, void *data, void *userdata) { + struct channel_conf_info *i = data; + int32_t n; + + pa_assert(filename); + pa_assert(lvalue); + pa_assert(rvalue); + pa_assert(data); + + if (pa_atoi(rvalue, &n) < 0 || n > (int32_t) PA_CHANNELS_MAX || n <= 0) { + pa_log(_("[%s:%u] Invalid sample channels '%s'."), filename, line, rvalue); + return -1; + } + + i->conf->default_sample_spec.channels = (uint8_t) n; + i->default_sample_spec_set = TRUE; + return 0; +} + +static int parse_channel_map(const char *filename, unsigned line, const char *section, const char *lvalue, const char *rvalue, void *data, void *userdata) { + struct channel_conf_info *i = data; + + pa_assert(filename); + pa_assert(lvalue); + pa_assert(rvalue); + pa_assert(data); + + if (!pa_channel_map_parse(&i->conf->default_channel_map, rvalue)) { + pa_log(_("[%s:%u] Invalid channel map '%s'."), filename, line, rvalue); + return -1; + } + + i->default_channel_map_set = TRUE; + return 0; +} + +static int parse_fragments(const char *filename, unsigned line, const char *section, const char *lvalue, const char *rvalue, void *data, void *userdata) { + pa_daemon_conf *c = data; + int32_t n; + + pa_assert(filename); + pa_assert(lvalue); + pa_assert(rvalue); + pa_assert(data); + + if (pa_atoi(rvalue, &n) < 0 || n < 2) { + pa_log(_("[%s:%u] Invalid number of fragments '%s'."), filename, line, rvalue); + return -1; + } + + c->default_n_fragments = (unsigned) n; + return 0; +} + +static int parse_fragment_size_msec(const char *filename, unsigned line, const char *section, const char *lvalue, const char *rvalue, void *data, void *userdata) { + pa_daemon_conf *c = data; + int32_t n; + + pa_assert(filename); + pa_assert(lvalue); + pa_assert(rvalue); + pa_assert(data); + + if (pa_atoi(rvalue, &n) < 0 || n < 1) { + pa_log(_("[%s:%u] Invalid fragment size '%s'."), filename, line, rvalue); + return -1; + } + + c->default_fragment_size_msec = (unsigned) n; + return 0; +} + +static int parse_nice_level(const char *filename, unsigned line, const char *section, const char *lvalue, const char *rvalue, void *data, void *userdata) { + pa_daemon_conf *c = data; + int32_t level; + + pa_assert(filename); + pa_assert(lvalue); + pa_assert(rvalue); + pa_assert(data); + + if (pa_atoi(rvalue, &level) < 0 || level < -20 || level > 19) { + pa_log(_("[%s:%u] Invalid nice level '%s'."), filename, line, rvalue); + return -1; + } + + c->nice_level = (int) level; + return 0; +} + +static int parse_rtprio(const char *filename, unsigned line, const char *section, const char *lvalue, const char *rvalue, void *data, void *userdata) { + pa_daemon_conf *c = data; + int32_t rtprio; + + pa_assert(filename); + pa_assert(lvalue); + pa_assert(rvalue); + pa_assert(data); + + if (pa_atoi(rvalue, &rtprio) < 0 || rtprio < sched_get_priority_min(SCHED_FIFO) || rtprio > sched_get_priority_max(SCHED_FIFO)) { + pa_log("[%s:%u] Invalid realtime priority '%s'.", filename, line, rvalue); + return -1; + } + + c->realtime_priority = (int) rtprio; + return 0; +} + +int pa_daemon_conf_load(pa_daemon_conf *c, const char *filename) { + int r = -1; + FILE *f = NULL; + struct channel_conf_info ci; + pa_config_item table[] = { + { "daemonize", pa_config_parse_bool, &c->daemonize, NULL }, + { "fail", pa_config_parse_bool, &c->fail, NULL }, + { "high-priority", pa_config_parse_bool, &c->high_priority, NULL }, + { "realtime-scheduling", pa_config_parse_bool, &c->realtime_scheduling, NULL }, + { "disallow-module-loading", pa_config_parse_bool, &c->disallow_module_loading, NULL }, + { "allow-module-loading", pa_config_parse_not_bool, &c->disallow_module_loading, NULL }, + { "disallow-exit", pa_config_parse_bool, &c->disallow_exit, NULL }, + { "allow-exit", pa_config_parse_not_bool, &c->disallow_exit, NULL }, + { "use-pid-file", pa_config_parse_bool, &c->use_pid_file, NULL }, + { "system-instance", pa_config_parse_bool, &c->system_instance, NULL }, + { "no-cpu-limit", pa_config_parse_bool, &c->no_cpu_limit, NULL }, + { "cpu-limit", pa_config_parse_not_bool, &c->no_cpu_limit, NULL }, + { "disable-shm", pa_config_parse_bool, &c->disable_shm, NULL }, + { "enable-shm", pa_config_parse_not_bool, &c->disable_shm, NULL }, + { "flat-volumes", pa_config_parse_bool, &c->flat_volumes, NULL }, + { "lock-memory", pa_config_parse_bool, &c->lock_memory, NULL }, + { "exit-idle-time", pa_config_parse_int, &c->exit_idle_time, NULL }, + { "scache-idle-time", pa_config_parse_int, &c->scache_idle_time, NULL }, + { "realtime-priority", parse_rtprio, c, NULL }, + { "dl-search-path", pa_config_parse_string, &c->dl_search_path, NULL }, + { "default-script-file", pa_config_parse_string, &c->default_script_file, NULL }, + { "log-target", parse_log_target, c, NULL }, + { "log-level", parse_log_level, c, NULL }, + { "verbose", parse_log_level, c, NULL }, + { "resample-method", parse_resample_method, c, NULL }, + { "default-sample-format", parse_sample_format, c, NULL }, + { "default-sample-rate", parse_sample_rate, c, NULL }, + { "default-sample-channels", parse_sample_channels, &ci, NULL }, + { "default-channel-map", parse_channel_map, &ci, NULL }, + { "default-fragments", parse_fragments, c, NULL }, + { "default-fragment-size-msec", parse_fragment_size_msec, c, NULL }, + { "nice-level", parse_nice_level, c, NULL }, + { "disable-remixing", pa_config_parse_bool, &c->disable_remixing, NULL }, + { "enable-remixing", pa_config_parse_not_bool, &c->disable_remixing, NULL }, + { "disable-lfe-remixing", pa_config_parse_bool, &c->disable_lfe_remixing, NULL }, + { "enable-lfe-remixing", pa_config_parse_not_bool, &c->disable_lfe_remixing, NULL }, + { "load-default-script-file", pa_config_parse_bool, &c->load_default_script_file, NULL }, + { "shm-size-bytes", pa_config_parse_size, &c->shm_size, NULL }, + { "log-meta", pa_config_parse_bool, &c->log_meta, NULL }, + { "log-time", pa_config_parse_bool, &c->log_time, NULL }, + { "log-backtrace", pa_config_parse_unsigned, &c->log_backtrace, NULL }, +#ifdef HAVE_SYS_RESOURCE_H + { "rlimit-fsize", parse_rlimit, &c->rlimit_fsize, NULL }, + { "rlimit-data", parse_rlimit, &c->rlimit_data, NULL }, + { "rlimit-stack", parse_rlimit, &c->rlimit_stack, NULL }, + { "rlimit-core", parse_rlimit, &c->rlimit_core, NULL }, +#ifdef RLIMIT_RSS + { "rlimit-rss", parse_rlimit, &c->rlimit_rss, NULL }, +#endif +#ifdef RLIMIT_NOFILE + { "rlimit-nofile", parse_rlimit, &c->rlimit_nofile, NULL }, +#endif +#ifdef RLIMIT_AS + { "rlimit-as", parse_rlimit, &c->rlimit_as, NULL }, +#endif +#ifdef RLIMIT_NPROC + { "rlimit-nproc", parse_rlimit, &c->rlimit_nproc, NULL }, +#endif +#ifdef RLIMIT_MEMLOCK + { "rlimit-memlock", parse_rlimit, &c->rlimit_memlock, NULL }, +#endif +#ifdef RLIMIT_LOCKS + { "rlimit-locks", parse_rlimit, &c->rlimit_locks, NULL }, +#endif +#ifdef RLIMIT_SIGPENDING + { "rlimit-sigpending", parse_rlimit, &c->rlimit_sigpending, NULL }, +#endif +#ifdef RLIMIT_MSGQUEUE + { "rlimit-msgqueue", parse_rlimit, &c->rlimit_msgqueue, NULL }, +#endif +#ifdef RLIMIT_NICE + { "rlimit-nice", parse_rlimit, &c->rlimit_nice, NULL }, +#endif +#ifdef RLIMIT_RTPRIO + { "rlimit-rtprio", parse_rlimit, &c->rlimit_rtprio, NULL }, +#endif +#ifdef RLIMIT_RTTIME + { "rlimit-rttime", parse_rlimit, &c->rlimit_rttime, NULL }, +#endif +#endif + { NULL, NULL, NULL, NULL }, + }; + + pa_xfree(c->config_file); + c->config_file = NULL; + + f = filename ? + fopen(c->config_file = pa_xstrdup(filename), "r") : + pa_open_config_file(DEFAULT_CONFIG_FILE, DEFAULT_CONFIG_FILE_USER, ENV_CONFIG_FILE, &c->config_file); + + if (!f && errno != ENOENT) { + pa_log_warn(_("Failed to open configuration file: %s"), pa_cstrerror(errno)); + goto finish; + } + + ci.default_channel_map_set = ci.default_sample_spec_set = FALSE; + ci.conf = c; + + r = f ? pa_config_parse(c->config_file, f, table, NULL) : 0; + + if (r >= 0) { + + /* Make sure that channel map and sample spec fit together */ + + if (ci.default_sample_spec_set && + ci.default_channel_map_set && + c->default_channel_map.channels != c->default_sample_spec.channels) { + pa_log_error(_("The specified default channel map has a different number of channels than the specified default number of channels.")); + r = -1; + goto finish; + } else if (ci.default_sample_spec_set) + pa_channel_map_init_extend(&c->default_channel_map, c->default_sample_spec.channels, PA_CHANNEL_MAP_DEFAULT); + else if (ci.default_channel_map_set) + c->default_sample_spec.channels = c->default_channel_map.channels; + } + +finish: + if (f) + fclose(f); + + return r; +} + +int pa_daemon_conf_env(pa_daemon_conf *c) { + char *e; + pa_assert(c); + + if ((e = getenv(ENV_DL_SEARCH_PATH))) { + pa_xfree(c->dl_search_path); + c->dl_search_path = pa_xstrdup(e); + } + if ((e = getenv(ENV_SCRIPT_FILE))) { + pa_xfree(c->default_script_file); + c->default_script_file = pa_xstrdup(e); + } + + return 0; +} + +const char *pa_daemon_conf_get_default_script_file(pa_daemon_conf *c) { + pa_assert(c); + + if (!c->default_script_file) { + if (c->system_instance) + c->default_script_file = pa_find_config_file(DEFAULT_SYSTEM_SCRIPT_FILE, NULL, ENV_SCRIPT_FILE); + else + c->default_script_file = pa_find_config_file(DEFAULT_SCRIPT_FILE, DEFAULT_SCRIPT_FILE_USER, ENV_SCRIPT_FILE); + } + + return c->default_script_file; +} + +FILE *pa_daemon_conf_open_default_script_file(pa_daemon_conf *c) { + FILE *f; + pa_assert(c); + + if (!c->default_script_file) { + if (c->system_instance) + f = pa_open_config_file(DEFAULT_SYSTEM_SCRIPT_FILE, NULL, ENV_SCRIPT_FILE, &c->default_script_file); + else + f = pa_open_config_file(DEFAULT_SCRIPT_FILE, DEFAULT_SCRIPT_FILE_USER, ENV_SCRIPT_FILE, &c->default_script_file); + } else + f = fopen(c->default_script_file, "r"); + + return f; +} + +char *pa_daemon_conf_dump(pa_daemon_conf *c) { + static const char* const log_level_to_string[] = { + [PA_LOG_DEBUG] = "debug", + [PA_LOG_INFO] = "info", + [PA_LOG_NOTICE] = "notice", + [PA_LOG_WARN] = "warning", + [PA_LOG_ERROR] = "error" + }; + pa_strbuf *s; + char cm[PA_CHANNEL_MAP_SNPRINT_MAX]; + + pa_assert(c); + + s = pa_strbuf_new(); + + if (c->config_file) + pa_strbuf_printf(s, _("### Read from configuration file: %s ###\n"), c->config_file); + + pa_assert(c->log_level < PA_LOG_LEVEL_MAX); + + pa_strbuf_printf(s, "daemonize = %s\n", pa_yes_no(c->daemonize)); + pa_strbuf_printf(s, "fail = %s\n", pa_yes_no(c->fail)); + pa_strbuf_printf(s, "high-priority = %s\n", pa_yes_no(c->high_priority)); + pa_strbuf_printf(s, "nice-level = %i\n", c->nice_level); + pa_strbuf_printf(s, "realtime-scheduling = %s\n", pa_yes_no(c->realtime_scheduling)); + pa_strbuf_printf(s, "realtime-priority = %i\n", c->realtime_priority); + pa_strbuf_printf(s, "allow-module-loading = %s\n", pa_yes_no(!c->disallow_module_loading)); + pa_strbuf_printf(s, "allow-exit = %s\n", pa_yes_no(!c->disallow_exit)); + pa_strbuf_printf(s, "use-pid-file = %s\n", pa_yes_no(c->use_pid_file)); + pa_strbuf_printf(s, "system-instance = %s\n", pa_yes_no(c->system_instance)); + pa_strbuf_printf(s, "cpu-limit = %s\n", pa_yes_no(!c->no_cpu_limit)); + pa_strbuf_printf(s, "enable-shm = %s\n", pa_yes_no(!c->disable_shm)); + pa_strbuf_printf(s, "flat-volumes = %s\n", pa_yes_no(c->flat_volumes)); + pa_strbuf_printf(s, "lock-memory = %s\n", pa_yes_no(c->lock_memory)); + pa_strbuf_printf(s, "exit-idle-time = %i\n", c->exit_idle_time); + pa_strbuf_printf(s, "scache-idle-time = %i\n", c->scache_idle_time); + pa_strbuf_printf(s, "dl-search-path = %s\n", pa_strempty(c->dl_search_path)); + pa_strbuf_printf(s, "default-script-file = %s\n", pa_strempty(pa_daemon_conf_get_default_script_file(c))); + pa_strbuf_printf(s, "load-default-script-file = %s\n", pa_yes_no(c->load_default_script_file)); + pa_strbuf_printf(s, "log-target = %s\n", c->auto_log_target ? "auto" : (c->log_target == PA_LOG_SYSLOG ? "syslog" : "stderr")); + pa_strbuf_printf(s, "log-level = %s\n", log_level_to_string[c->log_level]); + pa_strbuf_printf(s, "resample-method = %s\n", pa_resample_method_to_string(c->resample_method)); + pa_strbuf_printf(s, "enable-remixing = %s\n", pa_yes_no(!c->disable_remixing)); + pa_strbuf_printf(s, "enable-lfe-remixing = %s\n", pa_yes_no(!c->disable_lfe_remixing)); + pa_strbuf_printf(s, "default-sample-format = %s\n", pa_sample_format_to_string(c->default_sample_spec.format)); + pa_strbuf_printf(s, "default-sample-rate = %u\n", c->default_sample_spec.rate); + pa_strbuf_printf(s, "default-sample-channels = %u\n", c->default_sample_spec.channels); + pa_strbuf_printf(s, "default-channel-map = %s\n", pa_channel_map_snprint(cm, sizeof(cm), &c->default_channel_map)); + pa_strbuf_printf(s, "default-fragments = %u\n", c->default_n_fragments); + pa_strbuf_printf(s, "default-fragment-size-msec = %u\n", c->default_fragment_size_msec); + pa_strbuf_printf(s, "shm-size-bytes = %lu\n", (unsigned long) c->shm_size); + pa_strbuf_printf(s, "log-meta = %s\n", pa_yes_no(c->log_meta)); + pa_strbuf_printf(s, "log-time = %s\n", pa_yes_no(c->log_time)); + pa_strbuf_printf(s, "log-backtrace = %u\n", c->log_backtrace); +#ifdef HAVE_SYS_RESOURCE_H + pa_strbuf_printf(s, "rlimit-fsize = %li\n", c->rlimit_fsize.is_set ? (long int) c->rlimit_fsize.value : -1); + pa_strbuf_printf(s, "rlimit-data = %li\n", c->rlimit_data.is_set ? (long int) c->rlimit_data.value : -1); + pa_strbuf_printf(s, "rlimit-stack = %li\n", c->rlimit_stack.is_set ? (long int) c->rlimit_stack.value : -1); + pa_strbuf_printf(s, "rlimit-core = %li\n", c->rlimit_core.is_set ? (long int) c->rlimit_core.value : -1); +#ifdef RLIMIT_RSS + pa_strbuf_printf(s, "rlimit-rss = %li\n", c->rlimit_rss.is_set ? (long int) c->rlimit_rss.value : -1); +#endif +#ifdef RLIMIT_AS + pa_strbuf_printf(s, "rlimit-as = %li\n", c->rlimit_as.is_set ? (long int) c->rlimit_as.value : -1); +#endif +#ifdef RLIMIT_NPROC + pa_strbuf_printf(s, "rlimit-nproc = %li\n", c->rlimit_nproc.is_set ? (long int) c->rlimit_nproc.value : -1); +#endif +#ifdef RLIMIT_NOFILE + pa_strbuf_printf(s, "rlimit-nofile = %li\n", c->rlimit_nofile.is_set ? (long int) c->rlimit_nofile.value : -1); +#endif +#ifdef RLIMIT_MEMLOCK + pa_strbuf_printf(s, "rlimit-memlock = %li\n", c->rlimit_memlock.is_set ? (long int) c->rlimit_memlock.value : -1); +#endif +#ifdef RLIMIT_LOCKS + pa_strbuf_printf(s, "rlimit-locks = %li\n", c->rlimit_locks.is_set ? (long int) c->rlimit_locks.value : -1); +#endif +#ifdef RLIMIT_SIGPENDING + pa_strbuf_printf(s, "rlimit-sigpending = %li\n", c->rlimit_sigpending.is_set ? (long int) c->rlimit_sigpending.value : -1); +#endif +#ifdef RLIMIT_MSGQUEUE + pa_strbuf_printf(s, "rlimit-msgqueue = %li\n", c->rlimit_msgqueue.is_set ? (long int) c->rlimit_msgqueue.value : -1); +#endif +#ifdef RLIMIT_NICE + pa_strbuf_printf(s, "rlimit-nice = %li\n", c->rlimit_nice.is_set ? (long int) c->rlimit_nice.value : -1); +#endif +#ifdef RLIMIT_RTPRIO + pa_strbuf_printf(s, "rlimit-rtprio = %li\n", c->rlimit_rtprio.is_set ? (long int) c->rlimit_rtprio.value : -1); +#endif +#ifdef RLIMIT_RTTIME + pa_strbuf_printf(s, "rlimit-rttime = %li\n", c->rlimit_rttime.is_set ? (long int) c->rlimit_rttime.value : -1); +#endif +#endif + + return pa_strbuf_tostring_free(s); +} diff --git a/src/daemon/daemon-conf.h b/src/daemon/daemon-conf.h new file mode 100644 index 0000000..dd69e04 --- /dev/null +++ b/src/daemon/daemon-conf.h @@ -0,0 +1,159 @@ +#ifndef foodaemonconfhfoo +#define foodaemonconfhfoo + +/*** + This file is part of PulseAudio. + + Copyright 2004-2006 Lennart Poettering + Copyright 2006 Pierre Ossman for Cendio AB + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#include +#include + +#include +#include +#include + +#ifdef HAVE_SYS_RESOURCE_H +#include +#endif + +/* The actual command to execute */ +typedef enum pa_daemon_conf_cmd { + PA_CMD_DAEMON, /* the default */ + PA_CMD_START, + PA_CMD_HELP, + PA_CMD_VERSION, + PA_CMD_DUMP_CONF, + PA_CMD_DUMP_MODULES, + PA_CMD_KILL, + PA_CMD_CHECK, + PA_CMD_DUMP_RESAMPLE_METHODS, + PA_CMD_CLEANUP_SHM +} pa_daemon_conf_cmd_t; + +#ifdef HAVE_SYS_RESOURCE_H +typedef struct pa_rlimit { + rlim_t value; + pa_bool_t is_set; +} pa_rlimit; +#endif + +/* A structure containing configuration data for the PulseAudio server . */ +typedef struct pa_daemon_conf { + pa_daemon_conf_cmd_t cmd; + pa_bool_t daemonize, + fail, + high_priority, + realtime_scheduling, + disallow_module_loading, + use_pid_file, + system_instance, + no_cpu_limit, + disable_shm, + disable_remixing, + disable_lfe_remixing, + load_default_script_file, + disallow_exit, + log_meta, + log_time, + flat_volumes, + lock_memory; + int exit_idle_time, + scache_idle_time, + auto_log_target, + realtime_priority, + nice_level, + resample_method; + char *script_commands, *dl_search_path, *default_script_file; + pa_log_target_t log_target; + pa_log_level_t log_level; + unsigned log_backtrace; + char *config_file; + +#ifdef HAVE_SYS_RESOURCE_H + pa_rlimit rlimit_fsize, rlimit_data, rlimit_stack, rlimit_core; +#ifdef RLIMIT_RSS + pa_rlimit rlimit_rss; +#endif +#ifdef RLIMIT_NOFILE + pa_rlimit rlimit_nofile; +#endif +#ifdef RLIMIT_AS + pa_rlimit rlimit_as; +#endif +#ifdef RLIMIT_NPROC + pa_rlimit rlimit_nproc; +#endif +#ifdef RLIMIT_MEMLOCK + pa_rlimit rlimit_memlock; +#endif +#ifdef RLIMIT_LOCKS + pa_rlimit rlimit_locks; +#endif +#ifdef RLIMIT_SIGPENDING + pa_rlimit rlimit_sigpending; +#endif +#ifdef RLIMIT_MSGQUEUE + pa_rlimit rlimit_msgqueue; +#endif +#ifdef RLIMIT_NICE + pa_rlimit rlimit_nice; +#endif +#ifdef RLIMIT_RTPRIO + pa_rlimit rlimit_rtprio; +#endif +#ifdef RLIMIT_RTTIME + pa_rlimit rlimit_rttime; +#endif +#endif + + unsigned default_n_fragments, default_fragment_size_msec; + pa_sample_spec default_sample_spec; + pa_channel_map default_channel_map; + size_t shm_size; +} pa_daemon_conf; + +/* Allocate a new structure and fill it with sane defaults */ +pa_daemon_conf* pa_daemon_conf_new(void); +void pa_daemon_conf_free(pa_daemon_conf*c); + +/* Load configuration data from the specified file overwriting the + * current settings in *c. If filename is NULL load the default daemon + * configuration file */ +int pa_daemon_conf_load(pa_daemon_conf *c, const char *filename); + +/* Pretty print the current configuration data of the daemon. The + * returned string has to be freed manually. The output of this + * function may be parsed with pa_daemon_conf_load(). */ +char *pa_daemon_conf_dump(pa_daemon_conf *c); + +/* Load the configuration data from the process' environment + * overwriting the current settings in *c. */ +int pa_daemon_conf_env(pa_daemon_conf *c); + +/* Set these configuration variables in the structure by passing a string */ +int pa_daemon_conf_set_log_target(pa_daemon_conf *c, const char *string); +int pa_daemon_conf_set_log_level(pa_daemon_conf *c, const char *string); +int pa_daemon_conf_set_resample_method(pa_daemon_conf *c, const char *string); + +const char *pa_daemon_conf_get_default_script_file(pa_daemon_conf *c); +FILE *pa_daemon_conf_open_default_script_file(pa_daemon_conf *c); + +#endif diff --git a/src/daemon/daemon.conf.in b/src/daemon/daemon.conf.in new file mode 100644 index 0000000..d4ffe49 --- /dev/null +++ b/src/daemon/daemon.conf.in @@ -0,0 +1,81 @@ +# This file is part of PulseAudio. +# +# PulseAudio is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA. + +## Configuration file for the PulseAudio daemon. See pulse-daemon.conf(5) for +## more information. Default values a commented out. Use either ; or # for +## commenting. + +; daemonize = no +; fail = yes +; allow-module-loading = yes +; allow-exit = yes +; use-pid-file = yes +; system-instance = no +; enable-shm = yes +; shm-size-bytes = 0 # setting this 0 will use the system-default, usually 64 MiB +; lock-memory = no +; cpu-limit = no + +; high-priority = yes +; nice-level = -11 + +realtime-scheduling = yes +realtime-priority = 5 + +; exit-idle-time = 20 +; scache-idle-time = 20 + +; dl-search-path = (depends on architecture) + +; load-default-script-file = yes +; default-script-file = @PA_DEFAULT_CONFIG_FILE@ + +log-target = dlog-color +; log-level = notice +; log-meta = no +; log-time = no +; log-backtrace = 0 + +resample-method = ffmpeg +; enable-remixing = yes +; enable-lfe-remixing = no + +; flat-volumes = yes + +; rlimit-fsize = -1 +; rlimit-data = -1 +; rlimit-stack = -1 +; rlimit-core = -1 +; rlimit-as = -1 +; rlimit-rss = -1 +; rlimit-nproc = -1 +; rlimit-nofile = 256 +; rlimit-memlock = -1 +; rlimit-locks = -1 +; rlimit-sigpending = -1 +; rlimit-msgqueue = -1 +; rlimit-nice = 31 +; rlimit-rtprio = 9 +; rlimit-rttime = 1000000 + +; default-sample-format = s16le +; default-sample-rate = 44100 +; default-sample-channels = 2 +; default-channel-map = front-left,front-right + +; default-fragments = 4 +; default-fragment-size-msec = 25 diff --git a/src/daemon/default.pa.in b/src/daemon/default.pa.in new file mode 100755 index 0000000..35bd48a --- /dev/null +++ b/src/daemon/default.pa.in @@ -0,0 +1,137 @@ +#!@PA_BINARY@ -nF +# +# This file is part of PulseAudio. +# +# PulseAudio is free software; you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, write to the Free Software Foundation, +# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +# This startup script is used only if PulseAudio is started per-user +# (i.e. not in system mode) + +.nofail + +### Load something into the sample cache +#load-sample-lazy x11-bell /usr/share/sounds/gtk-events/activate.wav +#load-sample-lazy pulse-hotplug /usr/share/sounds/startup3.wav +#load-sample-lazy pulse-coldplug /usr/share/sounds/startup3.wav +#load-sample-lazy pulse-access /usr/share/sounds/generic.wav + +.fail + +### Automatically restore the volume of streams and devices +load-module module-device-restore +load-module module-stream-restore +load-module module-card-restore + +### Automatically augment property information from .desktop files +### stored in /usr/share/application +load-module module-augment-properties + +### Load audio drivers statically (it's probably better to not load +### these drivers manually, but instead use module-hal-detect -- +### see below -- for doing this automatically) +#load-module module-alsa-sink +#load-module module-alsa-source device=hw:1,0 +#load-module module-oss device="/dev/dsp" sink_name=output source_name=input +#load-module module-oss-mmap device="/dev/dsp" sink_name=output source_name=input +#load-module module-null-sink +#load-module module-pipe-sink + +### Automatically load driver modules depending on the hardware available +.ifexists module-udev-detect@PA_SOEXT@ +#load-module module-udev-detect +.else +### Alternatively use the static hardware detection module (for systems that +### lack udev support) +#load-module module-detect +.endif + +### Automatically load driver modules for Bluetooth hardware +.ifexists module-bluetooth-discover@PA_SOEXT@ +load-module module-bluetooth-discover +.endif + +### Load several protocols +.ifexists module-esound-protocol-unix@PA_SOEXT@ +load-module module-esound-protocol-unix +.endif +load-module module-native-protocol-unix + +### Network access (may be configured with paprefs, so leave this commented +### here if you plan to use paprefs) +#load-module module-esound-protocol-tcp +#load-module module-native-protocol-tcp +#load-module module-zeroconf-publish + +### Load the RTP reciever module (also configured via paprefs, see above) +#load-module module-rtp-recv + +### Load the RTP sender module (also configured via paprefs, see above) +#load-module module-null-sink sink_name=rtp format=s16be channels=2 rate=44100 description="RTP Multicast Sink" +#load-module module-rtp-send source=rtp.monitor + +### Load additional modules from GConf settings. This can be configured with the paprefs tool. +### Please keep in mind that the modules configured by paprefs might conflict with manually +### loaded modules. +.ifexists module-gconf@PA_SOEXT@ +.nofail +load-module module-gconf +.fail +.endif + +### Automatically restore the default sink/source when changed by the user during runtime +load-module module-default-device-restore + +### Automatically move streams to the default sink if the sink they are +### connected to dies, similar for sources +load-module module-rescue-streams + +### Make sure we always have a sink around, even if it is a null sink. +load-module module-always-sink + +### Honour intended role device property +load-module module-intended-roles + +### Automatically suspend sinks/sources that become idle for too long +load-module module-suspend-on-idle + +### If autoexit on idle is enabled we want to make sure we only quit +### when no local session needs us anymore. +load-module module-console-kit + +### Enable positioned event sounds +load-module module-position-event-sounds + +### Cork music streams when a phone stream is active +load-module module-cork-music-on-phone + +# X11 modules should not be started from default.pa so that one daemon +# can be shared by multiple sessions. + +### Load X11 bell module +#load-module module-x11-bell sample=bell-windowing-system + +### Register ourselves in the X11 session manager +#load-module module-x11-xsmp + +### Publish connection data in the X11 root window +#.ifexists module-x11-publish@PA_SOEXT@ +#.nofail +#load-module module-x11-publish +#.fail +#.endif + +### Make some devices default +#set-default-sink output +#set-default-source input diff --git a/src/daemon/default.pa.win32 b/src/daemon/default.pa.win32 new file mode 100644 index 0000000..d5a1e18 --- /dev/null +++ b/src/daemon/default.pa.win32 @@ -0,0 +1,43 @@ +# +# This file is part of PulseAudio. +# +# PulseAudio is free software; you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, write to the Free Software Foundation, +# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + + +# Load audio drivers statically + +load-module module-waveout sink_name=output source_name=input +load-module module-null-sink + +# Load audio drivers automatically on access + +#add-autoload-sink output module-waveout sink_name=output source_name=input +#add-autoload-source input module-waveout sink_name=output source_name=input + +# Load several protocols +#load-module module-esound-protocol-tcp +#load-module module-native-protocol-tcp +#load-module module-simple-protocol-tcp +#load-module module-cli-protocol-tcp + +# Make some devices default +set-default-sink output +set-default-source input + +.nofail + +# Load something to the sample cache +load-sample x11-bell %WINDIR%\Media\ding.wav +load-sample-dir-lazy %WINDIR%\Media\*.wav diff --git a/src/daemon/dumpmodules.c b/src/daemon/dumpmodules.c new file mode 100644 index 0000000..92470b4 --- /dev/null +++ b/src/daemon/dumpmodules.c @@ -0,0 +1,159 @@ +/*** + This file is part of PulseAudio. + + Copyright 2004-2006 Lennart Poettering + Copyright 2006 Pierre Ossman for Cendio AB + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include + +#include +#include + +#include +#include +#include + +#include "dumpmodules.h" + +#define PREFIX "module-" + +static void short_info(const char *name, const char *path, pa_modinfo *i) { + pa_assert(name); + pa_assert(i); + + printf("%-40s%s\n", name, i->description ? i->description : "n/a"); +} + +static void long_info(const char *name, const char *path, pa_modinfo *i) { + static int nl = 0; + pa_assert(name); + pa_assert(i); + + if (nl) + printf("\n"); + + nl = 1; + + printf(_("Name: %s\n"), name); + + if (!i->description && !i->version && !i->author && !i->usage) + printf(_("No module information available\n")); + else { + if (i->version) + printf(_("Version: %s\n"), i->version); + if (i->description) + printf(_("Description: %s\n"), i->description); + if (i->author) + printf(_("Author: %s\n"), i->author); + if (i->usage) + printf(_("Usage: %s\n"), i->usage); + printf(_("Load Once: %s\n"), pa_yes_no(i->load_once)); + if (i->deprecated) + printf(_("DEPRECATION WARNING: %s\n"), i->deprecated); + } + + if (path) + printf(_("Path: %s\n"), path); +} + +static void show_info(const char *name, const char *path, void (*info)(const char *name, const char *path, pa_modinfo*i)) { + pa_modinfo *i; + + pa_assert(name); + + if ((i = pa_modinfo_get_by_name(path ? path : name))) { + info(name, path, i); + pa_modinfo_free(i); + } +} + +extern const lt_dlsymlist lt_preloaded_symbols[]; + +static int is_preloaded(const char *name) { + const lt_dlsymlist *l; + + for (l = lt_preloaded_symbols; l->name; l++) { + char buf[64], *e; + + if (l->address) + continue; + + pa_snprintf(buf, sizeof(buf), "%s", l->name); + if ((e = strrchr(buf, '.'))) + *e = 0; + + if (!strcmp(name, buf)) + return 1; + } + + return 0; +} + +static int callback(const char *path, lt_ptr data) { + const char *e; + pa_daemon_conf *c = (data); + + e = pa_path_get_filename(path); + + if (strlen(e) <= sizeof(PREFIX)-1 || strncmp(e, PREFIX, sizeof(PREFIX)-1)) + return 0; + + if (is_preloaded(e)) + return 0; + + show_info(e, path, c->log_level >= PA_LOG_INFO ? long_info : short_info); + return 0; +} + +void pa_dump_modules(pa_daemon_conf *c, int argc, char * const argv[]) { + pa_assert(c); + + if (argc > 0) { + int i; + for (i = 0; i < argc; i++) + show_info(argv[i], NULL, long_info); + } else { + const lt_dlsymlist *l; + + for (l = lt_preloaded_symbols; l->name; l++) { + char buf[64], *e; + + if (l->address) + continue; + + if (strlen(l->name) <= sizeof(PREFIX)-1 || strncmp(l->name, PREFIX, sizeof(PREFIX)-1)) + continue; + + pa_snprintf(buf, sizeof(buf), "%s", l->name); + if ((e = strrchr(buf, '.'))) + *e = 0; + + show_info(buf, NULL, c->log_level >= PA_LOG_INFO ? long_info : short_info); + } + + lt_dlforeachfile(NULL, callback, c); + } +} diff --git a/src/daemon/dumpmodules.h b/src/daemon/dumpmodules.h new file mode 100644 index 0000000..c3595e5 --- /dev/null +++ b/src/daemon/dumpmodules.h @@ -0,0 +1,31 @@ +#ifndef foodumpmoduleshfoo +#define foodumpmoduleshfoo + +/*** + This file is part of PulseAudio. + + Copyright 2004-2006 Lennart Poettering + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#include "daemon-conf.h" + +/* Dump all available modules to STDOUT. If argc > 0 print information + * about the modules specified in argv[] instead. */ +void pa_dump_modules(pa_daemon_conf *c, int argc, char * const argv[]); + +#endif diff --git a/src/daemon/esdcompat.in b/src/daemon/esdcompat.in new file mode 100755 index 0000000..6650180 --- /dev/null +++ b/src/daemon/esdcompat.in @@ -0,0 +1,96 @@ +#!/bin/sh + +# This file is part of PulseAudio. +# +# PulseAudio is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA. + +VERSION_STRING="@PACKAGE_NAME@ esd wrapper @PACKAGE_VERSION@" + +fail() { + echo "ERROR: $1" + exit 1 +} + +ARGS=" --log-target=syslog" + +while [ "$#" -gt "0" ]; do + + case "$1" in + "") + ;; + + -v|--version) + echo "$VERSION_STRING" + exit 0 + ;; + + -h|--help) + cat < for Cendio AB + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#ifdef HAVE_DLFCN_H +#include +#endif + +#ifdef HAVE_SYS_DL_H +#include +#endif + +#include + +#include + +#include + +#include +#include + +#include "ltdl-bind-now.h" + +#ifdef RTLD_NOW +#define PA_BIND_NOW RTLD_NOW +#elif defined(DL_NOW) +#define PA_BIND_NOW DL_NOW +#else +#undef PA_BIND_NOW +#endif + +#ifdef PA_BIND_NOW + +/* + To avoid lazy relocations during runtime in our RT threads we add + our own shared object loader with uses RTLD_NOW if it is + available. The standard ltdl loader prefers RTLD_LAZY. + + Please note that this loader doesn't have any influence on + relocations on any libraries that are already loaded into our + process, i.e. because the pulseaudio binary links directly to + them. To disable lazy relocations for those libraries it is possible + to set $LT_BIND_NOW before starting the pulsaudio binary. +*/ + +static lt_module bind_now_open(lt_user_data d, const char *fname, lt_dladvise advise) { + lt_module m; + + pa_assert(fname); + + if (!(m = dlopen(fname, PA_BIND_NOW))) { + lt_dlseterror(LT_ERROR_CANNOT_OPEN); + return NULL; + } + + return m; +} + +static int bind_now_close(lt_user_data d, lt_module m) { + + pa_assert(m); + + if (dlclose(m) != 0){ + lt_dlseterror(LT_ERROR_CANNOT_CLOSE); + return 1; + } + + return 0; +} + +static lt_ptr bind_now_find_sym(lt_user_data d, lt_module m, const char *symbol) { + lt_ptr ptr; + + pa_assert(m); + pa_assert(symbol); + + if (!(ptr = dlsym(m, symbol))) { + lt_dlseterror(LT_ERROR_SYMBOL_NOT_FOUND); + return NULL; + } + + return ptr; +} + +static lt_dlvtable *bindnow_loader = NULL; +#endif + +void pa_ltdl_init(void) { + +#ifdef PA_BIND_NOW + const lt_dlvtable *dlopen_loader; +#endif + + pa_assert_se(lt_dlinit() == 0); + +#ifdef PA_BIND_NOW + /* Already initialised */ + if (bindnow_loader) + return; + + if (!(dlopen_loader = lt_dlloader_find((char*) "lt_dlopen"))) { + pa_log_warn(_("Failed to find original lt_dlopen loader.")); + return; + } + + if (!(bindnow_loader = malloc(sizeof(lt_dlvtable)))) { + pa_log_error(_("Failed to allocate new dl loader.")); + return; + } + + memcpy(bindnow_loader, dlopen_loader, sizeof(*bindnow_loader)); + bindnow_loader->name = "bind-now-loader"; + bindnow_loader->module_open = bind_now_open; + bindnow_loader->module_close = bind_now_close; + bindnow_loader->find_sym = bind_now_find_sym; + bindnow_loader->priority = LT_DLLOADER_PREPEND; + + /* Add our BIND_NOW loader as the default module loader. */ + if (lt_dlloader_add(bindnow_loader) != 0) { + pa_log_warn(_("Failed to add bind-now-loader.")); + free(bindnow_loader); + bindnow_loader = NULL; + } +#endif +} + +void pa_ltdl_done(void) { + pa_assert_se(lt_dlexit() == 0); + +#ifdef PA_BIND_NOW + /* lt_dlexit() will free our loader vtable, hence reset our + * pointer to it here */ + bindnow_loader = NULL; +#endif +} diff --git a/src/daemon/ltdl-bind-now.h b/src/daemon/ltdl-bind-now.h new file mode 100644 index 0000000..0760070 --- /dev/null +++ b/src/daemon/ltdl-bind-now.h @@ -0,0 +1,30 @@ +#ifndef foopulsecoreltdlbindnowhfoo +#define foopulsecoreltdlbindnowhfoo + +/*** + This file is part of PulseAudio. + + Copyright 2004-2006 Lennart Poettering + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + + +void pa_ltdl_init(void); +void pa_ltdl_done(void); + +#endif + diff --git a/src/daemon/main.c b/src/daemon/main.c new file mode 100644 index 0000000..1d28737 --- /dev/null +++ b/src/daemon/main.c @@ -0,0 +1,1034 @@ +/*** + This file is part of PulseAudio. + + Copyright 2004-2006 Lennart Poettering + Copyright 2006 Pierre Ossman for Cendio AB + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef HAVE_SYS_MMAN_H +#include +#endif + +#ifdef HAVE_SYS_IOCTL_H +#include +#endif + +#ifdef HAVE_PWD_H +#include +#endif +#ifdef HAVE_GRP_H +#include +#endif + +#ifdef HAVE_LIBWRAP +#include +#include +#endif + +#ifdef HAVE_DBUS +#include +#endif + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef HAVE_DBUS +#include +#endif +#include +#include + +#include "cmdline.h" +#include "cpulimit.h" +#include "daemon-conf.h" +#include "dumpmodules.h" +#include "caps.h" +#include "ltdl-bind-now.h" + +#ifdef HAVE_LIBWRAP +/* Only one instance of these variables */ +int allow_severity = LOG_INFO; +int deny_severity = LOG_WARNING; +#endif + +#ifdef HAVE_OSS_WRAPPER +/* padsp looks for this symbol in the running process and disables + * itself if it finds it and it is set to 7 (which is actually a bit + * mask). For details see padsp. */ +int __padsp_disabled__ = 7; +#endif + +#ifdef OS_IS_WIN32 + +static void message_cb(pa_mainloop_api*a, pa_time_event*e, const struct timeval *tv, void *userdata) { + MSG msg; + struct timeval tvnext; + + while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { + if (msg.message == WM_QUIT) + raise(SIGTERM); + else { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + } + + pa_timeval_add(pa_gettimeofday(&tvnext), 100000); + a->rtclock_time_restart(e, &tvnext); +} + +#endif + +static void signal_callback(pa_mainloop_api*m, pa_signal_event *e, int sig, void *userdata) { + pa_log_info(_("Got signal %s."), pa_sig2str(sig)); + + switch (sig) { +#ifdef SIGUSR1 + case SIGUSR1: + pa_module_load(userdata, "module-cli", NULL); + break; +#endif + +#ifdef SIGUSR2 + case SIGUSR2: + pa_module_load(userdata, "module-cli-protocol-unix", NULL); + break; +#endif + +#ifdef SIGHUP + case SIGHUP: { + char *c = pa_full_status_string(userdata); + pa_log_notice("%s", c); + pa_xfree(c); + return; + } +#endif + + case SIGINT: + case SIGTERM: + default: + pa_log_info(_("Exiting.")); + m->quit(m, 1); + break; + } +} + +#if defined(HAVE_PWD_H) && defined(HAVE_GRP_H) + +static int change_user(void) { + struct passwd *pw; + struct group * gr; + int r; + + /* This function is called only in system-wide mode. It creates a + * runtime dir in /var/run/ with proper UID/GID and drops privs + * afterwards. */ + + if (!(pw = getpwnam(PA_SYSTEM_USER))) { + pa_log(_("Failed to find user '%s'."), PA_SYSTEM_USER); + return -1; + } + + if (!(gr = getgrnam(PA_SYSTEM_GROUP))) { + pa_log(_("Failed to find group '%s'."), PA_SYSTEM_GROUP); + return -1; + } + + pa_log_info(_("Found user '%s' (UID %lu) and group '%s' (GID %lu)."), + PA_SYSTEM_USER, (unsigned long) pw->pw_uid, + PA_SYSTEM_GROUP, (unsigned long) gr->gr_gid); + + if (pw->pw_gid != gr->gr_gid) { + pa_log(_("GID of user '%s' and of group '%s' don't match."), PA_SYSTEM_USER, PA_SYSTEM_GROUP); + return -1; + } + + if (strcmp(pw->pw_dir, PA_SYSTEM_RUNTIME_PATH) != 0) + pa_log_warn(_("Home directory of user '%s' is not '%s', ignoring."), PA_SYSTEM_USER, PA_SYSTEM_RUNTIME_PATH); + + if (pa_make_secure_dir(PA_SYSTEM_RUNTIME_PATH, 0755, pw->pw_uid, gr->gr_gid) < 0) { + pa_log(_("Failed to create '%s': %s"), PA_SYSTEM_RUNTIME_PATH, pa_cstrerror(errno)); + return -1; + } + + if (pa_make_secure_dir(PA_SYSTEM_STATE_PATH, 0700, pw->pw_uid, gr->gr_gid) < 0) { + pa_log(_("Failed to create '%s': %s"), PA_SYSTEM_STATE_PATH, pa_cstrerror(errno)); + return -1; + } + + /* We don't create the config dir here, because we don't need to write to it */ + + if (initgroups(PA_SYSTEM_USER, gr->gr_gid) != 0) { + pa_log(_("Failed to change group list: %s"), pa_cstrerror(errno)); + return -1; + } + +#if defined(HAVE_SETRESGID) + r = setresgid(gr->gr_gid, gr->gr_gid, gr->gr_gid); +#elif defined(HAVE_SETEGID) + if ((r = setgid(gr->gr_gid)) >= 0) + r = setegid(gr->gr_gid); +#elif defined(HAVE_SETREGID) + r = setregid(gr->gr_gid, gr->gr_gid); +#else +#error "No API to drop privileges" +#endif + + if (r < 0) { + pa_log(_("Failed to change GID: %s"), pa_cstrerror(errno)); + return -1; + } + +#if defined(HAVE_SETRESUID) + r = setresuid(pw->pw_uid, pw->pw_uid, pw->pw_uid); +#elif defined(HAVE_SETEUID) + if ((r = setuid(pw->pw_uid)) >= 0) + r = seteuid(pw->pw_uid); +#elif defined(HAVE_SETREUID) + r = setreuid(pw->pw_uid, pw->pw_uid); +#else +#error "No API to drop privileges" +#endif + + if (r < 0) { + pa_log(_("Failed to change UID: %s"), pa_cstrerror(errno)); + return -1; + } + + pa_set_env("USER", PA_SYSTEM_USER); + pa_set_env("USERNAME", PA_SYSTEM_USER); + pa_set_env("LOGNAME", PA_SYSTEM_USER); + pa_set_env("HOME", PA_SYSTEM_RUNTIME_PATH); + + /* Relevant for pa_runtime_path() */ + if (!getenv("PULSE_RUNTIME_PATH")) + pa_set_env("PULSE_RUNTIME_PATH", PA_SYSTEM_RUNTIME_PATH); + + if (!getenv("PULSE_CONFIG_PATH")) + pa_set_env("PULSE_CONFIG_PATH", PA_SYSTEM_CONFIG_PATH); + + if (!getenv("PULSE_STATE_PATH")) + pa_set_env("PULSE_STATE_PATH", PA_SYSTEM_STATE_PATH); + + pa_log_info(_("Successfully dropped root privileges.")); + + return 0; +} + +#else /* HAVE_PWD_H && HAVE_GRP_H */ + +static int change_user(void) { + pa_log(_("System wide mode unsupported on this platform.")); + return -1; +} + +#endif /* HAVE_PWD_H && HAVE_GRP_H */ + +#ifdef HAVE_SYS_RESOURCE_H + +static int set_one_rlimit(const pa_rlimit *r, int resource, const char *name) { + struct rlimit rl; + pa_assert(r); + + if (!r->is_set) + return 0; + + rl.rlim_cur = rl.rlim_max = r->value; + + if (setrlimit(resource, &rl) < 0) { + pa_log_info(_("setrlimit(%s, (%u, %u)) failed: %s"), name, (unsigned) r->value, (unsigned) r->value, pa_cstrerror(errno)); + return -1; + } + + return 0; +} + +static void set_all_rlimits(const pa_daemon_conf *conf) { + set_one_rlimit(&conf->rlimit_fsize, RLIMIT_FSIZE, "RLIMIT_FSIZE"); + set_one_rlimit(&conf->rlimit_data, RLIMIT_DATA, "RLIMIT_DATA"); + set_one_rlimit(&conf->rlimit_stack, RLIMIT_STACK, "RLIMIT_STACK"); + set_one_rlimit(&conf->rlimit_core, RLIMIT_CORE, "RLIMIT_CORE"); +#ifdef RLIMIT_RSS + set_one_rlimit(&conf->rlimit_rss, RLIMIT_RSS, "RLIMIT_RSS"); +#endif +#ifdef RLIMIT_NPROC + set_one_rlimit(&conf->rlimit_nproc, RLIMIT_NPROC, "RLIMIT_NPROC"); +#endif +#ifdef RLIMIT_NOFILE + set_one_rlimit(&conf->rlimit_nofile, RLIMIT_NOFILE, "RLIMIT_NOFILE"); +#endif +#ifdef RLIMIT_MEMLOCK + set_one_rlimit(&conf->rlimit_memlock, RLIMIT_MEMLOCK, "RLIMIT_MEMLOCK"); +#endif +#ifdef RLIMIT_AS + set_one_rlimit(&conf->rlimit_as, RLIMIT_AS, "RLIMIT_AS"); +#endif +#ifdef RLIMIT_LOCKS + set_one_rlimit(&conf->rlimit_locks, RLIMIT_LOCKS, "RLIMIT_LOCKS"); +#endif +#ifdef RLIMIT_SIGPENDING + set_one_rlimit(&conf->rlimit_sigpending, RLIMIT_SIGPENDING, "RLIMIT_SIGPENDING"); +#endif +#ifdef RLIMIT_MSGQUEUE + set_one_rlimit(&conf->rlimit_msgqueue, RLIMIT_MSGQUEUE, "RLIMIT_MSGQUEUE"); +#endif +#ifdef RLIMIT_NICE + set_one_rlimit(&conf->rlimit_nice, RLIMIT_NICE, "RLIMIT_NICE"); +#endif +#ifdef RLIMIT_RTPRIO + set_one_rlimit(&conf->rlimit_rtprio, RLIMIT_RTPRIO, "RLIMIT_RTPRIO"); +#endif +#ifdef RLIMIT_RTTIME + set_one_rlimit(&conf->rlimit_rttime, RLIMIT_RTTIME, "RLIMIT_RTTIME"); +#endif +} +#endif + +#ifdef HAVE_DBUS +static pa_dbus_connection *register_dbus(pa_core *c) { + DBusError error; + pa_dbus_connection *conn; + + dbus_error_init(&error); + + if (!(conn = pa_dbus_bus_get(c, pa_in_system_mode() ? DBUS_BUS_SYSTEM : DBUS_BUS_SESSION, &error)) || dbus_error_is_set(&error)) { + pa_log_warn("Unable to contact D-Bus: %s: %s", error.name, error.message); + goto fail; + } + + if (dbus_bus_request_name(pa_dbus_connection_get(conn), "org.pulseaudio.Server", DBUS_NAME_FLAG_DO_NOT_QUEUE, &error) == DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) { + pa_log_debug("Got org.pulseaudio.Server!"); + return conn; + } + + if (dbus_error_is_set(&error)) + pa_log_warn("Failed to acquire org.pulseaudio.Server: %s: %s", error.name, error.message); + else + pa_log_warn("D-Bus name org.pulseaudio.Server already taken. Weird shit!"); + + /* PA cannot be started twice by the same user and hence we can + * ignore mostly the case that org.pulseaudio.Server is already + * taken. */ + +fail: + + if (conn) + pa_dbus_connection_unref(conn); + + dbus_error_free(&error); + return NULL; +} +#endif + +int main(int argc, char *argv[]) { + pa_core *c = NULL; + pa_strbuf *buf = NULL; + pa_daemon_conf *conf = NULL; + pa_mainloop *mainloop = NULL; + char *s; + int r = 0, retval = 1, d = 0; + pa_bool_t valid_pid_file = FALSE; + pa_bool_t ltdl_init = FALSE; + int passed_fd = -1; + const char *e; +#ifdef HAVE_FORK + int daemon_pipe[2] = { -1, -1 }; +#endif +#ifdef OS_IS_WIN32 + pa_time_event *win32_timer; + struct timeval win32_tv; +#endif + int autospawn_fd = -1; + pa_bool_t autospawn_locked = FALSE; +#ifdef HAVE_DBUS + pa_dbus_connection *dbus = NULL; +#endif + + pa_log_set_ident("pulseaudio"); + pa_log_set_level(PA_LOG_NOTICE); + pa_log_set_flags(PA_LOG_COLORS|PA_LOG_PRINT_FILE|PA_LOG_PRINT_LEVEL, PA_LOG_RESET); + +#if defined(__linux__) && defined(__OPTIMIZE__) + /* + Disable lazy relocations to make usage of external libraries + more deterministic for our RT threads. We abuse __OPTIMIZE__ as + a check whether we are a debug build or not. This all is + admittedly a bit snake-oilish. + */ + + if (!getenv("LD_BIND_NOW")) { + char *rp; + char *canonical_rp; + + /* We have to execute ourselves, because the libc caches the + * value of $LD_BIND_NOW on initialization. */ + + pa_set_env("LD_BIND_NOW", "1"); + + if ((canonical_rp = pa_realpath(PA_BINARY))) { + + if ((rp = pa_readlink("/proc/self/exe"))) { + + if (pa_streq(rp, canonical_rp)) + pa_assert_se(execv(rp, argv) == 0); + else + pa_log_warn("/proc/self/exe does not point to %s, cannot self execute. Are you playing games?", canonical_rp); + + pa_xfree(rp); + + } else + pa_log_warn("Couldn't read /proc/self/exe, cannot self execute. Running in a chroot()?"); + + pa_xfree(canonical_rp); + + } else + pa_log_warn("Couldn't canonicalize binary path, cannot self execute."); + } +#endif + + if ((e = getenv("PULSE_PASSED_FD"))) { + passed_fd = atoi(e); + + if (passed_fd <= 2) + passed_fd = -1; + } + + /* We might be autospawned, in which case have no idea in which + * context we have been started. Let's cleanup our execution + * context as good as possible */ + + pa_reset_personality(); + pa_drop_root(); + pa_close_all(passed_fd, -1); + pa_unblock_sigs(-1); + pa_reset_priority(); + + setlocale(LC_ALL, ""); + pa_init_i18n(); + + conf = pa_daemon_conf_new(); + + if (pa_daemon_conf_load(conf, NULL) < 0) + goto finish; + + if (pa_daemon_conf_env(conf) < 0) + goto finish; + + if (pa_cmdline_parse(conf, argc, argv, &d) < 0) { + pa_log(_("Failed to parse command line.")); + goto finish; + } + + pa_log_set_level(conf->log_level); + pa_log_set_target(conf->auto_log_target ? PA_LOG_STDERR : conf->log_target); + if (conf->log_meta) + pa_log_set_flags(PA_LOG_PRINT_META, PA_LOG_SET); + if (conf->log_time) + pa_log_set_flags(PA_LOG_PRINT_TIME, PA_LOG_SET); + pa_log_set_show_backtrace(conf->log_backtrace); + + LTDL_SET_PRELOADED_SYMBOLS(); + pa_ltdl_init(); + ltdl_init = TRUE; + + if (conf->dl_search_path) + lt_dlsetsearchpath(conf->dl_search_path); + +#ifdef OS_IS_WIN32 + { + WSADATA data; + WSAStartup(MAKEWORD(2, 0), &data); + } +#endif + + pa_random_seed(); + + switch (conf->cmd) { + case PA_CMD_DUMP_MODULES: + pa_dump_modules(conf, argc-d, argv+d); + retval = 0; + goto finish; + + case PA_CMD_DUMP_CONF: { + + if (d < argc) { + pa_log("Too many arguments.\n"); + goto finish; + } + + s = pa_daemon_conf_dump(conf); + fputs(s, stdout); + pa_xfree(s); + retval = 0; + goto finish; + } + + case PA_CMD_DUMP_RESAMPLE_METHODS: { + int i; + + if (d < argc) { + pa_log("Too many arguments.\n"); + goto finish; + } + + for (i = 0; i < PA_RESAMPLER_MAX; i++) + if (pa_resample_method_supported(i)) + printf("%s\n", pa_resample_method_to_string(i)); + + retval = 0; + goto finish; + } + + case PA_CMD_HELP : + pa_cmdline_help(argv[0]); + retval = 0; + goto finish; + + case PA_CMD_VERSION : + + if (d < argc) { + pa_log("Too many arguments.\n"); + goto finish; + } + + printf(PACKAGE_NAME" "PACKAGE_VERSION"\n"); + retval = 0; + goto finish; + + case PA_CMD_CHECK: { + pid_t pid; + + if (d < argc) { + pa_log("Too many arguments.\n"); + goto finish; + } + + if (pa_pid_file_check_running(&pid, "pulseaudio") < 0) + pa_log_info(_("Daemon not running")); + else { + pa_log_info(_("Daemon running as PID %u"), pid); + retval = 0; + } + + goto finish; + + } + case PA_CMD_KILL: + + if (d < argc) { + pa_log("Too many arguments.\n"); + goto finish; + } + + if (pa_pid_file_kill(SIGINT, NULL, "pulseaudio") < 0) + pa_log(_("Failed to kill daemon: %s"), pa_cstrerror(errno)); + else + retval = 0; + + goto finish; + + case PA_CMD_CLEANUP_SHM: + + if (d < argc) { + pa_log("Too many arguments.\n"); + goto finish; + } + + if (pa_shm_cleanup() >= 0) + retval = 0; + + goto finish; + + default: + pa_assert(conf->cmd == PA_CMD_DAEMON || conf->cmd == PA_CMD_START); + } + + if (d < argc) { + pa_log("Too many arguments.\n"); + goto finish; + } + + if (getuid() == 0 && !conf->system_instance) + pa_log_warn(_("This program is not intended to be run as root (unless --system is specified).")); + else if (getuid() != 0 && conf->system_instance) { + pa_log(_("Root privileges required.")); + goto finish; + } + + if (conf->cmd == PA_CMD_START && conf->system_instance) { + pa_log(_("--start not supported for system instances.")); + goto finish; + } + + if (conf->system_instance && !conf->disallow_exit) + pa_log_warn(_("Running in system mode, but --disallow-exit not set!")); + + if (conf->system_instance && !conf->disallow_module_loading) + pa_log_warn(_("Running in system mode, but --disallow-module-loading not set!")); + + if (conf->system_instance && !conf->disable_shm) { + pa_log_notice(_("Running in system mode, forcibly disabling SHM mode!")); + conf->disable_shm = TRUE; + } + + if (conf->system_instance && conf->exit_idle_time >= 0) { + pa_log_notice(_("Running in system mode, forcibly disabling exit idle time!")); + conf->exit_idle_time = -1; + } + + if (conf->cmd == PA_CMD_START) { + /* If we shall start PA only when it is not running yet, we + * first take the autospawn lock to make things + * synchronous. */ + + if ((autospawn_fd = pa_autospawn_lock_init()) < 0) { + pa_log("Failed to initialize autospawn lock"); + goto finish; + } + + if ((pa_autospawn_lock_acquire(TRUE) < 0)) { + pa_log("Failed to acquire autospawn lock"); + goto finish; + } + + autospawn_locked = TRUE; + } + + if (conf->daemonize) { + pid_t child; + int tty_fd; + + if (pa_stdio_acquire() < 0) { + pa_log(_("Failed to acquire stdio.")); + goto finish; + } + +#ifdef HAVE_FORK + if (pipe(daemon_pipe) < 0) { + pa_log(_("pipe failed: %s"), pa_cstrerror(errno)); + goto finish; + } + + if ((child = fork()) < 0) { + pa_log(_("fork() failed: %s"), pa_cstrerror(errno)); + goto finish; + } + + if (child != 0) { + ssize_t n; + /* Father */ + + pa_assert_se(pa_close(daemon_pipe[1]) == 0); + daemon_pipe[1] = -1; + + if ((n = pa_loop_read(daemon_pipe[0], &retval, sizeof(retval), NULL)) != sizeof(retval)) { + + if (n < 0) + pa_log(_("read() failed: %s"), pa_cstrerror(errno)); + + retval = 1; + } + + if (retval) + pa_log(_("Daemon startup failed.")); + else + pa_log_info(_("Daemon startup successful.")); + + goto finish; + } + + if (autospawn_fd >= 0) { + /* The lock file is unlocked from the parent, so we need + * to close it in the child */ + + pa_autospawn_lock_release(); + pa_autospawn_lock_done(TRUE); + + autospawn_locked = FALSE; + autospawn_fd = -1; + } + + pa_assert_se(pa_close(daemon_pipe[0]) == 0); + daemon_pipe[0] = -1; +#endif + + if (conf->auto_log_target) + pa_log_set_target(PA_LOG_SYSLOG); + +#ifdef HAVE_SETSID + setsid(); +#endif +#ifdef HAVE_SETPGID + setpgid(0,0); +#endif + +#ifndef OS_IS_WIN32 + pa_close(0); + pa_close(1); + pa_close(2); + + pa_assert_se(open("/dev/null", O_RDONLY) == 0); + pa_assert_se(open("/dev/null", O_WRONLY) == 1); + pa_assert_se(open("/dev/null", O_WRONLY) == 2); +#else + FreeConsole(); +#endif + +#ifdef SIGTTOU + signal(SIGTTOU, SIG_IGN); +#endif +#ifdef SIGTTIN + signal(SIGTTIN, SIG_IGN); +#endif +#ifdef SIGTSTP + signal(SIGTSTP, SIG_IGN); +#endif + +#ifdef TIOCNOTTY + if ((tty_fd = open("/dev/tty", O_RDWR)) >= 0) { + ioctl(tty_fd, TIOCNOTTY, (char*) 0); + pa_assert_se(pa_close(tty_fd) == 0); + } +#endif + } + + pa_set_env_and_record("PULSE_INTERNAL", "1"); + pa_assert_se(chdir("/") == 0); + umask(0022); + +#ifdef HAVE_SYS_RESOURCE_H + set_all_rlimits(conf); +#endif + pa_rtclock_hrtimer_enable(); + + pa_raise_priority(conf->nice_level); + + if (conf->system_instance) + if (change_user() < 0) + goto finish; + + pa_set_env_and_record("PULSE_SYSTEM", conf->system_instance ? "1" : "0"); + + pa_log_info(_("This is PulseAudio %s"), PACKAGE_VERSION); + pa_log_debug(_("Compilation host: %s"), CANONICAL_HOST); + pa_log_debug(_("Compilation CFLAGS: %s"), PA_CFLAGS); + + s = pa_uname_string(); + pa_log_debug(_("Running on host: %s"), s); + pa_xfree(s); + + pa_log_debug(_("Found %u CPUs."), pa_ncpus()); + + pa_log_info(_("Page size is %lu bytes"), (unsigned long) PA_PAGE_SIZE); + +#ifdef HAVE_VALGRIND_MEMCHECK_H + pa_log_debug(_("Compiled with Valgrind support: yes")); +#else + pa_log_debug(_("Compiled with Valgrind support: no")); +#endif + + pa_log_debug(_("Running in valgrind mode: %s"), pa_yes_no(pa_in_valgrind())); + + pa_log_debug(_("Running in VM: %s"), pa_yes_no(pa_running_in_vm())); + +#ifdef __OPTIMIZE__ + pa_log_debug(_("Optimized build: yes")); +#else + pa_log_debug(_("Optimized build: no")); +#endif + +#ifdef NDEBUG + pa_log_debug(_("NDEBUG defined, all asserts disabled.")); +#elif defined(FASTPATH) + pa_log_debug(_("FASTPATH defined, only fast path asserts disabled.")); +#else + pa_log_debug(_("All asserts enabled.")); +#endif + + if (!(s = pa_machine_id())) { + pa_log(_("Failed to get machine ID")); + goto finish; + } + pa_log_info(_("Machine ID is %s."), s); + pa_xfree(s); + + if ((s = pa_session_id())) { + pa_log_info(_("Session ID is %s."), s); + pa_xfree(s); + } + + if (!(s = pa_get_runtime_dir())) + goto finish; + pa_log_info(_("Using runtime directory %s."), s); + pa_xfree(s); + + if (!(s = pa_get_state_dir())) + goto finish; + pa_log_info(_("Using state directory %s."), s); + pa_xfree(s); + + pa_log_info(_("Using modules directory %s."), conf->dl_search_path); + + pa_log_info(_("Running in system mode: %s"), pa_yes_no(pa_in_system_mode())); + + if (pa_in_system_mode()) + pa_log_warn(_("OK, so you are running PA in system mode. Please note that you most likely shouldn't be doing that.\n" + "If you do it nonetheless then it's your own fault if things don't work as expected.\n" + "Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an explanation why system mode is usually a bad idea.")); + + if (conf->use_pid_file) { + int z; + + if ((z = pa_pid_file_create("pulseaudio")) != 0) { + + if (conf->cmd == PA_CMD_START && z > 0) { + /* If we are already running and with are run in + * --start mode, then let's return this as success. */ + + retval = 0; + goto finish; + } + + pa_log(_("pa_pid_file_create() failed.")); + goto finish; + } + + valid_pid_file = TRUE; + } + + pa_disable_sigpipe(); + + if (pa_rtclock_hrtimer()) + pa_log_info(_("Fresh high-resolution timers available! Bon appetit!")); + else + pa_log_info(_("Dude, your kernel stinks! The chef's recommendation today is Linux with high-resolution timers enabled!")); + + if (conf->lock_memory) { +#ifdef HAVE_SYS_MMAN_H + if (mlockall(MCL_FUTURE) < 0) + pa_log_warn("mlockall() failed: %s", pa_cstrerror(errno)); + else + pa_log_info("Sucessfully locked process into memory."); +#else + pa_log_warn("Memory locking requested but not supported on platform."); +#endif + } + + pa_memtrap_install(); + + if (!getenv("PULSE_NO_SIMD")) { + pa_cpu_init_x86(); + pa_cpu_init_arm(); + } + + pa_assert_se(mainloop = pa_mainloop_new()); + + if (!(c = pa_core_new(pa_mainloop_get_api(mainloop), !conf->disable_shm, conf->shm_size))) { + pa_log(_("pa_core_new() failed.")); + goto finish; + } + + c->default_sample_spec = conf->default_sample_spec; + c->default_channel_map = conf->default_channel_map; + c->default_n_fragments = conf->default_n_fragments; + c->default_fragment_size_msec = conf->default_fragment_size_msec; + c->exit_idle_time = conf->exit_idle_time; + c->scache_idle_time = conf->scache_idle_time; + c->resample_method = conf->resample_method; + c->realtime_priority = conf->realtime_priority; + c->realtime_scheduling = !!conf->realtime_scheduling; + c->disable_remixing = !!conf->disable_remixing; + c->disable_lfe_remixing = !!conf->disable_lfe_remixing; + c->running_as_daemon = !!conf->daemonize; + c->disallow_exit = conf->disallow_exit; + c->flat_volumes = conf->flat_volumes; + + pa_assert_se(pa_signal_init(pa_mainloop_get_api(mainloop)) == 0); + pa_signal_new(SIGINT, signal_callback, c); + pa_signal_new(SIGTERM, signal_callback, c); +#ifdef SIGUSR1 + pa_signal_new(SIGUSR1, signal_callback, c); +#endif +#ifdef SIGUSR2 + pa_signal_new(SIGUSR2, signal_callback, c); +#endif +#ifdef SIGHUP + pa_signal_new(SIGHUP, signal_callback, c); +#endif + +#ifdef OS_IS_WIN32 + win32_timer = pa_mainloop_get_api(mainloop)->rtclock_time_new(pa_mainloop_get_api(mainloop), pa_gettimeofday(&win32_tv), message_cb, NULL); +#endif + + if (!conf->no_cpu_limit) + pa_assert_se(pa_cpu_limit_init(pa_mainloop_get_api(mainloop)) == 0); + + buf = pa_strbuf_new(); + if (conf->load_default_script_file) { + FILE *f; + + if ((f = pa_daemon_conf_open_default_script_file(conf))) { + r = pa_cli_command_execute_file_stream(c, f, buf, &conf->fail); + fclose(f); + } + } + + if (r >= 0) + r = pa_cli_command_execute(c, conf->script_commands, buf, &conf->fail); + + pa_log_error("%s", s = pa_strbuf_tostring_free(buf)); + pa_xfree(s); + + /* We completed the initial module loading, so let's disable it + * from now on, if requested */ + c->disallow_module_loading = !!conf->disallow_module_loading; + + if (r < 0 && conf->fail) { + pa_log(_("Failed to initialize daemon.")); + goto finish; + } + + if (!c->modules || pa_idxset_size(c->modules) == 0) { + pa_log(_("Daemon startup without any loaded modules, refusing to work.")); + goto finish; + } + +#ifdef HAVE_FORK + if (daemon_pipe[1] >= 0) { + int ok = 0; + pa_loop_write(daemon_pipe[1], &ok, sizeof(ok), NULL); + pa_close(daemon_pipe[1]); + daemon_pipe[1] = -1; + } +#endif + +#ifdef HAVE_DBUS + dbus = register_dbus(c); +#endif + + pa_log_info(_("Daemon startup complete.")); + + retval = 0; + if (pa_mainloop_run(mainloop, &retval) < 0) + goto finish; + + pa_log_info(_("Daemon shutdown initiated.")); + +finish: +#ifdef HAVE_DBUS + if (dbus) + pa_dbus_connection_unref(dbus); +#endif + + if (autospawn_fd >= 0) { + if (autospawn_locked) + pa_autospawn_lock_release(); + + pa_autospawn_lock_done(FALSE); + } + +#ifdef OS_IS_WIN32 + if (win32_timer) + pa_mainloop_get_api(mainloop)->time_free(win32_timer); +#endif + + if (c) { + pa_core_unref(c); + pa_log_info(_("Daemon terminated.")); + } + + if (!conf->no_cpu_limit) + pa_cpu_limit_done(); + + pa_signal_done(); + +#ifdef HAVE_FORK + if (daemon_pipe[1] >= 0) + pa_loop_write(daemon_pipe[1], &retval, sizeof(retval), NULL); + + pa_close_pipe(daemon_pipe); +#endif + + if (mainloop) + pa_mainloop_free(mainloop); + + if (conf) + pa_daemon_conf_free(conf); + + if (valid_pid_file) + pa_pid_file_remove(); + + /* This has no real purpose except making things valgrind-clean */ + pa_unset_env_recorded(); + +#ifdef OS_IS_WIN32 + WSACleanup(); +#endif + + if (ltdl_init) + pa_ltdl_done(); + +#ifdef HAVE_DBUS + dbus_shutdown(); +#endif + + return retval; +} diff --git a/src/daemon/pulseaudio-kde.desktop.in b/src/daemon/pulseaudio-kde.desktop.in new file mode 100644 index 0000000..0684642 --- /dev/null +++ b/src/daemon/pulseaudio-kde.desktop.in @@ -0,0 +1,11 @@ +[Desktop Entry] +Version=1.0 +Encoding=UTF-8 +_Name=PulseAudio Sound System KDE Routing Policy +_Comment=Start the PulseAudio Sound System with KDE Routing Policy +Exec=start-pulseaudio-kde +Terminal=false +Type=Application +Categories= +GenericName= +OnlyShowIn=KDE; diff --git a/src/daemon/pulseaudio-system.conf b/src/daemon/pulseaudio-system.conf new file mode 100644 index 0000000..edddaf9 --- /dev/null +++ b/src/daemon/pulseaudio-system.conf @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/daemon/pulseaudio.desktop.in b/src/daemon/pulseaudio.desktop.in new file mode 100644 index 0000000..99bdbd0 --- /dev/null +++ b/src/daemon/pulseaudio.desktop.in @@ -0,0 +1,10 @@ +[Desktop Entry] +Version=1.0 +Encoding=UTF-8 +_Name=PulseAudio Sound System +_Comment=Start the PulseAudio Sound System +Exec=start-pulseaudio-x11 +Terminal=false +Type=Application +Categories= +GenericName= diff --git a/src/daemon/start-pulseaudio-kde.in b/src/daemon/start-pulseaudio-kde.in new file mode 100755 index 0000000..c319e7d --- /dev/null +++ b/src/daemon/start-pulseaudio-kde.in @@ -0,0 +1,30 @@ +#!/bin/sh + +# This file is part of PulseAudio. +# +# PulseAudio is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA. + +set -e + +[ -z "$PULSE_SERVER" ] + +@PA_BINARY@ --start "$@" + +if [ x"$DISPLAY" != x ] ; then + + @PACTL_BINARY@ load-module module-device-manager "do_routing=1" > /dev/null + +fi diff --git a/src/daemon/start-pulseaudio-x11.in b/src/daemon/start-pulseaudio-x11.in new file mode 100755 index 0000000..c57c489 --- /dev/null +++ b/src/daemon/start-pulseaudio-x11.in @@ -0,0 +1,34 @@ +#!/bin/sh + +# This file is part of PulseAudio. +# +# PulseAudio is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA. + +set -e + +[ -z "$PULSE_SERVER" ] + +@PA_BINARY@ --start "$@" + +if [ x"$DISPLAY" != x ] ; then + + @PACTL_BINARY@ load-module module-x11-publish "display=$DISPLAY" > /dev/null + @PACTL_BINARY@ load-module module-x11-cork-request "display=$DISPLAY" > /dev/null + + if [ x"$SESSION_MANAGER" != x ] ; then + @PACTL_BINARY@ load-module module-x11-xsmp "display=$DISPLAY session_manager=$SESSION_MANAGER" > /dev/null + fi +fi diff --git a/src/daemon/system.pa.in b/src/daemon/system.pa.in new file mode 100755 index 0000000..4485ef9 --- /dev/null +++ b/src/daemon/system.pa.in @@ -0,0 +1,65 @@ +#!@PA_BINARY@ -nF +# +# This file is part of PulseAudio. +# +# PulseAudio is free software; you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, write to the Free Software Foundation, +# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +# This startup script is used only if PulseAudio is started in system +# mode. + +### Automatically load driver modules depending on the hardware available +.ifexists module-hal-detect@PA_SOEXT@ +#load-module module-hal-detect +.else +### Alternatively use the static hardware detection module (for systems that +### lack HAL support) +load-module module-detect +.endif + +### Load several protocols +.ifexists module-esound-protocol-unix@PA_SOEXT@ +load-module module-esound-protocol-unix +.endif +load-module module-native-protocol-unix + +load-module module-bluetooth-discover + +### Custom policy module to route between bt<=speaker +load-module module-policy + +### Automatically restore the volume of streams and devices +#load-module module-stream-restore +#load-module module-device-restore + +### Automatically restore the default sink/source when changed by the user during runtime +load-module module-default-device-restore + +### Automatically move streams to the default sink if the sink they are +### connected to dies, similar for sources +load-module module-rescue-streams + +### Make sure we always have a sink around, even if it is a null sink. +load-module module-always-sink + +### Automatically suspend sinks/sources that become idle for too long +load-module module-suspend-on-idle + +### Enable positioned event sounds +#load-module module-position-event-sounds + +### Set default source (not to use alsa_sink monitor which is index 0) +set-default-source alsa_input.0.analog-stereo + +load-module module-remap-sink sink_name=mono_alsa master=alsa_output.0.analog-stereo channels=1 diff --git a/src/depmod.py b/src/depmod.py new file mode 100755 index 0000000..6cb3cb2 --- /dev/null +++ b/src/depmod.py @@ -0,0 +1,72 @@ +#!/usr/bin/python + +# This file is part of PulseAudio. +# +# PulseAudio is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA. + +import sys, os, string + +exported_symbols = {} +imported_symbols = {} + +for fn in sys.argv[1:]: + f = os.popen("nm '%s'" % fn, "r") + + imported_symbols[fn] = [] + + for line in f: + sym_address = line[:7].strip() + sym_type = line[9].strip() + sym_name = line[11:].strip() + + if sym_name in ('_fini', '_init'): + continue + + if sym_type in ('T', 'B', 'R', 'D' 'G', 'S', 'D'): + if exported_symbols.has_key(sym_name): + sys.stderr.write("CONFLICT: %s defined in both '%s' and '%s'.\n" % (sym_name, fn, exported_symbols[sym_name])) + else: + exported_symbols[sym_name] = fn + elif sym_type in ('U',): + if sym_name[:3] == 'pa_': + imported_symbols[fn].append(sym_name) + + f.close() + +dependencies = {} +unresolved_symbols = {} + +for fn in imported_symbols: + dependencies[fn] = [] + + for sym in imported_symbols[fn]: + if exported_symbols.has_key(sym): + if exported_symbols[sym] not in dependencies[fn]: + dependencies[fn].append(exported_symbols[sym]) + else: + if unresolved_symbols.has_key(sym): + unresolved_symbols[sym].append(fn) + else: + unresolved_symbols[sym] = [fn] + +for sym, files in unresolved_symbols.iteritems(): + print "WARNING: Unresolved symbol '%s' in %s" % (sym, `files`) + +k = dependencies.keys() +k.sort() +for fn in k: + dependencies[fn].sort() + print "%s: %s" % (fn, string.join(dependencies[fn], " ")) diff --git a/src/map-file b/src/map-file new file mode 100644 index 0000000..3d60e42 --- /dev/null +++ b/src/map-file @@ -0,0 +1,340 @@ +PULSE_0 { +global: +pa_ascii_filter; +pa_ascii_valid; +pa_browser_new; +pa_browser_new_full; +pa_browser_ref; +pa_browser_set_callback; +pa_browser_set_error_callback; +pa_browser_unref; +pa_bytes_per_second; +pa_bytes_snprint; +pa_bytes_to_usec; +pa_channel_map_can_balance; +pa_channel_map_can_fade; +pa_channel_map_compatible; +pa_channel_map_equal; +pa_channel_map_has_position; +pa_channel_map_init; +pa_channel_map_init_auto; +pa_channel_map_init_extend; +pa_channel_map_init_mono; +pa_channel_map_init_stereo; +pa_channel_map_mask; +pa_channel_map_parse; +pa_channel_map_snprint; +pa_channel_map_superset; +pa_channel_map_to_name; +pa_channel_map_to_pretty_name; +pa_channel_map_valid; +pa_channel_position_from_string; +pa_channel_position_to_pretty_string; +pa_channel_position_to_string; +pa_context_add_autoload; +pa_context_connect; +pa_context_disconnect; +pa_context_drain; +pa_context_errno; +pa_context_exit_daemon; +pa_context_get_autoload_info_by_index; +pa_context_get_autoload_info_by_name; +pa_context_get_autoload_info_list; +pa_context_get_card_info_by_index; +pa_context_get_card_info_by_name; +pa_context_get_card_info_list; +pa_context_get_client_info; +pa_context_get_client_info_list; +pa_context_get_index; +pa_context_get_module_info; +pa_context_get_module_info_list; +pa_context_get_protocol_version; +pa_context_get_sample_info_by_index; +pa_context_get_sample_info_by_name; +pa_context_get_sample_info_list; +pa_context_get_server; +pa_context_get_server_info; +pa_context_get_server_protocol_version; +pa_context_get_sink_info_by_index; +pa_context_get_sink_info_by_name; +pa_context_get_sink_info_list; +pa_context_get_sink_input_info; +pa_context_get_sink_input_info_list; +pa_context_get_source_info_by_index; +pa_context_get_source_info_by_name; +pa_context_get_source_info_list; +pa_context_get_source_output_info; +pa_context_get_source_output_info_list; +pa_context_get_state; +pa_context_is_local; +pa_context_is_pending; +pa_context_kill_client; +pa_context_kill_sink_input; +pa_context_kill_source_output; +pa_context_load_module; +pa_context_move_sink_input_by_index; +pa_context_move_sink_input_by_name; +pa_context_move_source_output_by_index; +pa_context_move_source_output_by_name; +pa_context_new; +pa_context_new_with_proplist; +pa_context_play_sample; +pa_context_play_sample_with_proplist; +pa_context_proplist_remove; +pa_context_proplist_update; +pa_context_ref; +pa_context_remove_autoload_by_index; +pa_context_remove_autoload_by_name; +pa_context_remove_sample; +pa_context_rttime_new; +pa_context_rttime_restart; +pa_context_set_card_profile_by_index; +pa_context_set_card_profile_by_name; +pa_context_set_default_sink; +pa_context_set_default_source; +pa_context_set_event_callback; +pa_context_set_name; +pa_context_set_sink_input_mute; +pa_context_set_sink_input_volume; +pa_context_set_sink_mute_by_index; +pa_context_set_sink_mute_by_name; +pa_context_set_sink_port_by_index; +pa_context_set_sink_port_by_name; +pa_context_set_sink_volume_by_index; +pa_context_set_sink_volume_by_name; +pa_context_set_source_mute_by_index; +pa_context_set_source_mute_by_name; +pa_context_set_source_port_by_index; +pa_context_set_source_port_by_name; +pa_context_set_source_volume_by_index; +pa_context_set_source_volume_by_name; +pa_context_set_state_callback; +pa_context_set_subscribe_callback; +pa_context_stat; +pa_context_subscribe; +pa_context_suspend_sink_by_index; +pa_context_suspend_sink_by_name; +pa_context_suspend_source_by_index; +pa_context_suspend_source_by_name; +pa_context_unload_module; +pa_context_unref; +pa_cvolume_avg; +pa_cvolume_avg_mask; +pa_cvolume_channels_equal_to; +pa_cvolume_compatible; +pa_cvolume_compatible_with_channel_map; +pa_cvolume_dec; +pa_cvolume_equal; +pa_cvolume_get_balance; +pa_cvolume_get_fade; +pa_cvolume_get_position; +pa_cvolume_inc; +pa_cvolume_init; +pa_cvolume_max; +pa_cvolume_max_mask; +pa_cvolume_merge; +pa_cvolume_min; +pa_cvolume_min_mask; +pa_cvolume_remap; +pa_cvolume_scale; +pa_cvolume_scale_mask; +pa_cvolume_set; +pa_cvolume_set_balance; +pa_cvolume_set_fade; +pa_cvolume_set_position; +pa_cvolume_snprint; +pa_cvolume_valid; +pa_ext_device_manager_delete; +pa_ext_device_manager_enable_role_device_priority_routing; +pa_ext_device_manager_read; +pa_ext_device_manager_reorder_devices_for_role; +pa_ext_device_manager_set_device_description; +pa_ext_device_manager_set_subscribe_cb; +pa_ext_device_manager_subscribe; +pa_ext_device_manager_test; +pa_ext_stream_restore_delete; +pa_ext_stream_restore_read; +pa_ext_stream_restore_set_subscribe_cb; +pa_ext_stream_restore_subscribe; +pa_ext_stream_restore_test; +pa_ext_stream_restore_write; +pa_ext_policy_test; +pa_ext_policy_set_mono; +pa_frame_size; +pa_get_binary_name; +pa_get_fqdn; +pa_get_home_dir; +pa_get_host_name; +pa_get_library_version; +pa_gettimeofday; +pa_get_user_name; +pa_glib_mainloop_free; +pa_glib_mainloop_get_api; +pa_glib_mainloop_new; +pa_locale_to_utf8; +pa_mainloop_api_once; +pa_mainloop_dispatch; +pa_mainloop_free; +pa_mainloop_get_api; +pa_mainloop_get_retval; +pa_mainloop_iterate; +pa_mainloop_new; +pa_mainloop_poll; +pa_mainloop_prepare; +pa_mainloop_quit; +pa_mainloop_run; +pa_mainloop_set_poll_func; +pa_mainloop_wakeup; +pa_msleep; +pa_operation_cancel; +pa_operation_get_state; +pa_operation_ref; +pa_operation_unref; +pa_parse_sample_format; +pa_path_get_filename; +pa_proplist_clear; +pa_proplist_contains; +pa_proplist_copy; +pa_proplist_free; +pa_proplist_from_string; +pa_proplist_get; +pa_proplist_gets; +pa_proplist_isempty; +pa_proplist_iterate; +pa_proplist_new; +pa_proplist_set; +pa_proplist_setf; +pa_proplist_setp; +pa_proplist_sets; +pa_proplist_size; +pa_proplist_to_string; +pa_proplist_to_string_sep; +pa_proplist_unset; +pa_proplist_unset_many; +pa_proplist_update; +pa_rtclock_now; +pa_sample_format_is_be; +pa_sample_format_is_le; +pa_sample_format_to_string; +pa_sample_size; +pa_sample_size_of_format; +pa_sample_spec_equal; +pa_sample_spec_init; +pa_sample_spec_snprint; +pa_sample_spec_valid; +pa_signal_done; +pa_signal_free; +pa_signal_init; +pa_signal_new; +pa_signal_set_destroy; +pa_simple_drain; +pa_simple_flush; +pa_simple_mute; +pa_simple_free; +pa_simple_get_latency; +pa_simple_new; +pa_simple_new_proplist; +pa_simple_read; +pa_simple_write; +pa_simple_set_volume; +pa_simple_get_stream_index; +pa_stream_begin_write; +pa_stream_cancel_write; +pa_stream_connect_playback; +pa_stream_connect_record; +pa_stream_connect_upload; +pa_stream_cork; +pa_stream_disconnect; +pa_stream_drain; +pa_stream_drop; +pa_stream_finish_upload; +pa_stream_flush; +pa_stream_get_buffer_attr; +pa_stream_get_channel_map; +pa_stream_get_context; +pa_stream_get_device_index; +pa_stream_get_device_name; +pa_stream_get_index; +pa_stream_get_latency; +pa_stream_get_monitor_stream; +pa_stream_get_sample_spec; +pa_stream_get_state; +pa_stream_get_time; +pa_stream_get_timing_info; +pa_stream_is_corked; +pa_stream_is_suspended; +pa_stream_new; +pa_stream_new_with_proplist; +pa_stream_peek; +pa_stream_prebuf; +pa_stream_proplist_remove; +pa_stream_proplist_update; +pa_stream_readable_size; +pa_stream_ref; +pa_stream_set_buffer_attr; +pa_stream_set_buffer_attr_callback; +pa_stream_set_event_callback; +pa_stream_set_latency_update_callback; +pa_stream_set_monitor_stream; +pa_stream_set_moved_callback; +pa_stream_set_name; +pa_stream_set_overflow_callback; +pa_stream_set_read_callback; +pa_stream_set_started_callback; +pa_stream_set_state_callback; +pa_stream_set_suspended_callback; +pa_stream_set_underflow_callback; +pa_stream_set_write_callback; +pa_stream_trigger; +pa_stream_unref; +pa_stream_update_sample_rate; +pa_stream_update_timing_info; +pa_stream_writable_size; +pa_stream_write; +pa_strerror; +pa_sw_cvolume_divide; +pa_sw_cvolume_divide_scalar; +pa_sw_cvolume_multiply; +pa_sw_cvolume_multiply_scalar; +pa_sw_cvolume_snprint_dB; +pa_sw_volume_divide; +pa_sw_volume_from_dB; +pa_sw_volume_from_linear; +pa_sw_volume_multiply; +pa_sw_volume_snprint_dB; +pa_sw_volume_to_dB; +pa_sw_volume_to_linear; +pa_threaded_mainloop_accept; +pa_threaded_mainloop_free; +pa_threaded_mainloop_get_api; +pa_threaded_mainloop_get_retval; +pa_threaded_mainloop_in_thread; +pa_threaded_mainloop_lock; +pa_threaded_mainloop_new; +pa_threaded_mainloop_signal; +pa_threaded_mainloop_start; +pa_threaded_mainloop_stop; +pa_threaded_mainloop_unlock; +pa_threaded_mainloop_wait; +pa_timeval_add; +pa_timeval_age; +pa_timeval_cmp; +pa_timeval_diff; +pa_timeval_load; +pa_timeval_store; +pa_timeval_sub; +pa_usec_to_bytes; +pa_utf8_filter; +pa_utf8_to_locale; +pa_utf8_valid; +pa_volume_snprint; +pa_xfree; +pa_xmalloc; +pa_xmalloc0; +pa_xmemdup; +pa_xrealloc; +pa_xstrdup; +pa_xstrndup; +local: +*; +}; diff --git a/src/modules/alsa/alsa-mixer.c b/src/modules/alsa/alsa-mixer.c new file mode 100644 index 0000000..8b13239 --- /dev/null +++ b/src/modules/alsa/alsa-mixer.c @@ -0,0 +1,3429 @@ +/*** + This file is part of PulseAudio. + + Copyright 2004-2009 Lennart Poettering + Copyright 2006 Pierre Ossman for Cendio AB + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include + +#ifdef HAVE_VALGRIND_MEMCHECK_H +#include +#endif + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "alsa-mixer.h" +#include "alsa-util.h" + +struct description_map { + const char *name; + const char *description; +}; + +static const char *lookup_description(const char *name, const struct description_map dm[], unsigned n) { + unsigned i; + + for (i = 0; i < n; i++) + if (pa_streq(dm[i].name, name)) + return dm[i].description; + + return NULL; +} + +struct pa_alsa_fdlist { + unsigned num_fds; + struct pollfd *fds; + /* This is a temporary buffer used to avoid lots of mallocs */ + struct pollfd *work_fds; + + snd_mixer_t *mixer; + + pa_mainloop_api *m; + pa_defer_event *defer; + pa_io_event **ios; + + pa_bool_t polled; + + void (*cb)(void *userdata); + void *userdata; +}; + +static void io_cb(pa_mainloop_api*a, pa_io_event* e, int fd, pa_io_event_flags_t events, void *userdata) { + + struct pa_alsa_fdlist *fdl = userdata; + int err; + unsigned i; + unsigned short revents; + + pa_assert(a); + pa_assert(fdl); + pa_assert(fdl->mixer); + pa_assert(fdl->fds); + pa_assert(fdl->work_fds); + + if (fdl->polled) + return; + + fdl->polled = TRUE; + + memcpy(fdl->work_fds, fdl->fds, sizeof(struct pollfd) * fdl->num_fds); + + for (i = 0; i < fdl->num_fds; i++) { + if (e == fdl->ios[i]) { + if (events & PA_IO_EVENT_INPUT) + fdl->work_fds[i].revents |= POLLIN; + if (events & PA_IO_EVENT_OUTPUT) + fdl->work_fds[i].revents |= POLLOUT; + if (events & PA_IO_EVENT_ERROR) + fdl->work_fds[i].revents |= POLLERR; + if (events & PA_IO_EVENT_HANGUP) + fdl->work_fds[i].revents |= POLLHUP; + break; + } + } + + pa_assert(i != fdl->num_fds); + + if ((err = snd_mixer_poll_descriptors_revents(fdl->mixer, fdl->work_fds, fdl->num_fds, &revents)) < 0) { + pa_log_error("Unable to get poll revent: %s", pa_alsa_strerror(err)); + return; + } + + a->defer_enable(fdl->defer, 1); + + if (revents) + snd_mixer_handle_events(fdl->mixer); +} + +static void defer_cb(pa_mainloop_api*a, pa_defer_event* e, void *userdata) { + struct pa_alsa_fdlist *fdl = userdata; + unsigned num_fds, i; + int err, n; + struct pollfd *temp; + + pa_assert(a); + pa_assert(fdl); + pa_assert(fdl->mixer); + + a->defer_enable(fdl->defer, 0); + + if ((n = snd_mixer_poll_descriptors_count(fdl->mixer)) < 0) { + pa_log("snd_mixer_poll_descriptors_count() failed: %s", pa_alsa_strerror(n)); + return; + } + num_fds = (unsigned) n; + + if (num_fds != fdl->num_fds) { + if (fdl->fds) + pa_xfree(fdl->fds); + if (fdl->work_fds) + pa_xfree(fdl->work_fds); + fdl->fds = pa_xnew0(struct pollfd, num_fds); + fdl->work_fds = pa_xnew(struct pollfd, num_fds); + } + + memset(fdl->work_fds, 0, sizeof(struct pollfd) * num_fds); + + if ((err = snd_mixer_poll_descriptors(fdl->mixer, fdl->work_fds, num_fds)) < 0) { + pa_log_error("Unable to get poll descriptors: %s", pa_alsa_strerror(err)); + return; + } + + fdl->polled = FALSE; + + if (memcmp(fdl->fds, fdl->work_fds, sizeof(struct pollfd) * num_fds) == 0) + return; + + if (fdl->ios) { + for (i = 0; i < fdl->num_fds; i++) + a->io_free(fdl->ios[i]); + + if (num_fds != fdl->num_fds) { + pa_xfree(fdl->ios); + fdl->ios = NULL; + } + } + + if (!fdl->ios) + fdl->ios = pa_xnew(pa_io_event*, num_fds); + + /* Swap pointers */ + temp = fdl->work_fds; + fdl->work_fds = fdl->fds; + fdl->fds = temp; + + fdl->num_fds = num_fds; + + for (i = 0;i < num_fds;i++) + fdl->ios[i] = a->io_new(a, fdl->fds[i].fd, + ((fdl->fds[i].events & POLLIN) ? PA_IO_EVENT_INPUT : 0) | + ((fdl->fds[i].events & POLLOUT) ? PA_IO_EVENT_OUTPUT : 0), + io_cb, fdl); +} + +struct pa_alsa_fdlist *pa_alsa_fdlist_new(void) { + struct pa_alsa_fdlist *fdl; + + fdl = pa_xnew0(struct pa_alsa_fdlist, 1); + + return fdl; +} + +void pa_alsa_fdlist_free(struct pa_alsa_fdlist *fdl) { + pa_assert(fdl); + + if (fdl->defer) { + pa_assert(fdl->m); + fdl->m->defer_free(fdl->defer); + } + + if (fdl->ios) { + unsigned i; + pa_assert(fdl->m); + for (i = 0; i < fdl->num_fds; i++) + fdl->m->io_free(fdl->ios[i]); + pa_xfree(fdl->ios); + } + + if (fdl->fds) + pa_xfree(fdl->fds); + if (fdl->work_fds) + pa_xfree(fdl->work_fds); + + pa_xfree(fdl); +} + +int pa_alsa_fdlist_set_mixer(struct pa_alsa_fdlist *fdl, snd_mixer_t *mixer_handle, pa_mainloop_api* m) { + pa_assert(fdl); + pa_assert(mixer_handle); + pa_assert(m); + pa_assert(!fdl->m); + + fdl->mixer = mixer_handle; + fdl->m = m; + fdl->defer = m->defer_new(m, defer_cb, fdl); + + return 0; +} + +static int prepare_mixer(snd_mixer_t *mixer, const char *dev) { + int err; + + pa_assert(mixer); + pa_assert(dev); + + if ((err = snd_mixer_attach(mixer, dev)) < 0) { + pa_log_info("Unable to attach to mixer %s: %s", dev, pa_alsa_strerror(err)); + return -1; + } + + if ((err = snd_mixer_selem_register(mixer, NULL, NULL)) < 0) { + pa_log_warn("Unable to register mixer: %s", pa_alsa_strerror(err)); + return -1; + } + + if ((err = snd_mixer_load(mixer)) < 0) { + pa_log_warn("Unable to load mixer: %s", pa_alsa_strerror(err)); + return -1; + } + + pa_log_info("Successfully attached to mixer '%s'", dev); + return 0; +} + +snd_mixer_t *pa_alsa_open_mixer_for_pcm(snd_pcm_t *pcm, char **ctl_device) { + int err; + snd_mixer_t *m; + const char *dev; + snd_pcm_info_t* info; + snd_pcm_info_alloca(&info); + + pa_assert(pcm); + + if ((err = snd_mixer_open(&m, 0)) < 0) { + pa_log("Error opening mixer: %s", pa_alsa_strerror(err)); + return NULL; + } + + /* First, try by name */ + if ((dev = snd_pcm_name(pcm))) + if (prepare_mixer(m, dev) >= 0) { + if (ctl_device) + *ctl_device = pa_xstrdup(dev); + + return m; + } + + /* Then, try by card index */ + if (snd_pcm_info(pcm, info) >= 0) { + char *md; + int card_idx; + + if ((card_idx = snd_pcm_info_get_card(info)) >= 0) { + + md = pa_sprintf_malloc("hw:%i", card_idx); + + if (!dev || !pa_streq(dev, md)) + if (prepare_mixer(m, md) >= 0) { + + if (ctl_device) + *ctl_device = md; + else + pa_xfree(md); + + return m; + } + + pa_xfree(md); + } + } + + snd_mixer_close(m); + return NULL; +} + +static const snd_mixer_selem_channel_id_t alsa_channel_ids[PA_CHANNEL_POSITION_MAX] = { + [PA_CHANNEL_POSITION_MONO] = SND_MIXER_SCHN_MONO, /* The ALSA name is just an alias! */ + + [PA_CHANNEL_POSITION_FRONT_CENTER] = SND_MIXER_SCHN_FRONT_CENTER, + [PA_CHANNEL_POSITION_FRONT_LEFT] = SND_MIXER_SCHN_FRONT_LEFT, + [PA_CHANNEL_POSITION_FRONT_RIGHT] = SND_MIXER_SCHN_FRONT_RIGHT, + + [PA_CHANNEL_POSITION_REAR_CENTER] = SND_MIXER_SCHN_REAR_CENTER, + [PA_CHANNEL_POSITION_REAR_LEFT] = SND_MIXER_SCHN_REAR_LEFT, + [PA_CHANNEL_POSITION_REAR_RIGHT] = SND_MIXER_SCHN_REAR_RIGHT, + + [PA_CHANNEL_POSITION_LFE] = SND_MIXER_SCHN_WOOFER, + + [PA_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER] = SND_MIXER_SCHN_UNKNOWN, + + [PA_CHANNEL_POSITION_SIDE_LEFT] = SND_MIXER_SCHN_SIDE_LEFT, + [PA_CHANNEL_POSITION_SIDE_RIGHT] = SND_MIXER_SCHN_SIDE_RIGHT, + + [PA_CHANNEL_POSITION_AUX0] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_AUX1] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_AUX2] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_AUX3] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_AUX4] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_AUX5] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_AUX6] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_AUX7] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_AUX8] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_AUX9] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_AUX10] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_AUX11] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_AUX12] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_AUX13] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_AUX14] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_AUX15] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_AUX16] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_AUX17] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_AUX18] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_AUX19] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_AUX20] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_AUX21] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_AUX22] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_AUX23] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_AUX24] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_AUX25] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_AUX26] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_AUX27] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_AUX28] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_AUX29] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_AUX30] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_AUX31] = SND_MIXER_SCHN_UNKNOWN, + + [PA_CHANNEL_POSITION_TOP_CENTER] = SND_MIXER_SCHN_UNKNOWN, + + [PA_CHANNEL_POSITION_TOP_FRONT_CENTER] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_TOP_FRONT_LEFT] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_TOP_FRONT_RIGHT] = SND_MIXER_SCHN_UNKNOWN, + + [PA_CHANNEL_POSITION_TOP_REAR_CENTER] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_TOP_REAR_LEFT] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_TOP_REAR_RIGHT] = SND_MIXER_SCHN_UNKNOWN +}; + +static void setting_free(pa_alsa_setting *s) { + pa_assert(s); + + if (s->options) + pa_idxset_free(s->options, NULL, NULL); + + pa_xfree(s->name); + pa_xfree(s->description); + pa_xfree(s); +} + +static void option_free(pa_alsa_option *o) { + pa_assert(o); + + pa_xfree(o->alsa_name); + pa_xfree(o->name); + pa_xfree(o->description); + pa_xfree(o); +} + +static void element_free(pa_alsa_element *e) { + pa_alsa_option *o; + pa_assert(e); + + while ((o = e->options)) { + PA_LLIST_REMOVE(pa_alsa_option, e->options, o); + option_free(o); + } + + pa_xfree(e->alsa_name); + pa_xfree(e); +} + +void pa_alsa_path_free(pa_alsa_path *p) { + pa_alsa_element *e; + pa_alsa_setting *s; + + pa_assert(p); + + while ((e = p->elements)) { + PA_LLIST_REMOVE(pa_alsa_element, p->elements, e); + element_free(e); + } + + while ((s = p->settings)) { + PA_LLIST_REMOVE(pa_alsa_setting, p->settings, s); + setting_free(s); + } + + pa_xfree(p->name); + pa_xfree(p->description); + pa_xfree(p); +} + +void pa_alsa_path_set_free(pa_alsa_path_set *ps) { + pa_alsa_path *p; + pa_assert(ps); + + while ((p = ps->paths)) { + PA_LLIST_REMOVE(pa_alsa_path, ps->paths, p); + pa_alsa_path_free(p); + } + + pa_xfree(ps); +} + +static long to_alsa_dB(pa_volume_t v) { + return (long) (pa_sw_volume_to_dB(v) * 100.0); +} + +static pa_volume_t from_alsa_dB(long v) { + return pa_sw_volume_from_dB((double) v / 100.0); +} + +static long to_alsa_volume(pa_volume_t v, long min, long max) { + long w; + + w = (long) round(((double) v * (double) (max - min)) / PA_VOLUME_NORM) + min; + return PA_CLAMP_UNLIKELY(w, min, max); +} + +static pa_volume_t from_alsa_volume(long v, long min, long max) { + return (pa_volume_t) round(((double) (v - min) * PA_VOLUME_NORM) / (double) (max - min)); +} + +#define SELEM_INIT(sid, name) \ + do { \ + snd_mixer_selem_id_alloca(&(sid)); \ + snd_mixer_selem_id_set_name((sid), (name)); \ + snd_mixer_selem_id_set_index((sid), 0); \ + } while(FALSE) + +static int element_get_volume(pa_alsa_element *e, snd_mixer_t *m, const pa_channel_map *cm, pa_cvolume *v) { + snd_mixer_selem_id_t *sid; + snd_mixer_elem_t *me; + snd_mixer_selem_channel_id_t c; + pa_channel_position_mask_t mask = 0; + unsigned k; + + pa_assert(m); + pa_assert(e); + pa_assert(cm); + pa_assert(v); + + SELEM_INIT(sid, e->alsa_name); + if (!(me = snd_mixer_find_selem(m, sid))) { + pa_log_warn("Element %s seems to have disappeared.", e->alsa_name); + return -1; + } + + pa_cvolume_mute(v, cm->channels); + + /* We take the highest volume of all channels that match */ + + for (c = 0; c <= SND_MIXER_SCHN_LAST; c++) { + int r; + pa_volume_t f; + + if (e->has_dB) { + long value = 0; + + if (e->direction == PA_ALSA_DIRECTION_OUTPUT) { + if (snd_mixer_selem_has_playback_channel(me, c)) + r = snd_mixer_selem_get_playback_dB(me, c, &value); + else + r = -1; + } else { + if (snd_mixer_selem_has_capture_channel(me, c)) + r = snd_mixer_selem_get_capture_dB(me, c, &value); + else + r = -1; + } + + if (r < 0) + continue; + +#ifdef HAVE_VALGRIND_MEMCHECK_H + VALGRIND_MAKE_MEM_DEFINED(&value, sizeof(value)); +#endif + + f = from_alsa_dB(value); + + } else { + long value = 0; + + if (e->direction == PA_ALSA_DIRECTION_OUTPUT) { + if (snd_mixer_selem_has_playback_channel(me, c)) + r = snd_mixer_selem_get_playback_volume(me, c, &value); + else + r = -1; + } else { + if (snd_mixer_selem_has_capture_channel(me, c)) + r = snd_mixer_selem_get_capture_volume(me, c, &value); + else + r = -1; + } + + if (r < 0) + continue; + + f = from_alsa_volume(value, e->min_volume, e->max_volume); + } + + for (k = 0; k < cm->channels; k++) + if (e->masks[c][e->n_channels-1] & PA_CHANNEL_POSITION_MASK(cm->map[k])) + if (v->values[k] < f) + v->values[k] = f; + + mask |= e->masks[c][e->n_channels-1]; + } + + for (k = 0; k < cm->channels; k++) + if (!(mask & PA_CHANNEL_POSITION_MASK(cm->map[k]))) + v->values[k] = PA_VOLUME_NORM; + + return 0; +} + +int pa_alsa_path_get_volume(pa_alsa_path *p, snd_mixer_t *m, const pa_channel_map *cm, pa_cvolume *v) { + pa_alsa_element *e; + + pa_assert(m); + pa_assert(p); + pa_assert(cm); + pa_assert(v); + + if (!p->has_volume) + return -1; + + pa_cvolume_reset(v, cm->channels); + + PA_LLIST_FOREACH(e, p->elements) { + pa_cvolume ev; + + if (e->volume_use != PA_ALSA_VOLUME_MERGE) + continue; + + pa_assert(!p->has_dB || e->has_dB); + + if (element_get_volume(e, m, cm, &ev) < 0) + return -1; + + /* If we have no dB information all we can do is take the first element and leave */ + if (!p->has_dB) { + *v = ev; + return 0; + } + + pa_sw_cvolume_multiply(v, v, &ev); + } + + return 0; +} + +static int element_get_switch(pa_alsa_element *e, snd_mixer_t *m, pa_bool_t *b) { + snd_mixer_selem_id_t *sid; + snd_mixer_elem_t *me; + snd_mixer_selem_channel_id_t c; + + pa_assert(m); + pa_assert(e); + pa_assert(b); + + SELEM_INIT(sid, e->alsa_name); + if (!(me = snd_mixer_find_selem(m, sid))) { + pa_log_warn("Element %s seems to have disappeared.", e->alsa_name); + return -1; + } + + /* We return muted if at least one channel is muted */ + + for (c = 0; c <= SND_MIXER_SCHN_LAST; c++) { + int r; + int value = 0; + + if (e->direction == PA_ALSA_DIRECTION_OUTPUT) { + if (snd_mixer_selem_has_playback_channel(me, c)) + r = snd_mixer_selem_get_playback_switch(me, c, &value); + else + r = -1; + } else { + if (snd_mixer_selem_has_capture_channel(me, c)) + r = snd_mixer_selem_get_capture_switch(me, c, &value); + else + r = -1; + } + + if (r < 0) + continue; + + if (!value) { + *b = FALSE; + return 0; + } + } + + *b = TRUE; + return 0; +} + +int pa_alsa_path_get_mute(pa_alsa_path *p, snd_mixer_t *m, pa_bool_t *muted) { + pa_alsa_element *e; + + pa_assert(m); + pa_assert(p); + pa_assert(muted); + + if (!p->has_mute) + return -1; + + PA_LLIST_FOREACH(e, p->elements) { + pa_bool_t b; + + if (e->switch_use != PA_ALSA_SWITCH_MUTE) + continue; + + if (element_get_switch(e, m, &b) < 0) + return -1; + + if (!b) { + *muted = TRUE; + return 0; + } + } + + *muted = FALSE; + return 0; +} + +static int element_set_volume(pa_alsa_element *e, snd_mixer_t *m, const pa_channel_map *cm, pa_cvolume *v) { + snd_mixer_selem_id_t *sid; + pa_cvolume rv; + snd_mixer_elem_t *me; + snd_mixer_selem_channel_id_t c; + pa_channel_position_mask_t mask = 0; + unsigned k; + + pa_assert(m); + pa_assert(e); + pa_assert(cm); + pa_assert(v); + pa_assert(pa_cvolume_compatible_with_channel_map(v, cm)); + + SELEM_INIT(sid, e->alsa_name); + if (!(me = snd_mixer_find_selem(m, sid))) { + pa_log_warn("Element %s seems to have disappeared.", e->alsa_name); + return -1; + } + + pa_cvolume_mute(&rv, cm->channels); + + for (c = 0; c <= SND_MIXER_SCHN_LAST; c++) { + int r; + pa_volume_t f = PA_VOLUME_MUTED; + pa_bool_t found = FALSE; + + for (k = 0; k < cm->channels; k++) + if (e->masks[c][e->n_channels-1] & PA_CHANNEL_POSITION_MASK(cm->map[k])) { + found = TRUE; + if (v->values[k] > f) + f = v->values[k]; + } + + if (!found) { + /* Hmm, so this channel does not exist in the volume + * struct, so let's bind it to the overall max of the + * volume. */ + f = pa_cvolume_max(v); + } + + if (e->has_dB) { + long value = to_alsa_dB(f); + + if (e->direction == PA_ALSA_DIRECTION_OUTPUT) { + /* If we call set_play_volume() without checking first + * if the channel is available, ALSA behaves ver + * strangely and doesn't fail the call */ + if (snd_mixer_selem_has_playback_channel(me, c)) { + if ((r = snd_mixer_selem_set_playback_dB(me, c, value, +1)) >= 0) + r = snd_mixer_selem_get_playback_dB(me, c, &value); + } else + r = -1; + } else { + if (snd_mixer_selem_has_capture_channel(me, c)) { + if ((r = snd_mixer_selem_set_capture_dB(me, c, value, +1)) >= 0) + r = snd_mixer_selem_get_capture_dB(me, c, &value); + } else + r = -1; + } + + if (r < 0) + continue; + +#ifdef HAVE_VALGRIND_MEMCHECK_H + VALGRIND_MAKE_MEM_DEFINED(&value, sizeof(value)); +#endif + + f = from_alsa_dB(value); + + } else { + long value; + + value = to_alsa_volume(f, e->min_volume, e->max_volume); + + if (e->direction == PA_ALSA_DIRECTION_OUTPUT) { + if (snd_mixer_selem_has_playback_channel(me, c)) { + if ((r = snd_mixer_selem_set_playback_volume(me, c, value)) >= 0) + r = snd_mixer_selem_get_playback_volume(me, c, &value); + } else + r = -1; + } else { + if (snd_mixer_selem_has_capture_channel(me, c)) { + if ((r = snd_mixer_selem_set_capture_volume(me, c, value)) >= 0) + r = snd_mixer_selem_get_capture_volume(me, c, &value); + } else + r = -1; + } + + if (r < 0) + continue; + + f = from_alsa_volume(value, e->min_volume, e->max_volume); + } + + for (k = 0; k < cm->channels; k++) + if (e->masks[c][e->n_channels-1] & PA_CHANNEL_POSITION_MASK(cm->map[k])) + if (rv.values[k] < f) + rv.values[k] = f; + + mask |= e->masks[c][e->n_channels-1]; + } + + for (k = 0; k < cm->channels; k++) + if (!(mask & PA_CHANNEL_POSITION_MASK(cm->map[k]))) + rv.values[k] = PA_VOLUME_NORM; + + *v = rv; + return 0; +} + +int pa_alsa_path_set_volume(pa_alsa_path *p, snd_mixer_t *m, const pa_channel_map *cm, pa_cvolume *v) { + pa_alsa_element *e; + pa_cvolume rv; + + pa_assert(m); + pa_assert(p); + pa_assert(cm); + pa_assert(v); + pa_assert(pa_cvolume_compatible_with_channel_map(v, cm)); + + if (!p->has_volume) + return -1; + + rv = *v; /* Remaining adjustment */ + pa_cvolume_reset(v, cm->channels); /* Adjustment done */ + + PA_LLIST_FOREACH(e, p->elements) { + pa_cvolume ev; + + if (e->volume_use != PA_ALSA_VOLUME_MERGE) + continue; + + pa_assert(!p->has_dB || e->has_dB); + + ev = rv; + if (element_set_volume(e, m, cm, &ev) < 0) + return -1; + + if (!p->has_dB) { + *v = ev; + return 0; + } + + pa_sw_cvolume_multiply(v, v, &ev); + pa_sw_cvolume_divide(&rv, &rv, &ev); + } + + return 0; +} + +static int element_set_switch(pa_alsa_element *e, snd_mixer_t *m, pa_bool_t b) { + snd_mixer_elem_t *me; + snd_mixer_selem_id_t *sid; + int r; + + pa_assert(m); + pa_assert(e); + + SELEM_INIT(sid, e->alsa_name); + if (!(me = snd_mixer_find_selem(m, sid))) { + pa_log_warn("Element %s seems to have disappeared.", e->alsa_name); + return -1; + } + + if (e->direction == PA_ALSA_DIRECTION_OUTPUT) + r = snd_mixer_selem_set_playback_switch_all(me, b); + else + r = snd_mixer_selem_set_capture_switch_all(me, b); + + if (r < 0) + pa_log_warn("Failed to set switch of %s: %s", e->alsa_name, pa_alsa_strerror(errno)); + + return r; +} + +int pa_alsa_path_set_mute(pa_alsa_path *p, snd_mixer_t *m, pa_bool_t muted) { + pa_alsa_element *e; + + pa_assert(m); + pa_assert(p); + + if (!p->has_mute) + return -1; + + PA_LLIST_FOREACH(e, p->elements) { + + if (e->switch_use != PA_ALSA_SWITCH_MUTE) + continue; + + if (element_set_switch(e, m, !muted) < 0) + return -1; + } + + return 0; +} + +static int element_mute_volume(pa_alsa_element *e, snd_mixer_t *m) { + snd_mixer_elem_t *me; + snd_mixer_selem_id_t *sid; + int r; + + pa_assert(m); + pa_assert(e); + + SELEM_INIT(sid, e->alsa_name); + if (!(me = snd_mixer_find_selem(m, sid))) { + pa_log_warn("Element %s seems to have disappeared.", e->alsa_name); + return -1; + } + + if (e->direction == PA_ALSA_DIRECTION_OUTPUT) + r = snd_mixer_selem_set_playback_volume_all(me, e->min_volume); + else + r = snd_mixer_selem_set_capture_volume_all(me, e->min_volume); + + if (r < 0) + pa_log_warn("Faile to set volume to muted of %s: %s", e->alsa_name, pa_alsa_strerror(errno)); + + return r; +} + +/* The volume to 0dB */ +static int element_zero_volume(pa_alsa_element *e, snd_mixer_t *m) { + snd_mixer_elem_t *me; + snd_mixer_selem_id_t *sid; + int r; + + pa_assert(m); + pa_assert(e); + + SELEM_INIT(sid, e->alsa_name); + if (!(me = snd_mixer_find_selem(m, sid))) { + pa_log_warn("Element %s seems to have disappeared.", e->alsa_name); + return -1; + } + + if (e->direction == PA_ALSA_DIRECTION_OUTPUT) + r = snd_mixer_selem_set_playback_dB_all(me, 0, +1); + else + r = snd_mixer_selem_set_capture_dB_all(me, 0, +1); + + if (r < 0) + pa_log_warn("Faile to set volume to 0dB of %s: %s", e->alsa_name, pa_alsa_strerror(errno)); + + return r; +} + +int pa_alsa_path_select(pa_alsa_path *p, snd_mixer_t *m) { + pa_alsa_element *e; + int r = 0; + + pa_assert(m); + pa_assert(p); + + pa_log_debug("Activating path %s", p->name); + pa_alsa_path_dump(p); + + PA_LLIST_FOREACH(e, p->elements) { + + switch (e->switch_use) { + case PA_ALSA_SWITCH_OFF: + r = element_set_switch(e, m, FALSE); + break; + + case PA_ALSA_SWITCH_ON: + r = element_set_switch(e, m, TRUE); + break; + + case PA_ALSA_SWITCH_MUTE: + case PA_ALSA_SWITCH_IGNORE: + case PA_ALSA_SWITCH_SELECT: + r = 0; + break; + } + + if (r < 0) + return -1; + + switch (e->volume_use) { + case PA_ALSA_VOLUME_OFF: + r = element_mute_volume(e, m); + break; + + case PA_ALSA_VOLUME_ZERO: + r = element_zero_volume(e, m); + break; + + case PA_ALSA_VOLUME_MERGE: + case PA_ALSA_VOLUME_IGNORE: + r = 0; + break; + } + + if (r < 0) + return -1; + } + + return 0; +} + +static int check_required(pa_alsa_element *e, snd_mixer_elem_t *me) { + pa_bool_t has_switch; + pa_bool_t has_enumeration; + pa_bool_t has_volume; + + pa_assert(e); + pa_assert(me); + + if (e->direction == PA_ALSA_DIRECTION_OUTPUT) { + has_switch = + snd_mixer_selem_has_playback_switch(me) || + (e->direction_try_other && snd_mixer_selem_has_capture_switch(me)); + } else { + has_switch = + snd_mixer_selem_has_capture_switch(me) || + (e->direction_try_other && snd_mixer_selem_has_playback_switch(me)); + } + + if (e->direction == PA_ALSA_DIRECTION_OUTPUT) { + has_volume = + snd_mixer_selem_has_playback_volume(me) || + (e->direction_try_other && snd_mixer_selem_has_capture_volume(me)); + } else { + has_volume = + snd_mixer_selem_has_capture_volume(me) || + (e->direction_try_other && snd_mixer_selem_has_playback_volume(me)); + } + + has_enumeration = snd_mixer_selem_is_enumerated(me); + + if ((e->required == PA_ALSA_REQUIRED_SWITCH && !has_switch) || + (e->required == PA_ALSA_REQUIRED_VOLUME && !has_volume) || + (e->required == PA_ALSA_REQUIRED_ENUMERATION && !has_enumeration)) + return -1; + + if (e->required == PA_ALSA_REQUIRED_ANY && !(has_switch || has_volume || has_enumeration)) + return -1; + + if ((e->required_absent == PA_ALSA_REQUIRED_SWITCH && has_switch) || + (e->required_absent == PA_ALSA_REQUIRED_VOLUME && has_volume) || + (e->required_absent == PA_ALSA_REQUIRED_ENUMERATION && has_enumeration)) + return -1; + + if (e->required_absent == PA_ALSA_REQUIRED_ANY && (has_switch || has_volume || has_enumeration)) + return -1; + + return 0; +} + +static int element_probe(pa_alsa_element *e, snd_mixer_t *m) { + snd_mixer_selem_id_t *sid; + snd_mixer_elem_t *me; + + pa_assert(m); + pa_assert(e); + + SELEM_INIT(sid, e->alsa_name); + + if (!(me = snd_mixer_find_selem(m, sid))) { + + if (e->required != PA_ALSA_REQUIRED_IGNORE) + return -1; + + e->switch_use = PA_ALSA_SWITCH_IGNORE; + e->volume_use = PA_ALSA_VOLUME_IGNORE; + e->enumeration_use = PA_ALSA_VOLUME_IGNORE; + + return 0; + } + + if (e->switch_use != PA_ALSA_SWITCH_IGNORE) { + if (e->direction == PA_ALSA_DIRECTION_OUTPUT) { + + if (!snd_mixer_selem_has_playback_switch(me)) { + if (e->direction_try_other && snd_mixer_selem_has_capture_switch(me)) + e->direction = PA_ALSA_DIRECTION_INPUT; + else + e->switch_use = PA_ALSA_SWITCH_IGNORE; + } + + } else { + + if (!snd_mixer_selem_has_capture_switch(me)) { + if (e->direction_try_other && snd_mixer_selem_has_playback_switch(me)) + e->direction = PA_ALSA_DIRECTION_OUTPUT; + else + e->switch_use = PA_ALSA_SWITCH_IGNORE; + } + } + + if (e->switch_use != PA_ALSA_SWITCH_IGNORE) + e->direction_try_other = FALSE; + } + + if (e->volume_use != PA_ALSA_VOLUME_IGNORE) { + + if (e->direction == PA_ALSA_DIRECTION_OUTPUT) { + + if (!snd_mixer_selem_has_playback_volume(me)) { + if (e->direction_try_other && snd_mixer_selem_has_capture_volume(me)) + e->direction = PA_ALSA_DIRECTION_INPUT; + else + e->volume_use = PA_ALSA_VOLUME_IGNORE; + } + + } else { + + if (!snd_mixer_selem_has_capture_volume(me)) { + if (e->direction_try_other && snd_mixer_selem_has_playback_volume(me)) + e->direction = PA_ALSA_DIRECTION_OUTPUT; + else + e->volume_use = PA_ALSA_VOLUME_IGNORE; + } + } + + if (e->volume_use != PA_ALSA_VOLUME_IGNORE) { + long min_dB = 0, max_dB = 0; + int r; + + e->direction_try_other = FALSE; + + if (e->direction == PA_ALSA_DIRECTION_OUTPUT) + e->has_dB = snd_mixer_selem_get_playback_dB_range(me, &min_dB, &max_dB) >= 0; + else + e->has_dB = snd_mixer_selem_get_capture_dB_range(me, &min_dB, &max_dB) >= 0; + + if (e->has_dB) { +#ifdef HAVE_VALGRIND_MEMCHECK_H + VALGRIND_MAKE_MEM_DEFINED(&min_dB, sizeof(min_dB)); + VALGRIND_MAKE_MEM_DEFINED(&max_dB, sizeof(max_dB)); +#endif + + e->min_dB = ((double) min_dB) / 100.0; + e->max_dB = ((double) max_dB) / 100.0; + + if (min_dB >= max_dB) { + pa_log_warn("Your kernel driver is broken: it reports a volume range from %0.2f dB to %0.2f dB which makes no sense.", e->min_dB, e->max_dB); + e->has_dB = FALSE; + } + } + + if (e->direction == PA_ALSA_DIRECTION_OUTPUT) + r = snd_mixer_selem_get_playback_volume_range(me, &e->min_volume, &e->max_volume); + else + r = snd_mixer_selem_get_capture_volume_range(me, &e->min_volume, &e->max_volume); + + if (r < 0) { + pa_log_warn("Failed to get volume range of %s: %s", e->alsa_name, pa_alsa_strerror(r)); + return -1; + } + + + if (e->min_volume >= e->max_volume) { + pa_log_warn("Your kernel driver is broken: it reports a volume range from %li to %li which makes no sense.", e->min_volume, e->max_volume); + e->volume_use = PA_ALSA_VOLUME_IGNORE; + + } else { + pa_bool_t is_mono; + pa_channel_position_t p; + + if (e->direction == PA_ALSA_DIRECTION_OUTPUT) + is_mono = snd_mixer_selem_is_playback_mono(me) > 0; + else + is_mono = snd_mixer_selem_is_capture_mono(me) > 0; + + if (is_mono) { + e->n_channels = 1; + + if (!e->override_map) { + for (p = PA_CHANNEL_POSITION_FRONT_LEFT; p < PA_CHANNEL_POSITION_MAX; p++) + e->masks[alsa_channel_ids[p]][e->n_channels-1] = 0; + e->masks[SND_MIXER_SCHN_MONO][e->n_channels-1] = PA_CHANNEL_POSITION_MASK_ALL; + } + + e->merged_mask = e->masks[SND_MIXER_SCHN_MONO][e->n_channels-1]; + } else { + e->n_channels = 0; + for (p = PA_CHANNEL_POSITION_FRONT_LEFT; p < PA_CHANNEL_POSITION_MAX; p++) { + + if (alsa_channel_ids[p] == SND_MIXER_SCHN_UNKNOWN) + continue; + + if (e->direction == PA_ALSA_DIRECTION_OUTPUT) + e->n_channels += snd_mixer_selem_has_playback_channel(me, alsa_channel_ids[p]) > 0; + else + e->n_channels += snd_mixer_selem_has_capture_channel(me, alsa_channel_ids[p]) > 0; + } + + if (e->n_channels <= 0) { + pa_log_warn("Volume element %s with no channels?", e->alsa_name); + return -1; + } + + if (!e->override_map) { + for (p = PA_CHANNEL_POSITION_FRONT_LEFT; p < PA_CHANNEL_POSITION_MAX; p++) { + pa_bool_t has_channel; + + if (alsa_channel_ids[p] == SND_MIXER_SCHN_UNKNOWN) + continue; + + if (e->direction == PA_ALSA_DIRECTION_OUTPUT) + has_channel = snd_mixer_selem_has_playback_channel(me, alsa_channel_ids[p]) > 0; + else + has_channel = snd_mixer_selem_has_capture_channel(me, alsa_channel_ids[p]) > 0; + + e->masks[alsa_channel_ids[p]][e->n_channels-1] = has_channel ? PA_CHANNEL_POSITION_MASK(p) : 0; + } + } + + e->merged_mask = 0; + for (p = PA_CHANNEL_POSITION_FRONT_LEFT; p < PA_CHANNEL_POSITION_MAX; p++) + e->merged_mask |= e->masks[alsa_channel_ids[p]][e->n_channels-1]; + } + } + } + + } + + if (check_required(e, me) < 0) + return -1; + + if (e->switch_use == PA_ALSA_SWITCH_SELECT) { + pa_alsa_option *o; + + PA_LLIST_FOREACH(o, e->options) + o->alsa_idx = pa_streq(o->alsa_name, "on") ? 1 : 0; + } else if (e->enumeration_use == PA_ALSA_ENUMERATION_SELECT) { + int n; + pa_alsa_option *o; + + if ((n = snd_mixer_selem_get_enum_items(me)) < 0) { + pa_log("snd_mixer_selem_get_enum_items() failed: %s", pa_alsa_strerror(n)); + return -1; + } + + PA_LLIST_FOREACH(o, e->options) { + int i; + + for (i = 0; i < n; i++) { + char buf[128]; + + if (snd_mixer_selem_get_enum_item_name(me, i, sizeof(buf), buf) < 0) + continue; + + if (!pa_streq(buf, o->alsa_name)) + continue; + + o->alsa_idx = i; + } + } + } + + return 0; +} + +static pa_alsa_element* element_get(pa_alsa_path *p, const char *section, pa_bool_t prefixed) { + pa_alsa_element *e; + + pa_assert(p); + pa_assert(section); + + if (prefixed) { + if (!pa_startswith(section, "Element ")) + return NULL; + + section += 8; + } + + /* This is not an element section, but an enum section? */ + if (strchr(section, ':')) + return NULL; + + if (p->last_element && pa_streq(p->last_element->alsa_name, section)) + return p->last_element; + + PA_LLIST_FOREACH(e, p->elements) + if (pa_streq(e->alsa_name, section)) + goto finish; + + e = pa_xnew0(pa_alsa_element, 1); + e->path = p; + e->alsa_name = pa_xstrdup(section); + e->direction = p->direction; + + PA_LLIST_INSERT_AFTER(pa_alsa_element, p->elements, p->last_element, e); + +finish: + p->last_element = e; + return e; +} + +static pa_alsa_option* option_get(pa_alsa_path *p, const char *section) { + char *en; + const char *on; + pa_alsa_option *o; + pa_alsa_element *e; + + if (!pa_startswith(section, "Option ")) + return NULL; + + section += 7; + + /* This is not an enum section, but an element section? */ + if (!(on = strchr(section, ':'))) + return NULL; + + en = pa_xstrndup(section, on - section); + on++; + + if (p->last_option && + pa_streq(p->last_option->element->alsa_name, en) && + pa_streq(p->last_option->alsa_name, on)) { + pa_xfree(en); + return p->last_option; + } + + pa_assert_se(e = element_get(p, en, FALSE)); + pa_xfree(en); + + PA_LLIST_FOREACH(o, e->options) + if (pa_streq(o->alsa_name, on)) + goto finish; + + o = pa_xnew0(pa_alsa_option, 1); + o->element = e; + o->alsa_name = pa_xstrdup(on); + o->alsa_idx = -1; + + if (p->last_option && p->last_option->element == e) + PA_LLIST_INSERT_AFTER(pa_alsa_option, e->options, p->last_option, o); + else + PA_LLIST_PREPEND(pa_alsa_option, e->options, o); + +finish: + p->last_option = o; + return o; +} + +static int element_parse_switch( + const char *filename, + unsigned line, + const char *section, + const char *lvalue, + const char *rvalue, + void *data, + void *userdata) { + + pa_alsa_path *p = userdata; + pa_alsa_element *e; + + pa_assert(p); + + if (!(e = element_get(p, section, TRUE))) { + pa_log("[%s:%u] Switch makes no sense in '%s'", filename, line, section); + return -1; + } + + if (pa_streq(rvalue, "ignore")) + e->switch_use = PA_ALSA_SWITCH_IGNORE; + else if (pa_streq(rvalue, "mute")) + e->switch_use = PA_ALSA_SWITCH_MUTE; + else if (pa_streq(rvalue, "off")) + e->switch_use = PA_ALSA_SWITCH_OFF; + else if (pa_streq(rvalue, "on")) + e->switch_use = PA_ALSA_SWITCH_ON; + else if (pa_streq(rvalue, "select")) + e->switch_use = PA_ALSA_SWITCH_SELECT; + else { + pa_log("[%s:%u] Switch invalid of '%s'", filename, line, section); + return -1; + } + + return 0; +} + +static int element_parse_volume( + const char *filename, + unsigned line, + const char *section, + const char *lvalue, + const char *rvalue, + void *data, + void *userdata) { + + pa_alsa_path *p = userdata; + pa_alsa_element *e; + + pa_assert(p); + + if (!(e = element_get(p, section, TRUE))) { + pa_log("[%s:%u] Volume makes no sense in '%s'", filename, line, section); + return -1; + } + + if (pa_streq(rvalue, "ignore")) + e->volume_use = PA_ALSA_VOLUME_IGNORE; + else if (pa_streq(rvalue, "merge")) + e->volume_use = PA_ALSA_VOLUME_MERGE; + else if (pa_streq(rvalue, "off")) + e->volume_use = PA_ALSA_VOLUME_OFF; + else if (pa_streq(rvalue, "zero")) + e->volume_use = PA_ALSA_VOLUME_ZERO; + else { + pa_log("[%s:%u] Volume invalid of '%s'", filename, line, section); + return -1; + } + + return 0; +} + +static int element_parse_enumeration( + const char *filename, + unsigned line, + const char *section, + const char *lvalue, + const char *rvalue, + void *data, + void *userdata) { + + pa_alsa_path *p = userdata; + pa_alsa_element *e; + + pa_assert(p); + + if (!(e = element_get(p, section, TRUE))) { + pa_log("[%s:%u] Enumeration makes no sense in '%s'", filename, line, section); + return -1; + } + + if (pa_streq(rvalue, "ignore")) + e->enumeration_use = PA_ALSA_ENUMERATION_IGNORE; + else if (pa_streq(rvalue, "select")) + e->enumeration_use = PA_ALSA_ENUMERATION_SELECT; + else { + pa_log("[%s:%u] Enumeration invalid of '%s'", filename, line, section); + return -1; + } + + return 0; +} + +static int option_parse_priority( + const char *filename, + unsigned line, + const char *section, + const char *lvalue, + const char *rvalue, + void *data, + void *userdata) { + + pa_alsa_path *p = userdata; + pa_alsa_option *o; + uint32_t prio; + + pa_assert(p); + + if (!(o = option_get(p, section))) { + pa_log("[%s:%u] Priority makes no sense in '%s'", filename, line, section); + return -1; + } + + if (pa_atou(rvalue, &prio) < 0) { + pa_log("[%s:%u] Priority invalid of '%s'", filename, line, section); + return -1; + } + + o->priority = prio; + return 0; +} + +static int option_parse_name( + const char *filename, + unsigned line, + const char *section, + const char *lvalue, + const char *rvalue, + void *data, + void *userdata) { + + pa_alsa_path *p = userdata; + pa_alsa_option *o; + + pa_assert(p); + + if (!(o = option_get(p, section))) { + pa_log("[%s:%u] Name makes no sense in '%s'", filename, line, section); + return -1; + } + + pa_xfree(o->name); + o->name = pa_xstrdup(rvalue); + + return 0; +} + +static int element_parse_required( + const char *filename, + unsigned line, + const char *section, + const char *lvalue, + const char *rvalue, + void *data, + void *userdata) { + + pa_alsa_path *p = userdata; + pa_alsa_element *e; + pa_alsa_required_t req; + + pa_assert(p); + + if (!(e = element_get(p, section, TRUE))) { + pa_log("[%s:%u] Required makes no sense in '%s'", filename, line, section); + return -1; + } + + if (pa_streq(rvalue, "ignore")) + req = PA_ALSA_REQUIRED_IGNORE; + else if (pa_streq(rvalue, "switch")) + req = PA_ALSA_REQUIRED_SWITCH; + else if (pa_streq(rvalue, "volume")) + req = PA_ALSA_REQUIRED_VOLUME; + else if (pa_streq(rvalue, "enumeration")) + req = PA_ALSA_REQUIRED_ENUMERATION; + else if (pa_streq(rvalue, "any")) + req = PA_ALSA_REQUIRED_ANY; + else { + pa_log("[%s:%u] Required invalid of '%s'", filename, line, section); + return -1; + } + + if (pa_streq(lvalue, "required-absent")) + e->required_absent = req; + else + e->required = req; + + return 0; +} + +static int element_parse_direction( + const char *filename, + unsigned line, + const char *section, + const char *lvalue, + const char *rvalue, + void *data, + void *userdata) { + + pa_alsa_path *p = userdata; + pa_alsa_element *e; + + pa_assert(p); + + if (!(e = element_get(p, section, TRUE))) { + pa_log("[%s:%u] Direction makes no sense in '%s'", filename, line, section); + return -1; + } + + if (pa_streq(rvalue, "playback")) + e->direction = PA_ALSA_DIRECTION_OUTPUT; + else if (pa_streq(rvalue, "capture")) + e->direction = PA_ALSA_DIRECTION_INPUT; + else { + pa_log("[%s:%u] Direction invalid of '%s'", filename, line, section); + return -1; + } + + return 0; +} + +static int element_parse_direction_try_other( + const char *filename, + unsigned line, + const char *section, + const char *lvalue, + const char *rvalue, + void *data, + void *userdata) { + + pa_alsa_path *p = userdata; + pa_alsa_element *e; + int yes; + + if (!(e = element_get(p, section, TRUE))) { + pa_log("[%s:%u] Direction makes no sense in '%s'", filename, line, section); + return -1; + } + + if ((yes = pa_parse_boolean(rvalue)) < 0) { + pa_log("[%s:%u] Direction invalid of '%s'", filename, line, section); + return -1; + } + + e->direction_try_other = !!yes; + return 0; +} + +static pa_channel_position_mask_t parse_mask(const char *m) { + pa_channel_position_mask_t v; + + if (pa_streq(m, "all-left")) + v = PA_CHANNEL_POSITION_MASK_LEFT; + else if (pa_streq(m, "all-right")) + v = PA_CHANNEL_POSITION_MASK_RIGHT; + else if (pa_streq(m, "all-center")) + v = PA_CHANNEL_POSITION_MASK_CENTER; + else if (pa_streq(m, "all-front")) + v = PA_CHANNEL_POSITION_MASK_FRONT; + else if (pa_streq(m, "all-rear")) + v = PA_CHANNEL_POSITION_MASK_REAR; + else if (pa_streq(m, "all-side")) + v = PA_CHANNEL_POSITION_MASK_SIDE_OR_TOP_CENTER; + else if (pa_streq(m, "all-top")) + v = PA_CHANNEL_POSITION_MASK_TOP; + else if (pa_streq(m, "all-no-lfe")) + v = PA_CHANNEL_POSITION_MASK_ALL ^ PA_CHANNEL_POSITION_MASK(PA_CHANNEL_POSITION_LFE); + else if (pa_streq(m, "all")) + v = PA_CHANNEL_POSITION_MASK_ALL; + else { + pa_channel_position_t p; + + if ((p = pa_channel_position_from_string(m)) == PA_CHANNEL_POSITION_INVALID) + return 0; + + v = PA_CHANNEL_POSITION_MASK(p); + } + + return v; +} + +static int element_parse_override_map( + const char *filename, + unsigned line, + const char *section, + const char *lvalue, + const char *rvalue, + void *data, + void *userdata) { + + pa_alsa_path *p = userdata; + pa_alsa_element *e; + const char *state = NULL; + unsigned i = 0; + char *n; + + if (!(e = element_get(p, section, TRUE))) { + pa_log("[%s:%u] Override map makes no sense in '%s'", filename, line, section); + return -1; + } + + while ((n = pa_split(rvalue, ",", &state))) { + pa_channel_position_mask_t m; + + if (!*n) + m = 0; + else { + if ((m = parse_mask(n)) == 0) { + pa_log("[%s:%u] Override map '%s' invalid in '%s'", filename, line, n, section); + pa_xfree(n); + return -1; + } + } + + if (pa_streq(lvalue, "override-map.1")) + e->masks[i++][0] = m; + else + e->masks[i++][1] = m; + + /* Later on we might add override-map.3 and so on here ... */ + + pa_xfree(n); + } + + e->override_map = TRUE; + + return 0; +} + +static int element_set_option(pa_alsa_element *e, snd_mixer_t *m, int alsa_idx) { + snd_mixer_selem_id_t *sid; + snd_mixer_elem_t *me; + int r; + + pa_assert(e); + pa_assert(m); + + SELEM_INIT(sid, e->alsa_name); + if (!(me = snd_mixer_find_selem(m, sid))) { + pa_log_warn("Element %s seems to have disappeared.", e->alsa_name); + return -1; + } + + if (e->switch_use == PA_ALSA_SWITCH_SELECT) { + + if (e->direction == PA_ALSA_DIRECTION_OUTPUT) + r = snd_mixer_selem_set_playback_switch_all(me, alsa_idx); + else + r = snd_mixer_selem_set_capture_switch_all(me, alsa_idx); + + if (r < 0) + pa_log_warn("Faile to set switch of %s: %s", e->alsa_name, pa_alsa_strerror(errno)); + + } else { + pa_assert(e->enumeration_use == PA_ALSA_ENUMERATION_SELECT); + + if ((r = snd_mixer_selem_set_enum_item(me, 0, alsa_idx)) < 0) + pa_log_warn("Faile to set enumeration of %s: %s", e->alsa_name, pa_alsa_strerror(errno)); + } + + return r; +} + +int pa_alsa_setting_select(pa_alsa_setting *s, snd_mixer_t *m) { + pa_alsa_option *o; + uint32_t idx; + + pa_assert(s); + pa_assert(m); + + PA_IDXSET_FOREACH(o, s->options, idx) + element_set_option(o->element, m, o->alsa_idx); + + return 0; +} + +static int option_verify(pa_alsa_option *o) { + static const struct description_map well_known_descriptions[] = { + { "input", N_("Input") }, + { "input-docking", N_("Docking Station Input") }, + { "input-docking-microphone", N_("Docking Station Microphone") }, + { "input-linein", N_("Line-In") }, + { "input-microphone", N_("Microphone") }, + { "input-microphone-external", N_("External Microphone") }, + { "input-microphone-internal", N_("Internal Microphone") }, + { "input-radio", N_("Radio") }, + { "input-video", N_("Video") }, + { "input-agc-on", N_("Automatic Gain Control") }, + { "input-agc-off", N_("No Automatic Gain Control") }, + { "input-boost-on", N_("Boost") }, + { "input-boost-off", N_("No Boost") }, + { "output-amplifier-on", N_("Amplifier") }, + { "output-amplifier-off", N_("No Amplifier") }, + { "output-speaker", N_("Speaker") }, + { "output-headphones", N_("Headphones") } + }; + + pa_assert(o); + + if (!o->name) { + pa_log("No name set for option %s", o->alsa_name); + return -1; + } + + if (o->element->enumeration_use != PA_ALSA_ENUMERATION_SELECT && + o->element->switch_use != PA_ALSA_SWITCH_SELECT) { + pa_log("Element %s of option %s not set for select.", o->element->alsa_name, o->name); + return -1; + } + + if (o->element->switch_use == PA_ALSA_SWITCH_SELECT && + !pa_streq(o->alsa_name, "on") && + !pa_streq(o->alsa_name, "off")) { + pa_log("Switch %s options need be named off or on ", o->element->alsa_name); + return -1; + } + + if (!o->description) + o->description = pa_xstrdup(lookup_description(o->name, + well_known_descriptions, + PA_ELEMENTSOF(well_known_descriptions))); + if (!o->description) + o->description = pa_xstrdup(o->name); + + return 0; +} + +static int element_verify(pa_alsa_element *e) { + pa_alsa_option *o; + + pa_assert(e); + + if ((e->required != PA_ALSA_REQUIRED_IGNORE && e->required == e->required_absent) || + (e->required_absent == PA_ALSA_REQUIRED_ANY && e->required != PA_ALSA_REQUIRED_IGNORE)) { + pa_log("Element %s cannot be required and absent at the same time.", e->alsa_name); + return -1; + } + + if (e->switch_use == PA_ALSA_SWITCH_SELECT && e->enumeration_use == PA_ALSA_ENUMERATION_SELECT) { + pa_log("Element %s cannot set select for both switch and enumeration.", e->alsa_name); + return -1; + } + + PA_LLIST_FOREACH(o, e->options) + if (option_verify(o) < 0) + return -1; + + return 0; +} + +static int path_verify(pa_alsa_path *p) { + static const struct description_map well_known_descriptions[] = { + { "analog-input", N_("Analog Input") }, + { "analog-input-microphone", N_("Analog Microphone") }, + { "analog-input-linein", N_("Analog Line-In") }, + { "analog-input-radio", N_("Analog Radio") }, + { "analog-input-video", N_("Analog Video") }, + { "analog-output", N_("Analog Output") }, + { "analog-output-headphones", N_("Analog Headphones") }, + { "analog-output-lfe-on-mono", N_("Analog Output (LFE)") }, + { "analog-output-mono", N_("Analog Mono Output") }, + { "analog-output-headphones-2", N_("Analog Headphones 2") }, + { "analog-output-speaker", N_("Analog Speaker") } + }; + + pa_alsa_element *e; + + pa_assert(p); + + PA_LLIST_FOREACH(e, p->elements) + if (element_verify(e) < 0) + return -1; + + if (!p->description) + p->description = pa_xstrdup(lookup_description(p->name, + well_known_descriptions, + PA_ELEMENTSOF(well_known_descriptions))); + + if (!p->description) + p->description = pa_xstrdup(p->name); + + return 0; +} + +pa_alsa_path* pa_alsa_path_new(const char *fname, pa_alsa_direction_t direction) { + pa_alsa_path *p; + char *fn; + int r; + const char *n; + + pa_config_item items[] = { + /* [General] */ + { "priority", pa_config_parse_unsigned, NULL, "General" }, + { "description", pa_config_parse_string, NULL, "General" }, + { "name", pa_config_parse_string, NULL, "General" }, + + /* [Option ...] */ + { "priority", option_parse_priority, NULL, NULL }, + { "name", option_parse_name, NULL, NULL }, + + /* [Element ...] */ + { "switch", element_parse_switch, NULL, NULL }, + { "volume", element_parse_volume, NULL, NULL }, + { "enumeration", element_parse_enumeration, NULL, NULL }, + { "override-map.1", element_parse_override_map, NULL, NULL }, + { "override-map.2", element_parse_override_map, NULL, NULL }, + /* ... later on we might add override-map.3 and so on here ... */ + { "required", element_parse_required, NULL, NULL }, + { "required-absent", element_parse_required, NULL, NULL }, + { "direction", element_parse_direction, NULL, NULL }, + { "direction-try-other", element_parse_direction_try_other, NULL, NULL }, + { NULL, NULL, NULL, NULL } + }; + + pa_assert(fname); + + p = pa_xnew0(pa_alsa_path, 1); + n = pa_path_get_filename(fname); + p->name = pa_xstrndup(n, strcspn(n, ".")); + p->direction = direction; + + items[0].data = &p->priority; + items[1].data = &p->description; + items[2].data = &p->name; + + fn = pa_maybe_prefix_path(fname, +#if defined(__linux__) && !defined(__OPTIMIZE__) + pa_run_from_build_tree() ? PA_BUILDDIR "/modules/alsa/mixer/paths/" : +#endif + PA_ALSA_PATHS_DIR); + + r = pa_config_parse(fn, NULL, items, p); + pa_xfree(fn); + + if (r < 0) + goto fail; + + if (path_verify(p) < 0) + goto fail; + + return p; + +fail: + pa_alsa_path_free(p); + return NULL; +} + +pa_alsa_path* pa_alsa_path_synthesize(const char*element, pa_alsa_direction_t direction) { + pa_alsa_path *p; + pa_alsa_element *e; + + pa_assert(element); + + p = pa_xnew0(pa_alsa_path, 1); + p->name = pa_xstrdup(element); + p->direction = direction; + + e = pa_xnew0(pa_alsa_element, 1); + e->path = p; + e->alsa_name = pa_xstrdup(element); + e->direction = direction; + + e->switch_use = PA_ALSA_SWITCH_MUTE; + e->volume_use = PA_ALSA_VOLUME_MERGE; + + PA_LLIST_PREPEND(pa_alsa_element, p->elements, e); + return p; +} + +static pa_bool_t element_drop_unsupported(pa_alsa_element *e) { + pa_alsa_option *o, *n; + + pa_assert(e); + + for (o = e->options; o; o = n) { + n = o->next; + + if (o->alsa_idx < 0) { + PA_LLIST_REMOVE(pa_alsa_option, e->options, o); + option_free(o); + } + } + + return + e->switch_use != PA_ALSA_SWITCH_IGNORE || + e->volume_use != PA_ALSA_VOLUME_IGNORE || + e->enumeration_use != PA_ALSA_ENUMERATION_IGNORE; +} + +static void path_drop_unsupported(pa_alsa_path *p) { + pa_alsa_element *e, *n; + + pa_assert(p); + + for (e = p->elements; e; e = n) { + n = e->next; + + if (!element_drop_unsupported(e)) { + PA_LLIST_REMOVE(pa_alsa_element, p->elements, e); + element_free(e); + } + } +} + +static void path_make_options_unique(pa_alsa_path *p) { + pa_alsa_element *e; + pa_alsa_option *o, *u; + + PA_LLIST_FOREACH(e, p->elements) { + PA_LLIST_FOREACH(o, e->options) { + unsigned i; + char *m; + + for (u = o->next; u; u = u->next) + if (pa_streq(u->name, o->name)) + break; + + if (!u) + continue; + + m = pa_xstrdup(o->name); + + /* OK, this name is not unique, hence let's rename */ + for (i = 1, u = o; u; u = u->next) { + char *nn, *nd; + + if (!pa_streq(u->name, m)) + continue; + + nn = pa_sprintf_malloc("%s-%u", m, i); + pa_xfree(u->name); + u->name = nn; + + nd = pa_sprintf_malloc("%s %u", u->description, i); + pa_xfree(u->description); + u->description = nd; + + i++; + } + + pa_xfree(m); + } + } +} + +static pa_bool_t element_create_settings(pa_alsa_element *e, pa_alsa_setting *template) { + pa_alsa_option *o; + + for (; e; e = e->next) + if (e->switch_use == PA_ALSA_SWITCH_SELECT || + e->enumeration_use == PA_ALSA_ENUMERATION_SELECT) + break; + + if (!e) + return FALSE; + + for (o = e->options; o; o = o->next) { + pa_alsa_setting *s; + + if (template) { + s = pa_xnewdup(pa_alsa_setting, template, 1); + s->options = pa_idxset_copy(template->options); + s->name = pa_sprintf_malloc(_("%s+%s"), template->name, o->name); + s->description = + (template->description[0] && o->description[0]) + ? pa_sprintf_malloc(_("%s / %s"), template->description, o->description) + : (template->description[0] + ? pa_xstrdup(template->description) + : pa_xstrdup(o->description)); + + s->priority = PA_MAX(template->priority, o->priority); + } else { + s = pa_xnew0(pa_alsa_setting, 1); + s->options = pa_idxset_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func); + s->name = pa_xstrdup(o->name); + s->description = pa_xstrdup(o->description); + s->priority = o->priority; + } + + pa_idxset_put(s->options, o, NULL); + + if (element_create_settings(e->next, s)) + /* This is not a leaf, so let's get rid of it */ + setting_free(s); + else { + /* This is a leaf, so let's add it */ + PA_LLIST_INSERT_AFTER(pa_alsa_setting, e->path->settings, e->path->last_setting, s); + + e->path->last_setting = s; + } + } + + return TRUE; +} + +static void path_create_settings(pa_alsa_path *p) { + pa_assert(p); + + element_create_settings(p->elements, NULL); +} + +int pa_alsa_path_probe(pa_alsa_path *p, snd_mixer_t *m, pa_bool_t ignore_dB) { + pa_alsa_element *e; + double min_dB[PA_CHANNEL_POSITION_MAX], max_dB[PA_CHANNEL_POSITION_MAX]; + pa_channel_position_t t; + + pa_assert(p); + pa_assert(m); + + if (p->probed) + return 0; + + pa_zero(min_dB); + pa_zero(max_dB); + + pa_log_debug("Probing path '%s'", p->name); + + PA_LLIST_FOREACH(e, p->elements) { + if (element_probe(e, m) < 0) { + p->supported = FALSE; + pa_log_debug("Probe of element '%s' failed.", e->alsa_name); + return -1; + } + + if (ignore_dB) + e->has_dB = FALSE; + + if (e->volume_use == PA_ALSA_VOLUME_MERGE) { + + if (!p->has_volume) { + p->min_volume = e->min_volume; + p->max_volume = e->max_volume; + } + + if (e->has_dB) { + if (!p->has_volume) { + for (t = 0; t < PA_CHANNEL_POSITION_MAX; t++) + if (PA_CHANNEL_POSITION_MASK(t) & e->merged_mask) { + min_dB[t] = e->min_dB; + max_dB[t] = e->max_dB; + } + + p->has_dB = TRUE; + } else { + + if (p->has_dB) { + for (t = 0; t < PA_CHANNEL_POSITION_MAX; t++) + if (PA_CHANNEL_POSITION_MASK(t) & e->merged_mask) { + min_dB[t] += e->min_dB; + max_dB[t] += e->max_dB; + } + } else + /* Hmm, there's another element before us + * which cannot do dB volumes, so we we need + * to 'neutralize' this slider */ + e->volume_use = PA_ALSA_VOLUME_ZERO; + } + } else if (p->has_volume) + /* We can't use this volume, so let's ignore it */ + e->volume_use = PA_ALSA_VOLUME_IGNORE; + + p->has_volume = TRUE; + } + + if (e->switch_use == PA_ALSA_SWITCH_MUTE) + p->has_mute = TRUE; + } + + path_drop_unsupported(p); + path_make_options_unique(p); + path_create_settings(p); + + p->supported = TRUE; + p->probed = TRUE; + + p->min_dB = INFINITY; + p->max_dB = -INFINITY; + + for (t = 0; t < PA_CHANNEL_POSITION_MAX; t++) { + if (p->min_dB > min_dB[t]) + p->min_dB = min_dB[t]; + + if (p->max_dB < max_dB[t]) + p->max_dB = max_dB[t]; + } + + return 0; +} + +void pa_alsa_setting_dump(pa_alsa_setting *s) { + pa_assert(s); + + pa_log_debug("Setting %s (%s) priority=%u", + s->name, + pa_strnull(s->description), + s->priority); +} + +void pa_alsa_option_dump(pa_alsa_option *o) { + pa_assert(o); + + pa_log_debug("Option %s (%s/%s) index=%i, priority=%u", + o->alsa_name, + pa_strnull(o->name), + pa_strnull(o->description), + o->alsa_idx, + o->priority); +} + +void pa_alsa_element_dump(pa_alsa_element *e) { + pa_alsa_option *o; + pa_assert(e); + + pa_log_debug("Element %s, direction=%i, switch=%i, volume=%i, enumeration=%i, required=%i, required_absent=%i, mask=0x%llx, n_channels=%u, override_map=%s", + e->alsa_name, + e->direction, + e->switch_use, + e->volume_use, + e->enumeration_use, + e->required, + e->required_absent, + (long long unsigned) e->merged_mask, + e->n_channels, + pa_yes_no(e->override_map)); + + PA_LLIST_FOREACH(o, e->options) + pa_alsa_option_dump(o); +} + +void pa_alsa_path_dump(pa_alsa_path *p) { + pa_alsa_element *e; + pa_alsa_setting *s; + pa_assert(p); + + pa_log_debug("Path %s (%s), direction=%i, priority=%u, probed=%s, supported=%s, has_mute=%s, has_volume=%s, " + "has_dB=%s, min_volume=%li, max_volume=%li, min_dB=%g, max_dB=%g", + p->name, + pa_strnull(p->description), + p->direction, + p->priority, + pa_yes_no(p->probed), + pa_yes_no(p->supported), + pa_yes_no(p->has_mute), + pa_yes_no(p->has_volume), + pa_yes_no(p->has_dB), + p->min_volume, p->max_volume, + p->min_dB, p->max_dB); + + PA_LLIST_FOREACH(e, p->elements) + pa_alsa_element_dump(e); + + PA_LLIST_FOREACH(s, p->settings) + pa_alsa_setting_dump(s); +} + +static void element_set_callback(pa_alsa_element *e, snd_mixer_t *m, snd_mixer_elem_callback_t cb, void *userdata) { + snd_mixer_selem_id_t *sid; + snd_mixer_elem_t *me; + + pa_assert(e); + pa_assert(m); + pa_assert(cb); + + SELEM_INIT(sid, e->alsa_name); + if (!(me = snd_mixer_find_selem(m, sid))) { + pa_log_warn("Element %s seems to have disappeared.", e->alsa_name); + return; + } + + snd_mixer_elem_set_callback(me, cb); + snd_mixer_elem_set_callback_private(me, userdata); +} + +void pa_alsa_path_set_callback(pa_alsa_path *p, snd_mixer_t *m, snd_mixer_elem_callback_t cb, void *userdata) { + pa_alsa_element *e; + + pa_assert(p); + pa_assert(m); + pa_assert(cb); + + PA_LLIST_FOREACH(e, p->elements) + element_set_callback(e, m, cb, userdata); +} + +void pa_alsa_path_set_set_callback(pa_alsa_path_set *ps, snd_mixer_t *m, snd_mixer_elem_callback_t cb, void *userdata) { + pa_alsa_path *p; + + pa_assert(ps); + pa_assert(m); + pa_assert(cb); + + PA_LLIST_FOREACH(p, ps->paths) + pa_alsa_path_set_callback(p, m, cb, userdata); +} + +pa_alsa_path_set *pa_alsa_path_set_new(pa_alsa_mapping *m, pa_alsa_direction_t direction) { + pa_alsa_path_set *ps; + char **pn = NULL, **en = NULL, **ie; + + pa_assert(m); + pa_assert(direction == PA_ALSA_DIRECTION_OUTPUT || direction == PA_ALSA_DIRECTION_INPUT); + + if (m->direction != PA_ALSA_DIRECTION_ANY && m->direction != direction) + return NULL; + + ps = pa_xnew0(pa_alsa_path_set, 1); + ps->direction = direction; + + if (direction == PA_ALSA_DIRECTION_OUTPUT) + pn = m->output_path_names; + else if (direction == PA_ALSA_DIRECTION_INPUT) + pn = m->input_path_names; + + if (pn) { + char **in; + + for (in = pn; *in; in++) { + pa_alsa_path *p; + pa_bool_t duplicate = FALSE; + char **kn, *fn; + + for (kn = pn; kn != in; kn++) + if (pa_streq(*kn, *in)) { + duplicate = TRUE; + break; + } + + if (duplicate) + continue; + + fn = pa_sprintf_malloc("%s.conf", *in); + + if ((p = pa_alsa_path_new(fn, direction))) { + p->path_set = ps; + PA_LLIST_INSERT_AFTER(pa_alsa_path, ps->paths, ps->last_path, p); + ps->last_path = p; + } + + pa_xfree(fn); + } + + return ps; + } + + if (direction == PA_ALSA_DIRECTION_OUTPUT) + en = m->output_element; + else if (direction == PA_ALSA_DIRECTION_INPUT) + en = m->input_element; + + if (!en) { + pa_alsa_path_set_free(ps); + return NULL; + } + + for (ie = en; *ie; ie++) { + char **je; + pa_alsa_path *p; + + p = pa_alsa_path_synthesize(*ie, direction); + p->path_set = ps; + + /* Mark all other passed elements for require-absent */ + for (je = en; *je; je++) { + pa_alsa_element *e; + e = pa_xnew0(pa_alsa_element, 1); + e->path = p; + e->alsa_name = pa_xstrdup(*je); + e->direction = direction; + e->required_absent = PA_ALSA_REQUIRED_ANY; + + PA_LLIST_INSERT_AFTER(pa_alsa_element, p->elements, p->last_element, e); + p->last_element = e; + } + + PA_LLIST_INSERT_AFTER(pa_alsa_path, ps->paths, ps->last_path, p); + ps->last_path = p; + } + + return ps; +} + +void pa_alsa_path_set_dump(pa_alsa_path_set *ps) { + pa_alsa_path *p; + pa_assert(ps); + + pa_log_debug("Path Set %p, direction=%i, probed=%s", + (void*) ps, + ps->direction, + pa_yes_no(ps->probed)); + + PA_LLIST_FOREACH(p, ps->paths) + pa_alsa_path_dump(p); +} + +static void path_set_unify(pa_alsa_path_set *ps) { + pa_alsa_path *p; + pa_bool_t has_dB = TRUE, has_volume = TRUE, has_mute = TRUE; + pa_assert(ps); + + /* We have issues dealing with paths that vary too wildly. That + * means for now we have to have all paths support volume/mute/dB + * or none. */ + + PA_LLIST_FOREACH(p, ps->paths) { + pa_assert(p->probed); + + if (!p->has_volume) + has_volume = FALSE; + else if (!p->has_dB) + has_dB = FALSE; + + if (!p->has_mute) + has_mute = FALSE; + } + + if (!has_volume || !has_dB || !has_mute) { + + if (!has_volume) + pa_log_debug("Some paths of the device lack hardware volume control, disabling hardware control altogether."); + else if (!has_dB) + pa_log_debug("Some paths of the device lack dB information, disabling dB logic altogether."); + + if (!has_mute) + pa_log_debug("Some paths of the device lack hardware mute control, disabling hardware control altogether."); + + PA_LLIST_FOREACH(p, ps->paths) { + if (!has_volume) + p->has_volume = FALSE; + else if (!has_dB) + p->has_dB = FALSE; + + if (!has_mute) + p->has_mute = FALSE; + } + } +} + +static void path_set_make_paths_unique(pa_alsa_path_set *ps) { + pa_alsa_path *p, *q; + + PA_LLIST_FOREACH(p, ps->paths) { + unsigned i; + char *m; + + for (q = p->next; q; q = q->next) + if (pa_streq(q->name, p->name)) + break; + + if (!q) + continue; + + m = pa_xstrdup(p->name); + + /* OK, this name is not unique, hence let's rename */ + for (i = 1, q = p; q; q = q->next) { + char *nn, *nd; + + if (!pa_streq(q->name, m)) + continue; + + nn = pa_sprintf_malloc("%s-%u", m, i); + pa_xfree(q->name); + q->name = nn; + + nd = pa_sprintf_malloc("%s %u", q->description, i); + pa_xfree(q->description); + q->description = nd; + + i++; + } + + pa_xfree(m); + } +} + +void pa_alsa_path_set_probe(pa_alsa_path_set *ps, snd_mixer_t *m, pa_bool_t ignore_dB) { + pa_alsa_path *p, *n; + + pa_assert(ps); + + if (ps->probed) + return; + + for (p = ps->paths; p; p = n) { + n = p->next; + + if (pa_alsa_path_probe(p, m, ignore_dB) < 0) { + PA_LLIST_REMOVE(pa_alsa_path, ps->paths, p); + pa_alsa_path_free(p); + } + } + + path_set_unify(ps); + path_set_make_paths_unique(ps); + ps->probed = TRUE; +} + +static void mapping_free(pa_alsa_mapping *m) { + pa_assert(m); + + pa_xfree(m->name); + pa_xfree(m->description); + + pa_xstrfreev(m->device_strings); + pa_xstrfreev(m->input_path_names); + pa_xstrfreev(m->output_path_names); + pa_xstrfreev(m->input_element); + pa_xstrfreev(m->output_element); + + pa_assert(!m->input_pcm); + pa_assert(!m->output_pcm); + + pa_xfree(m); +} + +static void profile_free(pa_alsa_profile *p) { + pa_assert(p); + + pa_xfree(p->name); + pa_xfree(p->description); + + pa_xstrfreev(p->input_mapping_names); + pa_xstrfreev(p->output_mapping_names); + + if (p->input_mappings) + pa_idxset_free(p->input_mappings, NULL, NULL); + + if (p->output_mappings) + pa_idxset_free(p->output_mappings, NULL, NULL); + + pa_xfree(p); +} + +void pa_alsa_profile_set_free(pa_alsa_profile_set *ps) { + pa_assert(ps); + + if (ps->profiles) { + pa_alsa_profile *p; + + while ((p = pa_hashmap_steal_first(ps->profiles))) + profile_free(p); + + pa_hashmap_free(ps->profiles, NULL, NULL); + } + + if (ps->mappings) { + pa_alsa_mapping *m; + + while ((m = pa_hashmap_steal_first(ps->mappings))) + mapping_free(m); + + pa_hashmap_free(ps->mappings, NULL, NULL); + } + + pa_xfree(ps); +} + +static pa_alsa_mapping *mapping_get(pa_alsa_profile_set *ps, const char *name) { + pa_alsa_mapping *m; + + if (!pa_startswith(name, "Mapping ")) + return NULL; + + name += 8; + + if ((m = pa_hashmap_get(ps->mappings, name))) + return m; + + m = pa_xnew0(pa_alsa_mapping, 1); + m->profile_set = ps; + m->name = pa_xstrdup(name); + pa_channel_map_init(&m->channel_map); + + pa_hashmap_put(ps->mappings, m->name, m); + + return m; +} + +static pa_alsa_profile *profile_get(pa_alsa_profile_set *ps, const char *name) { + pa_alsa_profile *p; + + if (!pa_startswith(name, "Profile ")) + return NULL; + + name += 8; + + if ((p = pa_hashmap_get(ps->profiles, name))) + return p; + + p = pa_xnew0(pa_alsa_profile, 1); + p->profile_set = ps; + p->name = pa_xstrdup(name); + + pa_hashmap_put(ps->profiles, p->name, p); + + return p; +} + +static int mapping_parse_device_strings( + const char *filename, + unsigned line, + const char *section, + const char *lvalue, + const char *rvalue, + void *data, + void *userdata) { + + pa_alsa_profile_set *ps = userdata; + pa_alsa_mapping *m; + + pa_assert(ps); + + if (!(m = mapping_get(ps, section))) { + pa_log("[%s:%u] %s invalid in section %s", filename, line, lvalue, section); + return -1; + } + + pa_xstrfreev(m->device_strings); + if (!(m->device_strings = pa_split_spaces_strv(rvalue))) { + pa_log("[%s:%u] Device string list empty of '%s'", filename, line, section); + return -1; + } + + return 0; +} + +static int mapping_parse_channel_map( + const char *filename, + unsigned line, + const char *section, + const char *lvalue, + const char *rvalue, + void *data, + void *userdata) { + + pa_alsa_profile_set *ps = userdata; + pa_alsa_mapping *m; + + pa_assert(ps); + + if (!(m = mapping_get(ps, section))) { + pa_log("[%s:%u] %s invalid in section %s", filename, line, lvalue, section); + return -1; + } + + if (!(pa_channel_map_parse(&m->channel_map, rvalue))) { + pa_log("[%s:%u] Channel map invalid of '%s'", filename, line, section); + return -1; + } + + return 0; +} + +static int mapping_parse_paths( + const char *filename, + unsigned line, + const char *section, + const char *lvalue, + const char *rvalue, + void *data, + void *userdata) { + + pa_alsa_profile_set *ps = userdata; + pa_alsa_mapping *m; + + pa_assert(ps); + + if (!(m = mapping_get(ps, section))) { + pa_log("[%s:%u] %s invalid in section %s", filename, line, lvalue, section); + return -1; + } + + if (pa_streq(lvalue, "paths-input")) { + pa_xstrfreev(m->input_path_names); + m->input_path_names = pa_split_spaces_strv(rvalue); + } else { + pa_xstrfreev(m->output_path_names); + m->output_path_names = pa_split_spaces_strv(rvalue); + } + + return 0; +} + +static int mapping_parse_element( + const char *filename, + unsigned line, + const char *section, + const char *lvalue, + const char *rvalue, + void *data, + void *userdata) { + + pa_alsa_profile_set *ps = userdata; + pa_alsa_mapping *m; + + pa_assert(ps); + + if (!(m = mapping_get(ps, section))) { + pa_log("[%s:%u] %s invalid in section %s", filename, line, lvalue, section); + return -1; + } + + if (pa_streq(lvalue, "element-input")) { + pa_xstrfreev(m->input_element); + m->input_element = pa_split_spaces_strv(rvalue); + } else { + pa_xstrfreev(m->output_element); + m->output_element = pa_split_spaces_strv(rvalue); + } + + return 0; +} + +static int mapping_parse_direction( + const char *filename, + unsigned line, + const char *section, + const char *lvalue, + const char *rvalue, + void *data, + void *userdata) { + + pa_alsa_profile_set *ps = userdata; + pa_alsa_mapping *m; + + pa_assert(ps); + + if (!(m = mapping_get(ps, section))) { + pa_log("[%s:%u] Section name %s invalid.", filename, line, section); + return -1; + } + + if (pa_streq(rvalue, "input")) + m->direction = PA_ALSA_DIRECTION_INPUT; + else if (pa_streq(rvalue, "output")) + m->direction = PA_ALSA_DIRECTION_OUTPUT; + else if (pa_streq(rvalue, "any")) + m->direction = PA_ALSA_DIRECTION_ANY; + else { + pa_log("[%s:%u] Direction %s invalid.", filename, line, rvalue); + return -1; + } + + return 0; +} + +static int mapping_parse_description( + const char *filename, + unsigned line, + const char *section, + const char *lvalue, + const char *rvalue, + void *data, + void *userdata) { + + pa_alsa_profile_set *ps = userdata; + pa_alsa_profile *p; + pa_alsa_mapping *m; + + pa_assert(ps); + + if ((m = mapping_get(ps, section))) { + pa_xstrdup(m->description); + m->description = pa_xstrdup(rvalue); + } else if ((p = profile_get(ps, section))) { + pa_xfree(p->description); + p->description = pa_xstrdup(rvalue); + } else { + pa_log("[%s:%u] Section name %s invalid.", filename, line, section); + return -1; + } + + return 0; +} + +static int mapping_parse_priority( + const char *filename, + unsigned line, + const char *section, + const char *lvalue, + const char *rvalue, + void *data, + void *userdata) { + + pa_alsa_profile_set *ps = userdata; + pa_alsa_profile *p; + pa_alsa_mapping *m; + uint32_t prio; + + pa_assert(ps); + + if (pa_atou(rvalue, &prio) < 0) { + pa_log("[%s:%u] Priority invalid of '%s'", filename, line, section); + return -1; + } + + if ((m = mapping_get(ps, section))) + m->priority = prio; + else if ((p = profile_get(ps, section))) + p->priority = prio; + else { + pa_log("[%s:%u] Section name %s invalid.", filename, line, section); + return -1; + } + + return 0; +} + +static int profile_parse_mappings( + const char *filename, + unsigned line, + const char *section, + const char *lvalue, + const char *rvalue, + void *data, + void *userdata) { + + pa_alsa_profile_set *ps = userdata; + pa_alsa_profile *p; + + pa_assert(ps); + + if (!(p = profile_get(ps, section))) { + pa_log("[%s:%u] %s invalid in section %s", filename, line, lvalue, section); + return -1; + } + + if (pa_streq(lvalue, "input-mappings")) { + pa_xstrfreev(p->input_mapping_names); + p->input_mapping_names = pa_split_spaces_strv(rvalue); + } else { + pa_xstrfreev(p->output_mapping_names); + p->output_mapping_names = pa_split_spaces_strv(rvalue); + } + + return 0; +} + +static int profile_parse_skip_probe( + const char *filename, + unsigned line, + const char *section, + const char *lvalue, + const char *rvalue, + void *data, + void *userdata) { + + pa_alsa_profile_set *ps = userdata; + pa_alsa_profile *p; + int b; + + pa_assert(ps); + + if (!(p = profile_get(ps, section))) { + pa_log("[%s:%u] %s invalid in section %s", filename, line, lvalue, section); + return -1; + } + + if ((b = pa_parse_boolean(rvalue)) < 0) { + pa_log("[%s:%u] Skip probe invalid of '%s'", filename, line, section); + return -1; + } + + p->supported = b; + + return 0; +} + +static int mapping_verify(pa_alsa_mapping *m, const pa_channel_map *bonus) { + + static const struct description_map well_known_descriptions[] = { + { "analog-mono", N_("Analog Mono") }, + { "analog-stereo", N_("Analog Stereo") }, + { "analog-surround-21", N_("Analog Surround 2.1") }, + { "analog-surround-30", N_("Analog Surround 3.0") }, + { "analog-surround-31", N_("Analog Surround 3.1") }, + { "analog-surround-40", N_("Analog Surround 4.0") }, + { "analog-surround-41", N_("Analog Surround 4.1") }, + { "analog-surround-50", N_("Analog Surround 5.0") }, + { "analog-surround-51", N_("Analog Surround 5.1") }, + { "analog-surround-61", N_("Analog Surround 6.0") }, + { "analog-surround-61", N_("Analog Surround 6.1") }, + { "analog-surround-70", N_("Analog Surround 7.0") }, + { "analog-surround-71", N_("Analog Surround 7.1") }, + { "iec958-stereo", N_("Digital Stereo (IEC958)") }, + { "iec958-surround-40", N_("Digital Surround 4.0 (IEC958)") }, + { "iec958-ac3-surround-40", N_("Digital Surround 4.0 (IEC958/AC3)") }, + { "iec958-ac3-surround-51", N_("Digital Surround 5.1 (IEC958/AC3)") }, + { "hdmi-stereo", N_("Digital Stereo (HDMI)") } + }; + + pa_assert(m); + + if (!pa_channel_map_valid(&m->channel_map)) { + pa_log("Mapping %s is missing channel map.", m->name); + return -1; + } + + if (!m->device_strings) { + pa_log("Mapping %s is missing device strings.", m->name); + return -1; + } + + if ((m->input_path_names && m->input_element) || + (m->output_path_names && m->output_element)) { + pa_log("Mapping %s must have either mixer path or mixer elment, not both.", m->name); + return -1; + } + + if (!m->description) + m->description = pa_xstrdup(lookup_description(m->name, + well_known_descriptions, + PA_ELEMENTSOF(well_known_descriptions))); + + if (!m->description) + m->description = pa_xstrdup(m->name); + + if (bonus) { + if (pa_channel_map_equal(&m->channel_map, bonus)) + m->priority += 50; + else if (m->channel_map.channels == bonus->channels) + m->priority += 30; + } + + return 0; +} + +void pa_alsa_mapping_dump(pa_alsa_mapping *m) { + char cm[PA_CHANNEL_MAP_SNPRINT_MAX]; + + pa_assert(m); + + pa_log_debug("Mapping %s (%s), priority=%u, channel_map=%s, supported=%s, direction=%i", + m->name, + pa_strnull(m->description), + m->priority, + pa_channel_map_snprint(cm, sizeof(cm), &m->channel_map), + pa_yes_no(m->supported), + m->direction); +} + +static void profile_set_add_auto_pair( + pa_alsa_profile_set *ps, + pa_alsa_mapping *m, /* output */ + pa_alsa_mapping *n /* input */) { + + char *name; + pa_alsa_profile *p; + + pa_assert(ps); + pa_assert(m || n); + + if (m && m->direction == PA_ALSA_DIRECTION_INPUT) + return; + + if (n && n->direction == PA_ALSA_DIRECTION_OUTPUT) + return; + + if (m && n) + name = pa_sprintf_malloc("output:%s+input:%s", m->name, n->name); + else if (m) + name = pa_sprintf_malloc("output:%s", m->name); + else + name = pa_sprintf_malloc("input:%s", n->name); + + if (pa_hashmap_get(ps->profiles, name)) { + pa_xfree(name); + return; + } + + p = pa_xnew0(pa_alsa_profile, 1); + p->profile_set = ps; + p->name = name; + + if (m) { + p->output_mappings = pa_idxset_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func); + pa_idxset_put(p->output_mappings, m, NULL); + p->priority += m->priority * 100; + } + + if (n) { + p->input_mappings = pa_idxset_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func); + pa_idxset_put(p->input_mappings, n, NULL); + p->priority += n->priority; + } + + pa_hashmap_put(ps->profiles, p->name, p); +} + +static void profile_set_add_auto(pa_alsa_profile_set *ps) { + pa_alsa_mapping *m, *n; + void *m_state, *n_state; + + pa_assert(ps); + + PA_HASHMAP_FOREACH(m, ps->mappings, m_state) { + profile_set_add_auto_pair(ps, m, NULL); + + PA_HASHMAP_FOREACH(n, ps->mappings, n_state) + profile_set_add_auto_pair(ps, m, n); + } + + PA_HASHMAP_FOREACH(n, ps->mappings, n_state) + profile_set_add_auto_pair(ps, NULL, n); +} + +static int profile_verify(pa_alsa_profile *p) { + + static const struct description_map well_known_descriptions[] = { + { "output:analog-mono+input:analog-mono", N_("Analog Mono Duplex") }, + { "output:analog-stereo+input:analog-stereo", N_("Analog Stereo Duplex") }, + { "output:iec958-stereo", N_("Digital Stereo Duplex (IEC958)") }, + { "off", N_("Off") } + }; + + pa_assert(p); + + /* Replace the output mapping names by the actual mappings */ + if (p->output_mapping_names) { + char **name; + + pa_assert(!p->output_mappings); + p->output_mappings = pa_idxset_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func); + + for (name = p->output_mapping_names; *name; name++) { + pa_alsa_mapping *m; + char **in; + pa_bool_t duplicate = FALSE; + + for (in = name + 1; *in; in++) + if (pa_streq(*name, *in)) { + duplicate = TRUE; + break; + } + + if (duplicate) + continue; + + if (!(m = pa_hashmap_get(p->profile_set->mappings, *name)) || m->direction == PA_ALSA_DIRECTION_INPUT) { + pa_log("Profile '%s' refers to unexistant mapping '%s'.", p->name, *name); + return -1; + } + + pa_idxset_put(p->output_mappings, m, NULL); + + if (p->supported) + m->supported++; + } + + pa_xstrfreev(p->output_mapping_names); + p->output_mapping_names = NULL; + } + + /* Replace the input mapping names by the actual mappings */ + if (p->input_mapping_names) { + char **name; + + pa_assert(!p->input_mappings); + p->input_mappings = pa_idxset_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func); + + for (name = p->input_mapping_names; *name; name++) { + pa_alsa_mapping *m; + char **in; + pa_bool_t duplicate = FALSE; + + for (in = name + 1; *in; in++) + if (pa_streq(*name, *in)) { + duplicate = TRUE; + break; + } + + if (duplicate) + continue; + + if (!(m = pa_hashmap_get(p->profile_set->mappings, *name)) || m->direction == PA_ALSA_DIRECTION_OUTPUT) { + pa_log("Profile '%s' refers to unexistant mapping '%s'.", p->name, *name); + return -1; + } + + pa_idxset_put(p->input_mappings, m, NULL); + + if (p->supported) + m->supported++; + } + + pa_xstrfreev(p->input_mapping_names); + p->input_mapping_names = NULL; + } + + if (!p->input_mappings && !p->output_mappings) { + pa_log("Profile '%s' lacks mappings.", p->name); + return -1; + } + + if (!p->description) + p->description = pa_xstrdup(lookup_description(p->name, + well_known_descriptions, + PA_ELEMENTSOF(well_known_descriptions))); + + if (!p->description) { + pa_strbuf *sb; + uint32_t idx; + pa_alsa_mapping *m; + + sb = pa_strbuf_new(); + + if (p->output_mappings) + PA_IDXSET_FOREACH(m, p->output_mappings, idx) { + if (!pa_strbuf_isempty(sb)) + pa_strbuf_puts(sb, " + "); + + pa_strbuf_printf(sb, "%s Output", m->description); + } + + if (p->input_mappings) + PA_IDXSET_FOREACH(m, p->input_mappings, idx) { + if (!pa_strbuf_isempty(sb)) + pa_strbuf_puts(sb, " + "); + + pa_strbuf_printf(sb, "%s Input", m->description); + } + + p->description = pa_strbuf_tostring_free(sb); + } + + return 0; +} + +void pa_alsa_profile_dump(pa_alsa_profile *p) { + uint32_t idx; + pa_alsa_mapping *m; + pa_assert(p); + + pa_log_debug("Profile %s (%s), priority=%u, supported=%s n_input_mappings=%u, n_output_mappings=%u", + p->name, + pa_strnull(p->description), + p->priority, + pa_yes_no(p->supported), + p->input_mappings ? pa_idxset_size(p->input_mappings) : 0, + p->output_mappings ? pa_idxset_size(p->output_mappings) : 0); + + if (p->input_mappings) + PA_IDXSET_FOREACH(m, p->input_mappings, idx) + pa_log_debug("Input %s", m->name); + + if (p->output_mappings) + PA_IDXSET_FOREACH(m, p->output_mappings, idx) + pa_log_debug("Output %s", m->name); +} + +pa_alsa_profile_set* pa_alsa_profile_set_new(const char *fname, const pa_channel_map *bonus) { + pa_alsa_profile_set *ps; + pa_alsa_profile *p; + pa_alsa_mapping *m; + char *fn; + int r; + void *state; + + static pa_config_item items[] = { + /* [General] */ + { "auto-profiles", pa_config_parse_bool, NULL, "General" }, + + /* [Mapping ...] */ + { "device-strings", mapping_parse_device_strings, NULL, NULL }, + { "channel-map", mapping_parse_channel_map, NULL, NULL }, + { "paths-input", mapping_parse_paths, NULL, NULL }, + { "paths-output", mapping_parse_paths, NULL, NULL }, + { "element-input", mapping_parse_element, NULL, NULL }, + { "element-output", mapping_parse_element, NULL, NULL }, + { "direction", mapping_parse_direction, NULL, NULL }, + + /* Shared by [Mapping ...] and [Profile ...] */ + { "description", mapping_parse_description, NULL, NULL }, + { "priority", mapping_parse_priority, NULL, NULL }, + + /* [Profile ...] */ + { "input-mappings", profile_parse_mappings, NULL, NULL }, + { "output-mappings", profile_parse_mappings, NULL, NULL }, + { "skip-probe", profile_parse_skip_probe, NULL, NULL }, + { NULL, NULL, NULL, NULL } + }; + + ps = pa_xnew0(pa_alsa_profile_set, 1); + ps->mappings = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func); + ps->profiles = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func); + + items[0].data = &ps->auto_profiles; + + if (!fname) + fname = "default.conf"; + + fn = pa_maybe_prefix_path(fname, +#if defined(__linux__) && !defined(__OPTIMIZE__) + pa_run_from_build_tree() ? PA_BUILDDIR "/modules/alsa/mixer/profile-sets/" : +#endif + PA_ALSA_PROFILE_SETS_DIR); + + r = pa_config_parse(fn, NULL, items, ps); + pa_xfree(fn); + + if (r < 0) + goto fail; + + PA_HASHMAP_FOREACH(m, ps->mappings, state) + if (mapping_verify(m, bonus) < 0) + goto fail; + + if (ps->auto_profiles) + profile_set_add_auto(ps); + + PA_HASHMAP_FOREACH(p, ps->profiles, state) + if (profile_verify(p) < 0) + goto fail; + + return ps; + +fail: + pa_alsa_profile_set_free(ps); + return NULL; +} + +void pa_alsa_profile_set_probe( + pa_alsa_profile_set *ps, + const char *dev_id, + const pa_sample_spec *ss, + unsigned default_n_fragments, + unsigned default_fragment_size_msec) { + + void *state; + pa_alsa_profile *p, *last = NULL; + pa_alsa_mapping *m; + + pa_assert(ps); + pa_assert(dev_id); + pa_assert(ss); + + if (ps->probed) + return; + + PA_HASHMAP_FOREACH(p, ps->profiles, state) { + pa_sample_spec try_ss; + pa_channel_map try_map; + snd_pcm_uframes_t try_period_size, try_buffer_size; + uint32_t idx; + + /* Is this already marked that it is supported? (i.e. from the config file) */ + if (p->supported) + continue; + + pa_log_debug("Looking at profile %s", p->name); + + /* Close PCMs from the last iteration we don't need anymore */ + if (last && last->output_mappings) + PA_IDXSET_FOREACH(m, last->output_mappings, idx) { + + if (!m->output_pcm) + break; + + if (last->supported) + m->supported++; + + if (!p->output_mappings || !pa_idxset_get_by_data(p->output_mappings, m, NULL)) { + snd_pcm_close(m->output_pcm); + m->output_pcm = NULL; + } + } + + if (last && last->input_mappings) + PA_IDXSET_FOREACH(m, last->input_mappings, idx) { + + if (!m->input_pcm) + break; + + if (last->supported) + m->supported++; + + if (!p->input_mappings || !pa_idxset_get_by_data(p->input_mappings, m, NULL)) { + snd_pcm_close(m->input_pcm); + m->input_pcm = NULL; + } + } + + p->supported = TRUE; + + /* Check if we can open all new ones */ + if (p->output_mappings) + PA_IDXSET_FOREACH(m, p->output_mappings, idx) { + + if (m->output_pcm) + continue; + + pa_log_debug("Checking for playback on %s (%s)", m->description, m->name); + try_map = m->channel_map; + try_ss = *ss; + try_ss.channels = try_map.channels; + + try_period_size = + pa_usec_to_bytes(default_fragment_size_msec * PA_USEC_PER_MSEC, &try_ss) / + pa_frame_size(&try_ss); + try_buffer_size = default_n_fragments * try_period_size; + + if (!(m ->output_pcm = pa_alsa_open_by_template( + m->device_strings, + dev_id, + NULL, + &try_ss, &try_map, + SND_PCM_STREAM_PLAYBACK, + &try_period_size, &try_buffer_size, 0, NULL, NULL, + TRUE))) { + p->supported = FALSE; + break; + } + } + + if (p->input_mappings && p->supported) + PA_IDXSET_FOREACH(m, p->input_mappings, idx) { + + if (m->input_pcm) + continue; + + pa_log_debug("Checking for recording on %s (%s)", m->description, m->name); + try_map = m->channel_map; + try_ss = *ss; + try_ss.channels = try_map.channels; + + try_period_size = + pa_usec_to_bytes(default_fragment_size_msec*PA_USEC_PER_MSEC, &try_ss) / + pa_frame_size(&try_ss); + try_buffer_size = default_n_fragments * try_period_size; + + if (!(m ->input_pcm = pa_alsa_open_by_template( + m->device_strings, + dev_id, + NULL, + &try_ss, &try_map, + SND_PCM_STREAM_CAPTURE, + &try_period_size, &try_buffer_size, 0, NULL, NULL, + TRUE))) { + p->supported = FALSE; + break; + } + } + + last = p; + + if (p->supported) + pa_log_debug("Profile %s supported.", p->name); + } + + /* Clean up */ + if (last) { + uint32_t idx; + + if (last->output_mappings) + PA_IDXSET_FOREACH(m, last->output_mappings, idx) + if (m->output_pcm) { + + if (last->supported) + m->supported++; + + snd_pcm_close(m->output_pcm); + m->output_pcm = NULL; + } + + if (last->input_mappings) + PA_IDXSET_FOREACH(m, last->input_mappings, idx) + if (m->input_pcm) { + + if (last->supported) + m->supported++; + + snd_pcm_close(m->input_pcm); + m->input_pcm = NULL; + } + } + + PA_HASHMAP_FOREACH(p, ps->profiles, state) + if (!p->supported) { + pa_hashmap_remove(ps->profiles, p->name); + profile_free(p); + } + + PA_HASHMAP_FOREACH(m, ps->mappings, state) + if (m->supported <= 0) { + pa_hashmap_remove(ps->mappings, m->name); + mapping_free(m); + } + + ps->probed = TRUE; +} + +void pa_alsa_profile_set_dump(pa_alsa_profile_set *ps) { + pa_alsa_profile *p; + pa_alsa_mapping *m; + void *state; + + pa_assert(ps); + + pa_log_debug("Profile set %p, auto_profiles=%s, probed=%s, n_mappings=%u, n_profiles=%u", + (void*) + ps, + pa_yes_no(ps->auto_profiles), + pa_yes_no(ps->probed), + pa_hashmap_size(ps->mappings), + pa_hashmap_size(ps->profiles)); + + PA_HASHMAP_FOREACH(m, ps->mappings, state) + pa_alsa_mapping_dump(m); + + PA_HASHMAP_FOREACH(p, ps->profiles, state) + pa_alsa_profile_dump(p); +} + +void pa_alsa_add_ports(pa_hashmap **p, pa_alsa_path_set *ps) { + pa_alsa_path *path; + + pa_assert(p); + pa_assert(!*p); + pa_assert(ps); + + /* if there is no path, we don't want a port list */ + if (!ps->paths) + return; + + if (!ps->paths->next){ + pa_alsa_setting *s; + + /* If there is only one path, but no or only one setting, then + * we want a port list either */ + if (!ps->paths->settings || !ps->paths->settings->next) + return; + + /* Ok, there is only one path, however with multiple settings, + * so let's create a port for each setting */ + *p = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func); + + PA_LLIST_FOREACH(s, ps->paths->settings) { + pa_device_port *port; + pa_alsa_port_data *data; + + port = pa_device_port_new(s->name, s->description, sizeof(pa_alsa_port_data)); + port->priority = s->priority; + + data = PA_DEVICE_PORT_DATA(port); + data->path = ps->paths; + data->setting = s; + + pa_hashmap_put(*p, port->name, port); + } + + } else { + + /* We have multiple paths, so let's create a port for each + * one, and each of each settings */ + *p = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func); + + PA_LLIST_FOREACH(path, ps->paths) { + + if (!path->settings || !path->settings->next) { + pa_device_port *port; + pa_alsa_port_data *data; + + /* If there is no or just one setting we only need a + * single entry */ + + port = pa_device_port_new(path->name, path->description, sizeof(pa_alsa_port_data)); + port->priority = path->priority * 100; + + + data = PA_DEVICE_PORT_DATA(port); + data->path = path; + data->setting = path->settings; + + pa_hashmap_put(*p, port->name, port); + } else { + pa_alsa_setting *s; + + PA_LLIST_FOREACH(s, path->settings) { + pa_device_port *port; + pa_alsa_port_data *data; + char *n, *d; + + n = pa_sprintf_malloc("%s;%s", path->name, s->name); + + if (s->description[0]) + d = pa_sprintf_malloc(_("%s / %s"), path->description, s->description); + else + d = pa_xstrdup(path->description); + + port = pa_device_port_new(n, d, sizeof(pa_alsa_port_data)); + port->priority = path->priority * 100 + s->priority; + + pa_xfree(n); + pa_xfree(d); + + data = PA_DEVICE_PORT_DATA(port); + data->path = path; + data->setting = s; + + pa_hashmap_put(*p, port->name, port); + } + } + } + } + + pa_log_debug("Added %u ports", pa_hashmap_size(*p)); +} diff --git a/src/modules/alsa/alsa-mixer.h b/src/modules/alsa/alsa-mixer.h new file mode 100644 index 0000000..a0d4fcb --- /dev/null +++ b/src/modules/alsa/alsa-mixer.h @@ -0,0 +1,292 @@ +#ifndef fooalsamixerhfoo +#define fooalsamixerhfoo + +/*** + This file is part of PulseAudio. + + Copyright 2004-2006 Lennart Poettering + Copyright 2006 Pierre Ossman for Cendio AB + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +typedef struct pa_alsa_fdlist pa_alsa_fdlist; +typedef struct pa_alsa_setting pa_alsa_setting; +typedef struct pa_alsa_option pa_alsa_option; +typedef struct pa_alsa_element pa_alsa_element; +typedef struct pa_alsa_path pa_alsa_path; +typedef struct pa_alsa_path_set pa_alsa_path_set; +typedef struct pa_alsa_mapping pa_alsa_mapping; +typedef struct pa_alsa_profile pa_alsa_profile; +typedef struct pa_alsa_profile_set pa_alsa_profile_set; +typedef struct pa_alsa_port_data pa_alsa_port_data; + +#include "alsa-util.h" + +typedef enum pa_alsa_switch_use { + PA_ALSA_SWITCH_IGNORE, + PA_ALSA_SWITCH_MUTE, /* make this switch follow mute status */ + PA_ALSA_SWITCH_OFF, /* set this switch to 'off' unconditionally */ + PA_ALSA_SWITCH_ON, /* set this switch to 'on' unconditionally */ + PA_ALSA_SWITCH_SELECT /* allow the user to select switch status through a setting */ +} pa_alsa_switch_use_t; + +typedef enum pa_alsa_volume_use { + PA_ALSA_VOLUME_IGNORE, + PA_ALSA_VOLUME_MERGE, /* merge this volume slider into the global volume slider */ + PA_ALSA_VOLUME_OFF, /* set this volume to minimal unconditionally */ + PA_ALSA_VOLUME_ZERO /* set this volume to 0dB unconditionally */ +} pa_alsa_volume_use_t; + +typedef enum pa_alsa_enumeration_use { + PA_ALSA_ENUMERATION_IGNORE, + PA_ALSA_ENUMERATION_SELECT +} pa_alsa_enumeration_use_t; + +typedef enum pa_alsa_required { + PA_ALSA_REQUIRED_IGNORE, + PA_ALSA_REQUIRED_SWITCH, + PA_ALSA_REQUIRED_VOLUME, + PA_ALSA_REQUIRED_ENUMERATION, + PA_ALSA_REQUIRED_ANY +} pa_alsa_required_t; + +typedef enum pa_alsa_direction { + PA_ALSA_DIRECTION_ANY, + PA_ALSA_DIRECTION_OUTPUT, + PA_ALSA_DIRECTION_INPUT +} pa_alsa_direction_t; + +/* A setting combines a couple of options into a single entity that + * may be selected. Only one setting can be active at the same + * time. */ +struct pa_alsa_setting { + pa_alsa_path *path; + PA_LLIST_FIELDS(pa_alsa_setting); + + pa_idxset *options; + + char *name; + char *description; + unsigned priority; +}; + +/* An option belongs to an element and refers to one enumeration item + * of the element is an enumeration item, or a switch status if the + * element is a switch item. */ +struct pa_alsa_option { + pa_alsa_element *element; + PA_LLIST_FIELDS(pa_alsa_option); + + char *alsa_name; + int alsa_idx; + + char *name; + char *description; + unsigned priority; +}; + +/* And element wraps one specific ALSA element. A series of elements * +make up a path (see below). If the element is an enumeration or switch +* element it may includes a list of options. */ +struct pa_alsa_element { + pa_alsa_path *path; + PA_LLIST_FIELDS(pa_alsa_element); + + char *alsa_name; + pa_alsa_direction_t direction; + + pa_alsa_switch_use_t switch_use; + pa_alsa_volume_use_t volume_use; + pa_alsa_enumeration_use_t enumeration_use; + + pa_alsa_required_t required; + pa_alsa_required_t required_absent; + + pa_bool_t override_map:1; + pa_bool_t direction_try_other:1; + + pa_bool_t has_dB:1; + long min_volume, max_volume; + double min_dB, max_dB; + + pa_channel_position_mask_t masks[SND_MIXER_SCHN_LAST][2]; + unsigned n_channels; + + pa_channel_position_mask_t merged_mask; + + PA_LLIST_HEAD(pa_alsa_option, options); +}; + +/* A path wraps a series of elements into a single entity which can be + * used to control it as if it had a single volume slider, a single + * mute switch and a single list of selectable options. */ +struct pa_alsa_path { + pa_alsa_path_set *path_set; + PA_LLIST_FIELDS(pa_alsa_path); + + pa_alsa_direction_t direction; + + char *name; + char *description; + unsigned priority; + + pa_bool_t probed:1; + pa_bool_t supported:1; + pa_bool_t has_mute:1; + pa_bool_t has_volume:1; + pa_bool_t has_dB:1; + + long min_volume, max_volume; + double min_dB, max_dB; + + /* This is used during parsing only, as a shortcut so that we + * don't have to iterate the list all the time */ + pa_alsa_element *last_element; + pa_alsa_option *last_option; + pa_alsa_setting *last_setting; + + PA_LLIST_HEAD(pa_alsa_element, elements); + PA_LLIST_HEAD(pa_alsa_setting, settings); +}; + +/* A path set is simply a set of paths that are applicable to a + * device */ +struct pa_alsa_path_set { + PA_LLIST_HEAD(pa_alsa_path, paths); + pa_alsa_direction_t direction; + pa_bool_t probed:1; + + /* This is used during parsing only, as a shortcut so that we + * don't have to iterate the list all the time */ + pa_alsa_path *last_path; +}; + +int pa_alsa_setting_select(pa_alsa_setting *s, snd_mixer_t *m); +void pa_alsa_setting_dump(pa_alsa_setting *s); + +void pa_alsa_option_dump(pa_alsa_option *o); + +void pa_alsa_element_dump(pa_alsa_element *e); + +pa_alsa_path *pa_alsa_path_new(const char *fname, pa_alsa_direction_t direction); +pa_alsa_path *pa_alsa_path_synthesize(const char *element, pa_alsa_direction_t direction); +int pa_alsa_path_probe(pa_alsa_path *p, snd_mixer_t *m, pa_bool_t ignore_dB); +void pa_alsa_path_dump(pa_alsa_path *p); +int pa_alsa_path_get_volume(pa_alsa_path *p, snd_mixer_t *m, const pa_channel_map *cm, pa_cvolume *v); +int pa_alsa_path_get_mute(pa_alsa_path *path, snd_mixer_t *m, pa_bool_t *muted); +int pa_alsa_path_set_volume(pa_alsa_path *path, snd_mixer_t *m, const pa_channel_map *cm, pa_cvolume *v); +int pa_alsa_path_set_mute(pa_alsa_path *path, snd_mixer_t *m, pa_bool_t muted); +int pa_alsa_path_select(pa_alsa_path *p, snd_mixer_t *m); +void pa_alsa_path_set_callback(pa_alsa_path *p, snd_mixer_t *m, snd_mixer_elem_callback_t cb, void *userdata); +void pa_alsa_path_free(pa_alsa_path *p); + +pa_alsa_path_set *pa_alsa_path_set_new(pa_alsa_mapping *m, pa_alsa_direction_t direction); +void pa_alsa_path_set_probe(pa_alsa_path_set *s, snd_mixer_t *m, pa_bool_t ignore_dB); +void pa_alsa_path_set_dump(pa_alsa_path_set *s); +void pa_alsa_path_set_set_callback(pa_alsa_path_set *ps, snd_mixer_t *m, snd_mixer_elem_callback_t cb, void *userdata); +void pa_alsa_path_set_free(pa_alsa_path_set *s); + +struct pa_alsa_mapping { + pa_alsa_profile_set *profile_set; + + char *name; + char *description; + unsigned priority; + pa_alsa_direction_t direction; + + pa_channel_map channel_map; + + char **device_strings; + + char **input_path_names; + char **output_path_names; + char **input_element; /* list of fallbacks */ + char **output_element; + + unsigned supported; + + /* Temporarily used during probing */ + snd_pcm_t *input_pcm; + snd_pcm_t *output_pcm; + + pa_sink *sink; + pa_source *source; +}; + +struct pa_alsa_profile { + pa_alsa_profile_set *profile_set; + + char *name; + char *description; + unsigned priority; + + pa_bool_t supported:1; + + char **input_mapping_names; + char **output_mapping_names; + + pa_idxset *input_mappings; + pa_idxset *output_mappings; +}; + +struct pa_alsa_profile_set { + pa_hashmap *mappings; + pa_hashmap *profiles; + + pa_bool_t auto_profiles; + pa_bool_t probed:1; +}; + +void pa_alsa_mapping_dump(pa_alsa_mapping *m); +void pa_alsa_profile_dump(pa_alsa_profile *p); + +pa_alsa_profile_set* pa_alsa_profile_set_new(const char *fname, const pa_channel_map *bonus); +void pa_alsa_profile_set_probe(pa_alsa_profile_set *ps, const char *dev_id, const pa_sample_spec *ss, unsigned default_n_fragments, unsigned default_fragment_size_msec); +void pa_alsa_profile_set_free(pa_alsa_profile_set *s); +void pa_alsa_profile_set_dump(pa_alsa_profile_set *s); + +snd_mixer_t *pa_alsa_open_mixer_for_pcm(snd_pcm_t *pcm, char **ctl_device); + +pa_alsa_fdlist *pa_alsa_fdlist_new(void); +void pa_alsa_fdlist_free(pa_alsa_fdlist *fdl); +int pa_alsa_fdlist_set_mixer(pa_alsa_fdlist *fdl, snd_mixer_t *mixer_handle, pa_mainloop_api* m); + +/* Data structure for inclusion in pa_device_port for alsa + * sinks/sources. This contains nothing that needs to be freed + * individually */ +struct pa_alsa_port_data { + pa_alsa_path *path; + pa_alsa_setting *setting; +}; + +void pa_alsa_add_ports(pa_hashmap **p, pa_alsa_path_set *ps); + +#endif diff --git a/src/modules/alsa/alsa-sink.c b/src/modules/alsa/alsa-sink.c new file mode 100644 index 0000000..1ab8d84 --- /dev/null +++ b/src/modules/alsa/alsa-sink.c @@ -0,0 +1,2043 @@ +/*** + This file is part of PulseAudio. + + Copyright 2004-2008 Lennart Poettering + Copyright 2006 Pierre Ossman for Cendio AB + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include + +#ifdef HAVE_VALGRIND_MEMCHECK_H +#include +#endif + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "alsa-util.h" +#include "alsa-sink.h" + +#define ALSA_SUSPEND_ON_IDLE_TIMEOUT "0" + +//#define DEBUG_TIMING + +#ifdef DEBUG_TIMING +#include +#endif + +#define DEFAULT_DEVICE "default" + +#define DEFAULT_TSCHED_BUFFER_USEC (2*PA_USEC_PER_SEC) /* 2s -- Overall buffer size */ +#define DEFAULT_TSCHED_WATERMARK_USEC (20*PA_USEC_PER_MSEC) /* 20ms -- Fill up when only this much is left in the buffer */ + +#define TSCHED_WATERMARK_INC_STEP_USEC (10*PA_USEC_PER_MSEC) /* 10ms -- On underrun, increase watermark by this */ +#define TSCHED_WATERMARK_DEC_STEP_USEC (5*PA_USEC_PER_MSEC) /* 5ms -- When everything's great, decrease watermark by this */ +#define TSCHED_WATERMARK_VERIFY_AFTER_USEC (20*PA_USEC_PER_SEC) /* 20s -- How long after a drop out recheck if things are good now */ +#define TSCHED_WATERMARK_INC_THRESHOLD_USEC (0*PA_USEC_PER_MSEC) /* 0ms -- If the buffer level ever below this theshold, increase the watermark */ +#define TSCHED_WATERMARK_DEC_THRESHOLD_USEC (100*PA_USEC_PER_MSEC) /* 100ms -- If the buffer level didn't drop below this theshold in the verification time, decrease the watermark */ + +/* Note that TSCHED_WATERMARK_INC_THRESHOLD_USEC == 0 means tht we + * will increase the watermark only if we hit a real underrun. */ + +#define TSCHED_MIN_SLEEP_USEC (10*PA_USEC_PER_MSEC) /* 10ms -- Sleep at least 10ms on each iteration */ +#define TSCHED_MIN_WAKEUP_USEC (4*PA_USEC_PER_MSEC) /* 4ms -- Wakeup at least this long before the buffer runs empty*/ + +#define SMOOTHER_MIN_INTERVAL (2*PA_USEC_PER_MSEC) /* 2ms -- min smoother update interval */ +#define SMOOTHER_MAX_INTERVAL (200*PA_USEC_PER_MSEC) /* 200ms -- max smoother update inteval */ + +#define VOLUME_ACCURACY (PA_VOLUME_NORM/100) /* don't require volume adjustments to be perfectly correct. don't necessarily extend granularity in software unless the differences get greater than this level */ + +struct userdata { + pa_core *core; + pa_module *module; + pa_sink *sink; + + pa_thread *thread; + pa_thread_mq thread_mq; + pa_rtpoll *rtpoll; + + snd_pcm_t *pcm_handle; + + pa_alsa_fdlist *mixer_fdl; + snd_mixer_t *mixer_handle; + pa_alsa_path_set *mixer_path_set; + pa_alsa_path *mixer_path; + + pa_cvolume hardware_volume; + + size_t + frame_size, + fragment_size, + hwbuf_size, + tsched_watermark, + hwbuf_unused, + min_sleep, + min_wakeup, + watermark_inc_step, + watermark_dec_step, + watermark_inc_threshold, + watermark_dec_threshold; + + pa_usec_t watermark_dec_not_before; + + pa_memchunk memchunk; + + char *device_name; /* name of the PCM device */ + char *control_device; /* name of the control device */ + + pa_bool_t use_mmap:1, use_tsched:1; + + pa_bool_t first, after_rewind; + + pa_rtpoll_item *alsa_rtpoll_item; + + snd_mixer_selem_channel_id_t mixer_map[SND_MIXER_SCHN_LAST]; + + pa_smoother *smoother; + uint64_t write_count; + uint64_t since_start; + pa_usec_t smoother_interval; + pa_usec_t last_smoother_update; + + pa_reserve_wrapper *reserve; + pa_hook_slot *reserve_slot; + pa_reserve_monitor_wrapper *monitor; + pa_hook_slot *monitor_slot; +}; + +static void userdata_free(struct userdata *u); + +static pa_hook_result_t reserve_cb(pa_reserve_wrapper *r, void *forced, struct userdata *u) { + pa_assert(r); + pa_assert(u); + + if (pa_sink_suspend(u->sink, TRUE, PA_SUSPEND_APPLICATION) < 0) + return PA_HOOK_CANCEL; + + return PA_HOOK_OK; +} + +static void reserve_done(struct userdata *u) { + pa_assert(u); + + if (u->reserve_slot) { + pa_hook_slot_free(u->reserve_slot); + u->reserve_slot = NULL; + } + + if (u->reserve) { + pa_reserve_wrapper_unref(u->reserve); + u->reserve = NULL; + } +} + +static void reserve_update(struct userdata *u) { + const char *description; + pa_assert(u); + + if (!u->sink || !u->reserve) + return; + + if ((description = pa_proplist_gets(u->sink->proplist, PA_PROP_DEVICE_DESCRIPTION))) + pa_reserve_wrapper_set_application_device_name(u->reserve, description); +} + +static int reserve_init(struct userdata *u, const char *dname) { + char *rname; + + pa_assert(u); + pa_assert(dname); + + if (u->reserve) + return 0; + + if (pa_in_system_mode()) + return 0; + + if (!(rname = pa_alsa_get_reserve_name(dname))) + return 0; + + /* We are resuming, try to lock the device */ + u->reserve = pa_reserve_wrapper_get(u->core, rname); + pa_xfree(rname); + + if (!(u->reserve)) + return -1; + + reserve_update(u); + + pa_assert(!u->reserve_slot); + u->reserve_slot = pa_hook_connect(pa_reserve_wrapper_hook(u->reserve), PA_HOOK_NORMAL, (pa_hook_cb_t) reserve_cb, u); + + return 0; +} + +static pa_hook_result_t monitor_cb(pa_reserve_monitor_wrapper *w, void* busy, struct userdata *u) { + pa_bool_t b; + + pa_assert(w); + pa_assert(u); + + b = PA_PTR_TO_UINT(busy) && !u->reserve; + + pa_sink_suspend(u->sink, b, PA_SUSPEND_APPLICATION); + return PA_HOOK_OK; +} + +static void monitor_done(struct userdata *u) { + pa_assert(u); + + if (u->monitor_slot) { + pa_hook_slot_free(u->monitor_slot); + u->monitor_slot = NULL; + } + + if (u->monitor) { + pa_reserve_monitor_wrapper_unref(u->monitor); + u->monitor = NULL; + } +} + +static int reserve_monitor_init(struct userdata *u, const char *dname) { + char *rname; + + pa_assert(u); + pa_assert(dname); + + if (pa_in_system_mode()) + return 0; + + if (!(rname = pa_alsa_get_reserve_name(dname))) + return 0; + + u->monitor = pa_reserve_monitor_wrapper_get(u->core, rname); + pa_xfree(rname); + + if (!(u->monitor)) + return -1; + + pa_assert(!u->monitor_slot); + u->monitor_slot = pa_hook_connect(pa_reserve_monitor_wrapper_hook(u->monitor), PA_HOOK_NORMAL, (pa_hook_cb_t) monitor_cb, u); + + return 0; +} + +static void fix_min_sleep_wakeup(struct userdata *u) { + size_t max_use, max_use_2; + + pa_assert(u); + pa_assert(u->use_tsched); + + max_use = u->hwbuf_size - u->hwbuf_unused; + max_use_2 = pa_frame_align(max_use/2, &u->sink->sample_spec); + + u->min_sleep = pa_usec_to_bytes(TSCHED_MIN_SLEEP_USEC, &u->sink->sample_spec); + u->min_sleep = PA_CLAMP(u->min_sleep, u->frame_size, max_use_2); + + u->min_wakeup = pa_usec_to_bytes(TSCHED_MIN_WAKEUP_USEC, &u->sink->sample_spec); + u->min_wakeup = PA_CLAMP(u->min_wakeup, u->frame_size, max_use_2); +} + +static void fix_tsched_watermark(struct userdata *u) { + size_t max_use; + pa_assert(u); + pa_assert(u->use_tsched); + + max_use = u->hwbuf_size - u->hwbuf_unused; + + if (u->tsched_watermark > max_use - u->min_sleep) + u->tsched_watermark = max_use - u->min_sleep; + + if (u->tsched_watermark < u->min_wakeup) + u->tsched_watermark = u->min_wakeup; +} + +static void increase_watermark(struct userdata *u) { + size_t old_watermark; + pa_usec_t old_min_latency, new_min_latency; + + pa_assert(u); + pa_assert(u->use_tsched); + + /* First, just try to increase the watermark */ + old_watermark = u->tsched_watermark; + u->tsched_watermark = PA_MIN(u->tsched_watermark * 2, u->tsched_watermark + u->watermark_inc_step); + fix_tsched_watermark(u); + + if (old_watermark != u->tsched_watermark) { + pa_log_info("Increasing wakeup watermark to %0.2f ms", + (double) pa_bytes_to_usec(u->tsched_watermark, &u->sink->sample_spec) / PA_USEC_PER_MSEC); + return; + } + + /* Hmm, we cannot increase the watermark any further, hence let's raise the latency */ + old_min_latency = u->sink->thread_info.min_latency; + new_min_latency = PA_MIN(old_min_latency * 2, old_min_latency + TSCHED_WATERMARK_INC_STEP_USEC); + new_min_latency = PA_MIN(new_min_latency, u->sink->thread_info.max_latency); + + if (old_min_latency != new_min_latency) { + pa_log_info("Increasing minimal latency to %0.2f ms", + (double) new_min_latency / PA_USEC_PER_MSEC); + + pa_sink_set_latency_range_within_thread(u->sink, new_min_latency, u->sink->thread_info.max_latency); + } + + /* When we reach this we're officialy fucked! */ +} + +static void decrease_watermark(struct userdata *u) { + size_t old_watermark; + pa_usec_t now; + + pa_assert(u); + pa_assert(u->use_tsched); + + now = pa_rtclock_now(); + + if (u->watermark_dec_not_before <= 0) + goto restart; + + if (u->watermark_dec_not_before > now) + return; + + old_watermark = u->tsched_watermark; + + if (u->tsched_watermark < u->watermark_dec_step) + u->tsched_watermark = u->tsched_watermark / 2; + else + u->tsched_watermark = PA_MAX(u->tsched_watermark / 2, u->tsched_watermark - u->watermark_dec_step); + + fix_tsched_watermark(u); + + if (old_watermark != u->tsched_watermark) + pa_log_info("Decreasing wakeup watermark to %0.2f ms", + (double) pa_bytes_to_usec(u->tsched_watermark, &u->sink->sample_spec) / PA_USEC_PER_MSEC); + + /* We don't change the latency range*/ + +restart: + u->watermark_dec_not_before = now + TSCHED_WATERMARK_VERIFY_AFTER_USEC; +} + +static void hw_sleep_time(struct userdata *u, pa_usec_t *sleep_usec, pa_usec_t*process_usec) { + pa_usec_t usec, wm; + + pa_assert(sleep_usec); + pa_assert(process_usec); + + pa_assert(u); + pa_assert(u->use_tsched); + + usec = pa_sink_get_requested_latency_within_thread(u->sink); + + if (usec == (pa_usec_t) -1) + usec = pa_bytes_to_usec(u->hwbuf_size, &u->sink->sample_spec); + + wm = pa_bytes_to_usec(u->tsched_watermark, &u->sink->sample_spec); + + if (wm > usec) + wm = usec/2; + + *sleep_usec = usec - wm; + *process_usec = wm; + +#ifdef DEBUG_TIMING + pa_log_debug("Buffer time: %lu ms; Sleep time: %lu ms; Process time: %lu ms", + (unsigned long) (usec / PA_USEC_PER_MSEC), + (unsigned long) (*sleep_usec / PA_USEC_PER_MSEC), + (unsigned long) (*process_usec / PA_USEC_PER_MSEC)); +#endif +} + +static int try_recover(struct userdata *u, const char *call, int err) { + pa_assert(u); + pa_assert(call); + pa_assert(err < 0); + + pa_log_debug("%s: %s", call, pa_alsa_strerror(err)); + + pa_assert(err != -EAGAIN); + + if (err == -EPIPE) + pa_log_debug("%s: Buffer underrun!", call); + + if (err == -ESTRPIPE) + pa_log_debug("%s: System suspended!", call); + + if ((err = snd_pcm_recover(u->pcm_handle, err, 1)) < 0) { + pa_log("%s: %s", call, pa_alsa_strerror(err)); + return -1; + } + + u->first = TRUE; + u->since_start = 0; + return 0; +} + +static size_t check_left_to_play(struct userdata *u, size_t n_bytes, pa_bool_t on_timeout) { + size_t left_to_play; + pa_bool_t underrun = FALSE; + + /* We use <= instead of < for this check here because an underrun + * only happens after the last sample was processed, not already when + * it is removed from the buffer. This is particularly important + * when block transfer is used. */ + + if (n_bytes <= u->hwbuf_size) + left_to_play = u->hwbuf_size - n_bytes; + else { + + /* We got a dropout. What a mess! */ + left_to_play = 0; + underrun = TRUE; + +#ifdef DEBUG_TIMING + PA_DEBUG_TRAP; +#endif + + if (!u->first && !u->after_rewind) + if (pa_log_ratelimit()) + pa_log_info("Underrun!"); + } + +#ifdef DEBUG_TIMING + pa_log_debug("%0.2f ms left to play; inc threshold = %0.2f ms; dec threshold = %0.2f ms", + (double) pa_bytes_to_usec(left_to_play, &u->sink->sample_spec) / PA_USEC_PER_MSEC, + (double) pa_bytes_to_usec(u->watermark_inc_threshold, &u->sink->sample_spec) / PA_USEC_PER_MSEC, + (double) pa_bytes_to_usec(u->watermark_dec_threshold, &u->sink->sample_spec) / PA_USEC_PER_MSEC); +#endif + + if (u->use_tsched) { + pa_bool_t reset_not_before = TRUE; + + if (!u->first && !u->after_rewind) { + if (underrun || left_to_play < u->watermark_inc_threshold) + increase_watermark(u); + else if (left_to_play > u->watermark_dec_threshold) { + reset_not_before = FALSE; + + /* We decrease the watermark only if have actually + * been woken up by a timeout. If something else woke + * us up it's too easy to fulfill the deadlines... */ + + if (on_timeout) + decrease_watermark(u); + } + } + + if (reset_not_before) + u->watermark_dec_not_before = 0; + } + + return left_to_play; +} + +static int mmap_write(struct userdata *u, pa_usec_t *sleep_usec, pa_bool_t polled, pa_bool_t on_timeout) { + pa_bool_t work_done = TRUE; + pa_usec_t max_sleep_usec = 0, process_usec = 0; + size_t left_to_play; + unsigned j = 0; + + pa_assert(u); + pa_sink_assert_ref(u->sink); + + if (u->use_tsched) + hw_sleep_time(u, &max_sleep_usec, &process_usec); + + for (;;) { + snd_pcm_sframes_t n; + size_t n_bytes; + int r; + pa_bool_t after_avail = TRUE; + + /* First we determine how many samples are missing to fill the + * buffer up to 100% */ + + if (PA_UNLIKELY((n = pa_alsa_safe_avail(u->pcm_handle, u->hwbuf_size, &u->sink->sample_spec)) < 0)) { + + if ((r = try_recover(u, "snd_pcm_avail", (int) n)) == 0) + continue; + + return r; + } + + n_bytes = (size_t) n * u->frame_size; + +#ifdef DEBUG_TIMING + pa_log_debug("avail: %lu", (unsigned long) n_bytes); +#endif + + left_to_play = check_left_to_play(u, n_bytes, on_timeout); + on_timeout = FALSE; + + if (u->use_tsched) + + /* We won't fill up the playback buffer before at least + * half the sleep time is over because otherwise we might + * ask for more data from the clients then they expect. We + * need to guarantee that clients only have to keep around + * a single hw buffer length. */ + + if (!polled && + pa_bytes_to_usec(left_to_play, &u->sink->sample_spec) > process_usec+max_sleep_usec/2) { +#ifdef DEBUG_TIMING + pa_log_debug("Not filling up, because too early."); +#endif + break; + } + + if (PA_UNLIKELY(n_bytes <= u->hwbuf_unused)) { + + if (polled) + PA_ONCE_BEGIN { + char *dn = pa_alsa_get_driver_name_by_pcm(u->pcm_handle); + pa_log(_("ALSA woke us up to write new data to the device, but there was actually nothing to write!\n" + "Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.\n" + "We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() returned 0 or another value < min_avail."), + pa_strnull(dn)); + pa_xfree(dn); + } PA_ONCE_END; + +#ifdef DEBUG_TIMING + pa_log_debug("Not filling up, because not necessary."); +#endif + break; + } + + + if (++j > 10) { +#ifdef DEBUG_TIMING + pa_log_debug("Not filling up, because already too many iterations."); +#endif + + break; + } + + n_bytes -= u->hwbuf_unused; + polled = FALSE; + +#ifdef DEBUG_TIMING + pa_log_debug("Filling up"); +#endif + + for (;;) { + pa_memchunk chunk; + void *p; + int err; + const snd_pcm_channel_area_t *areas; + snd_pcm_uframes_t offset, frames; + snd_pcm_sframes_t sframes; + + frames = (snd_pcm_uframes_t) (n_bytes / u->frame_size); +/* pa_log_debug("%lu frames to write", (unsigned long) frames); */ + + if (PA_UNLIKELY((err = pa_alsa_safe_mmap_begin(u->pcm_handle, &areas, &offset, &frames, u->hwbuf_size, &u->sink->sample_spec)) < 0)) { + + if (!after_avail && err == -EAGAIN) + break; + + if ((r = try_recover(u, "snd_pcm_mmap_begin", err)) == 0) + continue; + + return r; + } + + /* Make sure that if these memblocks need to be copied they will fit into one slot */ + if (frames > pa_mempool_block_size_max(u->sink->core->mempool)/u->frame_size) + frames = pa_mempool_block_size_max(u->sink->core->mempool)/u->frame_size; + + if (!after_avail && frames == 0) + break; + + pa_assert(frames > 0); + after_avail = FALSE; + + /* Check these are multiples of 8 bit */ + pa_assert((areas[0].first & 7) == 0); + pa_assert((areas[0].step & 7)== 0); + + /* We assume a single interleaved memory buffer */ + pa_assert((areas[0].first >> 3) == 0); + pa_assert((areas[0].step >> 3) == u->frame_size); + + p = (uint8_t*) areas[0].addr + (offset * u->frame_size); + + chunk.memblock = pa_memblock_new_fixed(u->core->mempool, p, frames * u->frame_size, TRUE); + chunk.length = pa_memblock_get_length(chunk.memblock); + chunk.index = 0; + + pa_sink_render_into_full(u->sink, &chunk); + pa_memblock_unref_fixed(chunk.memblock); + + if (PA_UNLIKELY((sframes = snd_pcm_mmap_commit(u->pcm_handle, offset, frames)) < 0)) { + + if ((r = try_recover(u, "snd_pcm_mmap_commit", (int) sframes)) == 0) + continue; + + return r; + } + + work_done = TRUE; + + u->write_count += frames * u->frame_size; + u->since_start += frames * u->frame_size; + +#ifdef DEBUG_TIMING + pa_log_debug("Wrote %lu bytes (of possible %lu bytes)", (unsigned long) (frames * u->frame_size), (unsigned long) n_bytes); +#endif + + if ((size_t) frames * u->frame_size >= n_bytes) + break; + + n_bytes -= (size_t) frames * u->frame_size; + } + } + + *sleep_usec = pa_bytes_to_usec(left_to_play, &u->sink->sample_spec); + + if (*sleep_usec > process_usec) + *sleep_usec -= process_usec; + else + *sleep_usec = 0; + + return work_done ? 1 : 0; +} + +static int unix_write(struct userdata *u, pa_usec_t *sleep_usec, pa_bool_t polled, pa_bool_t on_timeout) { + pa_bool_t work_done = FALSE; + pa_usec_t max_sleep_usec = 0, process_usec = 0; + size_t left_to_play; + unsigned j = 0; + + pa_assert(u); + pa_sink_assert_ref(u->sink); + + if (u->use_tsched) + hw_sleep_time(u, &max_sleep_usec, &process_usec); + + for (;;) { + snd_pcm_sframes_t n; + size_t n_bytes; + int r; + pa_bool_t after_avail = TRUE; + + if (PA_UNLIKELY((n = pa_alsa_safe_avail(u->pcm_handle, u->hwbuf_size, &u->sink->sample_spec)) < 0)) { + + if ((r = try_recover(u, "snd_pcm_avail", (int) n)) == 0) + continue; + + return r; + } + + n_bytes = (size_t) n * u->frame_size; + left_to_play = check_left_to_play(u, n_bytes, on_timeout); + on_timeout = FALSE; + + if (u->use_tsched) + + /* We won't fill up the playback buffer before at least + * half the sleep time is over because otherwise we might + * ask for more data from the clients then they expect. We + * need to guarantee that clients only have to keep around + * a single hw buffer length. */ + + if (!polled && + pa_bytes_to_usec(left_to_play, &u->sink->sample_spec) > process_usec+max_sleep_usec/2) + break; + + if (PA_UNLIKELY(n_bytes <= u->hwbuf_unused)) { + + if (polled) + PA_ONCE_BEGIN { + char *dn = pa_alsa_get_driver_name_by_pcm(u->pcm_handle); + pa_log(_("ALSA woke us up to write new data to the device, but there was actually nothing to write!\n" + "Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.\n" + "We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() returned 0 or another value < min_avail."), + pa_strnull(dn)); + pa_xfree(dn); + } PA_ONCE_END; + + break; + } + + if (++j > 10) { +#ifdef DEBUG_TIMING + pa_log_debug("Not filling up, because already too many iterations."); +#endif + + break; + } + + n_bytes -= u->hwbuf_unused; + polled = FALSE; + + for (;;) { + snd_pcm_sframes_t frames; + void *p; + +/* pa_log_debug("%lu frames to write", (unsigned long) frames); */ + + if (u->memchunk.length <= 0) + pa_sink_render(u->sink, n_bytes, &u->memchunk); + + pa_assert(u->memchunk.length > 0); + + frames = (snd_pcm_sframes_t) (u->memchunk.length / u->frame_size); + + if (frames > (snd_pcm_sframes_t) (n_bytes/u->frame_size)) + frames = (snd_pcm_sframes_t) (n_bytes/u->frame_size); + + p = pa_memblock_acquire(u->memchunk.memblock); + frames = snd_pcm_writei(u->pcm_handle, (const uint8_t*) p + u->memchunk.index, (snd_pcm_uframes_t) frames); + pa_memblock_release(u->memchunk.memblock); + + if (PA_UNLIKELY(frames < 0)) { + + if (!after_avail && (int) frames == -EAGAIN) + break; + + if ((r = try_recover(u, "snd_pcm_writei", (int) frames)) == 0) + continue; + + return r; + } + + if (!after_avail && frames == 0) + break; + + pa_assert(frames > 0); + after_avail = FALSE; + + u->memchunk.index += (size_t) frames * u->frame_size; + u->memchunk.length -= (size_t) frames * u->frame_size; + + if (u->memchunk.length <= 0) { + pa_memblock_unref(u->memchunk.memblock); + pa_memchunk_reset(&u->memchunk); + } + + work_done = TRUE; + + u->write_count += frames * u->frame_size; + u->since_start += frames * u->frame_size; + +/* pa_log_debug("wrote %lu frames", (unsigned long) frames); */ + + if ((size_t) frames * u->frame_size >= n_bytes) + break; + + n_bytes -= (size_t) frames * u->frame_size; + } + } + + *sleep_usec = pa_bytes_to_usec(left_to_play, &u->sink->sample_spec); + + if (*sleep_usec > process_usec) + *sleep_usec -= process_usec; + else + *sleep_usec = 0; + + return work_done ? 1 : 0; +} + +static void update_smoother(struct userdata *u) { + snd_pcm_sframes_t delay = 0; + int64_t position; + int err; + pa_usec_t now1 = 0, now2; + snd_pcm_status_t *status; + + snd_pcm_status_alloca(&status); + + pa_assert(u); + pa_assert(u->pcm_handle); + + /* Let's update the time smoother */ + + if (PA_UNLIKELY((err = pa_alsa_safe_delay(u->pcm_handle, &delay, u->hwbuf_size, &u->sink->sample_spec)) < 0)) { + pa_log_warn("Failed to query DSP status data: %s", pa_alsa_strerror(err)); + return; + } + + if (PA_UNLIKELY((err = snd_pcm_status(u->pcm_handle, status)) < 0)) + pa_log_warn("Failed to get timestamp: %s", pa_alsa_strerror(err)); + else { + snd_htimestamp_t htstamp = { 0, 0 }; + snd_pcm_status_get_htstamp(status, &htstamp); + now1 = pa_timespec_load(&htstamp); + } + + /* Hmm, if the timestamp is 0, then it wasn't set and we take the current time */ + if (now1 <= 0) + now1 = pa_rtclock_now(); + + /* check if the time since the last update is bigger than the interval */ + if (u->last_smoother_update > 0) + if (u->last_smoother_update + u->smoother_interval > now1) + return; + + position = (int64_t) u->write_count - ((int64_t) delay * (int64_t) u->frame_size); + + if (PA_UNLIKELY(position < 0)) + position = 0; + + now2 = pa_bytes_to_usec((uint64_t) position, &u->sink->sample_spec); + + pa_smoother_put(u->smoother, now1, now2); + + u->last_smoother_update = now1; + /* exponentially increase the update interval up to the MAX limit */ + u->smoother_interval = PA_MIN (u->smoother_interval * 2, SMOOTHER_MAX_INTERVAL); +} + +static pa_usec_t sink_get_latency(struct userdata *u) { + pa_usec_t r; + int64_t delay; + pa_usec_t now1, now2; + + pa_assert(u); + + now1 = pa_rtclock_now(); + now2 = pa_smoother_get(u->smoother, now1); + + delay = (int64_t) pa_bytes_to_usec(u->write_count, &u->sink->sample_spec) - (int64_t) now2; + + r = delay >= 0 ? (pa_usec_t) delay : 0; + + if (u->memchunk.memblock) + r += pa_bytes_to_usec(u->memchunk.length, &u->sink->sample_spec); + + return r; +} + +static int build_pollfd(struct userdata *u) { + pa_assert(u); + pa_assert(u->pcm_handle); + + if (u->alsa_rtpoll_item) + pa_rtpoll_item_free(u->alsa_rtpoll_item); + + if (!(u->alsa_rtpoll_item = pa_alsa_build_pollfd(u->pcm_handle, u->rtpoll))) + return -1; + + return 0; +} + +/* Called from IO context */ +static int suspend(struct userdata *u) { + pa_assert(u); + pa_assert(u->pcm_handle); + + pa_smoother_pause(u->smoother, pa_rtclock_now()); + + /* Let's suspend -- we don't call snd_pcm_drain() here since that might + * take awfully long with our long buffer sizes today. */ + snd_pcm_close(u->pcm_handle); + u->pcm_handle = NULL; + + if (u->alsa_rtpoll_item) { + pa_rtpoll_item_free(u->alsa_rtpoll_item); + u->alsa_rtpoll_item = NULL; + } + + pa_log_info("Device suspended..."); + + return 0; +} + +/* Called from IO context */ +static int update_sw_params(struct userdata *u) { + snd_pcm_uframes_t avail_min; + int err; + + pa_assert(u); + + /* Use the full buffer if noone asked us for anything specific */ + u->hwbuf_unused = 0; + + if (u->use_tsched) { + pa_usec_t latency; + + if ((latency = pa_sink_get_requested_latency_within_thread(u->sink)) != (pa_usec_t) -1) { + size_t b; + + pa_log_debug("Latency set to %0.2fms", (double) latency / PA_USEC_PER_MSEC); + + b = pa_usec_to_bytes(latency, &u->sink->sample_spec); + + /* We need at least one sample in our buffer */ + + if (PA_UNLIKELY(b < u->frame_size)) + b = u->frame_size; + + u->hwbuf_unused = PA_LIKELY(b < u->hwbuf_size) ? (u->hwbuf_size - b) : 0; + } + + fix_min_sleep_wakeup(u); + fix_tsched_watermark(u); + } + + pa_log_debug("hwbuf_unused=%lu", (unsigned long) u->hwbuf_unused); + + /* We need at last one frame in the used part of the buffer */ + avail_min = (snd_pcm_uframes_t) u->hwbuf_unused / u->frame_size + 1; + + if (u->use_tsched) { + pa_usec_t sleep_usec, process_usec; + + hw_sleep_time(u, &sleep_usec, &process_usec); + avail_min += pa_usec_to_bytes(sleep_usec, &u->sink->sample_spec) / u->frame_size; + } + + pa_log_debug("setting avail_min=%lu", (unsigned long) avail_min); + + if ((err = pa_alsa_set_sw_params(u->pcm_handle, avail_min, !u->use_tsched)) < 0) { + pa_log("Failed to set software parameters: %s", pa_alsa_strerror(err)); + return err; + } + + pa_sink_set_max_request_within_thread(u->sink, u->hwbuf_size - u->hwbuf_unused); + + return 0; +} + +/* Called from IO context */ +static int unsuspend(struct userdata *u) { + pa_sample_spec ss; + int err; + pa_bool_t b, d; + snd_pcm_uframes_t period_size, buffer_size; + + pa_assert(u); + pa_assert(!u->pcm_handle); + + pa_log_info("Trying resume..."); + + if ((err = snd_pcm_open(&u->pcm_handle, u->device_name, SND_PCM_STREAM_PLAYBACK, + SND_PCM_NONBLOCK| + SND_PCM_NO_AUTO_RESAMPLE| + SND_PCM_NO_AUTO_CHANNELS| + SND_PCM_NO_AUTO_FORMAT)) < 0) { + pa_log("Error opening PCM device %s: %s", u->device_name, pa_alsa_strerror(err)); + goto fail; + } + + ss = u->sink->sample_spec; + period_size = u->fragment_size / u->frame_size; + buffer_size = u->hwbuf_size / u->frame_size; + b = u->use_mmap; + d = u->use_tsched; + + if ((err = pa_alsa_set_hw_params(u->pcm_handle, &ss, &period_size, &buffer_size, 0, &b, &d, TRUE)) < 0) { + pa_log("Failed to set hardware parameters: %s", pa_alsa_strerror(err)); + goto fail; + } + + if (b != u->use_mmap || d != u->use_tsched) { + pa_log_warn("Resume failed, couldn't get original access mode."); + goto fail; + } + + if (!pa_sample_spec_equal(&ss, &u->sink->sample_spec)) { + pa_log_warn("Resume failed, couldn't restore original sample settings."); + goto fail; + } + + if (period_size*u->frame_size != u->fragment_size || + buffer_size*u->frame_size != u->hwbuf_size) { + pa_log_warn("Resume failed, couldn't restore original fragment settings. (Old: %lu/%lu, New %lu/%lu)", + (unsigned long) u->hwbuf_size, (unsigned long) u->fragment_size, + (unsigned long) (buffer_size*u->frame_size), (unsigned long) (period_size*u->frame_size)); + goto fail; + } + + if (update_sw_params(u) < 0) + goto fail; + + if (build_pollfd(u) < 0) + goto fail; + + u->write_count = 0; + pa_smoother_reset(u->smoother, pa_rtclock_now(), TRUE); + u->smoother_interval = SMOOTHER_MIN_INTERVAL; + u->last_smoother_update = 0; + + u->first = TRUE; + u->since_start = 0; + + pa_log_info("Resumed successfully..."); + + return 0; + +fail: + if (u->pcm_handle) { + snd_pcm_close(u->pcm_handle); + u->pcm_handle = NULL; + } + + return -PA_ERR_IO; +} + +/* Called from IO context */ +static int sink_process_msg(pa_msgobject *o, int code, void *data, int64_t offset, pa_memchunk *chunk) { + struct userdata *u = PA_SINK(o)->userdata; + + switch (code) { + + case PA_SINK_MESSAGE_GET_LATENCY: { + pa_usec_t r = 0; + + if (u->pcm_handle) + r = sink_get_latency(u); + + *((pa_usec_t*) data) = r; + + return 0; + } + + case PA_SINK_MESSAGE_SET_STATE: + + switch ((pa_sink_state_t) PA_PTR_TO_UINT(data)) { + + case PA_SINK_SUSPENDED: { + int r; + + pa_assert(PA_SINK_IS_OPENED(u->sink->thread_info.state)); + + if ((r = suspend(u)) < 0) + return r; + + break; + } + + case PA_SINK_IDLE: + case PA_SINK_RUNNING: { + int r; + + if (u->sink->thread_info.state == PA_SINK_INIT) { + if (build_pollfd(u) < 0) + return -PA_ERR_IO; + } + + if (u->sink->thread_info.state == PA_SINK_SUSPENDED) { + if ((r = unsuspend(u)) < 0) + return r; + } + + break; + } + + case PA_SINK_UNLINKED: + case PA_SINK_INIT: + case PA_SINK_INVALID_STATE: + ; + } + + break; + } + + return pa_sink_process_msg(o, code, data, offset, chunk); +} + +/* Called from main context */ +static int sink_set_state_cb(pa_sink *s, pa_sink_state_t new_state) { + pa_sink_state_t old_state; + struct userdata *u; + + pa_sink_assert_ref(s); + pa_assert_se(u = s->userdata); + + old_state = pa_sink_get_state(u->sink); + + if (PA_SINK_IS_OPENED(old_state) && new_state == PA_SINK_SUSPENDED) + reserve_done(u); + else if (old_state == PA_SINK_SUSPENDED && PA_SINK_IS_OPENED(new_state)) + if (reserve_init(u, u->device_name) < 0) + return -PA_ERR_BUSY; + + return 0; +} + +static int mixer_callback(snd_mixer_elem_t *elem, unsigned int mask) { + struct userdata *u = snd_mixer_elem_get_callback_private(elem); + + pa_assert(u); + pa_assert(u->mixer_handle); + + if (mask == SND_CTL_EVENT_MASK_REMOVE) + return 0; + + if (mask & SND_CTL_EVENT_MASK_VALUE) { + pa_sink_get_volume(u->sink, TRUE); + pa_sink_get_mute(u->sink, TRUE); + } + + return 0; +} + +static void sink_get_volume_cb(pa_sink *s) { + struct userdata *u = s->userdata; + pa_cvolume r; + char t[PA_CVOLUME_SNPRINT_MAX]; + + pa_assert(u); + pa_assert(u->mixer_path); + pa_assert(u->mixer_handle); + + if (pa_alsa_path_get_volume(u->mixer_path, u->mixer_handle, &s->channel_map, &r) < 0) + return; + + /* Shift down by the base volume, so that 0dB becomes maximum volume */ + pa_sw_cvolume_multiply_scalar(&r, &r, s->base_volume); + + pa_log_debug("Read hardware volume: %s", pa_cvolume_snprint(t, sizeof(t), &r)); + + if (pa_cvolume_equal(&u->hardware_volume, &r)) + return; + + s->real_volume = u->hardware_volume = r; + + /* Hmm, so the hardware volume changed, let's reset our software volume */ + if (u->mixer_path->has_dB) + pa_sink_set_soft_volume(s, NULL); +} + +static void sink_set_volume_cb(pa_sink *s) { + struct userdata *u = s->userdata; + pa_cvolume r; + char t[PA_CVOLUME_SNPRINT_MAX]; + + pa_assert(u); + pa_assert(u->mixer_path); + pa_assert(u->mixer_handle); + + /* Shift up by the base volume */ + pa_sw_cvolume_divide_scalar(&r, &s->real_volume, s->base_volume); + + if (pa_alsa_path_set_volume(u->mixer_path, u->mixer_handle, &s->channel_map, &r) < 0) + return; + + /* Shift down by the base volume, so that 0dB becomes maximum volume */ + pa_sw_cvolume_multiply_scalar(&r, &r, s->base_volume); + + u->hardware_volume = r; + + if (u->mixer_path->has_dB) { + pa_cvolume new_soft_volume; + pa_bool_t accurate_enough; + + /* Match exactly what the user requested by software */ + pa_sw_cvolume_divide(&new_soft_volume, &s->real_volume, &u->hardware_volume); + + /* If the adjustment to do in software is only minimal we + * can skip it. That saves us CPU at the expense of a bit of + * accuracy */ + accurate_enough = + (pa_cvolume_min(&new_soft_volume) >= (PA_VOLUME_NORM - VOLUME_ACCURACY)) && + (pa_cvolume_max(&new_soft_volume) <= (PA_VOLUME_NORM + VOLUME_ACCURACY)); + + pa_log_debug("Requested volume: %s", pa_cvolume_snprint(t, sizeof(t), &s->real_volume)); + pa_log_debug("Got hardware volume: %s", pa_cvolume_snprint(t, sizeof(t), &u->hardware_volume)); + pa_log_debug("Calculated software volume: %s (accurate-enough=%s)", pa_cvolume_snprint(t, sizeof(t), &new_soft_volume), + pa_yes_no(accurate_enough)); + + if (!accurate_enough) + s->soft_volume = new_soft_volume; + + } else { + pa_log_debug("Wrote hardware volume: %s", pa_cvolume_snprint(t, sizeof(t), &r)); + + /* We can't match exactly what the user requested, hence let's + * at least tell the user about it */ + + s->real_volume = r; + } +} + +static void sink_get_mute_cb(pa_sink *s) { + struct userdata *u = s->userdata; + pa_bool_t b; + + pa_assert(u); + pa_assert(u->mixer_path); + pa_assert(u->mixer_handle); + + if (pa_alsa_path_get_mute(u->mixer_path, u->mixer_handle, &b) < 0) + return; + + s->muted = b; +} + +static void sink_set_mute_cb(pa_sink *s) { + struct userdata *u = s->userdata; + + pa_assert(u); + pa_assert(u->mixer_path); + pa_assert(u->mixer_handle); + + pa_alsa_path_set_mute(u->mixer_path, u->mixer_handle, s->muted); +} + +static int sink_set_port_cb(pa_sink *s, pa_device_port *p) { + struct userdata *u = s->userdata; + pa_alsa_port_data *data; + + pa_assert(u); + pa_assert(p); + pa_assert(u->mixer_handle); + + data = PA_DEVICE_PORT_DATA(p); + + pa_assert_se(u->mixer_path = data->path); + pa_alsa_path_select(u->mixer_path, u->mixer_handle); + + if (u->mixer_path->has_volume && u->mixer_path->has_dB) { + s->base_volume = pa_sw_volume_from_dB(-u->mixer_path->max_dB); + s->n_volume_steps = PA_VOLUME_NORM+1; + + if (u->mixer_path->max_dB > 0.0) + pa_log_info("Fixing base volume to %0.2f dB", pa_sw_volume_to_dB(s->base_volume)); + else + pa_log_info("No particular base volume set, fixing to 0 dB"); + } else { + s->base_volume = PA_VOLUME_NORM; + s->n_volume_steps = u->mixer_path->max_volume - u->mixer_path->min_volume + 1; + } + + if (data->setting) + pa_alsa_setting_select(data->setting, u->mixer_handle); + + if (s->set_mute) + s->set_mute(s); + if (s->set_volume) + s->set_volume(s); + + return 0; +} + +static void sink_update_requested_latency_cb(pa_sink *s) { + struct userdata *u = s->userdata; + size_t before; + pa_assert(u); + + if (!u->pcm_handle) + return; + + before = u->hwbuf_unused; + update_sw_params(u); + + /* Let's check whether we now use only a smaller part of the + buffer then before. If so, we need to make sure that subsequent + rewinds are relative to the new maximum fill level and not to the + current fill level. Thus, let's do a full rewind once, to clear + things up. */ + + if (u->hwbuf_unused > before) { + pa_log_debug("Requesting rewind due to latency change."); + pa_sink_request_rewind(s, (size_t) -1); + } +} + +static int process_rewind(struct userdata *u) { + snd_pcm_sframes_t unused; + size_t rewind_nbytes, unused_nbytes, limit_nbytes; + pa_assert(u); + +#if 1 + /* Figure out how much we shall rewind and reset the counter */ + rewind_nbytes = u->sink->thread_info.rewind_nbytes; + u->sink->thread_info.rewind_nbytes = 0; + + if (rewind_nbytes > 0) { + pa_log_debug("Requested to rewind %lu bytes.", (unsigned long) rewind_nbytes); + rewind_nbytes = PA_MIN(u->memchunk.length, rewind_nbytes); + u->memchunk.length -= rewind_nbytes; + if (u->memchunk.length <= 0 && u->memchunk.memblock) { + pa_memblock_unref(u->memchunk.memblock); + pa_memchunk_reset(&u->memchunk); + } + pa_log_debug("Rewound %lu bytes.", (unsigned long) rewind_nbytes); + } + + u->write_count -= rewind_nbytes; + pa_sink_process_rewind(u->sink, rewind_nbytes); + if (rewind_nbytes) + u->after_rewind = TRUE; + + return 0; + +#else + /* Figure out how much we shall rewind and reset the counter */ + rewind_nbytes = u->sink->thread_info.rewind_nbytes; + + pa_log_debug("Requested to rewind %lu bytes.", (unsigned long) rewind_nbytes); + + if (PA_UNLIKELY((unused = pa_alsa_safe_avail(u->pcm_handle, u->hwbuf_size, &u->sink->sample_spec)) < 0)) { + pa_log("snd_pcm_avail() failed: %s", pa_alsa_strerror((int) unused)); + return -1; + } + + unused_nbytes = u->tsched_watermark + (size_t) unused * u->frame_size; + + if (u->hwbuf_size > unused_nbytes) + limit_nbytes = u->hwbuf_size - unused_nbytes; + else + limit_nbytes = 0; + + if (rewind_nbytes > limit_nbytes) + rewind_nbytes = limit_nbytes; + + if (rewind_nbytes > 0) { + snd_pcm_sframes_t in_frames, out_frames; + + pa_log_debug("Limited to %lu bytes.", (unsigned long) rewind_nbytes); + + in_frames = (snd_pcm_sframes_t) (rewind_nbytes / u->frame_size); + pa_log_debug("before: %lu", (unsigned long) in_frames); + if ((out_frames = snd_pcm_rewind(u->pcm_handle, (snd_pcm_uframes_t) in_frames)) < 0) { + pa_log("snd_pcm_rewind() failed: %s", pa_alsa_strerror((int) out_frames)); + if (try_recover(u, "process_rewind", out_frames) < 0) + return -1; + out_frames = 0; + } + + pa_log_debug("after: %lu", (unsigned long) out_frames); + + rewind_nbytes = (size_t) out_frames * u->frame_size; + + if (rewind_nbytes <= 0) + pa_log_info("Tried rewind, but was apparently not possible."); + else { + u->write_count -= rewind_nbytes; + pa_log_debug("Rewound %lu bytes.", (unsigned long) rewind_nbytes); + pa_sink_process_rewind(u->sink, rewind_nbytes); + + u->after_rewind = TRUE; + return 0; + } + } else + pa_log_debug("Mhmm, actually there is nothing to rewind."); + + pa_sink_process_rewind(u->sink, 0); + return 0; +#endif + +} + +static void thread_func(void *userdata) { + struct userdata *u = userdata; + unsigned short revents = 0; + + pa_assert(u); + + pa_log_debug("Thread starting up"); + + if (u->core->realtime_scheduling) + pa_make_realtime(u->core->realtime_priority); + + pa_thread_mq_install(&u->thread_mq); + + for (;;) { + int ret; + +#ifdef DEBUG_TIMING + pa_log_debug("Loop"); +#endif + + /* Render some data and write it to the dsp */ + if (PA_SINK_IS_OPENED(u->sink->thread_info.state)) { + int work_done; + pa_usec_t sleep_usec = 0; + pa_bool_t on_timeout = pa_rtpoll_timer_elapsed(u->rtpoll); + + if (PA_UNLIKELY(u->sink->thread_info.rewind_requested)) + if (process_rewind(u) < 0) + goto fail; + + if (u->use_mmap) + work_done = mmap_write(u, &sleep_usec, revents & POLLOUT, on_timeout); + else + work_done = unix_write(u, &sleep_usec, revents & POLLOUT, on_timeout); + + if (work_done < 0) + goto fail; + +/* pa_log_debug("work_done = %i", work_done); */ + + if (work_done) { + + if (u->first) { + pa_log_info("Starting playback."); + snd_pcm_start(u->pcm_handle); + + pa_smoother_resume(u->smoother, pa_rtclock_now(), TRUE); + } + + update_smoother(u); + } + + if (u->use_tsched) { + pa_usec_t cusec; + + if (u->since_start <= u->hwbuf_size) { + + /* USB devices on ALSA seem to hit a buffer + * underrun during the first iterations much + * quicker then we calculate here, probably due to + * the transport latency. To accommodate for that + * we artificially decrease the sleep time until + * we have filled the buffer at least once + * completely.*/ + + if (pa_log_ratelimit()) + pa_log_debug("Cutting sleep time for the initial iterations by half."); + sleep_usec /= 2; + } + + /* OK, the playback buffer is now full, let's + * calculate when to wake up next */ +/* pa_log_debug("Waking up in %0.2fms (sound card clock).", (double) sleep_usec / PA_USEC_PER_MSEC); */ + + /* Convert from the sound card time domain to the + * system time domain */ + cusec = pa_smoother_translate(u->smoother, pa_rtclock_now(), sleep_usec); + +/* pa_log_debug("Waking up in %0.2fms (system clock).", (double) cusec / PA_USEC_PER_MSEC); */ + + /* We don't trust the conversion, so we wake up whatever comes first */ + pa_rtpoll_set_timer_relative(u->rtpoll, PA_MIN(sleep_usec, cusec)); + } + + u->first = FALSE; + u->after_rewind = FALSE; + + } else if (u->use_tsched) + + /* OK, we're in an invalid state, let's disable our timers */ + pa_rtpoll_set_timer_disabled(u->rtpoll); + + /* Hmm, nothing to do. Let's sleep */ + if ((ret = pa_rtpoll_run(u->rtpoll, TRUE)) < 0) + goto fail; + + if (ret == 0) + goto finish; + + /* Tell ALSA about this and process its response */ + if (PA_SINK_IS_OPENED(u->sink->thread_info.state)) { + struct pollfd *pollfd; + int err; + unsigned n; + + pollfd = pa_rtpoll_item_get_pollfd(u->alsa_rtpoll_item, &n); + + if ((err = snd_pcm_poll_descriptors_revents(u->pcm_handle, pollfd, n, &revents)) < 0) { + pa_log("snd_pcm_poll_descriptors_revents() failed: %s", pa_alsa_strerror(err)); + goto fail; + } + + if (revents & ~POLLOUT) { + if (pa_alsa_recover_from_poll(u->pcm_handle, revents) < 0) + goto fail; + + u->first = TRUE; + u->since_start = 0; + } else if (revents && u->use_tsched && pa_log_ratelimit()) + pa_log_debug("Wakeup from ALSA!"); + + } else + revents = 0; + } + +fail: + /* If this was no regular exit from the loop we have to continue + * processing messages until we received PA_MESSAGE_SHUTDOWN */ + pa_asyncmsgq_post(u->thread_mq.outq, PA_MSGOBJECT(u->core), PA_CORE_MESSAGE_UNLOAD_MODULE, u->module, 0, NULL, NULL); + pa_asyncmsgq_wait_for(u->thread_mq.inq, PA_MESSAGE_SHUTDOWN); + +finish: + pa_log_debug("Thread shutting down"); +} + +static void set_sink_name(pa_sink_new_data *data, pa_modargs *ma, const char *device_id, const char *device_name, pa_alsa_mapping *mapping) { + const char *n; + char *t; + + pa_assert(data); + pa_assert(ma); + pa_assert(device_name); + + if ((n = pa_modargs_get_value(ma, "sink_name", NULL))) { + pa_sink_new_data_set_name(data, n); + data->namereg_fail = TRUE; + return; + } + + if ((n = pa_modargs_get_value(ma, "name", NULL))) + data->namereg_fail = TRUE; + else { + n = device_id ? device_id : device_name; + data->namereg_fail = FALSE; + } + + if (mapping) + t = pa_sprintf_malloc("alsa_output.%s.%s", n, mapping->name); + else + t = pa_sprintf_malloc("alsa_output.%s", n); + + pa_sink_new_data_set_name(data, t); + pa_xfree(t); +} + +static void find_mixer(struct userdata *u, pa_alsa_mapping *mapping, const char *element, pa_bool_t ignore_dB) { + + if (!mapping && !element) + return; + + if (!(u->mixer_handle = pa_alsa_open_mixer_for_pcm(u->pcm_handle, &u->control_device))) { + pa_log_info("Failed to find a working mixer device."); + return; + } + + if (element) { + + if (!(u->mixer_path = pa_alsa_path_synthesize(element, PA_ALSA_DIRECTION_OUTPUT))) + goto fail; + + if (pa_alsa_path_probe(u->mixer_path, u->mixer_handle, ignore_dB) < 0) + goto fail; + + pa_log_debug("Probed mixer path %s:", u->mixer_path->name); + pa_alsa_path_dump(u->mixer_path); + } else { + + if (!(u->mixer_path_set = pa_alsa_path_set_new(mapping, PA_ALSA_DIRECTION_OUTPUT))) + goto fail; + + pa_alsa_path_set_probe(u->mixer_path_set, u->mixer_handle, ignore_dB); + + pa_log_debug("Probed mixer paths:"); + pa_alsa_path_set_dump(u->mixer_path_set); + } + + return; + +fail: + + if (u->mixer_path_set) { + pa_alsa_path_set_free(u->mixer_path_set); + u->mixer_path_set = NULL; + } else if (u->mixer_path) { + pa_alsa_path_free(u->mixer_path); + u->mixer_path = NULL; + } + + if (u->mixer_handle) { + snd_mixer_close(u->mixer_handle); + u->mixer_handle = NULL; + } +} + +static int setup_mixer(struct userdata *u, pa_bool_t ignore_dB) { + pa_assert(u); + + if (!u->mixer_handle) + return 0; + + if (u->sink->active_port) { + pa_alsa_port_data *data; + + /* We have a list of supported paths, so let's activate the + * one that has been chosen as active */ + + data = PA_DEVICE_PORT_DATA(u->sink->active_port); + u->mixer_path = data->path; + + pa_alsa_path_select(data->path, u->mixer_handle); + + if (data->setting) + pa_alsa_setting_select(data->setting, u->mixer_handle); + + } else { + + if (!u->mixer_path && u->mixer_path_set) + u->mixer_path = u->mixer_path_set->paths; + + if (u->mixer_path) { + /* Hmm, we have only a single path, then let's activate it */ + + pa_alsa_path_select(u->mixer_path, u->mixer_handle); + + if (u->mixer_path->settings) + pa_alsa_setting_select(u->mixer_path->settings, u->mixer_handle); + } else + return 0; + } + + if (!u->mixer_path->has_volume) + pa_log_info("Driver does not support hardware volume control, falling back to software volume control."); + else { + + if (u->mixer_path->has_dB) { + pa_log_info("Hardware volume ranges from %0.2f dB to %0.2f dB.", u->mixer_path->min_dB, u->mixer_path->max_dB); + + u->sink->base_volume = pa_sw_volume_from_dB(-u->mixer_path->max_dB); + u->sink->n_volume_steps = PA_VOLUME_NORM+1; + + if (u->mixer_path->max_dB > 0.0) + pa_log_info("Fixing base volume to %0.2f dB", pa_sw_volume_to_dB(u->sink->base_volume)); + else + pa_log_info("No particular base volume set, fixing to 0 dB"); + + } else { + pa_log_info("Hardware volume ranges from %li to %li.", u->mixer_path->min_volume, u->mixer_path->max_volume); + u->sink->base_volume = PA_VOLUME_NORM; + u->sink->n_volume_steps = u->mixer_path->max_volume - u->mixer_path->min_volume + 1; + } + + u->sink->get_volume = sink_get_volume_cb; + u->sink->set_volume = sink_set_volume_cb; + + u->sink->flags |= PA_SINK_HW_VOLUME_CTRL | (u->mixer_path->has_dB ? PA_SINK_DECIBEL_VOLUME : 0); + pa_log_info("Using hardware volume control. Hardware dB scale %s.", u->mixer_path->has_dB ? "supported" : "not supported"); + } + + if (!u->mixer_path->has_mute) { + pa_log_info("Driver does not support hardware mute control, falling back to software mute control."); + } else { + u->sink->get_mute = sink_get_mute_cb; + u->sink->set_mute = sink_set_mute_cb; + u->sink->flags |= PA_SINK_HW_MUTE_CTRL; + pa_log_info("Using hardware mute control."); + } + + u->mixer_fdl = pa_alsa_fdlist_new(); + + if (pa_alsa_fdlist_set_mixer(u->mixer_fdl, u->mixer_handle, u->core->mainloop) < 0) { + pa_log("Failed to initialize file descriptor monitoring"); + return -1; + } + + if (u->mixer_path_set) + pa_alsa_path_set_set_callback(u->mixer_path_set, u->mixer_handle, mixer_callback, u); + else + pa_alsa_path_set_callback(u->mixer_path, u->mixer_handle, mixer_callback, u); + + return 0; +} + +pa_sink *pa_alsa_sink_new(pa_module *m, pa_modargs *ma, const char*driver, pa_card *card, pa_alsa_mapping *mapping) { + + struct userdata *u = NULL; + const char *dev_id = NULL; + pa_sample_spec ss, requested_ss; + pa_channel_map map; + uint32_t nfrags, frag_size, buffer_size, tsched_size, tsched_watermark; + snd_pcm_uframes_t period_frames, buffer_frames, tsched_frames; + size_t frame_size; + pa_bool_t use_mmap = TRUE, b, use_tsched = TRUE, d, ignore_dB = FALSE; + pa_sink_new_data data; + pa_alsa_profile_set *profile_set = NULL; + + pa_assert(m); + pa_assert(ma); + + ss = m->core->default_sample_spec; + map = m->core->default_channel_map; + if (pa_modargs_get_sample_spec_and_channel_map(ma, &ss, &map, PA_CHANNEL_MAP_ALSA) < 0) { + pa_log("Failed to parse sample specification and channel map"); + goto fail; + } + + requested_ss = ss; + frame_size = pa_frame_size(&ss); + + nfrags = m->core->default_n_fragments; + frag_size = (uint32_t) pa_usec_to_bytes(m->core->default_fragment_size_msec*PA_USEC_PER_MSEC, &ss); + if (frag_size <= 0) + frag_size = (uint32_t) frame_size; + tsched_size = (uint32_t) pa_usec_to_bytes(DEFAULT_TSCHED_BUFFER_USEC, &ss); + tsched_watermark = (uint32_t) pa_usec_to_bytes(DEFAULT_TSCHED_WATERMARK_USEC, &ss); + + if (pa_modargs_get_value_u32(ma, "fragments", &nfrags) < 0 || + pa_modargs_get_value_u32(ma, "fragment_size", &frag_size) < 0 || + pa_modargs_get_value_u32(ma, "tsched_buffer_size", &tsched_size) < 0 || + pa_modargs_get_value_u32(ma, "tsched_buffer_watermark", &tsched_watermark) < 0) { + pa_log("Failed to parse buffer metrics"); + goto fail; + } + + buffer_size = nfrags * frag_size; + + period_frames = frag_size/frame_size; + buffer_frames = buffer_size/frame_size; + tsched_frames = tsched_size/frame_size; + + if (pa_modargs_get_value_boolean(ma, "mmap", &use_mmap) < 0) { + pa_log("Failed to parse mmap argument."); + goto fail; + } + + if (pa_modargs_get_value_boolean(ma, "tsched", &use_tsched) < 0) { + pa_log("Failed to parse tsched argument."); + goto fail; + } + + if (pa_modargs_get_value_boolean(ma, "ignore_dB", &ignore_dB) < 0) { + pa_log("Failed to parse ignore_dB argument."); + goto fail; + } + + use_tsched = pa_alsa_may_tsched(use_tsched); + + u = pa_xnew0(struct userdata, 1); + u->core = m->core; + u->module = m; + u->use_mmap = use_mmap; + u->use_tsched = use_tsched; + u->first = TRUE; + u->rtpoll = pa_rtpoll_new(); + pa_thread_mq_init(&u->thread_mq, m->core->mainloop, u->rtpoll); + + u->smoother = pa_smoother_new( + DEFAULT_TSCHED_BUFFER_USEC*2, + DEFAULT_TSCHED_BUFFER_USEC*2, + TRUE, + TRUE, + 5, + pa_rtclock_now(), + TRUE); + u->smoother_interval = SMOOTHER_MIN_INTERVAL; + + dev_id = pa_modargs_get_value( + ma, "device_id", + pa_modargs_get_value(ma, "device", DEFAULT_DEVICE)); + + if (reserve_init(u, dev_id) < 0) + goto fail; + + if (reserve_monitor_init(u, dev_id) < 0) + goto fail; + + b = use_mmap; + d = use_tsched; + + if (mapping) { + + if (!(dev_id = pa_modargs_get_value(ma, "device_id", NULL))) { + pa_log("device_id= not set"); + goto fail; + } + + if (!(u->pcm_handle = pa_alsa_open_by_device_id_mapping( + dev_id, + &u->device_name, + &ss, &map, + SND_PCM_STREAM_PLAYBACK, + &period_frames, &buffer_frames, tsched_frames, + &b, &d, mapping))) + + goto fail; + + } else if ((dev_id = pa_modargs_get_value(ma, "device_id", NULL))) { + + if (!(profile_set = pa_alsa_profile_set_new(NULL, &map))) + goto fail; + + if (!(u->pcm_handle = pa_alsa_open_by_device_id_auto( + dev_id, + &u->device_name, + &ss, &map, + SND_PCM_STREAM_PLAYBACK, + &period_frames, &buffer_frames, tsched_frames, + &b, &d, profile_set, &mapping))) + + goto fail; + + } else { + + if (!(u->pcm_handle = pa_alsa_open_by_device_string( + pa_modargs_get_value(ma, "device", DEFAULT_DEVICE), + &u->device_name, + &ss, &map, + SND_PCM_STREAM_PLAYBACK, + &period_frames, &buffer_frames, tsched_frames, + &b, &d, FALSE))) + goto fail; + } + + pa_assert(u->device_name); + pa_log_info("Successfully opened device %s.", u->device_name); + + if (pa_alsa_pcm_is_modem(u->pcm_handle)) { + pa_log_notice("Device %s is modem, refusing further initialization.", u->device_name); + goto fail; + } + + if (mapping) + pa_log_info("Selected mapping '%s' (%s).", mapping->description, mapping->name); + + if (use_mmap && !b) { + pa_log_info("Device doesn't support mmap(), falling back to UNIX read/write mode."); + u->use_mmap = use_mmap = FALSE; + } + + if (use_tsched && (!b || !d)) { + pa_log_info("Cannot enable timer-based scheduling, falling back to sound IRQ scheduling."); + u->use_tsched = use_tsched = FALSE; + } + + if (u->use_mmap) + pa_log_info("Successfully enabled mmap() mode."); + + if (u->use_tsched) + pa_log_info("Successfully enabled timer-based scheduling mode."); + + /* ALSA might tweak the sample spec, so recalculate the frame size */ + frame_size = pa_frame_size(&ss); + + find_mixer(u, mapping, pa_modargs_get_value(ma, "control", NULL), ignore_dB); + + pa_sink_new_data_init(&data); + data.driver = driver; + data.module = m; + data.card = card; + set_sink_name(&data, ma, dev_id, u->device_name, mapping); + pa_sink_new_data_set_sample_spec(&data, &ss); + pa_sink_new_data_set_channel_map(&data, &map); + + pa_alsa_init_proplist_pcm(m->core, data.proplist, u->pcm_handle); + pa_proplist_sets(data.proplist, PA_PROP_DEVICE_STRING, u->device_name); + pa_proplist_setf(data.proplist, PA_PROP_DEVICE_BUFFERING_BUFFER_SIZE, "%lu", (unsigned long) (buffer_frames * frame_size)); + pa_proplist_setf(data.proplist, PA_PROP_DEVICE_BUFFERING_FRAGMENT_SIZE, "%lu", (unsigned long) (period_frames * frame_size)); + pa_proplist_sets(data.proplist, PA_PROP_DEVICE_ACCESS_MODE, u->use_tsched ? "mmap+timer" : (u->use_mmap ? "mmap" : "serial")); + + /* Set Suspend timeout to ZERO to avoid noise */ + pa_log_info("Set suspend-on-idle timeout to ZERO to avoid noise"); + pa_proplist_sets(data.proplist, "module-suspend-on-idle.timeout", ALSA_SUSPEND_ON_IDLE_TIMEOUT); + + if (mapping) { + pa_proplist_sets(data.proplist, PA_PROP_DEVICE_PROFILE_NAME, mapping->name); + pa_proplist_sets(data.proplist, PA_PROP_DEVICE_PROFILE_DESCRIPTION, mapping->description); + } + + pa_alsa_init_description(data.proplist); + + if (u->control_device) + pa_alsa_init_proplist_ctl(data.proplist, u->control_device); + + if (pa_modargs_get_proplist(ma, "sink_properties", data.proplist, PA_UPDATE_REPLACE) < 0) { + pa_log("Invalid properties"); + pa_sink_new_data_done(&data); + goto fail; + } + + if (u->mixer_path_set) + pa_alsa_add_ports(&data.ports, u->mixer_path_set); + + u->sink = pa_sink_new(m->core, &data, PA_SINK_HARDWARE|PA_SINK_LATENCY|(u->use_tsched ? PA_SINK_DYNAMIC_LATENCY : 0)); + pa_sink_new_data_done(&data); + + if (!u->sink) { + pa_log("Failed to create sink object"); + goto fail; + } + + u->sink->parent.process_msg = sink_process_msg; + u->sink->update_requested_latency = sink_update_requested_latency_cb; + u->sink->set_state = sink_set_state_cb; + u->sink->set_port = sink_set_port_cb; + u->sink->userdata = u; + + pa_sink_set_asyncmsgq(u->sink, u->thread_mq.inq); + pa_sink_set_rtpoll(u->sink, u->rtpoll); + + u->frame_size = frame_size; + u->fragment_size = frag_size = (size_t) (period_frames * frame_size); + u->hwbuf_size = buffer_size = (size_t) (buffer_frames * frame_size); + pa_cvolume_mute(&u->hardware_volume, u->sink->sample_spec.channels); + + pa_log_info("Using %0.1f fragments of size %lu bytes (%0.2fms), buffer size is %lu bytes (%0.2fms)", + (double) u->hwbuf_size / (double) u->fragment_size, + (long unsigned) u->fragment_size, + (double) pa_bytes_to_usec(u->fragment_size, &ss) / PA_USEC_PER_MSEC, + (long unsigned) u->hwbuf_size, + (double) pa_bytes_to_usec(u->hwbuf_size, &ss) / PA_USEC_PER_MSEC); + + pa_sink_set_max_request(u->sink, u->hwbuf_size); + pa_sink_set_max_rewind(u->sink, u->hwbuf_size); + + if (u->use_tsched) { + u->tsched_watermark = pa_usec_to_bytes_round_up(pa_bytes_to_usec_round_up(tsched_watermark, &requested_ss), &u->sink->sample_spec); + + u->watermark_inc_step = pa_usec_to_bytes(TSCHED_WATERMARK_INC_STEP_USEC, &u->sink->sample_spec); + u->watermark_dec_step = pa_usec_to_bytes(TSCHED_WATERMARK_DEC_STEP_USEC, &u->sink->sample_spec); + + u->watermark_inc_threshold = pa_usec_to_bytes_round_up(TSCHED_WATERMARK_INC_THRESHOLD_USEC, &u->sink->sample_spec); + u->watermark_dec_threshold = pa_usec_to_bytes_round_up(TSCHED_WATERMARK_DEC_THRESHOLD_USEC, &u->sink->sample_spec); + + fix_min_sleep_wakeup(u); + fix_tsched_watermark(u); + + pa_sink_set_latency_range(u->sink, + 0, + pa_bytes_to_usec(u->hwbuf_size, &ss)); + + pa_log_info("Time scheduling watermark is %0.2fms", + (double) pa_bytes_to_usec(u->tsched_watermark, &ss) / PA_USEC_PER_MSEC); + } else + pa_sink_set_fixed_latency(u->sink, pa_bytes_to_usec(u->hwbuf_size, &ss)); + + + reserve_update(u); + + if (update_sw_params(u) < 0) + goto fail; + + if (setup_mixer(u, ignore_dB) < 0) + goto fail; + + pa_alsa_dump(PA_LOG_DEBUG, u->pcm_handle); + + if (!(u->thread = pa_thread_new(thread_func, u))) { + pa_log("Failed to create thread."); + goto fail; + } + + /* Get initial mixer settings */ + if (data.volume_is_set) { + if (u->sink->set_volume) + u->sink->set_volume(u->sink); + } else { + if (u->sink->get_volume) + u->sink->get_volume(u->sink); + } + + if (data.muted_is_set) { + if (u->sink->set_mute) + u->sink->set_mute(u->sink); + } else { + if (u->sink->get_mute) + u->sink->get_mute(u->sink); + } + + pa_sink_put(u->sink); + + if (profile_set) + pa_alsa_profile_set_free(profile_set); + + return u->sink; + +fail: + + if (u) + userdata_free(u); + + if (profile_set) + pa_alsa_profile_set_free(profile_set); + + return NULL; +} + +static void userdata_free(struct userdata *u) { + pa_assert(u); + + if (u->sink) + pa_sink_unlink(u->sink); + + if (u->thread) { + pa_asyncmsgq_send(u->thread_mq.inq, NULL, PA_MESSAGE_SHUTDOWN, NULL, 0, NULL); + pa_thread_free(u->thread); + } + + pa_thread_mq_done(&u->thread_mq); + + if (u->sink) + pa_sink_unref(u->sink); + + if (u->memchunk.memblock) + pa_memblock_unref(u->memchunk.memblock); + + if (u->alsa_rtpoll_item) + pa_rtpoll_item_free(u->alsa_rtpoll_item); + + if (u->rtpoll) + pa_rtpoll_free(u->rtpoll); + + if (u->pcm_handle) { + snd_pcm_drop(u->pcm_handle); + snd_pcm_close(u->pcm_handle); + } + + if (u->mixer_fdl) + pa_alsa_fdlist_free(u->mixer_fdl); + + if (u->mixer_path_set) + pa_alsa_path_set_free(u->mixer_path_set); + else if (u->mixer_path) + pa_alsa_path_free(u->mixer_path); + + if (u->mixer_handle) + snd_mixer_close(u->mixer_handle); + + if (u->smoother) + pa_smoother_free(u->smoother); + + reserve_done(u); + monitor_done(u); + + pa_xfree(u->device_name); + pa_xfree(u->control_device); + pa_xfree(u); +} + +void pa_alsa_sink_free(pa_sink *s) { + struct userdata *u; + + pa_sink_assert_ref(s); + pa_assert_se(u = s->userdata); + + userdata_free(u); +} diff --git a/src/modules/alsa/alsa-sink.h b/src/modules/alsa/alsa-sink.h new file mode 100644 index 0000000..b9a4ac2 --- /dev/null +++ b/src/modules/alsa/alsa-sink.h @@ -0,0 +1,37 @@ +#ifndef fooalsasinkhfoo +#define fooalsasinkhfoo + +/*** + This file is part of PulseAudio. + + Copyright 2004-2006 Lennart Poettering + Copyright 2006 Pierre Ossman for Cendio AB + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#include +#include +#include + +#include "alsa-util.h" +#include "alsa-mixer.h" + +pa_sink* pa_alsa_sink_new(pa_module *m, pa_modargs *ma, const char*driver, pa_card *card, pa_alsa_mapping *mapping); + +void pa_alsa_sink_free(pa_sink *s); + +#endif diff --git a/src/modules/alsa/alsa-source.c b/src/modules/alsa/alsa-source.c new file mode 100644 index 0000000..157698e --- /dev/null +++ b/src/modules/alsa/alsa-source.c @@ -0,0 +1,1839 @@ +/*** + This file is part of PulseAudio. + + Copyright 2004-2008 Lennart Poettering + Copyright 2006 Pierre Ossman for Cendio AB + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "alsa-util.h" +#include "alsa-source.h" + +/* #define DEBUG_TIMING */ + +#define DEFAULT_DEVICE "default" + +#define DEFAULT_TSCHED_BUFFER_USEC (2*PA_USEC_PER_SEC) /* 2s */ +#define DEFAULT_TSCHED_WATERMARK_USEC (20*PA_USEC_PER_MSEC) /* 20ms */ + +#define TSCHED_WATERMARK_INC_STEP_USEC (10*PA_USEC_PER_MSEC) /* 10ms */ +#define TSCHED_WATERMARK_DEC_STEP_USEC (5*PA_USEC_PER_MSEC) /* 5ms */ +#define TSCHED_WATERMARK_VERIFY_AFTER_USEC (20*PA_USEC_PER_SEC) /* 20s */ +#define TSCHED_WATERMARK_INC_THRESHOLD_USEC (0*PA_USEC_PER_MSEC) /* 0ms */ +#define TSCHED_WATERMARK_DEC_THRESHOLD_USEC (100*PA_USEC_PER_MSEC) /* 100ms */ +#define TSCHED_WATERMARK_STEP_USEC (10*PA_USEC_PER_MSEC) /* 10ms */ + +#define TSCHED_MIN_SLEEP_USEC (10*PA_USEC_PER_MSEC) /* 10ms */ +#define TSCHED_MIN_WAKEUP_USEC (4*PA_USEC_PER_MSEC) /* 4ms */ + +#define SMOOTHER_MIN_INTERVAL (2*PA_USEC_PER_MSEC) /* 2ms */ +#define SMOOTHER_MAX_INTERVAL (200*PA_USEC_PER_MSEC) /* 200ms */ + +#define VOLUME_ACCURACY (PA_VOLUME_NORM/100) + +struct userdata { + pa_core *core; + pa_module *module; + pa_source *source; + + pa_thread *thread; + pa_thread_mq thread_mq; + pa_rtpoll *rtpoll; + + snd_pcm_t *pcm_handle; + + pa_alsa_fdlist *mixer_fdl; + snd_mixer_t *mixer_handle; + pa_alsa_path_set *mixer_path_set; + pa_alsa_path *mixer_path; + + pa_cvolume hardware_volume; + + size_t + frame_size, + fragment_size, + hwbuf_size, + tsched_watermark, + hwbuf_unused, + min_sleep, + min_wakeup, + watermark_inc_step, + watermark_dec_step, + watermark_inc_threshold, + watermark_dec_threshold; + + pa_usec_t watermark_dec_not_before; + + char *device_name; + char *control_device; + + pa_bool_t use_mmap:1, use_tsched:1; + + pa_rtpoll_item *alsa_rtpoll_item; + + snd_mixer_selem_channel_id_t mixer_map[SND_MIXER_SCHN_LAST]; + + pa_smoother *smoother; + uint64_t read_count; + pa_usec_t smoother_interval; + pa_usec_t last_smoother_update; + + pa_reserve_wrapper *reserve; + pa_hook_slot *reserve_slot; + pa_reserve_monitor_wrapper *monitor; + pa_hook_slot *monitor_slot; +}; + +static void userdata_free(struct userdata *u); + +static pa_hook_result_t reserve_cb(pa_reserve_wrapper *r, void *forced, struct userdata *u) { + pa_assert(r); + pa_assert(u); + + if (pa_source_suspend(u->source, TRUE, PA_SUSPEND_APPLICATION) < 0) + return PA_HOOK_CANCEL; + + return PA_HOOK_OK; +} + +static void reserve_done(struct userdata *u) { + pa_assert(u); + + if (u->reserve_slot) { + pa_hook_slot_free(u->reserve_slot); + u->reserve_slot = NULL; + } + + if (u->reserve) { + pa_reserve_wrapper_unref(u->reserve); + u->reserve = NULL; + } +} + +static void reserve_update(struct userdata *u) { + const char *description; + pa_assert(u); + + if (!u->source || !u->reserve) + return; + + if ((description = pa_proplist_gets(u->source->proplist, PA_PROP_DEVICE_DESCRIPTION))) + pa_reserve_wrapper_set_application_device_name(u->reserve, description); +} + +static int reserve_init(struct userdata *u, const char *dname) { + char *rname; + + pa_assert(u); + pa_assert(dname); + + if (u->reserve) + return 0; + + if (pa_in_system_mode()) + return 0; + + /* We are resuming, try to lock the device */ + if (!(rname = pa_alsa_get_reserve_name(dname))) + return 0; + + u->reserve = pa_reserve_wrapper_get(u->core, rname); + pa_xfree(rname); + + if (!(u->reserve)) + return -1; + + reserve_update(u); + + pa_assert(!u->reserve_slot); + u->reserve_slot = pa_hook_connect(pa_reserve_wrapper_hook(u->reserve), PA_HOOK_NORMAL, (pa_hook_cb_t) reserve_cb, u); + + return 0; +} + +static pa_hook_result_t monitor_cb(pa_reserve_monitor_wrapper *w, void* busy, struct userdata *u) { + pa_bool_t b; + + pa_assert(w); + pa_assert(u); + + b = PA_PTR_TO_UINT(busy) && !u->reserve; + + pa_source_suspend(u->source, b, PA_SUSPEND_APPLICATION); + return PA_HOOK_OK; +} + +static void monitor_done(struct userdata *u) { + pa_assert(u); + + if (u->monitor_slot) { + pa_hook_slot_free(u->monitor_slot); + u->monitor_slot = NULL; + } + + if (u->monitor) { + pa_reserve_monitor_wrapper_unref(u->monitor); + u->monitor = NULL; + } +} + +static int reserve_monitor_init(struct userdata *u, const char *dname) { + char *rname; + + pa_assert(u); + pa_assert(dname); + + if (pa_in_system_mode()) + return 0; + + /* We are resuming, try to lock the device */ + if (!(rname = pa_alsa_get_reserve_name(dname))) + return 0; + + u->monitor = pa_reserve_monitor_wrapper_get(u->core, rname); + pa_xfree(rname); + + if (!(u->monitor)) + return -1; + + pa_assert(!u->monitor_slot); + u->monitor_slot = pa_hook_connect(pa_reserve_monitor_wrapper_hook(u->monitor), PA_HOOK_NORMAL, (pa_hook_cb_t) monitor_cb, u); + + return 0; +} + +static void fix_min_sleep_wakeup(struct userdata *u) { + size_t max_use, max_use_2; + pa_assert(u); + pa_assert(u->use_tsched); + + max_use = u->hwbuf_size - u->hwbuf_unused; + max_use_2 = pa_frame_align(max_use/2, &u->source->sample_spec); + + u->min_sleep = pa_usec_to_bytes(TSCHED_MIN_SLEEP_USEC, &u->source->sample_spec); + u->min_sleep = PA_CLAMP(u->min_sleep, u->frame_size, max_use_2); + + u->min_wakeup = pa_usec_to_bytes(TSCHED_MIN_WAKEUP_USEC, &u->source->sample_spec); + u->min_wakeup = PA_CLAMP(u->min_wakeup, u->frame_size, max_use_2); +} + +static void fix_tsched_watermark(struct userdata *u) { + size_t max_use; + pa_assert(u); + pa_assert(u->use_tsched); + + max_use = u->hwbuf_size - u->hwbuf_unused; + + if (u->tsched_watermark > max_use - u->min_sleep) + u->tsched_watermark = max_use - u->min_sleep; + + if (u->tsched_watermark < u->min_wakeup) + u->tsched_watermark = u->min_wakeup; +} + +static void increase_watermark(struct userdata *u) { + size_t old_watermark; + pa_usec_t old_min_latency, new_min_latency; + + pa_assert(u); + pa_assert(u->use_tsched); + + /* First, just try to increase the watermark */ + old_watermark = u->tsched_watermark; + u->tsched_watermark = PA_MIN(u->tsched_watermark * 2, u->tsched_watermark + u->watermark_inc_step); + fix_tsched_watermark(u); + + if (old_watermark != u->tsched_watermark) { + pa_log_info("Increasing wakeup watermark to %0.2f ms", + (double) pa_bytes_to_usec(u->tsched_watermark, &u->source->sample_spec) / PA_USEC_PER_MSEC); + return; + } + + /* Hmm, we cannot increase the watermark any further, hence let's raise the latency */ + old_min_latency = u->source->thread_info.min_latency; + new_min_latency = PA_MIN(old_min_latency * 2, old_min_latency + TSCHED_WATERMARK_INC_STEP_USEC); + new_min_latency = PA_MIN(new_min_latency, u->source->thread_info.max_latency); + + if (old_min_latency != new_min_latency) { + pa_log_info("Increasing minimal latency to %0.2f ms", + (double) new_min_latency / PA_USEC_PER_MSEC); + + pa_source_set_latency_range_within_thread(u->source, new_min_latency, u->source->thread_info.max_latency); + } + + /* When we reach this we're officialy fucked! */ +} + +static void decrease_watermark(struct userdata *u) { + size_t old_watermark; + pa_usec_t now; + + pa_assert(u); + pa_assert(u->use_tsched); + + now = pa_rtclock_now(); + + if (u->watermark_dec_not_before <= 0) + goto restart; + + if (u->watermark_dec_not_before > now) + return; + + old_watermark = u->tsched_watermark; + + if (u->tsched_watermark < u->watermark_dec_step) + u->tsched_watermark = u->tsched_watermark / 2; + else + u->tsched_watermark = PA_MAX(u->tsched_watermark / 2, u->tsched_watermark - u->watermark_dec_step); + + fix_tsched_watermark(u); + + if (old_watermark != u->tsched_watermark) + pa_log_info("Decreasing wakeup watermark to %0.2f ms", + (double) pa_bytes_to_usec(u->tsched_watermark, &u->source->sample_spec) / PA_USEC_PER_MSEC); + + /* We don't change the latency range*/ + +restart: + u->watermark_dec_not_before = now + TSCHED_WATERMARK_VERIFY_AFTER_USEC; +} + +static pa_usec_t hw_sleep_time(struct userdata *u, pa_usec_t *sleep_usec, pa_usec_t*process_usec) { + pa_usec_t wm, usec; + + pa_assert(sleep_usec); + pa_assert(process_usec); + + pa_assert(u); + pa_assert(u->use_tsched); + + usec = pa_source_get_requested_latency_within_thread(u->source); + + if (usec == (pa_usec_t) -1) + usec = pa_bytes_to_usec(u->hwbuf_size, &u->source->sample_spec); + + wm = pa_bytes_to_usec(u->tsched_watermark, &u->source->sample_spec); + + if (wm > usec) + wm = usec/2; + + *sleep_usec = usec - wm; + *process_usec = wm; + +#ifdef DEBUG_TIMING + pa_log_debug("Buffer time: %lu ms; Sleep time: %lu ms; Process time: %lu ms", + (unsigned long) (usec / PA_USEC_PER_MSEC), + (unsigned long) (*sleep_usec / PA_USEC_PER_MSEC), + (unsigned long) (*process_usec / PA_USEC_PER_MSEC)); +#endif + + return usec; +} + +static int try_recover(struct userdata *u, const char *call, int err) { + pa_assert(u); + pa_assert(call); + pa_assert(err < 0); + + pa_log_debug("%s: %s", call, pa_alsa_strerror(err)); + + pa_assert(err != -EAGAIN); + + if (err == -EPIPE) + pa_log_debug("%s: Buffer overrun!", call); + + if (err == -ESTRPIPE) + pa_log_debug("%s: System suspended!", call); + + if ((err = snd_pcm_recover(u->pcm_handle, err, 1)) < 0) { + pa_log("%s: %s", call, pa_alsa_strerror(err)); + return -1; + } + + snd_pcm_start(u->pcm_handle); + return 0; +} + +static size_t check_left_to_record(struct userdata *u, size_t n_bytes, pa_bool_t on_timeout) { + size_t left_to_record; + size_t rec_space = u->hwbuf_size - u->hwbuf_unused; + pa_bool_t overrun = FALSE; + + /* We use <= instead of < for this check here because an overrun + * only happens after the last sample was processed, not already when + * it is removed from the buffer. This is particularly important + * when block transfer is used. */ + + if (n_bytes <= rec_space) + left_to_record = rec_space - n_bytes; + else { + + /* We got a dropout. What a mess! */ + left_to_record = 0; + overrun = TRUE; + +#ifdef DEBUG_TIMING + PA_DEBUG_TRAP; +#endif + + if (pa_log_ratelimit()) + pa_log_info("Overrun!"); + } + +#ifdef DEBUG_TIMING + pa_log_debug("%0.2f ms left to record", (double) pa_bytes_to_usec(left_to_record, &u->source->sample_spec) / PA_USEC_PER_MSEC); +#endif + + if (u->use_tsched) { + pa_bool_t reset_not_before = TRUE; + + if (overrun || left_to_record < u->watermark_inc_threshold) + increase_watermark(u); + else if (left_to_record > u->watermark_dec_threshold) { + reset_not_before = FALSE; + + /* We decrease the watermark only if have actually been + * woken up by a timeout. If something else woke us up + * it's too easy to fulfill the deadlines... */ + + if (on_timeout) + decrease_watermark(u); + } + + if (reset_not_before) + u->watermark_dec_not_before = 0; + } + + return left_to_record; +} + +static int mmap_read(struct userdata *u, pa_usec_t *sleep_usec, pa_bool_t polled, pa_bool_t on_timeout) { + pa_bool_t work_done = FALSE; + pa_usec_t max_sleep_usec = 0, process_usec = 0; + size_t left_to_record; + unsigned j = 0; + + pa_assert(u); + pa_source_assert_ref(u->source); + + if (u->use_tsched) + hw_sleep_time(u, &max_sleep_usec, &process_usec); + + for (;;) { + snd_pcm_sframes_t n; + size_t n_bytes; + int r; + pa_bool_t after_avail = TRUE; + + if (PA_UNLIKELY((n = pa_alsa_safe_avail(u->pcm_handle, u->hwbuf_size, &u->source->sample_spec)) < 0)) { + + if ((r = try_recover(u, "snd_pcm_avail", (int) n)) == 0) + continue; + + return r; + } + + n_bytes = (size_t) n * u->frame_size; + +#ifdef DEBUG_TIMING + pa_log_debug("avail: %lu", (unsigned long) n_bytes); +#endif + + left_to_record = check_left_to_record(u, n_bytes, on_timeout); + on_timeout = FALSE; + + if (u->use_tsched) + if (!polled && + pa_bytes_to_usec(left_to_record, &u->source->sample_spec) > process_usec+max_sleep_usec/2) { +#ifdef DEBUG_TIMING + pa_log_debug("Not reading, because too early."); +#endif + break; + } + + if (PA_UNLIKELY(n_bytes <= 0)) { + + if (polled) + PA_ONCE_BEGIN { + char *dn = pa_alsa_get_driver_name_by_pcm(u->pcm_handle); + pa_log(_("ALSA woke us up to read new data from the device, but there was actually nothing to read!\n" + "Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.\n" + "We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() returned 0 or another value < min_avail."), + pa_strnull(dn)); + pa_xfree(dn); + } PA_ONCE_END; + +#ifdef DEBUG_TIMING + pa_log_debug("Not reading, because not necessary."); +#endif + break; + } + + if (++j > 10) { +#ifdef DEBUG_TIMING + pa_log_debug("Not filling up, because already too many iterations."); +#endif + + break; + } + + polled = FALSE; + +#ifdef DEBUG_TIMING + pa_log_debug("Reading"); +#endif + + for (;;) { + int err; + const snd_pcm_channel_area_t *areas; + snd_pcm_uframes_t offset, frames; + pa_memchunk chunk; + void *p; + snd_pcm_sframes_t sframes; + + frames = (snd_pcm_uframes_t) (n_bytes / u->frame_size); + +/* pa_log_debug("%lu frames to read", (unsigned long) frames); */ + + if (PA_UNLIKELY((err = pa_alsa_safe_mmap_begin(u->pcm_handle, &areas, &offset, &frames, u->hwbuf_size, &u->source->sample_spec)) < 0)) { + + if (!after_avail && err == -EAGAIN) + break; + + if ((r = try_recover(u, "snd_pcm_mmap_begin", err)) == 0) + continue; + + return r; + } + + /* Make sure that if these memblocks need to be copied they will fit into one slot */ + if (frames > pa_mempool_block_size_max(u->source->core->mempool)/u->frame_size) + frames = pa_mempool_block_size_max(u->source->core->mempool)/u->frame_size; + + if (!after_avail && frames == 0) + break; + + pa_assert(frames > 0); + after_avail = FALSE; + + /* Check these are multiples of 8 bit */ + pa_assert((areas[0].first & 7) == 0); + pa_assert((areas[0].step & 7)== 0); + + /* We assume a single interleaved memory buffer */ + pa_assert((areas[0].first >> 3) == 0); + pa_assert((areas[0].step >> 3) == u->frame_size); + + p = (uint8_t*) areas[0].addr + (offset * u->frame_size); + + chunk.memblock = pa_memblock_new_fixed(u->core->mempool, p, frames * u->frame_size, TRUE); + chunk.length = pa_memblock_get_length(chunk.memblock); + chunk.index = 0; + + pa_source_post(u->source, &chunk); + pa_memblock_unref_fixed(chunk.memblock); + + if (PA_UNLIKELY((sframes = snd_pcm_mmap_commit(u->pcm_handle, offset, frames)) < 0)) { + + if ((r = try_recover(u, "snd_pcm_mmap_commit", (int) sframes)) == 0) + continue; + + return r; + } + + work_done = TRUE; + + u->read_count += frames * u->frame_size; + +#ifdef DEBUG_TIMING + pa_log_debug("Read %lu bytes (of possible %lu bytes)", (unsigned long) (frames * u->frame_size), (unsigned long) n_bytes); +#endif + + if ((size_t) frames * u->frame_size >= n_bytes) + break; + + n_bytes -= (size_t) frames * u->frame_size; + } + } + + *sleep_usec = pa_bytes_to_usec(left_to_record, &u->source->sample_spec); + + if (*sleep_usec > process_usec) + *sleep_usec -= process_usec; + else + *sleep_usec = 0; + + return work_done ? 1 : 0; +} + +static int unix_read(struct userdata *u, pa_usec_t *sleep_usec, pa_bool_t polled, pa_bool_t on_timeout) { + int work_done = FALSE; + pa_usec_t max_sleep_usec = 0, process_usec = 0; + size_t left_to_record; + unsigned j = 0; + + pa_assert(u); + pa_source_assert_ref(u->source); + + if (u->use_tsched) + hw_sleep_time(u, &max_sleep_usec, &process_usec); + + for (;;) { + snd_pcm_sframes_t n; + size_t n_bytes; + int r; + pa_bool_t after_avail = TRUE; + + if (PA_UNLIKELY((n = pa_alsa_safe_avail(u->pcm_handle, u->hwbuf_size, &u->source->sample_spec)) < 0)) { + + if ((r = try_recover(u, "snd_pcm_avail", (int) n)) == 0) + continue; + + return r; + } + + n_bytes = (size_t) n * u->frame_size; + left_to_record = check_left_to_record(u, n_bytes, on_timeout); + on_timeout = FALSE; + + if (u->use_tsched) + if (!polled && + pa_bytes_to_usec(left_to_record, &u->source->sample_spec) > process_usec+max_sleep_usec/2) + break; + + if (PA_UNLIKELY(n_bytes <= 0)) { + + if (polled) + PA_ONCE_BEGIN { + char *dn = pa_alsa_get_driver_name_by_pcm(u->pcm_handle); + pa_log(_("ALSA woke us up to read new data from the device, but there was actually nothing to read!\n" + "Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.\n" + "We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() returned 0 or another value < min_avail."), + pa_strnull(dn)); + pa_xfree(dn); + } PA_ONCE_END; + + break; + } + + if (++j > 10) { +#ifdef DEBUG_TIMING + pa_log_debug("Not filling up, because already too many iterations."); +#endif + + break; + } + + polled = FALSE; + + for (;;) { + void *p; + snd_pcm_sframes_t frames; + pa_memchunk chunk; + + chunk.memblock = pa_memblock_new(u->core->mempool, (size_t) -1); + + frames = (snd_pcm_sframes_t) (pa_memblock_get_length(chunk.memblock) / u->frame_size); + + if (frames > (snd_pcm_sframes_t) (n_bytes/u->frame_size)) + frames = (snd_pcm_sframes_t) (n_bytes/u->frame_size); + +/* pa_log_debug("%lu frames to read", (unsigned long) n); */ + + p = pa_memblock_acquire(chunk.memblock); + frames = snd_pcm_readi(u->pcm_handle, (uint8_t*) p, (snd_pcm_uframes_t) frames); + pa_memblock_release(chunk.memblock); + + if (PA_UNLIKELY(frames < 0)) { + pa_memblock_unref(chunk.memblock); + + if (!after_avail && (int) frames == -EAGAIN) + break; + + if ((r = try_recover(u, "snd_pcm_readi", (int) frames)) == 0) + continue; + + return r; + } + + if (!after_avail && frames == 0) { + pa_memblock_unref(chunk.memblock); + break; + } + + pa_assert(frames > 0); + after_avail = FALSE; + + chunk.index = 0; + chunk.length = (size_t) frames * u->frame_size; + + pa_source_post(u->source, &chunk); + pa_memblock_unref(chunk.memblock); + + work_done = TRUE; + + u->read_count += frames * u->frame_size; + +/* pa_log_debug("read %lu frames", (unsigned long) frames); */ + + if ((size_t) frames * u->frame_size >= n_bytes) + break; + + n_bytes -= (size_t) frames * u->frame_size; + } + } + + *sleep_usec = pa_bytes_to_usec(left_to_record, &u->source->sample_spec); + + if (*sleep_usec > process_usec) + *sleep_usec -= process_usec; + else + *sleep_usec = 0; + + return work_done ? 1 : 0; +} + +static void update_smoother(struct userdata *u) { + snd_pcm_sframes_t delay = 0; + uint64_t position; + int err; + pa_usec_t now1 = 0, now2; + snd_pcm_status_t *status; + + snd_pcm_status_alloca(&status); + + pa_assert(u); + pa_assert(u->pcm_handle); + + /* Let's update the time smoother */ + + if (PA_UNLIKELY((err = pa_alsa_safe_delay(u->pcm_handle, &delay, u->hwbuf_size, &u->source->sample_spec)) < 0)) { + pa_log_warn("Failed to get delay: %s", pa_alsa_strerror(err)); + return; + } + + if (PA_UNLIKELY((err = snd_pcm_status(u->pcm_handle, status)) < 0)) + pa_log_warn("Failed to get timestamp: %s", pa_alsa_strerror(err)); + else { + snd_htimestamp_t htstamp = { 0, 0 }; + snd_pcm_status_get_htstamp(status, &htstamp); + now1 = pa_timespec_load(&htstamp); + } + + /* Hmm, if the timestamp is 0, then it wasn't set and we take the current time */ + if (now1 <= 0) + now1 = pa_rtclock_now(); + + /* check if the time since the last update is bigger than the interval */ + if (u->last_smoother_update > 0) + if (u->last_smoother_update + u->smoother_interval > now1) + return; + + position = u->read_count + ((uint64_t) delay * (uint64_t) u->frame_size); + now2 = pa_bytes_to_usec(position, &u->source->sample_spec); + + pa_smoother_put(u->smoother, now1, now2); + + u->last_smoother_update = now1; + /* exponentially increase the update interval up to the MAX limit */ + u->smoother_interval = PA_MIN (u->smoother_interval * 2, SMOOTHER_MAX_INTERVAL); +} + +static pa_usec_t source_get_latency(struct userdata *u) { + int64_t delay; + pa_usec_t now1, now2; + + pa_assert(u); + + now1 = pa_rtclock_now(); + now2 = pa_smoother_get(u->smoother, now1); + + delay = (int64_t) now2 - (int64_t) pa_bytes_to_usec(u->read_count, &u->source->sample_spec); + + return delay >= 0 ? (pa_usec_t) delay : 0; +} + +static int build_pollfd(struct userdata *u) { + pa_assert(u); + pa_assert(u->pcm_handle); + + if (u->alsa_rtpoll_item) + pa_rtpoll_item_free(u->alsa_rtpoll_item); + + if (!(u->alsa_rtpoll_item = pa_alsa_build_pollfd(u->pcm_handle, u->rtpoll))) + return -1; + + return 0; +} + +static int suspend(struct userdata *u) { + pa_assert(u); + pa_assert(u->pcm_handle); + + pa_smoother_pause(u->smoother, pa_rtclock_now()); + + /* Let's suspend */ + snd_pcm_close(u->pcm_handle); + u->pcm_handle = NULL; + + if (u->alsa_rtpoll_item) { + pa_rtpoll_item_free(u->alsa_rtpoll_item); + u->alsa_rtpoll_item = NULL; + } + + pa_log_info("Device suspended..."); + + return 0; +} + +static int update_sw_params(struct userdata *u) { + snd_pcm_uframes_t avail_min; + int err; + + pa_assert(u); + + /* Use the full buffer if noone asked us for anything specific */ + u->hwbuf_unused = 0; + + if (u->use_tsched) { + pa_usec_t latency; + + if ((latency = pa_source_get_requested_latency_within_thread(u->source)) != (pa_usec_t) -1) { + size_t b; + + pa_log_debug("latency set to %0.2fms", (double) latency / PA_USEC_PER_MSEC); + + b = pa_usec_to_bytes(latency, &u->source->sample_spec); + + /* We need at least one sample in our buffer */ + + if (PA_UNLIKELY(b < u->frame_size)) + b = u->frame_size; + + u->hwbuf_unused = PA_LIKELY(b < u->hwbuf_size) ? (u->hwbuf_size - b) : 0; + } + + fix_min_sleep_wakeup(u); + fix_tsched_watermark(u); + } + + pa_log_debug("hwbuf_unused=%lu", (unsigned long) u->hwbuf_unused); + + avail_min = 1; + + if (u->use_tsched) { + pa_usec_t sleep_usec, process_usec; + + hw_sleep_time(u, &sleep_usec, &process_usec); + avail_min += pa_usec_to_bytes(sleep_usec, &u->source->sample_spec) / u->frame_size; + } + + pa_log_debug("setting avail_min=%lu", (unsigned long) avail_min); + + if ((err = pa_alsa_set_sw_params(u->pcm_handle, avail_min, !u->use_tsched)) < 0) { + pa_log("Failed to set software parameters: %s", pa_alsa_strerror(err)); + return err; + } + + return 0; +} + +static int unsuspend(struct userdata *u) { + pa_sample_spec ss; + int err; + pa_bool_t b, d; + snd_pcm_uframes_t period_size, buffer_size; + + pa_assert(u); + pa_assert(!u->pcm_handle); + + pa_log_info("Trying resume..."); + + if ((err = snd_pcm_open(&u->pcm_handle, u->device_name, SND_PCM_STREAM_CAPTURE, + SND_PCM_NONBLOCK| + SND_PCM_NO_AUTO_RESAMPLE| + SND_PCM_NO_AUTO_CHANNELS| + SND_PCM_NO_AUTO_FORMAT)) < 0) { + pa_log("Error opening PCM device %s: %s", u->device_name, pa_alsa_strerror(err)); + goto fail; + } + + ss = u->source->sample_spec; + period_size = u->fragment_size / u->frame_size; + buffer_size = u->hwbuf_size / u->frame_size; + b = u->use_mmap; + d = u->use_tsched; + + if ((err = pa_alsa_set_hw_params(u->pcm_handle, &ss, &period_size, &buffer_size, 0, &b, &d, TRUE)) < 0) { + pa_log("Failed to set hardware parameters: %s", pa_alsa_strerror(err)); + goto fail; + } + + if (b != u->use_mmap || d != u->use_tsched) { + pa_log_warn("Resume failed, couldn't get original access mode."); + goto fail; + } + + if (!pa_sample_spec_equal(&ss, &u->source->sample_spec)) { + pa_log_warn("Resume failed, couldn't restore original sample settings."); + goto fail; + } + + if (period_size*u->frame_size != u->fragment_size || + buffer_size*u->frame_size != u->hwbuf_size) { + pa_log_warn("Resume failed, couldn't restore original fragment settings. (Old: %lu/%lu, New %lu/%lu)", + (unsigned long) u->hwbuf_size, (unsigned long) u->fragment_size, + (unsigned long) (buffer_size*u->frame_size), (unsigned long) (period_size*u->frame_size)); + goto fail; + } + + if (update_sw_params(u) < 0) + goto fail; + + if (build_pollfd(u) < 0) + goto fail; + + /* FIXME: We need to reload the volume somehow */ + + snd_pcm_start(u->pcm_handle); + + u->read_count = 0; + pa_smoother_reset(u->smoother, pa_rtclock_now(), TRUE); + u->smoother_interval = SMOOTHER_MIN_INTERVAL; + u->last_smoother_update = 0; + + pa_log_info("Resumed successfully..."); + + return 0; + +fail: + if (u->pcm_handle) { + snd_pcm_close(u->pcm_handle); + u->pcm_handle = NULL; + } + + return -PA_ERR_IO; +} + +static int source_process_msg(pa_msgobject *o, int code, void *data, int64_t offset, pa_memchunk *chunk) { + struct userdata *u = PA_SOURCE(o)->userdata; + + switch (code) { + + case PA_SOURCE_MESSAGE_GET_LATENCY: { + pa_usec_t r = 0; + + if (u->pcm_handle) + r = source_get_latency(u); + + *((pa_usec_t*) data) = r; + + return 0; + } + + case PA_SOURCE_MESSAGE_SET_STATE: + + switch ((pa_source_state_t) PA_PTR_TO_UINT(data)) { + + case PA_SOURCE_SUSPENDED: { + int r; + pa_assert(PA_SOURCE_IS_OPENED(u->source->thread_info.state)); + + if ((r = suspend(u)) < 0) + return r; + + break; + } + + case PA_SOURCE_IDLE: + case PA_SOURCE_RUNNING: { + int r; + + if (u->source->thread_info.state == PA_SOURCE_INIT) { + if (build_pollfd(u) < 0) + return -PA_ERR_IO; + + snd_pcm_start(u->pcm_handle); + } + + if (u->source->thread_info.state == PA_SOURCE_SUSPENDED) { + if ((r = unsuspend(u)) < 0) + return r; + } + + break; + } + + case PA_SOURCE_UNLINKED: + case PA_SOURCE_INIT: + case PA_SOURCE_INVALID_STATE: + ; + } + + break; + } + + return pa_source_process_msg(o, code, data, offset, chunk); +} + +/* Called from main context */ +static int source_set_state_cb(pa_source *s, pa_source_state_t new_state) { + pa_source_state_t old_state; + struct userdata *u; + + pa_source_assert_ref(s); + pa_assert_se(u = s->userdata); + + old_state = pa_source_get_state(u->source); + + if (PA_SINK_IS_OPENED(old_state) && new_state == PA_SINK_SUSPENDED) + reserve_done(u); + else if (old_state == PA_SINK_SUSPENDED && PA_SINK_IS_OPENED(new_state)) + if (reserve_init(u, u->device_name) < 0) + return -PA_ERR_BUSY; + + return 0; +} + +static int mixer_callback(snd_mixer_elem_t *elem, unsigned int mask) { + struct userdata *u = snd_mixer_elem_get_callback_private(elem); + + pa_assert(u); + pa_assert(u->mixer_handle); + + if (mask == SND_CTL_EVENT_MASK_REMOVE) + return 0; + + if (mask & SND_CTL_EVENT_MASK_VALUE) { + pa_source_get_volume(u->source, TRUE); + pa_source_get_mute(u->source, TRUE); + } + + return 0; +} + +static void source_get_volume_cb(pa_source *s) { + struct userdata *u = s->userdata; + pa_cvolume r; + char t[PA_CVOLUME_SNPRINT_MAX]; + + pa_assert(u); + pa_assert(u->mixer_path); + pa_assert(u->mixer_handle); + + if (pa_alsa_path_get_volume(u->mixer_path, u->mixer_handle, &s->channel_map, &r) < 0) + return; + + /* Shift down by the base volume, so that 0dB becomes maximum volume */ + pa_sw_cvolume_multiply_scalar(&r, &r, s->base_volume); + + pa_log_debug("Read hardware volume: %s", pa_cvolume_snprint(t, sizeof(t), &r)); + + if (pa_cvolume_equal(&u->hardware_volume, &r)) + return; + + s->volume = u->hardware_volume = r; + + /* Hmm, so the hardware volume changed, let's reset our software volume */ + if (u->mixer_path->has_dB) + pa_source_set_soft_volume(s, NULL); +} + +static void source_set_volume_cb(pa_source *s) { + struct userdata *u = s->userdata; + pa_cvolume r; + char t[PA_CVOLUME_SNPRINT_MAX]; + + pa_assert(u); + pa_assert(u->mixer_path); + pa_assert(u->mixer_handle); + + /* Shift up by the base volume */ + pa_sw_cvolume_divide_scalar(&r, &s->volume, s->base_volume); + + if (pa_alsa_path_set_volume(u->mixer_path, u->mixer_handle, &s->channel_map, &r) < 0) + return; + + /* Shift down by the base volume, so that 0dB becomes maximum volume */ + pa_sw_cvolume_multiply_scalar(&r, &r, s->base_volume); + + u->hardware_volume = r; + + if (u->mixer_path->has_dB) { + pa_cvolume new_soft_volume; + pa_bool_t accurate_enough; + + /* Match exactly what the user requested by software */ + pa_sw_cvolume_divide(&new_soft_volume, &s->volume, &u->hardware_volume); + + /* If the adjustment to do in software is only minimal we + * can skip it. That saves us CPU at the expense of a bit of + * accuracy */ + accurate_enough = + (pa_cvolume_min(&new_soft_volume) >= (PA_VOLUME_NORM - VOLUME_ACCURACY)) && + (pa_cvolume_max(&new_soft_volume) <= (PA_VOLUME_NORM + VOLUME_ACCURACY)); + + pa_log_debug("Requested volume: %s", pa_cvolume_snprint(t, sizeof(t), &s->volume)); + pa_log_debug("Got hardware volume: %s", pa_cvolume_snprint(t, sizeof(t), &u->hardware_volume)); + pa_log_debug("Calculated software volume: %s (accurate-enough=%s)", pa_cvolume_snprint(t, sizeof(t), &new_soft_volume), + pa_yes_no(accurate_enough)); + + if (!accurate_enough) + s->soft_volume = new_soft_volume; + + } else { + pa_log_debug("Wrote hardware volume: %s", pa_cvolume_snprint(t, sizeof(t), &r)); + + /* We can't match exactly what the user requested, hence let's + * at least tell the user about it */ + + s->volume = r; + } +} + +static void source_get_mute_cb(pa_source *s) { + struct userdata *u = s->userdata; + pa_bool_t b; + + pa_assert(u); + pa_assert(u->mixer_path); + pa_assert(u->mixer_handle); + + if (pa_alsa_path_get_mute(u->mixer_path, u->mixer_handle, &b) < 0) + return; + + s->muted = b; +} + +static void source_set_mute_cb(pa_source *s) { + struct userdata *u = s->userdata; + + pa_assert(u); + pa_assert(u->mixer_path); + pa_assert(u->mixer_handle); + + pa_alsa_path_set_mute(u->mixer_path, u->mixer_handle, s->muted); +} + +static int source_set_port_cb(pa_source *s, pa_device_port *p) { + struct userdata *u = s->userdata; + pa_alsa_port_data *data; + + pa_assert(u); + pa_assert(p); + pa_assert(u->mixer_handle); + + data = PA_DEVICE_PORT_DATA(p); + + pa_assert_se(u->mixer_path = data->path); + pa_alsa_path_select(u->mixer_path, u->mixer_handle); + + if (u->mixer_path->has_volume && u->mixer_path->has_dB) { + s->base_volume = pa_sw_volume_from_dB(-u->mixer_path->max_dB); + s->n_volume_steps = PA_VOLUME_NORM+1; + + if (u->mixer_path->max_dB > 0.0) + pa_log_info("Fixing base volume to %0.2f dB", pa_sw_volume_to_dB(s->base_volume)); + else + pa_log_info("No particular base volume set, fixing to 0 dB"); + } else { + s->base_volume = PA_VOLUME_NORM; + s->n_volume_steps = u->mixer_path->max_volume - u->mixer_path->min_volume + 1; + } + + if (data->setting) + pa_alsa_setting_select(data->setting, u->mixer_handle); + + if (s->set_mute) + s->set_mute(s); + if (s->set_volume) + s->set_volume(s); + + return 0; +} + +static void source_update_requested_latency_cb(pa_source *s) { + struct userdata *u = s->userdata; + pa_assert(u); + + if (!u->pcm_handle) + return; + + update_sw_params(u); +} + +static void thread_func(void *userdata) { + struct userdata *u = userdata; + unsigned short revents = 0; + + pa_assert(u); + + pa_log_debug("Thread starting up"); + + if (u->core->realtime_scheduling) + pa_make_realtime(u->core->realtime_priority); + + pa_thread_mq_install(&u->thread_mq); + + for (;;) { + int ret; + +#ifdef DEBUG_TIMING + pa_log_debug("Loop"); +#endif + + /* Read some data and pass it to the sources */ + if (PA_SOURCE_IS_OPENED(u->source->thread_info.state)) { + int work_done; + pa_usec_t sleep_usec = 0; + pa_bool_t on_timeout = pa_rtpoll_timer_elapsed(u->rtpoll); + + if (u->use_mmap) + work_done = mmap_read(u, &sleep_usec, revents & POLLIN, on_timeout); + else + work_done = unix_read(u, &sleep_usec, revents & POLLIN, on_timeout); + + if (work_done < 0) + goto fail; + +/* pa_log_debug("work_done = %i", work_done); */ + + if (work_done) + update_smoother(u); + + if (u->use_tsched) { + pa_usec_t cusec; + + /* OK, the capture buffer is now empty, let's + * calculate when to wake up next */ + +/* pa_log_debug("Waking up in %0.2fms (sound card clock).", (double) sleep_usec / PA_USEC_PER_MSEC); */ + + /* Convert from the sound card time domain to the + * system time domain */ + cusec = pa_smoother_translate(u->smoother, pa_rtclock_now(), sleep_usec); + +/* pa_log_debug("Waking up in %0.2fms (system clock).", (double) cusec / PA_USEC_PER_MSEC); */ + + /* We don't trust the conversion, so we wake up whatever comes first */ + pa_rtpoll_set_timer_relative(u->rtpoll, PA_MIN(sleep_usec, cusec)); + } + } else if (u->use_tsched) + + /* OK, we're in an invalid state, let's disable our timers */ + pa_rtpoll_set_timer_disabled(u->rtpoll); + + /* Hmm, nothing to do. Let's sleep */ + if ((ret = pa_rtpoll_run(u->rtpoll, TRUE)) < 0) + goto fail; + + if (ret == 0) + goto finish; + + /* Tell ALSA about this and process its response */ + if (PA_SOURCE_IS_OPENED(u->source->thread_info.state)) { + struct pollfd *pollfd; + int err; + unsigned n; + + pollfd = pa_rtpoll_item_get_pollfd(u->alsa_rtpoll_item, &n); + + if ((err = snd_pcm_poll_descriptors_revents(u->pcm_handle, pollfd, n, &revents)) < 0) { + pa_log("snd_pcm_poll_descriptors_revents() failed: %s", pa_alsa_strerror(err)); + goto fail; + } + + if (revents & ~POLLIN) { + if (pa_alsa_recover_from_poll(u->pcm_handle, revents) < 0) + goto fail; + + snd_pcm_start(u->pcm_handle); + } else if (revents && u->use_tsched && pa_log_ratelimit()) + pa_log_debug("Wakeup from ALSA!"); + + } else + revents = 0; + } + +fail: + /* If this was no regular exit from the loop we have to continue + * processing messages until we received PA_MESSAGE_SHUTDOWN */ + pa_asyncmsgq_post(u->thread_mq.outq, PA_MSGOBJECT(u->core), PA_CORE_MESSAGE_UNLOAD_MODULE, u->module, 0, NULL, NULL); + pa_asyncmsgq_wait_for(u->thread_mq.inq, PA_MESSAGE_SHUTDOWN); + +finish: + pa_log_debug("Thread shutting down"); +} + +static void set_source_name(pa_source_new_data *data, pa_modargs *ma, const char *device_id, const char *device_name, pa_alsa_mapping *mapping) { + const char *n; + char *t; + + pa_assert(data); + pa_assert(ma); + pa_assert(device_name); + + if ((n = pa_modargs_get_value(ma, "source_name", NULL))) { + pa_source_new_data_set_name(data, n); + data->namereg_fail = TRUE; + return; + } + + if ((n = pa_modargs_get_value(ma, "name", NULL))) + data->namereg_fail = TRUE; + else { + n = device_id ? device_id : device_name; + data->namereg_fail = FALSE; + } + + if (mapping) + t = pa_sprintf_malloc("alsa_input.%s.%s", n, mapping->name); + else + t = pa_sprintf_malloc("alsa_input.%s", n); + + pa_source_new_data_set_name(data, t); + pa_xfree(t); +} + +static void find_mixer(struct userdata *u, pa_alsa_mapping *mapping, const char *element, pa_bool_t ignore_dB) { + + if (!mapping && !element) + return; + + if (!(u->mixer_handle = pa_alsa_open_mixer_for_pcm(u->pcm_handle, &u->control_device))) { + pa_log_info("Failed to find a working mixer device."); + return; + } + + if (element) { + + if (!(u->mixer_path = pa_alsa_path_synthesize(element, PA_ALSA_DIRECTION_INPUT))) + goto fail; + + if (pa_alsa_path_probe(u->mixer_path, u->mixer_handle, ignore_dB) < 0) + goto fail; + + pa_log_debug("Probed mixer path %s:", u->mixer_path->name); + pa_alsa_path_dump(u->mixer_path); + } else { + + if (!(u->mixer_path_set = pa_alsa_path_set_new(mapping, PA_ALSA_DIRECTION_INPUT))) + goto fail; + + pa_alsa_path_set_probe(u->mixer_path_set, u->mixer_handle, ignore_dB); + + pa_log_debug("Probed mixer paths:"); + pa_alsa_path_set_dump(u->mixer_path_set); + } + + return; + +fail: + + if (u->mixer_path_set) { + pa_alsa_path_set_free(u->mixer_path_set); + u->mixer_path_set = NULL; + } else if (u->mixer_path) { + pa_alsa_path_free(u->mixer_path); + u->mixer_path = NULL; + } + + if (u->mixer_handle) { + snd_mixer_close(u->mixer_handle); + u->mixer_handle = NULL; + } +} + +static int setup_mixer(struct userdata *u, pa_bool_t ignore_dB) { + pa_assert(u); + + if (!u->mixer_handle) + return 0; + + if (u->source->active_port) { + pa_alsa_port_data *data; + + /* We have a list of supported paths, so let's activate the + * one that has been chosen as active */ + + data = PA_DEVICE_PORT_DATA(u->source->active_port); + u->mixer_path = data->path; + + pa_alsa_path_select(data->path, u->mixer_handle); + + if (data->setting) + pa_alsa_setting_select(data->setting, u->mixer_handle); + + } else { + + if (!u->mixer_path && u->mixer_path_set) + u->mixer_path = u->mixer_path_set->paths; + + if (u->mixer_path) { + /* Hmm, we have only a single path, then let's activate it */ + + pa_alsa_path_select(u->mixer_path, u->mixer_handle); + + if (u->mixer_path->settings) + pa_alsa_setting_select(u->mixer_path->settings, u->mixer_handle); + } else + return 0; + } + + if (!u->mixer_path->has_volume) + pa_log_info("Driver does not support hardware volume control, falling back to software volume control."); + else { + + if (u->mixer_path->has_dB) { + pa_log_info("Hardware volume ranges from %0.2f dB to %0.2f dB.", u->mixer_path->min_dB, u->mixer_path->max_dB); + + u->source->base_volume = pa_sw_volume_from_dB(-u->mixer_path->max_dB); + u->source->n_volume_steps = PA_VOLUME_NORM+1; + + if (u->mixer_path->max_dB > 0.0) + pa_log_info("Fixing base volume to %0.2f dB", pa_sw_volume_to_dB(u->source->base_volume)); + else + pa_log_info("No particular base volume set, fixing to 0 dB"); + + } else { + pa_log_info("Hardware volume ranges from %li to %li.", u->mixer_path->min_volume, u->mixer_path->max_volume); + u->source->base_volume = PA_VOLUME_NORM; + u->source->n_volume_steps = u->mixer_path->max_volume - u->mixer_path->min_volume + 1; + } + + u->source->get_volume = source_get_volume_cb; + u->source->set_volume = source_set_volume_cb; + + u->source->flags |= PA_SOURCE_HW_VOLUME_CTRL | (u->mixer_path->has_dB ? PA_SOURCE_DECIBEL_VOLUME : 0); + pa_log_info("Using hardware volume control. Hardware dB scale %s.", u->mixer_path->has_dB ? "supported" : "not supported"); + } + + if (!u->mixer_path->has_mute) { + pa_log_info("Driver does not support hardware mute control, falling back to software mute control."); + } else { + u->source->get_mute = source_get_mute_cb; + u->source->set_mute = source_set_mute_cb; + u->source->flags |= PA_SOURCE_HW_MUTE_CTRL; + pa_log_info("Using hardware mute control."); + } + + u->mixer_fdl = pa_alsa_fdlist_new(); + + if (pa_alsa_fdlist_set_mixer(u->mixer_fdl, u->mixer_handle, u->core->mainloop) < 0) { + pa_log("Failed to initialize file descriptor monitoring"); + return -1; + } + + if (u->mixer_path_set) + pa_alsa_path_set_set_callback(u->mixer_path_set, u->mixer_handle, mixer_callback, u); + else + pa_alsa_path_set_callback(u->mixer_path, u->mixer_handle, mixer_callback, u); + + return 0; +} + +pa_source *pa_alsa_source_new(pa_module *m, pa_modargs *ma, const char*driver, pa_card *card, pa_alsa_mapping *mapping) { + + struct userdata *u = NULL; + const char *dev_id = NULL; + pa_sample_spec ss, requested_ss; + pa_channel_map map; + uint32_t nfrags, frag_size, buffer_size, tsched_size, tsched_watermark; + snd_pcm_uframes_t period_frames, buffer_frames, tsched_frames; + size_t frame_size; + pa_bool_t use_mmap = TRUE, b, use_tsched = TRUE, d, ignore_dB = FALSE; + pa_source_new_data data; + pa_alsa_profile_set *profile_set = NULL; + + pa_assert(m); + pa_assert(ma); + + ss = m->core->default_sample_spec; + map = m->core->default_channel_map; + if (pa_modargs_get_sample_spec_and_channel_map(ma, &ss, &map, PA_CHANNEL_MAP_ALSA) < 0) { + pa_log("Failed to parse sample specification"); + goto fail; + } + + requested_ss = ss; + frame_size = pa_frame_size(&ss); + + nfrags = m->core->default_n_fragments; + frag_size = (uint32_t) pa_usec_to_bytes(m->core->default_fragment_size_msec*PA_USEC_PER_MSEC, &ss); + if (frag_size <= 0) + frag_size = (uint32_t) frame_size; + tsched_size = (uint32_t) pa_usec_to_bytes(DEFAULT_TSCHED_BUFFER_USEC, &ss); + tsched_watermark = (uint32_t) pa_usec_to_bytes(DEFAULT_TSCHED_WATERMARK_USEC, &ss); + + if (pa_modargs_get_value_u32(ma, "fragments", &nfrags) < 0 || + pa_modargs_get_value_u32(ma, "fragment_size", &frag_size) < 0 || + pa_modargs_get_value_u32(ma, "tsched_buffer_size", &tsched_size) < 0 || + pa_modargs_get_value_u32(ma, "tsched_buffer_watermark", &tsched_watermark) < 0) { + pa_log("Failed to parse buffer metrics"); + goto fail; + } + + buffer_size = nfrags * frag_size; + + period_frames = frag_size/frame_size; + buffer_frames = buffer_size/frame_size; + tsched_frames = tsched_size/frame_size; + + if (pa_modargs_get_value_boolean(ma, "mmap", &use_mmap) < 0) { + pa_log("Failed to parse mmap argument."); + goto fail; + } + + if (pa_modargs_get_value_boolean(ma, "tsched", &use_tsched) < 0) { + pa_log("Failed to parse timer_scheduling argument."); + goto fail; + } + + if (pa_modargs_get_value_boolean(ma, "ignore_dB", &ignore_dB) < 0) { + pa_log("Failed to parse ignore_dB argument."); + goto fail; + } + + use_tsched = pa_alsa_may_tsched(use_tsched); + + u = pa_xnew0(struct userdata, 1); + u->core = m->core; + u->module = m; + u->use_mmap = use_mmap; + u->use_tsched = use_tsched; + u->rtpoll = pa_rtpoll_new(); + pa_thread_mq_init(&u->thread_mq, m->core->mainloop, u->rtpoll); + + u->smoother = pa_smoother_new( + DEFAULT_TSCHED_WATERMARK_USEC*2, + DEFAULT_TSCHED_WATERMARK_USEC*2, + TRUE, + TRUE, + 5, + pa_rtclock_now(), + FALSE); + u->smoother_interval = SMOOTHER_MIN_INTERVAL; + + dev_id = pa_modargs_get_value( + ma, "device_id", + pa_modargs_get_value(ma, "device", DEFAULT_DEVICE)); + + if (reserve_init(u, dev_id) < 0) + goto fail; + + if (reserve_monitor_init(u, dev_id) < 0) + goto fail; + + b = use_mmap; + d = use_tsched; + + if (mapping) { + + if (!(dev_id = pa_modargs_get_value(ma, "device_id", NULL))) { + pa_log("device_id= not set"); + goto fail; + } + + if (!(u->pcm_handle = pa_alsa_open_by_device_id_mapping( + dev_id, + &u->device_name, + &ss, &map, + SND_PCM_STREAM_CAPTURE, + &period_frames, &buffer_frames, tsched_frames, + &b, &d, mapping))) + goto fail; + + } else if ((dev_id = pa_modargs_get_value(ma, "device_id", NULL))) { + + if (!(profile_set = pa_alsa_profile_set_new(NULL, &map))) + goto fail; + + if (!(u->pcm_handle = pa_alsa_open_by_device_id_auto( + dev_id, + &u->device_name, + &ss, &map, + SND_PCM_STREAM_CAPTURE, + &period_frames, &buffer_frames, tsched_frames, + &b, &d, profile_set, &mapping))) + goto fail; + + } else { + + if (!(u->pcm_handle = pa_alsa_open_by_device_string( + pa_modargs_get_value(ma, "device", DEFAULT_DEVICE), + &u->device_name, + &ss, &map, + SND_PCM_STREAM_CAPTURE, + &period_frames, &buffer_frames, tsched_frames, + &b, &d, FALSE))) + goto fail; + } + + pa_assert(u->device_name); + pa_log_info("Successfully opened device %s.", u->device_name); + + if (pa_alsa_pcm_is_modem(u->pcm_handle)) { + pa_log_notice("Device %s is modem, refusing further initialization.", u->device_name); + goto fail; + } + + if (mapping) + pa_log_info("Selected mapping '%s' (%s).", mapping->description, mapping->name); + + if (use_mmap && !b) { + pa_log_info("Device doesn't support mmap(), falling back to UNIX read/write mode."); + u->use_mmap = use_mmap = FALSE; + } + + if (use_tsched && (!b || !d)) { + pa_log_info("Cannot enable timer-based scheduling, falling back to sound IRQ scheduling."); + u->use_tsched = use_tsched = FALSE; + } + + if (u->use_mmap) + pa_log_info("Successfully enabled mmap() mode."); + + if (u->use_tsched) + pa_log_info("Successfully enabled timer-based scheduling mode."); + + /* ALSA might tweak the sample spec, so recalculate the frame size */ + frame_size = pa_frame_size(&ss); + + find_mixer(u, mapping, pa_modargs_get_value(ma, "control", NULL), ignore_dB); + + pa_source_new_data_init(&data); + data.driver = driver; + data.module = m; + data.card = card; + set_source_name(&data, ma, dev_id, u->device_name, mapping); + pa_source_new_data_set_sample_spec(&data, &ss); + pa_source_new_data_set_channel_map(&data, &map); + + pa_alsa_init_proplist_pcm(m->core, data.proplist, u->pcm_handle); + pa_proplist_sets(data.proplist, PA_PROP_DEVICE_STRING, u->device_name); + pa_proplist_setf(data.proplist, PA_PROP_DEVICE_BUFFERING_BUFFER_SIZE, "%lu", (unsigned long) (buffer_frames * frame_size)); + pa_proplist_setf(data.proplist, PA_PROP_DEVICE_BUFFERING_FRAGMENT_SIZE, "%lu", (unsigned long) (period_frames * frame_size)); + pa_proplist_sets(data.proplist, PA_PROP_DEVICE_ACCESS_MODE, u->use_tsched ? "mmap+timer" : (u->use_mmap ? "mmap" : "serial")); + + if (mapping) { + pa_proplist_sets(data.proplist, PA_PROP_DEVICE_PROFILE_NAME, mapping->name); + pa_proplist_sets(data.proplist, PA_PROP_DEVICE_PROFILE_DESCRIPTION, mapping->description); + } + + pa_alsa_init_description(data.proplist); + + if (u->control_device) + pa_alsa_init_proplist_ctl(data.proplist, u->control_device); + + if (pa_modargs_get_proplist(ma, "source_properties", data.proplist, PA_UPDATE_REPLACE) < 0) { + pa_log("Invalid properties"); + pa_source_new_data_done(&data); + goto fail; + } + + if (u->mixer_path_set) + pa_alsa_add_ports(&data.ports, u->mixer_path_set); + + u->source = pa_source_new(m->core, &data, PA_SOURCE_HARDWARE|PA_SOURCE_LATENCY|(u->use_tsched ? PA_SOURCE_DYNAMIC_LATENCY : 0)); + pa_source_new_data_done(&data); + + if (!u->source) { + pa_log("Failed to create source object"); + goto fail; + } + + u->source->parent.process_msg = source_process_msg; + u->source->update_requested_latency = source_update_requested_latency_cb; + u->source->set_state = source_set_state_cb; + u->source->set_port = source_set_port_cb; + u->source->userdata = u; + + pa_source_set_asyncmsgq(u->source, u->thread_mq.inq); + pa_source_set_rtpoll(u->source, u->rtpoll); + + u->frame_size = frame_size; + u->fragment_size = frag_size = (size_t) (period_frames * frame_size); + u->hwbuf_size = buffer_size = (size_t) (buffer_frames * frame_size); + pa_cvolume_mute(&u->hardware_volume, u->source->sample_spec.channels); + + pa_log_info("Using %0.1f fragments of size %lu bytes (%0.2fms), buffer size is %lu bytes (%0.2fms)", + (double) u->hwbuf_size / (double) u->fragment_size, + (long unsigned) u->fragment_size, + (double) pa_bytes_to_usec(u->fragment_size, &ss) / PA_USEC_PER_MSEC, + (long unsigned) u->hwbuf_size, + (double) pa_bytes_to_usec(u->hwbuf_size, &ss) / PA_USEC_PER_MSEC); + + if (u->use_tsched) { + u->tsched_watermark = pa_usec_to_bytes_round_up(pa_bytes_to_usec_round_up(tsched_watermark, &requested_ss), &u->source->sample_spec); + + u->watermark_inc_step = pa_usec_to_bytes(TSCHED_WATERMARK_INC_STEP_USEC, &u->source->sample_spec); + u->watermark_dec_step = pa_usec_to_bytes(TSCHED_WATERMARK_DEC_STEP_USEC, &u->source->sample_spec); + + u->watermark_inc_threshold = pa_usec_to_bytes_round_up(TSCHED_WATERMARK_INC_THRESHOLD_USEC, &u->source->sample_spec); + u->watermark_dec_threshold = pa_usec_to_bytes_round_up(TSCHED_WATERMARK_DEC_THRESHOLD_USEC, &u->source->sample_spec); + + fix_min_sleep_wakeup(u); + fix_tsched_watermark(u); + + pa_source_set_latency_range(u->source, + 0, + pa_bytes_to_usec(u->hwbuf_size, &ss)); + + pa_log_info("Time scheduling watermark is %0.2fms", + (double) pa_bytes_to_usec(u->tsched_watermark, &ss) / PA_USEC_PER_MSEC); + } else + pa_source_set_fixed_latency(u->source, pa_bytes_to_usec(u->hwbuf_size, &ss)); + + reserve_update(u); + + if (update_sw_params(u) < 0) + goto fail; + + if (setup_mixer(u, ignore_dB) < 0) + goto fail; + + pa_alsa_dump(PA_LOG_DEBUG, u->pcm_handle); + + if (!(u->thread = pa_thread_new(thread_func, u))) { + pa_log("Failed to create thread."); + goto fail; + } + /* Get initial mixer settings */ + if (data.volume_is_set) { + if (u->source->set_volume) + u->source->set_volume(u->source); + } else { + if (u->source->get_volume) + u->source->get_volume(u->source); + } + + if (data.muted_is_set) { + if (u->source->set_mute) + u->source->set_mute(u->source); + } else { + if (u->source->get_mute) + u->source->get_mute(u->source); + } + + pa_source_put(u->source); + + if (profile_set) + pa_alsa_profile_set_free(profile_set); + + return u->source; + +fail: + + if (u) + userdata_free(u); + + if (profile_set) + pa_alsa_profile_set_free(profile_set); + + return NULL; +} + +static void userdata_free(struct userdata *u) { + pa_assert(u); + + if (u->source) + pa_source_unlink(u->source); + + if (u->thread) { + pa_asyncmsgq_send(u->thread_mq.inq, NULL, PA_MESSAGE_SHUTDOWN, NULL, 0, NULL); + pa_thread_free(u->thread); + } + + pa_thread_mq_done(&u->thread_mq); + + if (u->source) + pa_source_unref(u->source); + + if (u->alsa_rtpoll_item) + pa_rtpoll_item_free(u->alsa_rtpoll_item); + + if (u->rtpoll) + pa_rtpoll_free(u->rtpoll); + + if (u->pcm_handle) { + snd_pcm_drop(u->pcm_handle); + snd_pcm_close(u->pcm_handle); + } + + if (u->mixer_fdl) + pa_alsa_fdlist_free(u->mixer_fdl); + + if (u->mixer_path_set) + pa_alsa_path_set_free(u->mixer_path_set); + else if (u->mixer_path) + pa_alsa_path_free(u->mixer_path); + + if (u->mixer_handle) + snd_mixer_close(u->mixer_handle); + + if (u->smoother) + pa_smoother_free(u->smoother); + + reserve_done(u); + monitor_done(u); + + pa_xfree(u->device_name); + pa_xfree(u->control_device); + pa_xfree(u); +} + +void pa_alsa_source_free(pa_source *s) { + struct userdata *u; + + pa_source_assert_ref(s); + pa_assert_se(u = s->userdata); + + userdata_free(u); +} diff --git a/src/modules/alsa/alsa-source.h b/src/modules/alsa/alsa-source.h new file mode 100644 index 0000000..5d9409e --- /dev/null +++ b/src/modules/alsa/alsa-source.h @@ -0,0 +1,36 @@ +#ifndef fooalsasourcehfoo +#define fooalsasourcehfoo + +/*** + This file is part of PulseAudio. + + Copyright 2004-2006 Lennart Poettering + Copyright 2006 Pierre Ossman for Cendio AB + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#include +#include +#include + +#include "alsa-util.h" + +pa_source* pa_alsa_source_new(pa_module *m, pa_modargs *ma, const char*driver, pa_card *card, pa_alsa_mapping *mapping); + +void pa_alsa_source_free(pa_source *s); + +#endif diff --git a/src/modules/alsa/alsa-util.c b/src/modules/alsa/alsa-util.c new file mode 100644 index 0000000..002e09b --- /dev/null +++ b/src/modules/alsa/alsa-util.c @@ -0,0 +1,1344 @@ +/*** + This file is part of PulseAudio. + + Copyright 2004-2009 Lennart Poettering + Copyright 2006 Pierre Ossman for Cendio AB + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "alsa-util.h" +#include "alsa-mixer.h" + +#ifdef HAVE_HAL +#include "hal-util.h" +#endif + +#ifdef HAVE_UDEV +#include "udev-util.h" +#endif + +#define CUSTOM_BUFFER_MANAGEMENT +#define CUSTOM_PERIOD_SIZE 1024 + +static int set_format(snd_pcm_t *pcm_handle, snd_pcm_hw_params_t *hwparams, pa_sample_format_t *f) { + + static const snd_pcm_format_t format_trans[] = { + [PA_SAMPLE_U8] = SND_PCM_FORMAT_U8, + [PA_SAMPLE_ALAW] = SND_PCM_FORMAT_A_LAW, + [PA_SAMPLE_ULAW] = SND_PCM_FORMAT_MU_LAW, + [PA_SAMPLE_S16LE] = SND_PCM_FORMAT_S16_LE, + [PA_SAMPLE_S16BE] = SND_PCM_FORMAT_S16_BE, + [PA_SAMPLE_FLOAT32LE] = SND_PCM_FORMAT_FLOAT_LE, + [PA_SAMPLE_FLOAT32BE] = SND_PCM_FORMAT_FLOAT_BE, + [PA_SAMPLE_S32LE] = SND_PCM_FORMAT_S32_LE, + [PA_SAMPLE_S32BE] = SND_PCM_FORMAT_S32_BE, + [PA_SAMPLE_S24LE] = SND_PCM_FORMAT_S24_3LE, + [PA_SAMPLE_S24BE] = SND_PCM_FORMAT_S24_3BE, + [PA_SAMPLE_S24_32LE] = SND_PCM_FORMAT_S24_LE, + [PA_SAMPLE_S24_32BE] = SND_PCM_FORMAT_S24_BE, + }; + + static const pa_sample_format_t try_order[] = { + PA_SAMPLE_FLOAT32NE, + PA_SAMPLE_FLOAT32RE, + PA_SAMPLE_S32NE, + PA_SAMPLE_S32RE, + PA_SAMPLE_S24_32NE, + PA_SAMPLE_S24_32RE, + PA_SAMPLE_S24NE, + PA_SAMPLE_S24RE, + PA_SAMPLE_S16NE, + PA_SAMPLE_S16RE, + PA_SAMPLE_ALAW, + PA_SAMPLE_ULAW, + PA_SAMPLE_U8 + }; + + unsigned i; + int ret; + + pa_assert(pcm_handle); + pa_assert(hwparams); + pa_assert(f); + + if ((ret = snd_pcm_hw_params_set_format(pcm_handle, hwparams, format_trans[*f])) >= 0) + return ret; + + pa_log_debug("snd_pcm_hw_params_set_format(%s) failed: %s", + snd_pcm_format_description(format_trans[*f]), + pa_alsa_strerror(ret)); + + if (*f == PA_SAMPLE_FLOAT32BE) + *f = PA_SAMPLE_FLOAT32LE; + else if (*f == PA_SAMPLE_FLOAT32LE) + *f = PA_SAMPLE_FLOAT32BE; + else if (*f == PA_SAMPLE_S24BE) + *f = PA_SAMPLE_S24LE; + else if (*f == PA_SAMPLE_S24LE) + *f = PA_SAMPLE_S24BE; + else if (*f == PA_SAMPLE_S24_32BE) + *f = PA_SAMPLE_S24_32LE; + else if (*f == PA_SAMPLE_S24_32LE) + *f = PA_SAMPLE_S24_32BE; + else if (*f == PA_SAMPLE_S16BE) + *f = PA_SAMPLE_S16LE; + else if (*f == PA_SAMPLE_S16LE) + *f = PA_SAMPLE_S16BE; + else if (*f == PA_SAMPLE_S32BE) + *f = PA_SAMPLE_S32LE; + else if (*f == PA_SAMPLE_S32LE) + *f = PA_SAMPLE_S32BE; + else + goto try_auto; + + if ((ret = snd_pcm_hw_params_set_format(pcm_handle, hwparams, format_trans[*f])) >= 0) + return ret; + + pa_log_debug("snd_pcm_hw_params_set_format(%s) failed: %s", + snd_pcm_format_description(format_trans[*f]), + pa_alsa_strerror(ret)); + +try_auto: + + for (i = 0; i < PA_ELEMENTSOF(try_order); i++) { + *f = try_order[i]; + + if ((ret = snd_pcm_hw_params_set_format(pcm_handle, hwparams, format_trans[*f])) >= 0) + return ret; + + pa_log_debug("snd_pcm_hw_params_set_format(%s) failed: %s", + snd_pcm_format_description(format_trans[*f]), + pa_alsa_strerror(ret)); + } + + return -1; +} + +static int set_period_size(snd_pcm_t *pcm_handle, snd_pcm_hw_params_t *hwparams, snd_pcm_uframes_t size) { + snd_pcm_uframes_t s; + int d, ret; + + pa_assert(pcm_handle); + pa_assert(hwparams); + + s = size; + d = 0; + if (snd_pcm_hw_params_set_period_size_near(pcm_handle, hwparams, &s, &d) < 0) { + s = size; + d = -1; + if (snd_pcm_hw_params_set_period_size_near(pcm_handle, hwparams, &s, &d) < 0) { + s = size; + d = 1; + if ((ret = snd_pcm_hw_params_set_period_size_near(pcm_handle, hwparams, &s, &d)) < 0) { + pa_log_info("snd_pcm_hw_params_set_period_size_near() failed: %s", pa_alsa_strerror(ret)); + return ret; + } + } + } + + return 0; +} + +static int set_buffer_size(snd_pcm_t *pcm_handle, snd_pcm_hw_params_t *hwparams, snd_pcm_uframes_t size) { + int ret; + + pa_assert(pcm_handle); + pa_assert(hwparams); + + if ((ret = snd_pcm_hw_params_set_buffer_size_near(pcm_handle, hwparams, &size)) < 0) { + pa_log_info("snd_pcm_hw_params_set_buffer_size_near() failed: %s", pa_alsa_strerror(ret)); + return ret; + } + + return 0; +} + +/* Set the hardware parameters of the given ALSA device. Returns the + * selected fragment settings in *buffer_size and *period_size. If tsched mode can be enabled */ +int pa_alsa_set_hw_params( + snd_pcm_t *pcm_handle, + pa_sample_spec *ss, + snd_pcm_uframes_t *period_size, + snd_pcm_uframes_t *buffer_size, + snd_pcm_uframes_t tsched_size, + pa_bool_t *use_mmap, + pa_bool_t *use_tsched, + pa_bool_t require_exact_channel_number) { + + int ret = -1; + snd_pcm_hw_params_t *hwparams, *hwparams_copy; + int dir; + snd_pcm_uframes_t _period_size = period_size ? *period_size : 0; + snd_pcm_uframes_t _buffer_size = buffer_size ? *buffer_size : 0; + pa_bool_t _use_mmap = use_mmap && *use_mmap; + pa_bool_t _use_tsched = use_tsched && *use_tsched; + pa_sample_spec _ss = *ss; + + pa_assert(pcm_handle); + pa_assert(ss); + + snd_pcm_hw_params_alloca(&hwparams); + snd_pcm_hw_params_alloca(&hwparams_copy); + + if ((ret = snd_pcm_hw_params_any(pcm_handle, hwparams)) < 0) { + pa_log_debug("snd_pcm_hw_params_any() failed: %s", pa_alsa_strerror(ret)); + goto finish; + } + + if ((ret = snd_pcm_hw_params_set_rate_resample(pcm_handle, hwparams, 0)) < 0) { + pa_log_debug("snd_pcm_hw_params_set_rate_resample() failed: %s", pa_alsa_strerror(ret)); + goto finish; + } + + if (_use_mmap) { + + if (snd_pcm_hw_params_set_access(pcm_handle, hwparams, SND_PCM_ACCESS_MMAP_INTERLEAVED) < 0) { + + /* mmap() didn't work, fall back to interleaved */ + + if ((ret = snd_pcm_hw_params_set_access(pcm_handle, hwparams, SND_PCM_ACCESS_RW_INTERLEAVED)) < 0) { + pa_log_debug("snd_pcm_hw_params_set_access() failed: %s", pa_alsa_strerror(ret)); + goto finish; + } + + _use_mmap = FALSE; + } + + } else if ((ret = snd_pcm_hw_params_set_access(pcm_handle, hwparams, SND_PCM_ACCESS_RW_INTERLEAVED)) < 0) { + pa_log_debug("snd_pcm_hw_params_set_access() failed: %s", pa_alsa_strerror(ret)); + goto finish; + } + + if (!_use_mmap) + _use_tsched = FALSE; + + if (!pa_alsa_pcm_is_hw(pcm_handle)) + _use_tsched = FALSE; + + if ((ret = set_format(pcm_handle, hwparams, &_ss.format)) < 0) + goto finish; + + if ((ret = snd_pcm_hw_params_set_rate_near(pcm_handle, hwparams, &_ss.rate, NULL)) < 0) { + pa_log_debug("snd_pcm_hw_params_set_rate_near() failed: %s", pa_alsa_strerror(ret)); + goto finish; + } + + /* We ignore very small sampling rate deviations */ + if (_ss.rate >= ss->rate*.95 && _ss.rate <= ss->rate*1.05) + _ss.rate = ss->rate; + + if (require_exact_channel_number) { + if ((ret = snd_pcm_hw_params_set_channels(pcm_handle, hwparams, _ss.channels)) < 0) { + pa_log_debug("snd_pcm_hw_params_set_channels(%u) failed: %s", _ss.channels, pa_alsa_strerror(ret)); + goto finish; + } + } else { + unsigned int c = _ss.channels; + + if ((ret = snd_pcm_hw_params_set_channels_near(pcm_handle, hwparams, &c)) < 0) { + pa_log_debug("snd_pcm_hw_params_set_channels_near(%u) failed: %s", _ss.channels, pa_alsa_strerror(ret)); + goto finish; + } + + _ss.channels = c; + } + + if (_use_tsched && tsched_size > 0) { +#ifdef CUSTOM_BUFFER_MANAGEMENT + _period_size = CUSTOM_PERIOD_SIZE; + _buffer_size = _period_size * 4; +#else + _buffer_size = (snd_pcm_uframes_t) (((uint64_t) tsched_size * _ss.rate) / ss->rate); + _period_size = _buffer_size; +#endif + } else { + _period_size = (snd_pcm_uframes_t) (((uint64_t) _period_size * _ss.rate) / ss->rate); + _buffer_size = (snd_pcm_uframes_t) (((uint64_t) _buffer_size * _ss.rate) / ss->rate); + } + + if (_buffer_size > 0 || _period_size > 0) { + snd_pcm_uframes_t max_frames = 0; + + if ((ret = snd_pcm_hw_params_get_buffer_size_max(hwparams, &max_frames)) < 0) + pa_log_warn("snd_pcm_hw_params_get_buffer_size_max() failed: %s", pa_alsa_strerror(ret)); + else + pa_log_debug("Maximum hw buffer size is %lu ms", (long unsigned) (max_frames * PA_MSEC_PER_SEC / _ss.rate)); + + /* Some ALSA drivers really don't like if we set the buffer + * size first and the number of periods second. (which would + * make a lot more sense to me) So, try a few combinations + * before we give up. */ + + if (_buffer_size > 0 && _period_size > 0) { + snd_pcm_hw_params_copy(hwparams_copy, hwparams); + + /* First try: set buffer size first, followed by period size */ + if (set_buffer_size(pcm_handle, hwparams_copy, _buffer_size) >= 0 && + set_period_size(pcm_handle, hwparams_copy, _period_size) >= 0 && + snd_pcm_hw_params(pcm_handle, hwparams_copy) >= 0) { + pa_log_debug("Set buffer size first (to %lu samples), period size second (to %lu samples).", (unsigned long) _buffer_size, (unsigned long) _period_size); + goto success; + } + + /* Second try: set period size first, followed by buffer size */ + if (set_period_size(pcm_handle, hwparams_copy, _period_size) >= 0 && + set_buffer_size(pcm_handle, hwparams_copy, _buffer_size) >= 0 && + snd_pcm_hw_params(pcm_handle, hwparams_copy) >= 0) { + pa_log_debug("Set period size first (to %lu samples), buffer size second (to %lu samples).", (unsigned long) _period_size, (unsigned long) _buffer_size); + goto success; + } + } + + if (_buffer_size > 0) { + snd_pcm_hw_params_copy(hwparams_copy, hwparams); + + /* Third try: set only buffer size */ + if (set_buffer_size(pcm_handle, hwparams_copy, _buffer_size) >= 0 && + snd_pcm_hw_params(pcm_handle, hwparams_copy) >= 0) { + pa_log_debug("Set only buffer size (to %lu samples).", (unsigned long) _buffer_size); + goto success; + } + } + + if (_period_size > 0) { + snd_pcm_hw_params_copy(hwparams_copy, hwparams); + + /* Fourth try: set only period size */ + if (set_period_size(pcm_handle, hwparams_copy, _period_size) >= 0 && + snd_pcm_hw_params(pcm_handle, hwparams_copy) >= 0) { + pa_log_debug("Set only period size (to %lu samples).", (unsigned long) _period_size); + goto success; + } + } + } + + pa_log_debug("Set neither period nor buffer size."); + + /* Last chance, set nothing */ + if ((ret = snd_pcm_hw_params(pcm_handle, hwparams)) < 0) { + pa_log_info("snd_pcm_hw_params failed: %s", pa_alsa_strerror(ret)); + goto finish; + } + +success: + + if (ss->rate != _ss.rate) + pa_log_info("Device %s doesn't support %u Hz, changed to %u Hz.", snd_pcm_name(pcm_handle), ss->rate, _ss.rate); + + if (ss->channels != _ss.channels) + pa_log_info("Device %s doesn't support %u channels, changed to %u.", snd_pcm_name(pcm_handle), ss->channels, _ss.channels); + + if (ss->format != _ss.format) + pa_log_info("Device %s doesn't support sample format %s, changed to %s.", snd_pcm_name(pcm_handle), pa_sample_format_to_string(ss->format), pa_sample_format_to_string(_ss.format)); + + if ((ret = snd_pcm_prepare(pcm_handle)) < 0) { + pa_log_info("snd_pcm_prepare() failed: %s", pa_alsa_strerror(ret)); + goto finish; + } + + if ((ret = snd_pcm_hw_params_current(pcm_handle, hwparams)) < 0) { + pa_log_info("snd_pcm_hw_params_current() failed: %s", pa_alsa_strerror(ret)); + goto finish; + } + + if ((ret = snd_pcm_hw_params_get_period_size(hwparams, &_period_size, &dir)) < 0 || + (ret = snd_pcm_hw_params_get_buffer_size(hwparams, &_buffer_size)) < 0) { + pa_log_info("snd_pcm_hw_params_get_{period|buffer}_size() failed: %s", pa_alsa_strerror(ret)); + goto finish; + } + + ss->rate = _ss.rate; + ss->channels = _ss.channels; + ss->format = _ss.format; + + pa_assert(_period_size > 0); + pa_assert(_buffer_size > 0); + + if (buffer_size) + *buffer_size = _buffer_size; + + if (period_size) + *period_size = _period_size; + + if (use_mmap) + *use_mmap = _use_mmap; + + if (use_tsched) + *use_tsched = _use_tsched; + + ret = 0; + + snd_pcm_nonblock(pcm_handle, 1); + +finish: + + return ret; +} + +int pa_alsa_set_sw_params(snd_pcm_t *pcm, snd_pcm_uframes_t avail_min, pa_bool_t period_event) { + snd_pcm_sw_params_t *swparams; + snd_pcm_uframes_t boundary; + int err; + + pa_assert(pcm); + + snd_pcm_sw_params_alloca(&swparams); + + if ((err = snd_pcm_sw_params_current(pcm, swparams) < 0)) { + pa_log_warn("Unable to determine current swparams: %s\n", pa_alsa_strerror(err)); + return err; + } + + if ((err = snd_pcm_sw_params_set_period_event(pcm, swparams, period_event)) < 0) { + pa_log_warn("Unable to disable period event: %s\n", pa_alsa_strerror(err)); + return err; + } + + if ((err = snd_pcm_sw_params_set_tstamp_mode(pcm, swparams, SND_PCM_TSTAMP_ENABLE)) < 0) { + pa_log_warn("Unable to enable time stamping: %s\n", pa_alsa_strerror(err)); + return err; + } + + if ((err = snd_pcm_sw_params_get_boundary(swparams, &boundary)) < 0) { + pa_log_warn("Unable to get boundary: %s\n", pa_alsa_strerror(err)); + return err; + } + + if ((err = snd_pcm_sw_params_set_stop_threshold(pcm, swparams, boundary)) < 0) { + pa_log_warn("Unable to set stop threshold: %s\n", pa_alsa_strerror(err)); + return err; + } + + if ((err = snd_pcm_sw_params_set_start_threshold(pcm, swparams, (snd_pcm_uframes_t) -1)) < 0) { + pa_log_warn("Unable to set start threshold: %s\n", pa_alsa_strerror(err)); + return err; + } + + if ((err = snd_pcm_sw_params_set_avail_min(pcm, swparams, avail_min)) < 0) { + pa_log_error("snd_pcm_sw_params_set_avail_min() failed: %s", pa_alsa_strerror(err)); + return err; + } + + if ((err = snd_pcm_sw_params(pcm, swparams)) < 0) { + pa_log_warn("Unable to set sw params: %s\n", pa_alsa_strerror(err)); + return err; + } + + return 0; +} + +snd_pcm_t *pa_alsa_open_by_device_id_auto( + const char *dev_id, + char **dev, + pa_sample_spec *ss, + pa_channel_map* map, + int mode, + snd_pcm_uframes_t *period_size, + snd_pcm_uframes_t *buffer_size, + snd_pcm_uframes_t tsched_size, + pa_bool_t *use_mmap, + pa_bool_t *use_tsched, + pa_alsa_profile_set *ps, + pa_alsa_mapping **mapping) { + + char *d; + snd_pcm_t *pcm_handle; + void *state; + pa_alsa_mapping *m; + + pa_assert(dev_id); + pa_assert(dev); + pa_assert(ss); + pa_assert(map); + pa_assert(ps); + + /* First we try to find a device string with a superset of the + * requested channel map. We iterate through our device table from + * top to bottom and take the first that matches. If we didn't + * find a working device that way, we iterate backwards, and check + * all devices that do not provide a superset of the requested + * channel map.*/ + + PA_HASHMAP_FOREACH(m, ps->mappings, state) { + if (!pa_channel_map_superset(&m->channel_map, map)) + continue; + + pa_log_debug("Checking for superset %s (%s)", m->name, m->device_strings[0]); + + pcm_handle = pa_alsa_open_by_device_id_mapping( + dev_id, + dev, + ss, + map, + mode, + period_size, + buffer_size, + tsched_size, + use_mmap, + use_tsched, + m); + + if (pcm_handle) { + if (mapping) + *mapping = m; + + return pcm_handle; + } + } + + PA_HASHMAP_FOREACH_BACKWARDS(m, ps->mappings, state) { + if (pa_channel_map_superset(&m->channel_map, map)) + continue; + + pa_log_debug("Checking for subset %s (%s)", m->name, m->device_strings[0]); + + pcm_handle = pa_alsa_open_by_device_id_mapping( + dev_id, + dev, + ss, + map, + mode, + period_size, + buffer_size, + tsched_size, + use_mmap, + use_tsched, + m); + + if (pcm_handle) { + if (mapping) + *mapping = m; + + return pcm_handle; + } + } + + /* OK, we didn't find any good device, so let's try the raw hw: stuff */ + d = pa_sprintf_malloc("hw:%s", dev_id); + pa_log_debug("Trying %s as last resort...", d); + pcm_handle = pa_alsa_open_by_device_string( + d, + dev, + ss, + map, + mode, + period_size, + buffer_size, + tsched_size, + use_mmap, + use_tsched, + FALSE); + pa_xfree(d); + + if (pcm_handle && mapping) + *mapping = NULL; + + return pcm_handle; +} + +snd_pcm_t *pa_alsa_open_by_device_id_mapping( + const char *dev_id, + char **dev, + pa_sample_spec *ss, + pa_channel_map* map, + int mode, + snd_pcm_uframes_t *period_size, + snd_pcm_uframes_t *buffer_size, + snd_pcm_uframes_t tsched_size, + pa_bool_t *use_mmap, + pa_bool_t *use_tsched, + pa_alsa_mapping *m) { + + snd_pcm_t *pcm_handle; + pa_sample_spec try_ss; + pa_channel_map try_map; + + pa_assert(dev_id); + pa_assert(dev); + pa_assert(ss); + pa_assert(map); + pa_assert(m); + + try_ss.channels = m->channel_map.channels; + try_ss.rate = ss->rate; + try_ss.format = ss->format; + try_map = m->channel_map; + + pcm_handle = pa_alsa_open_by_template( + m->device_strings, + dev_id, + dev, + &try_ss, + &try_map, + mode, + period_size, + buffer_size, + tsched_size, + use_mmap, + use_tsched, + TRUE); + + if (!pcm_handle) + return NULL; + + *ss = try_ss; + *map = try_map; + pa_assert(map->channels == ss->channels); + + return pcm_handle; +} + +snd_pcm_t *pa_alsa_open_by_device_string( + const char *device, + char **dev, + pa_sample_spec *ss, + pa_channel_map* map, + int mode, + snd_pcm_uframes_t *period_size, + snd_pcm_uframes_t *buffer_size, + snd_pcm_uframes_t tsched_size, + pa_bool_t *use_mmap, + pa_bool_t *use_tsched, + pa_bool_t require_exact_channel_number) { + + int err; + char *d; + snd_pcm_t *pcm_handle; + pa_bool_t reformat = FALSE; + + pa_assert(device); + pa_assert(ss); + pa_assert(map); + + d = pa_xstrdup(device); + + for (;;) { + pa_log_debug("Trying %s %s SND_PCM_NO_AUTO_FORMAT ...", d, reformat ? "without" : "with"); + + if ((err = snd_pcm_open(&pcm_handle, d, mode, + SND_PCM_NONBLOCK| + SND_PCM_NO_AUTO_RESAMPLE| + SND_PCM_NO_AUTO_CHANNELS| + (reformat ? 0 : SND_PCM_NO_AUTO_FORMAT))) < 0) { + pa_log_info("Error opening PCM device %s: %s", d, pa_alsa_strerror(err)); + goto fail; + } + + pa_log_debug("Managed to open %s", d); + + if ((err = pa_alsa_set_hw_params( + pcm_handle, + ss, + period_size, + buffer_size, + tsched_size, + use_mmap, + use_tsched, + require_exact_channel_number)) < 0) { + + if (!reformat) { + reformat = TRUE; + + snd_pcm_close(pcm_handle); + continue; + } + + /* Hmm, some hw is very exotic, so we retry with plug, if without it didn't work */ + if (!pa_startswith(d, "plug:") && !pa_startswith(d, "plughw:")) { + char *t; + + t = pa_sprintf_malloc("plug:%s", d); + pa_xfree(d); + d = t; + + reformat = FALSE; + + snd_pcm_close(pcm_handle); + continue; + } + + pa_log_info("Failed to set hardware parameters on %s: %s", d, pa_alsa_strerror(err)); + snd_pcm_close(pcm_handle); + + goto fail; + } + + if (dev) + *dev = d; + else + pa_xfree(d); + + if (ss->channels != map->channels) + pa_channel_map_init_extend(map, ss->channels, PA_CHANNEL_MAP_ALSA); + + return pcm_handle; + } + +fail: + pa_xfree(d); + + return NULL; +} + +snd_pcm_t *pa_alsa_open_by_template( + char **template, + const char *dev_id, + char **dev, + pa_sample_spec *ss, + pa_channel_map* map, + int mode, + snd_pcm_uframes_t *period_size, + snd_pcm_uframes_t *buffer_size, + snd_pcm_uframes_t tsched_size, + pa_bool_t *use_mmap, + pa_bool_t *use_tsched, + pa_bool_t require_exact_channel_number) { + + snd_pcm_t *pcm_handle; + char **i; + + for (i = template; *i; i++) { + char *d; + + d = pa_replace(*i, "%f", dev_id); + + pcm_handle = pa_alsa_open_by_device_string( + d, + dev, + ss, + map, + mode, + period_size, + buffer_size, + tsched_size, + use_mmap, + use_tsched, + require_exact_channel_number); + + pa_xfree(d); + + if (pcm_handle) + return pcm_handle; + } + + return NULL; +} + +void pa_alsa_dump(pa_log_level_t level, snd_pcm_t *pcm) { + int err; + snd_output_t *out; + + pa_assert(pcm); + + pa_assert_se(snd_output_buffer_open(&out) == 0); + + if ((err = snd_pcm_dump(pcm, out)) < 0) + pa_logl(level, "snd_pcm_dump(): %s", pa_alsa_strerror(err)); + else { + char *s = NULL; + snd_output_buffer_string(out, &s); + pa_logl(level, "snd_pcm_dump():\n%s", pa_strnull(s)); + } + + pa_assert_se(snd_output_close(out) == 0); +} + +void pa_alsa_dump_status(snd_pcm_t *pcm) { + int err; + snd_output_t *out; + snd_pcm_status_t *status; + char *s = NULL; + + pa_assert(pcm); + + snd_pcm_status_alloca(&status); + + if ((err = snd_output_buffer_open(&out)) < 0) { + pa_log_debug("snd_output_buffer_open() failed: %s", pa_cstrerror(err)); + return; + } + + if ((err = snd_pcm_status(pcm, status)) < 0) { + pa_log_debug("snd_pcm_status() failed: %s", pa_cstrerror(err)); + goto finish; + } + + if ((err = snd_pcm_status_dump(status, out)) < 0) { + pa_log_debug("snd_pcm_dump(): %s", pa_alsa_strerror(err)); + goto finish; + } + + snd_output_buffer_string(out, &s); + pa_log_debug("snd_pcm_dump():\n%s", pa_strnull(s)); + +finish: + + snd_output_close(out); +} + +static void alsa_error_handler(const char *file, int line, const char *function, int err, const char *fmt,...) { + va_list ap; + char *alsa_file; + + alsa_file = pa_sprintf_malloc("(alsa-lib)%s", file); + + va_start(ap, fmt); + + pa_log_levelv_meta(PA_LOG_INFO, alsa_file, line, function, fmt, ap); + + va_end(ap); + + pa_xfree(alsa_file); +} + +static pa_atomic_t n_error_handler_installed = PA_ATOMIC_INIT(0); + +void pa_alsa_refcnt_inc(void) { + /* This is not really thread safe, but we do our best */ + + if (pa_atomic_inc(&n_error_handler_installed) == 0) + snd_lib_error_set_handler(alsa_error_handler); +} + +void pa_alsa_refcnt_dec(void) { + int r; + + pa_assert_se((r = pa_atomic_dec(&n_error_handler_installed)) >= 1); + + if (r == 1) { + snd_lib_error_set_handler(NULL); + snd_config_update_free_global(); + } +} + +pa_bool_t pa_alsa_init_description(pa_proplist *p) { + const char *d, *k; + pa_assert(p); + + if (pa_device_init_description(p)) + return TRUE; + + if (!(d = pa_proplist_gets(p, "alsa.card_name"))) + d = pa_proplist_gets(p, "alsa.name"); + + if (!d) + return FALSE; + + k = pa_proplist_gets(p, PA_PROP_DEVICE_PROFILE_DESCRIPTION); + + if (d && k) + pa_proplist_setf(p, PA_PROP_DEVICE_DESCRIPTION, _("%s %s"), d, k); + else if (d) + pa_proplist_sets(p, PA_PROP_DEVICE_DESCRIPTION, d); + + return FALSE; +} + +void pa_alsa_init_proplist_card(pa_core *c, pa_proplist *p, int card) { + char *cn, *lcn, *dn; + + pa_assert(p); + pa_assert(card >= 0); + + pa_proplist_setf(p, "alsa.card", "%i", card); + + if (snd_card_get_name(card, &cn) >= 0) { + pa_proplist_sets(p, "alsa.card_name", cn); + free(cn); + } + + if (snd_card_get_longname(card, &lcn) >= 0) { + pa_proplist_sets(p, "alsa.long_card_name", lcn); + free(lcn); + } + + if ((dn = pa_alsa_get_driver_name(card))) { + pa_proplist_sets(p, "alsa.driver_name", dn); + pa_xfree(dn); + } + +#ifdef HAVE_UDEV + pa_udev_get_info(card, p); +#endif + +#ifdef HAVE_HAL + pa_hal_get_info(c, p, card); +#endif +} + +void pa_alsa_init_proplist_pcm_info(pa_core *c, pa_proplist *p, snd_pcm_info_t *pcm_info) { + + static const char * const alsa_class_table[SND_PCM_CLASS_LAST+1] = { + [SND_PCM_CLASS_GENERIC] = "generic", + [SND_PCM_CLASS_MULTI] = "multi", + [SND_PCM_CLASS_MODEM] = "modem", + [SND_PCM_CLASS_DIGITIZER] = "digitizer" + }; + static const char * const class_table[SND_PCM_CLASS_LAST+1] = { + [SND_PCM_CLASS_GENERIC] = "sound", + [SND_PCM_CLASS_MULTI] = NULL, + [SND_PCM_CLASS_MODEM] = "modem", + [SND_PCM_CLASS_DIGITIZER] = NULL + }; + static const char * const alsa_subclass_table[SND_PCM_SUBCLASS_LAST+1] = { + [SND_PCM_SUBCLASS_GENERIC_MIX] = "generic-mix", + [SND_PCM_SUBCLASS_MULTI_MIX] = "multi-mix" + }; + + snd_pcm_class_t class; + snd_pcm_subclass_t subclass; + const char *n, *id, *sdn; + int card; + + pa_assert(p); + pa_assert(pcm_info); + + pa_proplist_sets(p, PA_PROP_DEVICE_API, "alsa"); + + if ((class = snd_pcm_info_get_class(pcm_info)) <= SND_PCM_CLASS_LAST) { + if (class_table[class]) + pa_proplist_sets(p, PA_PROP_DEVICE_CLASS, class_table[class]); + if (alsa_class_table[class]) + pa_proplist_sets(p, "alsa.class", alsa_class_table[class]); + } + + if ((subclass = snd_pcm_info_get_subclass(pcm_info)) <= SND_PCM_SUBCLASS_LAST) + if (alsa_subclass_table[subclass]) + pa_proplist_sets(p, "alsa.subclass", alsa_subclass_table[subclass]); + + if ((n = snd_pcm_info_get_name(pcm_info))) + pa_proplist_sets(p, "alsa.name", n); + + if ((id = snd_pcm_info_get_id(pcm_info))) + pa_proplist_sets(p, "alsa.id", id); + + pa_proplist_setf(p, "alsa.subdevice", "%u", snd_pcm_info_get_subdevice(pcm_info)); + if ((sdn = snd_pcm_info_get_subdevice_name(pcm_info))) + pa_proplist_sets(p, "alsa.subdevice_name", sdn); + + pa_proplist_setf(p, "alsa.device", "%u", snd_pcm_info_get_device(pcm_info)); + + if ((card = snd_pcm_info_get_card(pcm_info)) >= 0) + pa_alsa_init_proplist_card(c, p, card); +} + +void pa_alsa_init_proplist_pcm(pa_core *c, pa_proplist *p, snd_pcm_t *pcm) { + snd_pcm_hw_params_t *hwparams; + snd_pcm_info_t *info; + int bits, err; + + snd_pcm_hw_params_alloca(&hwparams); + snd_pcm_info_alloca(&info); + + if ((err = snd_pcm_hw_params_current(pcm, hwparams)) < 0) + pa_log_warn("Error fetching hardware parameter info: %s", pa_alsa_strerror(err)); + else { + + if ((bits = snd_pcm_hw_params_get_sbits(hwparams)) >= 0) + pa_proplist_setf(p, "alsa.resolution_bits", "%i", bits); + } + + if ((err = snd_pcm_info(pcm, info)) < 0) + pa_log_warn("Error fetching PCM info: %s", pa_alsa_strerror(err)); + else + pa_alsa_init_proplist_pcm_info(c, p, info); +} + +void pa_alsa_init_proplist_ctl(pa_proplist *p, const char *name) { + int err; + snd_ctl_t *ctl; + snd_ctl_card_info_t *info; + const char *t; + + pa_assert(p); + + snd_ctl_card_info_alloca(&info); + + if ((err = snd_ctl_open(&ctl, name, 0)) < 0) { + pa_log_warn("Error opening low-level control device '%s': %s", name, snd_strerror(err)); + return; + } + + if ((err = snd_ctl_card_info(ctl, info)) < 0) { + pa_log_warn("Control device %s card info: %s", name, snd_strerror(err)); + snd_ctl_close(ctl); + return; + } + + if ((t = snd_ctl_card_info_get_mixername(info)) && *t) + pa_proplist_sets(p, "alsa.mixer_name", t); + + if ((t = snd_ctl_card_info_get_components(info)) && *t) + pa_proplist_sets(p, "alsa.components", t); + + snd_ctl_close(ctl); +} + +int pa_alsa_recover_from_poll(snd_pcm_t *pcm, int revents) { + snd_pcm_state_t state; + int err; + + pa_assert(pcm); + + if (revents & POLLERR) + pa_log_debug("Got POLLERR from ALSA"); + if (revents & POLLNVAL) + pa_log_warn("Got POLLNVAL from ALSA"); + if (revents & POLLHUP) + pa_log_warn("Got POLLHUP from ALSA"); + if (revents & POLLPRI) + pa_log_warn("Got POLLPRI from ALSA"); + if (revents & POLLIN) + pa_log_debug("Got POLLIN from ALSA"); + if (revents & POLLOUT) + pa_log_debug("Got POLLOUT from ALSA"); + + state = snd_pcm_state(pcm); + pa_log_debug("PCM state is %s", snd_pcm_state_name(state)); + + /* Try to recover from this error */ + + switch (state) { + + case SND_PCM_STATE_XRUN: + if ((err = snd_pcm_recover(pcm, -EPIPE, 1)) != 0) { + pa_log_warn("Could not recover from POLLERR|POLLNVAL|POLLHUP and XRUN: %s", pa_alsa_strerror(err)); + return -1; + } + break; + + case SND_PCM_STATE_SUSPENDED: + if ((err = snd_pcm_recover(pcm, -ESTRPIPE, 1)) != 0) { + pa_log_warn("Could not recover from POLLERR|POLLNVAL|POLLHUP and SUSPENDED: %s", pa_alsa_strerror(err)); + return -1; + } + break; + + default: + + snd_pcm_drop(pcm); + + if ((err = snd_pcm_prepare(pcm)) < 0) { + pa_log_warn("Could not recover from POLLERR|POLLNVAL|POLLHUP with snd_pcm_prepare(): %s", pa_alsa_strerror(err)); + return -1; + } + break; + } + + return 0; +} + +pa_rtpoll_item* pa_alsa_build_pollfd(snd_pcm_t *pcm, pa_rtpoll *rtpoll) { + int n, err; + struct pollfd *pollfd; + pa_rtpoll_item *item; + + pa_assert(pcm); + + if ((n = snd_pcm_poll_descriptors_count(pcm)) < 0) { + pa_log("snd_pcm_poll_descriptors_count() failed: %s", pa_alsa_strerror(n)); + return NULL; + } + + item = pa_rtpoll_item_new(rtpoll, PA_RTPOLL_NEVER, (unsigned) n); + pollfd = pa_rtpoll_item_get_pollfd(item, NULL); + + if ((err = snd_pcm_poll_descriptors(pcm, pollfd, (unsigned) n)) < 0) { + pa_log("snd_pcm_poll_descriptors() failed: %s", pa_alsa_strerror(err)); + pa_rtpoll_item_free(item); + return NULL; + } + + return item; +} + +snd_pcm_sframes_t pa_alsa_safe_avail(snd_pcm_t *pcm, size_t hwbuf_size, const pa_sample_spec *ss) { + snd_pcm_sframes_t n; + size_t k; + + pa_assert(pcm); + pa_assert(hwbuf_size > 0); + pa_assert(ss); + + /* Some ALSA driver expose weird bugs, let's inform the user about + * what is going on */ + + n = snd_pcm_avail(pcm); + + if (n <= 0) + return n; + + k = (size_t) n * pa_frame_size(ss); + + if (k >= hwbuf_size * 5 || + k >= pa_bytes_per_second(ss)*10) { + + PA_ONCE_BEGIN { + char *dn = pa_alsa_get_driver_name_by_pcm(pcm); + pa_log(_("snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu ms).\n" + "Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers."), + (unsigned long) k, + (unsigned long) (pa_bytes_to_usec(k, ss) / PA_USEC_PER_MSEC), + pa_strnull(dn)); + pa_xfree(dn); + pa_alsa_dump(PA_LOG_ERROR, pcm); + } PA_ONCE_END; + + /* Mhmm, let's try not to fail completely */ + n = (snd_pcm_sframes_t) (hwbuf_size / pa_frame_size(ss)); + } + + return n; +} + +int pa_alsa_safe_delay(snd_pcm_t *pcm, snd_pcm_sframes_t *delay, size_t hwbuf_size, const pa_sample_spec *ss) { + ssize_t k; + size_t abs_k; + int r; + + pa_assert(pcm); + pa_assert(delay); + pa_assert(hwbuf_size > 0); + pa_assert(ss); + + /* Some ALSA driver expose weird bugs, let's inform the user about + * what is going on */ + + if ((r = snd_pcm_delay(pcm, delay)) < 0) + return r; + + k = (ssize_t) *delay * (ssize_t) pa_frame_size(ss); + + abs_k = k >= 0 ? (size_t) k : (size_t) -k; + + if (abs_k >= hwbuf_size * 5 || + abs_k >= pa_bytes_per_second(ss)*10) { + + PA_ONCE_BEGIN { + char *dn = pa_alsa_get_driver_name_by_pcm(pcm); + pa_log(_("snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%lu ms).\n" + "Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers."), + (signed long) k, + k < 0 ? "-" : "", + (unsigned long) (pa_bytes_to_usec(abs_k, ss) / PA_USEC_PER_MSEC), + pa_strnull(dn)); + pa_xfree(dn); + pa_alsa_dump(PA_LOG_ERROR, pcm); + } PA_ONCE_END; + + /* Mhmm, let's try not to fail completely */ + if (k < 0) + *delay = -(snd_pcm_sframes_t) (hwbuf_size / pa_frame_size(ss)); + else + *delay = (snd_pcm_sframes_t) (hwbuf_size / pa_frame_size(ss)); + } + + return 0; +} + +int pa_alsa_safe_mmap_begin(snd_pcm_t *pcm, const snd_pcm_channel_area_t **areas, snd_pcm_uframes_t *offset, snd_pcm_uframes_t *frames, size_t hwbuf_size, const pa_sample_spec *ss) { + int r; + snd_pcm_uframes_t before; + size_t k; + + pa_assert(pcm); + pa_assert(areas); + pa_assert(offset); + pa_assert(frames); + pa_assert(hwbuf_size > 0); + pa_assert(ss); + + before = *frames; + + r = snd_pcm_mmap_begin(pcm, areas, offset, frames); + + if (r < 0) + return r; + + k = (size_t) *frames * pa_frame_size(ss); + + if (*frames > before || + k >= hwbuf_size * 3 || + k >= pa_bytes_per_second(ss)*10) + + PA_ONCE_BEGIN { + char *dn = pa_alsa_get_driver_name_by_pcm(pcm); + pa_log(_("snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes (%lu ms).\n" + "Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers."), + (unsigned long) k, + (unsigned long) (pa_bytes_to_usec(k, ss) / PA_USEC_PER_MSEC), + pa_strnull(dn)); + pa_xfree(dn); + pa_alsa_dump(PA_LOG_ERROR, pcm); + } PA_ONCE_END; + + return r; +} + +char *pa_alsa_get_driver_name(int card) { + char *t, *m, *n; + + pa_assert(card >= 0); + + t = pa_sprintf_malloc("/sys/class/sound/card%i/device/driver/module", card); + m = pa_readlink(t); + pa_xfree(t); + + if (!m) + return NULL; + + n = pa_xstrdup(pa_path_get_filename(m)); + pa_xfree(m); + + return n; +} + +char *pa_alsa_get_driver_name_by_pcm(snd_pcm_t *pcm) { + int card; + snd_pcm_info_t* info; + snd_pcm_info_alloca(&info); + + pa_assert(pcm); + + if (snd_pcm_info(pcm, info) < 0) + return NULL; + + if ((card = snd_pcm_info_get_card(info)) < 0) + return NULL; + + return pa_alsa_get_driver_name(card); +} + +char *pa_alsa_get_reserve_name(const char *device) { + const char *t; + int i; + + pa_assert(device); + + if ((t = strchr(device, ':'))) + device = t+1; + + if ((i = snd_card_get_index(device)) < 0) { + int32_t k; + + if (pa_atoi(device, &k) < 0) + return NULL; + + i = (int) k; + } + + return pa_sprintf_malloc("Audio%i", i); +} + +pa_bool_t pa_alsa_pcm_is_hw(snd_pcm_t *pcm) { + snd_pcm_info_t* info; + snd_pcm_info_alloca(&info); + + pa_assert(pcm); + + if (snd_pcm_info(pcm, info) < 0) + return FALSE; + + return snd_pcm_info_get_card(info) >= 0; +} + +pa_bool_t pa_alsa_pcm_is_modem(snd_pcm_t *pcm) { + snd_pcm_info_t* info; + snd_pcm_info_alloca(&info); + + pa_assert(pcm); + + if (snd_pcm_info(pcm, info) < 0) + return FALSE; + + return snd_pcm_info_get_class(info) == SND_PCM_CLASS_MODEM; +} + +PA_STATIC_TLS_DECLARE(cstrerror, pa_xfree); + +const char* pa_alsa_strerror(int errnum) { + const char *original = NULL; + char *translated, *t; + char errbuf[128]; + + if ((t = PA_STATIC_TLS_GET(cstrerror))) + pa_xfree(t); + + original = snd_strerror(errnum); + + if (!original) { + pa_snprintf(errbuf, sizeof(errbuf), "Unknown error %i", errnum); + original = errbuf; + } + + if (!(translated = pa_locale_to_utf8(original))) { + pa_log_warn("Unable to convert error string to locale, filtering."); + translated = pa_utf8_filter(original); + } + + PA_STATIC_TLS_SET(cstrerror, translated); + + return translated; +} + +pa_bool_t pa_alsa_may_tsched(pa_bool_t want) { + + if (!want) + return FALSE; + + if (!pa_rtclock_hrtimer()) { + /* We cannot depend on being woken up in time when the timers + are inaccurate, so let's fallback to classic IO based playback + then. */ + pa_log_notice("Disabling timer-based scheduling because high-resolution timers are not available from the kernel."); + return FALSE; } + + if (pa_running_in_vm()) { + /* We cannot depend on being woken up when we ask for in a VM, + * so let's fallback to classic IO based playback then. */ + pa_log_notice("Disabling timer-based scheduling because running inside a VM."); + return FALSE; + } + + + return TRUE; +} diff --git a/src/modules/alsa/alsa-util.h b/src/modules/alsa/alsa-util.h new file mode 100644 index 0000000..1d1256b --- /dev/null +++ b/src/modules/alsa/alsa-util.h @@ -0,0 +1,147 @@ +#ifndef fooalsautilhfoo +#define fooalsautilhfoo + +/*** + This file is part of PulseAudio. + + Copyright 2004-2006 Lennart Poettering + Copyright 2006 Pierre Ossman for Cendio AB + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "alsa-mixer.h" + +int pa_alsa_set_hw_params( + snd_pcm_t *pcm_handle, + pa_sample_spec *ss, /* modified at return */ + snd_pcm_uframes_t *period_size, /* modified at return */ + snd_pcm_uframes_t *buffer_size, /* modified at return */ + snd_pcm_uframes_t tsched_size, + pa_bool_t *use_mmap, /* modified at return */ + pa_bool_t *use_tsched, /* modified at return */ + pa_bool_t require_exact_channel_number); + +int pa_alsa_set_sw_params( + snd_pcm_t *pcm, + snd_pcm_uframes_t avail_min, + pa_bool_t period_event); + +/* Picks a working mapping from the profile set based on the specified ss/map */ +snd_pcm_t *pa_alsa_open_by_device_id_auto( + const char *dev_id, + char **dev, /* modified at return */ + pa_sample_spec *ss, /* modified at return */ + pa_channel_map* map, /* modified at return */ + int mode, + snd_pcm_uframes_t *period_size, /* modified at return */ + snd_pcm_uframes_t *buffer_size, /* modified at return */ + snd_pcm_uframes_t tsched_size, + pa_bool_t *use_mmap, /* modified at return */ + pa_bool_t *use_tsched, /* modified at return */ + pa_alsa_profile_set *ps, + pa_alsa_mapping **mapping); /* modified at return */ + +/* Uses the specified mapping */ +snd_pcm_t *pa_alsa_open_by_device_id_mapping( + const char *dev_id, + char **dev, /* modified at return */ + pa_sample_spec *ss, /* modified at return */ + pa_channel_map* map, /* modified at return */ + int mode, + snd_pcm_uframes_t *period_size, /* modified at return */ + snd_pcm_uframes_t *buffer_size, /* modified at return */ + snd_pcm_uframes_t tsched_size, + pa_bool_t *use_mmap, /* modified at return */ + pa_bool_t *use_tsched, /* modified at return */ + pa_alsa_mapping *mapping); + +/* Opens the explicit ALSA device */ +snd_pcm_t *pa_alsa_open_by_device_string( + const char *dir, + char **dev, /* modified at return */ + pa_sample_spec *ss, /* modified at return */ + pa_channel_map* map, /* modified at return */ + int mode, + snd_pcm_uframes_t *period_size, /* modified at return */ + snd_pcm_uframes_t *buffer_size, /* modified at return */ + snd_pcm_uframes_t tsched_size, + pa_bool_t *use_mmap, /* modified at return */ + pa_bool_t *use_tsched, /* modified at return */ + pa_bool_t require_exact_channel_number); + +/* Opens the explicit ALSA device with a fallback list */ +snd_pcm_t *pa_alsa_open_by_template( + char **template, + const char *dev_id, + char **dev, /* modified at return */ + pa_sample_spec *ss, /* modified at return */ + pa_channel_map* map, /* modified at return */ + int mode, + snd_pcm_uframes_t *period_size, /* modified at return */ + snd_pcm_uframes_t *buffer_size, /* modified at return */ + snd_pcm_uframes_t tsched_size, + pa_bool_t *use_mmap, /* modified at return */ + pa_bool_t *use_tsched, /* modified at return */ + pa_bool_t require_exact_channel_number); + +void pa_alsa_dump(pa_log_level_t level, snd_pcm_t *pcm); +void pa_alsa_dump_status(snd_pcm_t *pcm); + +void pa_alsa_refcnt_inc(void); +void pa_alsa_refcnt_dec(void); + +void pa_alsa_init_proplist_pcm_info(pa_core *c, pa_proplist *p, snd_pcm_info_t *pcm_info); +void pa_alsa_init_proplist_card(pa_core *c, pa_proplist *p, int card); +void pa_alsa_init_proplist_pcm(pa_core *c, pa_proplist *p, snd_pcm_t *pcm); +void pa_alsa_init_proplist_ctl(pa_proplist *p, const char *name); +pa_bool_t pa_alsa_init_description(pa_proplist *p); + +int pa_alsa_recover_from_poll(snd_pcm_t *pcm, int revents); + +pa_rtpoll_item* pa_alsa_build_pollfd(snd_pcm_t *pcm, pa_rtpoll *rtpoll); + +snd_pcm_sframes_t pa_alsa_safe_avail(snd_pcm_t *pcm, size_t hwbuf_size, const pa_sample_spec *ss); +int pa_alsa_safe_delay(snd_pcm_t *pcm, snd_pcm_sframes_t *delay, size_t hwbuf_size, const pa_sample_spec *ss); +int pa_alsa_safe_mmap_begin(snd_pcm_t *pcm, const snd_pcm_channel_area_t **areas, snd_pcm_uframes_t *offset, snd_pcm_uframes_t *frames, size_t hwbuf_size, const pa_sample_spec *ss); + +char *pa_alsa_get_driver_name(int card); +char *pa_alsa_get_driver_name_by_pcm(snd_pcm_t *pcm); + +char *pa_alsa_get_reserve_name(const char *device); + +pa_bool_t pa_alsa_pcm_is_hw(snd_pcm_t *pcm); +pa_bool_t pa_alsa_pcm_is_modem(snd_pcm_t *pcm); + +const char* pa_alsa_strerror(int errnum); + +pa_bool_t pa_alsa_may_tsched(pa_bool_t want); + +#endif diff --git a/src/modules/alsa/mixer/paths/analog-input-aux.conf b/src/modules/alsa/mixer/paths/analog-input-aux.conf new file mode 100644 index 0000000..db78eb4 --- /dev/null +++ b/src/modules/alsa/mixer/paths/analog-input-aux.conf @@ -0,0 +1,62 @@ +# This file is part of PulseAudio. +# +# PulseAudio is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as +# published by the Free Software Foundation; either version 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, write to the Free Software Foundation, +# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +; For devices where an 'Aux' element exists +; +; See analog-output.conf.common for an explanation on the directives + +[General] +priority = 90 +name = analog-input + +[Element Capture] +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Mic] +switch = off +volume = off + +[Element Line] +switch = off +volume = off + +[Element Aux] +required = any +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Video] +switch = off +volume = off + +[Element Mic/Line] +switch = off +volume = off + +[Element TV Tuner] +switch = off +volume = off + +[Element FM] +switch = off +volume = off + +.include analog-input.conf.common diff --git a/src/modules/alsa/mixer/paths/analog-input-fm.conf b/src/modules/alsa/mixer/paths/analog-input-fm.conf new file mode 100644 index 0000000..baf674a --- /dev/null +++ b/src/modules/alsa/mixer/paths/analog-input-fm.conf @@ -0,0 +1,62 @@ +# This file is part of PulseAudio. +# +# PulseAudio is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as +# published by the Free Software Foundation; either version 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, write to the Free Software Foundation, +# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +; For devices where an 'FM' element exists +; +; See analog-output.conf.common for an explanation on the directives + +[General] +priority = 70 +name = analog-input-radio + +[Element Capture] +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Mic] +switch = off +volume = off + +[Element Line] +switch = off +volume = off + +[Element Aux] +switch = off +volume = off + +[Element Video] +switch = off +volume = off + +[Element Mic/Line] +switch = off +volume = off + +[Element TV Tuner] +switch = off +volume = off + +[Element FM] +required = any +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +.include analog-input.conf.common diff --git a/src/modules/alsa/mixer/paths/analog-input-linein.conf b/src/modules/alsa/mixer/paths/analog-input-linein.conf new file mode 100644 index 0000000..4be5722 --- /dev/null +++ b/src/modules/alsa/mixer/paths/analog-input-linein.conf @@ -0,0 +1,61 @@ +# This file is part of PulseAudio. +# +# PulseAudio is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as +# published by the Free Software Foundation; either version 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, write to the Free Software Foundation, +# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +; For devices where a 'Line' element exists +; +; See analog-output.conf.common for an explanation on the directives + +[General] +priority = 90 + +[Element Capture] +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Mic] +switch = off +volume = off + +[Element Line] +required = any +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Aux] +switch = off +volume = off + +[Element Video] +switch = off +volume = off + +[Element Mic/Line] +switch = off +volume = off + +[Element TV Tuner] +switch = off +volume = off + +[Element FM] +switch = off +volume = off + +.include analog-input.conf.common diff --git a/src/modules/alsa/mixer/paths/analog-input-mic-line.conf b/src/modules/alsa/mixer/paths/analog-input-mic-line.conf new file mode 100644 index 0000000..f7f3085 --- /dev/null +++ b/src/modules/alsa/mixer/paths/analog-input-mic-line.conf @@ -0,0 +1,63 @@ +# This file is part of PulseAudio. +# +# PulseAudio is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as +# published by the Free Software Foundation; either version 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, write to the Free Software Foundation, +# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +; For devices where a 'Mic/Line' element exists +; +; See analog-output.conf.common for an explanation on the directives + +[General] +priority = 90 +name = analog-input + +[Element Capture] +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Mic] +switch = off +volume = off + +[Element Line] +switch = off +volume = off + +[Element Aux] +switch = off +volume = off + +[Element Video] +switch = off +volume = off + +[Element Mic/Line] +required = any +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element TV Tuner] +switch = off +volume = off + +[Element FM] +switch = off +volume = off + +.include analog-input.conf.common +.include analog-input-mic.conf.common diff --git a/src/modules/alsa/mixer/paths/analog-input-mic.conf b/src/modules/alsa/mixer/paths/analog-input-mic.conf new file mode 100644 index 0000000..2a36f2f --- /dev/null +++ b/src/modules/alsa/mixer/paths/analog-input-mic.conf @@ -0,0 +1,63 @@ +# This file is part of PulseAudio. +# +# PulseAudio is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as +# published by the Free Software Foundation; either version 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, write to the Free Software Foundation, +# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +; For devices where a 'Mic' element exists +; +; See analog-output.conf.common for an explanation on the directives + +[General] +priority = 100 +name = analog-input-microphone + +[Element Capture] +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Mic] +required = any +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Line] +switch = off +volume = off + +[Element Aux] +switch = off +volume = off + +[Element Video] +switch = off +volume = off + +[Element Mic/Line] +switch = off +volume = off + +[Element TV Tuner] +switch = off +volume = off + +[Element FM] +switch = off +volume = off + +.include analog-input.conf.common +.include analog-input-mic.conf.common diff --git a/src/modules/alsa/mixer/paths/analog-input-mic.conf.common b/src/modules/alsa/mixer/paths/analog-input-mic.conf.common new file mode 100644 index 0000000..b35e7af --- /dev/null +++ b/src/modules/alsa/mixer/paths/analog-input-mic.conf.common @@ -0,0 +1,63 @@ +# This file is part of PulseAudio. +# +# PulseAudio is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as +# published by the Free Software Foundation; either version 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, write to the Free Software Foundation, +# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +; Common element for all microphone inputs +; +; See analog-output.conf.common for an explanation on the directives + +;;; 'Mic Select' + +[Element Mic Select] +enumeration = select + +[Option Mic Select:Mic1] +name = input-microphone +priority = 20 + +[Option Mic Select:Mic2] +name = input-microphone +priority = 19 + +;;; Various Boosts + +[Element Mic Boost (+20dB)] +switch = select +volume = merge + +[Option Mic Boost (+20dB):on] +name = input-boost-on + +[Option Mic Boost (+20dB):off] +name = input-boost-off + +[Element Mic Boost] +switch = select +volume = merge + +[Option Mic Boost:on] +name = input-boost-on + +[Option Mic Boost:off] +name = input-boost-off + +[Element Front Mic Boost] +switch = select + +[Option Front Mic Boost:on] +name = input-boost-on + +[Option Front Mic Boost:off] +name = input-boost-off diff --git a/src/modules/alsa/mixer/paths/analog-input-tvtuner.conf b/src/modules/alsa/mixer/paths/analog-input-tvtuner.conf new file mode 100644 index 0000000..8531ec7 --- /dev/null +++ b/src/modules/alsa/mixer/paths/analog-input-tvtuner.conf @@ -0,0 +1,62 @@ +# This file is part of PulseAudio. +# +# PulseAudio is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as +# published by the Free Software Foundation; either version 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, write to the Free Software Foundation, +# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +; For devices where a 'TV Tuner' element exists +; +; See analog-output.conf.common for an explanation on the directives + +[General] +priority = 70 +name = analog-input-video + +[Element Capture] +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Mic] +switch = off +volume = off + +[Element Line] +switch = off +volume = off + +[Element Aux] +switch = off +volume = off + +[Element Video] +switch = off +volume = off + +[Element Mic/Line] +switch = off +volume = off + +[Element TV Tuner] +required = any +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element FM] +switch = off +volume = off + +.include analog-input.conf.common diff --git a/src/modules/alsa/mixer/paths/analog-input-video.conf b/src/modules/alsa/mixer/paths/analog-input-video.conf new file mode 100644 index 0000000..74c76f0 --- /dev/null +++ b/src/modules/alsa/mixer/paths/analog-input-video.conf @@ -0,0 +1,61 @@ +# This file is part of PulseAudio. +# +# PulseAudio is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as +# published by the Free Software Foundation; either version 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, write to the Free Software Foundation, +# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +; For devices where a 'Video' element exists +; +; See analog-output.conf.common for an explanation on the directives + +[General] +priority = 70 + +[Element Capture] +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Mic] +switch = off +volume = off + +[Element Line] +switch = off +volume = off + +[Element Aux] +switch = off +volume = off + +[Element Video] +required = any +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Mic/Line] +switch = off +volume = off + +[Element TV Tuner] +switch = off +volume = off + +[Element FM] +switch = off +volume = off + +.include analog-input.conf.common diff --git a/src/modules/alsa/mixer/paths/analog-input.conf b/src/modules/alsa/mixer/paths/analog-input.conf new file mode 100644 index 0000000..5055f90 --- /dev/null +++ b/src/modules/alsa/mixer/paths/analog-input.conf @@ -0,0 +1,54 @@ +# This file is part of PulseAudio. +# +# PulseAudio is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as +# published by the Free Software Foundation; either version 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, write to the Free Software Foundation, +# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +; A fallback for devices that lack seperate Mic/Line/Aux/Video/TV +; Tuner/FM elements +; +; See analog-output.conf.common for an explanation on the directives + +[General] +priority = 100 + +[Element Capture] +required = volume +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Mic] +required-absent = any + +[Element Line] +required-absent = any + +[Element Aux] +required-absent = any + +[Element Video] +required-absent = any + +[Element Mic/Line] +required-absent = any + +[Element TV Tuner] +required-absent = any + +[Element FM] +required-absent = any + +.include analog-input.conf.common +.include analog-input-mic.conf.common diff --git a/src/modules/alsa/mixer/paths/analog-input.conf.common b/src/modules/alsa/mixer/paths/analog-input.conf.common new file mode 100644 index 0000000..951e11f --- /dev/null +++ b/src/modules/alsa/mixer/paths/analog-input.conf.common @@ -0,0 +1,294 @@ +# This file is part of PulseAudio. +# +# PulseAudio is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as +# published by the Free Software Foundation; either version 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, write to the Free Software Foundation, +# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +; Mixer path for PulseAudio's ALSA backend, common elements for all +; input paths. If multiple options by the same id are discovered they +; will be suffixed with a number to distuingish them, in the same +; order they appear here. +; +; Source selection should use the following names: +; +; input -- If we don't know the exact kind of input +; input-microphone +; input-microphone-internal +; input-microphone-external +; input-linein +; input-video +; input-radio +; input-docking-microphone +; input-docking-linein +; input-docking +; +; We explicitly don't want to wrap the following sources: +; +; CD +; Synth/MIDI +; Phone +; Mix +; Digital/SPDIF +; Master +; PC Speaker +; +; See analog-output.conf.common for an explanation on the directives + +;;; 'Input Source Select' + +[Element Input Source Select] +enumeration = select + +[Option Input Source Select:Input1] +name = input +priority = 10 + +[Option Input Source Select:Input2] +name = input +priority = 5 + +;;; 'Input Source' + +[Element Input Source] +enumeration = select + +[Option Input Source:Mic] +name = input-microphone +priority = 20 + +[Option Input Source:Microphone] +name = input-microphone +priority = 20 + +[Option Input Source:Front Mic] +name = input-microphone +priority = 19 + +[Option Input Source:Front Microphone] +name = input-microphone +priority = 19 + +[Option Input Source:Internal Mic] +name = input-microphone +priority = 19 + +[Option Input Source:Line] +name = input-linein +priority = 18 + +[Option Input Source:Line-In] +name = input-linein +priority = 18 + +[Option Input Source:Line In] +name = input-linein +priority = 18 + +[Option Input Source:Docking-Station] +name = input-docking +priority = 17 + +[Option Input Source:AUX IN] +name = input +priority = 10 + +;;; 'Capture Source' + +[Element Capture Source] +enumeration = select + +[Option Capture Source:TV Tuner] +name = input-video + +[Option Capture Source:FM] +name = input-radio + +[Option Capture Source:Mic/Line] +name = input + +[Option Capture Source:Line/Mic] +name = input + +[Option Capture Source:Mic] +name = input-microphone + +[Option Capture Source:Microphone] +name = input-microphone + +[Option Capture Source:Int Mic] +name = input-microphone-internal + +[Option Capture Source:Int DMic] +name = input-microphone-internal + +[Option Capture Source:Internal Mic] +name = input-microphone-internal + +[Option Capture Source:iMic] +name = input-microphone-internal + +[Option Capture Source:i-Mic] +name = input-microphone-internal + +[Option Capture Source:Internal Microphone] +name = input-microphone-internal + +[Option Capture Source:Front Mic] +name = input-microphone + +[Option Capture Source:Front Microphone] +name = input-microphone + +[Option Capture Source:Rear Mic] +name = input-microphone + +[Option Capture Source:Mic1] +name = input-microphone + +[Option Capture Source:Mic2] +name = input-microphone + +[Option Capture Source:D-Mic] +name = input-microphone + +[Option Capture Source:IntMic] +name = input-microphone-internal + +[Option Capture Source:ExtMic] +name = input-microphone-external + +[Option Capture Source:Ext Mic] +name = input-microphone-external + +[Option Capture Source:E-Mic] +name = input-microphone-external + +[Option Capture Source:e-Mic] +name = input-microphone-external + +[Option Capture Source:LineIn] +name = input-linein + +[Option Capture Source:Analog] +name = input + +[Option Capture Source:Line] +name = input-linein + +[Option Capture Source:Line-In] +name = input-linein + +[Option Capture Source:Line In] +name = input-linein + +[Option Capture Source:Video] +name = input-video + +[Option Capture Source:Aux] +name = input + +[Option Capture Source:Aux0] +name = input + +[Option Capture Source:Aux1] +name = input + +[Option Capture Source:Aux2] +name = input + +[Option Capture Source:Aux3] +name = input + +[Option Capture Source:AUX IN] +name = input + +[Option Capture Source:Aux In] +name = input + +[Option Capture Source:AOUT] +name = input + +[Option Capture Source:AUX] +name = input + +[Option Capture Source:Cam Mic] +name = input-microphone + +[Option Capture Source:Digital Mic] +name = input-microphone + +[Option Capture Source:Digital Mic 1] +name = input-microphone + +[Option Capture Source:Digital Mic 2] +name = input-microphone + +[Option Capture Source:Analog Inputs] +name = input + +[Option Capture Source:Unknown1] +name = input + +[Option Capture Source:Unknown2] +name = input + +[Option Capture Source:Docking-Station] +name = input-docking + +[Option Capture Source:Dock Mic] +name = input-docking-microphone + +;;; 'Mic Jack Mode' + +[Element Mic Jack Mode] +enumeration = select + +[Option Mic Jack Mode:Mic In] +name = input-microphone + +[Option Mic Jack Mode:Line In] +name = input-linein + +;;; 'Digital Input Source' + +[Element Digital Input Source] +enumeration = select + +[Option Digital Input Source:Analog Inputs] +name = input + +[Option Digital Input Source:Digital Mic 1] +name = input-microphone + +[Option Digital Input Source:Digital Mic 2] +name = input-microphone + +;;; Various Boosts + +[Element Capture Boost] +switch = select + +[Option Capture Boost:on] +name = input-boost-on + +[Option Capture Boost:off] +name = input-boost-off + +[Element Auto Gain Control] +switch = select + +[Option Auto Gain Control:on] +name = input-agc-on + +[Option Auto Gain Control:off] +name = input-agc-off diff --git a/src/modules/alsa/mixer/paths/analog-output-headphones-2.conf b/src/modules/alsa/mixer/paths/analog-output-headphones-2.conf new file mode 100644 index 0000000..f2fd31c --- /dev/null +++ b/src/modules/alsa/mixer/paths/analog-output-headphones-2.conf @@ -0,0 +1,82 @@ +# This file is part of PulseAudio. +# +# PulseAudio is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as +# published by the Free Software Foundation; either version 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, write to the Free Software Foundation, +# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +; Path for mixers that have a 'Headphone2' control +; +; See analog-output.conf.common for an explanation on the directives + +[General] +priority = 89 + +[Element Hardware Master] +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Master] +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Master Mono] +switch = off +volume = off + +; This profile path is intended to control the second headphones, not +; the first headphones. But it should not hurt if we leave the +; headphone jack enabled nonetheless. +[Element Headphone] +switch = mute +volume = zero + +[Element Headphone2] +required = any +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Speaker] +switch = off +volume = off + +[Element Front] +switch = off +volume = off + +[Element Rear] +switch = off +volume = off + +[Element Surround] +switch = off +volume = off + +[Element Side] +switch = off +volume = off + +[Element Center] +switch = off +volume = off + +[Element LFE] +switch = off +volume = off + +.include analog-output.conf.common diff --git a/src/modules/alsa/mixer/paths/analog-output-headphones.conf b/src/modules/alsa/mixer/paths/analog-output-headphones.conf new file mode 100644 index 0000000..2131cfe --- /dev/null +++ b/src/modules/alsa/mixer/paths/analog-output-headphones.conf @@ -0,0 +1,82 @@ +# This file is part of PulseAudio. +# +# PulseAudio is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as +# published by the Free Software Foundation; either version 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, write to the Free Software Foundation, +# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +; Path for mixers that have a 'Headphone' control +; +; See analog-output.conf.common for an explanation on the directives + +[General] +priority = 90 + +[Element Hardware Master] +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Master] +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Master Mono] +switch = off +volume = off + +[Element Headphone] +required = any +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +; This profile path is intended to control the first headphones, not +; the second headphones. But it should not hurt if we leave the second +; headphone jack enabled nonetheless. +[Element Headphone2] +switch = mute +volume = zero + +[Element Speaker] +switch = off +volume = off + +[Element Front] +switch = off +volume = off + +[Element Rear] +switch = off +volume = off + +[Element Surround] +switch = off +volume = off + +[Element Side] +switch = off +volume = off + +[Element Center] +switch = off +volume = off + +[Element LFE] +switch = off +volume = off + +.include analog-output.conf.common diff --git a/src/modules/alsa/mixer/paths/analog-output-lfe-on-mono.conf b/src/modules/alsa/mixer/paths/analog-output-lfe-on-mono.conf new file mode 100644 index 0000000..0a43e27 --- /dev/null +++ b/src/modules/alsa/mixer/paths/analog-output-lfe-on-mono.conf @@ -0,0 +1,85 @@ +# This file is part of PulseAudio. +# +# PulseAudio is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as +# published by the Free Software Foundation; either version 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, write to the Free Software Foundation, +# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +; Intended for usage in laptops that have a seperate LFE speaker +; connected to the Master mono connector +; +; See analog-output.conf.common for an explanation on the directives + +[General] +priority = 40 + +[Element Hardware Master] +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Master] +switch = mute +volume = merge +override-map.1 = all-no-lfe +override-map.2 = all-left,all-right + +[Element Master Mono] +required = any +switch = mute +volume = merge +override-map.1 = lfe +override-map.2 = lfe,lfe + +; This profile path is intended to control the speaker, not the +; headphones. But it should not hurt if we leave the headphone jack +; enabled nonetheless. +[Element Headphone] +switch = mute +volume = zero + +[Element Headphone2] +switch = mute +volume = zero + +[Element Speaker] +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Front] +switch = off +volume = off + +[Element Rear] +switch = off +volume = off + +[Element Surround] +switch = off +volume = off + +[Element Side] +switch = off +volume = off + +[Element Center] +switch = off +volume = off + +[Element LFE] +switch = off +volume = off + +.include analog-output.conf.common diff --git a/src/modules/alsa/mixer/paths/analog-output-mono.conf b/src/modules/alsa/mixer/paths/analog-output-mono.conf new file mode 100644 index 0000000..542edc4 --- /dev/null +++ b/src/modules/alsa/mixer/paths/analog-output-mono.conf @@ -0,0 +1,82 @@ +# This file is part of PulseAudio. +# +# PulseAudio is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as +# published by the Free Software Foundation; either version 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, write to the Free Software Foundation, +# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +; Intended for usage on boards that have a seperate Mono output plug. +; +; See analog-output.conf.common for an explanation on the directives + +[General] +priority = 50 + +[Element Hardware Master] +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Master] +switch = off +volume = off + +[Element Master Mono] +required = any +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +; This profile path is intended to control the speaker, not the +; headphones. But it should not hurt if we leave the headphone jack +; enabled nonetheless. +[Element Headphone] +switch = mute +volume = zero + +[Element Headphone2] +switch = mute +volume = zero + +[Element Speaker] +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Front] +switch = off +volume = off + +[Element Rear] +switch = off +volume = off + +[Element Surround] +switch = off +volume = off + +[Element Side] +switch = off +volume = off + +[Element Center] +switch = off +volume = off + +[Element LFE] +switch = off +volume = off + +.include analog-output.conf.common diff --git a/src/modules/alsa/mixer/paths/analog-output-speaker.conf b/src/modules/alsa/mixer/paths/analog-output-speaker.conf new file mode 100644 index 0000000..aea7853 --- /dev/null +++ b/src/modules/alsa/mixer/paths/analog-output-speaker.conf @@ -0,0 +1,94 @@ +# This file is part of PulseAudio. +# +# PulseAudio is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as +# published by the Free Software Foundation; either version 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, write to the Free Software Foundation, +# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +; Path for mixers that have a 'Speaker' control +; +; See analog-output.conf.common for an explanation on the directives + +[General] +priority = 100 + +[Element Hardware Master] +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Master] +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Master Mono] +switch = off +volume = off + +; This profile path is intended to control the speaker, not the +; headphones. But it should not hurt if we leave the headphone jack +; enabled nonetheless. +[Element Headphone] +switch = mute +volume = zero + +[Element Headphone2] +switch = mute +volume = zero + +[Element Speaker] +required = any +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Front] +switch = mute +volume = merge +override-map.1 = all-front +override-map.2 = front-left,front-right + +[Element Rear] +switch = mute +volume = merge +override-map.1 = all-rear +override-map.2 = rear-left,rear-right + +[Element Surround] +switch = mute +volume = merge +override-map.1 = all-rear +override-map.2 = rear-left,rear-right + +[Element Side] +switch = mute +volume = merge +override-map.1 = all-side +override-map.2 = side-left,side-right + +[Element Center] +switch = mute +volume = merge +override-map.1 = all-center +override-map.2 = all-center,all-center + +[Element LFE] +switch = mute +volume = merge +override-map.1 = lfe +override-map.2 = lfe,lfe + +.include analog-output.conf.common diff --git a/src/modules/alsa/mixer/paths/analog-output.conf b/src/modules/alsa/mixer/paths/analog-output.conf new file mode 100644 index 0000000..fc30800 --- /dev/null +++ b/src/modules/alsa/mixer/paths/analog-output.conf @@ -0,0 +1,92 @@ +# This file is part of PulseAudio. +# +# PulseAudio is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as +# published by the Free Software Foundation; either version 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, write to the Free Software Foundation, +# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +; Intended for the 'default' output. Note that a-o-speaker.conf has a +; higher priority than this +; +; See analog-output.conf.common for an explanation on the directives + +[General] +priority = 99 + +[Element Hardware Master] +switch = ignore +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Master] +switch = ignore +volume = ignore +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Master Mono] +switch = off +volume = off + +; This profile path is intended to control the default output, not the +; headphones. But it should not hurt if we leave the headphone jack +; enabled nonetheless. +[Element Headphone] +switch = ignore +volume = zero + +[Element Headphone2] +switch = ignore +volume = zero + +[Element Speaker] +switch = ignore +volume = off + +[Element Front] +switch = ignore +volume = merge +override-map.1 = all-front +override-map.2 = front-left,front-right + +[Element Rear] +switch = ignore +volume = merge +override-map.1 = all-rear +override-map.2 = rear-left,rear-right + +[Element Surround] +switch = ignore +volume = merge +override-map.1 = all-rear +override-map.2 = rear-left,rear-right + +[Element Side] +switch = ignore +volume = merge +override-map.1 = all-side +override-map.2 = side-left,side-right + +[Element Center] +switch = ignore +volume = merge +override-map.1 = all-center +override-map.2 = all-center,all-center + +[Element LFE] +switch = ignore +volume = merge +override-map.1 = lfe +override-map.2 = lfe,lfe + +.include analog-output.conf.common diff --git a/src/modules/alsa/mixer/paths/analog-output.conf.common b/src/modules/alsa/mixer/paths/analog-output.conf.common new file mode 100644 index 0000000..3204846 --- /dev/null +++ b/src/modules/alsa/mixer/paths/analog-output.conf.common @@ -0,0 +1,128 @@ +# This file is part of PulseAudio. +# +# PulseAudio is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as +# published by the Free Software Foundation; either version 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, write to the Free Software Foundation, +# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +; Common part of all paths + +; So here's generally how mixer paths are used by PA: PA goes through +; a mixer path file from top to bottom and checks if a mixer element +; described therein exists. If so it is added to the list of mixer +; elements PA will control, keeping the order it read them in. If a +; mixer element described here has set the required= or +; required-absent= directives a path might not be accepted as valid +; and is ignored in its entirety (see below). However usually if a +; element listed here is missing this one element is ignored but not +; the entire path. +; +; When a device shall be muted/unmuted *all* elements listed in a path +; file with "switch = mute" will be toggled. +; +; When a device shall change its volume, PA will got through the list +; of all elements with "volume = merge" and set the volume on the +; first element. If that element does not support dB volumes, this is +; where the story ends. If it does support dB volumes, PA divides the +; requested volume by the volume that was set on this element, and +; then go on to the next element with "volume = merge" and then set +; that there, and so on. That way the first volume element in the +; path will be the one that does the 'biggest' part of the overall +; volume adjustment, with the remaining elements usually being set to +; some value next to 0dB. This logic makes sure we get the full range +; over all volume sliders and a very high granularity of volumes +; already in hardware. +; +; All switches and enumerations set to "select" are exposed via the +; "port" functionality of sinks/sources. Basically every possible +; switch setting and every possible enumeration setting will be +; combined and made into a "port". So make sure you don't list too +; many switches/enums for exposing, because the number of ports might +; rise exponentially. +; +; Only one path can be selected at a time. All paths that are valid +; for an audio device will be exposed as "port" for the sink/source. + + +; [General] +; priority = ... # Priority for this path +; description = ... +; +; [Option ...:...] # For each option of an enumeration or switch element +; # that shall be exposed as a sink/source port. Needs to +; # be named after the Element, followed by a colon, followed +; # by the option name, resp. on/off if the element is a switch. +; name = ... # Logical name to use in the path identifier +; priority = ... # Priority if this is made into a device port +; +; [Element ...] # For each element that we shall control +; required = ignore | switch | volume | enumeration | any # If set, require this element to be of this kind and available, +; # otherwise don't consider this path valid for the card +; required-absent = ignore | switch | volume # If set, require this element to not be of this kind and not +; # available, otherwise don't consider this path valid for the card +; +; switch = ignore | mute | off | on | select # What to do with this switch: ignore it, make it follow mute status, +; # always set it to off, always to on, or make it selectable as port. +; # If set to 'select' you need to define an Option section for on +; # and off +; volume = ignore | merge | off | zero # What to do with this volume: ignore it, merge it into the device +; # volume slider, always set it to the lowest value possible, or always +; # set it to 0 dB (for whatever that means) +; enumeration = ignore | select # What to do with this enumeration, ignore it or make it selectable +; # via device ports. If set to 'select' you need to define an Option section +; # for each of the items you want to expose +; direction = playback | capture # Is this relevant only for playback or capture? If not set this will implicitly be +; # set the direction of the PCM device is opened as. Generally this doesn't need to be set +; # unless you have a broken driver that has playback controls marked for capture or vice +; # versa +; direction-try-other = no | yes # If the element does not supported what is requested, try the other direction, too? +; +; override-map.1 = ... # Override the channel mask of the mixer control if the control only exposes a single channel +; override-map.2 = ... # Override the channel masks of the mixer control if the control only exposes two channels +; # Override maps should list for each element channel which high-level channels it controls via a +; # channel mask. A channel mask may either be the name of a single channel, or the words "all-left", +; # "all-right", "all-center", "all-front", "all-rear", and "all" to encode a specific subset of +; # channels in a mask + +[Element PCM] +switch = ignore +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element External Amplifier] +switch = select + +[Option External Amplifier:on] +name = output-amplifier-on +priority = 10 + +[Option External Amplifier:off] +name = output-amplifier-off +priority = 0 + +;;; 'Analog Output' + +[Element Analog Output] +enumeration = select + +[Option Analog Output:Speakers] +name = output-speaker +priority = 10 + +[Option Analog Output:Headphones] +name = output-headphones +priority = 9 + +[Option Analog Output:FP Headphones] +name = output-headphones +priority = 8 diff --git a/src/modules/alsa/mixer/profile-sets/90-pulseaudio.rules b/src/modules/alsa/mixer/profile-sets/90-pulseaudio.rules new file mode 100644 index 0000000..ea1a2fe --- /dev/null +++ b/src/modules/alsa/mixer/profile-sets/90-pulseaudio.rules @@ -0,0 +1,26 @@ +# do not edit this file, it will be overwritten on update + +# This file is part of PulseAudio. +# +# PulseAudio is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as +# published by the Free Software Foundation; either version 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, write to the Free Software Foundation, +# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +SUBSYSTEM!="sound", GOTO="pulseaudio_end" +ACTION!="change", GOTO="pulseaudio_end" +KERNEL!="card*", GOTO="pulseaudio_end" + +SUBSYSTEMS=="usb", ATTRS{idVendor}=="17cc", ATTRS{idProduct}=="1978", ENV{PULSE_PROFILE_SET}="native-instruments-audio8dj.conf" +SUBSYSTEMS=="usb", ATTRS{idVendor}=="17cc", ATTRS{idProduct}=="0839", ENV{PULSE_PROFILE_SET}="native-instruments-audio4dj.conf" + +LABEL="pulseaudio_end" diff --git a/src/modules/alsa/mixer/profile-sets/default.conf b/src/modules/alsa/mixer/profile-sets/default.conf new file mode 100644 index 0000000..9838138 --- /dev/null +++ b/src/modules/alsa/mixer/profile-sets/default.conf @@ -0,0 +1,144 @@ +# This file is part of PulseAudio. +# +# PulseAudio is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as +# published by the Free Software Foundation; either version 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, write to the Free Software Foundation, +# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +; Default profile definitions for the ALSA backend of PulseAudio. This +; is used as fallback for all cards that have no special mapping +; assigned. (and should be good enough for the vast majority of +; cards). Use the udev property PULSE_PROFILE_SET to assign a +; different profile set than this one to a device. So what is this +; about? Simply, what we do here is map ALSA devices to how they are +; exposed in PA. We say which ALSA device string to use to open a +; device, which channel mapping to use then, and which mixer path to +; use. This is encoded in a 'mapping'. Multiple of these mappings can +; be bound together in a 'profile' which is then directly exposed in +; the UI as a card profile. Each mapping assigned to a profile will +; result in one sink/source to be created if the profile is selected +; for the card. + +; [General] +; auto-profiles = no | yes # Instead of defining all profiles manually, autogenerate +; # them by combining every input mapping with every output mapping. +; +; [Mapping id] +; device-strings = ... # ALSA device string. %f will be replaced by the card identifier. +; channel-map = ... # Channel mapping to use for this device +; description = ... +; paths-input = ... # A list of mixer paths to use. Every path in this list will be probed. +; # If multiple are found to be working they will be available as device ports +; paths-output = ... +; element-input = ... # Instead of configuring a full mixer path simply configure a single +; # mixer element for volume/mute handling +; element-output = ... +; priority = ... +; direction = any | input | output # Only useful for? +; +; [Profile id] +; input-mappings = ... # Lists mappings for sources on this profile, those mapping must be +; # defined in this file too +; output-mappings = ... # Lists mappings for sinks on this profile, those mappings must be +; # defined in this file too +; description = ... +; priority = ... # Numeric value to deduce priority for this profile +; skip-probe = no | yes # Skip probing for availability? If this is yes then this profile +; # will be assumed as working without probing. Makes initialization +; # a bit faster but only works if the card is really known well. + +[General] +auto-profiles = yes + +[Mapping analog-mono] +device-strings = hw:0 +channel-map = mono +paths-output = analog-output analog-output-speaker analog-output-headphones analog-output-headphones-2 analog-output-mono analog-output-lfe-on-mono +paths-input = analog-input analog-input-mic analog-input-linein analog-input-aux analog-input-video analog-input-tvtuner analog-input-fm analog-input-mic-line +priority = 1 + +[Mapping analog-stereo] +device-strings = front:%f hw:0 +channel-map = left,right +paths-output = analog-output analog-output-speaker analog-output-headphones analog-output-headphones-2 analog-output-mono analog-output-lfe-on-mono +paths-input = analog-input analog-input-mic analog-input-linein analog-input-aux analog-input-video analog-input-tvtuner analog-input-fm analog-input-mic-line +priority = 10 + +[Mapping analog-surround-40] +device-strings = surround40:%f +channel-map = front-left,front-right,rear-left,rear-right +paths-output = analog-output analog-output-speaker analog-output-lfe-on-mono +priority = 7 +direction = output + +[Mapping analog-surround-41] +device-strings = surround41:%f +channel-map = front-left,front-right,rear-left,rear-right,lfe +paths-output = analog-output analog-output-speaker analog-output-lfe-on-mono +priority = 8 +direction = output + +[Mapping analog-surround-50] +device-strings = surround50:%f +channel-map = front-left,front-right,rear-left,rear-right,front-center +paths-output = analog-output analog-output-speaker analog-output-lfe-on-mono +priority = 7 +direction = output + +[Mapping analog-surround-51] +device-strings = surround51:%f +channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe +paths-output = analog-output analog-output-speaker analog-output-lfe-on-mono +priority = 8 +direction = output + +[Mapping analog-surround-71] +device-strings = surround71:%f +channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe,side-left,side-right +description = Analog Surround 7.1 +paths-output = analog-output analog-output-speaker analog-output-lfe-on-mono +priority = 7 +direction = output + +[Mapping iec958-stereo] +device-strings = iec958:%f +channel-map = left,right +priority = 5 + +[Mapping iec958-surround-40] +device-strings = iec958:%f +channel-map = front-left,front-right,rear-left,rear-right +priority = 1 + +[Mapping iec958-ac3-surround-40] +device-strings = a52:%f +channel-map = front-left,front-right,rear-left,rear-right +priority = 2 +direction = output + +[Mapping iec958-ac3-surround-51] +device-strings = a52:%f +channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe +priority = 3 +direction = output + +[Mapping hdmi-stereo] +device-strings = hdmi:%f +channel-map = left,right +priority = 4 +direction = output + +; An example for defining multiple-sink profiles +#[Profile output:analog-stereo+output:iec958-stereo+input:analog-stereo] +#description = Foobar +#output-mappings = analog-stereo iec958-stereo +#input-mappings = analog-stereo diff --git a/src/modules/alsa/mixer/profile-sets/native-instruments-audio4dj.conf b/src/modules/alsa/mixer/profile-sets/native-instruments-audio4dj.conf new file mode 100644 index 0000000..2b83530 --- /dev/null +++ b/src/modules/alsa/mixer/profile-sets/native-instruments-audio4dj.conf @@ -0,0 +1,91 @@ +# This file is part of PulseAudio. +# +# PulseAudio is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as +# published by the Free Software Foundation; either version 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, write to the Free Software Foundation, +# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +; Native Instruments Audio 4 DJ +; +; This card has two stereo pairs of input and two stereo pairs of +; output, named channels A and B. Channel B has an additional +; Headphone connector. +; +; We knowingly only define a subset of the theoretically possible +; mapping combinations as profiles here. +; +; See default.conf for an explanation on the directives used here. + +[General] +auto-profiles = no + +[Mapping analog-stereo-a] +description = Analog Stereo Channel A +device-strings = hw:%f,0,0 +channel-map = left,right + +[Mapping analog-stereo-b-output] +description = Analog Stereo Channel B (Headphones) +device-strings = hw:%f,0,1 +channel-map = left,right +direction = output + +[Mapping analog-stereo-b-input] +description = Analog Stereo Channel B +device-strings = hw:%f,0,1 +channel-map = left,right +direction = input + +[Profile output:analog-stereo-all+input:analog-stereo-all] +description = Analog Stereo Duplex Channels A, B (Headphones) +output-mappings = analog-stereo-a analog-stereo-b-output +input-mappings = analog-stereo-a analog-stereo-b-input +priority = 100 +skip-probe = yes + +[Profile output:analog-stereo-a+input:analog-stereo-a] +description = Analog Stereo Duplex Channel A +output-mappings = analog-stereo-a +input-mappings = analog-stereo-a +priority = 40 +skip-probe = yes + +[Profile output:analog-stereo-b+input:analog-stereo-b] +description = Analog Stereo Duplex Channel B (Headphones) +output-mappings = analog-stereo-b-output +input-mappings = analog-stereo-b-input +priority = 50 +skip-probe = yes + +[Profile output:analog-stereo-a] +description = Analog Stereo Output Channel A +output-mappings = analog-stereo-a +priority = 5 +skip-probe = yes + +[Profile output:analog-stereo-b] +description = Analog Stereo Output Channel B (Headphones) +output-mappings = analog-stereo-b-output +priority = 6 +skip-probe = yes + +[Profile input:analog-stereo-a] +description = Analog Stereo Input Channel A +input-mappings = analog-stereo-a +priority = 2 +skip-probe = yes + +[Profile input:analog-stereo-b] +description = Analog Stereo Input Channel B +input-mappings = analog-stereo-b-input +priority = 1 +skip-probe = yes diff --git a/src/modules/alsa/mixer/profile-sets/native-instruments-audio8dj.conf b/src/modules/alsa/mixer/profile-sets/native-instruments-audio8dj.conf new file mode 100644 index 0000000..3fe3cc5 --- /dev/null +++ b/src/modules/alsa/mixer/profile-sets/native-instruments-audio8dj.conf @@ -0,0 +1,162 @@ +# This file is part of PulseAudio. +# +# PulseAudio is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as +# published by the Free Software Foundation; either version 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, write to the Free Software Foundation, +# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +; Native Instruments Audio 8 DJ +; +; This card has four stereo pairs of input and four stereo pairs of +; output, named channels A to D. Channel C has an additional Mic/Line +; connector, channel D an additional Headphone connector. +; +; We knowingly only define a subset of the theoretically possible +; mapping combinations as profiles here. +; +; See default.conf for an explanation on the directives used here. + +[General] +auto-profiles = no + +[Mapping analog-stereo-a] +description = Analog Stereo Channel A +device-strings = hw:%f,0,0 +channel-map = left,right + +[Mapping analog-stereo-b] +description = Analog Stereo Channel B +device-strings = hw:%f,0,1 +channel-map = left,right + +# Since we want to set a different description for channel C's/D's input +# and output we define two seperate mappings for them +[Mapping analog-stereo-c-output] +description = Analog Stereo Channel C +device-strings = hw:%f,0,2 +channel-map = left,right +direction = output + +[Mapping analog-stereo-c-input] +description = Analog Stereo Channel C (Line/Mic) +device-strings = hw:%f,0,2 +channel-map = left,right +direction = input + +[Mapping analog-stereo-d-output] +description = Analog Stereo Channel D (Headphones) +device-strings = hw:%f,0,3 +channel-map = left,right +direction = output + +[Mapping analog-stereo-d-input] +description = Analog Stereo Channel D +device-strings = hw:%f,0,3 +channel-map = left,right +direction = input + +[Profile output:analog-stereo-all+input:analog-stereo-all] +description = Analog Stereo Duplex Channels A, B, C (Line/Mic), D (Headphones) +output-mappings = analog-stereo-a analog-stereo-b analog-stereo-c-output analog-stereo-d-output +input-mappings = analog-stereo-a analog-stereo-b analog-stereo-c-input analog-stereo-d-input +priority = 100 +skip-probe = yes + +[Profile output:analog-stereo-d+input:analog-stereo-c] +description = Analog Stereo Channel D (Headphones) Output, Channel C (Line/Mic) Input +output-mappings = analog-stereo-d-output +input-mappings = analog-stereo-c-input +priority = 90 +skip-probe = yes + +[Profile output:analog-stereo-c-d+input:analog-stereo-c-d] +description = Analog Stereo Duplex Channels C (Line/Mic), D (Line/Mic) +output-mappings = analog-stereo-c-output analog-stereo-d-output +input-mappings = analog-stereo-c-input analog-stereo-d-input +priority = 80 +skip-probe = yes + +[Profile output:analog-stereo-a+input:analog-stereo-a] +description = Analog Stereo Duplex Channel A +output-mappings = analog-stereo-a +input-mappings = analog-stereo-a +priority = 50 +skip-probe = yes + +[Profile output:analog-stereo-b+input:analog-stereo-b] +description = Analog Stereo Duplex Channel B +output-mappings = analog-stereo-b +input-mappings = analog-stereo-b +priority = 40 +skip-probe = yes + +[Profile output:analog-stereo-c+input:analog-stereo-c] +description = Analog Stereo Duplex Channel C (Line/Mic) +output-mappings = analog-stereo-c-output +input-mappings = analog-stereo-c-input +priority = 60 +skip-probe = yes + +[Profile output:analog-stereo-d+input:analog-stereo-d] +description = Analog Stereo Duplex Channel D (Headphones) +output-mappings = analog-stereo-d-output +input-mappings = analog-stereo-d-input +priority = 70 +skip-probe = yes + +[Profile output:analog-stereo-a] +description = Analog Stereo Output Channel A +output-mappings = analog-stereo-a +priority = 6 +skip-probe = yes + +[Profile output:analog-stereo-b] +description = Analog Stereo Output Channel B +output-mappings = analog-stereo-b +priority = 5 +skip-probe = yes + +[Profile output:analog-stereo-c] +description = Analog Stereo Output Channel C +output-mappings = analog-stereo-c-output +priority = 7 +skip-probe = yes + +[Profile output:analog-stereo-d] +description = Analog Stereo Output Channel D (Headphones) +output-mappings = analog-stereo-d-output +priority = 8 +skip-probe = yes + +[Profile input:analog-stereo-a] +description = Analog Stereo Input Channel A +input-mappings = analog-stereo-a +priority = 2 +skip-probe = yes + +[Profile input:analog-stereo-b] +description = Analog Stereo Input Channel B +input-mappings = analog-stereo-b +priority = 1 +skip-probe = yes + +[Profile input:analog-stereo-c] +description = Analog Stereo Input Channel C (Line/Mic) +input-mappings = analog-stereo-c-input +priority = 4 +skip-probe = yes + +[Profile input:analog-stereo-d] +description = Analog Stereo Input Channel D +input-mappings = analog-stereo-d-input +priority = 3 +skip-probe = yes diff --git a/src/modules/alsa/module-alsa-card-symdef.h b/src/modules/alsa/module-alsa-card-symdef.h new file mode 100644 index 0000000..9613c51 --- /dev/null +++ b/src/modules/alsa/module-alsa-card-symdef.h @@ -0,0 +1,29 @@ +#ifndef foomodulealsacardsymdeffoo +#define foomodulealsacardsymdeffoo + +#include +#include +#include + +#define pa__init module_alsa_card_LTX_pa__init +#define pa__done module_alsa_card_LTX_pa__done +#define pa__get_author module_alsa_card_LTX_pa__get_author +#define pa__get_description module_alsa_card_LTX_pa__get_description +#define pa__get_usage module_alsa_card_LTX_pa__get_usage +#define pa__get_version module_alsa_card_LTX_pa__get_version +#define pa__get_deprecated module_alsa_card_LTX_pa__get_deprecated +#define pa__load_once module_alsa_card_LTX_pa__load_once +#define pa__get_n_used module_alsa_card_LTX_pa__get_n_used + +int pa__init(pa_module*m); +void pa__done(pa_module*m); +int pa__get_n_used(pa_module*m); + +const char* pa__get_author(void); +const char* pa__get_description(void); +const char* pa__get_usage(void); +const char* pa__get_version(void); +const char* pa__get_deprecated(void); +pa_bool_t pa__load_once(void); + +#endif diff --git a/src/modules/alsa/module-alsa-card.c b/src/modules/alsa/module-alsa-card.c new file mode 100644 index 0000000..6bea33d --- /dev/null +++ b/src/modules/alsa/module-alsa-card.c @@ -0,0 +1,446 @@ +/*** + This file is part of PulseAudio. + + Copyright 2009 Lennart Poettering + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include + +#include +#include +#include + +#include + +#ifdef HAVE_UDEV +#include +#endif + +#include "alsa-util.h" +#include "alsa-sink.h" +#include "alsa-source.h" +#include "module-alsa-card-symdef.h" + +PA_MODULE_AUTHOR("Lennart Poettering"); +PA_MODULE_DESCRIPTION("ALSA Card"); +PA_MODULE_VERSION(PACKAGE_VERSION); +PA_MODULE_LOAD_ONCE(FALSE); +PA_MODULE_USAGE( + "name= " + "card_name= " + "card_properties= " + "sink_name= " + "sink_properties= " + "source_name= " + "source_properties= " + "device_id= " + "format= " + "rate= " + "fragments= " + "fragment_size= " + "mmap= " + "tsched= " + "tsched_buffer_size= " + "tsched_buffer_watermark= " + "profile= " + "ignore_dB="); + +static const char* const valid_modargs[] = { + "name", + "card_name", + "card_properties", + "sink_name", + "sink_properties", + "source_name", + "source_properties", + "device_id", + "format", + "rate", + "fragments", + "fragment_size", + "mmap", + "tsched", + "tsched_buffer_size", + "tsched_buffer_watermark", + "profile", + "ignore_dB", + NULL +}; + +#define DEFAULT_DEVICE_ID "0" + +struct userdata { + pa_core *core; + pa_module *module; + + char *device_id; + + pa_card *card; + + pa_modargs *modargs; + + pa_alsa_profile_set *profile_set; +}; + +struct profile_data { + pa_alsa_profile *profile; +}; + +static void add_profiles(struct userdata *u, pa_hashmap *h) { + pa_alsa_profile *ap; + void *state; + + pa_assert(u); + pa_assert(h); + + PA_HASHMAP_FOREACH(ap, u->profile_set->profiles, state) { + struct profile_data *d; + pa_card_profile *cp; + pa_alsa_mapping *m; + uint32_t idx; + + cp = pa_card_profile_new(ap->name, ap->description, sizeof(struct profile_data)); + cp->priority = ap->priority; + + if (ap->output_mappings) { + cp->n_sinks = pa_idxset_size(ap->output_mappings); + + PA_IDXSET_FOREACH(m, ap->output_mappings, idx) + if (m->channel_map.channels > cp->max_sink_channels) + cp->max_sink_channels = m->channel_map.channels; + } + + if (ap->input_mappings) { + cp->n_sources = pa_idxset_size(ap->input_mappings); + + PA_IDXSET_FOREACH(m, ap->input_mappings, idx) + if (m->channel_map.channels > cp->max_source_channels) + cp->max_source_channels = m->channel_map.channels; + } + + d = PA_CARD_PROFILE_DATA(cp); + d->profile = ap; + + pa_hashmap_put(h, cp->name, cp); + } +} + +static void add_disabled_profile(pa_hashmap *profiles) { + pa_card_profile *p; + struct profile_data *d; + + p = pa_card_profile_new("off", _("Off"), sizeof(struct profile_data)); + + d = PA_CARD_PROFILE_DATA(p); + d->profile = NULL; + + pa_hashmap_put(profiles, p->name, p); +} + +static int card_set_profile(pa_card *c, pa_card_profile *new_profile) { + struct userdata *u; + struct profile_data *nd, *od; + uint32_t idx; + pa_alsa_mapping *am; + pa_queue *sink_inputs = NULL, *source_outputs = NULL; + + pa_assert(c); + pa_assert(new_profile); + pa_assert_se(u = c->userdata); + + nd = PA_CARD_PROFILE_DATA(new_profile); + od = PA_CARD_PROFILE_DATA(c->active_profile); + + if (od->profile && od->profile->output_mappings) + PA_IDXSET_FOREACH(am, od->profile->output_mappings, idx) { + if (!am->sink) + continue; + + if (nd->profile && + nd->profile->output_mappings && + pa_idxset_get_by_data(nd->profile->output_mappings, am, NULL)) + continue; + + sink_inputs = pa_sink_move_all_start(am->sink, sink_inputs); + pa_alsa_sink_free(am->sink); + am->sink = NULL; + } + + if (od->profile && od->profile->input_mappings) + PA_IDXSET_FOREACH(am, od->profile->input_mappings, idx) { + if (!am->source) + continue; + + if (nd->profile && + nd->profile->input_mappings && + pa_idxset_get_by_data(nd->profile->input_mappings, am, NULL)) + continue; + + source_outputs = pa_source_move_all_start(am->source, source_outputs); + pa_alsa_source_free(am->source); + am->source = NULL; + } + + if (nd->profile && nd->profile->output_mappings) + PA_IDXSET_FOREACH(am, nd->profile->output_mappings, idx) { + + if (!am->sink) + am->sink = pa_alsa_sink_new(c->module, u->modargs, __FILE__, c, am); + + if (sink_inputs && am->sink) { + pa_sink_move_all_finish(am->sink, sink_inputs, FALSE); + sink_inputs = NULL; + } + } + + if (nd->profile && nd->profile->input_mappings) + PA_IDXSET_FOREACH(am, nd->profile->input_mappings, idx) { + + if (!am->source) + am->source = pa_alsa_source_new(c->module, u->modargs, __FILE__, c, am); + + if (source_outputs && am->source) { + pa_source_move_all_finish(am->source, source_outputs, FALSE); + source_outputs = NULL; + } + } + + if (sink_inputs) + pa_sink_move_all_fail(sink_inputs); + + if (source_outputs) + pa_source_move_all_fail(source_outputs); + + return 0; +} + +static void init_profile(struct userdata *u) { + uint32_t idx; + pa_alsa_mapping *am; + struct profile_data *d; + + pa_assert(u); + + d = PA_CARD_PROFILE_DATA(u->card->active_profile); + + if (d->profile && d->profile->output_mappings) + PA_IDXSET_FOREACH(am, d->profile->output_mappings, idx) + am->sink = pa_alsa_sink_new(u->module, u->modargs, __FILE__, u->card, am); + + if (d->profile && d->profile->input_mappings) + PA_IDXSET_FOREACH(am, d->profile->input_mappings, idx) + am->source = pa_alsa_source_new(u->module, u->modargs, __FILE__, u->card, am); +} + +static void set_card_name(pa_card_new_data *data, pa_modargs *ma, const char *device_id) { + char *t; + const char *n; + + pa_assert(data); + pa_assert(ma); + pa_assert(device_id); + + if ((n = pa_modargs_get_value(ma, "card_name", NULL))) { + pa_card_new_data_set_name(data, n); + data->namereg_fail = TRUE; + return; + } + + if ((n = pa_modargs_get_value(ma, "name", NULL))) + data->namereg_fail = TRUE; + else { + n = device_id; + data->namereg_fail = FALSE; + } + + t = pa_sprintf_malloc("alsa_card.%s", n); + pa_card_new_data_set_name(data, t); + pa_xfree(t); +} + +int pa__init(pa_module *m) { + pa_card_new_data data; + pa_modargs *ma; + int alsa_card_index; + struct userdata *u; + pa_reserve_wrapper *reserve = NULL; + const char *description; + char *fn = NULL; + + pa_alsa_refcnt_inc(); + + pa_assert(m); + + if (!(ma = pa_modargs_new(m->argument, valid_modargs))) { + pa_log("Failed to parse module arguments"); + goto fail; + } + + m->userdata = u = pa_xnew0(struct userdata, 1); + u->core = m->core; + u->module = m; + u->device_id = pa_xstrdup(pa_modargs_get_value(ma, "device_id", DEFAULT_DEVICE_ID)); + u->modargs = ma; + + if ((alsa_card_index = snd_card_get_index(u->device_id)) < 0) { + pa_log("Card '%s' doesn't exist: %s", u->device_id, pa_alsa_strerror(alsa_card_index)); + goto fail; + } + + if (!pa_in_system_mode()) { + char *rname; + + if ((rname = pa_alsa_get_reserve_name(u->device_id))) { + reserve = pa_reserve_wrapper_get(m->core, rname); + pa_xfree(rname); + + if (!reserve) + goto fail; + } + } + +#ifdef HAVE_UDEV + fn = pa_udev_get_property(alsa_card_index, "PULSE_PROFILE_SET"); +#endif + + u->profile_set = pa_alsa_profile_set_new(fn, &u->core->default_channel_map); + pa_xfree(fn); + + if (!u->profile_set) + goto fail; + + pa_alsa_profile_set_probe(u->profile_set, u->device_id, &m->core->default_sample_spec, m->core->default_n_fragments, m->core->default_fragment_size_msec); + + pa_card_new_data_init(&data); + data.driver = __FILE__; + data.module = m; + + pa_alsa_init_proplist_card(m->core, data.proplist, alsa_card_index); + + pa_proplist_sets(data.proplist, PA_PROP_DEVICE_STRING, u->device_id); + pa_alsa_init_description(data.proplist); + set_card_name(&data, ma, u->device_id); + + if (reserve) + if ((description = pa_proplist_gets(data.proplist, PA_PROP_DEVICE_DESCRIPTION))) + pa_reserve_wrapper_set_application_device_name(reserve, description); + + data.profiles = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func); + add_profiles(u, data.profiles); + + if (pa_hashmap_isempty(data.profiles)) { + pa_log("Failed to find a working profile."); + pa_card_new_data_done(&data); + goto fail; + } + + add_disabled_profile(data.profiles); + + if (pa_modargs_get_proplist(ma, "card_properties", data.proplist, PA_UPDATE_REPLACE) < 0) { + pa_log("Invalid properties"); + pa_card_new_data_done(&data); + goto fail; + } + + u->card = pa_card_new(m->core, &data); + pa_card_new_data_done(&data); + + if (!u->card) + goto fail; + + u->card->userdata = u; + u->card->set_profile = card_set_profile; + + init_profile(u); + + if (reserve) + pa_reserve_wrapper_unref(reserve); + + return 0; + +fail: + if (reserve) + pa_reserve_wrapper_unref(reserve); + + pa__done(m); + + return -1; +} + +int pa__get_n_used(pa_module *m) { + struct userdata *u; + int n = 0; + uint32_t idx; + pa_sink *sink; + pa_source *source; + + pa_assert(m); + pa_assert_se(u = m->userdata); + pa_assert(u->card); + + PA_IDXSET_FOREACH(sink, u->card->sinks, idx) + n += pa_sink_linked_by(sink); + + PA_IDXSET_FOREACH(source, u->card->sources, idx) + n += pa_source_linked_by(source); + + return n; +} + +void pa__done(pa_module*m) { + struct userdata *u; + + pa_assert(m); + + if (!(u = m->userdata)) + goto finish; + + if (u->card && u->card->sinks) { + pa_sink *s; + + while ((s = pa_idxset_steal_first(u->card->sinks, NULL))) + pa_alsa_sink_free(s); + } + + if (u->card && u->card->sources) { + pa_source *s; + + while ((s = pa_idxset_steal_first(u->card->sources, NULL))) + pa_alsa_source_free(s); + } + + if (u->card) + pa_card_free(u->card); + + if (u->modargs) + pa_modargs_free(u->modargs); + + if (u->profile_set) + pa_alsa_profile_set_free(u->profile_set); + + pa_xfree(u->device_id); + pa_xfree(u); + +finish: + pa_alsa_refcnt_dec(); +} diff --git a/src/modules/alsa/module-alsa-sink-symdef.h b/src/modules/alsa/module-alsa-sink-symdef.h new file mode 100644 index 0000000..cda3cd9 --- /dev/null +++ b/src/modules/alsa/module-alsa-sink-symdef.h @@ -0,0 +1,29 @@ +#ifndef foomodulealsasinksymdeffoo +#define foomodulealsasinksymdeffoo + +#include +#include +#include + +#define pa__init module_alsa_sink_LTX_pa__init +#define pa__done module_alsa_sink_LTX_pa__done +#define pa__get_author module_alsa_sink_LTX_pa__get_author +#define pa__get_description module_alsa_sink_LTX_pa__get_description +#define pa__get_usage module_alsa_sink_LTX_pa__get_usage +#define pa__get_version module_alsa_sink_LTX_pa__get_version +#define pa__get_deprecated module_alsa_sink_LTX_pa__get_deprecated +#define pa__load_once module_alsa_sink_LTX_pa__load_once +#define pa__get_n_used module_alsa_sink_LTX_pa__get_n_used + +int pa__init(pa_module*m); +void pa__done(pa_module*m); +int pa__get_n_used(pa_module*m); + +const char* pa__get_author(void); +const char* pa__get_description(void); +const char* pa__get_usage(void); +const char* pa__get_version(void); +const char* pa__get_deprecated(void); +pa_bool_t pa__load_once(void); + +#endif diff --git a/src/modules/alsa/module-alsa-sink.c b/src/modules/alsa/module-alsa-sink.c new file mode 100644 index 0000000..3aa89b2 --- /dev/null +++ b/src/modules/alsa/module-alsa-sink.c @@ -0,0 +1,127 @@ +/*** + This file is part of PulseAudio. + + Copyright 2004-2008 Lennart Poettering + Copyright 2006 Pierre Ossman for Cendio AB + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include + +#include "alsa-util.h" +#include "alsa-sink.h" +#include "module-alsa-sink-symdef.h" + +PA_MODULE_AUTHOR("Lennart Poettering"); +PA_MODULE_DESCRIPTION("ALSA Sink"); +PA_MODULE_VERSION(PACKAGE_VERSION); +PA_MODULE_LOAD_ONCE(FALSE); +PA_MODULE_USAGE( + "name= " + "sink_name= " + "sink_properities= " + "device= " + "device_id= " + "format= " + "rate= " + "channels= " + "channel_map= " + "fragments= " + "fragment_size= " + "mmap= " + "tsched= " + "tsched_buffer_size= " + "tsched_buffer_watermark= " + "ignore_dB= " + "control="); + +static const char* const valid_modargs[] = { + "name", + "sink_name", + "sink_properties", + "device", + "device_id", + "format", + "rate", + "channels", + "channel_map", + "fragments", + "fragment_size", + "mmap", + "tsched", + "tsched_buffer_size", + "tsched_buffer_watermark", + "ignore_dB", + "control", + NULL +}; + +int pa__init(pa_module*m) { + pa_modargs *ma = NULL; + + pa_assert(m); + + pa_alsa_refcnt_inc(); + + if (!(ma = pa_modargs_new(m->argument, valid_modargs))) { + pa_log("Failed to parse module arguments"); + goto fail; + } + + if (!(m->userdata = pa_alsa_sink_new(m, ma, __FILE__, NULL, NULL))) + goto fail; + + pa_modargs_free(ma); + + return 0; + +fail: + + if (ma) + pa_modargs_free(ma); + + pa__done(m); + + return -1; +} + +int pa__get_n_used(pa_module *m) { + pa_sink *sink; + + pa_assert(m); + pa_assert_se(sink = m->userdata); + + return pa_sink_linked_by(sink); +} + +void pa__done(pa_module*m) { + pa_sink *sink; + + pa_assert(m); + + if ((sink = m->userdata)) + pa_alsa_sink_free(sink); + + pa_alsa_refcnt_dec(); +} diff --git a/src/modules/alsa/module-alsa-source-symdef.h b/src/modules/alsa/module-alsa-source-symdef.h new file mode 100644 index 0000000..0ff3967 --- /dev/null +++ b/src/modules/alsa/module-alsa-source-symdef.h @@ -0,0 +1,29 @@ +#ifndef foomodulealsasourcesymdeffoo +#define foomodulealsasourcesymdeffoo + +#include +#include +#include + +#define pa__init module_alsa_source_LTX_pa__init +#define pa__done module_alsa_source_LTX_pa__done +#define pa__get_author module_alsa_source_LTX_pa__get_author +#define pa__get_description module_alsa_source_LTX_pa__get_description +#define pa__get_usage module_alsa_source_LTX_pa__get_usage +#define pa__get_version module_alsa_source_LTX_pa__get_version +#define pa__get_deprecated module_alsa_source_LTX_pa__get_deprecated +#define pa__load_once module_alsa_source_LTX_pa__load_once +#define pa__get_n_used module_alsa_source_LTX_pa__get_n_used + +int pa__init(pa_module*m); +void pa__done(pa_module*m); +int pa__get_n_used(pa_module*m); + +const char* pa__get_author(void); +const char* pa__get_description(void); +const char* pa__get_usage(void); +const char* pa__get_version(void); +const char* pa__get_deprecated(void); +pa_bool_t pa__load_once(void); + +#endif diff --git a/src/modules/alsa/module-alsa-source.c b/src/modules/alsa/module-alsa-source.c new file mode 100644 index 0000000..23da418 --- /dev/null +++ b/src/modules/alsa/module-alsa-source.c @@ -0,0 +1,151 @@ +/*** + This file is part of PulseAudio. + + Copyright 2004-2008 Lennart Poettering + Copyright 2006 Pierre Ossman for Cendio AB + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include + +#ifdef HAVE_VALGRIND_MEMCHECK_H +#include +#endif + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "alsa-util.h" +#include "alsa-source.h" +#include "module-alsa-source-symdef.h" + +PA_MODULE_AUTHOR("Lennart Poettering"); +PA_MODULE_DESCRIPTION("ALSA Source"); +PA_MODULE_VERSION(PACKAGE_VERSION); +PA_MODULE_LOAD_ONCE(FALSE); +PA_MODULE_USAGE( + "name= " + "source_name= " + "source_properties= " + "device= " + "device_id= " + "format= " + "rate= " + "channels= " + "channel_map= " + "fragments= " + "fragment_size= " + "mmap= " + "tsched= " + "tsched_buffer_size= " + "tsched_buffer_watermark= " + "ignore_dB= " + "control="); + +static const char* const valid_modargs[] = { + "name", + "source_name", + "source_properties", + "device", + "device_id", + "format", + "rate", + "channels", + "channel_map", + "fragments", + "fragment_size", + "mmap", + "tsched", + "tsched_buffer_size", + "tsched_buffer_watermark", + "ignore_dB", + "control", + NULL +}; + +int pa__init(pa_module*m) { + pa_modargs *ma = NULL; + + pa_assert(m); + + pa_alsa_refcnt_inc(); + + if (!(ma = pa_modargs_new(m->argument, valid_modargs))) { + pa_log("Failed to parse module arguments"); + goto fail; + } + + if (!(m->userdata = pa_alsa_source_new(m, ma, __FILE__, NULL, NULL))) + goto fail; + + pa_modargs_free(ma); + + return 0; + +fail: + + if (ma) + pa_modargs_free(ma); + + pa__done(m); + + return -1; +} + +int pa__get_n_used(pa_module *m) { + pa_source *source; + + pa_assert(m); + pa_assert_se(source = m->userdata); + + return pa_source_linked_by(source); +} + +void pa__done(pa_module*m) { + pa_source *source; + + pa_assert(m); + + if ((source = m->userdata)) + pa_alsa_source_free(source); + + pa_alsa_refcnt_dec(); +} diff --git a/src/modules/bluetooth/bluetooth-util.c b/src/modules/bluetooth/bluetooth-util.c new file mode 100644 index 0000000..055ec86 --- /dev/null +++ b/src/modules/bluetooth/bluetooth-util.c @@ -0,0 +1,1668 @@ +/*** + This file is part of PulseAudio. + + Copyright 2008-2009 Joao Paulo Rechi Vita + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation; either version 2.1 of the + License, or (at your option) any later version. + + PulseAudio 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 Lesser General Public + License along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include + +#include "bluetooth-util.h" +#include "ipc.h" + +#define HFP_AG_ENDPOINT "/MediaEndpoint/HFPAG" +#define A2DP_SOURCE_ENDPOINT "/MediaEndpoint/A2DPSource" +#define A2DP_SINK_ENDPOINT "/MediaEndpoint/A2DPSink" + +#define ENDPOINT_INTROSPECT_XML \ + DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE \ + "" \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + "" + +#define MAX_BITPOOL 64 +#define MIN_BIPOOL 2U + +struct pa_bluetooth_discovery { + PA_REFCNT_DECLARE; + + pa_core *core; + pa_dbus_connection *connection; + PA_LLIST_HEAD(pa_dbus_pending, pending); + pa_hashmap *devices; + pa_hook hook; + pa_bool_t filter_added; +}; + +#ifdef DBUS_TYPE_UNIX_FD +#undef DBUS_TYPE_UNIX_FD +#endif + +static void get_properties_reply(DBusPendingCall *pending, void *userdata); +static pa_dbus_pending* send_and_add_to_pending(pa_bluetooth_discovery *y, DBusMessage *m, DBusPendingCallNotifyFunction func, void *call_data); + +static pa_bt_audio_state_t pa_bt_audio_state_from_string(const char* value) { + pa_assert(value); + + if (pa_streq(value, "disconnected")) + return PA_BT_AUDIO_STATE_DISCONNECTED; + else if (pa_streq(value, "connecting")) + return PA_BT_AUDIO_STATE_CONNECTING; + else if (pa_streq(value, "connected")) + return PA_BT_AUDIO_STATE_CONNECTED; + else if (pa_streq(value, "playing")) + return PA_BT_AUDIO_STATE_PLAYING; + + return PA_BT_AUDIO_STATE_INVALID; +} + +static pa_bluetooth_uuid *uuid_new(const char *uuid) { + pa_bluetooth_uuid *u; + + u = pa_xnew(pa_bluetooth_uuid, 1); + u->uuid = pa_xstrdup(uuid); + PA_LLIST_INIT(pa_bluetooth_uuid, u); + + return u; +} + +static void uuid_free(pa_bluetooth_uuid *u) { + pa_assert(u); + + pa_xfree(u->uuid); + pa_xfree(u); +} + +static pa_bluetooth_device* device_new(const char *path) { + pa_bluetooth_device *d; + + d = pa_xnew(pa_bluetooth_device, 1); + + d->dead = FALSE; + + d->device_info_valid = 0; + + d->name = NULL; + d->path = pa_xstrdup(path); + d->transports = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func); + d->paired = -1; + d->alias = NULL; + d->device_connected = -1; + PA_LLIST_HEAD_INIT(pa_bluetooth_uuid, d->uuids); + d->address = NULL; + d->class = -1; + d->trusted = -1; + + d->audio_state = PA_BT_AUDIO_STATE_INVALID; + d->audio_sink_state = PA_BT_AUDIO_STATE_INVALID; + d->audio_source_state = PA_BT_AUDIO_STATE_INVALID; + d->headset_state = PA_BT_AUDIO_STATE_INVALID; + d->hfgw_state = PA_BT_AUDIO_STATE_INVALID; + + return d; +} + +static void transport_free(pa_bluetooth_transport *t) { + pa_assert(t); + + pa_xfree(t->path); + pa_xfree(t->config); + pa_xfree(t); +} + +static void device_free(pa_bluetooth_device *d) { + pa_bluetooth_uuid *u; + pa_bluetooth_transport *t; + + pa_assert(d); + + while ((t = pa_hashmap_steal_first(d->transports))) + transport_free(t); + + pa_hashmap_free(d->transports, NULL, NULL); + + while ((u = d->uuids)) { + PA_LLIST_REMOVE(pa_bluetooth_uuid, d->uuids, u); + uuid_free(u); + } + + pa_xfree(d->name); + pa_xfree(d->path); + pa_xfree(d->alias); + pa_xfree(d->address); + pa_xfree(d); +} + +static pa_bool_t device_is_audio(pa_bluetooth_device *d) { + pa_assert(d); + + return + d->device_info_valid && (d->hfgw_state != PA_BT_AUDIO_STATE_INVALID || + (d->audio_state != PA_BT_AUDIO_STATE_INVALID && + (d->audio_sink_state != PA_BT_AUDIO_STATE_INVALID || + d->audio_source_state != PA_BT_AUDIO_STATE_INVALID || + d->headset_state != PA_BT_AUDIO_STATE_INVALID))); +} + +static int parse_device_property(pa_bluetooth_discovery *y, pa_bluetooth_device *d, DBusMessageIter *i) { + const char *key; + DBusMessageIter variant_i; + + pa_assert(y); + pa_assert(d); + pa_assert(i); + + if (dbus_message_iter_get_arg_type(i) != DBUS_TYPE_STRING) { + pa_log("Property name not a string."); + return -1; + } + + dbus_message_iter_get_basic(i, &key); + + if (!dbus_message_iter_next(i)) { + pa_log("Property value missing"); + return -1; + } + + if (dbus_message_iter_get_arg_type(i) != DBUS_TYPE_VARIANT) { + pa_log("Property value not a variant."); + return -1; + } + + dbus_message_iter_recurse(i, &variant_i); + +/* pa_log_debug("Parsing property org.bluez.Device.%s", key); */ + + switch (dbus_message_iter_get_arg_type(&variant_i)) { + + case DBUS_TYPE_STRING: { + + const char *value; + dbus_message_iter_get_basic(&variant_i, &value); + + if (pa_streq(key, "Name")) { + pa_xfree(d->name); + d->name = pa_xstrdup(value); + } else if (pa_streq(key, "Alias")) { + pa_xfree(d->alias); + d->alias = pa_xstrdup(value); + } else if (pa_streq(key, "Address")) { + pa_xfree(d->address); + d->address = pa_xstrdup(value); + } + +/* pa_log_debug("Value %s", value); */ + + break; + } + + case DBUS_TYPE_BOOLEAN: { + + dbus_bool_t value; + dbus_message_iter_get_basic(&variant_i, &value); + + if (pa_streq(key, "Paired")) + d->paired = !!value; + else if (pa_streq(key, "Connected")) + d->device_connected = !!value; + else if (pa_streq(key, "Trusted")) + d->trusted = !!value; + +/* pa_log_debug("Value %s", pa_yes_no(value)); */ + + break; + } + + case DBUS_TYPE_UINT32: { + + uint32_t value; + dbus_message_iter_get_basic(&variant_i, &value); + + if (pa_streq(key, "Class")) + d->class = (int) value; + +/* pa_log_debug("Value %u", (unsigned) value); */ + + break; + } + + case DBUS_TYPE_ARRAY: { + + DBusMessageIter ai; + dbus_message_iter_recurse(&variant_i, &ai); + + if (dbus_message_iter_get_arg_type(&ai) == DBUS_TYPE_STRING && + pa_streq(key, "UUIDs")) { + + while (dbus_message_iter_get_arg_type(&ai) != DBUS_TYPE_INVALID) { + pa_bluetooth_uuid *node; + const char *value; + DBusMessage *m; + + dbus_message_iter_get_basic(&ai, &value); + node = uuid_new(value); + PA_LLIST_PREPEND(pa_bluetooth_uuid, d->uuids, node); + + /* Vudentz said the interfaces are here when the UUIDs are announced */ + if (strcasecmp(HSP_AG_UUID, value) == 0 || strcasecmp(HFP_AG_UUID, value) == 0) { + pa_assert_se(m = dbus_message_new_method_call("org.bluez", d->path, "org.bluez.HandsfreeGateway", "GetProperties")); + send_and_add_to_pending(y, m, get_properties_reply, d); + } else if (strcasecmp(HSP_HS_UUID, value) == 0 || strcasecmp(HFP_HS_UUID, value) == 0) { + pa_assert_se(m = dbus_message_new_method_call("org.bluez", d->path, "org.bluez.Headset", "GetProperties")); + send_and_add_to_pending(y, m, get_properties_reply, d); + } else if (strcasecmp(A2DP_SINK_UUID, value) == 0) { + pa_assert_se(m = dbus_message_new_method_call("org.bluez", d->path, "org.bluez.AudioSink", "GetProperties")); + send_and_add_to_pending(y, m, get_properties_reply, d); + } else if (strcasecmp(A2DP_SOURCE_UUID, value) == 0) { + pa_assert_se(m = dbus_message_new_method_call("org.bluez", d->path, "org.bluez.AudioSource", "GetProperties")); + send_and_add_to_pending(y, m, get_properties_reply, d); + } + + /* this might eventually be racy if .Audio is not there yet, but the State change will come anyway later, so this call is for cold-detection mostly */ + pa_assert_se(m = dbus_message_new_method_call("org.bluez", d->path, "org.bluez.Audio", "GetProperties")); + send_and_add_to_pending(y, m, get_properties_reply, d); + + if (!dbus_message_iter_next(&ai)) + break; + } + } + + break; + } + } + + return 0; +} + +static int parse_audio_property(pa_bluetooth_discovery *u, int *state, DBusMessageIter *i) { + const char *key; + DBusMessageIter variant_i; + + pa_assert(u); + pa_assert(state); + pa_assert(i); + + if (dbus_message_iter_get_arg_type(i) != DBUS_TYPE_STRING) { + pa_log("Property name not a string."); + return -1; + } + + dbus_message_iter_get_basic(i, &key); + + if (!dbus_message_iter_next(i)) { + pa_log("Property value missing"); + return -1; + } + + if (dbus_message_iter_get_arg_type(i) != DBUS_TYPE_VARIANT) { + pa_log("Property value not a variant."); + return -1; + } + + dbus_message_iter_recurse(i, &variant_i); + +/* pa_log_debug("Parsing property org.bluez.{Audio|AudioSink|AudioSource|Headset}.%s", key); */ + + switch (dbus_message_iter_get_arg_type(&variant_i)) { + + case DBUS_TYPE_STRING: { + + const char *value; + dbus_message_iter_get_basic(&variant_i, &value); + + if (pa_streq(key, "State")) { + *state = pa_bt_audio_state_from_string(value); + pa_log_debug("dbus: property 'State' changed to value '%s'", value); + } + + break; + } + } + + return 0; +} + +static void run_callback(pa_bluetooth_discovery *y, pa_bluetooth_device *d, pa_bool_t dead) { + pa_assert(y); + pa_assert(d); + + if (!device_is_audio(d)) + return; + + d->dead = dead; + pa_hook_fire(&y->hook, d); +} + +static void remove_all_devices(pa_bluetooth_discovery *y) { + pa_bluetooth_device *d; + + pa_assert(y); + + while ((d = pa_hashmap_steal_first(y->devices))) { + run_callback(y, d, TRUE); + device_free(d); + } +} + +static pa_bluetooth_device *found_device(pa_bluetooth_discovery *y, const char* path) { + DBusMessage *m; + pa_bluetooth_device *d; + + pa_assert(y); + pa_assert(path); + + d = pa_hashmap_get(y->devices, path); + if (d) + return d; + + d = device_new(path); + + pa_hashmap_put(y->devices, d->path, d); + + pa_assert_se(m = dbus_message_new_method_call("org.bluez", path, "org.bluez.Device", "GetProperties")); + send_and_add_to_pending(y, m, get_properties_reply, d); + + /* Before we read the other properties (Audio, AudioSink, AudioSource, + * Headset) we wait that the UUID is read */ + return d; +} + +static void get_properties_reply(DBusPendingCall *pending, void *userdata) { + DBusMessage *r; + DBusMessageIter arg_i, element_i; + pa_dbus_pending *p; + pa_bluetooth_device *d; + pa_bluetooth_discovery *y; + int valid; + + pa_assert_se(p = userdata); + pa_assert_se(y = p->context_data); + pa_assert_se(r = dbus_pending_call_steal_reply(pending)); + +/* pa_log_debug("Got %s.GetProperties response for %s", */ +/* dbus_message_get_interface(p->message), */ +/* dbus_message_get_path(p->message)); */ + + /* We don't use p->call_data here right-away since the device + * might already be invalidated at this point */ + + if (!(d = pa_hashmap_get(y->devices, dbus_message_get_path(p->message)))) + return; + + pa_assert(p->call_data == d); + + valid = dbus_message_get_type(r) == DBUS_MESSAGE_TYPE_ERROR ? -1 : 1; + + if (dbus_message_is_method_call(p->message, "org.bluez.Device", "GetProperties")) + d->device_info_valid = valid; + + if (dbus_message_is_error(r, DBUS_ERROR_SERVICE_UNKNOWN)) { + pa_log_debug("Bluetooth daemon is apparently not available."); + remove_all_devices(y); + goto finish2; + } + + if (dbus_message_get_type(r) == DBUS_MESSAGE_TYPE_ERROR) { + + if (!dbus_message_is_error(r, DBUS_ERROR_UNKNOWN_METHOD)) + pa_log("Error from GetProperties reply: %s", dbus_message_get_error_name(r)); + + goto finish; + } + + if (!dbus_message_iter_init(r, &arg_i)) { + pa_log("GetProperties reply has no arguments."); + goto finish; + } + + if (dbus_message_iter_get_arg_type(&arg_i) != DBUS_TYPE_ARRAY) { + pa_log("GetProperties argument is not an array."); + goto finish; + } + + dbus_message_iter_recurse(&arg_i, &element_i); + while (dbus_message_iter_get_arg_type(&element_i) != DBUS_TYPE_INVALID) { + + if (dbus_message_iter_get_arg_type(&element_i) == DBUS_TYPE_DICT_ENTRY) { + DBusMessageIter dict_i; + + dbus_message_iter_recurse(&element_i, &dict_i); + + if (dbus_message_has_interface(p->message, "org.bluez.Device")) { + if (parse_device_property(y, d, &dict_i) < 0) + goto finish; + + } else if (dbus_message_has_interface(p->message, "org.bluez.Audio")) { + if (parse_audio_property(y, &d->audio_state, &dict_i) < 0) + goto finish; + + } else if (dbus_message_has_interface(p->message, "org.bluez.Headset")) { + if (parse_audio_property(y, &d->headset_state, &dict_i) < 0) + goto finish; + + } else if (dbus_message_has_interface(p->message, "org.bluez.AudioSink")) { + if (parse_audio_property(y, &d->audio_sink_state, &dict_i) < 0) + goto finish; + + } else if (dbus_message_has_interface(p->message, "org.bluez.AudioSource")) { + if (parse_audio_property(y, &d->audio_source_state, &dict_i) < 0) + goto finish; + + } else if (dbus_message_has_interface(p->message, "org.bluez.HandsfreeGateway")) { + if (parse_audio_property(y, &d->hfgw_state, &arg_i) < 0) + goto finish; + + } + } + + if (!dbus_message_iter_next(&element_i)) + break; + } + +finish: + run_callback(y, d, FALSE); + +finish2: + dbus_message_unref(r); + + PA_LLIST_REMOVE(pa_dbus_pending, y->pending, p); + pa_dbus_pending_free(p); +} + +static pa_dbus_pending* send_and_add_to_pending(pa_bluetooth_discovery *y, DBusMessage *m, DBusPendingCallNotifyFunction func, void *call_data) { + pa_dbus_pending *p; + DBusPendingCall *call; + + pa_assert(y); + pa_assert(m); + + pa_assert_se(dbus_connection_send_with_reply(pa_dbus_connection_get(y->connection), m, &call, -1)); + + p = pa_dbus_pending_new(pa_dbus_connection_get(y->connection), m, call, y, call_data); + PA_LLIST_PREPEND(pa_dbus_pending, y->pending, p); + dbus_pending_call_set_notify(call, func, p, NULL); + + return p; +} + +#ifdef DBUS_TYPE_UNIX_FD +static void register_endpoint_reply(DBusPendingCall *pending, void *userdata) { + DBusError e; + DBusMessage *r; + pa_dbus_pending *p; + pa_bluetooth_discovery *y; + char *endpoint; + + pa_assert(pending); + + dbus_error_init(&e); + + pa_assert_se(p = userdata); + pa_assert_se(y = p->context_data); + pa_assert_se(endpoint = p->call_data); + pa_assert_se(r = dbus_pending_call_steal_reply(pending)); + + if (dbus_message_is_error(r, DBUS_ERROR_SERVICE_UNKNOWN)) { + pa_log_debug("Bluetooth daemon is apparently not available."); + remove_all_devices(y); + goto finish; + } + + if (dbus_message_is_error(r, PA_BLUETOOTH_ERROR_NOT_SUPPORTED)) { + pa_log_info("Couldn't register endpoint %s, because BlueZ is configured to disable the endpoint type.", endpoint); + goto finish; + } + + if (dbus_message_get_type(r) == DBUS_MESSAGE_TYPE_ERROR) { + pa_log("Error from RegisterEndpoint reply: %s", dbus_message_get_error_name(r)); + goto finish; + } + +finish: + dbus_message_unref(r); + + PA_LLIST_REMOVE(pa_dbus_pending, y->pending, p); + pa_dbus_pending_free(p); + + pa_xfree(endpoint); +} +#endif + +static void list_devices_reply(DBusPendingCall *pending, void *userdata) { + DBusError e; + DBusMessage *r; + char **paths = NULL; + int num = -1; + pa_dbus_pending *p; + pa_bluetooth_discovery *y; + + pa_assert(pending); + + dbus_error_init(&e); + + pa_assert_se(p = userdata); + pa_assert_se(y = p->context_data); + pa_assert_se(r = dbus_pending_call_steal_reply(pending)); + + if (dbus_message_is_error(r, DBUS_ERROR_SERVICE_UNKNOWN)) { + pa_log_debug("Bluetooth daemon is apparently not available."); + remove_all_devices(y); + goto finish; + } + + if (dbus_message_get_type(r) == DBUS_MESSAGE_TYPE_ERROR) { + pa_log("Error from ListDevices reply: %s", dbus_message_get_error_name(r)); + goto finish; + } + + if (!dbus_message_get_args(r, &e, DBUS_TYPE_ARRAY, DBUS_TYPE_OBJECT_PATH, &paths, &num, DBUS_TYPE_INVALID)) { + pa_log("org.bluez.Adapter.ListDevices returned an error: '%s'\n", e.message); + dbus_error_free(&e); + } else { + int i; + + for (i = 0; i < num; ++i) + found_device(y, paths[i]); + } + +finish: + if (paths) + dbus_free_string_array(paths); + + dbus_message_unref(r); + + PA_LLIST_REMOVE(pa_dbus_pending, y->pending, p); + pa_dbus_pending_free(p); +} + +#ifdef DBUS_TYPE_UNIX_FD +static void register_endpoint(pa_bluetooth_discovery *y, const char *path, const char *endpoint, const char *uuid) { + DBusMessage *m; + DBusMessageIter i, d; + uint8_t codec = 0; + + pa_log_debug("Registering %s on adapter %s.", endpoint, path); + + pa_assert_se(m = dbus_message_new_method_call("org.bluez", path, "org.bluez.Media", "RegisterEndpoint")); + + dbus_message_iter_init_append(m, &i); + + dbus_message_iter_append_basic(&i, DBUS_TYPE_OBJECT_PATH, &endpoint); + + dbus_message_iter_open_container(&i, DBUS_TYPE_ARRAY, DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING + DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_VARIANT_AS_STRING DBUS_DICT_ENTRY_END_CHAR_AS_STRING, + &d); + + pa_dbus_append_basic_variant_dict_entry(&d, "UUID", DBUS_TYPE_STRING, &uuid); + + pa_dbus_append_basic_variant_dict_entry(&d, "Codec", DBUS_TYPE_BYTE, &codec); + + if (pa_streq(uuid, HFP_AG_UUID)) { + uint8_t capability = 0; + uint8_t *caps = &capability; + pa_dbus_append_basic_array_variant_dict_entry(&d, "Capabilities", DBUS_TYPE_BYTE, &caps, 1); + } else { + sbc_capabilities_raw_t capabilities; + uint8_t *caps = (uint8_t *) &capabilities; + + capabilities.channel_mode = BT_A2DP_CHANNEL_MODE_MONO | BT_A2DP_CHANNEL_MODE_DUAL_CHANNEL | + BT_A2DP_CHANNEL_MODE_STEREO | BT_A2DP_CHANNEL_MODE_JOINT_STEREO; + capabilities.frequency = BT_SBC_SAMPLING_FREQ_16000 | BT_SBC_SAMPLING_FREQ_32000 | + BT_SBC_SAMPLING_FREQ_44100 | BT_SBC_SAMPLING_FREQ_48000; + capabilities.allocation_method = BT_A2DP_ALLOCATION_SNR | BT_A2DP_ALLOCATION_LOUDNESS; + capabilities.subbands = BT_A2DP_SUBBANDS_4 | BT_A2DP_SUBBANDS_8; + capabilities.block_length = BT_A2DP_BLOCK_LENGTH_4 | BT_A2DP_BLOCK_LENGTH_8 | + BT_A2DP_BLOCK_LENGTH_12 | BT_A2DP_BLOCK_LENGTH_16; + capabilities.min_bitpool = MIN_BITPOOL; + capabilities.max_bitpool = MAX_BITPOOL; + + pa_dbus_append_basic_array_variant_dict_entry(&d, "Capabilities", DBUS_TYPE_BYTE, &caps, sizeof(capabilities)); + } + + dbus_message_iter_close_container(&i, &d); + + send_and_add_to_pending(y, m, register_endpoint_reply, pa_xstrdup(endpoint)); +} +#endif + +static void found_adapter(pa_bluetooth_discovery *y, const char *path) { + DBusMessage *m; + + pa_assert_se(m = dbus_message_new_method_call("org.bluez", path, "org.bluez.Adapter", "ListDevices")); + send_and_add_to_pending(y, m, list_devices_reply, NULL); + +#ifdef DBUS_TYPE_UNIX_FD + register_endpoint(y, path, HFP_AG_ENDPOINT, HFP_AG_UUID); + register_endpoint(y, path, A2DP_SOURCE_ENDPOINT, A2DP_SOURCE_UUID); + register_endpoint(y, path, A2DP_SINK_ENDPOINT, A2DP_SINK_UUID); +#endif +} + +static void list_adapters_reply(DBusPendingCall *pending, void *userdata) { + DBusError e; + DBusMessage *r; + char **paths = NULL; + int num = -1; + pa_dbus_pending *p; + pa_bluetooth_discovery *y; + + pa_assert(pending); + + dbus_error_init(&e); + + pa_assert_se(p = userdata); + pa_assert_se(y = p->context_data); + pa_assert_se(r = dbus_pending_call_steal_reply(pending)); + + if (dbus_message_is_error(r, DBUS_ERROR_SERVICE_UNKNOWN)) { + pa_log_debug("Bluetooth daemon is apparently not available."); + remove_all_devices(y); + goto finish; + } + + if (dbus_message_get_type(r) == DBUS_MESSAGE_TYPE_ERROR) { + pa_log("Error from ListAdapters reply: %s", dbus_message_get_error_name(r)); + goto finish; + } + + if (!dbus_message_get_args(r, &e, DBUS_TYPE_ARRAY, DBUS_TYPE_OBJECT_PATH, &paths, &num, DBUS_TYPE_INVALID)) { + pa_log("org.bluez.Manager.ListAdapters returned an error: %s", e.message); + dbus_error_free(&e); + } else { + int i; + + for (i = 0; i < num; ++i) + found_adapter(y, paths[i]); + } + +finish: + if (paths) + dbus_free_string_array(paths); + + dbus_message_unref(r); + + PA_LLIST_REMOVE(pa_dbus_pending, y->pending, p); + pa_dbus_pending_free(p); +} + +static void list_adapters(pa_bluetooth_discovery *y) { + DBusMessage *m; + pa_assert(y); + + pa_assert_se(m = dbus_message_new_method_call("org.bluez", "/", "org.bluez.Manager", "ListAdapters")); + send_and_add_to_pending(y, m, list_adapters_reply, NULL); +} + +int pa_bluetooth_transport_parse_property(pa_bluetooth_transport *t, DBusMessageIter *i) +{ + const char *key; + DBusMessageIter variant_i; + + if (dbus_message_iter_get_arg_type(i) != DBUS_TYPE_STRING) { + pa_log("Property name not a string."); + return -1; + } + + dbus_message_iter_get_basic(i, &key); + + if (!dbus_message_iter_next(i)) { + pa_log("Property value missing"); + return -1; + } + + if (dbus_message_iter_get_arg_type(i) != DBUS_TYPE_VARIANT) { + pa_log("Property value not a variant."); + return -1; + } + + dbus_message_iter_recurse(i, &variant_i); + + switch (dbus_message_iter_get_arg_type(&variant_i)) { + + case DBUS_TYPE_BOOLEAN: { + + pa_bool_t *value; + dbus_message_iter_get_basic(&variant_i, &value); + + if (pa_streq(key, "NREC")) + t->nrec = value; + + break; + } + } + + return 0; +} + +static DBusHandlerResult filter_cb(DBusConnection *bus, DBusMessage *m, void *userdata) { + DBusError err; + pa_bluetooth_discovery *y; + + pa_assert(bus); + pa_assert(m); + + pa_assert_se(y = userdata); + + dbus_error_init(&err); + + pa_log_debug("dbus: interface=%s, path=%s, member=%s\n", + dbus_message_get_interface(m), + dbus_message_get_path(m), + dbus_message_get_member(m)); + + if (dbus_message_is_signal(m, "org.bluez.Adapter", "DeviceRemoved")) { + const char *path; + pa_bluetooth_device *d; + + if (!dbus_message_get_args(m, &err, DBUS_TYPE_OBJECT_PATH, &path, DBUS_TYPE_INVALID)) { + pa_log("Failed to parse org.bluez.Adapter.DeviceRemoved: %s", err.message); + goto fail; + } + + pa_log_debug("Device %s removed", path); + + if ((d = pa_hashmap_remove(y->devices, path))) { + run_callback(y, d, TRUE); + device_free(d); + } + + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + + } else if (dbus_message_is_signal(m, "org.bluez.Adapter", "DeviceCreated")) { + const char *path; + + if (!dbus_message_get_args(m, &err, DBUS_TYPE_OBJECT_PATH, &path, DBUS_TYPE_INVALID)) { + pa_log("Failed to parse org.bluez.Adapter.DeviceCreated: %s", err.message); + goto fail; + } + + pa_log_debug("Device %s created", path); + + found_device(y, path); + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + + } else if (dbus_message_is_signal(m, "org.bluez.Manager", "AdapterAdded")) { + const char *path; + + if (!dbus_message_get_args(m, &err, DBUS_TYPE_OBJECT_PATH, &path, DBUS_TYPE_INVALID)) { + pa_log("Failed to parse org.bluez.Manager.AdapterAdded: %s", err.message); + goto fail; + } + + pa_log_debug("Adapter %s created", path); + + found_adapter(y, path); + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + + } else if (dbus_message_is_signal(m, "org.bluez.Audio", "PropertyChanged") || + dbus_message_is_signal(m, "org.bluez.Headset", "PropertyChanged") || + dbus_message_is_signal(m, "org.bluez.AudioSink", "PropertyChanged") || + dbus_message_is_signal(m, "org.bluez.AudioSource", "PropertyChanged") || + dbus_message_is_signal(m, "org.bluez.HandsfreeGateway", "PropertyChanged") || + dbus_message_is_signal(m, "org.bluez.Device", "PropertyChanged")) { + + pa_bluetooth_device *d; + + if ((d = pa_hashmap_get(y->devices, dbus_message_get_path(m)))) { + DBusMessageIter arg_i; + + if (!dbus_message_iter_init(m, &arg_i)) { + pa_log("Failed to parse PropertyChanged: %s", err.message); + goto fail; + } + + if (dbus_message_has_interface(m, "org.bluez.Device")) { + if (parse_device_property(y, d, &arg_i) < 0) + goto fail; + + } else if (dbus_message_has_interface(m, "org.bluez.Audio")) { + if (parse_audio_property(y, &d->audio_state, &arg_i) < 0) + goto fail; + + } else if (dbus_message_has_interface(m, "org.bluez.Headset")) { + if (parse_audio_property(y, &d->headset_state, &arg_i) < 0) + goto fail; + + } else if (dbus_message_has_interface(m, "org.bluez.AudioSink")) { + if (parse_audio_property(y, &d->audio_sink_state, &arg_i) < 0) + goto fail; + + } else if (dbus_message_has_interface(m, "org.bluez.AudioSource")) { + if (parse_audio_property(y, &d->audio_source_state, &arg_i) < 0) + goto fail; + + } else if (dbus_message_has_interface(m, "org.bluez.HandsfreeGateway")) { + if (parse_audio_property(y, &d->hfgw_state, &arg_i) < 0) + goto fail; + } + + run_callback(y, d, FALSE); + } + + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + + } else if (dbus_message_is_signal(m, "org.bluez.Device", "DisconnectRequested")) { + pa_bluetooth_device *d; + + if ((d = pa_hashmap_get(y->devices, dbus_message_get_path(m)))) { + /* Device will disconnect in 2 sec */ + d->audio_state = PA_BT_AUDIO_STATE_DISCONNECTED; + d->audio_sink_state = PA_BT_AUDIO_STATE_DISCONNECTED; + d->audio_source_state = PA_BT_AUDIO_STATE_DISCONNECTED; + d->headset_state = PA_BT_AUDIO_STATE_DISCONNECTED; + d->hfgw_state = PA_BT_AUDIO_STATE_DISCONNECTED; + + run_callback(y, d, FALSE); + } + + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + + } else if (dbus_message_is_signal(m, "org.freedesktop.DBus", "NameOwnerChanged")) { + const char *name, *old_owner, *new_owner; + + if (!dbus_message_get_args(m, &err, + DBUS_TYPE_STRING, &name, + DBUS_TYPE_STRING, &old_owner, + DBUS_TYPE_STRING, &new_owner, + DBUS_TYPE_INVALID)) { + pa_log("Failed to parse org.freedesktop.DBus.NameOwnerChanged: %s", err.message); + goto fail; + } + + if (pa_streq(name, "org.bluez")) { + if (old_owner && *old_owner) { + pa_log_debug("Bluetooth daemon disappeared."); + remove_all_devices(y); + } + + if (new_owner && *new_owner) { + pa_log_debug("Bluetooth daemon appeared."); + list_adapters(y); + } + } + + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + } else if (dbus_message_is_signal(m, "org.bluez.MediaTransport", "PropertyChanged")) { + pa_bluetooth_device *d; + pa_bluetooth_transport *t; + void *state = NULL; + DBusMessageIter arg_i; + + while ((d = pa_hashmap_iterate(y->devices, &state, NULL))) + if ((t = pa_hashmap_get(d->transports, dbus_message_get_path(m)))) + break; + + if (!t) + goto fail; + + if (!dbus_message_iter_init(m, &arg_i)) { + pa_log("Failed to parse PropertyChanged: %s", err.message); + goto fail; + } + + if (pa_bluetooth_transport_parse_property(t, &arg_i) < 0) + goto fail; + + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + } + +fail: + dbus_error_free(&err); + + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; +} + +const pa_bluetooth_device* pa_bluetooth_discovery_get_by_address(pa_bluetooth_discovery *y, const char* address) { + pa_bluetooth_device *d; + void *state = NULL; + + pa_assert(y); + pa_assert(PA_REFCNT_VALUE(y) > 0); + pa_assert(address); + + if (!pa_hook_is_firing(&y->hook)) + pa_bluetooth_discovery_sync(y); + + while ((d = pa_hashmap_iterate(y->devices, &state, NULL))) + if (pa_streq(d->address, address)) + return device_is_audio(d) ? d : NULL; + + return NULL; +} + +const pa_bluetooth_device* pa_bluetooth_discovery_get_by_path(pa_bluetooth_discovery *y, const char* path) { + pa_bluetooth_device *d; + + pa_assert(y); + pa_assert(PA_REFCNT_VALUE(y) > 0); + pa_assert(path); + + if (!pa_hook_is_firing(&y->hook)) + pa_bluetooth_discovery_sync(y); + + if ((d = pa_hashmap_get(y->devices, path))) + if (device_is_audio(d)) + return d; + + return NULL; +} + +const pa_bluetooth_transport* pa_bluetooth_discovery_get_transport(pa_bluetooth_discovery *y, const char *path) { + pa_bluetooth_device *d; + pa_bluetooth_transport *t; + void *state = NULL; + + pa_assert(y); + pa_assert(PA_REFCNT_VALUE(y) > 0); + pa_assert(path); + + while ((d = pa_hashmap_iterate(y->devices, &state, NULL))) + if ((t = pa_hashmap_get(d->transports, path))) + return t; + + return NULL; +} + +const pa_bluetooth_transport* pa_bluetooth_device_get_transport(const pa_bluetooth_device *d, enum profile profile) { + pa_bluetooth_transport *t; + void *state = NULL; + + pa_assert(d); + + while ((t = pa_hashmap_iterate(d->transports, &state, NULL))) + if (t->profile == profile) + return t; + + return NULL; +} + +int pa_bluetooth_transport_acquire(const pa_bluetooth_transport *t, const char *accesstype, size_t *imtu, size_t *omtu) { + DBusMessage *m, *r; + DBusError err; + int ret; + uint16_t i, o; + + pa_assert(t); + pa_assert(t->y); + + dbus_error_init(&err); + + pa_assert_se(m = dbus_message_new_method_call("org.bluez", t->path, "org.bluez.MediaTransport", "Acquire")); + pa_assert_se(dbus_message_append_args(m, DBUS_TYPE_STRING, &accesstype, DBUS_TYPE_INVALID)); + r = dbus_connection_send_with_reply_and_block(pa_dbus_connection_get(t->y->connection), m, -1, &err); + + if (dbus_error_is_set(&err) || !r) { + pa_log("Failed to acquire transport fd: %s", err.message); + dbus_error_free(&err); + return -1; + } + +#ifdef DBUS_TYPE_UNIX_FD + if (!dbus_message_get_args(r, &err, DBUS_TYPE_UNIX_FD, &ret, DBUS_TYPE_UINT16, &i, DBUS_TYPE_UINT16, &o, DBUS_TYPE_INVALID)) { + pa_log("Failed to parse org.bluez.MediaTransport.Acquire(): %s", err.message); + ret = -1; + dbus_error_free(&err); + goto fail; + } +#endif + + if (imtu) + *imtu = i; + + if (omtu) + *omtu = o; + +#ifdef DBUS_TYPE_UNIX_FD +fail: +#endif + dbus_message_unref(r); + return ret; +} + +void pa_bluetooth_transport_release(const pa_bluetooth_transport *t, const char *accesstype) { + DBusMessage *m; + DBusError err; + + pa_assert(t); + pa_assert(t->y); + + dbus_error_init(&err); + + pa_assert_se(m = dbus_message_new_method_call("org.bluez", t->path, "org.bluez.MediaTransport", "Release")); + pa_assert_se(dbus_message_append_args(m, DBUS_TYPE_STRING, &accesstype, DBUS_TYPE_INVALID)); + dbus_connection_send_with_reply_and_block(pa_dbus_connection_get(t->y->connection), m, -1, &err); + + if (dbus_error_is_set(&err)) { + pa_log("Failed to release transport %s: %s", t->path, err.message); + dbus_error_free(&err); + } else + pa_log_info("Transport %s released", t->path); +} + +static int setup_dbus(pa_bluetooth_discovery *y) { + DBusError err; + + dbus_error_init(&err); + + y->connection = pa_dbus_bus_get(y->core, DBUS_BUS_SYSTEM, &err); + + if (dbus_error_is_set(&err) || !y->connection) { + pa_log("Failed to get D-Bus connection: %s", err.message); + dbus_error_free(&err); + return -1; + } + + return 0; +} + +#ifdef DBUS_TYPE_UNIX_FD +static pa_bluetooth_transport *transport_new(pa_bluetooth_discovery *y, const char *path, enum profile p, const uint8_t *config, int size) { + pa_bluetooth_transport *t; + + t = pa_xnew0(pa_bluetooth_transport, 1); + t->y = y; + t->path = pa_xstrdup(path); + t->profile = p; + t->config_size = size; + + if (size > 0) { + t->config = pa_xnew(uint8_t, size); + memcpy(t->config, config, size); + } + + return t; +} + +static DBusMessage *endpoint_set_configuration(DBusConnection *conn, DBusMessage *m, void *userdata) { + pa_bluetooth_discovery *y = userdata; + pa_bluetooth_device *d; + pa_bluetooth_transport *t; + const char *path, *dev_path = NULL, *uuid = NULL; + uint8_t *config = NULL; + int size = 0; + pa_bool_t nrec; + enum profile p; + DBusMessageIter args, props; + DBusMessage *r; + + dbus_message_iter_init(m, &args); + + dbus_message_iter_get_basic(&args, &path); + if (!dbus_message_iter_next(&args)) + goto fail; + + dbus_message_iter_recurse(&args, &props); + if (dbus_message_iter_get_arg_type(&props) != DBUS_TYPE_DICT_ENTRY) + goto fail; + + /* Read transport properties */ + while (dbus_message_iter_get_arg_type(&props) == DBUS_TYPE_DICT_ENTRY) { + const char *key; + DBusMessageIter value, entry; + int var; + + dbus_message_iter_recurse(&props, &entry); + dbus_message_iter_get_basic(&entry, &key); + + dbus_message_iter_next(&entry); + dbus_message_iter_recurse(&entry, &value); + + var = dbus_message_iter_get_arg_type(&value); + if (strcasecmp(key, "UUID") == 0) { + if (var != DBUS_TYPE_STRING) + goto fail; + dbus_message_iter_get_basic(&value, &uuid); + } else if (strcasecmp(key, "Device") == 0) { + if (var != DBUS_TYPE_OBJECT_PATH) + goto fail; + dbus_message_iter_get_basic(&value, &dev_path); + } else if (strcasecmp(key, "NREC") == 0) { + if (var != DBUS_TYPE_BOOLEAN) + goto fail; + dbus_message_iter_get_basic(&value, &nrec); + } else if (strcasecmp(key, "Configuration") == 0) { + DBusMessageIter array; + if (var != DBUS_TYPE_ARRAY) + goto fail; + dbus_message_iter_recurse(&value, &array); + dbus_message_iter_get_fixed_array(&array, &config, &size); + } + + dbus_message_iter_next(&props); + } + + d = found_device(y, dev_path); + if (!d) + goto fail; + + if (dbus_message_has_path(m, HFP_AG_ENDPOINT)) + p = PROFILE_HSP; + else if (dbus_message_has_path(m, A2DP_SOURCE_ENDPOINT)) + p = PROFILE_A2DP; + else + p = PROFILE_A2DP_SOURCE; + + t = transport_new(y, path, p, config, size); + if (nrec) + t->nrec = nrec; + pa_hashmap_put(d->transports, t->path, t); + + pa_log_debug("Transport %s profile %d available", t->path, t->profile); + + pa_assert_se(r = dbus_message_new_method_return(m)); + + return r; + +fail: + pa_log("org.bluez.MediaEndpoint.SetConfiguration: invalid arguments"); + pa_assert_se(r = (dbus_message_new_error(m, "org.bluez.MediaEndpoint.Error.InvalidArguments", + "Unable to set configuration"))); + return r; +} + +static DBusMessage *endpoint_clear_configuration(DBusConnection *c, DBusMessage *m, void *userdata) { + pa_bluetooth_discovery *y = userdata; + pa_bluetooth_device *d; + pa_bluetooth_transport *t; + void *state = NULL; + DBusMessage *r; + DBusError e; + const char *path; + + dbus_error_init(&e); + + if (!dbus_message_get_args(m, &e, DBUS_TYPE_OBJECT_PATH, &path, DBUS_TYPE_INVALID)) { + pa_log("org.bluez.MediaEndpoint.ClearConfiguration: %s", e.message); + dbus_error_free(&e); + goto fail; + } + + while ((d = pa_hashmap_iterate(y->devices, &state, NULL))) { + if ((t = pa_hashmap_get(d->transports, path))) { + pa_log_debug("Clearing transport %s profile %d", t->path, t->profile); + pa_hashmap_remove(d->transports, t->path); + transport_free(t); + break; + } + } + + pa_assert_se(r = dbus_message_new_method_return(m)); + + return r; + +fail: + pa_assert_se(r = (dbus_message_new_error(m, "org.bluez.MediaEndpoint.Error.InvalidArguments", + "Unable to clear configuration"))); + return r; +} + +static uint8_t a2dp_default_bitpool(uint8_t freq, uint8_t mode) { + + switch (freq) { + case BT_SBC_SAMPLING_FREQ_16000: + case BT_SBC_SAMPLING_FREQ_32000: + return 53; + + case BT_SBC_SAMPLING_FREQ_44100: + + switch (mode) { + case BT_A2DP_CHANNEL_MODE_MONO: + case BT_A2DP_CHANNEL_MODE_DUAL_CHANNEL: + return 31; + + case BT_A2DP_CHANNEL_MODE_STEREO: + case BT_A2DP_CHANNEL_MODE_JOINT_STEREO: + return 53; + + default: + pa_log_warn("Invalid channel mode %u", mode); + return 53; + } + + case BT_SBC_SAMPLING_FREQ_48000: + + switch (mode) { + case BT_A2DP_CHANNEL_MODE_MONO: + case BT_A2DP_CHANNEL_MODE_DUAL_CHANNEL: + return 29; + + case BT_A2DP_CHANNEL_MODE_STEREO: + case BT_A2DP_CHANNEL_MODE_JOINT_STEREO: + return 51; + + default: + pa_log_warn("Invalid channel mode %u", mode); + return 51; + } + + default: + pa_log_warn("Invalid sampling freq %u", freq); + return 53; + } +} + +static DBusMessage *endpoint_select_configuration(DBusConnection *c, DBusMessage *m, void *userdata) { + pa_bluetooth_discovery *y = userdata; + sbc_capabilities_raw_t *cap, config; + uint8_t *pconf = (uint8_t *) &config; + int i, size; + DBusMessage *r; + DBusError e; + + static const struct { + uint32_t rate; + uint8_t cap; + } freq_table[] = { + { 16000U, BT_SBC_SAMPLING_FREQ_16000 }, + { 32000U, BT_SBC_SAMPLING_FREQ_32000 }, + { 44100U, BT_SBC_SAMPLING_FREQ_44100 }, + { 48000U, BT_SBC_SAMPLING_FREQ_48000 } + }; + + dbus_error_init(&e); + + if (!dbus_message_get_args(m, &e, DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &cap, &size, DBUS_TYPE_INVALID)) { + pa_log("org.bluez.MediaEndpoint.SelectConfiguration: %s", e.message); + dbus_error_free(&e); + goto fail; + } + + if (dbus_message_has_path(m, HFP_AG_ENDPOINT)) + goto done; + + pa_assert(size == sizeof(config)); + + memset(&config, 0, sizeof(config)); + + /* Find the lowest freq that is at least as high as the requested + * sampling rate */ + for (i = 0; (unsigned) i < PA_ELEMENTSOF(freq_table); i++) + if (freq_table[i].rate >= y->core->default_sample_spec.rate && (cap->frequency & freq_table[i].cap)) { + config.frequency = freq_table[i].cap; + break; + } + + if ((unsigned) i == PA_ELEMENTSOF(freq_table)) { + for (--i; i >= 0; i--) { + if (cap->frequency & freq_table[i].cap) { + config.frequency = freq_table[i].cap; + break; + } + } + + if (i < 0) { + pa_log("Not suitable sample rate"); + goto fail; + } + } + + pa_assert((unsigned) i < PA_ELEMENTSOF(freq_table)); + + if (y->core->default_sample_spec.channels <= 1) { + if (cap->channel_mode & BT_A2DP_CHANNEL_MODE_MONO) + config.channel_mode = BT_A2DP_CHANNEL_MODE_MONO; + } + + if (y->core->default_sample_spec.channels >= 2) { + if (cap->channel_mode & BT_A2DP_CHANNEL_MODE_JOINT_STEREO) + config.channel_mode = BT_A2DP_CHANNEL_MODE_JOINT_STEREO; + else if (cap->channel_mode & BT_A2DP_CHANNEL_MODE_STEREO) + config.channel_mode = BT_A2DP_CHANNEL_MODE_STEREO; + else if (cap->channel_mode & BT_A2DP_CHANNEL_MODE_DUAL_CHANNEL) + config.channel_mode = BT_A2DP_CHANNEL_MODE_DUAL_CHANNEL; + else if (cap->channel_mode & BT_A2DP_CHANNEL_MODE_MONO) { + config.channel_mode = BT_A2DP_CHANNEL_MODE_MONO; + } else { + pa_log("No supported channel modes"); + goto fail; + } + } + + if (cap->block_length & BT_A2DP_BLOCK_LENGTH_16) + config.block_length = BT_A2DP_BLOCK_LENGTH_16; + else if (cap->block_length & BT_A2DP_BLOCK_LENGTH_12) + config.block_length = BT_A2DP_BLOCK_LENGTH_12; + else if (cap->block_length & BT_A2DP_BLOCK_LENGTH_8) + config.block_length = BT_A2DP_BLOCK_LENGTH_8; + else if (cap->block_length & BT_A2DP_BLOCK_LENGTH_4) + config.block_length = BT_A2DP_BLOCK_LENGTH_4; + else { + pa_log_error("No supported block lengths"); + goto fail; + } + + if (cap->subbands & BT_A2DP_SUBBANDS_8) + config.subbands = BT_A2DP_SUBBANDS_8; + else if (cap->subbands & BT_A2DP_SUBBANDS_4) + config.subbands = BT_A2DP_SUBBANDS_4; + else { + pa_log_error("No supported subbands"); + goto fail; + } + + if (cap->allocation_method & BT_A2DP_ALLOCATION_LOUDNESS) + config.allocation_method = BT_A2DP_ALLOCATION_LOUDNESS; + else if (cap->allocation_method & BT_A2DP_ALLOCATION_SNR) + config.allocation_method = BT_A2DP_ALLOCATION_SNR; + + config.min_bitpool = (uint8_t) PA_MAX(MIN_BITPOOL, cap->min_bitpool); + config.max_bitpool = (uint8_t) PA_MIN(a2dp_default_bitpool(config.frequency, config.channel_mode), cap->max_bitpool); + +done: + pa_assert_se(r = dbus_message_new_method_return(m)); + + pa_assert_se(dbus_message_append_args( + r, + DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &pconf, size, + DBUS_TYPE_INVALID)); + + return r; + +fail: + pa_assert_se(r = (dbus_message_new_error(m, "org.bluez.MediaEndpoint.Error.InvalidArguments", + "Unable to select configuration"))); + return r; +} + +static DBusHandlerResult endpoint_handler(DBusConnection *c, DBusMessage *m, void *userdata) { + struct pa_bluetooth_discovery *y = userdata; + DBusMessage *r = NULL; + DBusError e; + const char *path; + + pa_assert(y); + + pa_log_debug("dbus: interface=%s, path=%s, member=%s\n", + dbus_message_get_interface(m), + dbus_message_get_path(m), + dbus_message_get_member(m)); + + path = dbus_message_get_path(m); + dbus_error_init(&e); + + if (!pa_streq(path, A2DP_SOURCE_ENDPOINT) && !pa_streq(path, A2DP_SINK_ENDPOINT) && !pa_streq(path, HFP_AG_ENDPOINT)) + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + + if (dbus_message_is_method_call(m, "org.freedesktop.DBus.Introspectable", "Introspect")) { + const char *xml = ENDPOINT_INTROSPECT_XML; + + pa_assert_se(r = dbus_message_new_method_return(m)); + pa_assert_se(dbus_message_append_args( + r, + DBUS_TYPE_STRING, &xml, + DBUS_TYPE_INVALID)); + + } else if (dbus_message_is_method_call(m, "org.bluez.MediaEndpoint", "SetConfiguration")) { + r = endpoint_set_configuration(c, m, userdata); + } else if (dbus_message_is_method_call(m, "org.bluez.MediaEndpoint", "SelectConfiguration")) { + r = endpoint_select_configuration(c, m, userdata); + } else if (dbus_message_is_method_call(m, "org.bluez.MediaEndpoint", "ClearConfiguration")) + r = endpoint_clear_configuration(c, m, userdata); + else + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + + if (r) { + pa_assert_se(dbus_connection_send(pa_dbus_connection_get(y->connection), r, NULL)); + dbus_message_unref(r); + } + + return DBUS_HANDLER_RESULT_HANDLED; +} +#endif /* DBUS_TYPE_UNIX_FD */ + +pa_bluetooth_discovery* pa_bluetooth_discovery_get(pa_core *c) { + DBusError err; + pa_bluetooth_discovery *y; +#ifdef DBUS_TYPE_UNIX_FD + static const DBusObjectPathVTable vtable_endpoint = { + .message_function = endpoint_handler, + }; +#endif + + pa_assert(c); + + dbus_error_init(&err); + + if ((y = pa_shared_get(c, "bluetooth-discovery"))) + return pa_bluetooth_discovery_ref(y); + + y = pa_xnew0(pa_bluetooth_discovery, 1); + PA_REFCNT_INIT(y); + y->core = c; + y->devices = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func); + PA_LLIST_HEAD_INIT(pa_dbus_pending, y->pending); + pa_hook_init(&y->hook, y); + pa_shared_set(c, "bluetooth-discovery", y); + + if (setup_dbus(y) < 0) + goto fail; + + /* dynamic detection of bluetooth audio devices */ + if (!dbus_connection_add_filter(pa_dbus_connection_get(y->connection), filter_cb, y, NULL)) { + pa_log_error("Failed to add filter function"); + goto fail; + } + y->filter_added = TRUE; + + if (pa_dbus_add_matches( + pa_dbus_connection_get(y->connection), &err, + "type='signal',sender='org.freedesktop.DBus',interface='org.freedesktop.DBus',member='NameOwnerChanged',arg0='org.bluez'", + "type='signal',sender='org.bluez',interface='org.bluez.Manager',member='AdapterAdded'", + "type='signal',sender='org.bluez',interface='org.bluez.Adapter',member='DeviceRemoved'", + "type='signal',sender='org.bluez',interface='org.bluez.Adapter',member='DeviceCreated'", + "type='signal',sender='org.bluez',interface='org.bluez.Device',member='PropertyChanged'", + "type='signal',sender='org.bluez',interface='org.bluez.Device',member='DisconnectRequested'", + "type='signal',sender='org.bluez',interface='org.bluez.Audio',member='PropertyChanged'", + "type='signal',sender='org.bluez',interface='org.bluez.Headset',member='PropertyChanged'", + "type='signal',sender='org.bluez',interface='org.bluez.AudioSink',member='PropertyChanged'", + "type='signal',sender='org.bluez',interface='org.bluez.AudioSource',member='PropertyChanged'", + "type='signal',sender='org.bluez',interface='org.bluez.HandsfreeGateway',member='PropertyChanged'", + "type='signal',sender='org.bluez',interface='org.bluez.MediaTransport',member='PropertyChanged'", + NULL) < 0) { + pa_log("Failed to add D-Bus matches: %s", err.message); + goto fail; + } + +#ifdef DBUS_TYPE_UNIX_FD + pa_assert_se(dbus_connection_register_object_path(pa_dbus_connection_get(y->connection), HFP_AG_ENDPOINT, &vtable_endpoint, y)); + pa_assert_se(dbus_connection_register_object_path(pa_dbus_connection_get(y->connection), A2DP_SOURCE_ENDPOINT, &vtable_endpoint, y)); + pa_assert_se(dbus_connection_register_object_path(pa_dbus_connection_get(y->connection), A2DP_SINK_ENDPOINT, &vtable_endpoint, y)); +#endif + + list_adapters(y); + + return y; + +fail: + + if (y) + pa_bluetooth_discovery_unref(y); + + dbus_error_free(&err); + + return NULL; +} + +pa_bluetooth_discovery* pa_bluetooth_discovery_ref(pa_bluetooth_discovery *y) { + pa_assert(y); + pa_assert(PA_REFCNT_VALUE(y) > 0); + + PA_REFCNT_INC(y); + + return y; +} + +void pa_bluetooth_discovery_unref(pa_bluetooth_discovery *y) { + pa_assert(y); + pa_assert(PA_REFCNT_VALUE(y) > 0); + + if (PA_REFCNT_DEC(y) > 0) + return; + + pa_dbus_free_pending_list(&y->pending); + + if (y->devices) { + remove_all_devices(y); + pa_hashmap_free(y->devices, NULL, NULL); + } + + if (y->connection) { +#ifdef DBUS_TYPE_UNIX_FD + dbus_connection_unregister_object_path(pa_dbus_connection_get(y->connection), HFP_AG_ENDPOINT); + dbus_connection_unregister_object_path(pa_dbus_connection_get(y->connection), A2DP_SOURCE_ENDPOINT); + dbus_connection_unregister_object_path(pa_dbus_connection_get(y->connection), A2DP_SINK_ENDPOINT); +#endif + pa_dbus_remove_matches(pa_dbus_connection_get(y->connection), + "type='signal',sender='org.freedesktop.DBus',interface='org.freedesktop.DBus',member='NameOwnerChanged',arg0='org.bluez'", + "type='signal',sender='org.bluez',interface='org.bluez.Manager',member='AdapterAdded'", + "type='signal',sender='org.bluez',interface='org.bluez.Manager',member='AdapterRemoved'", + "type='signal',sender='org.bluez',interface='org.bluez.Adapter',member='DeviceRemoved'", + "type='signal',sender='org.bluez',interface='org.bluez.Adapter',member='DeviceCreated'", + "type='signal',sender='org.bluez',interface='org.bluez.Device',member='PropertyChanged'", + "type='signal',sender='org.bluez',interface='org.bluez.Device',member='DisconnectRequested'", + "type='signal',sender='org.bluez',interface='org.bluez.Audio',member='PropertyChanged'", + "type='signal',sender='org.bluez',interface='org.bluez.Headset',member='PropertyChanged'", + "type='signal',sender='org.bluez',interface='org.bluez.AudioSink',member='PropertyChanged'", + "type='signal',sender='org.bluez',interface='org.bluez.AudioSource',member='PropertyChanged'", + "type='signal',sender='org.bluez',interface='org.bluez.HandsfreeGateway',member='PropertyChanged'", + "type='signal',sender='org.bluez',interface='org.bluez.MediaTransport',member='PropertyChanged'", + NULL); + + if (y->filter_added) + dbus_connection_remove_filter(pa_dbus_connection_get(y->connection), filter_cb, y); + + pa_dbus_connection_unref(y->connection); + } + + pa_hook_done(&y->hook); + + if (y->core) + pa_shared_remove(y->core, "bluetooth-discovery"); + + pa_xfree(y); +} + +void pa_bluetooth_discovery_sync(pa_bluetooth_discovery *y) { + pa_assert(y); + pa_assert(PA_REFCNT_VALUE(y) > 0); + + pa_dbus_sync_pending_list(&y->pending); +} + +pa_hook* pa_bluetooth_discovery_hook(pa_bluetooth_discovery *y) { + pa_assert(y); + pa_assert(PA_REFCNT_VALUE(y) > 0); + + return &y->hook; +} + +const char*pa_bluetooth_get_form_factor(uint32_t class) { + unsigned i; + const char *r; + + static const char * const table[] = { + [1] = "headset", + [2] = "hands-free", + [4] = "microphone", + [5] = "speaker", + [6] = "headphone", + [7] = "portable", + [8] = "car", + [10] = "hifi" + }; + + if (((class >> 8) & 31) != 4) + return NULL; + + if ((i = (class >> 2) & 63) > PA_ELEMENTSOF(table)) + r = NULL; + else + r = table[i]; + + if (!r) + pa_log_debug("Unknown Bluetooth minor device class %u", i); + + return r; +} + +char *pa_bluetooth_cleanup_name(const char *name) { + char *t, *s, *d; + pa_bool_t space = FALSE; + + pa_assert(name); + + while ((*name >= 1 && *name <= 32) || *name >= 127) + name++; + + t = pa_xstrdup(name); + + for (s = d = t; *s; s++) { + + if (*s <= 32 || *s >= 127 || *s == '_') { + space = TRUE; + continue; + } + + if (space) { + *(d++) = ' '; + space = FALSE; + } + + *(d++) = *s; + } + + *d = 0; + + return t; +} + +pa_bool_t pa_bluetooth_uuid_has(pa_bluetooth_uuid *uuids, const char *uuid) { + pa_assert(uuid); + + while (uuids) { + if (strcasecmp(uuids->uuid, uuid) == 0) + return TRUE; + + uuids = uuids->next; + } + + return FALSE; +} diff --git a/src/modules/bluetooth/bluetooth-util.h b/src/modules/bluetooth/bluetooth-util.h new file mode 100644 index 0000000..2054f6e --- /dev/null +++ b/src/modules/bluetooth/bluetooth-util.h @@ -0,0 +1,144 @@ +#ifndef foobluetoothutilhfoo +#define foobluetoothutilhfoo + +/*** + This file is part of PulseAudio. + + Copyright 2008-2009 Joao Paulo Rechi Vita + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation; either version 2.1 of the + License, or (at your option) any later version. + + PulseAudio 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 Lesser General Public + License along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#include + +#include +#include +#include +#include + +#define PA_BLUETOOTH_ERROR_NOT_SUPPORTED "org.bluez.Error.NotSupported" + +/* UUID copied from bluez/audio/device.h */ +#define GENERIC_AUDIO_UUID "00001203-0000-1000-8000-00805f9b34fb" + +#define HSP_HS_UUID "00001108-0000-1000-8000-00805f9b34fb" +#define HSP_AG_UUID "00001112-0000-1000-8000-00805f9b34fb" + +#define HFP_HS_UUID "0000111e-0000-1000-8000-00805f9b34fb" +#define HFP_AG_UUID "0000111f-0000-1000-8000-00805f9b34fb" + +#define ADVANCED_AUDIO_UUID "0000110d-0000-1000-8000-00805f9b34fb" + +#define A2DP_SOURCE_UUID "0000110a-0000-1000-8000-00805f9b34fb" +#define A2DP_SINK_UUID "0000110b-0000-1000-8000-00805f9b34fb" + +typedef struct pa_bluetooth_uuid pa_bluetooth_uuid; +typedef struct pa_bluetooth_device pa_bluetooth_device; +typedef struct pa_bluetooth_discovery pa_bluetooth_discovery; +typedef struct pa_bluetooth_transport pa_bluetooth_transport; + +struct userdata; + +struct pa_bluetooth_uuid { + char *uuid; + PA_LLIST_FIELDS(pa_bluetooth_uuid); +}; + +enum profile { + PROFILE_A2DP, + PROFILE_A2DP_SOURCE, + PROFILE_HSP, + PROFILE_HFGW, + PROFILE_OFF +}; + +struct pa_bluetooth_transport { + pa_bluetooth_discovery *y; + char *path; + enum profile profile; + uint8_t codec; + uint8_t *config; + int config_size; + pa_bool_t nrec; +}; + +/* This enum is shared among Audio, Headset, AudioSink, and AudioSource, although not all values are acceptable in all profiles */ +typedef enum pa_bt_audio_state { + PA_BT_AUDIO_STATE_INVALID = -1, + PA_BT_AUDIO_STATE_DISCONNECTED, + PA_BT_AUDIO_STATE_CONNECTING, + PA_BT_AUDIO_STATE_CONNECTED, + PA_BT_AUDIO_STATE_PLAYING +} pa_bt_audio_state_t; + +struct pa_bluetooth_device { + pa_bool_t dead; + + int device_info_valid; /* 0: no results yet; 1: good results; -1: bad results ... */ + + /* Device information */ + char *name; + char *path; + pa_hashmap *transports; + int paired; + char *alias; + int device_connected; + PA_LLIST_HEAD(pa_bluetooth_uuid, uuids); + char *address; + int class; + int trusted; + + /* Audio state */ + pa_bt_audio_state_t audio_state; + + /* AudioSink state */ + pa_bt_audio_state_t audio_sink_state; + + /* AudioSource state */ + pa_bt_audio_state_t audio_source_state; + + /* Headset state */ + pa_bt_audio_state_t headset_state; + + /* HandsfreeGateway state */ + pa_bt_audio_state_t hfgw_state; +}; + +pa_bluetooth_discovery* pa_bluetooth_discovery_get(pa_core *core); +pa_bluetooth_discovery* pa_bluetooth_discovery_ref(pa_bluetooth_discovery *y); +void pa_bluetooth_discovery_unref(pa_bluetooth_discovery *d); + +void pa_bluetooth_discovery_sync(pa_bluetooth_discovery *d); + +const pa_bluetooth_device* pa_bluetooth_discovery_get_by_path(pa_bluetooth_discovery *d, const char* path); +const pa_bluetooth_device* pa_bluetooth_discovery_get_by_address(pa_bluetooth_discovery *d, const char* address); + +const pa_bluetooth_transport* pa_bluetooth_discovery_get_transport(pa_bluetooth_discovery *y, const char *path); +const pa_bluetooth_transport* pa_bluetooth_device_get_transport(const pa_bluetooth_device *d, enum profile profile); + +int pa_bluetooth_transport_acquire(const pa_bluetooth_transport *t, const char *accesstype, size_t *imtu, size_t *omtu); +void pa_bluetooth_transport_release(const pa_bluetooth_transport *t, const char *accesstype); +int pa_bluetooth_transport_parse_property(pa_bluetooth_transport *t, DBusMessageIter *i); + +pa_hook* pa_bluetooth_discovery_hook(pa_bluetooth_discovery *d); + +const char* pa_bluetooth_get_form_factor(uint32_t class); + +char *pa_bluetooth_cleanup_name(const char *name); + +pa_bool_t pa_bluetooth_uuid_has(pa_bluetooth_uuid *uuids, const char *uuid); + +#endif diff --git a/src/modules/bluetooth/ipc.c b/src/modules/bluetooth/ipc.c new file mode 100644 index 0000000..1bdad78 --- /dev/null +++ b/src/modules/bluetooth/ipc.c @@ -0,0 +1,133 @@ +/* + * + * BlueZ - Bluetooth protocol stack for Linux + * + * Copyright (C) 2004-2010 Marcel Holtmann + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "ipc.h" + +#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) + +/* This table contains the string representation for messages types */ +static const char *strtypes[] = { + "BT_REQUEST", + "BT_RESPONSE", + "BT_INDICATION", + "BT_ERROR", +}; + +/* This table contains the string representation for messages names */ +static const char *strnames[] = { + "BT_GET_CAPABILITIES", + "BT_OPEN", + "BT_SET_CONFIGURATION", + "BT_NEW_STREAM", + "BT_START_STREAM", + "BT_STOP_STREAM", + "BT_SUSPEND_STREAM", + "BT_RESUME_STREAM", + "BT_CONTROL", +}; + +int bt_audio_service_open(void) +{ + int sk; + int err; + struct sockaddr_un addr = { + AF_UNIX, BT_IPC_SOCKET_NAME + }; + + sk = socket(PF_LOCAL, SOCK_STREAM, 0); + if (sk < 0) { + err = errno; + fprintf(stderr, "%s: Cannot open socket: %s (%d)\n", + __FUNCTION__, strerror(err), err); + errno = err; + return -1; + } + + if (connect(sk, (struct sockaddr *) &addr, sizeof(addr)) < 0) { + err = errno; + fprintf(stderr, "%s: connect() failed: %s (%d)\n", + __FUNCTION__, strerror(err), err); + close(sk); + errno = err; + return -1; + } + + return sk; +} + +int bt_audio_service_close(int sk) +{ + return close(sk); +} + +int bt_audio_service_get_data_fd(int sk) +{ + char cmsg_b[CMSG_SPACE(sizeof(int))], m; + int err, ret; + struct iovec iov = { &m, sizeof(m) }; + struct msghdr msgh; + struct cmsghdr *cmsg; + + memset(&msgh, 0, sizeof(msgh)); + msgh.msg_iov = &iov; + msgh.msg_iovlen = 1; + msgh.msg_control = &cmsg_b; + msgh.msg_controllen = CMSG_LEN(sizeof(int)); + + ret = recvmsg(sk, &msgh, 0); + if (ret < 0) { + err = errno; + fprintf(stderr, "%s: Unable to receive fd: %s (%d)\n", + __FUNCTION__, strerror(err), err); + errno = err; + return -1; + } + + /* Receive auxiliary data in msgh */ + for (cmsg = CMSG_FIRSTHDR(&msgh); cmsg != NULL; + cmsg = CMSG_NXTHDR(&msgh, cmsg)) { + if (cmsg->cmsg_level == SOL_SOCKET + && cmsg->cmsg_type == SCM_RIGHTS) { + memcpy(&ret, CMSG_DATA(cmsg), sizeof(int)); + return ret; + } + } + + errno = EINVAL; + return -1; +} + +const char *bt_audio_strtype(uint8_t type) +{ + if (type >= ARRAY_SIZE(strtypes)) + return NULL; + + return strtypes[type]; +} + +const char *bt_audio_strname(uint8_t name) +{ + if (name >= ARRAY_SIZE(strnames)) + return NULL; + + return strnames[name]; +} diff --git a/src/modules/bluetooth/ipc.h b/src/modules/bluetooth/ipc.h new file mode 100644 index 0000000..a21283f --- /dev/null +++ b/src/modules/bluetooth/ipc.h @@ -0,0 +1,388 @@ +/* + * + * BlueZ - Bluetooth protocol stack for Linux + * + * Copyright (C) 2004-2010 Marcel Holtmann + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* + Message sequence chart of streaming sequence for A2DP transport + + Audio daemon User + on snd_pcm_open + <--BT_GET_CAPABILITIES_REQ + + BT_GET_CAPABILITIES_RSP--> + + on snd_pcm_hw_params + <--BT_SETCONFIGURATION_REQ + + BT_SET_CONFIGURATION_RSP--> + + on snd_pcm_prepare + <--BT_START_STREAM_REQ + + + BT_START_STREAM_RSP--> + + BT_NEW_STREAM_IND --> + + < streams data > + .......... + + on snd_pcm_drop/snd_pcm_drain + + <--BT_STOP_STREAM_REQ + + + BT_STOP_STREAM_RSP--> + + on IPC close or appl crash + + + */ + +#ifndef BT_AUDIOCLIENT_H +#define BT_AUDIOCLIENT_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include +#include +#include +#include + +#define BT_SUGGESTED_BUFFER_SIZE 512 +#define BT_IPC_SOCKET_NAME "\0/org/bluez/audio" + +/* Generic message header definition, except for RESPONSE messages */ +typedef struct { + uint8_t type; + uint8_t name; + uint16_t length; +} __attribute__ ((packed)) bt_audio_msg_header_t; + +typedef struct { + bt_audio_msg_header_t h; + uint8_t posix_errno; +} __attribute__ ((packed)) bt_audio_error_t; + +/* Message types */ +#define BT_REQUEST 0 +#define BT_RESPONSE 1 +#define BT_INDICATION 2 +#define BT_ERROR 3 + +/* Messages names */ +#define BT_GET_CAPABILITIES 0 +#define BT_OPEN 1 +#define BT_SET_CONFIGURATION 2 +#define BT_NEW_STREAM 3 +#define BT_START_STREAM 4 +#define BT_STOP_STREAM 5 +#define BT_CLOSE 6 +#define BT_CONTROL 7 +#define BT_DELAY_REPORT 8 + +#define BT_CAPABILITIES_TRANSPORT_A2DP 0 +#define BT_CAPABILITIES_TRANSPORT_SCO 1 +#define BT_CAPABILITIES_TRANSPORT_ANY 2 + +#define BT_CAPABILITIES_ACCESS_MODE_READ 1 +#define BT_CAPABILITIES_ACCESS_MODE_WRITE 2 +#define BT_CAPABILITIES_ACCESS_MODE_READWRITE 3 + +#define BT_FLAG_AUTOCONNECT 1 + +struct bt_get_capabilities_req { + bt_audio_msg_header_t h; + char source[18]; /* Address of the local Device */ + char destination[18];/* Address of the remote Device */ + char object[128]; /* DBus object path */ + uint8_t transport; /* Requested transport */ + uint8_t flags; /* Requested flags */ + uint8_t seid; /* Requested capability configuration */ +} __attribute__ ((packed)); + +/** + * SBC Codec parameters as per A2DP profile 1.0 § 4.3 + */ + +/* A2DP seid are 6 bytes long so HSP/HFP are assigned to 7-8 bits */ +#define BT_A2DP_SEID_RANGE (1 << 6) - 1 + +#define BT_A2DP_SBC_SOURCE 0x00 +#define BT_A2DP_SBC_SINK 0x01 +#define BT_A2DP_MPEG12_SOURCE 0x02 +#define BT_A2DP_MPEG12_SINK 0x03 +#define BT_A2DP_MPEG24_SOURCE 0x04 +#define BT_A2DP_MPEG24_SINK 0x05 +#define BT_A2DP_ATRAC_SOURCE 0x06 +#define BT_A2DP_ATRAC_SINK 0x07 +#define BT_A2DP_UNKNOWN_SOURCE 0x08 +#define BT_A2DP_UNKNOWN_SINK 0x09 + +#define BT_SBC_SAMPLING_FREQ_16000 (1 << 3) +#define BT_SBC_SAMPLING_FREQ_32000 (1 << 2) +#define BT_SBC_SAMPLING_FREQ_44100 (1 << 1) +#define BT_SBC_SAMPLING_FREQ_48000 1 + +#define BT_A2DP_CHANNEL_MODE_MONO (1 << 3) +#define BT_A2DP_CHANNEL_MODE_DUAL_CHANNEL (1 << 2) +#define BT_A2DP_CHANNEL_MODE_STEREO (1 << 1) +#define BT_A2DP_CHANNEL_MODE_JOINT_STEREO 1 + +#define BT_A2DP_BLOCK_LENGTH_4 (1 << 3) +#define BT_A2DP_BLOCK_LENGTH_8 (1 << 2) +#define BT_A2DP_BLOCK_LENGTH_12 (1 << 1) +#define BT_A2DP_BLOCK_LENGTH_16 1 + +#define BT_A2DP_SUBBANDS_4 (1 << 1) +#define BT_A2DP_SUBBANDS_8 1 + +#define BT_A2DP_ALLOCATION_SNR (1 << 1) +#define BT_A2DP_ALLOCATION_LOUDNESS 1 + +#define BT_MPEG_SAMPLING_FREQ_16000 (1 << 5) +#define BT_MPEG_SAMPLING_FREQ_22050 (1 << 4) +#define BT_MPEG_SAMPLING_FREQ_24000 (1 << 3) +#define BT_MPEG_SAMPLING_FREQ_32000 (1 << 2) +#define BT_MPEG_SAMPLING_FREQ_44100 (1 << 1) +#define BT_MPEG_SAMPLING_FREQ_48000 1 + +#define BT_MPEG_LAYER_1 (1 << 2) +#define BT_MPEG_LAYER_2 (1 << 1) +#define BT_MPEG_LAYER_3 1 + +#define BT_HFP_CODEC_PCM 0x00 + +#define BT_PCM_FLAG_NREC 0x01 +#define BT_PCM_FLAG_PCM_ROUTING 0x02 + +#define BT_WRITE_LOCK (1 << 1) +#define BT_READ_LOCK 1 + +typedef struct { + uint8_t seid; + uint8_t transport; + uint8_t type; + uint8_t length; + uint8_t configured; + uint8_t lock; + uint8_t data[0]; +} __attribute__ ((packed)) codec_capabilities_t; + +typedef struct { + codec_capabilities_t capability; + uint8_t channel_mode; + uint8_t frequency; + uint8_t allocation_method; + uint8_t subbands; + uint8_t block_length; + uint8_t min_bitpool; + uint8_t max_bitpool; +} __attribute__ ((packed)) sbc_capabilities_t; + +#if __BYTE_ORDER == __LITTLE_ENDIAN + +typedef struct { + uint8_t channel_mode:4; + uint8_t frequency:4; + uint8_t allocation_method:2; + uint8_t subbands:2; + uint8_t block_length:4; + uint8_t min_bitpool; + uint8_t max_bitpool; +} __attribute__ ((packed)) sbc_capabilities_raw_t; + +#elif __BYTE_ORDER == __BIG_ENDIAN + +typedef struct { + uint8_t frequency:4; + uint8_t channel_mode:4; + uint8_t block_length:4; + uint8_t subbands:2; + uint8_t allocation_method:2; + uint8_t min_bitpool; + uint8_t max_bitpool; +} __attribute__ ((packed)) sbc_capabilities_raw_t; + +#else +#error "Unknown byte order" +#endif + +typedef struct { + codec_capabilities_t capability; + uint8_t channel_mode; + uint8_t crc; + uint8_t layer; + uint8_t frequency; + uint8_t mpf; + uint16_t bitrate; +} __attribute__ ((packed)) mpeg_capabilities_t; + +typedef struct { + codec_capabilities_t capability; + uint8_t flags; + uint16_t sampling_rate; +} __attribute__ ((packed)) pcm_capabilities_t; + +struct bt_get_capabilities_rsp { + bt_audio_msg_header_t h; + char source[18]; /* Address of the local Device */ + char destination[18];/* Address of the remote Device */ + char object[128]; /* DBus object path */ + uint8_t data[0]; /* First codec_capabilities_t */ +} __attribute__ ((packed)); + +struct bt_open_req { + bt_audio_msg_header_t h; + char source[18]; /* Address of the local Device */ + char destination[18];/* Address of the remote Device */ + char object[128]; /* DBus object path */ + uint8_t seid; /* Requested capability configuration to lock */ + uint8_t lock; /* Requested lock */ +} __attribute__ ((packed)); + +struct bt_open_rsp { + bt_audio_msg_header_t h; + char source[18]; /* Address of the local Device */ + char destination[18];/* Address of the remote Device */ + char object[128]; /* DBus object path */ +} __attribute__ ((packed)); + +struct bt_set_configuration_req { + bt_audio_msg_header_t h; + codec_capabilities_t codec; /* Requested codec */ +} __attribute__ ((packed)); + +struct bt_set_configuration_rsp { + bt_audio_msg_header_t h; + uint16_t link_mtu; /* Max length that transport supports */ +} __attribute__ ((packed)); + +#define BT_STREAM_ACCESS_READ 0 +#define BT_STREAM_ACCESS_WRITE 1 +#define BT_STREAM_ACCESS_READWRITE 2 +struct bt_start_stream_req { + bt_audio_msg_header_t h; +} __attribute__ ((packed)); + +struct bt_start_stream_rsp { + bt_audio_msg_header_t h; +} __attribute__ ((packed)); + +/* This message is followed by one byte of data containing the stream data fd + as ancilliary data */ +struct bt_new_stream_ind { + bt_audio_msg_header_t h; +} __attribute__ ((packed)); + +struct bt_stop_stream_req { + bt_audio_msg_header_t h; +} __attribute__ ((packed)); + +struct bt_stop_stream_rsp { + bt_audio_msg_header_t h; +} __attribute__ ((packed)); + +struct bt_close_req { + bt_audio_msg_header_t h; +} __attribute__ ((packed)); + +struct bt_close_rsp { + bt_audio_msg_header_t h; +} __attribute__ ((packed)); + +struct bt_suspend_stream_ind { + bt_audio_msg_header_t h; +} __attribute__ ((packed)); + +struct bt_resume_stream_ind { + bt_audio_msg_header_t h; +} __attribute__ ((packed)); + +#define BT_CONTROL_KEY_POWER 0x40 +#define BT_CONTROL_KEY_VOL_UP 0x41 +#define BT_CONTROL_KEY_VOL_DOWN 0x42 +#define BT_CONTROL_KEY_MUTE 0x43 +#define BT_CONTROL_KEY_PLAY 0x44 +#define BT_CONTROL_KEY_STOP 0x45 +#define BT_CONTROL_KEY_PAUSE 0x46 +#define BT_CONTROL_KEY_RECORD 0x47 +#define BT_CONTROL_KEY_REWIND 0x48 +#define BT_CONTROL_KEY_FAST_FORWARD 0x49 +#define BT_CONTROL_KEY_EJECT 0x4A +#define BT_CONTROL_KEY_FORWARD 0x4B +#define BT_CONTROL_KEY_BACKWARD 0x4C + +struct bt_control_req { + bt_audio_msg_header_t h; + uint8_t mode; /* Control Mode */ + uint8_t key; /* Control Key */ +} __attribute__ ((packed)); + +struct bt_control_rsp { + bt_audio_msg_header_t h; + uint8_t mode; /* Control Mode */ + uint8_t key; /* Control Key */ +} __attribute__ ((packed)); + +struct bt_control_ind { + bt_audio_msg_header_t h; + uint8_t mode; /* Control Mode */ + uint8_t key; /* Control Key */ +} __attribute__ ((packed)); + +struct bt_delay_report_req { + bt_audio_msg_header_t h; + uint16_t delay; +} __attribute__ ((packed)); + +struct bt_delay_report_ind { + bt_audio_msg_header_t h; + uint16_t delay; +} __attribute__ ((packed)); + +/* Function declaration */ + +/* Opens a connection to the audio service: return a socket descriptor */ +int bt_audio_service_open(void); + +/* Closes a connection to the audio service */ +int bt_audio_service_close(int sk); + +/* Receives stream data file descriptor : must be called after a +BT_STREAMFD_IND message is returned */ +int bt_audio_service_get_data_fd(int sk); + +/* Human readable message type string */ +const char *bt_audio_strtype(uint8_t type); + +/* Human readable message name string */ +const char *bt_audio_strname(uint8_t name); + +#ifdef __cplusplus +} +#endif + +#endif /* BT_AUDIOCLIENT_H */ diff --git a/src/modules/bluetooth/module-bluetooth-device.c b/src/modules/bluetooth/module-bluetooth-device.c new file mode 100644 index 0000000..677bf11 --- /dev/null +++ b/src/modules/bluetooth/module-bluetooth-device.c @@ -0,0 +1,3008 @@ +/*** + This file is part of PulseAudio. + + Copyright 2008-2009 Joao Paulo Rechi Vita + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation; either version 2.1 of the + License, or (at your option) any later version. + + PulseAudio 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 Lesser General Public + License along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "module-bluetooth-device-symdef.h" +#include "ipc.h" +#include "sbc.h" +#include "rtp.h" +#include "bluetooth-util.h" + +#define MAX_BITPOOL 64 +#define MIN_BITPOOL 2U + +#define BITPOOL_DEC_LIMIT 32 +#define BITPOOL_DEC_STEP 5 +#define HSP_MAX_GAIN 15 + +PA_MODULE_AUTHOR("Joao Paulo Rechi Vita"); +PA_MODULE_DESCRIPTION("Bluetooth audio sink and source"); +PA_MODULE_VERSION(PACKAGE_VERSION); +PA_MODULE_LOAD_ONCE(FALSE); +PA_MODULE_USAGE( + "name= " + "card_name= " + "card_properties= " + "sink_name= " + "sink_properties= " + "source_name= " + "source_properties= " + "address=
" + "profile= " + "rate= " + "channels= " + "path= " + "auto_connect= " + "sco_sink= " + "sco_source="); + +/* TODO: not close fd when entering suspend mode in a2dp */ + +static const char* const valid_modargs[] = { + "name", + "card_name", + "card_properties", + "sink_name", + "sink_properties", + "source_name", + "source_properties", + "address", + "profile", + "rate", + "channels", + "path", + "auto_connect", + "sco_sink", + "sco_source", + NULL +}; + +struct a2dp_info { + sbc_capabilities_t sbc_capabilities; + sbc_t sbc; /* Codec data */ + pa_bool_t sbc_initialized; /* Keep track if the encoder is initialized */ + size_t codesize, frame_length; /* SBC Codesize, frame_length. We simply cache those values here */ + + void* buffer; /* Codec transfer buffer */ + size_t buffer_size; /* Size of the buffer */ + + uint16_t seq_num; /* Cumulative packet sequence */ + uint8_t min_bitpool; + uint8_t max_bitpool; +}; + +struct hsp_info { + pcm_capabilities_t pcm_capabilities; + pa_sink *sco_sink; + void (*sco_sink_set_volume)(pa_sink *s); + pa_source *sco_source; + void (*sco_source_set_volume)(pa_source *s); + pa_hook_slot *sink_state_changed_slot; + pa_hook_slot *source_state_changed_slot; +}; + +struct userdata { + pa_core *core; + pa_module *module; + + char *address; + char *path; + char *transport; + char *accesstype; + + pa_bluetooth_discovery *discovery; + pa_bool_t auto_connect; + + pa_dbus_connection *connection; + + pa_card *card; + pa_sink *sink; + pa_source *source; + + pa_thread_mq thread_mq; + pa_rtpoll *rtpoll; + pa_rtpoll_item *rtpoll_item; + pa_thread *thread; + + uint64_t read_index, write_index; + pa_usec_t started_at; + pa_smoother *read_smoother; + + pa_memchunk write_memchunk; + + pa_sample_spec sample_spec, requested_sample_spec; + + int service_fd; + int stream_fd; + + size_t link_mtu; + size_t block_size; + + struct a2dp_info a2dp; + struct hsp_info hsp; + + enum profile profile; + + pa_modargs *modargs; + + int stream_write_type; + int service_write_type, service_read_type; + + pa_bool_t filter_added; +}; + +#define FIXED_LATENCY_PLAYBACK_A2DP (25*PA_USEC_PER_MSEC) +#define FIXED_LATENCY_RECORD_A2DP (25*PA_USEC_PER_MSEC) +#define FIXED_LATENCY_PLAYBACK_HSP (125*PA_USEC_PER_MSEC) +#define FIXED_LATENCY_RECORD_HSP (25*PA_USEC_PER_MSEC) + +#define MAX_PLAYBACK_CATCH_UP_USEC (100*PA_USEC_PER_MSEC) + +#define USE_SCO_OVER_PCM(u) (u->profile == PROFILE_HSP && (u->hsp.sco_sink && u->hsp.sco_source)) + +static int init_bt(struct userdata *u); +static int init_profile(struct userdata *u); + +static int service_send(struct userdata *u, const bt_audio_msg_header_t *msg) { + ssize_t r; + + pa_assert(u); + pa_assert(msg); + pa_assert(msg->length > 0); + + if (u->service_fd < 0) { + pa_log_warn("Service not connected"); + return -1; + } + + pa_log_debug("Sending %s -> %s", + pa_strnull(bt_audio_strtype(msg->type)), + pa_strnull(bt_audio_strname(msg->name))); + + if ((r = pa_loop_write(u->service_fd, msg, msg->length, &u->service_write_type)) == (ssize_t) msg->length) + return 0; + + if (r < 0) + pa_log_error("Error sending data to audio service: %s", pa_cstrerror(errno)); + else + pa_log_error("Short write()"); + + return -1; +} + +static int service_recv(struct userdata *u, bt_audio_msg_header_t *msg, size_t room) { + ssize_t r; + + pa_assert(u); + pa_assert(u->service_fd >= 0); + pa_assert(msg); + pa_assert(room >= sizeof(*msg)); + + pa_log_debug("Trying to receive message from audio service..."); + + /* First, read the header */ + if ((r = pa_loop_read(u->service_fd, msg, sizeof(*msg), &u->service_read_type)) != sizeof(*msg)) + goto read_fail; + + if (msg->length < sizeof(*msg)) { + pa_log_error("Invalid message size."); + return -1; + } + + if (msg->length > room) { + pa_log_error("Not enough room."); + return -1; + } + + /* Secondly, read the payload */ + if (msg->length > sizeof(*msg)) { + + size_t remains = msg->length - sizeof(*msg); + + if ((r = pa_loop_read(u->service_fd, + (uint8_t*) msg + sizeof(*msg), + remains, + &u->service_read_type)) != (ssize_t) remains) + goto read_fail; + } + + pa_log_debug("Received %s <- %s", + pa_strnull(bt_audio_strtype(msg->type)), + pa_strnull(bt_audio_strname(msg->name))); + + return 0; + +read_fail: + + if (r < 0) + pa_log_error("Error receiving data from audio service: %s", pa_cstrerror(errno)); + else + pa_log_error("Short read()"); + + return -1; +} + +static ssize_t service_expect(struct userdata*u, bt_audio_msg_header_t *rsp, size_t room, uint8_t expected_name, size_t expected_size) { + int r; + + pa_assert(u); + pa_assert(u->service_fd >= 0); + pa_assert(rsp); + + if ((r = service_recv(u, rsp, room)) < 0) + return r; + + if ((rsp->type != BT_INDICATION && rsp->type != BT_RESPONSE) || + rsp->name != expected_name || + (expected_size > 0 && rsp->length != expected_size)) { + + if (rsp->type == BT_ERROR && rsp->length == sizeof(bt_audio_error_t)) + pa_log_error("Received error condition: %s", pa_cstrerror(((bt_audio_error_t*) rsp)->posix_errno)); + else + pa_log_error("Bogus message %s received while %s was expected", + pa_strnull(bt_audio_strname(rsp->name)), + pa_strnull(bt_audio_strname(expected_name))); + return -1; + } + + return 0; +} + +/* Run from main thread */ +static int parse_caps(struct userdata *u, uint8_t seid, const struct bt_get_capabilities_rsp *rsp) { + uint16_t bytes_left; + const codec_capabilities_t *codec; + + pa_assert(u); + pa_assert(rsp); + + bytes_left = rsp->h.length - sizeof(*rsp); + + if (bytes_left < sizeof(codec_capabilities_t)) { + pa_log_error("Packet too small to store codec information."); + return -1; + } + + codec = (codec_capabilities_t *) rsp->data; /** ALIGNMENT? **/ + + pa_log_debug("Payload size is %lu %lu", (unsigned long) bytes_left, (unsigned long) sizeof(*codec)); + + if (((u->profile == PROFILE_A2DP || u->profile == PROFILE_A2DP_SOURCE) && codec->transport != BT_CAPABILITIES_TRANSPORT_A2DP) || + ((u->profile == PROFILE_HSP || u->profile == PROFILE_HFGW) && codec->transport != BT_CAPABILITIES_TRANSPORT_SCO)) { + pa_log_error("Got capabilities for wrong codec."); + return -1; + } + + if (u->profile == PROFILE_HSP || u->profile == PROFILE_HFGW) { + + if (bytes_left <= 0 || codec->length != sizeof(u->hsp.pcm_capabilities)) + return -1; + + pa_assert(codec->type == BT_HFP_CODEC_PCM); + + if (codec->configured && seid == 0) + return codec->seid; + + memcpy(&u->hsp.pcm_capabilities, codec, sizeof(u->hsp.pcm_capabilities)); + + } else if (u->profile == PROFILE_A2DP) { + + while (bytes_left > 0) { + if ((codec->type == BT_A2DP_SBC_SINK) && !codec->lock) + break; + + bytes_left -= codec->length; + codec = (const codec_capabilities_t*) ((const uint8_t*) codec + codec->length); + } + + if (bytes_left <= 0 || codec->length != sizeof(u->a2dp.sbc_capabilities)) + return -1; + + pa_assert(codec->type == BT_A2DP_SBC_SINK); + + if (codec->configured && seid == 0) + return codec->seid; + + memcpy(&u->a2dp.sbc_capabilities, codec, sizeof(u->a2dp.sbc_capabilities)); + + } else if (u->profile == PROFILE_A2DP_SOURCE) { + + while (bytes_left > 0) { + if ((codec->type == BT_A2DP_SBC_SOURCE) && !codec->lock) + break; + + bytes_left -= codec->length; + codec = (const codec_capabilities_t*) ((const uint8_t*) codec + codec->length); + } + + if (bytes_left <= 0 || codec->length != sizeof(u->a2dp.sbc_capabilities)) + return -1; + + pa_assert(codec->type == BT_A2DP_SBC_SOURCE); + + if (codec->configured && seid == 0) + return codec->seid; + + memcpy(&u->a2dp.sbc_capabilities, codec, sizeof(u->a2dp.sbc_capabilities)); + } + + return 0; +} + +/* Run from main thread */ +static int get_caps(struct userdata *u, uint8_t seid) { + union { + struct bt_get_capabilities_req getcaps_req; + struct bt_get_capabilities_rsp getcaps_rsp; + bt_audio_error_t error; + uint8_t buf[BT_SUGGESTED_BUFFER_SIZE]; + } msg; + int ret; + + pa_assert(u); + + memset(&msg, 0, sizeof(msg)); + msg.getcaps_req.h.type = BT_REQUEST; + msg.getcaps_req.h.name = BT_GET_CAPABILITIES; + msg.getcaps_req.h.length = sizeof(msg.getcaps_req); + msg.getcaps_req.seid = seid; + + pa_strlcpy(msg.getcaps_req.object, u->path, sizeof(msg.getcaps_req.object)); + if (u->profile == PROFILE_A2DP || u->profile == PROFILE_A2DP_SOURCE) + msg.getcaps_req.transport = BT_CAPABILITIES_TRANSPORT_A2DP; + else { + pa_assert(u->profile == PROFILE_HSP || u->profile == PROFILE_HFGW); + msg.getcaps_req.transport = BT_CAPABILITIES_TRANSPORT_SCO; + } + msg.getcaps_req.flags = u->auto_connect ? BT_FLAG_AUTOCONNECT : 0; + + if (service_send(u, &msg.getcaps_req.h) < 0) + return -1; + + if (service_expect(u, &msg.getcaps_rsp.h, sizeof(msg), BT_GET_CAPABILITIES, 0) < 0) + return -1; + + ret = parse_caps(u, seid, &msg.getcaps_rsp); + if (ret <= 0) + return ret; + + return get_caps(u, ret); +} + +/* Run from main thread */ +static uint8_t a2dp_default_bitpool(uint8_t freq, uint8_t mode) { + + switch (freq) { + case BT_SBC_SAMPLING_FREQ_16000: + case BT_SBC_SAMPLING_FREQ_32000: + return 53; + + case BT_SBC_SAMPLING_FREQ_44100: + + switch (mode) { + case BT_A2DP_CHANNEL_MODE_MONO: + case BT_A2DP_CHANNEL_MODE_DUAL_CHANNEL: + return 31; + + case BT_A2DP_CHANNEL_MODE_STEREO: + case BT_A2DP_CHANNEL_MODE_JOINT_STEREO: + return 53; + + default: + pa_log_warn("Invalid channel mode %u", mode); + return 53; + } + + case BT_SBC_SAMPLING_FREQ_48000: + + switch (mode) { + case BT_A2DP_CHANNEL_MODE_MONO: + case BT_A2DP_CHANNEL_MODE_DUAL_CHANNEL: + return 29; + + case BT_A2DP_CHANNEL_MODE_STEREO: + case BT_A2DP_CHANNEL_MODE_JOINT_STEREO: + return 51; + + default: + pa_log_warn("Invalid channel mode %u", mode); + return 51; + } + + default: + pa_log_warn("Invalid sampling freq %u", freq); + return 53; + } +} + +/* Run from main thread */ +static int setup_a2dp(struct userdata *u) { + sbc_capabilities_t *cap; + int i; + + static const struct { + uint32_t rate; + uint8_t cap; + } freq_table[] = { + { 16000U, BT_SBC_SAMPLING_FREQ_16000 }, + { 32000U, BT_SBC_SAMPLING_FREQ_32000 }, + { 44100U, BT_SBC_SAMPLING_FREQ_44100 }, + { 48000U, BT_SBC_SAMPLING_FREQ_48000 } + }; + + pa_assert(u); + pa_assert(u->profile == PROFILE_A2DP || u->profile == PROFILE_A2DP_SOURCE); + + cap = &u->a2dp.sbc_capabilities; + + /* Find the lowest freq that is at least as high as the requested + * sampling rate */ + for (i = 0; (unsigned) i < PA_ELEMENTSOF(freq_table); i++) + if (freq_table[i].rate >= u->sample_spec.rate && (cap->frequency & freq_table[i].cap)) { + u->sample_spec.rate = freq_table[i].rate; + cap->frequency = freq_table[i].cap; + break; + } + + if ((unsigned) i == PA_ELEMENTSOF(freq_table)) { + for (--i; i >= 0; i--) { + if (cap->frequency & freq_table[i].cap) { + u->sample_spec.rate = freq_table[i].rate; + cap->frequency = freq_table[i].cap; + break; + } + } + + if (i < 0) { + pa_log("Not suitable sample rate"); + return -1; + } + } + + pa_assert((unsigned) i < PA_ELEMENTSOF(freq_table)); + + if (cap->capability.configured) + return 0; + + if (u->sample_spec.channels <= 1) { + if (cap->channel_mode & BT_A2DP_CHANNEL_MODE_MONO) { + cap->channel_mode = BT_A2DP_CHANNEL_MODE_MONO; + u->sample_spec.channels = 1; + } else + u->sample_spec.channels = 2; + } + + if (u->sample_spec.channels >= 2) { + u->sample_spec.channels = 2; + + if (cap->channel_mode & BT_A2DP_CHANNEL_MODE_JOINT_STEREO) + cap->channel_mode = BT_A2DP_CHANNEL_MODE_JOINT_STEREO; + else if (cap->channel_mode & BT_A2DP_CHANNEL_MODE_STEREO) + cap->channel_mode = BT_A2DP_CHANNEL_MODE_STEREO; + else if (cap->channel_mode & BT_A2DP_CHANNEL_MODE_DUAL_CHANNEL) + cap->channel_mode = BT_A2DP_CHANNEL_MODE_DUAL_CHANNEL; + else if (cap->channel_mode & BT_A2DP_CHANNEL_MODE_MONO) { + cap->channel_mode = BT_A2DP_CHANNEL_MODE_MONO; + u->sample_spec.channels = 1; + } else { + pa_log("No supported channel modes"); + return -1; + } + } + + if (cap->block_length & BT_A2DP_BLOCK_LENGTH_16) + cap->block_length = BT_A2DP_BLOCK_LENGTH_16; + else if (cap->block_length & BT_A2DP_BLOCK_LENGTH_12) + cap->block_length = BT_A2DP_BLOCK_LENGTH_12; + else if (cap->block_length & BT_A2DP_BLOCK_LENGTH_8) + cap->block_length = BT_A2DP_BLOCK_LENGTH_8; + else if (cap->block_length & BT_A2DP_BLOCK_LENGTH_4) + cap->block_length = BT_A2DP_BLOCK_LENGTH_4; + else { + pa_log_error("No supported block lengths"); + return -1; + } + + if (cap->subbands & BT_A2DP_SUBBANDS_8) + cap->subbands = BT_A2DP_SUBBANDS_8; + else if (cap->subbands & BT_A2DP_SUBBANDS_4) + cap->subbands = BT_A2DP_SUBBANDS_4; + else { + pa_log_error("No supported subbands"); + return -1; + } + + if (cap->allocation_method & BT_A2DP_ALLOCATION_LOUDNESS) + cap->allocation_method = BT_A2DP_ALLOCATION_LOUDNESS; + else if (cap->allocation_method & BT_A2DP_ALLOCATION_SNR) + cap->allocation_method = BT_A2DP_ALLOCATION_SNR; + + cap->min_bitpool = (uint8_t) PA_MAX(MIN_BITPOOL, cap->min_bitpool); + cap->max_bitpool = (uint8_t) PA_MIN(a2dp_default_bitpool(cap->frequency, cap->channel_mode), cap->max_bitpool); + + return 0; +} + +/* Run from main thread */ +static void setup_sbc(struct a2dp_info *a2dp, enum profile p) { + sbc_capabilities_t *active_capabilities; + + pa_assert(a2dp); + + active_capabilities = &a2dp->sbc_capabilities; + + if (a2dp->sbc_initialized) + sbc_reinit(&a2dp->sbc, 0); + else + sbc_init(&a2dp->sbc, 0); + a2dp->sbc_initialized = TRUE; + + switch (active_capabilities->frequency) { + case BT_SBC_SAMPLING_FREQ_16000: + a2dp->sbc.frequency = SBC_FREQ_16000; + break; + case BT_SBC_SAMPLING_FREQ_32000: + a2dp->sbc.frequency = SBC_FREQ_32000; + break; + case BT_SBC_SAMPLING_FREQ_44100: + a2dp->sbc.frequency = SBC_FREQ_44100; + break; + case BT_SBC_SAMPLING_FREQ_48000: + a2dp->sbc.frequency = SBC_FREQ_48000; + break; + default: + pa_assert_not_reached(); + } + + switch (active_capabilities->channel_mode) { + case BT_A2DP_CHANNEL_MODE_MONO: + a2dp->sbc.mode = SBC_MODE_MONO; + break; + case BT_A2DP_CHANNEL_MODE_DUAL_CHANNEL: + a2dp->sbc.mode = SBC_MODE_DUAL_CHANNEL; + break; + case BT_A2DP_CHANNEL_MODE_STEREO: + a2dp->sbc.mode = SBC_MODE_STEREO; + break; + case BT_A2DP_CHANNEL_MODE_JOINT_STEREO: + a2dp->sbc.mode = SBC_MODE_JOINT_STEREO; + break; + default: + pa_assert_not_reached(); + } + + switch (active_capabilities->allocation_method) { + case BT_A2DP_ALLOCATION_SNR: + a2dp->sbc.allocation = SBC_AM_SNR; + break; + case BT_A2DP_ALLOCATION_LOUDNESS: + a2dp->sbc.allocation = SBC_AM_LOUDNESS; + break; + default: + pa_assert_not_reached(); + } + + switch (active_capabilities->subbands) { + case BT_A2DP_SUBBANDS_4: + a2dp->sbc.subbands = SBC_SB_4; + break; + case BT_A2DP_SUBBANDS_8: + a2dp->sbc.subbands = SBC_SB_8; + break; + default: + pa_assert_not_reached(); + } + + switch (active_capabilities->block_length) { + case BT_A2DP_BLOCK_LENGTH_4: + a2dp->sbc.blocks = SBC_BLK_4; + break; + case BT_A2DP_BLOCK_LENGTH_8: + a2dp->sbc.blocks = SBC_BLK_8; + break; + case BT_A2DP_BLOCK_LENGTH_12: + a2dp->sbc.blocks = SBC_BLK_12; + break; + case BT_A2DP_BLOCK_LENGTH_16: + a2dp->sbc.blocks = SBC_BLK_16; + break; + default: + pa_assert_not_reached(); + } + + a2dp->min_bitpool = active_capabilities->min_bitpool; + a2dp->max_bitpool = active_capabilities->max_bitpool; + + /* Set minimum bitpool for source to get the maximum possible block_size */ + a2dp->sbc.bitpool = p == PROFILE_A2DP ? a2dp->max_bitpool : a2dp->min_bitpool; + a2dp->codesize = sbc_get_codesize(&a2dp->sbc); + a2dp->frame_length = sbc_get_frame_length(&a2dp->sbc); +} + +/* Run from main thread */ +static int set_conf(struct userdata *u) { + union { + struct bt_open_req open_req; + struct bt_open_rsp open_rsp; + struct bt_set_configuration_req setconf_req; + struct bt_set_configuration_rsp setconf_rsp; + bt_audio_error_t error; + uint8_t buf[BT_SUGGESTED_BUFFER_SIZE]; + } msg; + + memset(&msg, 0, sizeof(msg)); + msg.open_req.h.type = BT_REQUEST; + msg.open_req.h.name = BT_OPEN; + msg.open_req.h.length = sizeof(msg.open_req); + + pa_strlcpy(msg.open_req.object, u->path, sizeof(msg.open_req.object)); + msg.open_req.seid = (u->profile == PROFILE_A2DP || u->profile == PROFILE_A2DP_SOURCE) ? u->a2dp.sbc_capabilities.capability.seid : BT_A2DP_SEID_RANGE + 1; + msg.open_req.lock = (u->profile == PROFILE_A2DP) ? BT_WRITE_LOCK : BT_READ_LOCK | BT_WRITE_LOCK; + + if (service_send(u, &msg.open_req.h) < 0) + return -1; + + if (service_expect(u, &msg.open_rsp.h, sizeof(msg), BT_OPEN, sizeof(msg.open_rsp)) < 0) + return -1; + + if (u->profile == PROFILE_A2DP || u->profile == PROFILE_A2DP_SOURCE) { + u->sample_spec.format = PA_SAMPLE_S16LE; + + if (setup_a2dp(u) < 0) + return -1; + } else { + pa_assert(u->profile == PROFILE_HSP || u->profile == PROFILE_HFGW); + + u->sample_spec.format = PA_SAMPLE_S16LE; + u->sample_spec.channels = 1; + u->sample_spec.rate = 8000; + } + + memset(&msg, 0, sizeof(msg)); + msg.setconf_req.h.type = BT_REQUEST; + msg.setconf_req.h.name = BT_SET_CONFIGURATION; + msg.setconf_req.h.length = sizeof(msg.setconf_req); + + if (u->profile == PROFILE_A2DP || u->profile == PROFILE_A2DP_SOURCE) { + memcpy(&msg.setconf_req.codec, &u->a2dp.sbc_capabilities, sizeof(u->a2dp.sbc_capabilities)); + } else { + msg.setconf_req.codec.transport = BT_CAPABILITIES_TRANSPORT_SCO; + msg.setconf_req.codec.seid = BT_A2DP_SEID_RANGE + 1; + msg.setconf_req.codec.length = sizeof(pcm_capabilities_t); + } + msg.setconf_req.h.length += msg.setconf_req.codec.length - sizeof(msg.setconf_req.codec); + + if (service_send(u, &msg.setconf_req.h) < 0) + return -1; + + if (service_expect(u, &msg.setconf_rsp.h, sizeof(msg), BT_SET_CONFIGURATION, sizeof(msg.setconf_rsp)) < 0) + return -1; + + u->link_mtu = msg.setconf_rsp.link_mtu; + + /* setup SBC encoder now we agree on parameters */ + if (u->profile == PROFILE_A2DP || u->profile == PROFILE_A2DP_SOURCE) { + setup_sbc(&u->a2dp, u->profile); + + u->block_size = + ((u->link_mtu - sizeof(struct rtp_header) - sizeof(struct rtp_payload)) + / u->a2dp.frame_length + * u->a2dp.codesize); + + pa_log_info("SBC parameters:\n\tallocation=%u\n\tsubbands=%u\n\tblocks=%u\n\tbitpool=%u\n", + u->a2dp.sbc.allocation, u->a2dp.sbc.subbands, u->a2dp.sbc.blocks, u->a2dp.sbc.bitpool); + } else + u->block_size = u->link_mtu; + + return 0; +} + +/* from IO thread */ +static void a2dp_set_bitpool(struct userdata *u, uint8_t bitpool) +{ + struct a2dp_info *a2dp; + + pa_assert(u); + + a2dp = &u->a2dp; + + if (a2dp->sbc.bitpool == bitpool) + return; + + if (bitpool > a2dp->max_bitpool) + bitpool = a2dp->max_bitpool; + else if (bitpool < a2dp->min_bitpool) + bitpool = a2dp->min_bitpool; + + a2dp->sbc.bitpool = bitpool; + + a2dp->codesize = sbc_get_codesize(&a2dp->sbc); + a2dp->frame_length = sbc_get_frame_length(&a2dp->sbc); + + pa_log_debug("Bitpool has changed to %u", a2dp->sbc.bitpool); + + u->block_size = + (u->link_mtu - sizeof(struct rtp_header) - sizeof(struct rtp_payload)) + / a2dp->frame_length * a2dp->codesize; + + pa_sink_set_max_request_within_thread(u->sink, u->block_size); + pa_sink_set_fixed_latency_within_thread(u->sink, + FIXED_LATENCY_PLAYBACK_A2DP + pa_bytes_to_usec(u->block_size, &u->sample_spec)); +} + +/* from IO thread, except in SCO over PCM */ + +static int setup_stream(struct userdata *u) { + struct pollfd *pollfd; + int one; + + pa_make_fd_nonblock(u->stream_fd); + pa_make_socket_low_delay(u->stream_fd); + + one = 1; + if (setsockopt(u->stream_fd, SOL_SOCKET, SO_TIMESTAMP, &one, sizeof(one)) < 0) + pa_log_warn("Failed to enable SO_TIMESTAMP: %s", pa_cstrerror(errno)); + + pa_log_debug("Stream properly set up, we're ready to roll!"); + + if (u->profile == PROFILE_A2DP) + a2dp_set_bitpool(u, u->a2dp.max_bitpool); + + u->rtpoll_item = pa_rtpoll_item_new(u->rtpoll, PA_RTPOLL_NEVER, 1); + pollfd = pa_rtpoll_item_get_pollfd(u->rtpoll_item, NULL); + pollfd->fd = u->stream_fd; + pollfd->events = pollfd->revents = 0; + + u->read_index = u->write_index = 0; + u->started_at = 0; + + if (u->source) + u->read_smoother = pa_smoother_new( + PA_USEC_PER_SEC, + PA_USEC_PER_SEC*2, + TRUE, + TRUE, + 10, + pa_rtclock_now(), + TRUE); + + return 0; +} + +static int start_stream_fd(struct userdata *u) { + union { + bt_audio_msg_header_t rsp; + struct bt_start_stream_req start_req; + struct bt_start_stream_rsp start_rsp; + struct bt_new_stream_ind streamfd_ind; + bt_audio_error_t error; + uint8_t buf[BT_SUGGESTED_BUFFER_SIZE]; + } msg; + + pa_assert(u); + pa_assert(u->rtpoll); + pa_assert(!u->rtpoll_item); + pa_assert(u->stream_fd < 0); + + memset(msg.buf, 0, BT_SUGGESTED_BUFFER_SIZE); + msg.start_req.h.type = BT_REQUEST; + msg.start_req.h.name = BT_START_STREAM; + msg.start_req.h.length = sizeof(msg.start_req); + + if (service_send(u, &msg.start_req.h) < 0) + return -1; + + if (service_expect(u, &msg.rsp, sizeof(msg), BT_START_STREAM, sizeof(msg.start_rsp)) < 0) + return -1; + + if (service_expect(u, &msg.rsp, sizeof(msg), BT_NEW_STREAM, sizeof(msg.streamfd_ind)) < 0) + return -1; + + if ((u->stream_fd = bt_audio_service_get_data_fd(u->service_fd)) < 0) { + pa_log("Failed to get stream fd from audio service."); + return -1; + } + + return setup_stream(u); +} + +/* from IO thread */ +static int stop_stream_fd(struct userdata *u) { + union { + bt_audio_msg_header_t rsp; + struct bt_stop_stream_req start_req; + struct bt_stop_stream_rsp start_rsp; + bt_audio_error_t error; + uint8_t buf[BT_SUGGESTED_BUFFER_SIZE]; + } msg; + int r = 0; + + pa_assert(u); + pa_assert(u->rtpoll); + + if (u->rtpoll_item) { + pa_rtpoll_item_free(u->rtpoll_item); + u->rtpoll_item = NULL; + } + + if (u->stream_fd >= 0) { + memset(msg.buf, 0, BT_SUGGESTED_BUFFER_SIZE); + msg.start_req.h.type = BT_REQUEST; + msg.start_req.h.name = BT_STOP_STREAM; + msg.start_req.h.length = sizeof(msg.start_req); + + if (service_send(u, &msg.start_req.h) < 0 || + service_expect(u, &msg.rsp, sizeof(msg), BT_STOP_STREAM, sizeof(msg.start_rsp)) < 0) + r = -1; + + pa_close(u->stream_fd); + u->stream_fd = -1; + } + + if (u->read_smoother) { + pa_smoother_free(u->read_smoother); + u->read_smoother = NULL; + } + + return r; +} + +static void bt_transport_release(struct userdata *u) { + const char *accesstype = "rw"; + const pa_bluetooth_transport *t; + + /* Ignore if already released */ + if (!u->accesstype) + return; + + pa_log_debug("Releasing transport %s", u->transport); + + t = pa_bluetooth_discovery_get_transport(u->discovery, u->transport); + if (t) + pa_bluetooth_transport_release(t, accesstype); + + pa_xfree(u->accesstype); + u->accesstype = NULL; + + if (u->rtpoll_item) { + pa_rtpoll_item_free(u->rtpoll_item); + u->rtpoll_item = NULL; + } + + if (u->stream_fd >= 0) { + pa_close(u->stream_fd); + u->stream_fd = -1; + } + + if (u->read_smoother) { + pa_smoother_free(u->read_smoother); + u->read_smoother = NULL; + } +} + +static int bt_transport_acquire(struct userdata *u, pa_bool_t start) { + const char *accesstype = "rw"; + const pa_bluetooth_transport *t; + + if (u->accesstype) { + if (start) + goto done; + return 0; + } + + pa_log_debug("Acquiring transport %s", u->transport); + + t = pa_bluetooth_discovery_get_transport(u->discovery, u->transport); + if (!t) { + pa_log("Transport %s no longer available", u->transport); + pa_xfree(u->transport); + u->transport = NULL; + return -1; + } + + /* FIXME: Handle in/out MTU properly when unix socket is not longer supported */ + u->stream_fd = pa_bluetooth_transport_acquire(t, accesstype, NULL, &u->link_mtu); + if (u->stream_fd < 0) + return -1; + + u->accesstype = pa_xstrdup(accesstype); + pa_log_info("Transport %s acquired: fd %d", u->transport, u->stream_fd); + + if (!start) + return 0; + +done: + pa_log_info("Transport %s resuming", u->transport); + return setup_stream(u); +} + +/* Run from IO thread */ +static int sink_process_msg(pa_msgobject *o, int code, void *data, int64_t offset, pa_memchunk *chunk) { + struct userdata *u = PA_SINK(o)->userdata; + pa_bool_t failed = FALSE; + int r; + + pa_assert(u->sink == PA_SINK(o)); + + switch (code) { + + case PA_SINK_MESSAGE_SET_STATE: + + switch ((pa_sink_state_t) PA_PTR_TO_UINT(data)) { + + case PA_SINK_SUSPENDED: + pa_assert(PA_SINK_IS_OPENED(u->sink->thread_info.state)); + + /* Stop the device if the source is suspended as well */ + if (!u->source || u->source->state == PA_SOURCE_SUSPENDED) { + /* We deliberately ignore whether stopping + * actually worked. Since the stream_fd is + * closed it doesn't really matter */ + if (u->transport) + bt_transport_release(u); + else + stop_stream_fd(u); + } + + break; + + case PA_SINK_IDLE: + case PA_SINK_RUNNING: + if (u->sink->thread_info.state != PA_SINK_SUSPENDED) + break; + + /* Resume the device if the source was suspended as well */ + if (!u->source || u->source->state == PA_SOURCE_SUSPENDED) { + if (u->transport) { + if (bt_transport_acquire(u, TRUE) < 0) + failed = TRUE; + } else if (start_stream_fd(u) < 0) + failed = TRUE; + } + break; + + case PA_SINK_UNLINKED: + case PA_SINK_INIT: + case PA_SINK_INVALID_STATE: + ; + } + break; + + case PA_SINK_MESSAGE_GET_LATENCY: { + + if (u->read_smoother) { + pa_usec_t wi, ri; + + ri = pa_smoother_get(u->read_smoother, pa_rtclock_now()); + wi = pa_bytes_to_usec(u->write_index + u->block_size, &u->sample_spec); + + *((pa_usec_t*) data) = wi > ri ? wi - ri : 0; + } else { + pa_usec_t ri, wi; + + ri = pa_rtclock_now() - u->started_at; + wi = pa_bytes_to_usec(u->write_index, &u->sample_spec); + + *((pa_usec_t*) data) = wi > ri ? wi - ri : 0; + } + + *((pa_usec_t*) data) += u->sink->thread_info.fixed_latency; + return 0; + } + } + + r = pa_sink_process_msg(o, code, data, offset, chunk); + + return (r < 0 || !failed) ? r : -1; +} + +/* Run from IO thread */ +static int source_process_msg(pa_msgobject *o, int code, void *data, int64_t offset, pa_memchunk *chunk) { + struct userdata *u = PA_SOURCE(o)->userdata; + pa_bool_t failed = FALSE; + int r; + + pa_assert(u->source == PA_SOURCE(o)); + + switch (code) { + + case PA_SOURCE_MESSAGE_SET_STATE: + + switch ((pa_source_state_t) PA_PTR_TO_UINT(data)) { + + case PA_SOURCE_SUSPENDED: + pa_assert(PA_SOURCE_IS_OPENED(u->source->thread_info.state)); + + /* Stop the device if the sink is suspended as well */ + if (!u->sink || u->sink->state == PA_SINK_SUSPENDED) { + if (u->transport) + bt_transport_release(u); + else + stop_stream_fd(u); + } + + if (u->read_smoother) + pa_smoother_pause(u->read_smoother, pa_rtclock_now()); + break; + + case PA_SOURCE_IDLE: + case PA_SOURCE_RUNNING: + if (u->source->thread_info.state != PA_SOURCE_SUSPENDED) + break; + + /* Resume the device if the sink was suspended as well */ + if (!u->sink || u->sink->thread_info.state == PA_SINK_SUSPENDED) { + if (u->transport) { + if (bt_transport_acquire(u, TRUE) < 0) + failed = TRUE; + } else if (start_stream_fd(u) < 0) + failed = TRUE; + } + /* We don't resume the smoother here. Instead we + * wait until the first packet arrives */ + break; + + case PA_SOURCE_UNLINKED: + case PA_SOURCE_INIT: + case PA_SOURCE_INVALID_STATE: + ; + } + break; + + case PA_SOURCE_MESSAGE_GET_LATENCY: { + pa_usec_t wi, ri; + + if (u->read_smoother) { + wi = pa_smoother_get(u->read_smoother, pa_rtclock_now()); + ri = pa_bytes_to_usec(u->read_index, &u->sample_spec); + + *((pa_usec_t*) data) = (wi > ri ? wi - ri : 0) + u->source->thread_info.fixed_latency; + } else + *((pa_usec_t*) data) = 0; + + return 0; + } + + } + + r = pa_source_process_msg(o, code, data, offset, chunk); + + return (r < 0 || !failed) ? r : -1; +} + +/* Run from IO thread */ +static int hsp_process_render(struct userdata *u) { + int ret = 0; + + pa_assert(u); + pa_assert(u->profile == PROFILE_HSP || u->profile == PROFILE_HFGW); + pa_assert(u->sink); + + /* First, render some data */ + if (!u->write_memchunk.memblock) + pa_sink_render_full(u->sink, u->block_size, &u->write_memchunk); + + pa_assert(u->write_memchunk.length == u->block_size); + + for (;;) { + ssize_t l; + const void *p; + + /* Now write that data to the socket. The socket is of type + * SEQPACKET, and we generated the data of the MTU size, so this + * should just work. */ + + p = (const uint8_t*) pa_memblock_acquire(u->write_memchunk.memblock) + u->write_memchunk.index; + l = pa_write(u->stream_fd, p, u->write_memchunk.length, &u->stream_write_type); + pa_memblock_release(u->write_memchunk.memblock); + + pa_assert(l != 0); + + if (l < 0) { + + if (errno == EINTR) + /* Retry right away if we got interrupted */ + continue; + + else if (errno == EAGAIN) + /* Hmm, apparently the socket was not writable, give up for now */ + break; + + pa_log_error("Failed to write data to SCO socket: %s", pa_cstrerror(errno)); + ret = -1; + break; + } + + pa_assert((size_t) l <= u->write_memchunk.length); + + if ((size_t) l != u->write_memchunk.length) { + pa_log_error("Wrote memory block to socket only partially! %llu written, wanted to write %llu.", + (unsigned long long) l, + (unsigned long long) u->write_memchunk.length); + ret = -1; + break; + } + + u->write_index += (uint64_t) u->write_memchunk.length; + pa_memblock_unref(u->write_memchunk.memblock); + pa_memchunk_reset(&u->write_memchunk); + + ret = 1; + break; + } + + return ret; +} + +/* Run from IO thread */ +static int hsp_process_push(struct userdata *u) { + int ret = 0; + pa_memchunk memchunk; + + pa_assert(u); + pa_assert(u->profile == PROFILE_HSP || u->profile == PROFILE_HFGW); + pa_assert(u->source); + pa_assert(u->read_smoother); + + memchunk.memblock = pa_memblock_new(u->core->mempool, u->block_size); + memchunk.index = memchunk.length = 0; + + for (;;) { + ssize_t l; + void *p; + struct msghdr m; + struct cmsghdr *cm; + uint8_t aux[1024]; + struct iovec iov; + pa_bool_t found_tstamp = FALSE; + pa_usec_t tstamp; + + memset(&m, 0, sizeof(m)); + memset(&aux, 0, sizeof(aux)); + memset(&iov, 0, sizeof(iov)); + + m.msg_iov = &iov; + m.msg_iovlen = 1; + m.msg_control = aux; + m.msg_controllen = sizeof(aux); + + p = pa_memblock_acquire(memchunk.memblock); + iov.iov_base = p; + iov.iov_len = pa_memblock_get_length(memchunk.memblock); + l = recvmsg(u->stream_fd, &m, 0); + pa_memblock_release(memchunk.memblock); + + if (l <= 0) { + + if (l < 0 && errno == EINTR) + /* Retry right away if we got interrupted */ + continue; + + else if (l < 0 && errno == EAGAIN) + /* Hmm, apparently the socket was not readable, give up for now. */ + break; + + pa_log_error("Failed to read data from SCO socket: %s", l < 0 ? pa_cstrerror(errno) : "EOF"); + ret = -1; + break; + } + + pa_assert((size_t) l <= pa_memblock_get_length(memchunk.memblock)); + + memchunk.length = (size_t) l; + u->read_index += (uint64_t) l; + + for (cm = CMSG_FIRSTHDR(&m); cm; cm = CMSG_NXTHDR(&m, cm)) + if (cm->cmsg_level == SOL_SOCKET && cm->cmsg_type == SO_TIMESTAMP) { + struct timeval *tv = (struct timeval*) CMSG_DATA(cm); + pa_rtclock_from_wallclock(tv); + tstamp = pa_timeval_load(tv); + found_tstamp = TRUE; + break; + } + + if (!found_tstamp) { + pa_log_warn("Couldn't find SO_TIMESTAMP data in auxiliary recvmsg() data!"); + tstamp = pa_rtclock_now(); + } + + pa_smoother_put(u->read_smoother, tstamp, pa_bytes_to_usec(u->read_index, &u->sample_spec)); + pa_smoother_resume(u->read_smoother, tstamp, TRUE); + + pa_source_post(u->source, &memchunk); + + ret = 1; + break; + } + + pa_memblock_unref(memchunk.memblock); + + return ret; +} + +/* Run from IO thread */ +static void a2dp_prepare_buffer(struct userdata *u) { + pa_assert(u); + + if (u->a2dp.buffer_size >= u->link_mtu) + return; + + u->a2dp.buffer_size = 2 * u->link_mtu; + pa_xfree(u->a2dp.buffer); + u->a2dp.buffer = pa_xmalloc(u->a2dp.buffer_size); +} + +/* Run from IO thread */ +static int a2dp_process_render(struct userdata *u) { + struct a2dp_info *a2dp; + struct rtp_header *header; + struct rtp_payload *payload; + size_t nbytes; + void *d; + const void *p; + size_t to_write, to_encode; + unsigned frame_count; + int ret = 0; + + pa_assert(u); + pa_assert(u->profile == PROFILE_A2DP); + pa_assert(u->sink); + + /* First, render some data */ + if (!u->write_memchunk.memblock) + pa_sink_render_full(u->sink, u->block_size, &u->write_memchunk); + + pa_assert(u->write_memchunk.length == u->block_size); + + a2dp_prepare_buffer(u); + + a2dp = &u->a2dp; + header = a2dp->buffer; + payload = (struct rtp_payload*) ((uint8_t*) a2dp->buffer + sizeof(*header)); + + frame_count = 0; + + /* Try to create a packet of the full MTU */ + + p = (const uint8_t*) pa_memblock_acquire(u->write_memchunk.memblock) + u->write_memchunk.index; + to_encode = u->write_memchunk.length; + + d = (uint8_t*) a2dp->buffer + sizeof(*header) + sizeof(*payload); + to_write = a2dp->buffer_size - sizeof(*header) - sizeof(*payload); + + while (PA_LIKELY(to_encode > 0 && to_write > 0)) { + ssize_t written; + ssize_t encoded; + + encoded = sbc_encode(&a2dp->sbc, + p, to_encode, + d, to_write, + &written); + + if (PA_UNLIKELY(encoded <= 0)) { + pa_log_error("SBC encoding error (%li)", (long) encoded); + pa_memblock_release(u->write_memchunk.memblock); + return -1; + } + +/* pa_log_debug("SBC: encoded: %lu; written: %lu", (unsigned long) encoded, (unsigned long) written); */ +/* pa_log_debug("SBC: codesize: %lu; frame_length: %lu", (unsigned long) a2dp->codesize, (unsigned long) a2dp->frame_length); */ + + pa_assert_fp((size_t) encoded <= to_encode); + pa_assert_fp((size_t) encoded == a2dp->codesize); + + pa_assert_fp((size_t) written <= to_write); + pa_assert_fp((size_t) written == a2dp->frame_length); + + p = (const uint8_t*) p + encoded; + to_encode -= encoded; + + d = (uint8_t*) d + written; + to_write -= written; + + frame_count++; + } + + pa_memblock_release(u->write_memchunk.memblock); + + pa_assert(to_encode == 0); + + PA_ONCE_BEGIN { + pa_log_debug("Using SBC encoder implementation: %s", pa_strnull(sbc_get_implementation_info(&a2dp->sbc))); + } PA_ONCE_END; + + /* write it to the fifo */ + memset(a2dp->buffer, 0, sizeof(*header) + sizeof(*payload)); + header->v = 2; + header->pt = 1; + header->sequence_number = htons(a2dp->seq_num++); + header->timestamp = htonl(u->write_index / pa_frame_size(&u->sample_spec)); + header->ssrc = htonl(1); + payload->frame_count = frame_count; + + nbytes = (uint8_t*) d - (uint8_t*) a2dp->buffer; + + for (;;) { + ssize_t l; + + l = pa_write(u->stream_fd, a2dp->buffer, nbytes, &u->stream_write_type); + + pa_assert(l != 0); + + if (l < 0) { + + if (errno == EINTR) + /* Retry right away if we got interrupted */ + continue; + + else if (errno == EAGAIN) + /* Hmm, apparently the socket was not writable, give up for now */ + break; + + pa_log_error("Failed to write data to socket: %s", pa_cstrerror(errno)); + ret = -1; + break; + } + + pa_assert((size_t) l <= nbytes); + + if ((size_t) l != nbytes) { + pa_log_warn("Wrote memory block to socket only partially! %llu written, wanted to write %llu.", + (unsigned long long) l, + (unsigned long long) nbytes); + ret = -1; + break; + } + + u->write_index += (uint64_t) u->write_memchunk.length; + pa_memblock_unref(u->write_memchunk.memblock); + pa_memchunk_reset(&u->write_memchunk); + + ret = 1; + + break; + } + + return ret; +} + +static int a2dp_process_push(struct userdata *u) { + int ret = 0; + pa_memchunk memchunk; + + pa_assert(u); + pa_assert(u->profile == PROFILE_A2DP_SOURCE); + pa_assert(u->source); + pa_assert(u->read_smoother); + + memchunk.memblock = pa_memblock_new(u->core->mempool, u->block_size); + memchunk.index = memchunk.length = 0; + + for (;;) { + pa_bool_t found_tstamp = FALSE; + pa_usec_t tstamp; + struct a2dp_info *a2dp; + struct rtp_header *header; + struct rtp_payload *payload; + const void *p; + void *d; + ssize_t l; + size_t to_write, to_decode; + unsigned frame_count; + + a2dp_prepare_buffer(u); + + a2dp = &u->a2dp; + header = a2dp->buffer; + payload = (struct rtp_payload*) ((uint8_t*) a2dp->buffer + sizeof(*header)); + + l = pa_read(u->stream_fd, a2dp->buffer, a2dp->buffer_size, &u->stream_write_type); + + if (l <= 0) { + + if (l < 0 && errno == EINTR) + /* Retry right away if we got interrupted */ + continue; + + else if (l < 0 && errno == EAGAIN) + /* Hmm, apparently the socket was not readable, give up for now. */ + break; + + pa_log_error("Failed to read data from socket: %s", l < 0 ? pa_cstrerror(errno) : "EOF"); + ret = -1; + break; + } + + pa_assert((size_t) l <= a2dp->buffer_size); + + u->read_index += (uint64_t) l; + + /* TODO: get timestamp from rtp */ + if (!found_tstamp) { + /* pa_log_warn("Couldn't find SO_TIMESTAMP data in auxiliary recvmsg() data!"); */ + tstamp = pa_rtclock_now(); + } + + pa_smoother_put(u->read_smoother, tstamp, pa_bytes_to_usec(u->read_index, &u->sample_spec)); + pa_smoother_resume(u->read_smoother, tstamp, TRUE); + + p = (uint8_t*) a2dp->buffer + sizeof(*header) + sizeof(*payload); + to_decode = l - sizeof(*header) - sizeof(*payload); + + d = pa_memblock_acquire(memchunk.memblock); + to_write = memchunk.length = pa_memblock_get_length(memchunk.memblock); + + while (PA_LIKELY(to_decode > 0)) { + size_t written; + ssize_t decoded; + + decoded = sbc_decode(&a2dp->sbc, + p, to_decode, + d, to_write, + &written); + + if (PA_UNLIKELY(decoded <= 0)) { + pa_log_error("SBC decoding error (%li)", (long) decoded); + pa_memblock_release(memchunk.memblock); + pa_memblock_unref(memchunk.memblock); + return -1; + } + +/* pa_log_debug("SBC: decoded: %lu; written: %lu", (unsigned long) decoded, (unsigned long) written); */ +/* pa_log_debug("SBC: frame_length: %lu; codesize: %lu", (unsigned long) a2dp->frame_length, (unsigned long) a2dp->codesize); */ + + /* Reset frame length, it can be changed due to bitpool change */ + a2dp->frame_length = sbc_get_frame_length(&a2dp->sbc); + + pa_assert_fp((size_t) decoded <= to_decode); + pa_assert_fp((size_t) decoded == a2dp->frame_length); + + pa_assert_fp((size_t) written == a2dp->codesize); + + p = (const uint8_t*) p + decoded; + to_decode -= decoded; + + d = (uint8_t*) d + written; + to_write -= written; + + frame_count++; + } + + memchunk.length -= to_write; + + pa_memblock_release(memchunk.memblock); + + pa_source_post(u->source, &memchunk); + + ret = 1; + break; + } + + pa_memblock_unref(memchunk.memblock); + + return ret; +} + +static void a2dp_reduce_bitpool(struct userdata *u) +{ + struct a2dp_info *a2dp; + uint8_t bitpool; + + pa_assert(u); + + a2dp = &u->a2dp; + + /* Check if bitpool is already at its limit */ + if (a2dp->sbc.bitpool <= BITPOOL_DEC_LIMIT) + return; + + bitpool = a2dp->sbc.bitpool - BITPOOL_DEC_STEP; + + if (bitpool < BITPOOL_DEC_LIMIT) + bitpool = BITPOOL_DEC_LIMIT; + + a2dp_set_bitpool(u, bitpool); +} + +static void thread_func(void *userdata) { + struct userdata *u = userdata; + unsigned do_write = 0; + pa_bool_t writable = FALSE; + + pa_assert(u); + + pa_log_debug("IO Thread starting up"); + + if (u->core->realtime_scheduling) + pa_make_realtime(u->core->realtime_priority); + + pa_thread_mq_install(&u->thread_mq); + + if (u->transport) { + if (bt_transport_acquire(u, TRUE) < 0) + goto fail; + } else if (start_stream_fd(u) < 0) + goto fail; + + for (;;) { + struct pollfd *pollfd; + int ret; + pa_bool_t disable_timer = TRUE; + + pollfd = u->rtpoll_item ? pa_rtpoll_item_get_pollfd(u->rtpoll_item, NULL) : NULL; + + if (u->source && PA_SOURCE_IS_LINKED(u->source->thread_info.state)) { + + /* We should send two blocks to the device before we expect + * a response. */ + + if (u->write_index == 0 && u->read_index <= 0) + do_write = 2; + + if (pollfd && (pollfd->revents & POLLIN)) { + int n_read; + + if (u->profile == PROFILE_HSP || u->profile == PROFILE_HFGW) + n_read = hsp_process_push(u); + else + n_read = a2dp_process_push(u); + + if (n_read < 0) + goto fail; + + /* We just read something, so we are supposed to write something, too */ + do_write += n_read; + } + } + + if (u->sink && PA_SINK_IS_LINKED(u->sink->thread_info.state)) { + + if (u->sink->thread_info.rewind_requested) + pa_sink_process_rewind(u->sink, 0); + + if (pollfd) { + if (pollfd->revents & POLLOUT) + writable = TRUE; + + if ((!u->source || !PA_SOURCE_IS_LINKED(u->source->thread_info.state)) && do_write <= 0 && writable) { + pa_usec_t time_passed; + pa_usec_t audio_sent; + + /* Hmm, there is no input stream we could synchronize + * to. So let's do things by time */ + + time_passed = pa_rtclock_now() - u->started_at; + audio_sent = pa_bytes_to_usec(u->write_index, &u->sample_spec); + + if (audio_sent <= time_passed) { + pa_usec_t audio_to_send = time_passed - audio_sent; + + /* Never try to catch up for more than 100ms */ + if (u->write_index > 0 && audio_to_send > MAX_PLAYBACK_CATCH_UP_USEC) { + pa_usec_t skip_usec; + uint64_t skip_bytes; + + skip_usec = audio_to_send - MAX_PLAYBACK_CATCH_UP_USEC; + skip_bytes = pa_usec_to_bytes(skip_usec, &u->sample_spec); + + if (skip_bytes > 0) { + pa_memchunk tmp; + + pa_log_warn("Skipping %llu us (= %llu bytes) in audio stream", + (unsigned long long) skip_usec, + (unsigned long long) skip_bytes); + + pa_sink_render_full(u->sink, skip_bytes, &tmp); + pa_memblock_unref(tmp.memblock); + u->write_index += skip_bytes; + + if (u->profile == PROFILE_A2DP) + a2dp_reduce_bitpool(u); + } + } + + do_write = 1; + } + } + + if (writable && do_write > 0) { + int n_written; + + if (u->write_index <= 0) + u->started_at = pa_rtclock_now(); + + if (u->profile == PROFILE_A2DP) { + if ((n_written = a2dp_process_render(u)) < 0) + goto fail; + } else { + if ((n_written = hsp_process_render(u)) < 0) + goto fail; + } + + if (n_written == 0) + pa_log("Broken kernel: we got EAGAIN on write() after POLLOUT!"); + + do_write -= n_written; + writable = FALSE; + } + + if ((!u->source || !PA_SOURCE_IS_LINKED(u->source->thread_info.state)) && do_write <= 0) { + pa_usec_t sleep_for; + pa_usec_t time_passed, next_write_at; + + if (writable) { + /* Hmm, there is no input stream we could synchronize + * to. So let's estimate when we need to wake up the latest */ + time_passed = pa_rtclock_now() - u->started_at; + next_write_at = pa_bytes_to_usec(u->write_index, &u->sample_spec); + sleep_for = time_passed < next_write_at ? next_write_at - time_passed : 0; + /* pa_log("Sleeping for %lu; time passed %lu, next write at %lu", (unsigned long) sleep_for, (unsigned long) time_passed, (unsigned long)next_write_at); */ + } else + /* drop stream every 500 ms */ + sleep_for = PA_USEC_PER_MSEC * 500; + + pa_rtpoll_set_timer_relative(u->rtpoll, sleep_for); + disable_timer = FALSE; + } + } + } + + if (disable_timer) + pa_rtpoll_set_timer_disabled(u->rtpoll); + + /* Hmm, nothing to do. Let's sleep */ + if (pollfd) + pollfd->events = (short) (((u->sink && PA_SINK_IS_LINKED(u->sink->thread_info.state) && !writable) ? POLLOUT : 0) | + (u->source && PA_SOURCE_IS_LINKED(u->source->thread_info.state) ? POLLIN : 0)); + + if ((ret = pa_rtpoll_run(u->rtpoll, TRUE)) < 0) + goto fail; + + if (ret == 0) + goto finish; + + pollfd = u->rtpoll_item ? pa_rtpoll_item_get_pollfd(u->rtpoll_item, NULL) : NULL; + + if (pollfd && (pollfd->revents & ~(POLLOUT|POLLIN))) { + pa_log_info("FD error: %s%s%s%s", + pollfd->revents & POLLERR ? "POLLERR " :"", + pollfd->revents & POLLHUP ? "POLLHUP " :"", + pollfd->revents & POLLPRI ? "POLLPRI " :"", + pollfd->revents & POLLNVAL ? "POLLNVAL " :""); + goto fail; + } + } + +fail: + /* If this was no regular exit from the loop we have to continue processing messages until we receive PA_MESSAGE_SHUTDOWN */ + pa_log_debug("IO thread failed"); + pa_asyncmsgq_post(u->thread_mq.outq, PA_MSGOBJECT(u->core), PA_CORE_MESSAGE_UNLOAD_MODULE, u->module, 0, NULL, NULL); + pa_asyncmsgq_wait_for(u->thread_mq.inq, PA_MESSAGE_SHUTDOWN); + +finish: + pa_log_debug("IO thread shutting down"); +} + +/* Run from main thread */ +static DBusHandlerResult filter_cb(DBusConnection *bus, DBusMessage *m, void *userdata) { + DBusError err; + struct userdata *u; + + pa_assert(bus); + pa_assert(m); + pa_assert_se(u = userdata); + + dbus_error_init(&err); + + pa_log_debug("dbus: interface=%s, path=%s, member=%s\n", + dbus_message_get_interface(m), + dbus_message_get_path(m), + dbus_message_get_member(m)); + + if (!dbus_message_has_path(m, u->path) && !dbus_message_has_path(m, u->transport)) + goto fail; + + if (dbus_message_is_signal(m, "org.bluez.Headset", "SpeakerGainChanged") || + dbus_message_is_signal(m, "org.bluez.Headset", "MicrophoneGainChanged")) { + + dbus_uint16_t gain; + pa_cvolume v; + + if (!dbus_message_get_args(m, &err, DBUS_TYPE_UINT16, &gain, DBUS_TYPE_INVALID) || gain > HSP_MAX_GAIN) { + pa_log("Failed to parse org.bluez.Headset.{Speaker|Microphone}GainChanged: %s", err.message); + goto fail; + } + + if (u->profile == PROFILE_HSP) { + if (u->sink && dbus_message_is_signal(m, "org.bluez.Headset", "SpeakerGainChanged")) { + pa_volume_t volume = (pa_volume_t) (gain * PA_VOLUME_NORM / HSP_MAX_GAIN); + + /* increment volume by one to correct rounding errors */ + if (volume < PA_VOLUME_NORM) + volume++; + + pa_cvolume_set(&v, u->sample_spec.channels, volume); + pa_sink_volume_changed(u->sink, &v); + + } else if (u->source && dbus_message_is_signal(m, "org.bluez.Headset", "MicrophoneGainChanged")) { + pa_volume_t volume = (pa_volume_t) (gain * PA_VOLUME_NORM / HSP_MAX_GAIN); + + /* increment volume by one to correct rounding errors */ + if (volume < PA_VOLUME_NORM) + volume++; + + pa_cvolume_set(&v, u->sample_spec.channels, volume); + pa_source_volume_changed(u->source, &v); + } + } + } else if (dbus_message_is_signal(m, "org.bluez.MediaTransport", "PropertyChanged")) { + DBusMessageIter arg_i; + pa_bluetooth_transport *t; + pa_bool_t nrec; + + t = (pa_bluetooth_transport *) pa_bluetooth_discovery_get_transport(u->discovery, u->transport); + pa_assert(t); + + if (!dbus_message_iter_init(m, &arg_i)) { + pa_log("Failed to parse PropertyChanged: %s", err.message); + goto fail; + } + + nrec = t->nrec; + + if (pa_bluetooth_transport_parse_property(t, &arg_i) < 0) + goto fail; + + if (nrec != t->nrec) { + pa_log_debug("dbus: property 'NREC' changed to value '%s'", t->nrec ? "True" : "False"); + pa_proplist_sets(u->source->proplist, "bluetooth.nrec", t->nrec ? "1" : "0"); + } + }else if (dbus_message_is_signal(m, "org.bluez.Headset", "Playing")) { + int ret=0; + ret=pa_sink_suspend(u->sink,TRUE,PA_SUSPEND_IDLE); + pa_log_debug("ret=%d",ret); + } else if (dbus_message_is_signal(m, "org.bluez.Headset", "Stopped")) { + int ret=0; + ret=pa_sink_suspend(u->sink,FALSE,PA_SUSPEND_IDLE); + pa_log_debug("ret=%d",ret); + } + +fail: + dbus_error_free(&err); + + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; +} + +/* Run from main thread */ +static void sink_set_volume_cb(pa_sink *s) { + DBusMessage *m; + dbus_uint16_t gain; + pa_volume_t volume; + struct userdata *u; + char *k; + + pa_assert(s); + pa_assert(s->core); + + k = pa_sprintf_malloc("bluetooth-device@%p", (void*) s); + u = pa_shared_get(s->core, k); + pa_xfree(k); + + pa_assert(u); + pa_assert(u->sink == s); + pa_assert(u->profile == PROFILE_HSP); + + gain = (pa_cvolume_max(&s->real_volume) * HSP_MAX_GAIN) / PA_VOLUME_NORM; + + if (gain > HSP_MAX_GAIN) + gain = HSP_MAX_GAIN; + + volume = (pa_volume_t) (gain * PA_VOLUME_NORM / HSP_MAX_GAIN); + + /* increment volume by one to correct rounding errors */ + if (volume < PA_VOLUME_NORM) + volume++; + + pa_cvolume_set(&s->real_volume, u->sample_spec.channels, volume); + + pa_assert_se(m = dbus_message_new_method_call("org.bluez", u->path, "org.bluez.Headset", "SetSpeakerGain")); + pa_assert_se(dbus_message_append_args(m, DBUS_TYPE_UINT16, &gain, DBUS_TYPE_INVALID)); + pa_assert_se(dbus_connection_send(pa_dbus_connection_get(u->connection), m, NULL)); + dbus_message_unref(m); +} + +/* Run from main thread */ +static void source_set_volume_cb(pa_source *s) { + DBusMessage *m; + dbus_uint16_t gain; + pa_volume_t volume; + struct userdata *u; + char *k; + + pa_assert(s); + pa_assert(s->core); + + k = pa_sprintf_malloc("bluetooth-device@%p", (void*) s); + u = pa_shared_get(s->core, k); + pa_xfree(k); + + pa_assert(u); + pa_assert(u->source == s); + pa_assert(u->profile == PROFILE_HSP); + + gain = (pa_cvolume_max(&s->volume) * HSP_MAX_GAIN) / PA_VOLUME_NORM; + + if (gain > HSP_MAX_GAIN) + gain = HSP_MAX_GAIN; + + volume = (pa_volume_t) (gain * PA_VOLUME_NORM / HSP_MAX_GAIN); + + /* increment volume by one to correct rounding errors */ + if (volume < PA_VOLUME_NORM) + volume++; + + pa_cvolume_set(&s->volume, u->sample_spec.channels, volume); + + pa_assert_se(m = dbus_message_new_method_call("org.bluez", u->path, "org.bluez.Headset", "SetMicrophoneGain")); + pa_assert_se(dbus_message_append_args(m, DBUS_TYPE_UINT16, &gain, DBUS_TYPE_INVALID)); + pa_assert_se(dbus_connection_send(pa_dbus_connection_get(u->connection), m, NULL)); + dbus_message_unref(m); +} + +/* Run from main thread */ +static char *get_name(const char *type, pa_modargs *ma, const char *device_id, pa_bool_t *namereg_fail) { + char *t; + const char *n; + + pa_assert(type); + pa_assert(ma); + pa_assert(device_id); + pa_assert(namereg_fail); + + t = pa_sprintf_malloc("%s_name", type); + n = pa_modargs_get_value(ma, t, NULL); + pa_xfree(t); + + if (n) { + *namereg_fail = TRUE; + return pa_xstrdup(n); + } + + if ((n = pa_modargs_get_value(ma, "name", NULL))) + *namereg_fail = TRUE; + else { + n = device_id; + *namereg_fail = FALSE; + } + + return pa_sprintf_malloc("bluez_%s.%s", type, n); +} + +static int sco_over_pcm_state_update(struct userdata *u) { + pa_assert(u); + pa_assert(USE_SCO_OVER_PCM(u)); + + if (PA_SINK_IS_OPENED(pa_sink_get_state(u->hsp.sco_sink)) || + PA_SOURCE_IS_OPENED(pa_source_get_state(u->hsp.sco_source))) { + + if (u->service_fd >= 0 && u->stream_fd >= 0) + return 0; + + init_bt(u); + + pa_log_debug("Resuming SCO over PCM"); + if (init_profile(u) < 0) { + pa_log("Can't resume SCO over PCM"); + return -1; + } + + if (u->transport) + return bt_transport_acquire(u, TRUE); + else + return start_stream_fd(u); + + } else { + if (u->service_fd < 0 && u->stream_fd < 0) + return 0; + + pa_log_debug("Closing SCO over PCM"); + + if (u->transport) + bt_transport_release(u); + else if (u->stream_fd >= 0) + stop_stream_fd(u); + + if (u->service_fd >= 0) { + pa_close(u->service_fd); + u->service_fd = -1; + } + + return 0; + } +} + +static pa_hook_result_t sink_state_changed_cb(pa_core *c, pa_sink *s, struct userdata *u) { + pa_assert(c); + pa_sink_assert_ref(s); + pa_assert(u); + + if (s != u->hsp.sco_sink) + return PA_HOOK_OK; + + sco_over_pcm_state_update(u); + + return PA_HOOK_OK; +} + +static pa_hook_result_t source_state_changed_cb(pa_core *c, pa_source *s, struct userdata *u) { + pa_assert(c); + pa_source_assert_ref(s); + pa_assert(u); + + if (s != u->hsp.sco_source) + return PA_HOOK_OK; + + sco_over_pcm_state_update(u); + + return PA_HOOK_OK; +} + +/* Run from main thread */ +static int add_sink(struct userdata *u) { + char *k; + + if (USE_SCO_OVER_PCM(u)) { + pa_proplist *p; + + u->sink = u->hsp.sco_sink; + p = pa_proplist_new(); + pa_proplist_sets(p, "bluetooth.protocol", "sco"); + pa_proplist_update(u->sink->proplist, PA_UPDATE_MERGE, p); + pa_proplist_free(p); + + if (!u->hsp.sink_state_changed_slot) + u->hsp.sink_state_changed_slot = pa_hook_connect(&u->core->hooks[PA_CORE_HOOK_SINK_STATE_CHANGED], PA_HOOK_NORMAL, (pa_hook_cb_t) sink_state_changed_cb, u); + + } else { + pa_sink_new_data data; + pa_bool_t b; + + pa_sink_new_data_init(&data); + data.driver = __FILE__; + data.module = u->module; + pa_sink_new_data_set_sample_spec(&data, &u->sample_spec); + pa_proplist_sets(data.proplist, "bluetooth.protocol", u->profile == PROFILE_A2DP ? "a2dp" : "sco"); + if (u->profile == PROFILE_HSP) + pa_proplist_sets(data.proplist, PA_PROP_DEVICE_INTENDED_ROLES, "phone"); + data.card = u->card; + data.name = get_name("sink", u->modargs, u->address, &b); + data.namereg_fail = b; + + if (pa_modargs_get_proplist(u->modargs, "sink_properties", data.proplist, PA_UPDATE_REPLACE) < 0) { + pa_log("Invalid properties"); + pa_sink_new_data_done(&data); + return -1; + } + + u->sink = pa_sink_new(u->core, &data, PA_SINK_HARDWARE|PA_SINK_LATENCY | (u->profile == PROFILE_HSP ? PA_SINK_HW_VOLUME_CTRL : 0)); + pa_sink_new_data_done(&data); + + if (!u->sink) { + pa_log_error("Failed to create sink"); + return -1; + } + + u->sink->userdata = u; + u->sink->parent.process_msg = sink_process_msg; + + pa_sink_set_max_request(u->sink, u->block_size); + pa_sink_set_fixed_latency(u->sink, + (u->profile == PROFILE_A2DP ? FIXED_LATENCY_PLAYBACK_A2DP : FIXED_LATENCY_PLAYBACK_HSP) + + pa_bytes_to_usec(u->block_size, &u->sample_spec)); + } + + if (u->profile == PROFILE_HSP) { + u->sink->set_volume = sink_set_volume_cb; + u->sink->n_volume_steps = 16; + + k = pa_sprintf_malloc("bluetooth-device@%p", (void*) u->sink); + pa_shared_set(u->core, k, u); + pa_xfree(k); + } + + return 0; +} + +/* Run from main thread */ +static int add_source(struct userdata *u) { + char *k; + + if (USE_SCO_OVER_PCM(u)) { + u->source = u->hsp.sco_source; + pa_proplist_sets(u->source->proplist, "bluetooth.protocol", "hsp"); + + if (!u->hsp.source_state_changed_slot) + u->hsp.source_state_changed_slot = pa_hook_connect(&u->core->hooks[PA_CORE_HOOK_SOURCE_STATE_CHANGED], PA_HOOK_NORMAL, (pa_hook_cb_t) source_state_changed_cb, u); + + } else { + pa_source_new_data data; + pa_bool_t b; + + pa_source_new_data_init(&data); + data.driver = __FILE__; + data.module = u->module; + pa_source_new_data_set_sample_spec(&data, &u->sample_spec); + pa_proplist_sets(data.proplist, "bluetooth.protocol", u->profile == PROFILE_A2DP_SOURCE ? "a2dp_source" : "hsp"); + if ((u->profile == PROFILE_HSP) || (u->profile == PROFILE_HFGW)) + pa_proplist_sets(data.proplist, PA_PROP_DEVICE_INTENDED_ROLES, "phone"); + + data.card = u->card; + data.name = get_name("source", u->modargs, u->address, &b); + data.namereg_fail = b; + + if (pa_modargs_get_proplist(u->modargs, "source_properties", data.proplist, PA_UPDATE_REPLACE) < 0) { + pa_log("Invalid properties"); + pa_source_new_data_done(&data); + return -1; + } + + u->source = pa_source_new(u->core, &data, PA_SOURCE_HARDWARE|PA_SOURCE_LATENCY | (u->profile == PROFILE_HSP ? PA_SOURCE_HW_VOLUME_CTRL : 0)); + pa_source_new_data_done(&data); + + if (!u->source) { + pa_log_error("Failed to create source"); + return -1; + } + + u->source->userdata = u; + u->source->parent.process_msg = source_process_msg; + + pa_source_set_fixed_latency(u->source, + (u->profile == PROFILE_A2DP_SOURCE ? FIXED_LATENCY_RECORD_A2DP : FIXED_LATENCY_RECORD_HSP) + + pa_bytes_to_usec(u->block_size, &u->sample_spec)); + } + + if ((u->profile == PROFILE_HSP) || (u->profile == PROFILE_HFGW)) { + if (u->transport) { + const pa_bluetooth_transport *t; + t = pa_bluetooth_discovery_get_transport(u->discovery, u->transport); + pa_assert(t); + pa_proplist_sets(u->source->proplist, "bluetooth.nrec", t->nrec ? "1" : "0"); + } else + pa_proplist_sets(u->source->proplist, "bluetooth.nrec", (u->hsp.pcm_capabilities.flags & BT_PCM_FLAG_NREC) ? "1" : "0"); + } + + if (u->profile == PROFILE_HSP) { + u->source->set_volume = source_set_volume_cb; + u->source->n_volume_steps = 16; + + k = pa_sprintf_malloc("bluetooth-device@%p", (void*) u->source); + pa_shared_set(u->core, k, u); + pa_xfree(k); + } + + return 0; +} + +/* Run from main thread */ +static void shutdown_bt(struct userdata *u) { + pa_assert(u); + + if (u->stream_fd >= 0) { + pa_close(u->stream_fd); + u->stream_fd = -1; + + u->stream_write_type = 0; + } + + if (u->service_fd >= 0) { + pa_close(u->service_fd); + u->service_fd = -1; + u->service_write_type = 0; + u->service_read_type = 0; + } + + if (u->write_memchunk.memblock) { + pa_memblock_unref(u->write_memchunk.memblock); + pa_memchunk_reset(&u->write_memchunk); + } +} + +static int bt_transport_config_a2dp(struct userdata *u) { + const pa_bluetooth_transport *t; + struct a2dp_info *a2dp = &u->a2dp; + sbc_capabilities_raw_t *config; + + t = pa_bluetooth_discovery_get_transport(u->discovery, u->transport); + pa_assert(t); + + config = (sbc_capabilities_raw_t *) t->config; + + if (a2dp->sbc_initialized) + sbc_reinit(&a2dp->sbc, 0); + else + sbc_init(&a2dp->sbc, 0); + a2dp->sbc_initialized = TRUE; + + switch (config->frequency) { + case BT_SBC_SAMPLING_FREQ_16000: + a2dp->sbc.frequency = SBC_FREQ_16000; + break; + case BT_SBC_SAMPLING_FREQ_32000: + a2dp->sbc.frequency = SBC_FREQ_32000; + break; + case BT_SBC_SAMPLING_FREQ_44100: + a2dp->sbc.frequency = SBC_FREQ_44100; + break; + case BT_SBC_SAMPLING_FREQ_48000: + a2dp->sbc.frequency = SBC_FREQ_48000; + break; + default: + pa_assert_not_reached(); + } + + switch (config->channel_mode) { + case BT_A2DP_CHANNEL_MODE_MONO: + a2dp->sbc.mode = SBC_MODE_MONO; + break; + case BT_A2DP_CHANNEL_MODE_DUAL_CHANNEL: + a2dp->sbc.mode = SBC_MODE_DUAL_CHANNEL; + break; + case BT_A2DP_CHANNEL_MODE_STEREO: + a2dp->sbc.mode = SBC_MODE_STEREO; + break; + case BT_A2DP_CHANNEL_MODE_JOINT_STEREO: + a2dp->sbc.mode = SBC_MODE_JOINT_STEREO; + break; + default: + pa_assert_not_reached(); + } + + switch (config->allocation_method) { + case BT_A2DP_ALLOCATION_SNR: + a2dp->sbc.allocation = SBC_AM_SNR; + break; + case BT_A2DP_ALLOCATION_LOUDNESS: + a2dp->sbc.allocation = SBC_AM_LOUDNESS; + break; + default: + pa_assert_not_reached(); + } + + switch (config->subbands) { + case BT_A2DP_SUBBANDS_4: + a2dp->sbc.subbands = SBC_SB_4; + break; + case BT_A2DP_SUBBANDS_8: + a2dp->sbc.subbands = SBC_SB_8; + break; + default: + pa_assert_not_reached(); + } + + switch (config->block_length) { + case BT_A2DP_BLOCK_LENGTH_4: + a2dp->sbc.blocks = SBC_BLK_4; + break; + case BT_A2DP_BLOCK_LENGTH_8: + a2dp->sbc.blocks = SBC_BLK_8; + break; + case BT_A2DP_BLOCK_LENGTH_12: + a2dp->sbc.blocks = SBC_BLK_12; + break; + case BT_A2DP_BLOCK_LENGTH_16: + a2dp->sbc.blocks = SBC_BLK_16; + break; + default: + pa_assert_not_reached(); + } + + a2dp->min_bitpool = config->min_bitpool; + a2dp->max_bitpool = config->max_bitpool; + + /* Set minimum bitpool for source to get the maximum possible block_size */ + a2dp->sbc.bitpool = u->profile == PROFILE_A2DP ? a2dp->max_bitpool : a2dp->min_bitpool; + a2dp->codesize = sbc_get_codesize(&a2dp->sbc); + a2dp->frame_length = sbc_get_frame_length(&a2dp->sbc); + + u->block_size = + ((u->link_mtu - sizeof(struct rtp_header) - sizeof(struct rtp_payload)) + / a2dp->frame_length + * a2dp->codesize); + + pa_log_info("SBC parameters:\n\tallocation=%u\n\tsubbands=%u\n\tblocks=%u\n\tbitpool=%u\n", + a2dp->sbc.allocation, a2dp->sbc.subbands, a2dp->sbc.blocks, a2dp->sbc.bitpool); + + return 0; +} + +static int bt_transport_config(struct userdata *u) { + if (u->profile == PROFILE_HSP || u->profile == PROFILE_HFGW) { + u->block_size = u->link_mtu; + return 0; + } + + return bt_transport_config_a2dp(u); +} + +/* Run from main thread */ +static int bt_transport_open(struct userdata *u) { + if (bt_transport_acquire(u, FALSE) < 0) + return -1; + + return bt_transport_config(u); +} + +/* Run from main thread */ +static int init_bt(struct userdata *u) { + pa_assert(u); + + shutdown_bt(u); + + u->stream_write_type = 0; + u->service_write_type = 0; + u->service_read_type = 0; + + if ((u->service_fd = bt_audio_service_open()) < 0) { + pa_log_warn("Bluetooth audio service not available"); + return -1; + } + + pa_log_debug("Connected to the bluetooth audio service"); + + return 0; +} + +/* Run from main thread */ +static int setup_bt(struct userdata *u) { + const pa_bluetooth_device *d; + const pa_bluetooth_transport *t; + + pa_assert(u); + + if (!(d = pa_bluetooth_discovery_get_by_path(u->discovery, u->path))) { + pa_log_error("Failed to get device object."); + return -1; + } + + /* release transport if exist */ + if (u->transport) { + bt_transport_release(u); + pa_xfree(u->transport); + u->transport = NULL; + } + + /* check if profile has a transport */ + t = pa_bluetooth_device_get_transport(d, u->profile); + if (t) { + u->transport = pa_xstrdup(t->path); + return bt_transport_open(u); + } + + if (get_caps(u, 0) < 0) + return -1; + + pa_log_debug("Got device capabilities"); + + if (set_conf(u) < 0) + return -1; + + pa_log_debug("Connection to the device configured"); + + if (USE_SCO_OVER_PCM(u)) { + pa_log_debug("Configured to use SCO over PCM"); + return 0; + } + + pa_log_debug("Got the stream socket"); + + return 0; +} + +/* Run from main thread */ +static int init_profile(struct userdata *u) { + int r = 0; + pa_assert(u); + pa_assert(u->profile != PROFILE_OFF); + + if (setup_bt(u) < 0) + return -1; + + if (u->profile == PROFILE_A2DP || + u->profile == PROFILE_HSP || + u->profile == PROFILE_HFGW) + if (add_sink(u) < 0) + r = -1; + + if (u->profile == PROFILE_HSP || + u->profile == PROFILE_A2DP_SOURCE || + u->profile == PROFILE_HFGW) + if (add_source(u) < 0) + r = -1; + + return r; +} + +/* Run from main thread */ +static void stop_thread(struct userdata *u) { + char *k; + + pa_assert(u); + + if (u->thread) { + pa_asyncmsgq_send(u->thread_mq.inq, NULL, PA_MESSAGE_SHUTDOWN, NULL, 0, NULL); + pa_thread_free(u->thread); + u->thread = NULL; + } + + if (u->rtpoll_item) { + pa_rtpoll_item_free(u->rtpoll_item); + u->rtpoll_item = NULL; + } + + if (u->hsp.sink_state_changed_slot) { + pa_hook_slot_free(u->hsp.sink_state_changed_slot); + u->hsp.sink_state_changed_slot = NULL; + } + + if (u->hsp.source_state_changed_slot) { + pa_hook_slot_free(u->hsp.source_state_changed_slot); + u->hsp.source_state_changed_slot = NULL; + } + + if (u->sink) { + if (u->profile == PROFILE_HSP) { + k = pa_sprintf_malloc("bluetooth-device@%p", (void*) u->sink); + pa_shared_remove(u->core, k); + pa_xfree(k); + } + + pa_sink_unref(u->sink); + u->sink = NULL; + } + + if (u->source) { + if (u->profile == PROFILE_HSP) { + k = pa_sprintf_malloc("bluetooth-device@%p", (void*) u->source); + pa_shared_remove(u->core, k); + pa_xfree(k); + } + + pa_source_unref(u->source); + u->source = NULL; + } + + if (u->rtpoll) { + pa_thread_mq_done(&u->thread_mq); + + pa_rtpoll_free(u->rtpoll); + u->rtpoll = NULL; + } + + if (u->read_smoother) { + pa_smoother_free(u->read_smoother); + u->read_smoother = NULL; + } +} + +/* Run from main thread */ +static int start_thread(struct userdata *u) { + pa_assert(u); + pa_assert(!u->thread); + pa_assert(!u->rtpoll); + pa_assert(!u->rtpoll_item); + + u->rtpoll = pa_rtpoll_new(); + pa_thread_mq_init(&u->thread_mq, u->core->mainloop, u->rtpoll); + + if (USE_SCO_OVER_PCM(u)) { + if (sco_over_pcm_state_update(u) < 0) { + char *k; + + if (u->sink) { + k = pa_sprintf_malloc("bluetooth-device@%p", (void*) u->sink); + pa_shared_remove(u->core, k); + pa_xfree(k); + u->sink = NULL; + } + if (u->source) { + k = pa_sprintf_malloc("bluetooth-device@%p", (void*) u->source); + pa_shared_remove(u->core, k); + pa_xfree(k); + u->source = NULL; + } + return -1; + } + + pa_sink_ref(u->sink); + pa_source_ref(u->source); + /* FIXME: monitor stream_fd error */ + return 0; + } + + //Build bug fix because our pulseaudio core is old version than bluetooth + //if (!(u->thread = pa_thread_new("bluetooth", thread_func, u))) { + if (!(u->thread = pa_thread_new(thread_func, u))) { + pa_log_error("Failed to create IO thread"); + stop_thread(u); + return -1; + } + + if (u->sink) { + pa_sink_set_asyncmsgq(u->sink, u->thread_mq.inq); + pa_sink_set_rtpoll(u->sink, u->rtpoll); + pa_sink_put(u->sink); + + if (u->sink->set_volume) + u->sink->set_volume(u->sink); + } + + if (u->source) { + pa_source_set_asyncmsgq(u->source, u->thread_mq.inq); + pa_source_set_rtpoll(u->source, u->rtpoll); + pa_source_put(u->source); + + if (u->source->set_volume) + u->source->set_volume(u->source); + } + + return 0; +} + +static void save_sco_volume_callbacks(struct userdata *u) { + pa_assert(u); + pa_assert(USE_SCO_OVER_PCM(u)); + + u->hsp.sco_sink_set_volume = u->hsp.sco_sink->set_volume; + u->hsp.sco_source_set_volume = u->hsp.sco_source->set_volume; +} + +static void restore_sco_volume_callbacks(struct userdata *u) { + pa_assert(u); + pa_assert(USE_SCO_OVER_PCM(u)); + + u->hsp.sco_sink->set_volume = u->hsp.sco_sink_set_volume; + u->hsp.sco_source->set_volume = u->hsp.sco_source_set_volume; +} + +/* Run from main thread */ +static int card_set_profile(pa_card *c, pa_card_profile *new_profile) { + struct userdata *u; + enum profile *d; + pa_queue *inputs = NULL, *outputs = NULL; + const pa_bluetooth_device *device; + + pa_assert(c); + pa_assert(new_profile); + pa_assert_se(u = c->userdata); + + d = PA_CARD_PROFILE_DATA(new_profile); + + if (!(device = pa_bluetooth_discovery_get_by_path(u->discovery, u->path))) { + pa_log_error("Failed to get device object."); + return -PA_ERR_IO; + } + + /* The state signal is sent by bluez, so it is racy to check + strictly for CONNECTED, we should also accept STREAMING state + as being good enough. However, if the profile is used + concurrently (which is unlikely), ipc will fail later on, and + module will be unloaded. */ + if (device->headset_state < PA_BT_AUDIO_STATE_CONNECTED && *d == PROFILE_HSP) { + pa_log_warn("HSP is not connected, refused to switch profile"); + return -PA_ERR_IO; + } + else if (device->audio_sink_state < PA_BT_AUDIO_STATE_CONNECTED && *d == PROFILE_A2DP) { + pa_log_warn("A2DP is not connected, refused to switch profile"); + return -PA_ERR_IO; + } + else if (device->hfgw_state <= PA_BT_AUDIO_STATE_CONNECTED && *d == PROFILE_HFGW) { + pa_log_warn("HandsfreeGateway is not connected, refused to switch profile"); + return -PA_ERR_IO; + } + + if (u->sink) { + inputs = pa_sink_move_all_start(u->sink, NULL); + + if (!USE_SCO_OVER_PCM(u)) + pa_sink_unlink(u->sink); + } + + if (u->source) { + outputs = pa_source_move_all_start(u->source, NULL); + + if (!USE_SCO_OVER_PCM(u)) + pa_source_unlink(u->source); + } + + stop_thread(u); + shutdown_bt(u); + + if (USE_SCO_OVER_PCM(u)) + restore_sco_volume_callbacks(u); + + u->profile = *d; + u->sample_spec = u->requested_sample_spec; + + if (USE_SCO_OVER_PCM(u)) + save_sco_volume_callbacks(u); + + init_bt(u); + + if (u->profile != PROFILE_OFF) + init_profile(u); + + if (u->sink || u->source) + start_thread(u); + + if (inputs) { + if (u->sink) + pa_sink_move_all_finish(u->sink, inputs, FALSE); + else + pa_sink_move_all_fail(inputs); + } + + if (outputs) { + if (u->source) + pa_source_move_all_finish(u->source, outputs, FALSE); + else + pa_source_move_all_fail(outputs); + } + + return 0; +} + +/* Run from main thread */ +static int add_card(struct userdata *u, const pa_bluetooth_device *device) { + pa_card_new_data data; + pa_bool_t b; + pa_card_profile *p; + enum profile *d; + const char *ff; + char *n; + const char *default_profile; + + pa_assert(u); + pa_assert(device); + + pa_card_new_data_init(&data); + data.driver = __FILE__; + data.module = u->module; + + n = pa_bluetooth_cleanup_name(device->name); + pa_proplist_sets(data.proplist, PA_PROP_DEVICE_DESCRIPTION, n); + pa_xfree(n); + pa_proplist_sets(data.proplist, PA_PROP_DEVICE_STRING, device->address); + pa_proplist_sets(data.proplist, PA_PROP_DEVICE_API, "bluez"); + pa_proplist_sets(data.proplist, PA_PROP_DEVICE_CLASS, "sound"); + pa_proplist_sets(data.proplist, PA_PROP_DEVICE_BUS, "bluetooth"); + if ((ff = pa_bluetooth_get_form_factor(device->class))) + pa_proplist_sets(data.proplist, PA_PROP_DEVICE_FORM_FACTOR, ff); + pa_proplist_sets(data.proplist, "bluez.path", device->path); + pa_proplist_setf(data.proplist, "bluez.class", "0x%06x", (unsigned) device->class); + pa_proplist_sets(data.proplist, "bluez.name", device->name); + data.name = get_name("card", u->modargs, device->address, &b); + data.namereg_fail = b; + + if (pa_modargs_get_proplist(u->modargs, "card_properties", data.proplist, PA_UPDATE_REPLACE) < 0) { + pa_log("Invalid properties"); + pa_card_new_data_done(&data); + return -1; + } + + data.profiles = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func); + + /* we base hsp/a2dp availability on UUIDs. + Ideally, it would be based on "Connected" state, but + we can't afford to wait for this information when + we are loaded with profile="hsp", for instance */ + if (pa_bluetooth_uuid_has(device->uuids, A2DP_SINK_UUID)) { + p = pa_card_profile_new("a2dp", _("High Fidelity Playback (A2DP)"), sizeof(enum profile)); + p->priority = 10; + p->n_sinks = 1; + p->n_sources = 0; + p->max_sink_channels = 2; + p->max_source_channels = 0; + + d = PA_CARD_PROFILE_DATA(p); + *d = PROFILE_A2DP; + + pa_hashmap_put(data.profiles, p->name, p); + } + + if (pa_bluetooth_uuid_has(device->uuids, A2DP_SOURCE_UUID)) { + p = pa_card_profile_new("a2dp_source", _("High Fidelity Capture (A2DP)"), sizeof(enum profile)); + p->priority = 10; + p->n_sinks = 0; + p->n_sources = 1; + p->max_sink_channels = 0; + p->max_source_channels = 2; + + d = PA_CARD_PROFILE_DATA(p); + *d = PROFILE_A2DP_SOURCE; + + pa_hashmap_put(data.profiles, p->name, p); + } +#ifdef BT_FULL_AUDIO_FEATURE + if (pa_bluetooth_uuid_has(device->uuids, HSP_HS_UUID) || + pa_bluetooth_uuid_has(device->uuids, HFP_HS_UUID)) { + p = pa_card_profile_new("hsp", _("Telephony Duplex (HSP/HFP)"), sizeof(enum profile)); + p->priority = 20; + p->n_sinks = 1; + p->n_sources = 1; + p->max_sink_channels = 1; + p->max_source_channels = 1; + + d = PA_CARD_PROFILE_DATA(p); + *d = PROFILE_HSP; + + pa_hashmap_put(data.profiles, p->name, p); + } + + if (pa_bluetooth_uuid_has(device->uuids, HFP_AG_UUID)) { + p = pa_card_profile_new("hfgw", _("Handsfree Gateway"), sizeof(enum profile)); + p->priority = 20; + p->n_sinks = 1; + p->n_sources = 1; + p->max_sink_channels = 1; + p->max_source_channels = 1; + + d = PA_CARD_PROFILE_DATA(p); + *d = PROFILE_HFGW; + + pa_hashmap_put(data.profiles, p->name, p); + } +#endif + + pa_assert(!pa_hashmap_isempty(data.profiles)); + + p = pa_card_profile_new("off", _("Off"), sizeof(enum profile)); + d = PA_CARD_PROFILE_DATA(p); + *d = PROFILE_OFF; + pa_hashmap_put(data.profiles, p->name, p); + + if ((default_profile = pa_modargs_get_value(u->modargs, "profile", NULL))) { + if (pa_hashmap_get(data.profiles, default_profile)) + pa_card_new_data_set_profile(&data, default_profile); + else + pa_log_warn("Profile '%s' not valid or not supported by device.", default_profile); + } + + u->card = pa_card_new(u->core, &data); + pa_card_new_data_done(&data); + + if (!u->card) { + pa_log("Failed to allocate card."); + return -1; + } + + u->card->userdata = u; + u->card->set_profile = card_set_profile; + + d = PA_CARD_PROFILE_DATA(u->card->active_profile); + + if ((device->headset_state < PA_BT_AUDIO_STATE_CONNECTED && *d == PROFILE_HSP) || + (device->audio_sink_state < PA_BT_AUDIO_STATE_CONNECTED && *d == PROFILE_A2DP) || + (device->hfgw_state < PA_BT_AUDIO_STATE_CONNECTED && *d == PROFILE_HFGW)) { + pa_log_warn("Default profile not connected, selecting off profile"); + u->card->active_profile = pa_hashmap_get(u->card->profiles, "off"); + u->card->save_profile = FALSE; + } + + d = PA_CARD_PROFILE_DATA(u->card->active_profile); + u->profile = *d; + + if (USE_SCO_OVER_PCM(u)) + save_sco_volume_callbacks(u); + + return 0; +} + +/* Run from main thread */ +static const pa_bluetooth_device* find_device(struct userdata *u, const char *address, const char *path) { + const pa_bluetooth_device *d = NULL; + + pa_assert(u); + + if (!address && !path) { + pa_log_error("Failed to get device address/path from module arguments."); + return NULL; + } + + if (path) { + if (!(d = pa_bluetooth_discovery_get_by_path(u->discovery, path))) { + pa_log_error("%s is not a valid BlueZ audio device.", path); + return NULL; + } + + if (address && !(pa_streq(d->address, address))) { + pa_log_error("Passed path %s address %s != %s don't match.", path, d->address, address); + return NULL; + } + + } else { + if (!(d = pa_bluetooth_discovery_get_by_address(u->discovery, address))) { + pa_log_error("%s is not known.", address); + return NULL; + } + } + + if (d) { + u->address = pa_xstrdup(d->address); + u->path = pa_xstrdup(d->path); + } + + return d; +} + +/* Run from main thread */ +static int setup_dbus(struct userdata *u) { + DBusError err; + + dbus_error_init(&err); + + u->connection = pa_dbus_bus_get(u->core, DBUS_BUS_SYSTEM, &err); + + if (dbus_error_is_set(&err) || !u->connection) { + pa_log("Failed to get D-Bus connection: %s", err.message); + dbus_error_free(&err); + return -1; + } + + return 0; +} + +int pa__init(pa_module* m) { + pa_modargs *ma; + uint32_t channels; + struct userdata *u; + const char *address, *path; + DBusError err; + char *mike, *speaker, *transport,*headset; + const pa_bluetooth_device *device; + + pa_assert(m); + + dbus_error_init(&err); + + if (!(ma = pa_modargs_new(m->argument, valid_modargs))) { + pa_log_error("Failed to parse module arguments"); + goto fail; + } + + m->userdata = u = pa_xnew0(struct userdata, 1); + u->module = m; + u->core = m->core; + u->service_fd = -1; + u->stream_fd = -1; + u->sample_spec = m->core->default_sample_spec; + u->modargs = ma; + + if (pa_modargs_get_value(ma, "sco_sink", NULL) && + !(u->hsp.sco_sink = pa_namereg_get(m->core, pa_modargs_get_value(ma, "sco_sink", NULL), PA_NAMEREG_SINK))) { + pa_log("SCO sink not found"); + goto fail; + } + + if (pa_modargs_get_value(ma, "sco_source", NULL) && + !(u->hsp.sco_source = pa_namereg_get(m->core, pa_modargs_get_value(ma, "sco_source", NULL), PA_NAMEREG_SOURCE))) { + pa_log("SCO source not found"); + goto fail; + } + + if (pa_modargs_get_value_u32(ma, "rate", &u->sample_spec.rate) < 0 || + u->sample_spec.rate <= 0 || u->sample_spec.rate > PA_RATE_MAX) { + pa_log_error("Failed to get rate from module arguments"); + goto fail; + } + + u->auto_connect = TRUE; + if (pa_modargs_get_value_boolean(ma, "auto_connect", &u->auto_connect)) { + pa_log("Failed to parse auto_connect= argument"); + goto fail; + } + + channels = u->sample_spec.channels; + if (pa_modargs_get_value_u32(ma, "channels", &channels) < 0 || + channels <= 0 || channels > PA_CHANNELS_MAX) { + pa_log_error("Failed to get channels from module arguments"); + goto fail; + } + u->sample_spec.channels = (uint8_t) channels; + u->requested_sample_spec = u->sample_spec; + + address = pa_modargs_get_value(ma, "address", NULL); + path = pa_modargs_get_value(ma, "path", NULL); + + if (setup_dbus(u) < 0) + goto fail; + + if (!(u->discovery = pa_bluetooth_discovery_get(m->core))) + goto fail; + + if (!(device = find_device(u, address, path))) + goto fail; + + /* Add the card structure. This will also initialize the default profile */ + if (add_card(u, device) < 0) + goto fail; + + if (!dbus_connection_add_filter(pa_dbus_connection_get(u->connection), filter_cb, u, NULL)) { + pa_log_error("Failed to add filter function"); + goto fail; + } + u->filter_added = TRUE; + + speaker = pa_sprintf_malloc("type='signal',sender='org.bluez',interface='org.bluez.Headset',member='SpeakerGainChanged',path='%s'", u->path); + mike = pa_sprintf_malloc("type='signal',sender='org.bluez',interface='org.bluez.Headset',member='MicrophoneGainChanged',path='%s'", u->path); + transport = pa_sprintf_malloc("type='signal',sender='org.bluez',interface='org.bluez.MediaTransport',member='PropertyChanged'"); + headset=pa_sprintf_malloc("type='signal',sender='org.bluez',interface='org.bluez.Headset',member='PropertyChanged',path='%s'", u->path); + + if (pa_dbus_add_matches( + pa_dbus_connection_get(u->connection), &err, + speaker, + mike, + transport, + headset, + NULL) < 0) { + + pa_xfree(speaker); + pa_xfree(mike); + pa_xfree(transport); + + pa_log("Failed to add D-Bus matches: %s", err.message); + goto fail; + } + + pa_xfree(speaker); + pa_xfree(mike); + pa_xfree(transport); + + /* Connect to the BT service */ + init_bt(u); + + if (u->profile != PROFILE_OFF) + if (init_profile(u) < 0) + goto fail; + + if (u->sink || u->source) + if (start_thread(u) < 0) + goto fail; + + return 0; + +fail: + + pa__done(m); + + dbus_error_free(&err); + + return -1; +} + +int pa__get_n_used(pa_module *m) { + struct userdata *u; + + pa_assert(m); + pa_assert_se(u = m->userdata); + + return + (u->sink ? pa_sink_linked_by(u->sink) : 0) + + (u->source ? pa_source_linked_by(u->source) : 0); +} + +void pa__done(pa_module *m) { + struct userdata *u; + + pa_assert(m); + + if (!(u = m->userdata)) + return; + + if (u->sink && !USE_SCO_OVER_PCM(u)) + pa_sink_unlink(u->sink); + + if (u->source && !USE_SCO_OVER_PCM(u)) + pa_source_unlink(u->source); + + stop_thread(u); + + if (USE_SCO_OVER_PCM(u)) + restore_sco_volume_callbacks(u); + + if (u->connection) { + + if (u->path) { + char *speaker, *mike; + speaker = pa_sprintf_malloc("type='signal',sender='org.bluez',interface='org.bluez.Headset',member='SpeakerGainChanged',path='%s'", u->path); + mike = pa_sprintf_malloc("type='signal',sender='org.bluez',interface='org.bluez.Headset',member='MicrophoneGainChanged',path='%s'", u->path); + + pa_dbus_remove_matches(pa_dbus_connection_get(u->connection), speaker, mike, NULL); + + pa_xfree(speaker); + pa_xfree(mike); + } + + if (u->filter_added) + dbus_connection_remove_filter(pa_dbus_connection_get(u->connection), filter_cb, u); + + pa_dbus_connection_unref(u->connection); + } + + if (u->card) + pa_card_free(u->card); + + if (u->read_smoother) + pa_smoother_free(u->read_smoother); + + shutdown_bt(u); + + if (u->a2dp.buffer) + pa_xfree(u->a2dp.buffer); + + sbc_finish(&u->a2dp.sbc); + + if (u->modargs) + pa_modargs_free(u->modargs); + + pa_xfree(u->address); + pa_xfree(u->path); + + if (u->transport) { + bt_transport_release(u); + pa_xfree(u->transport); + } + + if (u->discovery) + pa_bluetooth_discovery_unref(u->discovery); + + pa_xfree(u); +} diff --git a/src/modules/bluetooth/module-bluetooth-discover.c b/src/modules/bluetooth/module-bluetooth-discover.c new file mode 100644 index 0000000..0e5e8db --- /dev/null +++ b/src/modules/bluetooth/module-bluetooth-discover.c @@ -0,0 +1,237 @@ +/*** + This file is part of PulseAudio. + + Copyright 2008-2009 Joao Paulo Rechi Vita + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation; either version 2.1 of the + License, or (at your option) any later version. + + PulseAudio 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 Lesser General Public + License along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "module-bluetooth-discover-symdef.h" +#include "bluetooth-util.h" + +PA_MODULE_AUTHOR("Joao Paulo Rechi Vita"); +PA_MODULE_DESCRIPTION("Detect available bluetooth audio devices and load bluetooth audio drivers"); +PA_MODULE_VERSION(PACKAGE_VERSION); +PA_MODULE_USAGE("async="); +PA_MODULE_LOAD_ONCE(TRUE); + +/* +#ifdef NOKIA + "sco_sink= " + "sco_source=" +#endif +*/ + +static const char* const valid_modargs[] = { +#ifdef NOKIA + "sco_sink", + "sco_source", +#endif + "async", + NULL +}; + +struct userdata { + pa_module *module; + pa_modargs *modargs; + pa_core *core; + pa_bluetooth_discovery *discovery; + pa_hook_slot *slot; + pa_hashmap *hashmap; +}; + +struct module_info { + char *path; + uint32_t module; +}; + +static pa_hook_result_t load_module_for_device(pa_bluetooth_discovery *y, const pa_bluetooth_device *d, struct userdata *u) { + struct module_info *mi; + + pa_assert(u); + pa_assert(d); + + mi = pa_hashmap_get(u->hashmap, d->path); + + if (!d->dead && d->device_connected > 0 && + (/*d->audio_state >= PA_BT_AUDIO_STATE_CONNECTED*/ + d->audio_sink_state >= PA_BT_AUDIO_STATE_CONNECTED || + d->audio_source_state >= PA_BT_AUDIO_STATE_CONNECTED || + d->hfgw_state > PA_BT_AUDIO_STATE_CONNECTED)) { + + if (!mi) { + pa_module *m = NULL; + char *args; + + /* Oh, awesome, a new device has shown up and been connected! */ + + args = pa_sprintf_malloc("address=\"%s\" path=\"%s\"", d->address, d->path); +#ifdef BT_FULL_AUDIO_FEATURE + /* This is in case we have to use hsp immediately, without waiting for .Audio.State = Connected */ + if (d->headset_state >= PA_BT_AUDIO_STATE_CONNECTED && somecondition) { + char *tmp; + tmp = pa_sprintf_malloc("%s profile=\"hsp\"", args); + pa_xfree(args); + args = tmp; + } +#endif + +#ifdef NOKIA + if (pa_modargs_get_value(u->modargs, "sco_sink", NULL) && + pa_modargs_get_value(u->modargs, "sco_source", NULL)) { + char *tmp; + + tmp = pa_sprintf_malloc("%s sco_sink=\"%s\" sco_source=\"%s\"", args, + pa_modargs_get_value(u->modargs, "sco_sink", NULL), + pa_modargs_get_value(u->modargs, "sco_source", NULL)); + pa_xfree(args); + args = tmp; + } +#endif + +#ifdef BT_FULL_AUDIO_FEATURE + + if (d->audio_source_state >= PA_BT_AUDIO_STATE_CONNECTED) + args = pa_sprintf_malloc("%s profile=\"a2dp_source\" auto_connect=no", args); + + if (d->hfgw_state > PA_BT_AUDIO_STATE_CONNECTED) + args = pa_sprintf_malloc("%s profile=\"hfgw\"", args); +#endif + if (d->audio_sink_state >= PA_BT_AUDIO_STATE_CONNECTED) + args = pa_sprintf_malloc("%s profile=\"a2dp\"",args ); + + pa_log_debug("Loading module-bluetooth-device %s", args); + m = pa_module_load(u->module->core, "module-bluetooth-device", args); + pa_xfree(args); + + if (m) { + mi = pa_xnew(struct module_info, 1); + mi->module = m->index; + mi->path = pa_xstrdup(d->path); + + pa_hashmap_put(u->hashmap, mi->path, mi); + } else + pa_log_debug("Failed to load module for device %s", d->path); + } + + } else { + + if (mi) { + + /* Hmm, disconnection? Then let's unload our module */ + + pa_log_debug("Unloading module for %s", d->path); + pa_module_unload_request_by_index(u->core, mi->module, TRUE); + + pa_hashmap_remove(u->hashmap, mi->path); + pa_xfree(mi->path); + pa_xfree(mi); + } + } + + return PA_HOOK_OK; +} + +int pa__init(pa_module* m) { + struct userdata *u; + pa_modargs *ma = NULL; + pa_bool_t async = FALSE; + + pa_assert(m); + + if (!(ma = pa_modargs_new(m->argument, valid_modargs))) { + pa_log("Failed to parse module arguments"); + goto fail; + } + + if (pa_modargs_get_value_boolean(ma, "async", &async) < 0) { + pa_log("Failed to parse async argument."); + goto fail; + } + + m->userdata = u = pa_xnew0(struct userdata, 1); + u->module = m; + u->core = m->core; + u->modargs = ma; + ma = NULL; + u->hashmap = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func); + + if (!(u->discovery = pa_bluetooth_discovery_get(u->core))) + goto fail; + + u->slot = pa_hook_connect(pa_bluetooth_discovery_hook(u->discovery), PA_HOOK_NORMAL, (pa_hook_cb_t) load_module_for_device, u); + + if (!async) + pa_bluetooth_discovery_sync(u->discovery); + + return 0; + +fail: + pa__done(m); + + if (ma) + pa_modargs_free(ma); + + return -1; +} + +void pa__done(pa_module* m) { + struct userdata *u; + + pa_assert(m); + + if (!(u = m->userdata)) + return; + + if (u->slot) + pa_hook_slot_free(u->slot); + + if (u->discovery) + pa_bluetooth_discovery_unref(u->discovery); + + if (u->hashmap) { + struct module_info *mi; + + while ((mi = pa_hashmap_steal_first(u->hashmap))) { + pa_xfree(mi->path); + pa_xfree(mi); + } + + pa_hashmap_free(u->hashmap, NULL, NULL); + } + + if (u->modargs) + pa_modargs_free(u->modargs); + + pa_xfree(u); +} diff --git a/src/modules/bluetooth/module-bluetooth-proximity.c b/src/modules/bluetooth/module-bluetooth-proximity.c new file mode 100644 index 0000000..8c3a5b9 --- /dev/null +++ b/src/modules/bluetooth/module-bluetooth-proximity.c @@ -0,0 +1,487 @@ +/*** + This file is part of PulseAudio. + + Copyright 2005-2006 Lennart Poettering + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "module-bluetooth-proximity-symdef.h" + +PA_MODULE_AUTHOR("Lennart Poettering"); +PA_MODULE_DESCRIPTION("Bluetooth Proximity Volume Control"); +PA_MODULE_VERSION(PACKAGE_VERSION); +PA_MODULE_LOAD_ONCE(TRUE); +PA_MODULE_USAGE( + "sink= " + "hci= " +); + +#define DEFAULT_HCI "hci0" + +static const char* const valid_modargs[] = { + "sink", + "hci", + NULL, +}; + +struct bonding { + struct userdata *userdata; + char address[18]; + + pid_t pid; + int fd; + + pa_io_event *io_event; + + enum { + UNKNOWN, + FOUND, + NOT_FOUND + } state; +}; + +struct userdata { + pa_module *module; + pa_dbus_connection *dbus_connection; + + char *sink_name; + char *hci, *hci_path; + + pa_hashmap *bondings; + + unsigned n_found; + unsigned n_unknown; + + pa_bool_t muted:1; + pa_bool_t filter_added:1; +}; + +static void update_volume(struct userdata *u) { + pa_assert(u); + + if (u->muted && u->n_found > 0) { + pa_sink *s; + + u->muted = FALSE; + + if (!(s = pa_namereg_get(u->module->core, u->sink_name, PA_NAMEREG_SINK))) { + pa_log_warn("Sink device '%s' not available for unmuting.", pa_strnull(u->sink_name)); + return; + } + + pa_log_info("Found %u BT devices, unmuting.", u->n_found); + pa_sink_set_mute(s, FALSE, FALSE); + + } else if (!u->muted && (u->n_found+u->n_unknown) <= 0) { + pa_sink *s; + + u->muted = TRUE; + + if (!(s = pa_namereg_get(u->module->core, u->sink_name, PA_NAMEREG_SINK))) { + pa_log_warn("Sink device '%s' not available for muting.", pa_strnull(u->sink_name)); + return; + } + + pa_log_info("No BT devices found, muting."); + pa_sink_set_mute(s, TRUE, FALSE); + + } else + pa_log_info("%u devices now active, %u with unknown state.", u->n_found, u->n_unknown); +} + +static void bonding_free(struct bonding *b) { + pa_assert(b); + + if (b->state == FOUND) + pa_assert_se(b->userdata->n_found-- >= 1); + + if (b->state == UNKNOWN) + pa_assert_se(b->userdata->n_unknown-- >= 1); + + if (b->pid != (pid_t) -1) { + kill(b->pid, SIGTERM); + waitpid(b->pid, NULL, 0); + } + + if (b->fd >= 0) + pa_close(b->fd); + + if (b->io_event) + b->userdata->module->core->mainloop->io_free(b->io_event); + + pa_xfree(b); +} + +static void io_event_cb( + pa_mainloop_api*a, + pa_io_event* e, + int fd, + pa_io_event_flags_t events, + void *userdata) { + + struct bonding *b = userdata; + char x; + ssize_t r; + + pa_assert(b); + + if ((r = read(fd, &x, 1)) <= 0) { + pa_log_warn("Child watching '%s' died abnormally: %s", b->address, r == 0 ? "EOF" : pa_cstrerror(errno)); + + pa_assert_se(pa_hashmap_remove(b->userdata->bondings, b->address) == b); + bonding_free(b); + return; + } + + pa_assert_se(r == 1); + + if (b->state == UNKNOWN) + pa_assert_se(b->userdata->n_unknown-- >= 1); + + if (x == '+') { + pa_assert(b->state == UNKNOWN || b->state == NOT_FOUND); + + b->state = FOUND; + b->userdata->n_found++; + + pa_log_info("Device '%s' is alive.", b->address); + + } else { + pa_assert(x == '-'); + pa_assert(b->state == UNKNOWN || b->state == FOUND); + + if (b->state == FOUND) + b->userdata->n_found--; + + b->state = NOT_FOUND; + + pa_log_info("Device '%s' is dead.", b->address); + } + + update_volume(b->userdata); +} + +static struct bonding* bonding_new(struct userdata *u, const char *a) { + struct bonding *b = NULL; + DBusMessage *m = NULL, *r = NULL; + DBusError e; + const char *class; + + pa_assert(u); + pa_assert(a); + + pa_return_val_if_fail(strlen(a) == 17, NULL); + pa_return_val_if_fail(!pa_hashmap_get(u->bondings, a), NULL); + + dbus_error_init(&e); + + pa_assert_se(m = dbus_message_new_method_call("org.bluez", u->hci_path, "org.bluez.Adapter", "GetRemoteMajorClass")); + pa_assert_se(dbus_message_append_args(m, DBUS_TYPE_STRING, &a, DBUS_TYPE_INVALID)); + r = dbus_connection_send_with_reply_and_block(pa_dbus_connection_get(u->dbus_connection), m, -1, &e); + + if (!r) { + pa_log("org.bluez.Adapter.GetRemoteMajorClass(%s) failed: %s", a, e.message); + goto fail; + } + + if (!(dbus_message_get_args(r, &e, DBUS_TYPE_STRING, &class, DBUS_TYPE_INVALID))) { + pa_log("Malformed org.bluez.Adapter.GetRemoteMajorClass signal: %s", e.message); + goto fail; + } + + if (strcmp(class, "phone")) { + pa_log_info("Found device '%s' of class '%s', ignoring.", a, class); + goto fail; + } + + b = pa_xnew(struct bonding, 1); + b->userdata = u; + pa_strlcpy(b->address, a, sizeof(b->address)); + b->pid = (pid_t) -1; + b->fd = -1; + b->io_event = NULL; + b->state = UNKNOWN; + u->n_unknown ++; + + pa_log_info("Watching device '%s' of class '%s'.", b->address, class); + + if ((b->fd = pa_start_child_for_read(PA_BT_PROXIMITY_HELPER, a, &b->pid)) < 0) { + pa_log("Failed to start helper tool."); + goto fail; + } + + b->io_event = u->module->core->mainloop->io_new( + u->module->core->mainloop, + b->fd, + PA_IO_EVENT_INPUT, + io_event_cb, + b); + + dbus_message_unref(m); + dbus_message_unref(r); + + pa_hashmap_put(u->bondings, b->address, b); + + return b; + +fail: + if (m) + dbus_message_unref(m); + if (r) + dbus_message_unref(r); + + if (b) + bonding_free(b); + + dbus_error_free(&e); + return NULL; +} + +static void bonding_remove(struct userdata *u, const char *a) { + struct bonding *b; + pa_assert(u); + + pa_return_if_fail((b = pa_hashmap_remove(u->bondings, a))); + + pa_log_info("No longer watching device '%s'", b->address); + bonding_free(b); +} + +static DBusHandlerResult filter_func(DBusConnection *connection, DBusMessage *m, void *userdata) { + struct userdata *u = userdata; + DBusError e; + + dbus_error_init(&e); + + if (dbus_message_is_signal(m, "org.bluez.Adapter", "BondingCreated")) { + const char *a; + + if (!(dbus_message_get_args(m, &e, DBUS_TYPE_STRING, &a, DBUS_TYPE_INVALID))) { + pa_log("Malformed org.bluez.Adapter.BondingCreated signal: %s", e.message); + goto finish; + } + + bonding_new(u, a); + + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + + } else if (dbus_message_is_signal(m, "org.bluez.Adapter", "BondingRemoved")) { + + const char *a; + + if (!(dbus_message_get_args(m, &e, DBUS_TYPE_STRING, &a, DBUS_TYPE_INVALID))) { + pa_log("Malformed org.bluez.Adapter.BondingRemoved signal: %s", e.message); + goto finish; + } + + bonding_remove(u, a); + + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + } + +finish: + + dbus_error_free(&e); + + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; +} + +static int add_matches(struct userdata *u, pa_bool_t add) { + char *filter1, *filter2; + DBusError e; + int r = -1; + + pa_assert(u); + dbus_error_init(&e); + + filter1 = pa_sprintf_malloc("type='signal',sender='org.bluez',interface='org.bluez.Adapter',member='BondingCreated',path='%s'", u->hci_path); + filter2 = pa_sprintf_malloc("type='signal',sender='org.bluez',interface='org.bluez.Adapter',member='BondingRemoved',path='%s'", u->hci_path); + + if (add) { + dbus_bus_add_match(pa_dbus_connection_get(u->dbus_connection), filter1, &e); + + if (dbus_error_is_set(&e)) { + pa_log("dbus_bus_add_match(%s) failed: %s", filter1, e.message); + goto finish; + } + } else + dbus_bus_remove_match(pa_dbus_connection_get(u->dbus_connection), filter1, &e); + + + if (add) { + dbus_bus_add_match(pa_dbus_connection_get(u->dbus_connection), filter2, &e); + + if (dbus_error_is_set(&e)) { + pa_log("dbus_bus_add_match(%s) failed: %s", filter2, e.message); + dbus_bus_remove_match(pa_dbus_connection_get(u->dbus_connection), filter2, &e); + goto finish; + } + } else + dbus_bus_remove_match(pa_dbus_connection_get(u->dbus_connection), filter2, &e); + + if (add) { + pa_assert_se(dbus_connection_add_filter(pa_dbus_connection_get(u->dbus_connection), filter_func, u, NULL)); + u->filter_added = TRUE; + } else if (u->filter_added) + dbus_connection_remove_filter(pa_dbus_connection_get(u->dbus_connection), filter_func, u); + + r = 0; + +finish: + pa_xfree(filter1); + pa_xfree(filter2); + dbus_error_free(&e); + + return r; +} + +int pa__init(pa_module*m) { + pa_modargs *ma = NULL; + struct userdata *u; + DBusError e; + DBusMessage *msg = NULL, *r = NULL; + DBusMessageIter iter, sub; + + pa_assert(m); + dbus_error_init(&e); + + if (!(ma = pa_modargs_new(m->argument, valid_modargs))) { + pa_log("Failed to parse module arguments"); + goto fail; + } + + m->userdata = u = pa_xnew0(struct userdata, 1); + u->module = m; + u->sink_name = pa_xstrdup(pa_modargs_get_value(ma, "sink", NULL)); + u->hci = pa_xstrdup(pa_modargs_get_value(ma, "hci", DEFAULT_HCI)); + u->hci_path = pa_sprintf_malloc("/org/bluez/%s", u->hci); + u->bondings = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func); + + if (!(u->dbus_connection = pa_dbus_bus_get(m->core, DBUS_BUS_SYSTEM, &e))) { + pa_log("Failed to get D-Bus connection: %s", e.message); + goto fail; + } + + if (add_matches(u, TRUE) < 0) + goto fail; + + pa_assert_se(msg = dbus_message_new_method_call("org.bluez", u->hci_path, "org.bluez.Adapter", "ListBondings")); + + if (!(r = dbus_connection_send_with_reply_and_block(pa_dbus_connection_get(u->dbus_connection), msg, -1, &e))) { + pa_log("org.bluez.Adapter.ListBondings failed: %s", e.message); + goto fail; + } + + dbus_message_iter_init(r, &iter); + + if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY) { + pa_log("Malformed reply to org.bluez.Adapter.ListBondings."); + goto fail; + } + + dbus_message_iter_recurse(&iter, &sub); + + while (dbus_message_iter_get_arg_type(&sub) == DBUS_TYPE_STRING) { + const char *a = NULL; + + dbus_message_iter_get_basic(&sub, &a); + bonding_new(u, a); + + dbus_message_iter_next(&sub); + } + + dbus_message_unref(r); + dbus_message_unref(msg); + + pa_modargs_free(ma); + + if (pa_hashmap_size(u->bondings) == 0) + pa_log_warn("Warning: no phone device bonded."); + + update_volume(u); + + return 0; + +fail: + + if (ma) + pa_modargs_free(ma); + + pa__done(m); + + dbus_error_free(&e); + + if (msg) + dbus_message_unref(msg); + + if (r) + dbus_message_unref(r); + + return -1; +} + +void pa__done(pa_module*m) { + struct userdata *u; + pa_assert(m); + + if (!(u = m->userdata)) + return; + + if (u->bondings) { + struct bonding *b; + + while ((b = pa_hashmap_steal_first(u->bondings))) + bonding_free(b); + + pa_hashmap_free(u->bondings, NULL, NULL); + } + + if (u->dbus_connection) { + add_matches(u, FALSE); + pa_dbus_connection_unref(u->dbus_connection); + } + + pa_xfree(u->sink_name); + pa_xfree(u->hci_path); + pa_xfree(u->hci); + pa_xfree(u); +} diff --git a/src/modules/bluetooth/proximity-helper.c b/src/modules/bluetooth/proximity-helper.c new file mode 100644 index 0000000..3767f01 --- /dev/null +++ b/src/modules/bluetooth/proximity-helper.c @@ -0,0 +1,202 @@ +/* + * Small SUID helper that allows us to ping a BT device. Borrows + * heavily from bluez-utils' l2ping, which is licensed as GPL2+ + * and comes with a copyright like this: + * + * Copyright (C) 2000-2001 Qualcomm Incorporated + * Copyright (C) 2002-2003 Maxim Krasnyansky + * Copyright (C) 2002-2007 Marcel Holtmann + * + * + * 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 St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#undef NDEBUG + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#define PING_STRING "PulseAudio" +#define IDENT 200 +#define TIMEOUT 4 +#define INTERVAL 2 + +static void update_status(int found) { + static int status = -1; + + if (!found && status != 0) + printf("-"); + if (found && status <= 0) + printf("+"); + + fflush(stdout); + status = !!found; +} + +int main(int argc, char *argv[]) { + struct sockaddr_l2 addr; + union { + l2cap_cmd_hdr hdr; + uint8_t buf[L2CAP_CMD_HDR_SIZE + sizeof(PING_STRING)]; + } packet; + int fd = -1; + uint8_t id = IDENT; + int connected = 0; + + assert(argc == 2); + + for (;;) { + fd_set fds; + struct timeval end; + ssize_t r; + + if (!connected) { + + if (fd >= 0) + close(fd); + + if ((fd = socket(PF_BLUETOOTH, SOCK_RAW, BTPROTO_L2CAP)) < 0) { + fprintf(stderr, "socket(PF_BLUETOOTH, SOCK_RAW, BTPROTO_L2CAP) failed: %s", strerror(errno)); + goto finish; + } + + memset(&addr, 0, sizeof(addr)); + addr.l2_family = AF_BLUETOOTH; + bacpy(&addr.l2_bdaddr, BDADDR_ANY); + + if (bind(fd, (struct sockaddr *) &addr, sizeof(addr)) < 0) { + fprintf(stderr, "bind() failed: %s", strerror(errno)); + goto finish; + } + + memset(&addr, 0, sizeof(addr)); + addr.l2_family = AF_BLUETOOTH; + str2ba(argv[1], &addr.l2_bdaddr); + + if (connect(fd, (struct sockaddr *) &addr, sizeof(addr)) < 0) { + + if (errno == EHOSTDOWN || errno == ECONNRESET || errno == ETIMEDOUT) { + update_status(0); + sleep(INTERVAL); + continue; + } + + fprintf(stderr, "connect() failed: %s", strerror(errno)); + goto finish; + } + + connected = 1; + } + + assert(connected); + + memset(&packet, 0, sizeof(packet)); + strcpy((char*) packet.buf + L2CAP_CMD_HDR_SIZE, PING_STRING); + packet.hdr.ident = id; + packet.hdr.len = htobs(sizeof(PING_STRING)); + packet.hdr.code = L2CAP_ECHO_REQ; + + if ((r = send(fd, &packet, sizeof(packet), 0)) < 0) { + + if (errno == EHOSTDOWN || errno == ECONNRESET || errno == ETIMEDOUT) { + update_status(0); + connected = 0; + sleep(INTERVAL); + continue; + } + + fprintf(stderr, "send() failed: %s", strerror(errno)); + goto finish; + } + + assert(r == sizeof(packet)); + + gettimeofday(&end, NULL); + end.tv_sec += TIMEOUT; + + for (;;) { + struct timeval now, delta; + + gettimeofday(&now, NULL); + + if (timercmp(&end, &now, <=)) { + update_status(0); + connected = 0; + sleep(INTERVAL); + break; + } + + timersub(&end, &now, &delta); + + FD_ZERO(&fds); + FD_SET(fd, &fds); + + if (select(fd+1, &fds, NULL, NULL, &delta) < 0) { + fprintf(stderr, "select() failed: %s", strerror(errno)); + goto finish; + } + + if ((r = recv(fd, &packet, sizeof(packet), 0)) <= 0) { + + if (errno == EHOSTDOWN || errno == ECONNRESET || errno == ETIMEDOUT) { + update_status(0); + connected = 0; + sleep(INTERVAL); + break; + } + + fprintf(stderr, "send() failed: %s", r == 0 ? "EOF" : strerror(errno)); + goto finish; + } + + assert(r >= L2CAP_CMD_HDR_SIZE); + + if (packet.hdr.ident != id) + continue; + + if (packet.hdr.code == L2CAP_ECHO_RSP || packet.hdr.code == L2CAP_COMMAND_REJ) { + + if (++id >= 0xFF) + id = IDENT; + + update_status(1); + sleep(INTERVAL); + break; + } + } + } + +finish: + + if (fd >= 0) + close(fd); + + return 1; +} diff --git a/src/modules/bluetooth/rtp.h b/src/modules/bluetooth/rtp.h new file mode 100644 index 0000000..45fddcf --- /dev/null +++ b/src/modules/bluetooth/rtp.h @@ -0,0 +1,76 @@ +/* + * + * BlueZ - Bluetooth protocol stack for Linux + * + * Copyright (C) 2004-2010 Marcel Holtmann + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#if __BYTE_ORDER == __LITTLE_ENDIAN + +struct rtp_header { + unsigned cc:4; + unsigned x:1; + unsigned p:1; + unsigned v:2; + + unsigned pt:7; + unsigned m:1; + + uint16_t sequence_number; + uint32_t timestamp; + uint32_t ssrc; + uint32_t csrc[0]; +} __attribute__ ((packed)); + +struct rtp_payload { + unsigned frame_count:4; + unsigned rfa0:1; + unsigned is_last_fragment:1; + unsigned is_first_fragment:1; + unsigned is_fragmented:1; +} __attribute__ ((packed)); + +#elif __BYTE_ORDER == __BIG_ENDIAN + +struct rtp_header { + unsigned v:2; + unsigned p:1; + unsigned x:1; + unsigned cc:4; + + unsigned m:1; + unsigned pt:7; + + uint16_t sequence_number; + uint32_t timestamp; + uint32_t ssrc; + uint32_t csrc[0]; +} __attribute__ ((packed)); + +struct rtp_payload { + unsigned is_fragmented:1; + unsigned is_first_fragment:1; + unsigned is_last_fragment:1; + unsigned rfa0:1; + unsigned frame_count:4; +} __attribute__ ((packed)); + +#else +#error "Unknown byte order" +#endif diff --git a/src/modules/bluetooth/sbc/sbc.c b/src/modules/bluetooth/sbc/sbc.c new file mode 100644 index 0000000..77fcc5d --- /dev/null +++ b/src/modules/bluetooth/sbc/sbc.c @@ -0,0 +1,1234 @@ +/* + * + * Bluetooth low-complexity, subband codec (SBC) library + * + * Copyright (C) 2008-2010 Nokia Corporation + * Copyright (C) 2004-2010 Marcel Holtmann + * Copyright (C) 2004-2005 Henryk Ploetz + * Copyright (C) 2005-2008 Brad Midgley + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* todo items: + + use a log2 table for byte integer scale factors calculation (sum log2 results + for high and low bytes) fill bitpool by 16 bits instead of one at a time in + bits allocation/bitpool generation port to the dsp + +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include +#include +#include + +#include "sbc_math.h" +#include "sbc_tables.h" + +#include "sbc.h" +#include "sbc_primitives.h" + +#define SBC_SYNCWORD 0x9C + +/* This structure contains an unpacked SBC frame. + Yes, there is probably quite some unused space herein */ +struct sbc_frame { + uint8_t frequency; + uint8_t block_mode; + uint8_t blocks; + enum { + MONO = SBC_MODE_MONO, + DUAL_CHANNEL = SBC_MODE_DUAL_CHANNEL, + STEREO = SBC_MODE_STEREO, + JOINT_STEREO = SBC_MODE_JOINT_STEREO + } mode; + uint8_t channels; + enum { + LOUDNESS = SBC_AM_LOUDNESS, + SNR = SBC_AM_SNR + } allocation; + uint8_t subband_mode; + uint8_t subbands; + uint8_t bitpool; + uint16_t codesize; + uint8_t length; + + /* bit number x set means joint stereo has been used in subband x */ + uint8_t joint; + + /* only the lower 4 bits of every element are to be used */ + uint32_t SBC_ALIGNED scale_factor[2][8]; + + /* raw integer subband samples in the frame */ + int32_t SBC_ALIGNED sb_sample_f[16][2][8]; + + /* modified subband samples */ + int32_t SBC_ALIGNED sb_sample[16][2][8]; + + /* original pcm audio samples */ + int16_t SBC_ALIGNED pcm_sample[2][16*8]; +}; + +struct sbc_decoder_state { + int subbands; + int32_t V[2][170]; + int offset[2][16]; +}; + +/* + * Calculates the CRC-8 of the first len bits in data + */ +static const uint8_t crc_table[256] = { + 0x00, 0x1D, 0x3A, 0x27, 0x74, 0x69, 0x4E, 0x53, + 0xE8, 0xF5, 0xD2, 0xCF, 0x9C, 0x81, 0xA6, 0xBB, + 0xCD, 0xD0, 0xF7, 0xEA, 0xB9, 0xA4, 0x83, 0x9E, + 0x25, 0x38, 0x1F, 0x02, 0x51, 0x4C, 0x6B, 0x76, + 0x87, 0x9A, 0xBD, 0xA0, 0xF3, 0xEE, 0xC9, 0xD4, + 0x6F, 0x72, 0x55, 0x48, 0x1B, 0x06, 0x21, 0x3C, + 0x4A, 0x57, 0x70, 0x6D, 0x3E, 0x23, 0x04, 0x19, + 0xA2, 0xBF, 0x98, 0x85, 0xD6, 0xCB, 0xEC, 0xF1, + 0x13, 0x0E, 0x29, 0x34, 0x67, 0x7A, 0x5D, 0x40, + 0xFB, 0xE6, 0xC1, 0xDC, 0x8F, 0x92, 0xB5, 0xA8, + 0xDE, 0xC3, 0xE4, 0xF9, 0xAA, 0xB7, 0x90, 0x8D, + 0x36, 0x2B, 0x0C, 0x11, 0x42, 0x5F, 0x78, 0x65, + 0x94, 0x89, 0xAE, 0xB3, 0xE0, 0xFD, 0xDA, 0xC7, + 0x7C, 0x61, 0x46, 0x5B, 0x08, 0x15, 0x32, 0x2F, + 0x59, 0x44, 0x63, 0x7E, 0x2D, 0x30, 0x17, 0x0A, + 0xB1, 0xAC, 0x8B, 0x96, 0xC5, 0xD8, 0xFF, 0xE2, + 0x26, 0x3B, 0x1C, 0x01, 0x52, 0x4F, 0x68, 0x75, + 0xCE, 0xD3, 0xF4, 0xE9, 0xBA, 0xA7, 0x80, 0x9D, + 0xEB, 0xF6, 0xD1, 0xCC, 0x9F, 0x82, 0xA5, 0xB8, + 0x03, 0x1E, 0x39, 0x24, 0x77, 0x6A, 0x4D, 0x50, + 0xA1, 0xBC, 0x9B, 0x86, 0xD5, 0xC8, 0xEF, 0xF2, + 0x49, 0x54, 0x73, 0x6E, 0x3D, 0x20, 0x07, 0x1A, + 0x6C, 0x71, 0x56, 0x4B, 0x18, 0x05, 0x22, 0x3F, + 0x84, 0x99, 0xBE, 0xA3, 0xF0, 0xED, 0xCA, 0xD7, + 0x35, 0x28, 0x0F, 0x12, 0x41, 0x5C, 0x7B, 0x66, + 0xDD, 0xC0, 0xE7, 0xFA, 0xA9, 0xB4, 0x93, 0x8E, + 0xF8, 0xE5, 0xC2, 0xDF, 0x8C, 0x91, 0xB6, 0xAB, + 0x10, 0x0D, 0x2A, 0x37, 0x64, 0x79, 0x5E, 0x43, + 0xB2, 0xAF, 0x88, 0x95, 0xC6, 0xDB, 0xFC, 0xE1, + 0x5A, 0x47, 0x60, 0x7D, 0x2E, 0x33, 0x14, 0x09, + 0x7F, 0x62, 0x45, 0x58, 0x0B, 0x16, 0x31, 0x2C, + 0x97, 0x8A, 0xAD, 0xB0, 0xE3, 0xFE, 0xD9, 0xC4 +}; + +static uint8_t sbc_crc8(const uint8_t *data, size_t len) +{ + uint8_t crc = 0x0f; + size_t i; + uint8_t octet; + + for (i = 0; i < len / 8; i++) + crc = crc_table[crc ^ data[i]]; + + octet = data[i]; + for (i = 0; i < len % 8; i++) { + char bit = ((octet ^ crc) & 0x80) >> 7; + + crc = ((crc & 0x7f) << 1) ^ (bit ? 0x1d : 0); + + octet = octet << 1; + } + + return crc; +} + +/* + * Code straight from the spec to calculate the bits array + * Takes a pointer to the frame in question, a pointer to the bits array and + * the sampling frequency (as 2 bit integer) + */ +static SBC_ALWAYS_INLINE void sbc_calculate_bits_internal( + const struct sbc_frame *frame, int (*bits)[8], int subbands) +{ + uint8_t sf = frame->frequency; + + if (frame->mode == MONO || frame->mode == DUAL_CHANNEL) { + int bitneed[2][8], loudness, max_bitneed, bitcount, slicecount, bitslice; + int ch, sb; + + for (ch = 0; ch < frame->channels; ch++) { + max_bitneed = 0; + if (frame->allocation == SNR) { + for (sb = 0; sb < subbands; sb++) { + bitneed[ch][sb] = frame->scale_factor[ch][sb]; + if (bitneed[ch][sb] > max_bitneed) + max_bitneed = bitneed[ch][sb]; + } + } else { + for (sb = 0; sb < subbands; sb++) { + if (frame->scale_factor[ch][sb] == 0) + bitneed[ch][sb] = -5; + else { + if (subbands == 4) + loudness = frame->scale_factor[ch][sb] - sbc_offset4[sf][sb]; + else + loudness = frame->scale_factor[ch][sb] - sbc_offset8[sf][sb]; + if (loudness > 0) + bitneed[ch][sb] = loudness / 2; + else + bitneed[ch][sb] = loudness; + } + if (bitneed[ch][sb] > max_bitneed) + max_bitneed = bitneed[ch][sb]; + } + } + + bitcount = 0; + slicecount = 0; + bitslice = max_bitneed + 1; + do { + bitslice--; + bitcount += slicecount; + slicecount = 0; + for (sb = 0; sb < subbands; sb++) { + if ((bitneed[ch][sb] > bitslice + 1) && (bitneed[ch][sb] < bitslice + 16)) + slicecount++; + else if (bitneed[ch][sb] == bitslice + 1) + slicecount += 2; + } + } while (bitcount + slicecount < frame->bitpool); + + if (bitcount + slicecount == frame->bitpool) { + bitcount += slicecount; + bitslice--; + } + + for (sb = 0; sb < subbands; sb++) { + if (bitneed[ch][sb] < bitslice + 2) + bits[ch][sb] = 0; + else { + bits[ch][sb] = bitneed[ch][sb] - bitslice; + if (bits[ch][sb] > 16) + bits[ch][sb] = 16; + } + } + + for (sb = 0; bitcount < frame->bitpool && + sb < subbands; sb++) { + if ((bits[ch][sb] >= 2) && (bits[ch][sb] < 16)) { + bits[ch][sb]++; + bitcount++; + } else if ((bitneed[ch][sb] == bitslice + 1) && (frame->bitpool > bitcount + 1)) { + bits[ch][sb] = 2; + bitcount += 2; + } + } + + for (sb = 0; bitcount < frame->bitpool && + sb < subbands; sb++) { + if (bits[ch][sb] < 16) { + bits[ch][sb]++; + bitcount++; + } + } + + } + + } else if (frame->mode == STEREO || frame->mode == JOINT_STEREO) { + int bitneed[2][8], loudness, max_bitneed, bitcount, slicecount, bitslice; + int ch, sb; + + max_bitneed = 0; + if (frame->allocation == SNR) { + for (ch = 0; ch < 2; ch++) { + for (sb = 0; sb < subbands; sb++) { + bitneed[ch][sb] = frame->scale_factor[ch][sb]; + if (bitneed[ch][sb] > max_bitneed) + max_bitneed = bitneed[ch][sb]; + } + } + } else { + for (ch = 0; ch < 2; ch++) { + for (sb = 0; sb < subbands; sb++) { + if (frame->scale_factor[ch][sb] == 0) + bitneed[ch][sb] = -5; + else { + if (subbands == 4) + loudness = frame->scale_factor[ch][sb] - sbc_offset4[sf][sb]; + else + loudness = frame->scale_factor[ch][sb] - sbc_offset8[sf][sb]; + if (loudness > 0) + bitneed[ch][sb] = loudness / 2; + else + bitneed[ch][sb] = loudness; + } + if (bitneed[ch][sb] > max_bitneed) + max_bitneed = bitneed[ch][sb]; + } + } + } + + bitcount = 0; + slicecount = 0; + bitslice = max_bitneed + 1; + do { + bitslice--; + bitcount += slicecount; + slicecount = 0; + for (ch = 0; ch < 2; ch++) { + for (sb = 0; sb < subbands; sb++) { + if ((bitneed[ch][sb] > bitslice + 1) && (bitneed[ch][sb] < bitslice + 16)) + slicecount++; + else if (bitneed[ch][sb] == bitslice + 1) + slicecount += 2; + } + } + } while (bitcount + slicecount < frame->bitpool); + + if (bitcount + slicecount == frame->bitpool) { + bitcount += slicecount; + bitslice--; + } + + for (ch = 0; ch < 2; ch++) { + for (sb = 0; sb < subbands; sb++) { + if (bitneed[ch][sb] < bitslice + 2) { + bits[ch][sb] = 0; + } else { + bits[ch][sb] = bitneed[ch][sb] - bitslice; + if (bits[ch][sb] > 16) + bits[ch][sb] = 16; + } + } + } + + ch = 0; + sb = 0; + while (bitcount < frame->bitpool) { + if ((bits[ch][sb] >= 2) && (bits[ch][sb] < 16)) { + bits[ch][sb]++; + bitcount++; + } else if ((bitneed[ch][sb] == bitslice + 1) && (frame->bitpool > bitcount + 1)) { + bits[ch][sb] = 2; + bitcount += 2; + } + if (ch == 1) { + ch = 0; + sb++; + if (sb >= subbands) + break; + } else + ch = 1; + } + + ch = 0; + sb = 0; + while (bitcount < frame->bitpool) { + if (bits[ch][sb] < 16) { + bits[ch][sb]++; + bitcount++; + } + if (ch == 1) { + ch = 0; + sb++; + if (sb >= subbands) + break; + } else + ch = 1; + } + + } + +} + +static void sbc_calculate_bits(const struct sbc_frame *frame, int (*bits)[8]) +{ + if (frame->subbands == 4) + sbc_calculate_bits_internal(frame, bits, 4); + else + sbc_calculate_bits_internal(frame, bits, 8); +} + +/* + * Unpacks a SBC frame at the beginning of the stream in data, + * which has at most len bytes into frame. + * Returns the length in bytes of the packed frame, or a negative + * value on error. The error codes are: + * + * -1 Data stream too short + * -2 Sync byte incorrect + * -3 CRC8 incorrect + * -4 Bitpool value out of bounds + */ +static int sbc_unpack_frame(const uint8_t *data, struct sbc_frame *frame, + size_t len) +{ + unsigned int consumed; + /* Will copy the parts of the header that are relevant to crc + * calculation here */ + uint8_t crc_header[11] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + int crc_pos = 0; + int32_t temp; + + int audio_sample; + int ch, sb, blk, bit; /* channel, subband, block and bit standard + counters */ + int bits[2][8]; /* bits distribution */ + uint32_t levels[2][8]; /* levels derived from that */ + + if (len < 4) + return -1; + + if (data[0] != SBC_SYNCWORD) + return -2; + + frame->frequency = (data[1] >> 6) & 0x03; + + frame->block_mode = (data[1] >> 4) & 0x03; + switch (frame->block_mode) { + case SBC_BLK_4: + frame->blocks = 4; + break; + case SBC_BLK_8: + frame->blocks = 8; + break; + case SBC_BLK_12: + frame->blocks = 12; + break; + case SBC_BLK_16: + frame->blocks = 16; + break; + } + + frame->mode = (data[1] >> 2) & 0x03; + switch (frame->mode) { + case MONO: + frame->channels = 1; + break; + case DUAL_CHANNEL: /* fall-through */ + case STEREO: + case JOINT_STEREO: + frame->channels = 2; + break; + } + + frame->allocation = (data[1] >> 1) & 0x01; + + frame->subband_mode = (data[1] & 0x01); + frame->subbands = frame->subband_mode ? 8 : 4; + + frame->bitpool = data[2]; + + if ((frame->mode == MONO || frame->mode == DUAL_CHANNEL) && + frame->bitpool > 16 * frame->subbands) + return -4; + + if ((frame->mode == STEREO || frame->mode == JOINT_STEREO) && + frame->bitpool > 32 * frame->subbands) + return -4; + + /* data[3] is crc, we're checking it later */ + + consumed = 32; + + crc_header[0] = data[1]; + crc_header[1] = data[2]; + crc_pos = 16; + + if (frame->mode == JOINT_STEREO) { + if (len * 8 < consumed + frame->subbands) + return -1; + + frame->joint = 0x00; + for (sb = 0; sb < frame->subbands - 1; sb++) + frame->joint |= ((data[4] >> (7 - sb)) & 0x01) << sb; + if (frame->subbands == 4) + crc_header[crc_pos / 8] = data[4] & 0xf0; + else + crc_header[crc_pos / 8] = data[4]; + + consumed += frame->subbands; + crc_pos += frame->subbands; + } + + if (len * 8 < consumed + (4 * frame->subbands * frame->channels)) + return -1; + + for (ch = 0; ch < frame->channels; ch++) { + for (sb = 0; sb < frame->subbands; sb++) { + /* FIXME assert(consumed % 4 == 0); */ + frame->scale_factor[ch][sb] = + (data[consumed >> 3] >> (4 - (consumed & 0x7))) & 0x0F; + crc_header[crc_pos >> 3] |= + frame->scale_factor[ch][sb] << (4 - (crc_pos & 0x7)); + + consumed += 4; + crc_pos += 4; + } + } + + if (data[3] != sbc_crc8(crc_header, crc_pos)) + return -3; + + sbc_calculate_bits(frame, bits); + + for (ch = 0; ch < frame->channels; ch++) { + for (sb = 0; sb < frame->subbands; sb++) + levels[ch][sb] = (1 << bits[ch][sb]) - 1; + } + + for (blk = 0; blk < frame->blocks; blk++) { + for (ch = 0; ch < frame->channels; ch++) { + for (sb = 0; sb < frame->subbands; sb++) { + if (levels[ch][sb] > 0) { + audio_sample = 0; + for (bit = 0; bit < bits[ch][sb]; bit++) { + if (consumed > len * 8) + return -1; + + if ((data[consumed >> 3] >> (7 - (consumed & 0x7))) & 0x01) + audio_sample |= 1 << (bits[ch][sb] - bit - 1); + + consumed++; + } + + frame->sb_sample[blk][ch][sb] = + (((audio_sample << 1) | 1) << frame->scale_factor[ch][sb]) / + levels[ch][sb] - (1 << frame->scale_factor[ch][sb]); + } else + frame->sb_sample[blk][ch][sb] = 0; + } + } + } + + if (frame->mode == JOINT_STEREO) { + for (blk = 0; blk < frame->blocks; blk++) { + for (sb = 0; sb < frame->subbands; sb++) { + if (frame->joint & (0x01 << sb)) { + temp = frame->sb_sample[blk][0][sb] + + frame->sb_sample[blk][1][sb]; + frame->sb_sample[blk][1][sb] = + frame->sb_sample[blk][0][sb] - + frame->sb_sample[blk][1][sb]; + frame->sb_sample[blk][0][sb] = temp; + } + } + } + } + + if ((consumed & 0x7) != 0) + consumed += 8 - (consumed & 0x7); + + return consumed >> 3; +} + +static void sbc_decoder_init(struct sbc_decoder_state *state, + const struct sbc_frame *frame) +{ + int i, ch; + + memset(state->V, 0, sizeof(state->V)); + state->subbands = frame->subbands; + + for (ch = 0; ch < 2; ch++) + for (i = 0; i < frame->subbands * 2; i++) + state->offset[ch][i] = (10 * i + 10); +} + +static SBC_ALWAYS_INLINE int16_t sbc_clip16(int32_t s) +{ + if (s > 0x7FFF) + return 0x7FFF; + else if (s < -0x8000) + return -0x8000; + else + return s; +} + +static inline void sbc_synthesize_four(struct sbc_decoder_state *state, + struct sbc_frame *frame, int ch, int blk) +{ + int i, k, idx; + int32_t *v = state->V[ch]; + int *offset = state->offset[ch]; + + for (i = 0; i < 8; i++) { + /* Shifting */ + offset[i]--; + if (offset[i] < 0) { + offset[i] = 79; + memcpy(v + 80, v, 9 * sizeof(*v)); + } + + /* Distribute the new matrix value to the shifted position */ + v[offset[i]] = SCALE4_STAGED1( + MULA(synmatrix4[i][0], frame->sb_sample[blk][ch][0], + MULA(synmatrix4[i][1], frame->sb_sample[blk][ch][1], + MULA(synmatrix4[i][2], frame->sb_sample[blk][ch][2], + MUL (synmatrix4[i][3], frame->sb_sample[blk][ch][3]))))); + } + + /* Compute the samples */ + for (idx = 0, i = 0; i < 4; i++, idx += 5) { + k = (i + 4) & 0xf; + + /* Store in output, Q0 */ + frame->pcm_sample[ch][blk * 4 + i] = sbc_clip16(SCALE4_STAGED1( + MULA(v[offset[i] + 0], sbc_proto_4_40m0[idx + 0], + MULA(v[offset[k] + 1], sbc_proto_4_40m1[idx + 0], + MULA(v[offset[i] + 2], sbc_proto_4_40m0[idx + 1], + MULA(v[offset[k] + 3], sbc_proto_4_40m1[idx + 1], + MULA(v[offset[i] + 4], sbc_proto_4_40m0[idx + 2], + MULA(v[offset[k] + 5], sbc_proto_4_40m1[idx + 2], + MULA(v[offset[i] + 6], sbc_proto_4_40m0[idx + 3], + MULA(v[offset[k] + 7], sbc_proto_4_40m1[idx + 3], + MULA(v[offset[i] + 8], sbc_proto_4_40m0[idx + 4], + MUL( v[offset[k] + 9], sbc_proto_4_40m1[idx + 4])))))))))))); + } +} + +static inline void sbc_synthesize_eight(struct sbc_decoder_state *state, + struct sbc_frame *frame, int ch, int blk) +{ + int i, j, k, idx; + int *offset = state->offset[ch]; + + for (i = 0; i < 16; i++) { + /* Shifting */ + offset[i]--; + if (offset[i] < 0) { + offset[i] = 159; + for (j = 0; j < 9; j++) + state->V[ch][j + 160] = state->V[ch][j]; + } + + /* Distribute the new matrix value to the shifted position */ + state->V[ch][offset[i]] = SCALE8_STAGED1( + MULA(synmatrix8[i][0], frame->sb_sample[blk][ch][0], + MULA(synmatrix8[i][1], frame->sb_sample[blk][ch][1], + MULA(synmatrix8[i][2], frame->sb_sample[blk][ch][2], + MULA(synmatrix8[i][3], frame->sb_sample[blk][ch][3], + MULA(synmatrix8[i][4], frame->sb_sample[blk][ch][4], + MULA(synmatrix8[i][5], frame->sb_sample[blk][ch][5], + MULA(synmatrix8[i][6], frame->sb_sample[blk][ch][6], + MUL( synmatrix8[i][7], frame->sb_sample[blk][ch][7]))))))))); + } + + /* Compute the samples */ + for (idx = 0, i = 0; i < 8; i++, idx += 5) { + k = (i + 8) & 0xf; + + /* Store in output, Q0 */ + frame->pcm_sample[ch][blk * 8 + i] = sbc_clip16(SCALE8_STAGED1( + MULA(state->V[ch][offset[i] + 0], sbc_proto_8_80m0[idx + 0], + MULA(state->V[ch][offset[k] + 1], sbc_proto_8_80m1[idx + 0], + MULA(state->V[ch][offset[i] + 2], sbc_proto_8_80m0[idx + 1], + MULA(state->V[ch][offset[k] + 3], sbc_proto_8_80m1[idx + 1], + MULA(state->V[ch][offset[i] + 4], sbc_proto_8_80m0[idx + 2], + MULA(state->V[ch][offset[k] + 5], sbc_proto_8_80m1[idx + 2], + MULA(state->V[ch][offset[i] + 6], sbc_proto_8_80m0[idx + 3], + MULA(state->V[ch][offset[k] + 7], sbc_proto_8_80m1[idx + 3], + MULA(state->V[ch][offset[i] + 8], sbc_proto_8_80m0[idx + 4], + MUL( state->V[ch][offset[k] + 9], sbc_proto_8_80m1[idx + 4])))))))))))); + } +} + +static int sbc_synthesize_audio(struct sbc_decoder_state *state, + struct sbc_frame *frame) +{ + int ch, blk; + + switch (frame->subbands) { + case 4: + for (ch = 0; ch < frame->channels; ch++) { + for (blk = 0; blk < frame->blocks; blk++) + sbc_synthesize_four(state, frame, ch, blk); + } + return frame->blocks * 4; + + case 8: + for (ch = 0; ch < frame->channels; ch++) { + for (blk = 0; blk < frame->blocks; blk++) + sbc_synthesize_eight(state, frame, ch, blk); + } + return frame->blocks * 8; + + default: + return -EIO; + } +} + +static int sbc_analyze_audio(struct sbc_encoder_state *state, + struct sbc_frame *frame) +{ + int ch, blk; + int16_t *x; + + switch (frame->subbands) { + case 4: + for (ch = 0; ch < frame->channels; ch++) { + x = &state->X[ch][state->position - 16 + + frame->blocks * 4]; + for (blk = 0; blk < frame->blocks; blk += 4) { + state->sbc_analyze_4b_4s( + x, + frame->sb_sample_f[blk][ch], + frame->sb_sample_f[blk + 1][ch] - + frame->sb_sample_f[blk][ch]); + x -= 16; + } + } + return frame->blocks * 4; + + case 8: + for (ch = 0; ch < frame->channels; ch++) { + x = &state->X[ch][state->position - 32 + + frame->blocks * 8]; + for (blk = 0; blk < frame->blocks; blk += 4) { + state->sbc_analyze_4b_8s( + x, + frame->sb_sample_f[blk][ch], + frame->sb_sample_f[blk + 1][ch] - + frame->sb_sample_f[blk][ch]); + x -= 32; + } + } + return frame->blocks * 8; + + default: + return -EIO; + } +} + +/* Supplementary bitstream writing macros for 'sbc_pack_frame' */ + +#define PUT_BITS(data_ptr, bits_cache, bits_count, v, n) \ + do { \ + bits_cache = (v) | (bits_cache << (n)); \ + bits_count += (n); \ + if (bits_count >= 16) { \ + bits_count -= 8; \ + *data_ptr++ = (uint8_t) \ + (bits_cache >> bits_count); \ + bits_count -= 8; \ + *data_ptr++ = (uint8_t) \ + (bits_cache >> bits_count); \ + } \ + } while (0) + +#define FLUSH_BITS(data_ptr, bits_cache, bits_count) \ + do { \ + while (bits_count >= 8) { \ + bits_count -= 8; \ + *data_ptr++ = (uint8_t) \ + (bits_cache >> bits_count); \ + } \ + if (bits_count > 0) \ + *data_ptr++ = (uint8_t) \ + (bits_cache << (8 - bits_count)); \ + } while (0) + +/* + * Packs the SBC frame from frame into the memory at data. At most len + * bytes will be used, should more memory be needed an appropriate + * error code will be returned. Returns the length of the packed frame + * on success or a negative value on error. + * + * The error codes are: + * -1 Not enough memory reserved + * -2 Unsupported sampling rate + * -3 Unsupported number of blocks + * -4 Unsupported number of subbands + * -5 Bitpool value out of bounds + * -99 not implemented + */ + +static SBC_ALWAYS_INLINE ssize_t sbc_pack_frame_internal(uint8_t *data, + struct sbc_frame *frame, size_t len, + int frame_subbands, int frame_channels, + int joint) +{ + /* Bitstream writer starts from the fourth byte */ + uint8_t *data_ptr = data + 4; + uint32_t bits_cache = 0; + uint32_t bits_count = 0; + + /* Will copy the header parts for CRC-8 calculation here */ + uint8_t crc_header[11] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + int crc_pos = 0; + + uint32_t audio_sample; + + int ch, sb, blk; /* channel, subband, block and bit counters */ + int bits[2][8]; /* bits distribution */ + uint32_t levels[2][8]; /* levels are derived from that */ + uint32_t sb_sample_delta[2][8]; + + data[0] = SBC_SYNCWORD; + + data[1] = (frame->frequency & 0x03) << 6; + + data[1] |= (frame->block_mode & 0x03) << 4; + + data[1] |= (frame->mode & 0x03) << 2; + + data[1] |= (frame->allocation & 0x01) << 1; + + switch (frame_subbands) { + case 4: + /* Nothing to do */ + break; + case 8: + data[1] |= 0x01; + break; + default: + return -4; + break; + } + + data[2] = frame->bitpool; + + if ((frame->mode == MONO || frame->mode == DUAL_CHANNEL) && + frame->bitpool > frame_subbands << 4) + return -5; + + if ((frame->mode == STEREO || frame->mode == JOINT_STEREO) && + frame->bitpool > frame_subbands << 5) + return -5; + + /* Can't fill in crc yet */ + + crc_header[0] = data[1]; + crc_header[1] = data[2]; + crc_pos = 16; + + if (frame->mode == JOINT_STEREO) { + PUT_BITS(data_ptr, bits_cache, bits_count, + joint, frame_subbands); + crc_header[crc_pos >> 3] = joint; + crc_pos += frame_subbands; + } + + for (ch = 0; ch < frame_channels; ch++) { + for (sb = 0; sb < frame_subbands; sb++) { + PUT_BITS(data_ptr, bits_cache, bits_count, + frame->scale_factor[ch][sb] & 0x0F, 4); + crc_header[crc_pos >> 3] <<= 4; + crc_header[crc_pos >> 3] |= frame->scale_factor[ch][sb] & 0x0F; + crc_pos += 4; + } + } + + /* align the last crc byte */ + if (crc_pos % 8) + crc_header[crc_pos >> 3] <<= 8 - (crc_pos % 8); + + data[3] = sbc_crc8(crc_header, crc_pos); + + sbc_calculate_bits(frame, bits); + + for (ch = 0; ch < frame_channels; ch++) { + for (sb = 0; sb < frame_subbands; sb++) { + levels[ch][sb] = ((1 << bits[ch][sb]) - 1) << + (32 - (frame->scale_factor[ch][sb] + + SCALE_OUT_BITS + 2)); + sb_sample_delta[ch][sb] = (uint32_t) 1 << + (frame->scale_factor[ch][sb] + + SCALE_OUT_BITS + 1); + } + } + + for (blk = 0; blk < frame->blocks; blk++) { + for (ch = 0; ch < frame_channels; ch++) { + for (sb = 0; sb < frame_subbands; sb++) { + + if (bits[ch][sb] == 0) + continue; + + audio_sample = ((uint64_t) levels[ch][sb] * + (sb_sample_delta[ch][sb] + + frame->sb_sample_f[blk][ch][sb])) >> 32; + + PUT_BITS(data_ptr, bits_cache, bits_count, + audio_sample, bits[ch][sb]); + } + } + } + + FLUSH_BITS(data_ptr, bits_cache, bits_count); + + return data_ptr - data; +} + +static ssize_t sbc_pack_frame(uint8_t *data, struct sbc_frame *frame, size_t len, + int joint) +{ + if (frame->subbands == 4) { + if (frame->channels == 1) + return sbc_pack_frame_internal( + data, frame, len, 4, 1, joint); + else + return sbc_pack_frame_internal( + data, frame, len, 4, 2, joint); + } else { + if (frame->channels == 1) + return sbc_pack_frame_internal( + data, frame, len, 8, 1, joint); + else + return sbc_pack_frame_internal( + data, frame, len, 8, 2, joint); + } +} + +static void sbc_encoder_init(struct sbc_encoder_state *state, + const struct sbc_frame *frame) +{ + memset(&state->X, 0, sizeof(state->X)); + state->position = (SBC_X_BUFFER_SIZE - frame->subbands * 9) & ~7; + + sbc_init_primitives(state); +} + +struct sbc_priv { + int init; + struct SBC_ALIGNED sbc_frame frame; + struct SBC_ALIGNED sbc_decoder_state dec_state; + struct SBC_ALIGNED sbc_encoder_state enc_state; +}; + +static void sbc_set_defaults(sbc_t *sbc, unsigned long flags) +{ + sbc->frequency = SBC_FREQ_44100; + sbc->mode = SBC_MODE_STEREO; + sbc->subbands = SBC_SB_8; + sbc->blocks = SBC_BLK_16; + sbc->bitpool = 32; +#if __BYTE_ORDER == __LITTLE_ENDIAN + sbc->endian = SBC_LE; +#elif __BYTE_ORDER == __BIG_ENDIAN + sbc->endian = SBC_BE; +#else +#error "Unknown byte order" +#endif +} + +int sbc_init(sbc_t *sbc, unsigned long flags) +{ + if (!sbc) + return -EIO; + + memset(sbc, 0, sizeof(sbc_t)); + + sbc->priv_alloc_base = malloc(sizeof(struct sbc_priv) + SBC_ALIGN_MASK); + if (!sbc->priv_alloc_base) + return -ENOMEM; + + sbc->priv = (void *) (((uintptr_t) sbc->priv_alloc_base + + SBC_ALIGN_MASK) & ~((uintptr_t) SBC_ALIGN_MASK)); + + memset(sbc->priv, 0, sizeof(struct sbc_priv)); + + sbc_set_defaults(sbc, flags); + + return 0; +} + +ssize_t sbc_parse(sbc_t *sbc, const void *input, size_t input_len) +{ + return sbc_decode(sbc, input, input_len, NULL, 0, NULL); +} + +ssize_t sbc_decode(sbc_t *sbc, const void *input, size_t input_len, + void *output, size_t output_len, size_t *written) +{ + struct sbc_priv *priv; + char *ptr; + int i, ch, framelen, samples; + + if (!sbc || !input) + return -EIO; + + priv = sbc->priv; + + framelen = sbc_unpack_frame(input, &priv->frame, input_len); + + if (!priv->init) { + sbc_decoder_init(&priv->dec_state, &priv->frame); + priv->init = 1; + + sbc->frequency = priv->frame.frequency; + sbc->mode = priv->frame.mode; + sbc->subbands = priv->frame.subband_mode; + sbc->blocks = priv->frame.block_mode; + sbc->allocation = priv->frame.allocation; + sbc->bitpool = priv->frame.bitpool; + + priv->frame.codesize = sbc_get_codesize(sbc); + priv->frame.length = framelen; + } else if (priv->frame.bitpool != sbc->bitpool) { + priv->frame.length = framelen; + sbc->bitpool = priv->frame.bitpool; + } + + if (!output) + return framelen; + + if (written) + *written = 0; + + if (framelen <= 0) + return framelen; + + samples = sbc_synthesize_audio(&priv->dec_state, &priv->frame); + + ptr = output; + + if (output_len < (size_t) (samples * priv->frame.channels * 2)) + samples = output_len / (priv->frame.channels * 2); + + for (i = 0; i < samples; i++) { + for (ch = 0; ch < priv->frame.channels; ch++) { + int16_t s; + s = priv->frame.pcm_sample[ch][i]; + + if (sbc->endian == SBC_BE) { + *ptr++ = (s & 0xff00) >> 8; + *ptr++ = (s & 0x00ff); + } else { + *ptr++ = (s & 0x00ff); + *ptr++ = (s & 0xff00) >> 8; + } + } + } + + if (written) + *written = samples * priv->frame.channels * 2; + + return framelen; +} + +ssize_t sbc_encode(sbc_t *sbc, const void *input, size_t input_len, + void *output, size_t output_len, ssize_t *written) +{ + struct sbc_priv *priv; + int samples; + ssize_t framelen; + int (*sbc_enc_process_input)(int position, + const uint8_t *pcm, int16_t X[2][SBC_X_BUFFER_SIZE], + int nsamples, int nchannels); + + if (!sbc || !input) + return -EIO; + + priv = sbc->priv; + + if (written) + *written = 0; + + if (!priv->init) { + priv->frame.frequency = sbc->frequency; + priv->frame.mode = sbc->mode; + priv->frame.channels = sbc->mode == SBC_MODE_MONO ? 1 : 2; + priv->frame.allocation = sbc->allocation; + priv->frame.subband_mode = sbc->subbands; + priv->frame.subbands = sbc->subbands ? 8 : 4; + priv->frame.block_mode = sbc->blocks; + priv->frame.blocks = 4 + (sbc->blocks * 4); + priv->frame.bitpool = sbc->bitpool; + priv->frame.codesize = sbc_get_codesize(sbc); + priv->frame.length = sbc_get_frame_length(sbc); + + sbc_encoder_init(&priv->enc_state, &priv->frame); + priv->init = 1; + } else if (priv->frame.bitpool != sbc->bitpool) { + priv->frame.length = sbc_get_frame_length(sbc); + priv->frame.bitpool = sbc->bitpool; + } + + /* input must be large enough to encode a complete frame */ + if (input_len < priv->frame.codesize) + return 0; + + /* output must be large enough to receive the encoded frame */ + if (!output || output_len < priv->frame.length) + return -ENOSPC; + + /* Select the needed input data processing function and call it */ + if (priv->frame.subbands == 8) { + if (sbc->endian == SBC_BE) + sbc_enc_process_input = + priv->enc_state.sbc_enc_process_input_8s_be; + else + sbc_enc_process_input = + priv->enc_state.sbc_enc_process_input_8s_le; + } else { + if (sbc->endian == SBC_BE) + sbc_enc_process_input = + priv->enc_state.sbc_enc_process_input_4s_be; + else + sbc_enc_process_input = + priv->enc_state.sbc_enc_process_input_4s_le; + } + + priv->enc_state.position = sbc_enc_process_input( + priv->enc_state.position, (const uint8_t *) input, + priv->enc_state.X, priv->frame.subbands * priv->frame.blocks, + priv->frame.channels); + + samples = sbc_analyze_audio(&priv->enc_state, &priv->frame); + + if (priv->frame.mode == JOINT_STEREO) { + int j = priv->enc_state.sbc_calc_scalefactors_j( + priv->frame.sb_sample_f, priv->frame.scale_factor, + priv->frame.blocks, priv->frame.subbands); + framelen = sbc_pack_frame(output, &priv->frame, output_len, j); + } else { + priv->enc_state.sbc_calc_scalefactors( + priv->frame.sb_sample_f, priv->frame.scale_factor, + priv->frame.blocks, priv->frame.channels, + priv->frame.subbands); + framelen = sbc_pack_frame(output, &priv->frame, output_len, 0); + } + + if (written) + *written = framelen; + + return samples * priv->frame.channels * 2; +} + +void sbc_finish(sbc_t *sbc) +{ + if (!sbc) + return; + + free(sbc->priv_alloc_base); + + memset(sbc, 0, sizeof(sbc_t)); +} + +size_t sbc_get_frame_length(sbc_t *sbc) +{ + int ret; + uint8_t subbands, channels, blocks, joint, bitpool; + struct sbc_priv *priv; + + priv = sbc->priv; + if (priv->init && priv->frame.bitpool == sbc->bitpool) + return priv->frame.length; + + subbands = sbc->subbands ? 8 : 4; + blocks = 4 + (sbc->blocks * 4); + channels = sbc->mode == SBC_MODE_MONO ? 1 : 2; + joint = sbc->mode == SBC_MODE_JOINT_STEREO ? 1 : 0; + bitpool = sbc->bitpool; + + ret = 4 + (4 * subbands * channels) / 8; + /* This term is not always evenly divide so we round it up */ + if (channels == 1) + ret += ((blocks * channels * bitpool) + 7) / 8; + else + ret += (((joint ? subbands : 0) + blocks * bitpool) + 7) / 8; + + return ret; +} + +unsigned sbc_get_frame_duration(sbc_t *sbc) +{ + uint8_t subbands, blocks; + uint16_t frequency; + struct sbc_priv *priv; + + priv = sbc->priv; + if (!priv->init) { + subbands = sbc->subbands ? 8 : 4; + blocks = 4 + (sbc->blocks * 4); + } else { + subbands = priv->frame.subbands; + blocks = priv->frame.blocks; + } + + switch (sbc->frequency) { + case SBC_FREQ_16000: + frequency = 16000; + break; + + case SBC_FREQ_32000: + frequency = 32000; + break; + + case SBC_FREQ_44100: + frequency = 44100; + break; + + case SBC_FREQ_48000: + frequency = 48000; + break; + default: + return 0; + } + + return (1000000 * blocks * subbands) / frequency; +} + +size_t sbc_get_codesize(sbc_t *sbc) +{ + uint16_t subbands, channels, blocks; + struct sbc_priv *priv; + + priv = sbc->priv; + if (!priv->init) { + subbands = sbc->subbands ? 8 : 4; + blocks = 4 + (sbc->blocks * 4); + channels = sbc->mode == SBC_MODE_MONO ? 1 : 2; + } else { + subbands = priv->frame.subbands; + blocks = priv->frame.blocks; + channels = priv->frame.channels; + } + + return subbands * blocks * channels * 2; +} + +const char *sbc_get_implementation_info(sbc_t *sbc) +{ + struct sbc_priv *priv; + + if (!sbc) + return NULL; + + priv = sbc->priv; + if (!priv) + return NULL; + + return priv->enc_state.implementation_info; +} + +int sbc_reinit(sbc_t *sbc, unsigned long flags) +{ + struct sbc_priv *priv; + + if (!sbc || !sbc->priv) + return -EIO; + + priv = sbc->priv; + + if (priv->init == 1) + memset(sbc->priv, 0, sizeof(struct sbc_priv)); + + sbc_set_defaults(sbc, flags); + + return 0; +} diff --git a/src/modules/bluetooth/sbc/sbc.h b/src/modules/bluetooth/sbc/sbc.h new file mode 100644 index 0000000..2f830ad --- /dev/null +++ b/src/modules/bluetooth/sbc/sbc.h @@ -0,0 +1,113 @@ +/* + * + * Bluetooth low-complexity, subband codec (SBC) library + * + * Copyright (C) 2008-2010 Nokia Corporation + * Copyright (C) 2004-2010 Marcel Holtmann + * Copyright (C) 2004-2005 Henryk Ploetz + * Copyright (C) 2005-2006 Brad Midgley + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifndef __SBC_H +#define __SBC_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +/* sampling frequency */ +#define SBC_FREQ_16000 0x00 +#define SBC_FREQ_32000 0x01 +#define SBC_FREQ_44100 0x02 +#define SBC_FREQ_48000 0x03 + +/* blocks */ +#define SBC_BLK_4 0x00 +#define SBC_BLK_8 0x01 +#define SBC_BLK_12 0x02 +#define SBC_BLK_16 0x03 + +/* channel mode */ +#define SBC_MODE_MONO 0x00 +#define SBC_MODE_DUAL_CHANNEL 0x01 +#define SBC_MODE_STEREO 0x02 +#define SBC_MODE_JOINT_STEREO 0x03 + +/* allocation method */ +#define SBC_AM_LOUDNESS 0x00 +#define SBC_AM_SNR 0x01 + +/* subbands */ +#define SBC_SB_4 0x00 +#define SBC_SB_8 0x01 + +/* Data endianess */ +#define SBC_LE 0x00 +#define SBC_BE 0x01 + +struct sbc_struct { + unsigned long flags; + + uint8_t frequency; + uint8_t blocks; + uint8_t subbands; + uint8_t mode; + uint8_t allocation; + uint8_t bitpool; + uint8_t endian; + + void *priv; + void *priv_alloc_base; +}; + +typedef struct sbc_struct sbc_t; + +int sbc_init(sbc_t *sbc, unsigned long flags); +int sbc_reinit(sbc_t *sbc, unsigned long flags); + +ssize_t sbc_parse(sbc_t *sbc, const void *input, size_t input_len); + +/* Decodes ONE input block into ONE output block */ +ssize_t sbc_decode(sbc_t *sbc, const void *input, size_t input_len, + void *output, size_t output_len, size_t *written); + +/* Encodes ONE input block into ONE output block */ +ssize_t sbc_encode(sbc_t *sbc, const void *input, size_t input_len, + void *output, size_t output_len, ssize_t *written); + +/* Returns the output block size in bytes */ +size_t sbc_get_frame_length(sbc_t *sbc); + +/* Returns the time one input/output block takes to play in msec*/ +unsigned sbc_get_frame_duration(sbc_t *sbc); + +/* Returns the input block size in bytes */ +size_t sbc_get_codesize(sbc_t *sbc); + +const char *sbc_get_implementation_info(sbc_t *sbc); +void sbc_finish(sbc_t *sbc); + +#ifdef __cplusplus +} +#endif + +#endif /* __SBC_H */ diff --git a/src/modules/bluetooth/sbc/sbc_math.h b/src/modules/bluetooth/sbc/sbc_math.h new file mode 100644 index 0000000..5476860 --- /dev/null +++ b/src/modules/bluetooth/sbc/sbc_math.h @@ -0,0 +1,61 @@ +/* + * + * Bluetooth low-complexity, subband codec (SBC) library + * + * Copyright (C) 2008-2010 Nokia Corporation + * Copyright (C) 2004-2010 Marcel Holtmann + * Copyright (C) 2004-2005 Henryk Ploetz + * Copyright (C) 2005-2008 Brad Midgley + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#define fabs(x) ((x) < 0 ? -(x) : (x)) +/* C does not provide an explicit arithmetic shift right but this will + always be correct and every compiler *should* generate optimal code */ +#define ASR(val, bits) ((-2 >> 1 == -1) ? \ + ((int32_t)(val)) >> (bits) : ((int32_t) (val)) / (1 << (bits))) + +#define SCALE_SPROTO4_TBL 12 +#define SCALE_SPROTO8_TBL 14 +#define SCALE_NPROTO4_TBL 11 +#define SCALE_NPROTO8_TBL 11 +#define SCALE4_STAGED1_BITS 15 +#define SCALE4_STAGED2_BITS 16 +#define SCALE8_STAGED1_BITS 15 +#define SCALE8_STAGED2_BITS 16 + +typedef int32_t sbc_fixed_t; + +#define SCALE4_STAGED1(src) ASR(src, SCALE4_STAGED1_BITS) +#define SCALE4_STAGED2(src) ASR(src, SCALE4_STAGED2_BITS) +#define SCALE8_STAGED1(src) ASR(src, SCALE8_STAGED1_BITS) +#define SCALE8_STAGED2(src) ASR(src, SCALE8_STAGED2_BITS) + +#define SBC_FIXED_0(val) { val = 0; } +#define MUL(a, b) ((a) * (b)) +#if defined(__arm__) && (!defined(__thumb__) || defined(__thumb2__)) +#define MULA(a, b, res) ({ \ + int tmp = res; \ + __asm__( \ + "mla %0, %2, %3, %0" \ + : "=&r" (tmp) \ + : "0" (tmp), "r" (a), "r" (b)); \ + tmp; }) +#else +#define MULA(a, b, res) ((a) * (b) + (res)) +#endif diff --git a/src/modules/bluetooth/sbc/sbc_primitives.c b/src/modules/bluetooth/sbc/sbc_primitives.c new file mode 100644 index 0000000..ad780d0 --- /dev/null +++ b/src/modules/bluetooth/sbc/sbc_primitives.c @@ -0,0 +1,554 @@ +/* + * + * Bluetooth low-complexity, subband codec (SBC) library + * + * Copyright (C) 2008-2010 Nokia Corporation + * Copyright (C) 2004-2010 Marcel Holtmann + * Copyright (C) 2004-2005 Henryk Ploetz + * Copyright (C) 2005-2006 Brad Midgley + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include +#include +#include +#include "sbc.h" +#include "sbc_math.h" +#include "sbc_tables.h" + +#include "sbc_primitives.h" +#include "sbc_primitives_mmx.h" +#include "sbc_primitives_iwmmxt.h" +#include "sbc_primitives_neon.h" +#include "sbc_primitives_armv6.h" + +/* + * A reference C code of analysis filter with SIMD-friendly tables + * reordering and code layout. This code can be used to develop platform + * specific SIMD optimizations. Also it may be used as some kind of test + * for compiler autovectorization capabilities (who knows, if the compiler + * is very good at this stuff, hand optimized assembly may be not strictly + * needed for some platform). + * + * Note: It is also possible to make a simple variant of analysis filter, + * which needs only a single constants table without taking care about + * even/odd cases. This simple variant of filter can be implemented without + * input data permutation. The only thing that would be lost is the + * possibility to use pairwise SIMD multiplications. But for some simple + * CPU cores without SIMD extensions it can be useful. If anybody is + * interested in implementing such variant of a filter, sourcecode from + * bluez versions 4.26/4.27 can be used as a reference and the history of + * the changes in git repository done around that time may be worth checking. + */ + +static inline void sbc_analyze_four_simd(const int16_t *in, int32_t *out, + const FIXED_T *consts) +{ + FIXED_A t1[4]; + FIXED_T t2[4]; + int hop = 0; + + /* rounding coefficient */ + t1[0] = t1[1] = t1[2] = t1[3] = + (FIXED_A) 1 << (SBC_PROTO_FIXED4_SCALE - 1); + + /* low pass polyphase filter */ + for (hop = 0; hop < 40; hop += 8) { + t1[0] += (FIXED_A) in[hop] * consts[hop]; + t1[0] += (FIXED_A) in[hop + 1] * consts[hop + 1]; + t1[1] += (FIXED_A) in[hop + 2] * consts[hop + 2]; + t1[1] += (FIXED_A) in[hop + 3] * consts[hop + 3]; + t1[2] += (FIXED_A) in[hop + 4] * consts[hop + 4]; + t1[2] += (FIXED_A) in[hop + 5] * consts[hop + 5]; + t1[3] += (FIXED_A) in[hop + 6] * consts[hop + 6]; + t1[3] += (FIXED_A) in[hop + 7] * consts[hop + 7]; + } + + /* scaling */ + t2[0] = t1[0] >> SBC_PROTO_FIXED4_SCALE; + t2[1] = t1[1] >> SBC_PROTO_FIXED4_SCALE; + t2[2] = t1[2] >> SBC_PROTO_FIXED4_SCALE; + t2[3] = t1[3] >> SBC_PROTO_FIXED4_SCALE; + + /* do the cos transform */ + t1[0] = (FIXED_A) t2[0] * consts[40 + 0]; + t1[0] += (FIXED_A) t2[1] * consts[40 + 1]; + t1[1] = (FIXED_A) t2[0] * consts[40 + 2]; + t1[1] += (FIXED_A) t2[1] * consts[40 + 3]; + t1[2] = (FIXED_A) t2[0] * consts[40 + 4]; + t1[2] += (FIXED_A) t2[1] * consts[40 + 5]; + t1[3] = (FIXED_A) t2[0] * consts[40 + 6]; + t1[3] += (FIXED_A) t2[1] * consts[40 + 7]; + + t1[0] += (FIXED_A) t2[2] * consts[40 + 8]; + t1[0] += (FIXED_A) t2[3] * consts[40 + 9]; + t1[1] += (FIXED_A) t2[2] * consts[40 + 10]; + t1[1] += (FIXED_A) t2[3] * consts[40 + 11]; + t1[2] += (FIXED_A) t2[2] * consts[40 + 12]; + t1[2] += (FIXED_A) t2[3] * consts[40 + 13]; + t1[3] += (FIXED_A) t2[2] * consts[40 + 14]; + t1[3] += (FIXED_A) t2[3] * consts[40 + 15]; + + out[0] = t1[0] >> + (SBC_COS_TABLE_FIXED4_SCALE - SCALE_OUT_BITS); + out[1] = t1[1] >> + (SBC_COS_TABLE_FIXED4_SCALE - SCALE_OUT_BITS); + out[2] = t1[2] >> + (SBC_COS_TABLE_FIXED4_SCALE - SCALE_OUT_BITS); + out[3] = t1[3] >> + (SBC_COS_TABLE_FIXED4_SCALE - SCALE_OUT_BITS); +} + +static inline void sbc_analyze_eight_simd(const int16_t *in, int32_t *out, + const FIXED_T *consts) +{ + FIXED_A t1[8]; + FIXED_T t2[8]; + int i, hop; + + /* rounding coefficient */ + t1[0] = t1[1] = t1[2] = t1[3] = t1[4] = t1[5] = t1[6] = t1[7] = + (FIXED_A) 1 << (SBC_PROTO_FIXED8_SCALE-1); + + /* low pass polyphase filter */ + for (hop = 0; hop < 80; hop += 16) { + t1[0] += (FIXED_A) in[hop] * consts[hop]; + t1[0] += (FIXED_A) in[hop + 1] * consts[hop + 1]; + t1[1] += (FIXED_A) in[hop + 2] * consts[hop + 2]; + t1[1] += (FIXED_A) in[hop + 3] * consts[hop + 3]; + t1[2] += (FIXED_A) in[hop + 4] * consts[hop + 4]; + t1[2] += (FIXED_A) in[hop + 5] * consts[hop + 5]; + t1[3] += (FIXED_A) in[hop + 6] * consts[hop + 6]; + t1[3] += (FIXED_A) in[hop + 7] * consts[hop + 7]; + t1[4] += (FIXED_A) in[hop + 8] * consts[hop + 8]; + t1[4] += (FIXED_A) in[hop + 9] * consts[hop + 9]; + t1[5] += (FIXED_A) in[hop + 10] * consts[hop + 10]; + t1[5] += (FIXED_A) in[hop + 11] * consts[hop + 11]; + t1[6] += (FIXED_A) in[hop + 12] * consts[hop + 12]; + t1[6] += (FIXED_A) in[hop + 13] * consts[hop + 13]; + t1[7] += (FIXED_A) in[hop + 14] * consts[hop + 14]; + t1[7] += (FIXED_A) in[hop + 15] * consts[hop + 15]; + } + + /* scaling */ + t2[0] = t1[0] >> SBC_PROTO_FIXED8_SCALE; + t2[1] = t1[1] >> SBC_PROTO_FIXED8_SCALE; + t2[2] = t1[2] >> SBC_PROTO_FIXED8_SCALE; + t2[3] = t1[3] >> SBC_PROTO_FIXED8_SCALE; + t2[4] = t1[4] >> SBC_PROTO_FIXED8_SCALE; + t2[5] = t1[5] >> SBC_PROTO_FIXED8_SCALE; + t2[6] = t1[6] >> SBC_PROTO_FIXED8_SCALE; + t2[7] = t1[7] >> SBC_PROTO_FIXED8_SCALE; + + + /* do the cos transform */ + t1[0] = t1[1] = t1[2] = t1[3] = t1[4] = t1[5] = t1[6] = t1[7] = 0; + + for (i = 0; i < 4; i++) { + t1[0] += (FIXED_A) t2[i * 2 + 0] * consts[80 + i * 16 + 0]; + t1[0] += (FIXED_A) t2[i * 2 + 1] * consts[80 + i * 16 + 1]; + t1[1] += (FIXED_A) t2[i * 2 + 0] * consts[80 + i * 16 + 2]; + t1[1] += (FIXED_A) t2[i * 2 + 1] * consts[80 + i * 16 + 3]; + t1[2] += (FIXED_A) t2[i * 2 + 0] * consts[80 + i * 16 + 4]; + t1[2] += (FIXED_A) t2[i * 2 + 1] * consts[80 + i * 16 + 5]; + t1[3] += (FIXED_A) t2[i * 2 + 0] * consts[80 + i * 16 + 6]; + t1[3] += (FIXED_A) t2[i * 2 + 1] * consts[80 + i * 16 + 7]; + t1[4] += (FIXED_A) t2[i * 2 + 0] * consts[80 + i * 16 + 8]; + t1[4] += (FIXED_A) t2[i * 2 + 1] * consts[80 + i * 16 + 9]; + t1[5] += (FIXED_A) t2[i * 2 + 0] * consts[80 + i * 16 + 10]; + t1[5] += (FIXED_A) t2[i * 2 + 1] * consts[80 + i * 16 + 11]; + t1[6] += (FIXED_A) t2[i * 2 + 0] * consts[80 + i * 16 + 12]; + t1[6] += (FIXED_A) t2[i * 2 + 1] * consts[80 + i * 16 + 13]; + t1[7] += (FIXED_A) t2[i * 2 + 0] * consts[80 + i * 16 + 14]; + t1[7] += (FIXED_A) t2[i * 2 + 1] * consts[80 + i * 16 + 15]; + } + + for (i = 0; i < 8; i++) + out[i] = t1[i] >> + (SBC_COS_TABLE_FIXED8_SCALE - SCALE_OUT_BITS); +} + +static inline void sbc_analyze_4b_4s_simd(int16_t *x, + int32_t *out, int out_stride) +{ + /* Analyze blocks */ + sbc_analyze_four_simd(x + 12, out, analysis_consts_fixed4_simd_odd); + out += out_stride; + sbc_analyze_four_simd(x + 8, out, analysis_consts_fixed4_simd_even); + out += out_stride; + sbc_analyze_four_simd(x + 4, out, analysis_consts_fixed4_simd_odd); + out += out_stride; + sbc_analyze_four_simd(x + 0, out, analysis_consts_fixed4_simd_even); +} + +static inline void sbc_analyze_4b_8s_simd(int16_t *x, + int32_t *out, int out_stride) +{ + /* Analyze blocks */ + sbc_analyze_eight_simd(x + 24, out, analysis_consts_fixed8_simd_odd); + out += out_stride; + sbc_analyze_eight_simd(x + 16, out, analysis_consts_fixed8_simd_even); + out += out_stride; + sbc_analyze_eight_simd(x + 8, out, analysis_consts_fixed8_simd_odd); + out += out_stride; + sbc_analyze_eight_simd(x + 0, out, analysis_consts_fixed8_simd_even); +} + +static inline int16_t unaligned16_be(const uint8_t *ptr) +{ + return (int16_t) ((ptr[0] << 8) | ptr[1]); +} + +static inline int16_t unaligned16_le(const uint8_t *ptr) +{ + return (int16_t) (ptr[0] | (ptr[1] << 8)); +} + +/* + * Internal helper functions for input data processing. In order to get + * optimal performance, it is important to have "nsamples", "nchannels" + * and "big_endian" arguments used with this inline function as compile + * time constants. + */ + +static SBC_ALWAYS_INLINE int sbc_encoder_process_input_s4_internal( + int position, + const uint8_t *pcm, int16_t X[2][SBC_X_BUFFER_SIZE], + int nsamples, int nchannels, int big_endian) +{ + /* handle X buffer wraparound */ + if (position < nsamples) { + if (nchannels > 0) + memcpy(&X[0][SBC_X_BUFFER_SIZE - 40], &X[0][position], + 36 * sizeof(int16_t)); + if (nchannels > 1) + memcpy(&X[1][SBC_X_BUFFER_SIZE - 40], &X[1][position], + 36 * sizeof(int16_t)); + position = SBC_X_BUFFER_SIZE - 40; + } + + #define PCM(i) (big_endian ? \ + unaligned16_be(pcm + (i) * 2) : unaligned16_le(pcm + (i) * 2)) + + /* copy/permutate audio samples */ + while ((nsamples -= 8) >= 0) { + position -= 8; + if (nchannels > 0) { + int16_t *x = &X[0][position]; + x[0] = PCM(0 + 7 * nchannels); + x[1] = PCM(0 + 3 * nchannels); + x[2] = PCM(0 + 6 * nchannels); + x[3] = PCM(0 + 4 * nchannels); + x[4] = PCM(0 + 0 * nchannels); + x[5] = PCM(0 + 2 * nchannels); + x[6] = PCM(0 + 1 * nchannels); + x[7] = PCM(0 + 5 * nchannels); + } + if (nchannels > 1) { + int16_t *x = &X[1][position]; + x[0] = PCM(1 + 7 * nchannels); + x[1] = PCM(1 + 3 * nchannels); + x[2] = PCM(1 + 6 * nchannels); + x[3] = PCM(1 + 4 * nchannels); + x[4] = PCM(1 + 0 * nchannels); + x[5] = PCM(1 + 2 * nchannels); + x[6] = PCM(1 + 1 * nchannels); + x[7] = PCM(1 + 5 * nchannels); + } + pcm += 16 * nchannels; + } + #undef PCM + + return position; +} + +static SBC_ALWAYS_INLINE int sbc_encoder_process_input_s8_internal( + int position, + const uint8_t *pcm, int16_t X[2][SBC_X_BUFFER_SIZE], + int nsamples, int nchannels, int big_endian) +{ + /* handle X buffer wraparound */ + if (position < nsamples) { + if (nchannels > 0) + memcpy(&X[0][SBC_X_BUFFER_SIZE - 72], &X[0][position], + 72 * sizeof(int16_t)); + if (nchannels > 1) + memcpy(&X[1][SBC_X_BUFFER_SIZE - 72], &X[1][position], + 72 * sizeof(int16_t)); + position = SBC_X_BUFFER_SIZE - 72; + } + + #define PCM(i) (big_endian ? \ + unaligned16_be(pcm + (i) * 2) : unaligned16_le(pcm + (i) * 2)) + + /* copy/permutate audio samples */ + while ((nsamples -= 16) >= 0) { + position -= 16; + if (nchannels > 0) { + int16_t *x = &X[0][position]; + x[0] = PCM(0 + 15 * nchannels); + x[1] = PCM(0 + 7 * nchannels); + x[2] = PCM(0 + 14 * nchannels); + x[3] = PCM(0 + 8 * nchannels); + x[4] = PCM(0 + 13 * nchannels); + x[5] = PCM(0 + 9 * nchannels); + x[6] = PCM(0 + 12 * nchannels); + x[7] = PCM(0 + 10 * nchannels); + x[8] = PCM(0 + 11 * nchannels); + x[9] = PCM(0 + 3 * nchannels); + x[10] = PCM(0 + 6 * nchannels); + x[11] = PCM(0 + 0 * nchannels); + x[12] = PCM(0 + 5 * nchannels); + x[13] = PCM(0 + 1 * nchannels); + x[14] = PCM(0 + 4 * nchannels); + x[15] = PCM(0 + 2 * nchannels); + } + if (nchannels > 1) { + int16_t *x = &X[1][position]; + x[0] = PCM(1 + 15 * nchannels); + x[1] = PCM(1 + 7 * nchannels); + x[2] = PCM(1 + 14 * nchannels); + x[3] = PCM(1 + 8 * nchannels); + x[4] = PCM(1 + 13 * nchannels); + x[5] = PCM(1 + 9 * nchannels); + x[6] = PCM(1 + 12 * nchannels); + x[7] = PCM(1 + 10 * nchannels); + x[8] = PCM(1 + 11 * nchannels); + x[9] = PCM(1 + 3 * nchannels); + x[10] = PCM(1 + 6 * nchannels); + x[11] = PCM(1 + 0 * nchannels); + x[12] = PCM(1 + 5 * nchannels); + x[13] = PCM(1 + 1 * nchannels); + x[14] = PCM(1 + 4 * nchannels); + x[15] = PCM(1 + 2 * nchannels); + } + pcm += 32 * nchannels; + } + #undef PCM + + return position; +} + +/* + * Input data processing functions. The data is endian converted if needed, + * channels are deintrleaved and audio samples are reordered for use in + * SIMD-friendly analysis filter function. The results are put into "X" + * array, getting appended to the previous data (or it is better to say + * prepended, as the buffer is filled from top to bottom). Old data is + * discarded when neededed, but availability of (10 * nrof_subbands) + * contiguous samples is always guaranteed for the input to the analysis + * filter. This is achieved by copying a sufficient part of old data + * to the top of the buffer on buffer wraparound. + */ + +static int sbc_enc_process_input_4s_le(int position, + const uint8_t *pcm, int16_t X[2][SBC_X_BUFFER_SIZE], + int nsamples, int nchannels) +{ + if (nchannels > 1) + return sbc_encoder_process_input_s4_internal( + position, pcm, X, nsamples, 2, 0); + else + return sbc_encoder_process_input_s4_internal( + position, pcm, X, nsamples, 1, 0); +} + +static int sbc_enc_process_input_4s_be(int position, + const uint8_t *pcm, int16_t X[2][SBC_X_BUFFER_SIZE], + int nsamples, int nchannels) +{ + if (nchannels > 1) + return sbc_encoder_process_input_s4_internal( + position, pcm, X, nsamples, 2, 1); + else + return sbc_encoder_process_input_s4_internal( + position, pcm, X, nsamples, 1, 1); +} + +static int sbc_enc_process_input_8s_le(int position, + const uint8_t *pcm, int16_t X[2][SBC_X_BUFFER_SIZE], + int nsamples, int nchannels) +{ + if (nchannels > 1) + return sbc_encoder_process_input_s8_internal( + position, pcm, X, nsamples, 2, 0); + else + return sbc_encoder_process_input_s8_internal( + position, pcm, X, nsamples, 1, 0); +} + +static int sbc_enc_process_input_8s_be(int position, + const uint8_t *pcm, int16_t X[2][SBC_X_BUFFER_SIZE], + int nsamples, int nchannels) +{ + if (nchannels > 1) + return sbc_encoder_process_input_s8_internal( + position, pcm, X, nsamples, 2, 1); + else + return sbc_encoder_process_input_s8_internal( + position, pcm, X, nsamples, 1, 1); +} + +/* Supplementary function to count the number of leading zeros */ + +static inline int sbc_clz(uint32_t x) +{ +#ifdef __GNUC__ + return __builtin_clz(x); +#else + /* TODO: this should be replaced with something better if good + * performance is wanted when using compilers other than gcc */ + int cnt = 0; + while (x) { + cnt++; + x >>= 1; + } + return 32 - cnt; +#endif +} + +static void sbc_calc_scalefactors( + int32_t sb_sample_f[16][2][8], + uint32_t scale_factor[2][8], + int blocks, int channels, int subbands) +{ + int ch, sb, blk; + for (ch = 0; ch < channels; ch++) { + for (sb = 0; sb < subbands; sb++) { + uint32_t x = 1 << SCALE_OUT_BITS; + for (blk = 0; blk < blocks; blk++) { + int32_t tmp = fabs(sb_sample_f[blk][ch][sb]); + if (tmp != 0) + x |= tmp - 1; + } + scale_factor[ch][sb] = (31 - SCALE_OUT_BITS) - + sbc_clz(x); + } + } +} + +static int sbc_calc_scalefactors_j( + int32_t sb_sample_f[16][2][8], + uint32_t scale_factor[2][8], + int blocks, int subbands) +{ + int blk, joint = 0; + int32_t tmp0, tmp1; + uint32_t x, y; + + /* last subband does not use joint stereo */ + int sb = subbands - 1; + x = 1 << SCALE_OUT_BITS; + y = 1 << SCALE_OUT_BITS; + for (blk = 0; blk < blocks; blk++) { + tmp0 = fabs(sb_sample_f[blk][0][sb]); + tmp1 = fabs(sb_sample_f[blk][1][sb]); + if (tmp0 != 0) + x |= tmp0 - 1; + if (tmp1 != 0) + y |= tmp1 - 1; + } + scale_factor[0][sb] = (31 - SCALE_OUT_BITS) - sbc_clz(x); + scale_factor[1][sb] = (31 - SCALE_OUT_BITS) - sbc_clz(y); + + /* the rest of subbands can use joint stereo */ + while (--sb >= 0) { + int32_t sb_sample_j[16][2]; + x = 1 << SCALE_OUT_BITS; + y = 1 << SCALE_OUT_BITS; + for (blk = 0; blk < blocks; blk++) { + tmp0 = sb_sample_f[blk][0][sb]; + tmp1 = sb_sample_f[blk][1][sb]; + sb_sample_j[blk][0] = ASR(tmp0, 1) + ASR(tmp1, 1); + sb_sample_j[blk][1] = ASR(tmp0, 1) - ASR(tmp1, 1); + tmp0 = fabs(tmp0); + tmp1 = fabs(tmp1); + if (tmp0 != 0) + x |= tmp0 - 1; + if (tmp1 != 0) + y |= tmp1 - 1; + } + scale_factor[0][sb] = (31 - SCALE_OUT_BITS) - + sbc_clz(x); + scale_factor[1][sb] = (31 - SCALE_OUT_BITS) - + sbc_clz(y); + x = 1 << SCALE_OUT_BITS; + y = 1 << SCALE_OUT_BITS; + for (blk = 0; blk < blocks; blk++) { + tmp0 = fabs(sb_sample_j[blk][0]); + tmp1 = fabs(sb_sample_j[blk][1]); + if (tmp0 != 0) + x |= tmp0 - 1; + if (tmp1 != 0) + y |= tmp1 - 1; + } + x = (31 - SCALE_OUT_BITS) - sbc_clz(x); + y = (31 - SCALE_OUT_BITS) - sbc_clz(y); + + /* decide whether to use joint stereo for this subband */ + if ((scale_factor[0][sb] + scale_factor[1][sb]) > x + y) { + joint |= 1 << (subbands - 1 - sb); + scale_factor[0][sb] = x; + scale_factor[1][sb] = y; + for (blk = 0; blk < blocks; blk++) { + sb_sample_f[blk][0][sb] = sb_sample_j[blk][0]; + sb_sample_f[blk][1][sb] = sb_sample_j[blk][1]; + } + } + } + + /* bitmask with the information about subbands using joint stereo */ + return joint; +} + +/* + * Detect CPU features and setup function pointers + */ +void sbc_init_primitives(struct sbc_encoder_state *state) +{ + /* Default implementation for analyze functions */ + state->sbc_analyze_4b_4s = sbc_analyze_4b_4s_simd; + state->sbc_analyze_4b_8s = sbc_analyze_4b_8s_simd; + + /* Default implementation for input reordering / deinterleaving */ + state->sbc_enc_process_input_4s_le = sbc_enc_process_input_4s_le; + state->sbc_enc_process_input_4s_be = sbc_enc_process_input_4s_be; + state->sbc_enc_process_input_8s_le = sbc_enc_process_input_8s_le; + state->sbc_enc_process_input_8s_be = sbc_enc_process_input_8s_be; + + /* Default implementation for scale factors calculation */ + state->sbc_calc_scalefactors = sbc_calc_scalefactors; + state->sbc_calc_scalefactors_j = sbc_calc_scalefactors_j; + state->implementation_info = "Generic C"; + + /* X86/AMD64 optimizations */ +#ifdef SBC_BUILD_WITH_MMX_SUPPORT + sbc_init_primitives_mmx(state); +#endif + + /* ARM optimizations */ +#ifdef SBC_BUILD_WITH_ARMV6_SUPPORT + sbc_init_primitives_armv6(state); +#endif +#ifdef SBC_BUILD_WITH_IWMMXT_SUPPORT + sbc_init_primitives_iwmmxt(state); +#endif +#ifdef SBC_BUILD_WITH_NEON_SUPPORT + sbc_init_primitives_neon(state); +#endif +} diff --git a/src/modules/bluetooth/sbc/sbc_primitives.h b/src/modules/bluetooth/sbc/sbc_primitives.h new file mode 100644 index 0000000..3fec8d5 --- /dev/null +++ b/src/modules/bluetooth/sbc/sbc_primitives.h @@ -0,0 +1,80 @@ +/* + * + * Bluetooth low-complexity, subband codec (SBC) library + * + * Copyright (C) 2008-2010 Nokia Corporation + * Copyright (C) 2004-2010 Marcel Holtmann + * Copyright (C) 2004-2005 Henryk Ploetz + * Copyright (C) 2005-2006 Brad Midgley + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifndef __SBC_PRIMITIVES_H +#define __SBC_PRIMITIVES_H + +#define SCALE_OUT_BITS 15 +#define SBC_X_BUFFER_SIZE 328 + +#ifdef __GNUC__ +#define SBC_ALWAYS_INLINE __attribute__((always_inline)) +#else +#define SBC_ALWAYS_INLINE inline +#endif + +struct sbc_encoder_state { + int position; + int16_t SBC_ALIGNED X[2][SBC_X_BUFFER_SIZE]; + /* Polyphase analysis filter for 4 subbands configuration, + * it handles 4 blocks at once */ + void (*sbc_analyze_4b_4s)(int16_t *x, int32_t *out, int out_stride); + /* Polyphase analysis filter for 8 subbands configuration, + * it handles 4 blocks at once */ + void (*sbc_analyze_4b_8s)(int16_t *x, int32_t *out, int out_stride); + /* Process input data (deinterleave, endian conversion, reordering), + * depending on the number of subbands and input data byte order */ + int (*sbc_enc_process_input_4s_le)(int position, + const uint8_t *pcm, int16_t X[2][SBC_X_BUFFER_SIZE], + int nsamples, int nchannels); + int (*sbc_enc_process_input_4s_be)(int position, + const uint8_t *pcm, int16_t X[2][SBC_X_BUFFER_SIZE], + int nsamples, int nchannels); + int (*sbc_enc_process_input_8s_le)(int position, + const uint8_t *pcm, int16_t X[2][SBC_X_BUFFER_SIZE], + int nsamples, int nchannels); + int (*sbc_enc_process_input_8s_be)(int position, + const uint8_t *pcm, int16_t X[2][SBC_X_BUFFER_SIZE], + int nsamples, int nchannels); + /* Scale factors calculation */ + void (*sbc_calc_scalefactors)(int32_t sb_sample_f[16][2][8], + uint32_t scale_factor[2][8], + int blocks, int channels, int subbands); + /* Scale factors calculation with joint stereo support */ + int (*sbc_calc_scalefactors_j)(int32_t sb_sample_f[16][2][8], + uint32_t scale_factor[2][8], + int blocks, int subbands); + const char *implementation_info; +}; + +/* + * Initialize pointers to the functions which are the basic "building bricks" + * of SBC codec. Best implementation is selected based on target CPU + * capabilities. + */ +void sbc_init_primitives(struct sbc_encoder_state *encoder_state); + +#endif diff --git a/src/modules/bluetooth/sbc/sbc_primitives_armv6.c b/src/modules/bluetooth/sbc/sbc_primitives_armv6.c new file mode 100644 index 0000000..9586098 --- /dev/null +++ b/src/modules/bluetooth/sbc/sbc_primitives_armv6.c @@ -0,0 +1,299 @@ +/* + * + * Bluetooth low-complexity, subband codec (SBC) library + * + * Copyright (C) 2008-2010 Nokia Corporation + * Copyright (C) 2004-2010 Marcel Holtmann + * Copyright (C) 2004-2005 Henryk Ploetz + * Copyright (C) 2005-2006 Brad Midgley + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include +#include +#include "sbc.h" +#include "sbc_math.h" +#include "sbc_tables.h" + +#include "sbc_primitives_armv6.h" + +/* + * ARMv6 optimizations. The instructions are scheduled for ARM11 pipeline. + */ + +#ifdef SBC_BUILD_WITH_ARMV6_SUPPORT + +static void __attribute__((naked)) sbc_analyze_four_armv6() +{ + /* r0 = in, r1 = out, r2 = consts */ + asm volatile ( + "push {r1, r4-r7, lr}\n" + "push {r8-r11}\n" + "ldrd r4, r5, [r0, #0]\n" + "ldrd r6, r7, [r2, #0]\n" + "ldrd r8, r9, [r0, #16]\n" + "ldrd r10, r11, [r2, #16]\n" + "mov r14, #0x8000\n" + "smlad r3, r4, r6, r14\n" + "smlad r12, r5, r7, r14\n" + "ldrd r4, r5, [r0, #32]\n" + "ldrd r6, r7, [r2, #32]\n" + "smlad r3, r8, r10, r3\n" + "smlad r12, r9, r11, r12\n" + "ldrd r8, r9, [r0, #48]\n" + "ldrd r10, r11, [r2, #48]\n" + "smlad r3, r4, r6, r3\n" + "smlad r12, r5, r7, r12\n" + "ldrd r4, r5, [r0, #64]\n" + "ldrd r6, r7, [r2, #64]\n" + "smlad r3, r8, r10, r3\n" + "smlad r12, r9, r11, r12\n" + "ldrd r8, r9, [r0, #8]\n" + "ldrd r10, r11, [r2, #8]\n" + "smlad r3, r4, r6, r3\n" /* t1[0] is done */ + "smlad r12, r5, r7, r12\n" /* t1[1] is done */ + "ldrd r4, r5, [r0, #24]\n" + "ldrd r6, r7, [r2, #24]\n" + "pkhtb r3, r12, r3, asr #16\n" /* combine t1[0] and t1[1] */ + "smlad r12, r8, r10, r14\n" + "smlad r14, r9, r11, r14\n" + "ldrd r8, r9, [r0, #40]\n" + "ldrd r10, r11, [r2, #40]\n" + "smlad r12, r4, r6, r12\n" + "smlad r14, r5, r7, r14\n" + "ldrd r4, r5, [r0, #56]\n" + "ldrd r6, r7, [r2, #56]\n" + "smlad r12, r8, r10, r12\n" + "smlad r14, r9, r11, r14\n" + "ldrd r8, r9, [r0, #72]\n" + "ldrd r10, r11, [r2, #72]\n" + "smlad r12, r4, r6, r12\n" + "smlad r14, r5, r7, r14\n" + "ldrd r4, r5, [r2, #80]\n" /* start loading cos table */ + "smlad r12, r8, r10, r12\n" /* t1[2] is done */ + "smlad r14, r9, r11, r14\n" /* t1[3] is done */ + "ldrd r6, r7, [r2, #88]\n" + "ldrd r8, r9, [r2, #96]\n" + "ldrd r10, r11, [r2, #104]\n" /* cos table fully loaded */ + "pkhtb r12, r14, r12, asr #16\n" /* combine t1[2] and t1[3] */ + "smuad r4, r3, r4\n" + "smuad r5, r3, r5\n" + "smlad r4, r12, r8, r4\n" + "smlad r5, r12, r9, r5\n" + "smuad r6, r3, r6\n" + "smuad r7, r3, r7\n" + "smlad r6, r12, r10, r6\n" + "smlad r7, r12, r11, r7\n" + "pop {r8-r11}\n" + "stmia r1, {r4, r5, r6, r7}\n" + "pop {r1, r4-r7, pc}\n" + ); +} + +#define sbc_analyze_four(in, out, consts) \ + ((void (*)(int16_t *, int32_t *, const FIXED_T*)) \ + sbc_analyze_four_armv6)((in), (out), (consts)) + +static void __attribute__((naked)) sbc_analyze_eight_armv6() +{ + /* r0 = in, r1 = out, r2 = consts */ + asm volatile ( + "push {r1, r4-r7, lr}\n" + "push {r8-r11}\n" + "ldrd r4, r5, [r0, #24]\n" + "ldrd r6, r7, [r2, #24]\n" + "ldrd r8, r9, [r0, #56]\n" + "ldrd r10, r11, [r2, #56]\n" + "mov r14, #0x8000\n" + "smlad r3, r4, r6, r14\n" + "smlad r12, r5, r7, r14\n" + "ldrd r4, r5, [r0, #88]\n" + "ldrd r6, r7, [r2, #88]\n" + "smlad r3, r8, r10, r3\n" + "smlad r12, r9, r11, r12\n" + "ldrd r8, r9, [r0, #120]\n" + "ldrd r10, r11, [r2, #120]\n" + "smlad r3, r4, r6, r3\n" + "smlad r12, r5, r7, r12\n" + "ldrd r4, r5, [r0, #152]\n" + "ldrd r6, r7, [r2, #152]\n" + "smlad r3, r8, r10, r3\n" + "smlad r12, r9, r11, r12\n" + "ldrd r8, r9, [r0, #16]\n" + "ldrd r10, r11, [r2, #16]\n" + "smlad r3, r4, r6, r3\n" /* t1[6] is done */ + "smlad r12, r5, r7, r12\n" /* t1[7] is done */ + "ldrd r4, r5, [r0, #48]\n" + "ldrd r6, r7, [r2, #48]\n" + "pkhtb r3, r12, r3, asr #16\n" /* combine t1[6] and t1[7] */ + "str r3, [sp, #-4]!\n" /* save to stack */ + "smlad r3, r8, r10, r14\n" + "smlad r12, r9, r11, r14\n" + "ldrd r8, r9, [r0, #80]\n" + "ldrd r10, r11, [r2, #80]\n" + "smlad r3, r4, r6, r3\n" + "smlad r12, r5, r7, r12\n" + "ldrd r4, r5, [r0, #112]\n" + "ldrd r6, r7, [r2, #112]\n" + "smlad r3, r8, r10, r3\n" + "smlad r12, r9, r11, r12\n" + "ldrd r8, r9, [r0, #144]\n" + "ldrd r10, r11, [r2, #144]\n" + "smlad r3, r4, r6, r3\n" + "smlad r12, r5, r7, r12\n" + "ldrd r4, r5, [r0, #0]\n" + "ldrd r6, r7, [r2, #0]\n" + "smlad r3, r8, r10, r3\n" /* t1[4] is done */ + "smlad r12, r9, r11, r12\n" /* t1[5] is done */ + "ldrd r8, r9, [r0, #32]\n" + "ldrd r10, r11, [r2, #32]\n" + "pkhtb r3, r12, r3, asr #16\n" /* combine t1[4] and t1[5] */ + "str r3, [sp, #-4]!\n" /* save to stack */ + "smlad r3, r4, r6, r14\n" + "smlad r12, r5, r7, r14\n" + "ldrd r4, r5, [r0, #64]\n" + "ldrd r6, r7, [r2, #64]\n" + "smlad r3, r8, r10, r3\n" + "smlad r12, r9, r11, r12\n" + "ldrd r8, r9, [r0, #96]\n" + "ldrd r10, r11, [r2, #96]\n" + "smlad r3, r4, r6, r3\n" + "smlad r12, r5, r7, r12\n" + "ldrd r4, r5, [r0, #128]\n" + "ldrd r6, r7, [r2, #128]\n" + "smlad r3, r8, r10, r3\n" + "smlad r12, r9, r11, r12\n" + "ldrd r8, r9, [r0, #8]\n" + "ldrd r10, r11, [r2, #8]\n" + "smlad r3, r4, r6, r3\n" /* t1[0] is done */ + "smlad r12, r5, r7, r12\n" /* t1[1] is done */ + "ldrd r4, r5, [r0, #40]\n" + "ldrd r6, r7, [r2, #40]\n" + "pkhtb r3, r12, r3, asr #16\n" /* combine t1[0] and t1[1] */ + "smlad r12, r8, r10, r14\n" + "smlad r14, r9, r11, r14\n" + "ldrd r8, r9, [r0, #72]\n" + "ldrd r10, r11, [r2, #72]\n" + "smlad r12, r4, r6, r12\n" + "smlad r14, r5, r7, r14\n" + "ldrd r4, r5, [r0, #104]\n" + "ldrd r6, r7, [r2, #104]\n" + "smlad r12, r8, r10, r12\n" + "smlad r14, r9, r11, r14\n" + "ldrd r8, r9, [r0, #136]\n" + "ldrd r10, r11, [r2, #136]!\n" + "smlad r12, r4, r6, r12\n" + "smlad r14, r5, r7, r14\n" + "ldrd r4, r5, [r2, #(160 - 136 + 0)]\n" + "smlad r12, r8, r10, r12\n" /* t1[2] is done */ + "smlad r14, r9, r11, r14\n" /* t1[3] is done */ + "ldrd r6, r7, [r2, #(160 - 136 + 8)]\n" + "smuad r4, r3, r4\n" + "smuad r5, r3, r5\n" + "pkhtb r12, r14, r12, asr #16\n" /* combine t1[2] and t1[3] */ + /* r3 = t2[0:1] */ + /* r12 = t2[2:3] */ + "pop {r0, r14}\n" /* t2[4:5], t2[6:7] */ + "ldrd r8, r9, [r2, #(160 - 136 + 32)]\n" + "smuad r6, r3, r6\n" + "smuad r7, r3, r7\n" + "ldrd r10, r11, [r2, #(160 - 136 + 40)]\n" + "smlad r4, r12, r8, r4\n" + "smlad r5, r12, r9, r5\n" + "ldrd r8, r9, [r2, #(160 - 136 + 64)]\n" + "smlad r6, r12, r10, r6\n" + "smlad r7, r12, r11, r7\n" + "ldrd r10, r11, [r2, #(160 - 136 + 72)]\n" + "smlad r4, r0, r8, r4\n" + "smlad r5, r0, r9, r5\n" + "ldrd r8, r9, [r2, #(160 - 136 + 96)]\n" + "smlad r6, r0, r10, r6\n" + "smlad r7, r0, r11, r7\n" + "ldrd r10, r11, [r2, #(160 - 136 + 104)]\n" + "smlad r4, r14, r8, r4\n" + "smlad r5, r14, r9, r5\n" + "ldrd r8, r9, [r2, #(160 - 136 + 16 + 0)]\n" + "smlad r6, r14, r10, r6\n" + "smlad r7, r14, r11, r7\n" + "ldrd r10, r11, [r2, #(160 - 136 + 16 + 8)]\n" + "stmia r1!, {r4, r5}\n" + "smuad r4, r3, r8\n" + "smuad r5, r3, r9\n" + "ldrd r8, r9, [r2, #(160 - 136 + 16 + 32)]\n" + "stmia r1!, {r6, r7}\n" + "smuad r6, r3, r10\n" + "smuad r7, r3, r11\n" + "ldrd r10, r11, [r2, #(160 - 136 + 16 + 40)]\n" + "smlad r4, r12, r8, r4\n" + "smlad r5, r12, r9, r5\n" + "ldrd r8, r9, [r2, #(160 - 136 + 16 + 64)]\n" + "smlad r6, r12, r10, r6\n" + "smlad r7, r12, r11, r7\n" + "ldrd r10, r11, [r2, #(160 - 136 + 16 + 72)]\n" + "smlad r4, r0, r8, r4\n" + "smlad r5, r0, r9, r5\n" + "ldrd r8, r9, [r2, #(160 - 136 + 16 + 96)]\n" + "smlad r6, r0, r10, r6\n" + "smlad r7, r0, r11, r7\n" + "ldrd r10, r11, [r2, #(160 - 136 + 16 + 104)]\n" + "smlad r4, r14, r8, r4\n" + "smlad r5, r14, r9, r5\n" + "smlad r6, r14, r10, r6\n" + "smlad r7, r14, r11, r7\n" + "pop {r8-r11}\n" + "stmia r1!, {r4, r5, r6, r7}\n" + "pop {r1, r4-r7, pc}\n" + ); +} + +#define sbc_analyze_eight(in, out, consts) \ + ((void (*)(int16_t *, int32_t *, const FIXED_T*)) \ + sbc_analyze_eight_armv6)((in), (out), (consts)) + +static void sbc_analyze_4b_4s_armv6(int16_t *x, int32_t *out, int out_stride) +{ + /* Analyze blocks */ + sbc_analyze_four(x + 12, out, analysis_consts_fixed4_simd_odd); + out += out_stride; + sbc_analyze_four(x + 8, out, analysis_consts_fixed4_simd_even); + out += out_stride; + sbc_analyze_four(x + 4, out, analysis_consts_fixed4_simd_odd); + out += out_stride; + sbc_analyze_four(x + 0, out, analysis_consts_fixed4_simd_even); +} + +static void sbc_analyze_4b_8s_armv6(int16_t *x, int32_t *out, int out_stride) +{ + /* Analyze blocks */ + sbc_analyze_eight(x + 24, out, analysis_consts_fixed8_simd_odd); + out += out_stride; + sbc_analyze_eight(x + 16, out, analysis_consts_fixed8_simd_even); + out += out_stride; + sbc_analyze_eight(x + 8, out, analysis_consts_fixed8_simd_odd); + out += out_stride; + sbc_analyze_eight(x + 0, out, analysis_consts_fixed8_simd_even); +} + +void sbc_init_primitives_armv6(struct sbc_encoder_state *state) +{ + state->sbc_analyze_4b_4s = sbc_analyze_4b_4s_armv6; + state->sbc_analyze_4b_8s = sbc_analyze_4b_8s_armv6; + state->implementation_info = "ARMv6 SIMD"; +} + +#endif diff --git a/src/modules/bluetooth/sbc/sbc_primitives_armv6.h b/src/modules/bluetooth/sbc/sbc_primitives_armv6.h new file mode 100644 index 0000000..6a9efe5 --- /dev/null +++ b/src/modules/bluetooth/sbc/sbc_primitives_armv6.h @@ -0,0 +1,52 @@ +/* + * + * Bluetooth low-complexity, subband codec (SBC) library + * + * Copyright (C) 2008-2010 Nokia Corporation + * Copyright (C) 2004-2010 Marcel Holtmann + * Copyright (C) 2004-2005 Henryk Ploetz + * Copyright (C) 2005-2006 Brad Midgley + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifndef __SBC_PRIMITIVES_ARMV6_H +#define __SBC_PRIMITIVES_ARMV6_H + +#include "sbc_primitives.h" + +#if defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || \ + defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) || \ + defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_6T2__) || \ + defined(__ARM_ARCH_6M__) || defined(__ARM_ARCH_7__) || \ + defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__) || \ + defined(__ARM_ARCH_7M__) +#define SBC_HAVE_ARMV6 1 +#endif + +#if !defined(SBC_HIGH_PRECISION) && (SCALE_OUT_BITS == 15) && \ + defined(__GNUC__) && defined(SBC_HAVE_ARMV6) && \ + defined(__ARM_EABI__) && !defined(__ARM_NEON__) && \ + (!defined(__thumb__) || defined(__thumb2__)) + +#define SBC_BUILD_WITH_ARMV6_SUPPORT + +void sbc_init_primitives_armv6(struct sbc_encoder_state *encoder_state); + +#endif + +#endif diff --git a/src/modules/bluetooth/sbc/sbc_primitives_iwmmxt.c b/src/modules/bluetooth/sbc/sbc_primitives_iwmmxt.c new file mode 100644 index 0000000..213967e --- /dev/null +++ b/src/modules/bluetooth/sbc/sbc_primitives_iwmmxt.c @@ -0,0 +1,304 @@ +/* + * + * Bluetooth low-complexity, subband codec (SBC) library + * + * Copyright (C) 2010 Keith Mok + * Copyright (C) 2008-2010 Nokia Corporation + * Copyright (C) 2004-2010 Marcel Holtmann + * Copyright (C) 2004-2005 Henryk Ploetz + * Copyright (C) 2005-2006 Brad Midgley + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include +#include +#include "sbc.h" +#include "sbc_math.h" +#include "sbc_tables.h" + +#include "sbc_primitives_iwmmxt.h" + +/* + * IWMMXT optimizations + */ + +#ifdef SBC_BUILD_WITH_IWMMXT_SUPPORT + +static inline void sbc_analyze_four_iwmmxt(const int16_t *in, int32_t *out, + const FIXED_T *consts) +{ + asm volatile ( + "wldrd wr0, [%0]\n" + "tbcstw wr4, %2\n" + "wldrd wr2, [%1]\n" + "wldrd wr1, [%0, #8]\n" + "wldrd wr3, [%1, #8]\n" + "wmadds wr0, wr2, wr0\n" + " wldrd wr6, [%0, #16]\n" + "wmadds wr1, wr3, wr1\n" + " wldrd wr7, [%0, #24]\n" + "waddwss wr0, wr0, wr4\n" + " wldrd wr8, [%1, #16]\n" + "waddwss wr1, wr1, wr4\n" + " wldrd wr9, [%1, #24]\n" + " wmadds wr6, wr8, wr6\n" + " wldrd wr2, [%0, #32]\n" + " wmadds wr7, wr9, wr7\n" + " wldrd wr3, [%0, #40]\n" + " waddwss wr0, wr6, wr0\n" + " wldrd wr4, [%1, #32]\n" + " waddwss wr1, wr7, wr1\n" + " wldrd wr5, [%1, #40]\n" + " wmadds wr2, wr4, wr2\n" + "wldrd wr6, [%0, #48]\n" + " wmadds wr3, wr5, wr3\n" + "wldrd wr7, [%0, #56]\n" + " waddwss wr0, wr2, wr0\n" + "wldrd wr8, [%1, #48]\n" + " waddwss wr1, wr3, wr1\n" + "wldrd wr9, [%1, #56]\n" + "wmadds wr6, wr8, wr6\n" + " wldrd wr2, [%0, #64]\n" + "wmadds wr7, wr9, wr7\n" + " wldrd wr3, [%0, #72]\n" + "waddwss wr0, wr6, wr0\n" + " wldrd wr4, [%1, #64]\n" + "waddwss wr1, wr7, wr1\n" + " wldrd wr5, [%1, #72]\n" + " wmadds wr2, wr4, wr2\n" + "tmcr wcgr0, %4\n" + " wmadds wr3, wr5, wr3\n" + " waddwss wr0, wr2, wr0\n" + " waddwss wr1, wr3, wr1\n" + "\n" + "wsrawg wr0, wr0, wcgr0\n" + " wldrd wr4, [%1, #80]\n" + "wsrawg wr1, wr1, wcgr0\n" + " wldrd wr5, [%1, #88]\n" + "wpackwss wr0, wr0, wr0\n" + " wldrd wr6, [%1, #96]\n" + "wpackwss wr1, wr1, wr1\n" + "wmadds wr2, wr5, wr0\n" + " wldrd wr7, [%1, #104]\n" + "wmadds wr0, wr4, wr0\n" + "\n" + " wmadds wr3, wr7, wr1\n" + " wmadds wr1, wr6, wr1\n" + " waddwss wr2, wr3, wr2\n" + " waddwss wr0, wr1, wr0\n" + "\n" + "wstrd wr0, [%3]\n" + "wstrd wr2, [%3, #8]\n" + : + : "r" (in), "r" (consts), + "r" (1 << (SBC_PROTO_FIXED4_SCALE - 1)), "r" (out), + "r" (SBC_PROTO_FIXED4_SCALE) + : "wr0", "wr1", "wr2", "wr3", "wr4", "wr5", "wr6", "wr7", + "wr8", "wr9", "wcgr0", "memory"); +} + +static inline void sbc_analyze_eight_iwmmxt(const int16_t *in, int32_t *out, + const FIXED_T *consts) +{ + asm volatile ( + "wldrd wr0, [%0]\n" + "tbcstw wr15, %2\n" + "wldrd wr1, [%0, #8]\n" + "wldrd wr2, [%0, #16]\n" + "wldrd wr3, [%0, #24]\n" + "wldrd wr4, [%1]\n" + "wldrd wr5, [%1, #8]\n" + "wldrd wr6, [%1, #16]\n" + "wldrd wr7, [%1, #24]\n" + "wmadds wr0, wr0, wr4\n" + " wldrd wr8, [%1, #32]\n" + "wmadds wr1, wr1, wr5\n" + " wldrd wr9, [%1, #40]\n" + "wmadds wr2, wr2, wr6\n" + " wldrd wr10, [%1, #48]\n" + "wmadds wr3, wr3, wr7\n" + " wldrd wr11, [%1, #56]\n" + "waddwss wr0, wr0, wr15\n" + " wldrd wr4, [%0, #32]\n" + "waddwss wr1, wr1, wr15\n" + " wldrd wr5, [%0, #40]\n" + "waddwss wr2, wr2, wr15\n" + " wldrd wr6, [%0, #48]\n" + "waddwss wr3, wr3, wr15\n" + " wldrd wr7, [%0, #56]\n" + " wmadds wr4, wr4, wr8\n" + " wldrd wr12, [%0, #64]\n" + " wmadds wr5, wr5, wr9\n" + " wldrd wr13, [%0, #72]\n" + " wmadds wr6, wr6, wr10\n" + " wldrd wr14, [%0, #80]\n" + " wmadds wr7, wr7, wr11\n" + " wldrd wr15, [%0, #88]\n" + " waddwss wr0, wr4, wr0\n" + " wldrd wr8, [%1, #64]\n" + " waddwss wr1, wr5, wr1\n" + " wldrd wr9, [%1, #72]\n" + " waddwss wr2, wr6, wr2\n" + " wldrd wr10, [%1, #80]\n" + " waddwss wr3, wr7, wr3\n" + " wldrd wr11, [%1, #88]\n" + " wmadds wr12, wr12, wr8\n" + "wldrd wr4, [%0, #96]\n" + " wmadds wr13, wr13, wr9\n" + "wldrd wr5, [%0, #104]\n" + " wmadds wr14, wr14, wr10\n" + "wldrd wr6, [%0, #112]\n" + " wmadds wr15, wr15, wr11\n" + "wldrd wr7, [%0, #120]\n" + " waddwss wr0, wr12, wr0\n" + "wldrd wr8, [%1, #96]\n" + " waddwss wr1, wr13, wr1\n" + "wldrd wr9, [%1, #104]\n" + " waddwss wr2, wr14, wr2\n" + "wldrd wr10, [%1, #112]\n" + " waddwss wr3, wr15, wr3\n" + "wldrd wr11, [%1, #120]\n" + "wmadds wr4, wr4, wr8\n" + " wldrd wr12, [%0, #128]\n" + "wmadds wr5, wr5, wr9\n" + " wldrd wr13, [%0, #136]\n" + "wmadds wr6, wr6, wr10\n" + " wldrd wr14, [%0, #144]\n" + "wmadds wr7, wr7, wr11\n" + " wldrd wr15, [%0, #152]\n" + "waddwss wr0, wr4, wr0\n" + " wldrd wr8, [%1, #128]\n" + "waddwss wr1, wr5, wr1\n" + " wldrd wr9, [%1, #136]\n" + "waddwss wr2, wr6, wr2\n" + " wldrd wr10, [%1, #144]\n" + " waddwss wr3, wr7, wr3\n" + " wldrd wr11, [%1, #152]\n" + " wmadds wr12, wr12, wr8\n" + "tmcr wcgr0, %4\n" + " wmadds wr13, wr13, wr9\n" + " wmadds wr14, wr14, wr10\n" + " wmadds wr15, wr15, wr11\n" + " waddwss wr0, wr12, wr0\n" + " waddwss wr1, wr13, wr1\n" + " waddwss wr2, wr14, wr2\n" + " waddwss wr3, wr15, wr3\n" + "\n" + "wsrawg wr0, wr0, wcgr0\n" + "wsrawg wr1, wr1, wcgr0\n" + "wsrawg wr2, wr2, wcgr0\n" + "wsrawg wr3, wr3, wcgr0\n" + "\n" + "wpackwss wr0, wr0, wr0\n" + "wpackwss wr1, wr1, wr1\n" + " wldrd wr4, [%1, #160]\n" + "wpackwss wr2, wr2, wr2\n" + " wldrd wr5, [%1, #168]\n" + "wpackwss wr3, wr3, wr3\n" + " wldrd wr6, [%1, #192]\n" + " wmadds wr4, wr4, wr0\n" + " wldrd wr7, [%1, #200]\n" + " wmadds wr5, wr5, wr0\n" + " wldrd wr8, [%1, #224]\n" + " wmadds wr6, wr6, wr1\n" + " wldrd wr9, [%1, #232]\n" + " wmadds wr7, wr7, wr1\n" + " waddwss wr4, wr6, wr4\n" + " waddwss wr5, wr7, wr5\n" + " wmadds wr8, wr8, wr2\n" + "wldrd wr6, [%1, #256]\n" + " wmadds wr9, wr9, wr2\n" + "wldrd wr7, [%1, #264]\n" + "waddwss wr4, wr8, wr4\n" + " waddwss wr5, wr9, wr5\n" + "wmadds wr6, wr6, wr3\n" + "wmadds wr7, wr7, wr3\n" + "waddwss wr4, wr6, wr4\n" + "waddwss wr5, wr7, wr5\n" + "\n" + "wstrd wr4, [%3]\n" + "wstrd wr5, [%3, #8]\n" + "\n" + "wldrd wr6, [%1, #176]\n" + "wldrd wr5, [%1, #184]\n" + "wmadds wr5, wr5, wr0\n" + "wldrd wr8, [%1, #208]\n" + "wmadds wr0, wr6, wr0\n" + "wldrd wr9, [%1, #216]\n" + "wmadds wr9, wr9, wr1\n" + "wldrd wr6, [%1, #240]\n" + "wmadds wr1, wr8, wr1\n" + "wldrd wr7, [%1, #248]\n" + "waddwss wr0, wr1, wr0\n" + "waddwss wr5, wr9, wr5\n" + "wmadds wr7, wr7, wr2\n" + "wldrd wr8, [%1, #272]\n" + "wmadds wr2, wr6, wr2\n" + "wldrd wr9, [%1, #280]\n" + "waddwss wr0, wr2, wr0\n" + "waddwss wr5, wr7, wr5\n" + "wmadds wr9, wr9, wr3\n" + "wmadds wr3, wr8, wr3\n" + "waddwss wr0, wr3, wr0\n" + "waddwss wr5, wr9, wr5\n" + "\n" + "wstrd wr0, [%3, #16]\n" + "wstrd wr5, [%3, #24]\n" + : + : "r" (in), "r" (consts), + "r" (1 << (SBC_PROTO_FIXED8_SCALE - 1)), "r" (out), + "r" (SBC_PROTO_FIXED8_SCALE) + : "wr0", "wr1", "wr2", "wr3", "wr4", "wr5", "wr6", "wr7", + "wr8", "wr9", "wr10", "wr11", "wr12", "wr13", "wr14", "wr15", + "wcgr0", "memory"); +} + +static inline void sbc_analyze_4b_4s_iwmmxt(int16_t *x, int32_t *out, + int out_stride) +{ + /* Analyze blocks */ + sbc_analyze_four_iwmmxt(x + 12, out, analysis_consts_fixed4_simd_odd); + out += out_stride; + sbc_analyze_four_iwmmxt(x + 8, out, analysis_consts_fixed4_simd_even); + out += out_stride; + sbc_analyze_four_iwmmxt(x + 4, out, analysis_consts_fixed4_simd_odd); + out += out_stride; + sbc_analyze_four_iwmmxt(x + 0, out, analysis_consts_fixed4_simd_even); +} + +static inline void sbc_analyze_4b_8s_iwmmxt(int16_t *x, int32_t *out, + int out_stride) +{ + /* Analyze blocks */ + sbc_analyze_eight_iwmmxt(x + 24, out, analysis_consts_fixed8_simd_odd); + out += out_stride; + sbc_analyze_eight_iwmmxt(x + 16, out, analysis_consts_fixed8_simd_even); + out += out_stride; + sbc_analyze_eight_iwmmxt(x + 8, out, analysis_consts_fixed8_simd_odd); + out += out_stride; + sbc_analyze_eight_iwmmxt(x + 0, out, analysis_consts_fixed8_simd_even); +} + +void sbc_init_primitives_iwmmxt(struct sbc_encoder_state *state) +{ + state->sbc_analyze_4b_4s = sbc_analyze_4b_4s_iwmmxt; + state->sbc_analyze_4b_8s = sbc_analyze_4b_8s_iwmmxt; + state->implementation_info = "IWMMXT"; +} + +#endif diff --git a/src/modules/bluetooth/sbc/sbc_primitives_iwmmxt.h b/src/modules/bluetooth/sbc/sbc_primitives_iwmmxt.h new file mode 100644 index 0000000..b535e68 --- /dev/null +++ b/src/modules/bluetooth/sbc/sbc_primitives_iwmmxt.h @@ -0,0 +1,42 @@ +/* + * + * Bluetooth low-complexity, subband codec (SBC) library + * + * Copyright (C) 2010 Keith Mok + * Copyright (C) 2008-2010 Nokia Corporation + * Copyright (C) 2004-2010 Marcel Holtmann + * Copyright (C) 2004-2005 Henryk Ploetz + * Copyright (C) 2005-2006 Brad Midgley + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifndef __SBC_PRIMITIVES_IWMMXT_H +#define __SBC_PRIMITIVES_IWMMXT_H + +#include "sbc_primitives.h" + +#if defined(__GNUC__) && defined(__IWMMXT__) && \ + !defined(SBC_HIGH_PRECISION) && (SCALE_OUT_BITS == 15) + +#define SBC_BUILD_WITH_IWMMXT_SUPPORT + +void sbc_init_primitives_iwmmxt(struct sbc_encoder_state *encoder_state); + +#endif + +#endif diff --git a/src/modules/bluetooth/sbc/sbc_primitives_mmx.c b/src/modules/bluetooth/sbc/sbc_primitives_mmx.c new file mode 100644 index 0000000..7f2fbc3 --- /dev/null +++ b/src/modules/bluetooth/sbc/sbc_primitives_mmx.c @@ -0,0 +1,375 @@ +/* + * + * Bluetooth low-complexity, subband codec (SBC) library + * + * Copyright (C) 2008-2010 Nokia Corporation + * Copyright (C) 2004-2010 Marcel Holtmann + * Copyright (C) 2004-2005 Henryk Ploetz + * Copyright (C) 2005-2006 Brad Midgley + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include +#include +#include "sbc.h" +#include "sbc_math.h" +#include "sbc_tables.h" + +#include "sbc_primitives_mmx.h" + +/* + * MMX optimizations + */ + +#ifdef SBC_BUILD_WITH_MMX_SUPPORT + +static inline void sbc_analyze_four_mmx(const int16_t *in, int32_t *out, + const FIXED_T *consts) +{ + static const SBC_ALIGNED int32_t round_c[2] = { + 1 << (SBC_PROTO_FIXED4_SCALE - 1), + 1 << (SBC_PROTO_FIXED4_SCALE - 1), + }; + asm volatile ( + "movq (%0), %%mm0\n" + "movq 8(%0), %%mm1\n" + "pmaddwd (%1), %%mm0\n" + "pmaddwd 8(%1), %%mm1\n" + "paddd (%2), %%mm0\n" + "paddd (%2), %%mm1\n" + "\n" + "movq 16(%0), %%mm2\n" + "movq 24(%0), %%mm3\n" + "pmaddwd 16(%1), %%mm2\n" + "pmaddwd 24(%1), %%mm3\n" + "paddd %%mm2, %%mm0\n" + "paddd %%mm3, %%mm1\n" + "\n" + "movq 32(%0), %%mm2\n" + "movq 40(%0), %%mm3\n" + "pmaddwd 32(%1), %%mm2\n" + "pmaddwd 40(%1), %%mm3\n" + "paddd %%mm2, %%mm0\n" + "paddd %%mm3, %%mm1\n" + "\n" + "movq 48(%0), %%mm2\n" + "movq 56(%0), %%mm3\n" + "pmaddwd 48(%1), %%mm2\n" + "pmaddwd 56(%1), %%mm3\n" + "paddd %%mm2, %%mm0\n" + "paddd %%mm3, %%mm1\n" + "\n" + "movq 64(%0), %%mm2\n" + "movq 72(%0), %%mm3\n" + "pmaddwd 64(%1), %%mm2\n" + "pmaddwd 72(%1), %%mm3\n" + "paddd %%mm2, %%mm0\n" + "paddd %%mm3, %%mm1\n" + "\n" + "psrad %4, %%mm0\n" + "psrad %4, %%mm1\n" + "packssdw %%mm0, %%mm0\n" + "packssdw %%mm1, %%mm1\n" + "\n" + "movq %%mm0, %%mm2\n" + "pmaddwd 80(%1), %%mm0\n" + "pmaddwd 88(%1), %%mm2\n" + "\n" + "movq %%mm1, %%mm3\n" + "pmaddwd 96(%1), %%mm1\n" + "pmaddwd 104(%1), %%mm3\n" + "paddd %%mm1, %%mm0\n" + "paddd %%mm3, %%mm2\n" + "\n" + "movq %%mm0, (%3)\n" + "movq %%mm2, 8(%3)\n" + : + : "r" (in), "r" (consts), "r" (&round_c), "r" (out), + "i" (SBC_PROTO_FIXED4_SCALE) + : "cc", "memory"); +} + +static inline void sbc_analyze_eight_mmx(const int16_t *in, int32_t *out, + const FIXED_T *consts) +{ + static const SBC_ALIGNED int32_t round_c[2] = { + 1 << (SBC_PROTO_FIXED8_SCALE - 1), + 1 << (SBC_PROTO_FIXED8_SCALE - 1), + }; + asm volatile ( + "movq (%0), %%mm0\n" + "movq 8(%0), %%mm1\n" + "movq 16(%0), %%mm2\n" + "movq 24(%0), %%mm3\n" + "pmaddwd (%1), %%mm0\n" + "pmaddwd 8(%1), %%mm1\n" + "pmaddwd 16(%1), %%mm2\n" + "pmaddwd 24(%1), %%mm3\n" + "paddd (%2), %%mm0\n" + "paddd (%2), %%mm1\n" + "paddd (%2), %%mm2\n" + "paddd (%2), %%mm3\n" + "\n" + "movq 32(%0), %%mm4\n" + "movq 40(%0), %%mm5\n" + "movq 48(%0), %%mm6\n" + "movq 56(%0), %%mm7\n" + "pmaddwd 32(%1), %%mm4\n" + "pmaddwd 40(%1), %%mm5\n" + "pmaddwd 48(%1), %%mm6\n" + "pmaddwd 56(%1), %%mm7\n" + "paddd %%mm4, %%mm0\n" + "paddd %%mm5, %%mm1\n" + "paddd %%mm6, %%mm2\n" + "paddd %%mm7, %%mm3\n" + "\n" + "movq 64(%0), %%mm4\n" + "movq 72(%0), %%mm5\n" + "movq 80(%0), %%mm6\n" + "movq 88(%0), %%mm7\n" + "pmaddwd 64(%1), %%mm4\n" + "pmaddwd 72(%1), %%mm5\n" + "pmaddwd 80(%1), %%mm6\n" + "pmaddwd 88(%1), %%mm7\n" + "paddd %%mm4, %%mm0\n" + "paddd %%mm5, %%mm1\n" + "paddd %%mm6, %%mm2\n" + "paddd %%mm7, %%mm3\n" + "\n" + "movq 96(%0), %%mm4\n" + "movq 104(%0), %%mm5\n" + "movq 112(%0), %%mm6\n" + "movq 120(%0), %%mm7\n" + "pmaddwd 96(%1), %%mm4\n" + "pmaddwd 104(%1), %%mm5\n" + "pmaddwd 112(%1), %%mm6\n" + "pmaddwd 120(%1), %%mm7\n" + "paddd %%mm4, %%mm0\n" + "paddd %%mm5, %%mm1\n" + "paddd %%mm6, %%mm2\n" + "paddd %%mm7, %%mm3\n" + "\n" + "movq 128(%0), %%mm4\n" + "movq 136(%0), %%mm5\n" + "movq 144(%0), %%mm6\n" + "movq 152(%0), %%mm7\n" + "pmaddwd 128(%1), %%mm4\n" + "pmaddwd 136(%1), %%mm5\n" + "pmaddwd 144(%1), %%mm6\n" + "pmaddwd 152(%1), %%mm7\n" + "paddd %%mm4, %%mm0\n" + "paddd %%mm5, %%mm1\n" + "paddd %%mm6, %%mm2\n" + "paddd %%mm7, %%mm3\n" + "\n" + "psrad %4, %%mm0\n" + "psrad %4, %%mm1\n" + "psrad %4, %%mm2\n" + "psrad %4, %%mm3\n" + "\n" + "packssdw %%mm0, %%mm0\n" + "packssdw %%mm1, %%mm1\n" + "packssdw %%mm2, %%mm2\n" + "packssdw %%mm3, %%mm3\n" + "\n" + "movq %%mm0, %%mm4\n" + "movq %%mm0, %%mm5\n" + "pmaddwd 160(%1), %%mm4\n" + "pmaddwd 168(%1), %%mm5\n" + "\n" + "movq %%mm1, %%mm6\n" + "movq %%mm1, %%mm7\n" + "pmaddwd 192(%1), %%mm6\n" + "pmaddwd 200(%1), %%mm7\n" + "paddd %%mm6, %%mm4\n" + "paddd %%mm7, %%mm5\n" + "\n" + "movq %%mm2, %%mm6\n" + "movq %%mm2, %%mm7\n" + "pmaddwd 224(%1), %%mm6\n" + "pmaddwd 232(%1), %%mm7\n" + "paddd %%mm6, %%mm4\n" + "paddd %%mm7, %%mm5\n" + "\n" + "movq %%mm3, %%mm6\n" + "movq %%mm3, %%mm7\n" + "pmaddwd 256(%1), %%mm6\n" + "pmaddwd 264(%1), %%mm7\n" + "paddd %%mm6, %%mm4\n" + "paddd %%mm7, %%mm5\n" + "\n" + "movq %%mm4, (%3)\n" + "movq %%mm5, 8(%3)\n" + "\n" + "movq %%mm0, %%mm5\n" + "pmaddwd 176(%1), %%mm0\n" + "pmaddwd 184(%1), %%mm5\n" + "\n" + "movq %%mm1, %%mm7\n" + "pmaddwd 208(%1), %%mm1\n" + "pmaddwd 216(%1), %%mm7\n" + "paddd %%mm1, %%mm0\n" + "paddd %%mm7, %%mm5\n" + "\n" + "movq %%mm2, %%mm7\n" + "pmaddwd 240(%1), %%mm2\n" + "pmaddwd 248(%1), %%mm7\n" + "paddd %%mm2, %%mm0\n" + "paddd %%mm7, %%mm5\n" + "\n" + "movq %%mm3, %%mm7\n" + "pmaddwd 272(%1), %%mm3\n" + "pmaddwd 280(%1), %%mm7\n" + "paddd %%mm3, %%mm0\n" + "paddd %%mm7, %%mm5\n" + "\n" + "movq %%mm0, 16(%3)\n" + "movq %%mm5, 24(%3)\n" + : + : "r" (in), "r" (consts), "r" (&round_c), "r" (out), + "i" (SBC_PROTO_FIXED8_SCALE) + : "cc", "memory"); +} + +static inline void sbc_analyze_4b_4s_mmx(int16_t *x, int32_t *out, + int out_stride) +{ + /* Analyze blocks */ + sbc_analyze_four_mmx(x + 12, out, analysis_consts_fixed4_simd_odd); + out += out_stride; + sbc_analyze_four_mmx(x + 8, out, analysis_consts_fixed4_simd_even); + out += out_stride; + sbc_analyze_four_mmx(x + 4, out, analysis_consts_fixed4_simd_odd); + out += out_stride; + sbc_analyze_four_mmx(x + 0, out, analysis_consts_fixed4_simd_even); + + asm volatile ("emms\n"); +} + +static inline void sbc_analyze_4b_8s_mmx(int16_t *x, int32_t *out, + int out_stride) +{ + /* Analyze blocks */ + sbc_analyze_eight_mmx(x + 24, out, analysis_consts_fixed8_simd_odd); + out += out_stride; + sbc_analyze_eight_mmx(x + 16, out, analysis_consts_fixed8_simd_even); + out += out_stride; + sbc_analyze_eight_mmx(x + 8, out, analysis_consts_fixed8_simd_odd); + out += out_stride; + sbc_analyze_eight_mmx(x + 0, out, analysis_consts_fixed8_simd_even); + + asm volatile ("emms\n"); +} + +static void sbc_calc_scalefactors_mmx( + int32_t sb_sample_f[16][2][8], + uint32_t scale_factor[2][8], + int blocks, int channels, int subbands) +{ + static const SBC_ALIGNED int32_t consts[2] = { + 1 << SCALE_OUT_BITS, + 1 << SCALE_OUT_BITS, + }; + int ch, sb; + intptr_t blk; + for (ch = 0; ch < channels; ch++) { + for (sb = 0; sb < subbands; sb += 2) { + blk = (blocks - 1) * (((char *) &sb_sample_f[1][0][0] - + (char *) &sb_sample_f[0][0][0])); + asm volatile ( + "movq (%4), %%mm0\n" + "1:\n" + "movq (%1, %0), %%mm1\n" + "pxor %%mm2, %%mm2\n" + "pcmpgtd %%mm2, %%mm1\n" + "paddd (%1, %0), %%mm1\n" + "pcmpgtd %%mm1, %%mm2\n" + "pxor %%mm2, %%mm1\n" + + "por %%mm1, %%mm0\n" + + "sub %2, %0\n" + "jns 1b\n" + + "movd %%mm0, %k0\n" + "psrlq $32, %%mm0\n" + "bsrl %k0, %k0\n" + "subl %5, %k0\n" + "movl %k0, (%3)\n" + + "movd %%mm0, %k0\n" + "bsrl %k0, %k0\n" + "subl %5, %k0\n" + "movl %k0, 4(%3)\n" + : "+r" (blk) + : "r" (&sb_sample_f[0][ch][sb]), + "i" ((char *) &sb_sample_f[1][0][0] - + (char *) &sb_sample_f[0][0][0]), + "r" (&scale_factor[ch][sb]), + "r" (&consts), + "i" (SCALE_OUT_BITS) + : "cc", "memory"); + } + } + asm volatile ("emms\n"); +} + +static int check_mmx_support(void) +{ +#ifdef __amd64__ + return 1; /* We assume that all 64-bit processors have MMX support */ +#else + int cpuid_feature_information; + asm volatile ( + /* According to Intel manual, CPUID instruction is supported + * if the value of ID bit (bit 21) in EFLAGS can be modified */ + "pushf\n" + "movl (%%esp), %0\n" + "xorl $0x200000, (%%esp)\n" /* try to modify ID bit */ + "popf\n" + "pushf\n" + "xorl (%%esp), %0\n" /* check if ID bit changed */ + "jz 1f\n" + "push %%eax\n" + "push %%ebx\n" + "push %%ecx\n" + "mov $1, %%eax\n" + "cpuid\n" + "pop %%ecx\n" + "pop %%ebx\n" + "pop %%eax\n" + "1:\n" + "popf\n" + : "=d" (cpuid_feature_information) + : + : "cc"); + return cpuid_feature_information & (1 << 23); +#endif +} + +void sbc_init_primitives_mmx(struct sbc_encoder_state *state) +{ + if (check_mmx_support()) { + state->sbc_analyze_4b_4s = sbc_analyze_4b_4s_mmx; + state->sbc_analyze_4b_8s = sbc_analyze_4b_8s_mmx; + state->sbc_calc_scalefactors = sbc_calc_scalefactors_mmx; + state->implementation_info = "MMX"; + } +} + +#endif diff --git a/src/modules/bluetooth/sbc/sbc_primitives_mmx.h b/src/modules/bluetooth/sbc/sbc_primitives_mmx.h new file mode 100644 index 0000000..e0e728b --- /dev/null +++ b/src/modules/bluetooth/sbc/sbc_primitives_mmx.h @@ -0,0 +1,41 @@ +/* + * + * Bluetooth low-complexity, subband codec (SBC) library + * + * Copyright (C) 2008-2010 Nokia Corporation + * Copyright (C) 2004-2010 Marcel Holtmann + * Copyright (C) 2004-2005 Henryk Ploetz + * Copyright (C) 2005-2006 Brad Midgley + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifndef __SBC_PRIMITIVES_MMX_H +#define __SBC_PRIMITIVES_MMX_H + +#include "sbc_primitives.h" + +#if defined(__GNUC__) && (defined(__i386__) || defined(__amd64__)) && \ + !defined(SBC_HIGH_PRECISION) && (SCALE_OUT_BITS == 15) + +#define SBC_BUILD_WITH_MMX_SUPPORT + +void sbc_init_primitives_mmx(struct sbc_encoder_state *encoder_state); + +#endif + +#endif diff --git a/src/modules/bluetooth/sbc/sbc_primitives_neon.c b/src/modules/bluetooth/sbc/sbc_primitives_neon.c new file mode 100644 index 0000000..0572158 --- /dev/null +++ b/src/modules/bluetooth/sbc/sbc_primitives_neon.c @@ -0,0 +1,893 @@ +/* + * + * Bluetooth low-complexity, subband codec (SBC) library + * + * Copyright (C) 2008-2010 Nokia Corporation + * Copyright (C) 2004-2010 Marcel Holtmann + * Copyright (C) 2004-2005 Henryk Ploetz + * Copyright (C) 2005-2006 Brad Midgley + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include +#include +#include "sbc.h" +#include "sbc_math.h" +#include "sbc_tables.h" + +#include "sbc_primitives_neon.h" + +/* + * ARM NEON optimizations + */ + +#ifdef SBC_BUILD_WITH_NEON_SUPPORT + +static inline void _sbc_analyze_four_neon(const int16_t *in, int32_t *out, + const FIXED_T *consts) +{ + /* TODO: merge even and odd cases (or even merge all four calls to this + * function) in order to have only aligned reads from 'in' array + * and reduce number of load instructions */ + asm volatile ( + "vld1.16 {d4, d5}, [%0, :64]!\n" + "vld1.16 {d8, d9}, [%1, :128]!\n" + + "vmull.s16 q0, d4, d8\n" + "vld1.16 {d6, d7}, [%0, :64]!\n" + "vmull.s16 q1, d5, d9\n" + "vld1.16 {d10, d11}, [%1, :128]!\n" + + "vmlal.s16 q0, d6, d10\n" + "vld1.16 {d4, d5}, [%0, :64]!\n" + "vmlal.s16 q1, d7, d11\n" + "vld1.16 {d8, d9}, [%1, :128]!\n" + + "vmlal.s16 q0, d4, d8\n" + "vld1.16 {d6, d7}, [%0, :64]!\n" + "vmlal.s16 q1, d5, d9\n" + "vld1.16 {d10, d11}, [%1, :128]!\n" + + "vmlal.s16 q0, d6, d10\n" + "vld1.16 {d4, d5}, [%0, :64]!\n" + "vmlal.s16 q1, d7, d11\n" + "vld1.16 {d8, d9}, [%1, :128]!\n" + + "vmlal.s16 q0, d4, d8\n" + "vmlal.s16 q1, d5, d9\n" + + "vpadd.s32 d0, d0, d1\n" + "vpadd.s32 d1, d2, d3\n" + + "vrshrn.s32 d0, q0, %3\n" + + "vld1.16 {d2, d3, d4, d5}, [%1, :128]!\n" + + "vdup.i32 d1, d0[1]\n" /* TODO: can be eliminated */ + "vdup.i32 d0, d0[0]\n" /* TODO: can be eliminated */ + + "vmull.s16 q3, d2, d0\n" + "vmull.s16 q4, d3, d0\n" + "vmlal.s16 q3, d4, d1\n" + "vmlal.s16 q4, d5, d1\n" + + "vpadd.s32 d0, d6, d7\n" /* TODO: can be eliminated */ + "vpadd.s32 d1, d8, d9\n" /* TODO: can be eliminated */ + + "vst1.32 {d0, d1}, [%2, :128]\n" + : "+r" (in), "+r" (consts) + : "r" (out), + "i" (SBC_PROTO_FIXED4_SCALE) + : "memory", + "d0", "d1", "d2", "d3", "d4", "d5", + "d6", "d7", "d8", "d9", "d10", "d11"); +} + +static inline void _sbc_analyze_eight_neon(const int16_t *in, int32_t *out, + const FIXED_T *consts) +{ + /* TODO: merge even and odd cases (or even merge all four calls to this + * function) in order to have only aligned reads from 'in' array + * and reduce number of load instructions */ + asm volatile ( + "vld1.16 {d4, d5}, [%0, :64]!\n" + "vld1.16 {d8, d9}, [%1, :128]!\n" + + "vmull.s16 q6, d4, d8\n" + "vld1.16 {d6, d7}, [%0, :64]!\n" + "vmull.s16 q7, d5, d9\n" + "vld1.16 {d10, d11}, [%1, :128]!\n" + "vmull.s16 q8, d6, d10\n" + "vld1.16 {d4, d5}, [%0, :64]!\n" + "vmull.s16 q9, d7, d11\n" + "vld1.16 {d8, d9}, [%1, :128]!\n" + + "vmlal.s16 q6, d4, d8\n" + "vld1.16 {d6, d7}, [%0, :64]!\n" + "vmlal.s16 q7, d5, d9\n" + "vld1.16 {d10, d11}, [%1, :128]!\n" + "vmlal.s16 q8, d6, d10\n" + "vld1.16 {d4, d5}, [%0, :64]!\n" + "vmlal.s16 q9, d7, d11\n" + "vld1.16 {d8, d9}, [%1, :128]!\n" + + "vmlal.s16 q6, d4, d8\n" + "vld1.16 {d6, d7}, [%0, :64]!\n" + "vmlal.s16 q7, d5, d9\n" + "vld1.16 {d10, d11}, [%1, :128]!\n" + "vmlal.s16 q8, d6, d10\n" + "vld1.16 {d4, d5}, [%0, :64]!\n" + "vmlal.s16 q9, d7, d11\n" + "vld1.16 {d8, d9}, [%1, :128]!\n" + + "vmlal.s16 q6, d4, d8\n" + "vld1.16 {d6, d7}, [%0, :64]!\n" + "vmlal.s16 q7, d5, d9\n" + "vld1.16 {d10, d11}, [%1, :128]!\n" + "vmlal.s16 q8, d6, d10\n" + "vld1.16 {d4, d5}, [%0, :64]!\n" + "vmlal.s16 q9, d7, d11\n" + "vld1.16 {d8, d9}, [%1, :128]!\n" + + "vmlal.s16 q6, d4, d8\n" + "vld1.16 {d6, d7}, [%0, :64]!\n" + "vmlal.s16 q7, d5, d9\n" + "vld1.16 {d10, d11}, [%1, :128]!\n" + + "vmlal.s16 q8, d6, d10\n" + "vmlal.s16 q9, d7, d11\n" + + "vpadd.s32 d0, d12, d13\n" + "vpadd.s32 d1, d14, d15\n" + "vpadd.s32 d2, d16, d17\n" + "vpadd.s32 d3, d18, d19\n" + + "vrshr.s32 q0, q0, %3\n" + "vrshr.s32 q1, q1, %3\n" + "vmovn.s32 d0, q0\n" + "vmovn.s32 d1, q1\n" + + "vdup.i32 d3, d1[1]\n" /* TODO: can be eliminated */ + "vdup.i32 d2, d1[0]\n" /* TODO: can be eliminated */ + "vdup.i32 d1, d0[1]\n" /* TODO: can be eliminated */ + "vdup.i32 d0, d0[0]\n" /* TODO: can be eliminated */ + + "vld1.16 {d4, d5}, [%1, :128]!\n" + "vmull.s16 q6, d4, d0\n" + "vld1.16 {d6, d7}, [%1, :128]!\n" + "vmull.s16 q7, d5, d0\n" + "vmull.s16 q8, d6, d0\n" + "vmull.s16 q9, d7, d0\n" + + "vld1.16 {d4, d5}, [%1, :128]!\n" + "vmlal.s16 q6, d4, d1\n" + "vld1.16 {d6, d7}, [%1, :128]!\n" + "vmlal.s16 q7, d5, d1\n" + "vmlal.s16 q8, d6, d1\n" + "vmlal.s16 q9, d7, d1\n" + + "vld1.16 {d4, d5}, [%1, :128]!\n" + "vmlal.s16 q6, d4, d2\n" + "vld1.16 {d6, d7}, [%1, :128]!\n" + "vmlal.s16 q7, d5, d2\n" + "vmlal.s16 q8, d6, d2\n" + "vmlal.s16 q9, d7, d2\n" + + "vld1.16 {d4, d5}, [%1, :128]!\n" + "vmlal.s16 q6, d4, d3\n" + "vld1.16 {d6, d7}, [%1, :128]!\n" + "vmlal.s16 q7, d5, d3\n" + "vmlal.s16 q8, d6, d3\n" + "vmlal.s16 q9, d7, d3\n" + + "vpadd.s32 d0, d12, d13\n" /* TODO: can be eliminated */ + "vpadd.s32 d1, d14, d15\n" /* TODO: can be eliminated */ + "vpadd.s32 d2, d16, d17\n" /* TODO: can be eliminated */ + "vpadd.s32 d3, d18, d19\n" /* TODO: can be eliminated */ + + "vst1.32 {d0, d1, d2, d3}, [%2, :128]\n" + : "+r" (in), "+r" (consts) + : "r" (out), + "i" (SBC_PROTO_FIXED8_SCALE) + : "memory", + "d0", "d1", "d2", "d3", "d4", "d5", + "d6", "d7", "d8", "d9", "d10", "d11", + "d12", "d13", "d14", "d15", "d16", "d17", + "d18", "d19"); +} + +static inline void sbc_analyze_4b_4s_neon(int16_t *x, + int32_t *out, int out_stride) +{ + /* Analyze blocks */ + _sbc_analyze_four_neon(x + 12, out, analysis_consts_fixed4_simd_odd); + out += out_stride; + _sbc_analyze_four_neon(x + 8, out, analysis_consts_fixed4_simd_even); + out += out_stride; + _sbc_analyze_four_neon(x + 4, out, analysis_consts_fixed4_simd_odd); + out += out_stride; + _sbc_analyze_four_neon(x + 0, out, analysis_consts_fixed4_simd_even); +} + +static inline void sbc_analyze_4b_8s_neon(int16_t *x, + int32_t *out, int out_stride) +{ + /* Analyze blocks */ + _sbc_analyze_eight_neon(x + 24, out, analysis_consts_fixed8_simd_odd); + out += out_stride; + _sbc_analyze_eight_neon(x + 16, out, analysis_consts_fixed8_simd_even); + out += out_stride; + _sbc_analyze_eight_neon(x + 8, out, analysis_consts_fixed8_simd_odd); + out += out_stride; + _sbc_analyze_eight_neon(x + 0, out, analysis_consts_fixed8_simd_even); +} + +static void sbc_calc_scalefactors_neon( + int32_t sb_sample_f[16][2][8], + uint32_t scale_factor[2][8], + int blocks, int channels, int subbands) +{ + int ch, sb; + for (ch = 0; ch < channels; ch++) { + for (sb = 0; sb < subbands; sb += 4) { + int blk = blocks; + int32_t *in = &sb_sample_f[0][ch][sb]; + asm volatile ( + "vmov.s32 q0, #0\n" + "vmov.s32 q1, %[c1]\n" + "vmov.s32 q14, #1\n" + "vmov.s32 q15, %[c2]\n" + "vadd.s32 q1, q1, q14\n" + "1:\n" + "vld1.32 {d16, d17}, [%[in], :128], %[inc]\n" + "vabs.s32 q8, q8\n" + "vld1.32 {d18, d19}, [%[in], :128], %[inc]\n" + "vabs.s32 q9, q9\n" + "vld1.32 {d20, d21}, [%[in], :128], %[inc]\n" + "vabs.s32 q10, q10\n" + "vld1.32 {d22, d23}, [%[in], :128], %[inc]\n" + "vabs.s32 q11, q11\n" + "vmax.s32 q0, q0, q8\n" + "vmax.s32 q1, q1, q9\n" + "vmax.s32 q0, q0, q10\n" + "vmax.s32 q1, q1, q11\n" + "subs %[blk], %[blk], #4\n" + "bgt 1b\n" + "vmax.s32 q0, q0, q1\n" + "vsub.s32 q0, q0, q14\n" + "vclz.s32 q0, q0\n" + "vsub.s32 q0, q15, q0\n" + "vst1.32 {d0, d1}, [%[out], :128]\n" + : + [blk] "+r" (blk), + [in] "+r" (in) + : + [inc] "r" ((char *) &sb_sample_f[1][0][0] - + (char *) &sb_sample_f[0][0][0]), + [out] "r" (&scale_factor[ch][sb]), + [c1] "i" (1 << SCALE_OUT_BITS), + [c2] "i" (31 - SCALE_OUT_BITS) + : "d0", "d1", "d2", "d3", "d16", "d17", "d18", "d19", + "d20", "d21", "d22", "d23", "d24", "d25", "d26", + "d27", "d28", "d29", "d30", "d31", "cc", "memory"); + } + } +} + +int sbc_calc_scalefactors_j_neon( + int32_t sb_sample_f[16][2][8], + uint32_t scale_factor[2][8], + int blocks, int subbands) +{ + static SBC_ALIGNED int32_t joint_bits_mask[8] = { + 8, 4, 2, 1, 128, 64, 32, 16 + }; + int joint, i; + int32_t *in0, *in1; + int32_t *in = &sb_sample_f[0][0][0]; + uint32_t *out0, *out1; + uint32_t *out = &scale_factor[0][0]; + int32_t *consts = joint_bits_mask; + + i = subbands; + + asm volatile ( + /* + * constants: q13 = (31 - SCALE_OUT_BITS), q14 = 1 + * input: q0 = ((1 << SCALE_OUT_BITS) + 1) + * %[in0] - samples for channel 0 + * %[in1] - samples for shannel 1 + * output: q0, q1 - scale factors without joint stereo + * q2, q3 - scale factors with joint stereo + * q15 - joint stereo selection mask + */ + ".macro calc_scalefactors\n" + "vmov.s32 q1, q0\n" + "vmov.s32 q2, q0\n" + "vmov.s32 q3, q0\n" + "mov %[i], %[blocks]\n" + "1:\n" + "vld1.32 {d18, d19}, [%[in1], :128], %[inc]\n" + "vbic.s32 q11, q9, q14\n" + "vld1.32 {d16, d17}, [%[in0], :128], %[inc]\n" + "vhadd.s32 q10, q8, q11\n" + "vhsub.s32 q11, q8, q11\n" + "vabs.s32 q8, q8\n" + "vabs.s32 q9, q9\n" + "vabs.s32 q10, q10\n" + "vabs.s32 q11, q11\n" + "vmax.s32 q0, q0, q8\n" + "vmax.s32 q1, q1, q9\n" + "vmax.s32 q2, q2, q10\n" + "vmax.s32 q3, q3, q11\n" + "subs %[i], %[i], #1\n" + "bgt 1b\n" + "vsub.s32 q0, q0, q14\n" + "vsub.s32 q1, q1, q14\n" + "vsub.s32 q2, q2, q14\n" + "vsub.s32 q3, q3, q14\n" + "vclz.s32 q0, q0\n" + "vclz.s32 q1, q1\n" + "vclz.s32 q2, q2\n" + "vclz.s32 q3, q3\n" + "vsub.s32 q0, q13, q0\n" + "vsub.s32 q1, q13, q1\n" + "vsub.s32 q2, q13, q2\n" + "vsub.s32 q3, q13, q3\n" + ".endm\n" + /* + * constants: q14 = 1 + * input: q15 - joint stereo selection mask + * %[in0] - value set by calc_scalefactors macro + * %[in1] - value set by calc_scalefactors macro + */ + ".macro update_joint_stereo_samples\n" + "sub %[out1], %[in1], %[inc]\n" + "sub %[out0], %[in0], %[inc]\n" + "sub %[in1], %[in1], %[inc], asl #1\n" + "sub %[in0], %[in0], %[inc], asl #1\n" + "vld1.32 {d18, d19}, [%[in1], :128]\n" + "vbic.s32 q11, q9, q14\n" + "vld1.32 {d16, d17}, [%[in0], :128]\n" + "vld1.32 {d2, d3}, [%[out1], :128]\n" + "vbic.s32 q3, q1, q14\n" + "vld1.32 {d0, d1}, [%[out0], :128]\n" + "vhsub.s32 q10, q8, q11\n" + "vhadd.s32 q11, q8, q11\n" + "vhsub.s32 q2, q0, q3\n" + "vhadd.s32 q3, q0, q3\n" + "vbif.s32 q10, q9, q15\n" + "vbif.s32 d22, d16, d30\n" + "sub %[inc], %[zero], %[inc], asl #1\n" + "sub %[i], %[blocks], #2\n" + "2:\n" + "vbif.s32 d23, d17, d31\n" + "vst1.32 {d20, d21}, [%[in1], :128], %[inc]\n" + "vbif.s32 d4, d2, d30\n" + "vld1.32 {d18, d19}, [%[in1], :128]\n" + "vbif.s32 d5, d3, d31\n" + "vst1.32 {d22, d23}, [%[in0], :128], %[inc]\n" + "vbif.s32 d6, d0, d30\n" + "vld1.32 {d16, d17}, [%[in0], :128]\n" + "vbif.s32 d7, d1, d31\n" + "vst1.32 {d4, d5}, [%[out1], :128], %[inc]\n" + "vbic.s32 q11, q9, q14\n" + "vld1.32 {d2, d3}, [%[out1], :128]\n" + "vst1.32 {d6, d7}, [%[out0], :128], %[inc]\n" + "vbic.s32 q3, q1, q14\n" + "vld1.32 {d0, d1}, [%[out0], :128]\n" + "vhsub.s32 q10, q8, q11\n" + "vhadd.s32 q11, q8, q11\n" + "vhsub.s32 q2, q0, q3\n" + "vhadd.s32 q3, q0, q3\n" + "vbif.s32 q10, q9, q15\n" + "vbif.s32 d22, d16, d30\n" + "subs %[i], %[i], #2\n" + "bgt 2b\n" + "sub %[inc], %[zero], %[inc], asr #1\n" + "vbif.s32 d23, d17, d31\n" + "vst1.32 {d20, d21}, [%[in1], :128]\n" + "vbif.s32 q2, q1, q15\n" + "vst1.32 {d22, d23}, [%[in0], :128]\n" + "vbif.s32 q3, q0, q15\n" + "vst1.32 {d4, d5}, [%[out1], :128]\n" + "vst1.32 {d6, d7}, [%[out0], :128]\n" + ".endm\n" + + "vmov.s32 q14, #1\n" + "vmov.s32 q13, %[c2]\n" + + "cmp %[i], #4\n" + "bne 8f\n" + + "4:\n" /* 4 subbands */ + "add %[in0], %[in], #0\n" + "add %[in1], %[in], #32\n" + "add %[out0], %[out], #0\n" + "add %[out1], %[out], #32\n" + "vmov.s32 q0, %[c1]\n" + "vadd.s32 q0, q0, q14\n" + + "calc_scalefactors\n" + + /* check whether to use joint stereo for subbands 0, 1, 2 */ + "vadd.s32 q15, q0, q1\n" + "vadd.s32 q9, q2, q3\n" + "vmov.s32 d31[1], %[zero]\n" /* last subband -> no joint */ + "vld1.32 {d16, d17}, [%[consts], :128]!\n" + "vcgt.s32 q15, q15, q9\n" + + /* calculate and save to memory 'joint' variable */ + /* update and save scale factors to memory */ + " vand.s32 q8, q8, q15\n" + "vbit.s32 q0, q2, q15\n" + " vpadd.s32 d16, d16, d17\n" + "vbit.s32 q1, q3, q15\n" + " vpadd.s32 d16, d16, d16\n" + "vst1.32 {d0, d1}, [%[out0], :128]\n" + "vst1.32 {d2, d3}, [%[out1], :128]\n" + " vst1.32 {d16[0]}, [%[joint]]\n" + + "update_joint_stereo_samples\n" + "b 9f\n" + + "8:\n" /* 8 subbands */ + "add %[in0], %[in], #16\n\n" + "add %[in1], %[in], #48\n" + "add %[out0], %[out], #16\n\n" + "add %[out1], %[out], #48\n" + "vmov.s32 q0, %[c1]\n" + "vadd.s32 q0, q0, q14\n" + + "calc_scalefactors\n" + + /* check whether to use joint stereo for subbands 4, 5, 6 */ + "vadd.s32 q15, q0, q1\n" + "vadd.s32 q9, q2, q3\n" + "vmov.s32 d31[1], %[zero]\n" /* last subband -> no joint */ + "vld1.32 {d16, d17}, [%[consts], :128]!\n" + "vcgt.s32 q15, q15, q9\n" + + /* calculate part of 'joint' variable and save it to d24 */ + /* update and save scale factors to memory */ + " vand.s32 q8, q8, q15\n" + "vbit.s32 q0, q2, q15\n" + " vpadd.s32 d16, d16, d17\n" + "vbit.s32 q1, q3, q15\n" + "vst1.32 {d0, d1}, [%[out0], :128]\n" + "vst1.32 {d2, d3}, [%[out1], :128]\n" + " vpadd.s32 d24, d16, d16\n" + + "update_joint_stereo_samples\n" + + "add %[in0], %[in], #0\n" + "add %[in1], %[in], #32\n" + "add %[out0], %[out], #0\n\n" + "add %[out1], %[out], #32\n" + "vmov.s32 q0, %[c1]\n" + "vadd.s32 q0, q0, q14\n" + + "calc_scalefactors\n" + + /* check whether to use joint stereo for subbands 0, 1, 2, 3 */ + "vadd.s32 q15, q0, q1\n" + "vadd.s32 q9, q2, q3\n" + "vld1.32 {d16, d17}, [%[consts], :128]!\n" + "vcgt.s32 q15, q15, q9\n" + + /* combine last part of 'joint' with d24 and save to memory */ + /* update and save scale factors to memory */ + " vand.s32 q8, q8, q15\n" + "vbit.s32 q0, q2, q15\n" + " vpadd.s32 d16, d16, d17\n" + "vbit.s32 q1, q3, q15\n" + " vpadd.s32 d16, d16, d16\n" + "vst1.32 {d0, d1}, [%[out0], :128]\n" + " vadd.s32 d16, d16, d24\n" + "vst1.32 {d2, d3}, [%[out1], :128]\n" + " vst1.32 {d16[0]}, [%[joint]]\n" + + "update_joint_stereo_samples\n" + "9:\n" + ".purgem calc_scalefactors\n" + ".purgem update_joint_stereo_samples\n" + : + [i] "+&r" (i), + [in] "+&r" (in), + [in0] "=&r" (in0), + [in1] "=&r" (in1), + [out] "+&r" (out), + [out0] "=&r" (out0), + [out1] "=&r" (out1), + [consts] "+&r" (consts) + : + [inc] "r" ((char *) &sb_sample_f[1][0][0] - + (char *) &sb_sample_f[0][0][0]), + [blocks] "r" (blocks), + [joint] "r" (&joint), + [c1] "i" (1 << SCALE_OUT_BITS), + [c2] "i" (31 - SCALE_OUT_BITS), + [zero] "r" (0) + : "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", + "d16", "d17", "d18", "d19", "d20", "d21", "d22", + "d23", "d24", "d25", "d26", "d27", "d28", "d29", + "d30", "d31", "cc", "memory"); + + return joint; +} + +#define PERM_BE(a, b, c, d) { \ + (a * 2) + 1, (a * 2) + 0, \ + (b * 2) + 1, (b * 2) + 0, \ + (c * 2) + 1, (c * 2) + 0, \ + (d * 2) + 1, (d * 2) + 0 \ + } +#define PERM_LE(a, b, c, d) { \ + (a * 2) + 0, (a * 2) + 1, \ + (b * 2) + 0, (b * 2) + 1, \ + (c * 2) + 0, (c * 2) + 1, \ + (d * 2) + 0, (d * 2) + 1 \ + } + +static SBC_ALWAYS_INLINE int sbc_enc_process_input_4s_neon_internal( + int position, + const uint8_t *pcm, int16_t X[2][SBC_X_BUFFER_SIZE], + int nsamples, int nchannels, int big_endian) +{ + static SBC_ALIGNED uint8_t perm_be[2][8] = { + PERM_BE(7, 3, 6, 4), + PERM_BE(0, 2, 1, 5) + }; + static SBC_ALIGNED uint8_t perm_le[2][8] = { + PERM_LE(7, 3, 6, 4), + PERM_LE(0, 2, 1, 5) + }; + /* handle X buffer wraparound */ + if (position < nsamples) { + int16_t *dst = &X[0][SBC_X_BUFFER_SIZE - 40]; + int16_t *src = &X[0][position]; + asm volatile ( + "vld1.16 {d0, d1, d2, d3}, [%[src], :128]!\n" + "vst1.16 {d0, d1, d2, d3}, [%[dst], :128]!\n" + "vld1.16 {d0, d1, d2, d3}, [%[src], :128]!\n" + "vst1.16 {d0, d1, d2, d3}, [%[dst], :128]!\n" + "vld1.16 {d0}, [%[src], :64]!\n" + "vst1.16 {d0}, [%[dst], :64]!\n" + : + [dst] "+r" (dst), + [src] "+r" (src) + : : "memory", "d0", "d1", "d2", "d3"); + if (nchannels > 1) { + dst = &X[1][SBC_X_BUFFER_SIZE - 40]; + src = &X[1][position]; + asm volatile ( + "vld1.16 {d0, d1, d2, d3}, [%[src], :128]!\n" + "vst1.16 {d0, d1, d2, d3}, [%[dst], :128]!\n" + "vld1.16 {d0, d1, d2, d3}, [%[src], :128]!\n" + "vst1.16 {d0, d1, d2, d3}, [%[dst], :128]!\n" + "vld1.16 {d0}, [%[src], :64]!\n" + "vst1.16 {d0}, [%[dst], :64]!\n" + : + [dst] "+r" (dst), + [src] "+r" (src) + : : "memory", "d0", "d1", "d2", "d3"); + } + position = SBC_X_BUFFER_SIZE - 40; + } + + if ((nchannels > 1) && ((uintptr_t)pcm & 1)) { + /* poor 'pcm' alignment */ + int16_t *x = &X[0][position]; + int16_t *y = &X[1][position]; + asm volatile ( + "vld1.8 {d0, d1}, [%[perm], :128]\n" + "1:\n" + "sub %[x], %[x], #16\n" + "sub %[y], %[y], #16\n" + "sub %[position], %[position], #8\n" + "vld1.8 {d4, d5}, [%[pcm]]!\n" + "vuzp.16 d4, d5\n" + "vld1.8 {d20, d21}, [%[pcm]]!\n" + "vuzp.16 d20, d21\n" + "vswp d5, d20\n" + "vtbl.8 d16, {d4, d5}, d0\n" + "vtbl.8 d17, {d4, d5}, d1\n" + "vtbl.8 d18, {d20, d21}, d0\n" + "vtbl.8 d19, {d20, d21}, d1\n" + "vst1.16 {d16, d17}, [%[x], :128]\n" + "vst1.16 {d18, d19}, [%[y], :128]\n" + "subs %[nsamples], %[nsamples], #8\n" + "bgt 1b\n" + : + [x] "+r" (x), + [y] "+r" (y), + [pcm] "+r" (pcm), + [nsamples] "+r" (nsamples), + [position] "+r" (position) + : + [perm] "r" (big_endian ? perm_be : perm_le) + : "cc", "memory", "d0", "d1", "d2", "d3", "d4", + "d5", "d6", "d7", "d16", "d17", "d18", "d19", + "d20", "d21", "d22", "d23"); + } else if (nchannels > 1) { + /* proper 'pcm' alignment */ + int16_t *x = &X[0][position]; + int16_t *y = &X[1][position]; + asm volatile ( + "vld1.8 {d0, d1}, [%[perm], :128]\n" + "1:\n" + "sub %[x], %[x], #16\n" + "sub %[y], %[y], #16\n" + "sub %[position], %[position], #8\n" + "vld2.16 {d4, d5}, [%[pcm]]!\n" + "vld2.16 {d20, d21}, [%[pcm]]!\n" + "vswp d5, d20\n" + "vtbl.8 d16, {d4, d5}, d0\n" + "vtbl.8 d17, {d4, d5}, d1\n" + "vtbl.8 d18, {d20, d21}, d0\n" + "vtbl.8 d19, {d20, d21}, d1\n" + "vst1.16 {d16, d17}, [%[x], :128]\n" + "vst1.16 {d18, d19}, [%[y], :128]\n" + "subs %[nsamples], %[nsamples], #8\n" + "bgt 1b\n" + : + [x] "+r" (x), + [y] "+r" (y), + [pcm] "+r" (pcm), + [nsamples] "+r" (nsamples), + [position] "+r" (position) + : + [perm] "r" (big_endian ? perm_be : perm_le) + : "cc", "memory", "d0", "d1", "d2", "d3", "d4", + "d5", "d6", "d7", "d16", "d17", "d18", "d19", + "d20", "d21", "d22", "d23"); + } else { + int16_t *x = &X[0][position]; + asm volatile ( + "vld1.8 {d0, d1}, [%[perm], :128]\n" + "1:\n" + "sub %[x], %[x], #16\n" + "sub %[position], %[position], #8\n" + "vld1.8 {d4, d5}, [%[pcm]]!\n" + "vtbl.8 d16, {d4, d5}, d0\n" + "vtbl.8 d17, {d4, d5}, d1\n" + "vst1.16 {d16, d17}, [%[x], :128]\n" + "subs %[nsamples], %[nsamples], #8\n" + "bgt 1b\n" + : + [x] "+r" (x), + [pcm] "+r" (pcm), + [nsamples] "+r" (nsamples), + [position] "+r" (position) + : + [perm] "r" (big_endian ? perm_be : perm_le) + : "cc", "memory", "d0", "d1", "d2", "d3", "d4", + "d5", "d6", "d7", "d16", "d17", "d18", "d19"); + } + return position; +} + +static SBC_ALWAYS_INLINE int sbc_enc_process_input_8s_neon_internal( + int position, + const uint8_t *pcm, int16_t X[2][SBC_X_BUFFER_SIZE], + int nsamples, int nchannels, int big_endian) +{ + static SBC_ALIGNED uint8_t perm_be[4][8] = { + PERM_BE(15, 7, 14, 8), + PERM_BE(13, 9, 12, 10), + PERM_BE(11, 3, 6, 0), + PERM_BE(5, 1, 4, 2) + }; + static SBC_ALIGNED uint8_t perm_le[4][8] = { + PERM_LE(15, 7, 14, 8), + PERM_LE(13, 9, 12, 10), + PERM_LE(11, 3, 6, 0), + PERM_LE(5, 1, 4, 2) + }; + /* handle X buffer wraparound */ + if (position < nsamples) { + int16_t *dst = &X[0][SBC_X_BUFFER_SIZE - 72]; + int16_t *src = &X[0][position]; + asm volatile ( + "vld1.16 {d0, d1, d2, d3}, [%[src], :128]!\n" + "vst1.16 {d0, d1, d2, d3}, [%[dst], :128]!\n" + "vld1.16 {d0, d1, d2, d3}, [%[src], :128]!\n" + "vst1.16 {d0, d1, d2, d3}, [%[dst], :128]!\n" + "vld1.16 {d0, d1, d2, d3}, [%[src], :128]!\n" + "vst1.16 {d0, d1, d2, d3}, [%[dst], :128]!\n" + "vld1.16 {d0, d1, d2, d3}, [%[src], :128]!\n" + "vst1.16 {d0, d1, d2, d3}, [%[dst], :128]!\n" + "vld1.16 {d0, d1}, [%[src], :128]!\n" + "vst1.16 {d0, d1}, [%[dst], :128]!\n" + : + [dst] "+r" (dst), + [src] "+r" (src) + : : "memory", "d0", "d1", "d2", "d3"); + if (nchannels > 1) { + dst = &X[1][SBC_X_BUFFER_SIZE - 72]; + src = &X[1][position]; + asm volatile ( + "vld1.16 {d0, d1, d2, d3}, [%[src], :128]!\n" + "vst1.16 {d0, d1, d2, d3}, [%[dst], :128]!\n" + "vld1.16 {d0, d1, d2, d3}, [%[src], :128]!\n" + "vst1.16 {d0, d1, d2, d3}, [%[dst], :128]!\n" + "vld1.16 {d0, d1, d2, d3}, [%[src], :128]!\n" + "vst1.16 {d0, d1, d2, d3}, [%[dst], :128]!\n" + "vld1.16 {d0, d1, d2, d3}, [%[src], :128]!\n" + "vst1.16 {d0, d1, d2, d3}, [%[dst], :128]!\n" + "vld1.16 {d0, d1}, [%[src], :128]!\n" + "vst1.16 {d0, d1}, [%[dst], :128]!\n" + : + [dst] "+r" (dst), + [src] "+r" (src) + : : "memory", "d0", "d1", "d2", "d3"); + } + position = SBC_X_BUFFER_SIZE - 72; + } + + if ((nchannels > 1) && ((uintptr_t)pcm & 1)) { + /* poor 'pcm' alignment */ + int16_t *x = &X[0][position]; + int16_t *y = &X[1][position]; + asm volatile ( + "vld1.8 {d0, d1, d2, d3}, [%[perm], :128]\n" + "1:\n" + "sub %[x], %[x], #32\n" + "sub %[y], %[y], #32\n" + "sub %[position], %[position], #16\n" + "vld1.8 {d4, d5, d6, d7}, [%[pcm]]!\n" + "vuzp.16 q2, q3\n" + "vld1.8 {d20, d21, d22, d23}, [%[pcm]]!\n" + "vuzp.16 q10, q11\n" + "vswp q3, q10\n" + "vtbl.8 d16, {d4, d5, d6, d7}, d0\n" + "vtbl.8 d17, {d4, d5, d6, d7}, d1\n" + "vtbl.8 d18, {d4, d5, d6, d7}, d2\n" + "vtbl.8 d19, {d4, d5, d6, d7}, d3\n" + "vst1.16 {d16, d17, d18, d19}, [%[x], :128]\n" + "vtbl.8 d16, {d20, d21, d22, d23}, d0\n" + "vtbl.8 d17, {d20, d21, d22, d23}, d1\n" + "vtbl.8 d18, {d20, d21, d22, d23}, d2\n" + "vtbl.8 d19, {d20, d21, d22, d23}, d3\n" + "vst1.16 {d16, d17, d18, d19}, [%[y], :128]\n" + "subs %[nsamples], %[nsamples], #16\n" + "bgt 1b\n" + : + [x] "+r" (x), + [y] "+r" (y), + [pcm] "+r" (pcm), + [nsamples] "+r" (nsamples), + [position] "+r" (position) + : + [perm] "r" (big_endian ? perm_be : perm_le) + : "cc", "memory", "d0", "d1", "d2", "d3", "d4", + "d5", "d6", "d7", "d16", "d17", "d18", "d19", + "d20", "d21", "d22", "d23"); + } else if (nchannels > 1) { + /* proper 'pcm' alignment */ + int16_t *x = &X[0][position]; + int16_t *y = &X[1][position]; + asm volatile ( + "vld1.8 {d0, d1, d2, d3}, [%[perm], :128]\n" + "1:\n" + "sub %[x], %[x], #32\n" + "sub %[y], %[y], #32\n" + "sub %[position], %[position], #16\n" + "vld2.16 {d4, d5, d6, d7}, [%[pcm]]!\n" + "vld2.16 {d20, d21, d22, d23}, [%[pcm]]!\n" + "vswp q3, q10\n" + "vtbl.8 d16, {d4, d5, d6, d7}, d0\n" + "vtbl.8 d17, {d4, d5, d6, d7}, d1\n" + "vtbl.8 d18, {d4, d5, d6, d7}, d2\n" + "vtbl.8 d19, {d4, d5, d6, d7}, d3\n" + "vst1.16 {d16, d17, d18, d19}, [%[x], :128]\n" + "vtbl.8 d16, {d20, d21, d22, d23}, d0\n" + "vtbl.8 d17, {d20, d21, d22, d23}, d1\n" + "vtbl.8 d18, {d20, d21, d22, d23}, d2\n" + "vtbl.8 d19, {d20, d21, d22, d23}, d3\n" + "vst1.16 {d16, d17, d18, d19}, [%[y], :128]\n" + "subs %[nsamples], %[nsamples], #16\n" + "bgt 1b\n" + : + [x] "+r" (x), + [y] "+r" (y), + [pcm] "+r" (pcm), + [nsamples] "+r" (nsamples), + [position] "+r" (position) + : + [perm] "r" (big_endian ? perm_be : perm_le) + : "cc", "memory", "d0", "d1", "d2", "d3", "d4", + "d5", "d6", "d7", "d16", "d17", "d18", "d19", + "d20", "d21", "d22", "d23"); + } else { + int16_t *x = &X[0][position]; + asm volatile ( + "vld1.8 {d0, d1, d2, d3}, [%[perm], :128]\n" + "1:\n" + "sub %[x], %[x], #32\n" + "sub %[position], %[position], #16\n" + "vld1.8 {d4, d5, d6, d7}, [%[pcm]]!\n" + "vtbl.8 d16, {d4, d5, d6, d7}, d0\n" + "vtbl.8 d17, {d4, d5, d6, d7}, d1\n" + "vtbl.8 d18, {d4, d5, d6, d7}, d2\n" + "vtbl.8 d19, {d4, d5, d6, d7}, d3\n" + "vst1.16 {d16, d17, d18, d19}, [%[x], :128]\n" + "subs %[nsamples], %[nsamples], #16\n" + "bgt 1b\n" + : + [x] "+r" (x), + [pcm] "+r" (pcm), + [nsamples] "+r" (nsamples), + [position] "+r" (position) + : + [perm] "r" (big_endian ? perm_be : perm_le) + : "cc", "memory", "d0", "d1", "d2", "d3", "d4", + "d5", "d6", "d7", "d16", "d17", "d18", "d19"); + } + return position; +} + +#undef PERM_BE +#undef PERM_LE + +static int sbc_enc_process_input_4s_be_neon(int position, const uint8_t *pcm, + int16_t X[2][SBC_X_BUFFER_SIZE], + int nsamples, int nchannels) +{ + return sbc_enc_process_input_4s_neon_internal( + position, pcm, X, nsamples, nchannels, 1); +} + +static int sbc_enc_process_input_4s_le_neon(int position, const uint8_t *pcm, + int16_t X[2][SBC_X_BUFFER_SIZE], + int nsamples, int nchannels) +{ + return sbc_enc_process_input_4s_neon_internal( + position, pcm, X, nsamples, nchannels, 0); +} + +static int sbc_enc_process_input_8s_be_neon(int position, const uint8_t *pcm, + int16_t X[2][SBC_X_BUFFER_SIZE], + int nsamples, int nchannels) +{ + return sbc_enc_process_input_8s_neon_internal( + position, pcm, X, nsamples, nchannels, 1); +} + +static int sbc_enc_process_input_8s_le_neon(int position, const uint8_t *pcm, + int16_t X[2][SBC_X_BUFFER_SIZE], + int nsamples, int nchannels) +{ + return sbc_enc_process_input_8s_neon_internal( + position, pcm, X, nsamples, nchannels, 0); +} + +void sbc_init_primitives_neon(struct sbc_encoder_state *state) +{ + state->sbc_analyze_4b_4s = sbc_analyze_4b_4s_neon; + state->sbc_analyze_4b_8s = sbc_analyze_4b_8s_neon; + state->sbc_calc_scalefactors = sbc_calc_scalefactors_neon; + state->sbc_calc_scalefactors_j = sbc_calc_scalefactors_j_neon; + state->sbc_enc_process_input_4s_le = sbc_enc_process_input_4s_le_neon; + state->sbc_enc_process_input_4s_be = sbc_enc_process_input_4s_be_neon; + state->sbc_enc_process_input_8s_le = sbc_enc_process_input_8s_le_neon; + state->sbc_enc_process_input_8s_be = sbc_enc_process_input_8s_be_neon; + state->implementation_info = "NEON"; +} + +#endif diff --git a/src/modules/bluetooth/sbc/sbc_primitives_neon.h b/src/modules/bluetooth/sbc/sbc_primitives_neon.h new file mode 100644 index 0000000..ea3da06 --- /dev/null +++ b/src/modules/bluetooth/sbc/sbc_primitives_neon.h @@ -0,0 +1,41 @@ +/* + * + * Bluetooth low-complexity, subband codec (SBC) library + * + * Copyright (C) 2008-2010 Nokia Corporation + * Copyright (C) 2004-2010 Marcel Holtmann + * Copyright (C) 2004-2005 Henryk Ploetz + * Copyright (C) 2005-2006 Brad Midgley + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifndef __SBC_PRIMITIVES_NEON_H +#define __SBC_PRIMITIVES_NEON_H + +#include "sbc_primitives.h" + +#if defined(__GNUC__) && defined(__ARM_NEON__) && \ + !defined(SBC_HIGH_PRECISION) && (SCALE_OUT_BITS == 15) + +#define SBC_BUILD_WITH_NEON_SUPPORT + +void sbc_init_primitives_neon(struct sbc_encoder_state *encoder_state); + +#endif + +#endif diff --git a/src/modules/bluetooth/sbc/sbc_tables.h b/src/modules/bluetooth/sbc/sbc_tables.h new file mode 100644 index 0000000..28c0d54 --- /dev/null +++ b/src/modules/bluetooth/sbc/sbc_tables.h @@ -0,0 +1,660 @@ +/* + * + * Bluetooth low-complexity, subband codec (SBC) library + * + * Copyright (C) 2008-2010 Nokia Corporation + * Copyright (C) 2004-2010 Marcel Holtmann + * Copyright (C) 2004-2005 Henryk Ploetz + * Copyright (C) 2005-2006 Brad Midgley + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* A2DP specification: Appendix B, page 69 */ +static const int sbc_offset4[4][4] = { + { -1, 0, 0, 0 }, + { -2, 0, 0, 1 }, + { -2, 0, 0, 1 }, + { -2, 0, 0, 1 } +}; + +/* A2DP specification: Appendix B, page 69 */ +static const int sbc_offset8[4][8] = { + { -2, 0, 0, 0, 0, 0, 0, 1 }, + { -3, 0, 0, 0, 0, 0, 1, 2 }, + { -4, 0, 0, 0, 0, 0, 1, 2 }, + { -4, 0, 0, 0, 0, 0, 1, 2 } +}; + + +#define SS4(val) ASR(val, SCALE_SPROTO4_TBL) +#define SS8(val) ASR(val, SCALE_SPROTO8_TBL) +#define SN4(val) ASR(val, SCALE_NPROTO4_TBL) +#define SN8(val) ASR(val, SCALE_NPROTO8_TBL) + +static const int32_t sbc_proto_4_40m0[] = { + SS4(0x00000000), SS4(0xffa6982f), SS4(0xfba93848), SS4(0x0456c7b8), + SS4(0x005967d1), SS4(0xfffb9ac7), SS4(0xff589157), SS4(0xf9c2a8d8), + SS4(0x027c1434), SS4(0x0019118b), SS4(0xfff3c74c), SS4(0xff137330), + SS4(0xf81b8d70), SS4(0x00ec1b8b), SS4(0xfff0b71a), SS4(0xffe99b00), + SS4(0xfef84470), SS4(0xf6fb4370), SS4(0xffcdc351), SS4(0xffe01dc7) +}; + +static const int32_t sbc_proto_4_40m1[] = { + SS4(0xffe090ce), SS4(0xff2c0475), SS4(0xf694f800), SS4(0xff2c0475), + SS4(0xffe090ce), SS4(0xffe01dc7), SS4(0xffcdc351), SS4(0xf6fb4370), + SS4(0xfef84470), SS4(0xffe99b00), SS4(0xfff0b71a), SS4(0x00ec1b8b), + SS4(0xf81b8d70), SS4(0xff137330), SS4(0xfff3c74c), SS4(0x0019118b), + SS4(0x027c1434), SS4(0xf9c2a8d8), SS4(0xff589157), SS4(0xfffb9ac7) +}; + +static const int32_t sbc_proto_8_80m0[] = { + SS8(0x00000000), SS8(0xfe8d1970), SS8(0xee979f00), SS8(0x11686100), + SS8(0x0172e690), SS8(0xfff5bd1a), SS8(0xfdf1c8d4), SS8(0xeac182c0), + SS8(0x0d9daee0), SS8(0x00e530da), SS8(0xffe9811d), SS8(0xfd52986c), + SS8(0xe7054ca0), SS8(0x0a00d410), SS8(0x006c1de4), SS8(0xffdba705), + SS8(0xfcbc98e8), SS8(0xe3889d20), SS8(0x06af2308), SS8(0x000bb7db), + SS8(0xffca00ed), SS8(0xfc3fbb68), SS8(0xe071bc00), SS8(0x03bf7948), + SS8(0xffc4e05c), SS8(0xffb54b3b), SS8(0xfbedadc0), SS8(0xdde26200), + SS8(0x0142291c), SS8(0xff960e94), SS8(0xff9f3e17), SS8(0xfbd8f358), + SS8(0xdbf79400), SS8(0xff405e01), SS8(0xff7d4914), SS8(0xff8b1a31), + SS8(0xfc1417b8), SS8(0xdac7bb40), SS8(0xfdbb828c), SS8(0xff762170) +}; + +static const int32_t sbc_proto_8_80m1[] = { + SS8(0xff7c272c), SS8(0xfcb02620), SS8(0xda612700), SS8(0xfcb02620), + SS8(0xff7c272c), SS8(0xff762170), SS8(0xfdbb828c), SS8(0xdac7bb40), + SS8(0xfc1417b8), SS8(0xff8b1a31), SS8(0xff7d4914), SS8(0xff405e01), + SS8(0xdbf79400), SS8(0xfbd8f358), SS8(0xff9f3e17), SS8(0xff960e94), + SS8(0x0142291c), SS8(0xdde26200), SS8(0xfbedadc0), SS8(0xffb54b3b), + SS8(0xffc4e05c), SS8(0x03bf7948), SS8(0xe071bc00), SS8(0xfc3fbb68), + SS8(0xffca00ed), SS8(0x000bb7db), SS8(0x06af2308), SS8(0xe3889d20), + SS8(0xfcbc98e8), SS8(0xffdba705), SS8(0x006c1de4), SS8(0x0a00d410), + SS8(0xe7054ca0), SS8(0xfd52986c), SS8(0xffe9811d), SS8(0x00e530da), + SS8(0x0d9daee0), SS8(0xeac182c0), SS8(0xfdf1c8d4), SS8(0xfff5bd1a) +}; + +static const int32_t synmatrix4[8][4] = { + { SN4(0x05a82798), SN4(0xfa57d868), SN4(0xfa57d868), SN4(0x05a82798) }, + { SN4(0x030fbc54), SN4(0xf89be510), SN4(0x07641af0), SN4(0xfcf043ac) }, + { SN4(0x00000000), SN4(0x00000000), SN4(0x00000000), SN4(0x00000000) }, + { SN4(0xfcf043ac), SN4(0x07641af0), SN4(0xf89be510), SN4(0x030fbc54) }, + { SN4(0xfa57d868), SN4(0x05a82798), SN4(0x05a82798), SN4(0xfa57d868) }, + { SN4(0xf89be510), SN4(0xfcf043ac), SN4(0x030fbc54), SN4(0x07641af0) }, + { SN4(0xf8000000), SN4(0xf8000000), SN4(0xf8000000), SN4(0xf8000000) }, + { SN4(0xf89be510), SN4(0xfcf043ac), SN4(0x030fbc54), SN4(0x07641af0) } +}; + +static const int32_t synmatrix8[16][8] = { + { SN8(0x05a82798), SN8(0xfa57d868), SN8(0xfa57d868), SN8(0x05a82798), + SN8(0x05a82798), SN8(0xfa57d868), SN8(0xfa57d868), SN8(0x05a82798) }, + { SN8(0x0471ced0), SN8(0xf8275a10), SN8(0x018f8b84), SN8(0x06a6d988), + SN8(0xf9592678), SN8(0xfe70747c), SN8(0x07d8a5f0), SN8(0xfb8e3130) }, + { SN8(0x030fbc54), SN8(0xf89be510), SN8(0x07641af0), SN8(0xfcf043ac), + SN8(0xfcf043ac), SN8(0x07641af0), SN8(0xf89be510), SN8(0x030fbc54) }, + { SN8(0x018f8b84), SN8(0xfb8e3130), SN8(0x06a6d988), SN8(0xf8275a10), + SN8(0x07d8a5f0), SN8(0xf9592678), SN8(0x0471ced0), SN8(0xfe70747c) }, + { SN8(0x00000000), SN8(0x00000000), SN8(0x00000000), SN8(0x00000000), + SN8(0x00000000), SN8(0x00000000), SN8(0x00000000), SN8(0x00000000) }, + { SN8(0xfe70747c), SN8(0x0471ced0), SN8(0xf9592678), SN8(0x07d8a5f0), + SN8(0xf8275a10), SN8(0x06a6d988), SN8(0xfb8e3130), SN8(0x018f8b84) }, + { SN8(0xfcf043ac), SN8(0x07641af0), SN8(0xf89be510), SN8(0x030fbc54), + SN8(0x030fbc54), SN8(0xf89be510), SN8(0x07641af0), SN8(0xfcf043ac) }, + { SN8(0xfb8e3130), SN8(0x07d8a5f0), SN8(0xfe70747c), SN8(0xf9592678), + SN8(0x06a6d988), SN8(0x018f8b84), SN8(0xf8275a10), SN8(0x0471ced0) }, + { SN8(0xfa57d868), SN8(0x05a82798), SN8(0x05a82798), SN8(0xfa57d868), + SN8(0xfa57d868), SN8(0x05a82798), SN8(0x05a82798), SN8(0xfa57d868) }, + { SN8(0xf9592678), SN8(0x018f8b84), SN8(0x07d8a5f0), SN8(0x0471ced0), + SN8(0xfb8e3130), SN8(0xf8275a10), SN8(0xfe70747c), SN8(0x06a6d988) }, + { SN8(0xf89be510), SN8(0xfcf043ac), SN8(0x030fbc54), SN8(0x07641af0), + SN8(0x07641af0), SN8(0x030fbc54), SN8(0xfcf043ac), SN8(0xf89be510) }, + { SN8(0xf8275a10), SN8(0xf9592678), SN8(0xfb8e3130), SN8(0xfe70747c), + SN8(0x018f8b84), SN8(0x0471ced0), SN8(0x06a6d988), SN8(0x07d8a5f0) }, + { SN8(0xf8000000), SN8(0xf8000000), SN8(0xf8000000), SN8(0xf8000000), + SN8(0xf8000000), SN8(0xf8000000), SN8(0xf8000000), SN8(0xf8000000) }, + { SN8(0xf8275a10), SN8(0xf9592678), SN8(0xfb8e3130), SN8(0xfe70747c), + SN8(0x018f8b84), SN8(0x0471ced0), SN8(0x06a6d988), SN8(0x07d8a5f0) }, + { SN8(0xf89be510), SN8(0xfcf043ac), SN8(0x030fbc54), SN8(0x07641af0), + SN8(0x07641af0), SN8(0x030fbc54), SN8(0xfcf043ac), SN8(0xf89be510) }, + { SN8(0xf9592678), SN8(0x018f8b84), SN8(0x07d8a5f0), SN8(0x0471ced0), + SN8(0xfb8e3130), SN8(0xf8275a10), SN8(0xfe70747c), SN8(0x06a6d988) } +}; + +/* Uncomment the following line to enable high precision build of SBC encoder */ + +/* #define SBC_HIGH_PRECISION */ + +#ifdef SBC_HIGH_PRECISION +#define FIXED_A int64_t /* data type for fixed point accumulator */ +#define FIXED_T int32_t /* data type for fixed point constants */ +#define SBC_FIXED_EXTRA_BITS 16 +#else +#define FIXED_A int32_t /* data type for fixed point accumulator */ +#define FIXED_T int16_t /* data type for fixed point constants */ +#define SBC_FIXED_EXTRA_BITS 0 +#endif + +/* A2DP specification: Section 12.8 Tables + * + * Original values are premultiplied by 2 for better precision (that is the + * maximum which is possible without overflows) + * + * Note: in each block of 8 numbers sign was changed for elements 2 and 7 + * in order to compensate the same change applied to cos_table_fixed_4 + */ +#define SBC_PROTO_FIXED4_SCALE \ + ((sizeof(FIXED_T) * CHAR_BIT - 1) - SBC_FIXED_EXTRA_BITS + 1) +#define F_PROTO4(x) (FIXED_A) ((x * 2) * \ + ((FIXED_A) 1 << (sizeof(FIXED_T) * CHAR_BIT - 1)) + 0.5) +#define F(x) F_PROTO4(x) +static const FIXED_T _sbc_proto_fixed4[40] = { + F(0.00000000E+00), F(5.36548976E-04), + -F(1.49188357E-03), F(2.73370904E-03), + F(3.83720193E-03), F(3.89205149E-03), + F(1.86581691E-03), F(3.06012286E-03), + + F(1.09137620E-02), F(2.04385087E-02), + -F(2.88757392E-02), F(3.21939290E-02), + F(2.58767811E-02), F(6.13245186E-03), + -F(2.88217274E-02), F(7.76463494E-02), + + F(1.35593274E-01), F(1.94987841E-01), + -F(2.46636662E-01), F(2.81828203E-01), + F(2.94315332E-01), F(2.81828203E-01), + F(2.46636662E-01), -F(1.94987841E-01), + + -F(1.35593274E-01), -F(7.76463494E-02), + F(2.88217274E-02), F(6.13245186E-03), + F(2.58767811E-02), F(3.21939290E-02), + F(2.88757392E-02), -F(2.04385087E-02), + + -F(1.09137620E-02), -F(3.06012286E-03), + -F(1.86581691E-03), F(3.89205149E-03), + F(3.83720193E-03), F(2.73370904E-03), + F(1.49188357E-03), -F(5.36548976E-04), +}; +#undef F + +/* + * To produce this cosine matrix in Octave: + * + * b = zeros(4, 8); + * for i = 0:3 + * for j = 0:7 b(i+1, j+1) = cos((i + 0.5) * (j - 2) * (pi/4)) + * endfor + * endfor; + * printf("%.10f, ", b'); + * + * Note: in each block of 8 numbers sign was changed for elements 2 and 7 + * + * Change of sign for element 2 allows to replace constant 1.0 (not + * representable in Q15 format) with -1.0 (fine with Q15). + * Changed sign for element 7 allows to have more similar constants + * and simplify subband filter function code. + */ +#define SBC_COS_TABLE_FIXED4_SCALE \ + ((sizeof(FIXED_T) * CHAR_BIT - 1) + SBC_FIXED_EXTRA_BITS) +#define F_COS4(x) (FIXED_A) ((x) * \ + ((FIXED_A) 1 << (sizeof(FIXED_T) * CHAR_BIT - 1)) + 0.5) +#define F(x) F_COS4(x) +static const FIXED_T cos_table_fixed_4[32] = { + F(0.7071067812), F(0.9238795325), -F(1.0000000000), F(0.9238795325), + F(0.7071067812), F(0.3826834324), F(0.0000000000), F(0.3826834324), + + -F(0.7071067812), F(0.3826834324), -F(1.0000000000), F(0.3826834324), + -F(0.7071067812), -F(0.9238795325), -F(0.0000000000), -F(0.9238795325), + + -F(0.7071067812), -F(0.3826834324), -F(1.0000000000), -F(0.3826834324), + -F(0.7071067812), F(0.9238795325), F(0.0000000000), F(0.9238795325), + + F(0.7071067812), -F(0.9238795325), -F(1.0000000000), -F(0.9238795325), + F(0.7071067812), -F(0.3826834324), -F(0.0000000000), -F(0.3826834324), +}; +#undef F + +/* A2DP specification: Section 12.8 Tables + * + * Original values are premultiplied by 4 for better precision (that is the + * maximum which is possible without overflows) + * + * Note: in each block of 16 numbers sign was changed for elements 4, 13, 14, 15 + * in order to compensate the same change applied to cos_table_fixed_8 + */ +#define SBC_PROTO_FIXED8_SCALE \ + ((sizeof(FIXED_T) * CHAR_BIT - 1) - SBC_FIXED_EXTRA_BITS + 1) +#define F_PROTO8(x) (FIXED_A) ((x * 2) * \ + ((FIXED_A) 1 << (sizeof(FIXED_T) * CHAR_BIT - 1)) + 0.5) +#define F(x) F_PROTO8(x) +static const FIXED_T _sbc_proto_fixed8[80] = { + F(0.00000000E+00), F(1.56575398E-04), + F(3.43256425E-04), F(5.54620202E-04), + -F(8.23919506E-04), F(1.13992507E-03), + F(1.47640169E-03), F(1.78371725E-03), + F(2.01182542E-03), F(2.10371989E-03), + F(1.99454554E-03), F(1.61656283E-03), + F(9.02154502E-04), F(1.78805361E-04), + F(1.64973098E-03), F(3.49717454E-03), + + F(5.65949473E-03), F(8.02941163E-03), + F(1.04584443E-02), F(1.27472335E-02), + -F(1.46525263E-02), F(1.59045603E-02), + F(1.62208471E-02), F(1.53184106E-02), + F(1.29371806E-02), F(8.85757540E-03), + F(2.92408442E-03), -F(4.91578024E-03), + -F(1.46404076E-02), F(2.61098752E-02), + F(3.90751381E-02), F(5.31873032E-02), + + F(6.79989431E-02), F(8.29847578E-02), + F(9.75753918E-02), F(1.11196689E-01), + -F(1.23264548E-01), F(1.33264415E-01), + F(1.40753505E-01), F(1.45389847E-01), + F(1.46955068E-01), F(1.45389847E-01), + F(1.40753505E-01), F(1.33264415E-01), + F(1.23264548E-01), -F(1.11196689E-01), + -F(9.75753918E-02), -F(8.29847578E-02), + + -F(6.79989431E-02), -F(5.31873032E-02), + -F(3.90751381E-02), -F(2.61098752E-02), + F(1.46404076E-02), -F(4.91578024E-03), + F(2.92408442E-03), F(8.85757540E-03), + F(1.29371806E-02), F(1.53184106E-02), + F(1.62208471E-02), F(1.59045603E-02), + F(1.46525263E-02), -F(1.27472335E-02), + -F(1.04584443E-02), -F(8.02941163E-03), + + -F(5.65949473E-03), -F(3.49717454E-03), + -F(1.64973098E-03), -F(1.78805361E-04), + -F(9.02154502E-04), F(1.61656283E-03), + F(1.99454554E-03), F(2.10371989E-03), + F(2.01182542E-03), F(1.78371725E-03), + F(1.47640169E-03), F(1.13992507E-03), + F(8.23919506E-04), -F(5.54620202E-04), + -F(3.43256425E-04), -F(1.56575398E-04), +}; +#undef F + +/* + * To produce this cosine matrix in Octave: + * + * b = zeros(8, 16); + * for i = 0:7 + * for j = 0:15 b(i+1, j+1) = cos((i + 0.5) * (j - 4) * (pi/8)) + * endfor endfor; + * printf("%.10f, ", b'); + * + * Note: in each block of 16 numbers sign was changed for elements 4, 13, 14, 15 + * + * Change of sign for element 4 allows to replace constant 1.0 (not + * representable in Q15 format) with -1.0 (fine with Q15). + * Changed signs for elements 13, 14, 15 allow to have more similar constants + * and simplify subband filter function code. + */ +#define SBC_COS_TABLE_FIXED8_SCALE \ + ((sizeof(FIXED_T) * CHAR_BIT - 1) + SBC_FIXED_EXTRA_BITS) +#define F_COS8(x) (FIXED_A) ((x) * \ + ((FIXED_A) 1 << (sizeof(FIXED_T) * CHAR_BIT - 1)) + 0.5) +#define F(x) F_COS8(x) +static const FIXED_T cos_table_fixed_8[128] = { + F(0.7071067812), F(0.8314696123), F(0.9238795325), F(0.9807852804), + -F(1.0000000000), F(0.9807852804), F(0.9238795325), F(0.8314696123), + F(0.7071067812), F(0.5555702330), F(0.3826834324), F(0.1950903220), + F(0.0000000000), F(0.1950903220), F(0.3826834324), F(0.5555702330), + + -F(0.7071067812), -F(0.1950903220), F(0.3826834324), F(0.8314696123), + -F(1.0000000000), F(0.8314696123), F(0.3826834324), -F(0.1950903220), + -F(0.7071067812), -F(0.9807852804), -F(0.9238795325), -F(0.5555702330), + -F(0.0000000000), -F(0.5555702330), -F(0.9238795325), -F(0.9807852804), + + -F(0.7071067812), -F(0.9807852804), -F(0.3826834324), F(0.5555702330), + -F(1.0000000000), F(0.5555702330), -F(0.3826834324), -F(0.9807852804), + -F(0.7071067812), F(0.1950903220), F(0.9238795325), F(0.8314696123), + F(0.0000000000), F(0.8314696123), F(0.9238795325), F(0.1950903220), + + F(0.7071067812), -F(0.5555702330), -F(0.9238795325), F(0.1950903220), + -F(1.0000000000), F(0.1950903220), -F(0.9238795325), -F(0.5555702330), + F(0.7071067812), F(0.8314696123), -F(0.3826834324), -F(0.9807852804), + -F(0.0000000000), -F(0.9807852804), -F(0.3826834324), F(0.8314696123), + + F(0.7071067812), F(0.5555702330), -F(0.9238795325), -F(0.1950903220), + -F(1.0000000000), -F(0.1950903220), -F(0.9238795325), F(0.5555702330), + F(0.7071067812), -F(0.8314696123), -F(0.3826834324), F(0.9807852804), + F(0.0000000000), F(0.9807852804), -F(0.3826834324), -F(0.8314696123), + + -F(0.7071067812), F(0.9807852804), -F(0.3826834324), -F(0.5555702330), + -F(1.0000000000), -F(0.5555702330), -F(0.3826834324), F(0.9807852804), + -F(0.7071067812), -F(0.1950903220), F(0.9238795325), -F(0.8314696123), + -F(0.0000000000), -F(0.8314696123), F(0.9238795325), -F(0.1950903220), + + -F(0.7071067812), F(0.1950903220), F(0.3826834324), -F(0.8314696123), + -F(1.0000000000), -F(0.8314696123), F(0.3826834324), F(0.1950903220), + -F(0.7071067812), F(0.9807852804), -F(0.9238795325), F(0.5555702330), + -F(0.0000000000), F(0.5555702330), -F(0.9238795325), F(0.9807852804), + + F(0.7071067812), -F(0.8314696123), F(0.9238795325), -F(0.9807852804), + -F(1.0000000000), -F(0.9807852804), F(0.9238795325), -F(0.8314696123), + F(0.7071067812), -F(0.5555702330), F(0.3826834324), -F(0.1950903220), + -F(0.0000000000), -F(0.1950903220), F(0.3826834324), -F(0.5555702330), +}; +#undef F + +/* + * Enforce 16 byte alignment for the data, which is supposed to be used + * with SIMD optimized code. + */ + +#define SBC_ALIGN_BITS 4 +#define SBC_ALIGN_MASK ((1 << (SBC_ALIGN_BITS)) - 1) + +#ifdef __GNUC__ +#define SBC_ALIGNED __attribute__((aligned(1 << (SBC_ALIGN_BITS)))) +#else +#define SBC_ALIGNED +#endif + +/* + * Constant tables for the use in SIMD optimized analysis filters + * Each table consists of two parts: + * 1. reordered "proto" table + * 2. reordered "cos" table + * + * Due to non-symmetrical reordering, separate tables for "even" + * and "odd" cases are needed + */ + +static const FIXED_T SBC_ALIGNED analysis_consts_fixed4_simd_even[40 + 16] = { +#define C0 1.0932568993 +#define C1 1.3056875580 +#define C2 1.3056875580 +#define C3 1.6772280856 + +#define F(x) F_PROTO4(x) + F(0.00000000E+00 * C0), F(3.83720193E-03 * C0), + F(5.36548976E-04 * C1), F(2.73370904E-03 * C1), + F(3.06012286E-03 * C2), F(3.89205149E-03 * C2), + F(0.00000000E+00 * C3), -F(1.49188357E-03 * C3), + F(1.09137620E-02 * C0), F(2.58767811E-02 * C0), + F(2.04385087E-02 * C1), F(3.21939290E-02 * C1), + F(7.76463494E-02 * C2), F(6.13245186E-03 * C2), + F(0.00000000E+00 * C3), -F(2.88757392E-02 * C3), + F(1.35593274E-01 * C0), F(2.94315332E-01 * C0), + F(1.94987841E-01 * C1), F(2.81828203E-01 * C1), + -F(1.94987841E-01 * C2), F(2.81828203E-01 * C2), + F(0.00000000E+00 * C3), -F(2.46636662E-01 * C3), + -F(1.35593274E-01 * C0), F(2.58767811E-02 * C0), + -F(7.76463494E-02 * C1), F(6.13245186E-03 * C1), + -F(2.04385087E-02 * C2), F(3.21939290E-02 * C2), + F(0.00000000E+00 * C3), F(2.88217274E-02 * C3), + -F(1.09137620E-02 * C0), F(3.83720193E-03 * C0), + -F(3.06012286E-03 * C1), F(3.89205149E-03 * C1), + -F(5.36548976E-04 * C2), F(2.73370904E-03 * C2), + F(0.00000000E+00 * C3), -F(1.86581691E-03 * C3), +#undef F +#define F(x) F_COS4(x) + F(0.7071067812 / C0), F(0.9238795325 / C1), + -F(0.7071067812 / C0), F(0.3826834324 / C1), + -F(0.7071067812 / C0), -F(0.3826834324 / C1), + F(0.7071067812 / C0), -F(0.9238795325 / C1), + F(0.3826834324 / C2), -F(1.0000000000 / C3), + -F(0.9238795325 / C2), -F(1.0000000000 / C3), + F(0.9238795325 / C2), -F(1.0000000000 / C3), + -F(0.3826834324 / C2), -F(1.0000000000 / C3), +#undef F + +#undef C0 +#undef C1 +#undef C2 +#undef C3 +}; + +static const FIXED_T SBC_ALIGNED analysis_consts_fixed4_simd_odd[40 + 16] = { +#define C0 1.3056875580 +#define C1 1.6772280856 +#define C2 1.0932568993 +#define C3 1.3056875580 + +#define F(x) F_PROTO4(x) + F(2.73370904E-03 * C0), F(5.36548976E-04 * C0), + -F(1.49188357E-03 * C1), F(0.00000000E+00 * C1), + F(3.83720193E-03 * C2), F(1.09137620E-02 * C2), + F(3.89205149E-03 * C3), F(3.06012286E-03 * C3), + F(3.21939290E-02 * C0), F(2.04385087E-02 * C0), + -F(2.88757392E-02 * C1), F(0.00000000E+00 * C1), + F(2.58767811E-02 * C2), F(1.35593274E-01 * C2), + F(6.13245186E-03 * C3), F(7.76463494E-02 * C3), + F(2.81828203E-01 * C0), F(1.94987841E-01 * C0), + -F(2.46636662E-01 * C1), F(0.00000000E+00 * C1), + F(2.94315332E-01 * C2), -F(1.35593274E-01 * C2), + F(2.81828203E-01 * C3), -F(1.94987841E-01 * C3), + F(6.13245186E-03 * C0), -F(7.76463494E-02 * C0), + F(2.88217274E-02 * C1), F(0.00000000E+00 * C1), + F(2.58767811E-02 * C2), -F(1.09137620E-02 * C2), + F(3.21939290E-02 * C3), -F(2.04385087E-02 * C3), + F(3.89205149E-03 * C0), -F(3.06012286E-03 * C0), + -F(1.86581691E-03 * C1), F(0.00000000E+00 * C1), + F(3.83720193E-03 * C2), F(0.00000000E+00 * C2), + F(2.73370904E-03 * C3), -F(5.36548976E-04 * C3), +#undef F +#define F(x) F_COS4(x) + F(0.9238795325 / C0), -F(1.0000000000 / C1), + F(0.3826834324 / C0), -F(1.0000000000 / C1), + -F(0.3826834324 / C0), -F(1.0000000000 / C1), + -F(0.9238795325 / C0), -F(1.0000000000 / C1), + F(0.7071067812 / C2), F(0.3826834324 / C3), + -F(0.7071067812 / C2), -F(0.9238795325 / C3), + -F(0.7071067812 / C2), F(0.9238795325 / C3), + F(0.7071067812 / C2), -F(0.3826834324 / C3), +#undef F + +#undef C0 +#undef C1 +#undef C2 +#undef C3 +}; + +static const FIXED_T SBC_ALIGNED analysis_consts_fixed8_simd_even[80 + 64] = { +#define C0 2.7906148894 +#define C1 2.4270044280 +#define C2 2.8015616024 +#define C3 3.1710363741 +#define C4 2.5377944043 +#define C5 2.4270044280 +#define C6 2.8015616024 +#define C7 3.1710363741 + +#define F(x) F_PROTO8(x) + F(0.00000000E+00 * C0), F(2.01182542E-03 * C0), + F(1.56575398E-04 * C1), F(1.78371725E-03 * C1), + F(3.43256425E-04 * C2), F(1.47640169E-03 * C2), + F(5.54620202E-04 * C3), F(1.13992507E-03 * C3), + -F(8.23919506E-04 * C4), F(0.00000000E+00 * C4), + F(2.10371989E-03 * C5), F(3.49717454E-03 * C5), + F(1.99454554E-03 * C6), F(1.64973098E-03 * C6), + F(1.61656283E-03 * C7), F(1.78805361E-04 * C7), + F(5.65949473E-03 * C0), F(1.29371806E-02 * C0), + F(8.02941163E-03 * C1), F(1.53184106E-02 * C1), + F(1.04584443E-02 * C2), F(1.62208471E-02 * C2), + F(1.27472335E-02 * C3), F(1.59045603E-02 * C3), + -F(1.46525263E-02 * C4), F(0.00000000E+00 * C4), + F(8.85757540E-03 * C5), F(5.31873032E-02 * C5), + F(2.92408442E-03 * C6), F(3.90751381E-02 * C6), + -F(4.91578024E-03 * C7), F(2.61098752E-02 * C7), + F(6.79989431E-02 * C0), F(1.46955068E-01 * C0), + F(8.29847578E-02 * C1), F(1.45389847E-01 * C1), + F(9.75753918E-02 * C2), F(1.40753505E-01 * C2), + F(1.11196689E-01 * C3), F(1.33264415E-01 * C3), + -F(1.23264548E-01 * C4), F(0.00000000E+00 * C4), + F(1.45389847E-01 * C5), -F(8.29847578E-02 * C5), + F(1.40753505E-01 * C6), -F(9.75753918E-02 * C6), + F(1.33264415E-01 * C7), -F(1.11196689E-01 * C7), + -F(6.79989431E-02 * C0), F(1.29371806E-02 * C0), + -F(5.31873032E-02 * C1), F(8.85757540E-03 * C1), + -F(3.90751381E-02 * C2), F(2.92408442E-03 * C2), + -F(2.61098752E-02 * C3), -F(4.91578024E-03 * C3), + F(1.46404076E-02 * C4), F(0.00000000E+00 * C4), + F(1.53184106E-02 * C5), -F(8.02941163E-03 * C5), + F(1.62208471E-02 * C6), -F(1.04584443E-02 * C6), + F(1.59045603E-02 * C7), -F(1.27472335E-02 * C7), + -F(5.65949473E-03 * C0), F(2.01182542E-03 * C0), + -F(3.49717454E-03 * C1), F(2.10371989E-03 * C1), + -F(1.64973098E-03 * C2), F(1.99454554E-03 * C2), + -F(1.78805361E-04 * C3), F(1.61656283E-03 * C3), + -F(9.02154502E-04 * C4), F(0.00000000E+00 * C4), + F(1.78371725E-03 * C5), -F(1.56575398E-04 * C5), + F(1.47640169E-03 * C6), -F(3.43256425E-04 * C6), + F(1.13992507E-03 * C7), -F(5.54620202E-04 * C7), +#undef F +#define F(x) F_COS8(x) + F(0.7071067812 / C0), F(0.8314696123 / C1), + -F(0.7071067812 / C0), -F(0.1950903220 / C1), + -F(0.7071067812 / C0), -F(0.9807852804 / C1), + F(0.7071067812 / C0), -F(0.5555702330 / C1), + F(0.7071067812 / C0), F(0.5555702330 / C1), + -F(0.7071067812 / C0), F(0.9807852804 / C1), + -F(0.7071067812 / C0), F(0.1950903220 / C1), + F(0.7071067812 / C0), -F(0.8314696123 / C1), + F(0.9238795325 / C2), F(0.9807852804 / C3), + F(0.3826834324 / C2), F(0.8314696123 / C3), + -F(0.3826834324 / C2), F(0.5555702330 / C3), + -F(0.9238795325 / C2), F(0.1950903220 / C3), + -F(0.9238795325 / C2), -F(0.1950903220 / C3), + -F(0.3826834324 / C2), -F(0.5555702330 / C3), + F(0.3826834324 / C2), -F(0.8314696123 / C3), + F(0.9238795325 / C2), -F(0.9807852804 / C3), + -F(1.0000000000 / C4), F(0.5555702330 / C5), + -F(1.0000000000 / C4), -F(0.9807852804 / C5), + -F(1.0000000000 / C4), F(0.1950903220 / C5), + -F(1.0000000000 / C4), F(0.8314696123 / C5), + -F(1.0000000000 / C4), -F(0.8314696123 / C5), + -F(1.0000000000 / C4), -F(0.1950903220 / C5), + -F(1.0000000000 / C4), F(0.9807852804 / C5), + -F(1.0000000000 / C4), -F(0.5555702330 / C5), + F(0.3826834324 / C6), F(0.1950903220 / C7), + -F(0.9238795325 / C6), -F(0.5555702330 / C7), + F(0.9238795325 / C6), F(0.8314696123 / C7), + -F(0.3826834324 / C6), -F(0.9807852804 / C7), + -F(0.3826834324 / C6), F(0.9807852804 / C7), + F(0.9238795325 / C6), -F(0.8314696123 / C7), + -F(0.9238795325 / C6), F(0.5555702330 / C7), + F(0.3826834324 / C6), -F(0.1950903220 / C7), +#undef F + +#undef C0 +#undef C1 +#undef C2 +#undef C3 +#undef C4 +#undef C5 +#undef C6 +#undef C7 +}; + +static const FIXED_T SBC_ALIGNED analysis_consts_fixed8_simd_odd[80 + 64] = { +#define C0 2.5377944043 +#define C1 2.4270044280 +#define C2 2.8015616024 +#define C3 3.1710363741 +#define C4 2.7906148894 +#define C5 2.4270044280 +#define C6 2.8015616024 +#define C7 3.1710363741 + +#define F(x) F_PROTO8(x) + F(0.00000000E+00 * C0), -F(8.23919506E-04 * C0), + F(1.56575398E-04 * C1), F(1.78371725E-03 * C1), + F(3.43256425E-04 * C2), F(1.47640169E-03 * C2), + F(5.54620202E-04 * C3), F(1.13992507E-03 * C3), + F(2.01182542E-03 * C4), F(5.65949473E-03 * C4), + F(2.10371989E-03 * C5), F(3.49717454E-03 * C5), + F(1.99454554E-03 * C6), F(1.64973098E-03 * C6), + F(1.61656283E-03 * C7), F(1.78805361E-04 * C7), + F(0.00000000E+00 * C0), -F(1.46525263E-02 * C0), + F(8.02941163E-03 * C1), F(1.53184106E-02 * C1), + F(1.04584443E-02 * C2), F(1.62208471E-02 * C2), + F(1.27472335E-02 * C3), F(1.59045603E-02 * C3), + F(1.29371806E-02 * C4), F(6.79989431E-02 * C4), + F(8.85757540E-03 * C5), F(5.31873032E-02 * C5), + F(2.92408442E-03 * C6), F(3.90751381E-02 * C6), + -F(4.91578024E-03 * C7), F(2.61098752E-02 * C7), + F(0.00000000E+00 * C0), -F(1.23264548E-01 * C0), + F(8.29847578E-02 * C1), F(1.45389847E-01 * C1), + F(9.75753918E-02 * C2), F(1.40753505E-01 * C2), + F(1.11196689E-01 * C3), F(1.33264415E-01 * C3), + F(1.46955068E-01 * C4), -F(6.79989431E-02 * C4), + F(1.45389847E-01 * C5), -F(8.29847578E-02 * C5), + F(1.40753505E-01 * C6), -F(9.75753918E-02 * C6), + F(1.33264415E-01 * C7), -F(1.11196689E-01 * C7), + F(0.00000000E+00 * C0), F(1.46404076E-02 * C0), + -F(5.31873032E-02 * C1), F(8.85757540E-03 * C1), + -F(3.90751381E-02 * C2), F(2.92408442E-03 * C2), + -F(2.61098752E-02 * C3), -F(4.91578024E-03 * C3), + F(1.29371806E-02 * C4), -F(5.65949473E-03 * C4), + F(1.53184106E-02 * C5), -F(8.02941163E-03 * C5), + F(1.62208471E-02 * C6), -F(1.04584443E-02 * C6), + F(1.59045603E-02 * C7), -F(1.27472335E-02 * C7), + F(0.00000000E+00 * C0), -F(9.02154502E-04 * C0), + -F(3.49717454E-03 * C1), F(2.10371989E-03 * C1), + -F(1.64973098E-03 * C2), F(1.99454554E-03 * C2), + -F(1.78805361E-04 * C3), F(1.61656283E-03 * C3), + F(2.01182542E-03 * C4), F(0.00000000E+00 * C4), + F(1.78371725E-03 * C5), -F(1.56575398E-04 * C5), + F(1.47640169E-03 * C6), -F(3.43256425E-04 * C6), + F(1.13992507E-03 * C7), -F(5.54620202E-04 * C7), +#undef F +#define F(x) F_COS8(x) + -F(1.0000000000 / C0), F(0.8314696123 / C1), + -F(1.0000000000 / C0), -F(0.1950903220 / C1), + -F(1.0000000000 / C0), -F(0.9807852804 / C1), + -F(1.0000000000 / C0), -F(0.5555702330 / C1), + -F(1.0000000000 / C0), F(0.5555702330 / C1), + -F(1.0000000000 / C0), F(0.9807852804 / C1), + -F(1.0000000000 / C0), F(0.1950903220 / C1), + -F(1.0000000000 / C0), -F(0.8314696123 / C1), + F(0.9238795325 / C2), F(0.9807852804 / C3), + F(0.3826834324 / C2), F(0.8314696123 / C3), + -F(0.3826834324 / C2), F(0.5555702330 / C3), + -F(0.9238795325 / C2), F(0.1950903220 / C3), + -F(0.9238795325 / C2), -F(0.1950903220 / C3), + -F(0.3826834324 / C2), -F(0.5555702330 / C3), + F(0.3826834324 / C2), -F(0.8314696123 / C3), + F(0.9238795325 / C2), -F(0.9807852804 / C3), + F(0.7071067812 / C4), F(0.5555702330 / C5), + -F(0.7071067812 / C4), -F(0.9807852804 / C5), + -F(0.7071067812 / C4), F(0.1950903220 / C5), + F(0.7071067812 / C4), F(0.8314696123 / C5), + F(0.7071067812 / C4), -F(0.8314696123 / C5), + -F(0.7071067812 / C4), -F(0.1950903220 / C5), + -F(0.7071067812 / C4), F(0.9807852804 / C5), + F(0.7071067812 / C4), -F(0.5555702330 / C5), + F(0.3826834324 / C6), F(0.1950903220 / C7), + -F(0.9238795325 / C6), -F(0.5555702330 / C7), + F(0.9238795325 / C6), F(0.8314696123 / C7), + -F(0.3826834324 / C6), -F(0.9807852804 / C7), + -F(0.3826834324 / C6), F(0.9807852804 / C7), + F(0.9238795325 / C6), -F(0.8314696123 / C7), + -F(0.9238795325 / C6), F(0.5555702330 / C7), + F(0.3826834324 / C6), -F(0.1950903220 / C7), +#undef F + +#undef C0 +#undef C1 +#undef C2 +#undef C3 +#undef C4 +#undef C5 +#undef C6 +#undef C7 +}; diff --git a/src/modules/echo-cancel/adrian-aec-orc-dist.c b/src/modules/echo-cancel/adrian-aec-orc-dist.c new file mode 100644 index 0000000..ea93d0b --- /dev/null +++ b/src/modules/echo-cancel/adrian-aec-orc-dist.c @@ -0,0 +1,250 @@ + +/* autogenerated from adrian-aec-orc.orc */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#ifndef DISABLE_ORC +#include +#endif + +#ifndef _ORC_INTEGER_TYPEDEFS_ +#define _ORC_INTEGER_TYPEDEFS_ +#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L +#include +typedef int8_t orc_int8; +typedef int16_t orc_int16; +typedef int32_t orc_int32; +typedef int64_t orc_int64; +typedef uint8_t orc_uint8; +typedef uint16_t orc_uint16; +typedef uint32_t orc_uint32; +typedef uint64_t orc_uint64; +#elif defined(_MSC_VER) +typedef signed __int8 orc_int8; +typedef signed __int16 orc_int16; +typedef signed __int32 orc_int32; +typedef signed __int64 orc_int64; +typedef unsigned __int8 orc_uint8; +typedef unsigned __int16 orc_uint16; +typedef unsigned __int32 orc_uint32; +typedef unsigned __int64 orc_uint64; +#else +#include +typedef signed char orc_int8; +typedef short orc_int16; +typedef int orc_int32; +typedef unsigned char orc_uint8; +typedef unsigned short orc_uint16; +typedef unsigned int orc_uint32; +#if INT_MAX == LONG_MAX +typedef long long orc_int64; +typedef unsigned long long orc_uint64; +#else +typedef long orc_int64; +typedef unsigned long orc_uint64; +#endif +#endif +typedef union { orc_int16 i; orc_int8 x2[2]; } orc_union16; +typedef union { orc_int32 i; float f; orc_int16 x2[2]; orc_int8 x4[4]; } orc_union32; +typedef union { orc_int64 i; double f; orc_int32 x2[2]; orc_int16 x4[4]; } orc_union64; +#endif + +void update_tap_weights (float * d1, const float * s1, float p1, int n); + + +/* begin Orc C target preamble */ +#define ORC_CLAMP(x,a,b) ((x)<(a) ? (a) : ((x)>(b) ? (b) : (x))) +#define ORC_ABS(a) ((a)<0 ? -(a) : (a)) +#define ORC_MIN(a,b) ((a)<(b) ? (a) : (b)) +#define ORC_MAX(a,b) ((a)>(b) ? (a) : (b)) +#define ORC_SB_MAX 127 +#define ORC_SB_MIN (-1-ORC_SB_MAX) +#define ORC_UB_MAX 255 +#define ORC_UB_MIN 0 +#define ORC_SW_MAX 32767 +#define ORC_SW_MIN (-1-ORC_SW_MAX) +#define ORC_UW_MAX 65535 +#define ORC_UW_MIN 0 +#define ORC_SL_MAX 2147483647 +#define ORC_SL_MIN (-1-ORC_SL_MAX) +#define ORC_UL_MAX 4294967295U +#define ORC_UL_MIN 0 +#define ORC_CLAMP_SB(x) ORC_CLAMP(x,ORC_SB_MIN,ORC_SB_MAX) +#define ORC_CLAMP_UB(x) ORC_CLAMP(x,ORC_UB_MIN,ORC_UB_MAX) +#define ORC_CLAMP_SW(x) ORC_CLAMP(x,ORC_SW_MIN,ORC_SW_MAX) +#define ORC_CLAMP_UW(x) ORC_CLAMP(x,ORC_UW_MIN,ORC_UW_MAX) +#define ORC_CLAMP_SL(x) ORC_CLAMP(x,ORC_SL_MIN,ORC_SL_MAX) +#define ORC_CLAMP_UL(x) ORC_CLAMP(x,ORC_UL_MIN,ORC_UL_MAX) +#define ORC_SWAP_W(x) ((((x)&0xff)<<8) | (((x)&0xff00)>>8)) +#define ORC_SWAP_L(x) ((((x)&0xff)<<24) | (((x)&0xff00)<<8) | (((x)&0xff0000)>>8) | (((x)&0xff000000)>>24)) +#define ORC_SWAP_Q(x) ((((x)&0xffULL)<<56) | (((x)&0xff00ULL)<<40) | (((x)&0xff0000ULL)<<24) | (((x)&0xff000000ULL)<<8) | (((x)&0xff00000000ULL)>>8) | (((x)&0xff0000000000ULL)>>24) | (((x)&0xff000000000000ULL)>>40) | (((x)&0xff00000000000000ULL)>>56)) +#define ORC_PTR_OFFSET(ptr,offset) ((void *)(((unsigned char *)(ptr)) + (offset))) +#define ORC_DENORMAL(x) ((x) & ((((x)&0x7f800000) == 0) ? 0xff800000 : 0xffffffff)) +#define ORC_ISNAN(x) ((((x)&0x7f800000) == 0x7f800000) && (((x)&0x007fffff) != 0)) +#define ORC_DENORMAL_DOUBLE(x) ((x) & ((((x)&0x7ff0000000000000ULL) == 0) ? 0xfff0000000000000ULL : 0xffffffffffffffffULL)) +#define ORC_ISNAN_DOUBLE(x) ((((x)&0x7ff0000000000000ULL) == 0x7ff0000000000000ULL) && (((x)&0x000fffffffffffffULL) != 0)) +#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L +#define ORC_RESTRICT restrict +#elif defined(__GNUC__) && __GNUC__ >= 4 +#define ORC_RESTRICT __restrict__ +#else +#define ORC_RESTRICT +#endif +/* end Orc C target preamble */ + + + +/* update_tap_weights */ +#ifdef DISABLE_ORC +void +update_tap_weights (float * d1, const float * s1, float p1, int n){ + int i; + orc_union32 * ORC_RESTRICT ptr0; + const orc_union32 * ORC_RESTRICT ptr4; + orc_union32 var33; + orc_union32 var34; + orc_union32 var35; + orc_union32 var36; + orc_union32 var37; + + ptr0 = (orc_union32 *)d1; + ptr4 = (orc_union32 *)s1; + + /* 0: loadpl */ + var33.i = p1; + + for (i = 0; i < n; i++) { + /* 1: loadl */ + var34 = ptr4[i]; + /* 2: mulf */ + { + orc_union32 _src1; + orc_union32 _src2; + orc_union32 _dest1; + _src1.i = ORC_DENORMAL(var33.i); + _src2.i = ORC_DENORMAL(var34.i); + _dest1.f = _src1.f * _src2.f; + var37.i = ORC_DENORMAL(_dest1.i); + } + /* 3: loadl */ + var35 = ptr0[i]; + /* 4: addf */ + { + orc_union32 _src1; + orc_union32 _src2; + orc_union32 _dest1; + _src1.i = ORC_DENORMAL(var35.i); + _src2.i = ORC_DENORMAL(var37.i); + _dest1.f = _src1.f + _src2.f; + var36.i = ORC_DENORMAL(_dest1.i); + } + /* 5: storel */ + ptr0[i] = var36; + } + +} + +#else +static void +_backup_update_tap_weights (OrcExecutor * ORC_RESTRICT ex) +{ + int i; + int n = ex->n; + orc_union32 * ORC_RESTRICT ptr0; + const orc_union32 * ORC_RESTRICT ptr4; + orc_union32 var33; + orc_union32 var34; + orc_union32 var35; + orc_union32 var36; + orc_union32 var37; + + ptr0 = (orc_union32 *)ex->arrays[0]; + ptr4 = (orc_union32 *)ex->arrays[4]; + + /* 0: loadpl */ + var33.i = ex->params[24]; + + for (i = 0; i < n; i++) { + /* 1: loadl */ + var34 = ptr4[i]; + /* 2: mulf */ + { + orc_union32 _src1; + orc_union32 _src2; + orc_union32 _dest1; + _src1.i = ORC_DENORMAL(var33.i); + _src2.i = ORC_DENORMAL(var34.i); + _dest1.f = _src1.f * _src2.f; + var37.i = ORC_DENORMAL(_dest1.i); + } + /* 3: loadl */ + var35 = ptr0[i]; + /* 4: addf */ + { + orc_union32 _src1; + orc_union32 _src2; + orc_union32 _dest1; + _src1.i = ORC_DENORMAL(var35.i); + _src2.i = ORC_DENORMAL(var37.i); + _dest1.f = _src1.f + _src2.f; + var36.i = ORC_DENORMAL(_dest1.i); + } + /* 5: storel */ + ptr0[i] = var36; + } + +} + +void +update_tap_weights (float * d1, const float * s1, float p1, int n) +{ + OrcExecutor _ex, *ex = &_ex; + static int p_inited = 0; + static OrcProgram *p = 0; + void (*func) (OrcExecutor *); + + if (!p_inited) { + orc_once_mutex_lock (); + if (!p_inited) { + OrcCompileResult result; + + p = orc_program_new (); + orc_program_set_name (p, "update_tap_weights"); + orc_program_set_backup_function (p, _backup_update_tap_weights); + orc_program_add_destination (p, 4, "d1"); + orc_program_add_source (p, 4, "s1"); + orc_program_add_constant (p, 0, 0x00000000, "c1"); + orc_program_add_constant (p, 0, 0x00000000, "c2"); + orc_program_add_constant (p, 0, 0x00000000, "c3"); + orc_program_add_constant (p, 0, 0x00000000, "c4"); + orc_program_add_constant (p, 0, 0x00000000, "c5"); + orc_program_add_constant (p, 0, 0x00000000, "c6"); + orc_program_add_constant (p, 0, 0x00000000, "c7"); + orc_program_add_constant (p, 0, 0x00000000, "c8"); + orc_program_add_parameter_float (p, 4, "p1"); + orc_program_add_temporary (p, 4, "t1"); + + orc_program_append_2 (p, "mulf", 0, ORC_VAR_T1, ORC_VAR_P1, ORC_VAR_S1, ORC_VAR_D1); + orc_program_append_2 (p, "addf", 0, ORC_VAR_D1, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1); + + result = orc_program_compile (p); + } + p_inited = TRUE; + orc_once_mutex_unlock (); + } + ex->program = p; + + ex->n = n; + ex->arrays[ORC_VAR_D1] = d1; + ex->arrays[ORC_VAR_S1] = (void *)s1; + { + orc_union32 tmp; + tmp.f = p1; + ex->params[ORC_VAR_P1] = tmp.i; + } + + func = p->code_exec; + func (ex); +} +#endif diff --git a/src/modules/echo-cancel/adrian-aec-orc-dist.h b/src/modules/echo-cancel/adrian-aec-orc-dist.h new file mode 100644 index 0000000..00228c6 --- /dev/null +++ b/src/modules/echo-cancel/adrian-aec-orc-dist.h @@ -0,0 +1,61 @@ + +/* autogenerated from adrian-aec-orc.orc */ + +#ifndef ___MODULES_ECHO_CANCEL_ADRIAN_AEC_ORC_H_ +#define ___MODULES_ECHO_CANCEL_ADRIAN_AEC_ORC_H_ + + +#ifdef __cplusplus +extern "C" { +#endif + + + +#ifndef _ORC_INTEGER_TYPEDEFS_ +#define _ORC_INTEGER_TYPEDEFS_ +#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L +#include +typedef int8_t orc_int8; +typedef int16_t orc_int16; +typedef int32_t orc_int32; +typedef int64_t orc_int64; +typedef uint8_t orc_uint8; +typedef uint16_t orc_uint16; +typedef uint32_t orc_uint32; +typedef uint64_t orc_uint64; +#elif defined(_MSC_VER) +typedef signed __int8 orc_int8; +typedef signed __int16 orc_int16; +typedef signed __int32 orc_int32; +typedef signed __int64 orc_int64; +typedef unsigned __int8 orc_uint8; +typedef unsigned __int16 orc_uint16; +typedef unsigned __int32 orc_uint32; +typedef unsigned __int64 orc_uint64; +#else +#include +typedef signed char orc_int8; +typedef short orc_int16; +typedef int orc_int32; +typedef unsigned char orc_uint8; +typedef unsigned short orc_uint16; +typedef unsigned int orc_uint32; +#if INT_MAX == LONG_MAX +typedef long long orc_int64; +typedef unsigned long long orc_uint64; +#else +typedef long orc_int64; +typedef unsigned long orc_uint64; +#endif +#endif +typedef union { orc_int16 i; orc_int8 x2[2]; } orc_union16; +typedef union { orc_int32 i; float f; orc_int16 x2[2]; orc_int8 x4[4]; } orc_union32; +typedef union { orc_int64 i; double f; orc_int32 x2[2]; orc_int16 x4[4]; } orc_union64; +#endif +void update_tap_weights (float * d1, const float * s1, float p1, int n); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/modules/echo-cancel/adrian-aec-orc.orc b/src/modules/echo-cancel/adrian-aec-orc.orc new file mode 100644 index 0000000..8054772 --- /dev/null +++ b/src/modules/echo-cancel/adrian-aec-orc.orc @@ -0,0 +1,8 @@ +.function update_tap_weights +.dest 4 w float +.source 4 xf float +.floatparam 4 mikro_ef +.temp 4 tmp float + +mulf tmp, mikro_ef, xf +addf w, w, tmp diff --git a/src/modules/echo-cancel/adrian-aec.c b/src/modules/echo-cancel/adrian-aec.c new file mode 100644 index 0000000..269bd61 --- /dev/null +++ b/src/modules/echo-cancel/adrian-aec.c @@ -0,0 +1,274 @@ +/* aec.cpp + * + * Copyright (C) DFS Deutsche Flugsicherung (2004, 2005). + * All Rights Reserved. + * + * Acoustic Echo Cancellation NLMS-pw algorithm + * + * Version 0.3 filter created with www.dsptutor.freeuk.com + * Version 0.3.1 Allow change of stability parameter delta + * Version 0.4 Leaky Normalized LMS - pre whitening algorithm + */ + +#include +#include + +#include + +#include "adrian-aec.h" + +#ifndef DISABLE_ORC +#include "adrian-aec-orc.h" +#endif + +#ifdef __SSE__ +#include +#endif + +/* Vector Dot Product */ +static REAL dotp(REAL a[], REAL b[]) +{ + REAL sum0 = 0.0, sum1 = 0.0; + int j; + + for (j = 0; j < NLMS_LEN; j += 2) { + // optimize: partial loop unrolling + sum0 += a[j] * b[j]; + sum1 += a[j + 1] * b[j + 1]; + } + return sum0 + sum1; +} + +static REAL dotp_sse(REAL a[], REAL b[]) __attribute__((noinline)); +static REAL dotp_sse(REAL a[], REAL b[]) +{ +#ifdef __SSE__ + /* This is taken from speex's inner product implementation */ + int j; + REAL sum; + __m128 acc = _mm_setzero_ps(); + + for (j=0;jhangover = 0; + memset(a->x, 0, sizeof(a->x)); + memset(a->xf, 0, sizeof(a->xf)); + memset(a->w, 0, sizeof(a->w)); + a->j = NLMS_EXT; + a->delta = 0.0f; + AEC_setambient(a, NoiseFloor); + a->dfast = a->dslow = M75dB_PCM; + a->xfast = a->xslow = M80dB_PCM; + a->gain = 1.0f; + a->Fx = IIR1_init(2000.0f/RATE); + a->Fe = IIR1_init(2000.0f/RATE); + a->cutoff = FIR_HP_300Hz_init(); + a->acMic = IIR_HP_init(); + a->acSpk = IIR_HP_init(); + + a->aes_y2 = M0dB; + + a->fdwdisplay = -1; + a->dumpcnt = 0; + memset(a->ws, 0, sizeof(a->ws)); + + if (have_vector) + a->dotp = dotp_sse; + else + a->dotp = dotp; + + return a; +} + +// Adrian soft decision DTD +// (Dual Average Near-End to Far-End signal Ratio DTD) +// This algorithm uses exponential smoothing with differnt +// ageing parameters to get fast and slow near-end and far-end +// signal averages. The ratio of NFRs term +// (dfast / xfast) / (dslow / xslow) is used to compute the stepsize +// A ratio value of 2.5 is mapped to stepsize 0, a ratio of 0 is +// mapped to 1.0 with a limited linear function. +static float AEC_dtd(AEC *a, REAL d, REAL x) +{ + float stepsize; + float ratio, M; + + // fast near-end and far-end average + a->dfast += ALPHAFAST * (fabsf(d) - a->dfast); + a->xfast += ALPHAFAST * (fabsf(x) - a->xfast); + + // slow near-end and far-end average + a->dslow += ALPHASLOW * (fabsf(d) - a->dslow); + a->xslow += ALPHASLOW * (fabsf(x) - a->xslow); + + if (a->xfast < M70dB_PCM) { + return 0.0; // no Spk signal + } + + if (a->dfast < M70dB_PCM) { + return 0.0; // no Mic signal + } + + // ratio of NFRs + ratio = (a->dfast * a->xslow) / (a->dslow * a->xfast); + + // begrenzte lineare Kennlinie + M = (STEPY2 - STEPY1) / (STEPX2 - STEPX1); + if (ratio < STEPX1) { + stepsize = STEPY1; + } else if (ratio > STEPX2) { + stepsize = STEPY2; + } else { + // Punktrichtungsform einer Geraden + stepsize = M * (ratio - STEPX1) + STEPY1; + } + + return stepsize; +} + + +static void AEC_leaky(AEC *a) +// The xfast signal is used to charge the hangover timer to Thold. +// When hangover expires (no Spk signal for some time) the vector w +// is erased. This is my implementation of Leaky NLMS. +{ + if (a->xfast >= M70dB_PCM) { + // vector w is valid for hangover Thold time + a->hangover = Thold; + } else { + if (a->hangover > 1) { + --(a->hangover); + } else if (1 == a->hangover) { + --(a->hangover); + // My Leaky NLMS is to erase vector w when hangover expires + memset(a->w, 0, sizeof(a->w)); + } + } +} + + +#if 0 +void AEC::openwdisplay() { + // open TCP connection to program wdisplay.tcl + fdwdisplay = socket_async("127.0.0.1", 50999); +}; +#endif + + +static REAL AEC_nlms_pw(AEC *a, REAL d, REAL x_, float stepsize) +{ + REAL e; + REAL ef; + a->x[a->j] = x_; + a->xf[a->j] = IIR1_highpass(a->Fx, x_); // pre-whitening of x + + // calculate error value + // (mic signal - estimated mic signal from spk signal) + e = d; + if (a->hangover > 0) { + e -= a->dotp(a->w, a->x + a->j); + } + ef = IIR1_highpass(a->Fe, e); // pre-whitening of e + + // optimize: iterative dotp(xf, xf) + a->dotp_xf_xf += (a->xf[a->j] * a->xf[a->j] - a->xf[a->j + NLMS_LEN - 1] * a->xf[a->j + NLMS_LEN - 1]); + + if (stepsize > 0.0) { + // calculate variable step size + REAL mikro_ef = stepsize * ef / a->dotp_xf_xf; + +#ifdef DISABLE_ORC + // update tap weights (filter learning) + int i; + for (i = 0; i < NLMS_LEN; i += 2) { + // optimize: partial loop unrolling + a->w[i] += mikro_ef * a->xf[i + a->j]; + a->w[i + 1] += mikro_ef * a->xf[i + a->j + 1]; + } +#else + update_tap_weights(a->w, &a->xf[a->j], mikro_ef, NLMS_LEN); +#endif + } + + if (--(a->j) < 0) { + // optimize: decrease number of memory copies + a->j = NLMS_EXT; + memmove(a->x + a->j + 1, a->x, (NLMS_LEN - 1) * sizeof(REAL)); + memmove(a->xf + a->j + 1, a->xf, (NLMS_LEN - 1) * sizeof(REAL)); + } + + // Saturation + if (e > MAXPCM) { + return MAXPCM; + } else if (e < -MAXPCM) { + return -MAXPCM; + } else { + return e; + } +} + + +int AEC_doAEC(AEC *a, int d_, int x_) +{ + REAL d = (REAL) d_; + REAL x = (REAL) x_; + + // Mic Highpass Filter - to remove DC + d = IIR_HP_highpass(a->acMic, d); + + // Mic Highpass Filter - cut-off below 300Hz + d = FIR_HP_300Hz_highpass(a->cutoff, d); + + // Amplify, for e.g. Soundcards with -6dB max. volume + d *= a->gain; + + // Spk Highpass Filter - to remove DC + x = IIR_HP_highpass(a->acSpk, x); + + // Double Talk Detector + a->stepsize = AEC_dtd(a, d, x); + + // Leaky (ageing of vector w) + AEC_leaky(a); + + // Acoustic Echo Cancellation + d = AEC_nlms_pw(a, d, x, a->stepsize); + +#if 0 + if (fdwdisplay >= 0) { + if (++dumpcnt >= (WIDEB*RATE/10)) { + // wdisplay creates 10 dumps per seconds = large CPU load! + dumpcnt = 0; + write(fdwdisplay, ws, DUMP_LEN*sizeof(float)); + // we don't check return value. This is not production quality!!! + memset(ws, 0, sizeof(ws)); + } else { + int i; + for (i = 0; i < DUMP_LEN; i += 2) { + // optimize: partial loop unrolling + ws[i] += w[i]; + ws[i + 1] += w[i + 1]; + } + } + } +#endif + + return (int) d; +} diff --git a/src/modules/echo-cancel/adrian-aec.h b/src/modules/echo-cancel/adrian-aec.h new file mode 100644 index 0000000..235984b --- /dev/null +++ b/src/modules/echo-cancel/adrian-aec.h @@ -0,0 +1,380 @@ +/* aec.h + * + * Copyright (C) DFS Deutsche Flugsicherung (2004, 2005). + * All Rights Reserved. + * Author: Andre Adrian + * + * Acoustic Echo Cancellation Leaky NLMS-pw algorithm + * + * Version 0.3 filter created with www.dsptutor.freeuk.com + * Version 0.3.1 Allow change of stability parameter delta + * Version 0.4 Leaky Normalized LMS - pre whitening algorithm + */ + +#ifndef _AEC_H /* include only once */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include + +#define WIDEB 2 + +// use double if your CPU does software-emulation of float +#define REAL float + +/* dB Values */ +#define M0dB 1.0f +#define M3dB 0.71f +#define M6dB 0.50f +#define M9dB 0.35f +#define M12dB 0.25f +#define M18dB 0.125f +#define M24dB 0.063f + +/* dB values for 16bit PCM */ +/* MxdB_PCM = 32767 * 10 ^(x / 20) */ +#define M10dB_PCM 10362.0f +#define M20dB_PCM 3277.0f +#define M25dB_PCM 1843.0f +#define M30dB_PCM 1026.0f +#define M35dB_PCM 583.0f +#define M40dB_PCM 328.0f +#define M45dB_PCM 184.0f +#define M50dB_PCM 104.0f +#define M55dB_PCM 58.0f +#define M60dB_PCM 33.0f +#define M65dB_PCM 18.0f +#define M70dB_PCM 10.0f +#define M75dB_PCM 6.0f +#define M80dB_PCM 3.0f +#define M85dB_PCM 2.0f +#define M90dB_PCM 1.0f + +#define MAXPCM 32767.0f + +/* Design constants (Change to fine tune the algorithms */ + +/* The following values are for hardware AEC and studio quality + * microphone */ + +/* NLMS filter length in taps (samples). A longer filter length gives + * better Echo Cancellation, but maybe slower convergence speed and + * needs more CPU power (Order of NLMS is linear) */ +#define NLMS_LEN (100*WIDEB*8) + +/* Vector w visualization length in taps (samples). + * Must match argv value for wdisplay.tcl */ +#define DUMP_LEN (40*WIDEB*8) + +/* minimum energy in xf. Range: M70dB_PCM to M50dB_PCM. Should be equal + * to microphone ambient Noise level */ +#define NoiseFloor M55dB_PCM + +/* Leaky hangover in taps. + */ +#define Thold (60 * WIDEB * 8) + +// Adrian soft decision DTD +// left point. X is ratio, Y is stepsize +#define STEPX1 1.0 +#define STEPY1 1.0 +// right point. STEPX2=2.0 is good double talk, 3.0 is good single talk. +#define STEPX2 2.5 +#define STEPY2 0 +#define ALPHAFAST (1.0f / 100.0f) +#define ALPHASLOW (1.0f / 20000.0f) + + + +/* Ageing multiplier for LMS memory vector w */ +#define Leaky 0.9999f + +/* Double Talk Detector Speaker/Microphone Threshold. Range <=1 + * Large value (M0dB) is good for Single-Talk Echo cancellation, + * small value (M12dB) is good for Doulbe-Talk AEC */ +#define GeigelThreshold M6dB + +/* for Non Linear Processor. Range >0 to 1. Large value (M0dB) is good + * for Double-Talk, small value (M12dB) is good for Single-Talk */ +#define NLPAttenuation M12dB + +/* Below this line there are no more design constants */ + +typedef struct IIR_HP IIR_HP; + +/* Exponential Smoothing or IIR Infinite Impulse Response Filter */ +struct IIR_HP { + REAL x; +}; + +static IIR_HP* IIR_HP_init(void) { + IIR_HP *i = pa_xnew(IIR_HP, 1); + i->x = 0.0f; + return i; + } + +static REAL IIR_HP_highpass(IIR_HP *i, REAL in) { + const REAL a0 = 0.01f; /* controls Transfer Frequency */ + /* Highpass = Signal - Lowpass. Lowpass = Exponential Smoothing */ + i->x += a0 * (in - i->x); + return in - i->x; + }; + +typedef struct FIR_HP_300Hz FIR_HP_300Hz; + +#if WIDEB==1 +/* 17 taps FIR Finite Impulse Response filter + * Coefficients calculated with + * www.dsptutor.freeuk.com/KaiserFilterDesign/KaiserFilterDesign.html + */ +class FIR_HP_300Hz { + REAL z[18]; + +public: + FIR_HP_300Hz() { + memset(this, 0, sizeof(FIR_HP_300Hz)); + } + + REAL highpass(REAL in) { + const REAL a[18] = { + // Kaiser Window FIR Filter, Filter type: High pass + // Passband: 300.0 - 4000.0 Hz, Order: 16 + // Transition band: 75.0 Hz, Stopband attenuation: 10.0 dB + -0.034870606, -0.039650206, -0.044063766, -0.04800318, + -0.051370874, -0.054082647, -0.056070227, -0.057283327, + 0.8214126, -0.057283327, -0.056070227, -0.054082647, + -0.051370874, -0.04800318, -0.044063766, -0.039650206, + -0.034870606, 0.0 + }; + memmove(z + 1, z, 17 * sizeof(REAL)); + z[0] = in; + REAL sum0 = 0.0, sum1 = 0.0; + int j; + + for (j = 0; j < 18; j += 2) { + // optimize: partial loop unrolling + sum0 += a[j] * z[j]; + sum1 += a[j + 1] * z[j + 1]; + } + return sum0 + sum1; + } +}; + +#else + +/* 35 taps FIR Finite Impulse Response filter + * Passband 150Hz to 4kHz for 8kHz sample rate, 300Hz to 8kHz for 16kHz + * sample rate. + * Coefficients calculated with + * www.dsptutor.freeuk.com/KaiserFilterDesign/KaiserFilterDesign.html + */ +struct FIR_HP_300Hz { + REAL z[36]; +}; + +static FIR_HP_300Hz* FIR_HP_300Hz_init(void) { + FIR_HP_300Hz *ret = pa_xnew(FIR_HP_300Hz, 1); + memset(ret, 0, sizeof(FIR_HP_300Hz)); + return ret; + } + +static REAL FIR_HP_300Hz_highpass(FIR_HP_300Hz *f, REAL in) { + REAL sum0 = 0.0, sum1 = 0.0; + int j; + const REAL a[36] = { + // Kaiser Window FIR Filter, Filter type: High pass + // Passband: 150.0 - 4000.0 Hz, Order: 34 + // Transition band: 34.0 Hz, Stopband attenuation: 10.0 dB + -0.016165324, -0.017454365, -0.01871232, -0.019931411, + -0.021104068, -0.022222936, -0.02328091, -0.024271343, + -0.025187887, -0.02602462, -0.026776174, -0.027437767, + -0.028004972, -0.028474221, -0.028842418, -0.029107114, + -0.02926664, 0.8524841, -0.02926664, -0.029107114, + -0.028842418, -0.028474221, -0.028004972, -0.027437767, + -0.026776174, -0.02602462, -0.025187887, -0.024271343, + -0.02328091, -0.022222936, -0.021104068, -0.019931411, + -0.01871232, -0.017454365, -0.016165324, 0.0 + }; + memmove(f->z + 1, f->z, 35 * sizeof(REAL)); + f->z[0] = in; + + for (j = 0; j < 36; j += 2) { + // optimize: partial loop unrolling + sum0 += a[j] * f->z[j]; + sum1 += a[j + 1] * f->z[j + 1]; + } + return sum0 + sum1; + } +#endif + +typedef struct IIR1 IIR1; + +/* Recursive single pole IIR Infinite Impulse response High-pass filter + * + * Reference: The Scientist and Engineer's Guide to Digital Processing + * + * output[N] = A0 * input[N] + A1 * input[N-1] + B1 * output[N-1] + * + * X = exp(-2.0 * pi * Fc) + * A0 = (1 + X) / 2 + * A1 = -(1 + X) / 2 + * B1 = X + * Fc = cutoff freq / sample rate + */ +struct IIR1 { + REAL in0, out0; + REAL a0, a1, b1; +}; + +#if 0 + IIR1() { + memset(this, 0, sizeof(IIR1)); + } +#endif + +static IIR1* IIR1_init(REAL Fc) { + IIR1 *i = pa_xnew(IIR1, 1); + i->b1 = expf(-2.0f * M_PI * Fc); + i->a0 = (1.0f + i->b1) / 2.0f; + i->a1 = -(i->a0); + i->in0 = 0.0f; + i->out0 = 0.0f; + return i; + } + +static REAL IIR1_highpass(IIR1 *i, REAL in) { + REAL out = i->a0 * in + i->a1 * i->in0 + i->b1 * i->out0; + i->in0 = in; + i->out0 = out; + return out; + } + + +#if 0 +/* Recursive two pole IIR Infinite Impulse Response filter + * Coefficients calculated with + * http://www.dsptutor.freeuk.com/IIRFilterDesign/IIRFiltDes102.html + */ +class IIR2 { + REAL x[2], y[2]; + +public: + IIR2() { + memset(this, 0, sizeof(IIR2)); + } + + REAL highpass(REAL in) { + // Butterworth IIR filter, Filter type: HP + // Passband: 2000 - 4000.0 Hz, Order: 2 + const REAL a[] = { 0.29289323f, -0.58578646f, 0.29289323f }; + const REAL b[] = { 1.3007072E-16f, 0.17157288f }; + REAL out = + a[0] * in + a[1] * x[0] + a[2] * x[1] - b[0] * y[0] - b[1] * y[1]; + + x[1] = x[0]; + x[0] = in; + y[1] = y[0]; + y[0] = out; + return out; + } +}; +#endif + + +// Extention in taps to reduce mem copies +#define NLMS_EXT (10*8) + +// block size in taps to optimize DTD calculation +#define DTD_LEN 16 + +typedef struct AEC AEC; + +struct AEC { + // Time domain Filters + IIR_HP *acMic, *acSpk; // DC-level remove Highpass) + FIR_HP_300Hz *cutoff; // 150Hz cut-off Highpass + REAL gain; // Mic signal amplify + IIR1 *Fx, *Fe; // pre-whitening Highpass for x, e + + // Adrian soft decision DTD (Double Talk Detector) + REAL dfast, xfast; + REAL dslow, xslow; + + // NLMS-pw + REAL x[NLMS_LEN + NLMS_EXT]; // tap delayed loudspeaker signal + REAL xf[NLMS_LEN + NLMS_EXT]; // pre-whitening tap delayed signal + PA_DECLARE_ALIGNED(16, REAL, w[NLMS_LEN]); // tap weights + int j; // optimize: less memory copies + double dotp_xf_xf; // double to avoid loss of precision + float delta; // noise floor to stabilize NLMS + + // AES + float aes_y2; // not in use! + + // w vector visualization + REAL ws[DUMP_LEN]; // tap weights sums + int fdwdisplay; // TCP file descriptor + int dumpcnt; // wdisplay output counter + + // variables are public for visualization + int hangover; + float stepsize; + + // vfuncs that are picked based on processor features available + REAL (*dotp) (REAL[], REAL[]); +}; + +/* Double-Talk Detector + * + * in d: microphone sample (PCM as REALing point value) + * in x: loudspeaker sample (PCM as REALing point value) + * return: from 0 for doubletalk to 1.0 for single talk + */ +static float AEC_dtd(AEC *a, REAL d, REAL x); + +static void AEC_leaky(AEC *a); + +/* Normalized Least Mean Square Algorithm pre-whitening (NLMS-pw) + * The LMS algorithm was developed by Bernard Widrow + * book: Haykin, Adaptive Filter Theory, 4. edition, Prentice Hall, 2002 + * + * in d: microphone sample (16bit PCM value) + * in x_: loudspeaker sample (16bit PCM value) + * in stepsize: NLMS adaptation variable + * return: echo cancelled microphone sample + */ +static REAL AEC_nlms_pw(AEC *a, REAL d, REAL x_, float stepsize); + + AEC* AEC_init(int RATE, int have_vector); + +/* Acoustic Echo Cancellation and Suppression of one sample + * in d: microphone signal with echo + * in x: loudspeaker signal + * return: echo cancelled microphone signal + */ + int AEC_doAEC(AEC *a, int d_, int x_); + +static float AEC_getambient(AEC *a) { + return a->dfast; + }; +static void AEC_setambient(AEC *a, float Min_xf) { + a->dotp_xf_xf -= a->delta; // subtract old delta + a->delta = (NLMS_LEN-1) * Min_xf * Min_xf; + a->dotp_xf_xf += a->delta; // add new delta + }; +static void AEC_setgain(AEC *a, float gain_) { + a->gain = gain_; + }; +#if 0 + void AEC_openwdisplay(AEC *a); +#endif +static void AEC_setaes(AEC *a, float aes_y2_) { + a->aes_y2 = aes_y2_; + }; +static double AEC_max_dotp_xf_xf(AEC *a, double u); + +#define _AEC_H +#endif diff --git a/src/modules/echo-cancel/adrian-license.txt b/src/modules/echo-cancel/adrian-license.txt new file mode 100644 index 0000000..7c06efd --- /dev/null +++ b/src/modules/echo-cancel/adrian-license.txt @@ -0,0 +1,17 @@ + Copyright (C) DFS Deutsche Flugsicherung (2004). All Rights Reserved. + + You are allowed to use this source code in any open source or closed + source software you want. You are allowed to use the algorithms for a + hardware solution. You are allowed to modify the source code. + You are not allowed to remove the name of the author from this memo or + from the source code files. You are not allowed to monopolize the + source code or the algorithms behind the source code as your + intellectual property. This source code is free of royalty and comes + with no warranty. + +--- The following does not apply to the PulseAudio module --- + + Please see g711/gen-lic.txt for the ITU-T G.711 codec copyright. + Please see gsm/gen-lic.txt for the ITU-T GSM codec copyright. + Please see ilbc/COPYRIGHT and ilbc/NOTICE for the IETF iLBC codec + copyright. diff --git a/src/modules/echo-cancel/adrian.c b/src/modules/echo-cancel/adrian.c new file mode 100644 index 0000000..85b2788 --- /dev/null +++ b/src/modules/echo-cancel/adrian.c @@ -0,0 +1,119 @@ +/*** + This file is part of PulseAudio. + + Copyright 2010 Arun Raghavan + + Contributor: Wim Taymans + + The actual implementation is taken from the sources at + http://andreadrian.de/intercom/ - for the license, look for + adrian-license.txt in the same directory as this file. + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include "echo-cancel.h" + +/* should be between 10-20 ms */ +#define DEFAULT_FRAME_SIZE_MS 20 + +static const char* const valid_modargs[] = { + "frame_size_ms", + NULL +}; + +static void pa_adrian_ec_fixate_spec(pa_sample_spec *source_ss, pa_channel_map *source_map, + pa_sample_spec *sink_ss, pa_channel_map *sink_map) +{ + source_ss->format = PA_SAMPLE_S16NE; + source_ss->channels = 1; + pa_channel_map_init_mono(source_map); + + *sink_ss = *source_ss; + *sink_map = *source_map; +} + +pa_bool_t pa_adrian_ec_init(pa_core *c, pa_echo_canceller *ec, + pa_sample_spec *source_ss, pa_channel_map *source_map, + pa_sample_spec *sink_ss, pa_channel_map *sink_map, + uint32_t *blocksize, const char *args) +{ + int framelen, rate, have_vector = 0; + uint32_t frame_size_ms; + pa_modargs *ma; + + if (!(ma = pa_modargs_new(args, valid_modargs))) { + pa_log("Failed to parse submodule arguments."); + goto fail; + } + + frame_size_ms = DEFAULT_FRAME_SIZE_MS; + if (pa_modargs_get_value_u32(ma, "frame_size_ms", &frame_size_ms) < 0 || frame_size_ms < 1 || frame_size_ms > 200) { + pa_log("Invalid frame_size_ms specification"); + goto fail; + } + + pa_adrian_ec_fixate_spec(source_ss, source_map, sink_ss, sink_map); + + rate = source_ss->rate; + framelen = (rate * frame_size_ms) / 1000; + + *blocksize = ec->params.priv.adrian.blocksize = framelen * pa_frame_size (source_ss); + + pa_log_debug ("Using framelen %d, blocksize %u, channels %d, rate %d", framelen, ec->params.priv.adrian.blocksize, source_ss->channels, source_ss->rate); + + /* For now we only support SSE */ +#if 0 + if (c->cpu_info.cpu_type == PA_CPU_X86 && (c->cpu_info.flags.x86 & PA_CPU_X86_SSE)) + have_vector = 1; +#endif + + ec->params.priv.adrian.aec = AEC_init(rate, have_vector); + if (!ec->params.priv.adrian.aec) + goto fail; + + pa_modargs_free(ma); + return TRUE; + +fail: + if (ma) + pa_modargs_free(ma); + return FALSE; +} + +void pa_adrian_ec_run(pa_echo_canceller *ec, const uint8_t *rec, const uint8_t *play, uint8_t *out) +{ + unsigned int i; + + for (i = 0; i < ec->params.priv.adrian.blocksize; i += 2) { + /* We know it's S16NE mono data */ + int r = *(int16_t *)(rec + i); + int p = *(int16_t *)(play + i); + *(int16_t *)(out + i) = (int16_t) AEC_doAEC(ec->params.priv.adrian.aec, r, p); + } +} + +void pa_adrian_ec_done(pa_echo_canceller *ec) +{ + pa_xfree(ec->params.priv.adrian.aec); + ec->params.priv.adrian.aec = NULL; +} diff --git a/src/modules/echo-cancel/adrian.h b/src/modules/echo-cancel/adrian.h new file mode 100644 index 0000000..639fa9e --- /dev/null +++ b/src/modules/echo-cancel/adrian.h @@ -0,0 +1,31 @@ +/*** + This file is part of PulseAudio. + + Copyright 2010 Arun Raghavan + + The actual implementation is taken from the sources at + http://andreadrian.de/intercom/ - for the license, look for + adrian-license.txt in the same directory as this file. + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +/* Forward declarations */ + +typedef struct AEC AEC; + +AEC* AEC_init(int RATE, int have_vector); +int AEC_doAEC(AEC *a, int d_, int x_); diff --git a/src/modules/echo-cancel/echo-cancel.h b/src/modules/echo-cancel/echo-cancel.h new file mode 100644 index 0000000..5f6adbc --- /dev/null +++ b/src/modules/echo-cancel/echo-cancel.h @@ -0,0 +1,82 @@ +/*** + This file is part of PulseAudio. + + Copyright 2010 Arun Raghavan + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include + +#include +#include "adrian.h" + +/* Common data structures */ + +typedef struct pa_echo_canceller_params pa_echo_canceller_params; + +struct pa_echo_canceller_params { + union { + struct { + SpeexEchoState *state; + } speex; + struct { + uint32_t blocksize; + AEC *aec; + } adrian; + /* each canceller-specific structure goes here */ + } priv; +}; + +typedef struct pa_echo_canceller pa_echo_canceller; + +struct pa_echo_canceller { + pa_bool_t (*init) (pa_core *c, + pa_echo_canceller *ec, + pa_sample_spec *source_ss, + pa_channel_map *source_map, + pa_sample_spec *sink_ss, + pa_channel_map *sink_map, + uint32_t *blocksize, + const char *args); + void (*run) (pa_echo_canceller *ec, const uint8_t *rec, const uint8_t *play, uint8_t *out); + void (*done) (pa_echo_canceller *ec); + + pa_echo_canceller_params params; +}; + +/* Speex canceller functions */ +pa_bool_t pa_speex_ec_init(pa_core *c, pa_echo_canceller *ec, + pa_sample_spec *source_ss, pa_channel_map *source_map, + pa_sample_spec *sink_ss, pa_channel_map *sink_map, + uint32_t *blocksize, const char *args); +void pa_speex_ec_run(pa_echo_canceller *ec, const uint8_t *rec, const uint8_t *play, uint8_t *out); +void pa_speex_ec_done(pa_echo_canceller *ec); + +/* Adrian Andre's echo canceller */ +pa_bool_t pa_adrian_ec_init(pa_core *c, pa_echo_canceller *ec, + pa_sample_spec *source_ss, pa_channel_map *source_map, + pa_sample_spec *sink_ss, pa_channel_map *sink_map, + uint32_t *blocksize, const char *args); +void pa_adrian_ec_run(pa_echo_canceller *ec, const uint8_t *rec, const uint8_t *play, uint8_t *out); +void pa_adrian_ec_done(pa_echo_canceller *ec); diff --git a/src/modules/echo-cancel/module-echo-cancel-symdef.h b/src/modules/echo-cancel/module-echo-cancel-symdef.h new file mode 100644 index 0000000..6435170 --- /dev/null +++ b/src/modules/echo-cancel/module-echo-cancel-symdef.h @@ -0,0 +1,29 @@ +#ifndef foomoduleechocancelsymdeffoo +#define foomoduleechocancelsymdeffoo + +#include +#include +#include + +#define pa__init module_echo_cancel_LTX_pa__init +#define pa__done module_echo_cancel_LTX_pa__done +#define pa__get_author module_echo_cancel_LTX_pa__get_author +#define pa__get_description module_echo_cancel_LTX_pa__get_description +#define pa__get_usage module_echo_cancel_LTX_pa__get_usage +#define pa__get_version module_echo_cancel_LTX_pa__get_version +#define pa__get_deprecated module_echo_cancel_LTX_pa__get_deprecated +#define pa__load_once module_echo_cancel_LTX_pa__load_once +#define pa__get_n_used module_echo_cancel_LTX_pa__get_n_used + +int pa__init(pa_module*m); +void pa__done(pa_module*m); +int pa__get_n_used(pa_module*m); + +const char* pa__get_author(void); +const char* pa__get_description(void); +const char* pa__get_usage(void); +const char* pa__get_version(void); +const char* pa__get_deprecated(void); +pa_bool_t pa__load_once(void); + +#endif diff --git a/src/modules/echo-cancel/module-echo-cancel.c b/src/modules/echo-cancel/module-echo-cancel.c new file mode 100644 index 0000000..611ebb7 --- /dev/null +++ b/src/modules/echo-cancel/module-echo-cancel.c @@ -0,0 +1,1680 @@ +/*** + This file is part of PulseAudio. + + Copyright 2010 Wim Taymans + + Based on module-virtual-sink.c + module-virtual-source.c + module-loopback.c + + Copyright 2010 Intel Corporation + Contributor: Pierre-Louis Bossart + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include + +#include "echo-cancel.h" + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "module-echo-cancel-symdef.h" + +PA_MODULE_AUTHOR("Wim Taymans"); +PA_MODULE_DESCRIPTION("Echo Cancelation"); +PA_MODULE_VERSION(PACKAGE_VERSION); +PA_MODULE_LOAD_ONCE(FALSE); +PA_MODULE_USAGE( + _("source_name= " + "source_properties= " + "source_master= " + "sink_name= " + "sink_properties= " + "sink_master= " + "adjust_time= " + "format= " + "rate= " + "channels= " + "channel_map= " + "aec_method= " + "aec_args= " + "save_aec= " + )); + +/* NOTE: Make sure the enum and ec_table are maintained in the correct order */ +typedef enum { + PA_ECHO_CANCELLER_INVALID = -1, + PA_ECHO_CANCELLER_SPEEX = 0, + PA_ECHO_CANCELLER_ADRIAN, +} pa_echo_canceller_method_t; + +#define DEFAULT_ECHO_CANCELLER "speex" + +static const pa_echo_canceller ec_table[] = { + { + /* Speex */ + .init = pa_speex_ec_init, + .run = pa_speex_ec_run, + .done = pa_speex_ec_done, + }, + { + /* Adrian Andre's NLMS implementation */ + .init = pa_adrian_ec_init, + .run = pa_adrian_ec_run, + .done = pa_adrian_ec_done, + }, +}; + +#define DEFAULT_ADJUST_TIME_USEC (1*PA_USEC_PER_SEC) +#define DEFAULT_SAVE_AEC 0 + +#define MEMBLOCKQ_MAXLENGTH (16*1024*1024) + +/* This module creates a new (virtual) source and sink. + * + * The data sent to the new sink is kept in a memblockq before being + * forwarded to the real sink_master. + * + * Data read from source_master is matched against the saved sink data and + * echo canceled data is then pushed onto the new source. + * + * Both source and sink masters have their own threads to push/pull data + * respectively. We however perform all our actions in the source IO thread. + * To do this we send all played samples to the source IO thread where they + * are then pushed into the memblockq. + * + * Alignment is performed in two steps: + * + * 1) when something happens that requires quick adjustement of the alignment of + * capture and playback samples, we perform a resync. This adjusts the + * position in the playback memblock to the requested sample. Quick + * adjustements include moving the playback samples before the capture + * samples (because else the echo canceler does not work) or when the + * playback pointer drifts too far away. + * + * 2) periodically check the difference between capture and playback. we use a + * low and high watermark for adjusting the alignment. playback should always + * be before capture and the difference should not be bigger than one frame + * size. We would ideally like to resample the sink_input but most driver + * don't give enough accuracy to be able to do that right now. + */ + +struct snapshot { + pa_usec_t sink_now; + pa_usec_t sink_latency; + size_t sink_delay; + int64_t send_counter; + + pa_usec_t source_now; + pa_usec_t source_latency; + size_t source_delay; + int64_t recv_counter; + size_t rlen; + size_t plen; +}; + +struct userdata { + pa_core *core; + pa_module *module; + + uint32_t save_aec; + + pa_echo_canceller *ec; + uint32_t blocksize; + + pa_bool_t need_realign; + + /* to wakeup the source I/O thread */ + pa_bool_t in_push; + pa_asyncmsgq *asyncmsgq; + pa_rtpoll_item *rtpoll_item_read, *rtpoll_item_write; + + pa_source *source; + pa_bool_t source_auto_desc; + pa_source_output *source_output; + pa_memblockq *source_memblockq; /* echo canceler needs fixed sized chunks */ + size_t source_skip; + + pa_sink *sink; + pa_bool_t sink_auto_desc; + pa_sink_input *sink_input; + pa_memblockq *sink_memblockq; + int64_t send_counter; /* updated in sink IO thread */ + int64_t recv_counter; + size_t sink_skip; + + pa_atomic_t request_resync; + + int active_mask; + pa_time_event *time_event; + pa_usec_t adjust_time; + + FILE *captured_file; + FILE *played_file; + FILE *canceled_file; +}; + +static void source_output_snapshot_within_thread(struct userdata *u, struct snapshot *snapshot); + +static const char* const valid_modargs[] = { + "source_name", + "source_properties", + "source_master", + "sink_name", + "sink_properties", + "sink_master", + "adjust_time", + "format", + "rate", + "channels", + "channel_map", + "aec_method", + "aec_args", + "save_aec", + NULL +}; + +enum { + SOURCE_OUTPUT_MESSAGE_POST = PA_SOURCE_OUTPUT_MESSAGE_MAX, + SOURCE_OUTPUT_MESSAGE_REWIND, + SOURCE_OUTPUT_MESSAGE_LATENCY_SNAPSHOT, + SOURCE_OUTPUT_MESSAGE_APPLY_DIFF_TIME +}; + +enum { + SINK_INPUT_MESSAGE_LATENCY_SNAPSHOT +}; + +static int64_t calc_diff(struct userdata *u, struct snapshot *snapshot) { + int64_t buffer, diff_time, buffer_latency; + + /* get the number of samples between capture and playback */ + if (snapshot->plen > snapshot->rlen) + buffer = snapshot->plen - snapshot->rlen; + else + buffer = 0; + + buffer += snapshot->source_delay + snapshot->sink_delay; + + /* add the amount of samples not yet transfered to the source context */ + if (snapshot->recv_counter <= snapshot->send_counter) + buffer += (int64_t) (snapshot->send_counter - snapshot->recv_counter); + else + buffer += PA_CLIP_SUB(buffer, (int64_t) (snapshot->recv_counter - snapshot->send_counter)); + + /* convert to time */ + buffer_latency = pa_bytes_to_usec(buffer, &u->source_output->sample_spec); + + /* capture and playback samples are perfectly aligned when diff_time is 0 */ + diff_time = (snapshot->sink_now + snapshot->sink_latency - buffer_latency) - + (snapshot->source_now - snapshot->source_latency); + + pa_log_debug("diff %lld (%lld - %lld + %lld) %lld %lld %lld %lld", (long long) diff_time, + (long long) snapshot->sink_latency, + (long long) buffer_latency, (long long) snapshot->source_latency, + (long long) snapshot->source_delay, (long long) snapshot->sink_delay, + (long long) (snapshot->send_counter - snapshot->recv_counter), + (long long) (snapshot->sink_now - snapshot->source_now)); + + return diff_time; +} + +/* Called from main context */ +static void time_callback(pa_mainloop_api *a, pa_time_event *e, const struct timeval *t, void *userdata) { + struct userdata *u = userdata; + uint32_t old_rate, base_rate, new_rate; + int64_t diff_time; + size_t fs; + struct snapshot latency_snapshot; + + pa_assert(u); + pa_assert(a); + pa_assert(u->time_event == e); + pa_assert_ctl_context(); + + if (u->active_mask != 3) + return; + + /* update our snapshots */ + pa_asyncmsgq_send(u->source_output->source->asyncmsgq, PA_MSGOBJECT(u->source_output), SOURCE_OUTPUT_MESSAGE_LATENCY_SNAPSHOT, &latency_snapshot, 0, NULL); + pa_asyncmsgq_send(u->sink_input->sink->asyncmsgq, PA_MSGOBJECT(u->sink_input), SINK_INPUT_MESSAGE_LATENCY_SNAPSHOT, &latency_snapshot, 0, NULL); + + /* calculate drift between capture and playback */ + diff_time = calc_diff(u, &latency_snapshot); + + fs = pa_frame_size(&u->source_output->sample_spec); + old_rate = u->sink_input->sample_spec.rate; + base_rate = u->source_output->sample_spec.rate; + + if (diff_time < 0) { + /* recording before playback, we need to adjust quickly. The echo + * canceler does not work in this case. */ + pa_asyncmsgq_post(u->asyncmsgq, PA_MSGOBJECT(u->source_output), SOURCE_OUTPUT_MESSAGE_APPLY_DIFF_TIME, + NULL, diff_time, NULL, NULL); + //new_rate = base_rate - ((pa_usec_to_bytes (-diff_time, &u->source_output->sample_spec) / fs) * PA_USEC_PER_SEC) / u->adjust_time; + new_rate = base_rate; + } + else { + if (diff_time > 1000) { + /* diff too big, quickly adjust */ + pa_asyncmsgq_post(u->asyncmsgq, PA_MSGOBJECT(u->source_output), SOURCE_OUTPUT_MESSAGE_APPLY_DIFF_TIME, + NULL, diff_time, NULL, NULL); + } + + /* recording behind playback, we need to slowly adjust the rate to match */ + //new_rate = base_rate + ((pa_usec_to_bytes (diff_time, &u->source_output->sample_spec) / fs) * PA_USEC_PER_SEC) / u->adjust_time; + + /* assume equal samplerates for now */ + new_rate = base_rate; + } + + /* make sure we don't make too big adjustements because that sounds horrible */ + if (new_rate > base_rate * 1.1 || new_rate < base_rate * 0.9) + new_rate = base_rate; + + if (new_rate != old_rate) { + pa_log_info("Old rate %lu Hz, new rate %lu Hz", (unsigned long) old_rate, (unsigned long) new_rate); + + pa_sink_input_set_rate(u->sink_input, new_rate); + } + + pa_core_rttime_restart(u->core, u->time_event, pa_rtclock_now() + u->adjust_time); +} + +/* Called from source I/O thread context */ +static int source_process_msg_cb(pa_msgobject *o, int code, void *data, int64_t offset, pa_memchunk *chunk) { + struct userdata *u = PA_SOURCE(o)->userdata; + + switch (code) { + + case PA_SOURCE_MESSAGE_GET_LATENCY: + + /* The source is _put() before the source output is, so let's + * make sure we don't access it in that time. Also, the + * source output is first shut down, the source second. */ + if (!PA_SOURCE_IS_LINKED(u->source->thread_info.state) || + !PA_SOURCE_OUTPUT_IS_LINKED(u->source_output->thread_info.state)) { + *((pa_usec_t*) data) = 0; + return 0; + } + + *((pa_usec_t*) data) = + + /* Get the latency of the master source */ + pa_source_get_latency_within_thread(u->source_output->source) + + /* Add the latency internal to our source output on top */ + pa_bytes_to_usec(pa_memblockq_get_length(u->source_output->thread_info.delay_memblockq), &u->source_output->source->sample_spec) + + /* and the buffering we do on the source */ + pa_bytes_to_usec(u->blocksize, &u->source_output->source->sample_spec); + + return 0; + + } + + return pa_source_process_msg(o, code, data, offset, chunk); +} + +/* Called from sink I/O thread context */ +static int sink_process_msg_cb(pa_msgobject *o, int code, void *data, int64_t offset, pa_memchunk *chunk) { + struct userdata *u = PA_SINK(o)->userdata; + + switch (code) { + + case PA_SINK_MESSAGE_GET_LATENCY: + + /* The sink is _put() before the sink input is, so let's + * make sure we don't access it in that time. Also, the + * sink input is first shut down, the sink second. */ + if (!PA_SINK_IS_LINKED(u->sink->thread_info.state) || + !PA_SINK_INPUT_IS_LINKED(u->sink_input->thread_info.state)) { + *((pa_usec_t*) data) = 0; + return 0; + } + + *((pa_usec_t*) data) = + + /* Get the latency of the master sink */ + pa_sink_get_latency_within_thread(u->sink_input->sink) + + + /* Add the latency internal to our sink input on top */ + pa_bytes_to_usec(pa_memblockq_get_length(u->sink_input->thread_info.render_memblockq), &u->sink_input->sink->sample_spec); + + return 0; + } + + return pa_sink_process_msg(o, code, data, offset, chunk); +} + + +/* Called from main context */ +static int source_set_state_cb(pa_source *s, pa_source_state_t state) { + struct userdata *u; + + pa_source_assert_ref(s); + pa_assert_se(u = s->userdata); + + if (!PA_SOURCE_IS_LINKED(state) || + !PA_SOURCE_OUTPUT_IS_LINKED(pa_source_output_get_state(u->source_output))) + return 0; + + pa_log_debug("Source state %d %d", state, u->active_mask); + + if (state == PA_SOURCE_RUNNING) { + /* restart timer when both sink and source are active */ + u->active_mask |= 1; + if (u->active_mask == 3) + pa_core_rttime_restart(u->core, u->time_event, pa_rtclock_now() + u->adjust_time); + + pa_atomic_store (&u->request_resync, 1); + pa_source_output_cork(u->source_output, FALSE); + } else if (state == PA_SOURCE_SUSPENDED) { + u->active_mask &= ~1; + pa_source_output_cork(u->source_output, TRUE); + } + return 0; +} + +/* Called from main context */ +static int sink_set_state_cb(pa_sink *s, pa_sink_state_t state) { + struct userdata *u; + + pa_sink_assert_ref(s); + pa_assert_se(u = s->userdata); + + if (!PA_SINK_IS_LINKED(state) || + !PA_SINK_INPUT_IS_LINKED(pa_sink_input_get_state(u->sink_input))) + return 0; + + pa_log_debug("Sink state %d %d", state, u->active_mask); + + if (state == PA_SINK_RUNNING) { + /* restart timer when both sink and source are active */ + u->active_mask |= 2; + if (u->active_mask == 3) + pa_core_rttime_restart(u->core, u->time_event, pa_rtclock_now() + u->adjust_time); + + pa_atomic_store (&u->request_resync, 1); + pa_sink_input_cork(u->sink_input, FALSE); + } else if (state == PA_SINK_SUSPENDED) { + u->active_mask &= ~2; + pa_sink_input_cork(u->sink_input, TRUE); + } + return 0; +} + +/* Called from I/O thread context */ +static void source_update_requested_latency_cb(pa_source *s) { + struct userdata *u; + + pa_source_assert_ref(s); + pa_assert_se(u = s->userdata); + + if (!PA_SOURCE_IS_LINKED(u->source->thread_info.state) || + !PA_SOURCE_OUTPUT_IS_LINKED(u->source_output->thread_info.state)) + return; + + pa_log_debug("Source update requested latency"); + + /* Just hand this one over to the master source */ + pa_source_output_set_requested_latency_within_thread( + u->source_output, + pa_source_get_requested_latency_within_thread(s)); +} + +/* Called from I/O thread context */ +static void sink_update_requested_latency_cb(pa_sink *s) { + struct userdata *u; + + pa_sink_assert_ref(s); + pa_assert_se(u = s->userdata); + + if (!PA_SINK_IS_LINKED(u->sink->thread_info.state) || + !PA_SINK_INPUT_IS_LINKED(u->sink_input->thread_info.state)) + return; + + pa_log_debug("Sink update requested latency"); + + /* Just hand this one over to the master sink */ + pa_sink_input_set_requested_latency_within_thread( + u->sink_input, + pa_sink_get_requested_latency_within_thread(s)); +} + +/* Called from I/O thread context */ +static void sink_request_rewind_cb(pa_sink *s) { + struct userdata *u; + + pa_sink_assert_ref(s); + pa_assert_se(u = s->userdata); + + if (!PA_SINK_IS_LINKED(u->sink->thread_info.state) || + !PA_SINK_INPUT_IS_LINKED(u->sink_input->thread_info.state)) + return; + + pa_log_debug("Sink request rewind %lld", (long long) s->thread_info.rewind_nbytes); + + /* Just hand this one over to the master sink */ + pa_sink_input_request_rewind(u->sink_input, + s->thread_info.rewind_nbytes, TRUE, FALSE, FALSE); +} + +/* Called from main context */ +static void source_set_volume_cb(pa_source *s) { + struct userdata *u; + + pa_source_assert_ref(s); + pa_assert_se(u = s->userdata); + + if (!PA_SOURCE_IS_LINKED(pa_source_get_state(s)) || + !PA_SOURCE_OUTPUT_IS_LINKED(pa_source_output_get_state(u->source_output))) + return; + + /* FIXME, no volume control in source_output, set volume at the master */ + pa_source_set_volume(u->source_output->source, &s->volume, TRUE); +} + +/* Called from main context */ +static void sink_set_volume_cb(pa_sink *s) { + struct userdata *u; + + pa_sink_assert_ref(s); + pa_assert_se(u = s->userdata); + + if (!PA_SINK_IS_LINKED(pa_sink_get_state(s)) || + !PA_SINK_INPUT_IS_LINKED(pa_sink_input_get_state(u->sink_input))) + return; + + pa_sink_input_set_volume(u->sink_input, &s->real_volume, s->save_volume, TRUE); +} + +static void source_get_volume_cb(pa_source *s) { + struct userdata *u; + + pa_source_assert_ref(s); + pa_assert_se(u = s->userdata); + + if (!PA_SOURCE_IS_LINKED(pa_source_get_state(s)) || + !PA_SOURCE_OUTPUT_IS_LINKED(pa_source_output_get_state(u->source_output))) + return; + + /* FIXME, no volume control in source_output, get the info from the master */ + pa_source_get_volume(u->source_output->source, TRUE); + + if (pa_cvolume_equal(&s->volume,&u->source_output->source->volume)) + /* no change */ + return; + + s->volume = u->source_output->source->volume; + pa_source_set_soft_volume(s, NULL); +} + + +/* Called from main context */ +static void source_set_mute_cb(pa_source *s) { + struct userdata *u; + + pa_source_assert_ref(s); + pa_assert_se(u = s->userdata); + + if (!PA_SOURCE_IS_LINKED(pa_source_get_state(s)) || + !PA_SOURCE_OUTPUT_IS_LINKED(pa_source_output_get_state(u->source_output))) + return; + + /* FIXME, no volume control in source_output, set mute at the master */ + pa_source_set_mute(u->source_output->source, TRUE, TRUE); +} + +/* Called from main context */ +static void sink_set_mute_cb(pa_sink *s) { + struct userdata *u; + + pa_sink_assert_ref(s); + pa_assert_se(u = s->userdata); + + if (!PA_SINK_IS_LINKED(pa_sink_get_state(s)) || + !PA_SINK_INPUT_IS_LINKED(pa_sink_input_get_state(u->sink_input))) + return; + + pa_sink_input_set_mute(u->sink_input, s->muted, s->save_muted); +} + +/* Called from main context */ +static void source_get_mute_cb(pa_source *s) { + struct userdata *u; + + pa_source_assert_ref(s); + pa_assert_se(u = s->userdata); + + if (!PA_SOURCE_IS_LINKED(pa_source_get_state(s)) || + !PA_SOURCE_OUTPUT_IS_LINKED(pa_source_output_get_state(u->source_output))) + return; + + /* FIXME, no volume control in source_output, get the info from the master */ + pa_source_get_mute(u->source_output->source, TRUE); +} + +/* must be called from the input thread context */ +static void apply_diff_time(struct userdata *u, int64_t diff_time) { + int64_t diff; + + if (diff_time < 0) { + diff = pa_usec_to_bytes (-diff_time, &u->source_output->sample_spec); + + if (diff > 0) { + /* add some extra safety samples to compensate for jitter in the + * timings */ + diff += 10 * pa_frame_size (&u->source_output->sample_spec); + + pa_log("Playback after capture (%lld), drop sink %lld", (long long) diff_time, (long long) diff); + + u->sink_skip = diff; + u->source_skip = 0; + } + } else if (diff_time > 0) { + diff = pa_usec_to_bytes (diff_time, &u->source_output->sample_spec); + + if (diff > 0) { + pa_log("playback too far ahead (%lld), drop source %lld", (long long) diff_time, (long long) diff); + + u->source_skip = diff; + u->sink_skip = 0; + } + } +} + +/* must be called from the input thread */ +static void do_resync(struct userdata *u) { + int64_t diff_time; + struct snapshot latency_snapshot; + + pa_log("Doing resync"); + + /* update our snapshot */ + source_output_snapshot_within_thread(u, &latency_snapshot); + pa_asyncmsgq_send(u->sink_input->sink->asyncmsgq, PA_MSGOBJECT(u->sink_input), SINK_INPUT_MESSAGE_LATENCY_SNAPSHOT, &latency_snapshot, 0, NULL); + + /* calculate drift between capture and playback */ + diff_time = calc_diff(u, &latency_snapshot); + + /* and adjust for the drift */ + apply_diff_time(u, diff_time); +} + +/* Called from input thread context */ +static void source_output_push_cb(pa_source_output *o, const pa_memchunk *chunk) { + struct userdata *u; + size_t rlen, plen; + + pa_source_output_assert_ref(o); + pa_source_output_assert_io_context(o); + pa_assert_se(u = o->userdata); + + if (!PA_SOURCE_OUTPUT_IS_LINKED(pa_source_output_get_state(u->source_output))) { + pa_log("push when no link?"); + return; + } + + /* handle queued messages */ + u->in_push = TRUE; + while (pa_asyncmsgq_process_one(u->asyncmsgq) > 0) + ; + u->in_push = FALSE; + + if (pa_atomic_cmpxchg (&u->request_resync, 1, 0)) { + do_resync (u); + } + + pa_memblockq_push_align(u->source_memblockq, chunk); + + rlen = pa_memblockq_get_length(u->source_memblockq); + plen = pa_memblockq_get_length(u->sink_memblockq); + + while (rlen >= u->blocksize) { + pa_memchunk rchunk, pchunk; + + /* take fixed block from recorded samples */ + pa_memblockq_peek_fixed_size(u->source_memblockq, u->blocksize, &rchunk); + + if (plen > u->blocksize && u->source_skip == 0) { + uint8_t *rdata, *pdata, *cdata; + pa_memchunk cchunk; + + if (u->sink_skip) { + size_t to_skip; + + if (u->sink_skip > plen) + to_skip = plen; + else + to_skip = u->sink_skip; + + pa_memblockq_drop(u->sink_memblockq, to_skip); + plen -= to_skip; + + u->sink_skip -= to_skip; + } + + if (plen > u->blocksize && u->sink_skip == 0) { + /* take fixed block from played samples */ + pa_memblockq_peek_fixed_size(u->sink_memblockq, u->blocksize, &pchunk); + + rdata = pa_memblock_acquire(rchunk.memblock); + rdata += rchunk.index; + pdata = pa_memblock_acquire(pchunk.memblock); + pdata += pchunk.index; + + cchunk.index = 0; + cchunk.length = u->blocksize; + cchunk.memblock = pa_memblock_new(u->source->core->mempool, cchunk.length); + cdata = pa_memblock_acquire(cchunk.memblock); + + /* perform echo cancelation */ + u->ec->run(u->ec, rdata, pdata, cdata); + + if (u->save_aec) { + if (u->captured_file) + fwrite(rdata, 1, u->blocksize, u->captured_file); + if (u->played_file) + fwrite(pdata, 1, u->blocksize, u->played_file); + if (u->canceled_file) + fwrite(cdata, 1, u->blocksize, u->canceled_file); + pa_log_debug("AEC frame saved."); + } + + pa_memblock_release(cchunk.memblock); + pa_memblock_release(pchunk.memblock); + pa_memblock_release(rchunk.memblock); + + /* drop consumed sink samples */ + pa_memblockq_drop(u->sink_memblockq, u->blocksize); + pa_memblock_unref(pchunk.memblock); + + pa_memblock_unref(rchunk.memblock); + /* the filtered samples now become the samples from our + * source */ + rchunk = cchunk; + + plen -= u->blocksize; + } + } + + /* forward the (echo-canceled) data to the virtual source */ + pa_source_post(u->source, &rchunk); + pa_memblock_unref(rchunk.memblock); + + pa_memblockq_drop(u->source_memblockq, u->blocksize); + rlen -= u->blocksize; + + if (u->source_skip) { + if (u->source_skip > u->blocksize) { + u->source_skip -= u->blocksize; + } + else { + u->sink_skip += (u->blocksize - u->source_skip); + u->source_skip = 0; + } + } + } +} + +/* Called from I/O thread context */ +static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk) { + struct userdata *u; + + pa_sink_input_assert_ref(i); + pa_assert(chunk); + pa_assert_se(u = i->userdata); + + if (u->sink->thread_info.rewind_requested) + pa_sink_process_rewind(u->sink, 0); + + pa_sink_render_full(u->sink, nbytes, chunk); + + if (i->thread_info.underrun_for > 0) { + pa_log_debug("Handling end of underrun."); + pa_atomic_store (&u->request_resync, 1); + } + + /* let source thread handle the chunk. pass the sample count as well so that + * the source IO thread can update the right variables. */ + pa_asyncmsgq_post(u->asyncmsgq, PA_MSGOBJECT(u->source_output), SOURCE_OUTPUT_MESSAGE_POST, + NULL, 0, chunk, NULL); + u->send_counter += chunk->length; + + return 0; +} + +/* Called from input thread context */ +static void source_output_process_rewind_cb(pa_source_output *o, size_t nbytes) { + struct userdata *u; + + pa_source_output_assert_ref(o); + pa_source_output_assert_io_context(o); + pa_assert_se(u = o->userdata); + + pa_source_process_rewind(u->source, nbytes); + + /* go back on read side, we need to use older sink data for this */ + pa_memblockq_rewind(u->sink_memblockq, nbytes); + + /* manipulate write index */ + pa_memblockq_seek(u->source_memblockq, -nbytes, PA_SEEK_RELATIVE, TRUE); + + pa_log_debug("Source rewind (%lld) %lld", (long long) nbytes, + (long long) pa_memblockq_get_length (u->source_memblockq)); +} + +/* Called from I/O thread context */ +static void sink_input_process_rewind_cb(pa_sink_input *i, size_t nbytes) { + struct userdata *u; + + pa_sink_input_assert_ref(i); + pa_assert_se(u = i->userdata); + + pa_log_debug("Sink process rewind %lld", (long long) nbytes); + + pa_sink_process_rewind(u->sink, nbytes); + + pa_asyncmsgq_post(u->asyncmsgq, PA_MSGOBJECT(u->source_output), SOURCE_OUTPUT_MESSAGE_REWIND, NULL, (int64_t) nbytes, NULL, NULL); + u->send_counter -= nbytes; +} + +static void source_output_snapshot_within_thread(struct userdata *u, struct snapshot *snapshot) { + size_t delay, rlen, plen; + pa_usec_t now, latency; + + now = pa_rtclock_now(); + latency = pa_source_get_latency_within_thread(u->source_output->source); + delay = pa_memblockq_get_length(u->source_output->thread_info.delay_memblockq); + + delay = (u->source_output->thread_info.resampler ? pa_resampler_request(u->source_output->thread_info.resampler, delay) : delay); + rlen = pa_memblockq_get_length(u->source_memblockq); + plen = pa_memblockq_get_length(u->sink_memblockq); + + snapshot->source_now = now; + snapshot->source_latency = latency; + snapshot->source_delay = delay; + snapshot->recv_counter = u->recv_counter; + snapshot->rlen = rlen + u->sink_skip; + snapshot->plen = plen + u->source_skip; +} + + +/* Called from output thread context */ +static int source_output_process_msg_cb(pa_msgobject *obj, int code, void *data, int64_t offset, pa_memchunk *chunk) { + struct userdata *u = PA_SOURCE_OUTPUT(obj)->userdata; + + switch (code) { + + case SOURCE_OUTPUT_MESSAGE_POST: + + pa_source_output_assert_io_context(u->source_output); + + if (PA_SOURCE_IS_OPENED(u->source_output->source->thread_info.state)) + pa_memblockq_push_align(u->sink_memblockq, chunk); + else + pa_memblockq_flush_write(u->sink_memblockq, TRUE); + + u->recv_counter += (int64_t) chunk->length; + + return 0; + + case SOURCE_OUTPUT_MESSAGE_REWIND: + pa_source_output_assert_io_context(u->source_output); + + /* manipulate write index, never go past what we have */ + if (PA_SOURCE_IS_OPENED(u->source_output->source->thread_info.state)) + pa_memblockq_seek(u->sink_memblockq, -offset, PA_SEEK_RELATIVE, TRUE); + else + pa_memblockq_flush_write(u->sink_memblockq, TRUE); + + pa_log_debug("Sink rewind (%lld)", (long long) offset); + + u->recv_counter -= offset; + + return 0; + + case SOURCE_OUTPUT_MESSAGE_LATENCY_SNAPSHOT: { + struct snapshot *snapshot = (struct snapshot *) data; + + source_output_snapshot_within_thread(u, snapshot); + return 0; + } + + case SOURCE_OUTPUT_MESSAGE_APPLY_DIFF_TIME: + apply_diff_time(u, offset); + return 0; + + } + + return pa_source_output_process_msg(obj, code, data, offset, chunk); +} + +static int sink_input_process_msg_cb(pa_msgobject *obj, int code, void *data, int64_t offset, pa_memchunk *chunk) { + struct userdata *u = PA_SINK_INPUT(obj)->userdata; + + switch (code) { + + case SINK_INPUT_MESSAGE_LATENCY_SNAPSHOT: { + size_t delay; + pa_usec_t now, latency; + struct snapshot *snapshot = (struct snapshot *) data; + + pa_sink_input_assert_io_context(u->sink_input); + + now = pa_rtclock_now(); + latency = pa_sink_get_latency_within_thread(u->sink_input->sink); + delay = pa_memblockq_get_length(u->sink_input->thread_info.render_memblockq); + + delay = (u->sink_input->thread_info.resampler ? pa_resampler_request(u->sink_input->thread_info.resampler, delay) : delay); + + snapshot->sink_now = now; + snapshot->sink_latency = latency; + snapshot->sink_delay = delay; + snapshot->send_counter = u->send_counter; + return 0; + } + } + + return pa_sink_input_process_msg(obj, code, data, offset, chunk); +} + +/* Called from I/O thread context */ +static void sink_input_update_max_rewind_cb(pa_sink_input *i, size_t nbytes) { + struct userdata *u; + + pa_sink_input_assert_ref(i); + pa_assert_se(u = i->userdata); + + pa_log_debug("Sink input update max rewind %lld", (long long) nbytes); + + pa_memblockq_set_maxrewind (u->sink_memblockq, nbytes); + pa_sink_set_max_rewind_within_thread(u->sink, nbytes); +} + +/* Called from I/O thread context */ +static void source_output_update_max_rewind_cb(pa_source_output *o, size_t nbytes) { + struct userdata *u; + + pa_source_output_assert_ref(o); + pa_assert_se(u = o->userdata); + + pa_log_debug("Source output update max rewind %lld", (long long) nbytes); + + pa_source_set_max_rewind_within_thread(u->source, nbytes); +} + +/* Called from I/O thread context */ +static void sink_input_update_max_request_cb(pa_sink_input *i, size_t nbytes) { + struct userdata *u; + + pa_sink_input_assert_ref(i); + pa_assert_se(u = i->userdata); + + pa_log_debug("Sink input update max request %lld", (long long) nbytes); + + pa_sink_set_max_request_within_thread(u->sink, nbytes); +} + +/* Called from I/O thread context */ +static void sink_input_update_sink_requested_latency_cb(pa_sink_input *i) { + struct userdata *u; + pa_usec_t latency; + + pa_sink_input_assert_ref(i); + pa_assert_se(u = i->userdata); + + latency = pa_sink_get_requested_latency_within_thread(i->sink); + + pa_log_debug("Sink input update requested latency %lld", (long long) latency); +} + +/* Called from I/O thread context */ +static void source_output_update_source_requested_latency_cb(pa_source_output *o) { + struct userdata *u; + pa_usec_t latency; + + pa_source_output_assert_ref(o); + pa_assert_se(u = o->userdata); + + latency = pa_source_get_requested_latency_within_thread(o->source); + + pa_log_debug("source output update requested latency %lld", (long long) latency); +} + +/* Called from I/O thread context */ +static void sink_input_update_sink_latency_range_cb(pa_sink_input *i) { + struct userdata *u; + + pa_sink_input_assert_ref(i); + pa_assert_se(u = i->userdata); + + pa_log_debug("Sink input update latency range %lld %lld", + (long long) i->sink->thread_info.min_latency, + (long long) i->sink->thread_info.max_latency); + + pa_sink_set_latency_range_within_thread(u->sink, i->sink->thread_info.min_latency, i->sink->thread_info.max_latency); +} + +/* Called from I/O thread context */ +static void source_output_update_source_latency_range_cb(pa_source_output *o) { + struct userdata *u; + + pa_source_output_assert_ref(o); + pa_assert_se(u = o->userdata); + + pa_log_debug("Source output update latency range %lld %lld", + (long long) o->source->thread_info.min_latency, + (long long) o->source->thread_info.max_latency); + + pa_source_set_latency_range_within_thread(u->source, o->source->thread_info.min_latency, o->source->thread_info.max_latency); +} + +/* Called from I/O thread context */ +static void sink_input_update_sink_fixed_latency_cb(pa_sink_input *i) { + struct userdata *u; + + pa_sink_input_assert_ref(i); + pa_assert_se(u = i->userdata); + + pa_log_debug("Sink input update fixed latency %lld", + (long long) i->sink->thread_info.fixed_latency); + + pa_sink_set_fixed_latency_within_thread(u->sink, i->sink->thread_info.fixed_latency); +} + +/* Called from I/O thread context */ +static void source_output_update_source_fixed_latency_cb(pa_source_output *o) { + struct userdata *u; + + pa_source_output_assert_ref(o); + pa_assert_se(u = o->userdata); + + pa_log_debug("Source output update fixed latency %lld", + (long long) o->source->thread_info.fixed_latency); + + pa_source_set_fixed_latency_within_thread(u->source, o->source->thread_info.fixed_latency); +} + +/* Called from output thread context */ +static void source_output_attach_cb(pa_source_output *o) { + struct userdata *u; + + pa_source_output_assert_ref(o); + pa_source_output_assert_io_context(o); + pa_assert_se(u = o->userdata); + + pa_source_set_rtpoll(u->source, o->source->thread_info.rtpoll); + pa_source_set_latency_range_within_thread(u->source, o->source->thread_info.min_latency, o->source->thread_info.max_latency); + pa_source_set_fixed_latency_within_thread(u->source, o->source->thread_info.fixed_latency); + pa_source_set_max_rewind_within_thread(u->source, pa_source_output_get_max_rewind(o)); + + pa_log_debug("Source output %p attach", o); + + pa_source_attach_within_thread(u->source); + + u->rtpoll_item_read = pa_rtpoll_item_new_asyncmsgq_read( + o->source->thread_info.rtpoll, + PA_RTPOLL_LATE, + u->asyncmsgq); +} + +/* Called from I/O thread context */ +static void sink_input_attach_cb(pa_sink_input *i) { + struct userdata *u; + + pa_sink_input_assert_ref(i); + pa_assert_se(u = i->userdata); + + pa_sink_set_rtpoll(u->sink, i->sink->thread_info.rtpoll); + pa_sink_set_latency_range_within_thread(u->sink, i->sink->thread_info.min_latency, i->sink->thread_info.max_latency); + + /* (8.1) IF YOU NEED A FIXED BLOCK SIZE ADD THE LATENCY FOR ONE + * BLOCK MINUS ONE SAMPLE HERE. SEE (7) */ + pa_sink_set_fixed_latency_within_thread(u->sink, i->sink->thread_info.fixed_latency); + + /* (8.2) IF YOU NEED A FIXED BLOCK SIZE ROUND + * pa_sink_input_get_max_request(i) UP TO MULTIPLES OF IT + * HERE. SEE (6) */ + pa_sink_set_max_request_within_thread(u->sink, pa_sink_input_get_max_request(i)); + pa_sink_set_max_rewind_within_thread(u->sink, pa_sink_input_get_max_rewind(i)); + + pa_log_debug("Sink input %p attach", i); + + u->rtpoll_item_write = pa_rtpoll_item_new_asyncmsgq_write( + i->sink->thread_info.rtpoll, + PA_RTPOLL_LATE, + u->asyncmsgq); + + pa_sink_attach_within_thread(u->sink); +} + + +/* Called from output thread context */ +static void source_output_detach_cb(pa_source_output *o) { + struct userdata *u; + + pa_source_output_assert_ref(o); + pa_source_output_assert_io_context(o); + pa_assert_se(u = o->userdata); + + pa_source_detach_within_thread(u->source); + pa_source_set_rtpoll(u->source, NULL); + + pa_log_debug("Source output %p detach", o); + + if (u->rtpoll_item_read) { + pa_rtpoll_item_free(u->rtpoll_item_read); + u->rtpoll_item_read = NULL; + } +} + +/* Called from I/O thread context */ +static void sink_input_detach_cb(pa_sink_input *i) { + struct userdata *u; + + pa_sink_input_assert_ref(i); + pa_assert_se(u = i->userdata); + + pa_sink_detach_within_thread(u->sink); + + pa_sink_set_rtpoll(u->sink, NULL); + + pa_log_debug("Sink input %p detach", i); + + if (u->rtpoll_item_write) { + pa_rtpoll_item_free(u->rtpoll_item_write); + u->rtpoll_item_write = NULL; + } +} + +/* Called from output thread context */ +static void source_output_state_change_cb(pa_source_output *o, pa_source_output_state_t state) { + struct userdata *u; + + pa_source_output_assert_ref(o); + pa_source_output_assert_io_context(o); + pa_assert_se(u = o->userdata); + + pa_log_debug("Source output %p state %d", o, state); +} + +/* Called from IO thread context */ +static void sink_input_state_change_cb(pa_sink_input *i, pa_sink_input_state_t state) { + struct userdata *u; + + pa_sink_input_assert_ref(i); + pa_assert_se(u = i->userdata); + + pa_log_debug("Sink input %p state %d", i, state); + + /* If we are added for the first time, ask for a rewinding so that + * we are heard right-away. */ + if (PA_SINK_INPUT_IS_LINKED(state) && + i->thread_info.state == PA_SINK_INPUT_INIT) { + pa_log_debug("Requesting rewind due to state change."); + pa_sink_input_request_rewind(i, 0, FALSE, TRUE, TRUE); + } +} + +/* Called from main thread */ +static void source_output_kill_cb(pa_source_output *o) { + struct userdata *u; + + pa_source_output_assert_ref(o); + pa_assert_ctl_context(); + pa_assert_se(u = o->userdata); + + /* The order here matters! We first kill the source output, followed + * by the source. That means the source callbacks must be protected + * against an unconnected source output! */ + pa_source_output_unlink(u->source_output); + pa_source_unlink(u->source); + + pa_source_output_unref(u->source_output); + u->source_output = NULL; + + pa_source_unref(u->source); + u->source = NULL; + + pa_log_debug("Source output kill %p", o); + + pa_module_unload_request(u->module, TRUE); +} + +/* Called from main context */ +static void sink_input_kill_cb(pa_sink_input *i) { + struct userdata *u; + + pa_sink_input_assert_ref(i); + pa_assert_se(u = i->userdata); + + /* The order here matters! We first kill the sink input, followed + * by the sink. That means the sink callbacks must be protected + * against an unconnected sink input! */ + pa_sink_input_unlink(u->sink_input); + pa_sink_unlink(u->sink); + + pa_sink_input_unref(u->sink_input); + u->sink_input = NULL; + + pa_sink_unref(u->sink); + u->sink = NULL; + + pa_log_debug("Sink input kill %p", i); + + pa_module_unload_request(u->module, TRUE); +} + +/* Called from main thread */ +static pa_bool_t source_output_may_move_to_cb(pa_source_output *o, pa_source *dest) { + struct userdata *u; + + pa_source_output_assert_ref(o); + pa_assert_ctl_context(); + pa_assert_se(u = o->userdata); + + return (u->source != dest) && (u->sink != dest->monitor_of); +} + +/* Called from main context */ +static pa_bool_t sink_input_may_move_to_cb(pa_sink_input *i, pa_sink *dest) { + struct userdata *u; + + pa_sink_input_assert_ref(i); + pa_assert_se(u = i->userdata); + + return u->sink != dest; +} + +/* Called from main thread */ +static void source_output_moving_cb(pa_source_output *o, pa_source *dest) { + struct userdata *u; + + pa_source_output_assert_ref(o); + pa_assert_ctl_context(); + pa_assert_se(u = o->userdata); + + if (dest) { + pa_source_set_asyncmsgq(u->source, dest->asyncmsgq); + pa_source_update_flags(u->source, PA_SOURCE_LATENCY|PA_SOURCE_DYNAMIC_LATENCY, dest->flags); + } else + pa_source_set_asyncmsgq(u->source, NULL); + + if (u->source_auto_desc && dest) { + const char *z; + pa_proplist *pl; + + pl = pa_proplist_new(); + z = pa_proplist_gets(dest->proplist, PA_PROP_DEVICE_DESCRIPTION); + pa_proplist_setf(pl, PA_PROP_DEVICE_DESCRIPTION, "Echo-Cancel Source %s on %s", + pa_proplist_gets(u->source->proplist, "device.echo-cancel.name"), z ? z : dest->name); + + pa_source_update_proplist(u->source, PA_UPDATE_REPLACE, pl); + pa_proplist_free(pl); + } +} + +/* Called from main context */ +static void sink_input_moving_cb(pa_sink_input *i, pa_sink *dest) { + struct userdata *u; + + pa_sink_input_assert_ref(i); + pa_assert_se(u = i->userdata); + + if (dest) { + pa_sink_set_asyncmsgq(u->sink, dest->asyncmsgq); + pa_sink_update_flags(u->sink, PA_SINK_LATENCY|PA_SINK_DYNAMIC_LATENCY, dest->flags); + } else + pa_sink_set_asyncmsgq(u->sink, NULL); + + if (u->sink_auto_desc && dest) { + const char *z; + pa_proplist *pl; + + pl = pa_proplist_new(); + z = pa_proplist_gets(dest->proplist, PA_PROP_DEVICE_DESCRIPTION); + pa_proplist_setf(pl, PA_PROP_DEVICE_DESCRIPTION, "Echo-Cancel Sink %s on %s", + pa_proplist_gets(u->sink->proplist, "device.echo-cancel.name"), z ? z : dest->name); + + pa_sink_update_proplist(u->sink, PA_UPDATE_REPLACE, pl); + pa_proplist_free(pl); + } +} + +/* Called from main context */ +static void sink_input_volume_changed_cb(pa_sink_input *i) { + struct userdata *u; + + pa_sink_input_assert_ref(i); + pa_assert_se(u = i->userdata); + + pa_sink_volume_changed(u->sink, &i->volume); +} + +/* Called from main context */ +static void sink_input_mute_changed_cb(pa_sink_input *i) { + struct userdata *u; + + pa_sink_input_assert_ref(i); + pa_assert_se(u = i->userdata); + + pa_sink_mute_changed(u->sink, i->muted); +} + +static pa_echo_canceller_method_t get_ec_method_from_string(const char *method) +{ + if (strcmp(method, "speex") == 0) + return PA_ECHO_CANCELLER_SPEEX; + else if (strcmp(method, "adrian") == 0) + return PA_ECHO_CANCELLER_ADRIAN; + else + return PA_ECHO_CANCELLER_INVALID; +} + +int pa__init(pa_module*m) { + struct userdata *u; + pa_sample_spec source_ss, sink_ss; + pa_channel_map source_map, sink_map; + pa_modargs *ma; + pa_source *source_master=NULL; + pa_sink *sink_master=NULL; + pa_source_output_new_data source_output_data; + pa_sink_input_new_data sink_input_data; + pa_source_new_data source_data; + pa_sink_new_data sink_data; + pa_memchunk silence; + pa_echo_canceller_method_t ec_method; + uint32_t adjust_time_sec; + + pa_assert(m); + + if (!(ma = pa_modargs_new(m->argument, valid_modargs))) { + pa_log("Failed to parse module arguments."); + goto fail; + } + + if (!(source_master = pa_namereg_get(m->core, pa_modargs_get_value(ma, "source_master", NULL), PA_NAMEREG_SOURCE))) { + pa_log("Master source not found"); + goto fail; + } + pa_assert(source_master); + + if (!(sink_master = pa_namereg_get(m->core, pa_modargs_get_value(ma, "sink_master", NULL), PA_NAMEREG_SINK))) { + pa_log("Master sink not found"); + goto fail; + } + pa_assert(sink_master); + + source_ss = source_master->sample_spec; + source_map = source_master->channel_map; + if (pa_modargs_get_sample_spec_and_channel_map(ma, &source_ss, &source_map, PA_CHANNEL_MAP_DEFAULT) < 0) { + pa_log("Invalid sample format specification or channel map"); + goto fail; + } + + sink_ss = sink_master->sample_spec; + sink_map = sink_master->channel_map; + + u = pa_xnew0(struct userdata, 1); + if (!u) { + pa_log("Failed to alloc userdata"); + goto fail; + } + u->core = m->core; + u->module = m; + m->userdata = u; + + u->ec = pa_xnew0(pa_echo_canceller, 1); + if (!u->ec) { + pa_log("Failed to alloc echo canceller"); + goto fail; + } + + if ((ec_method = get_ec_method_from_string(pa_modargs_get_value(ma, "aec_method", DEFAULT_ECHO_CANCELLER))) < 0) { + pa_log("Invalid echo canceller implementation"); + goto fail; + } + + u->ec->init = ec_table[ec_method].init; + u->ec->run = ec_table[ec_method].run; + u->ec->done = ec_table[ec_method].done; + + adjust_time_sec = DEFAULT_ADJUST_TIME_USEC / PA_USEC_PER_SEC; + if (pa_modargs_get_value_u32(ma, "adjust_time", &adjust_time_sec) < 0) { + pa_log("Failed to parse adjust_time value"); + goto fail; + } + + if (adjust_time_sec != DEFAULT_ADJUST_TIME_USEC / PA_USEC_PER_SEC) + u->adjust_time = adjust_time_sec * PA_USEC_PER_SEC; + else + u->adjust_time = DEFAULT_ADJUST_TIME_USEC; + + u->save_aec = DEFAULT_SAVE_AEC; + if (pa_modargs_get_value_u32(ma, "save_aec", &u->save_aec) < 0) { + pa_log("Failed to parse save_aec value"); + goto fail; + } + + u->asyncmsgq = pa_asyncmsgq_new(0); + u->need_realign = TRUE; + if (u->ec->init) { + if (!u->ec->init(u->core, u->ec, &source_ss, &source_map, &sink_ss, &sink_map, &u->blocksize, pa_modargs_get_value(ma, "aec_args", NULL))) { + pa_log("Failed to init AEC engine"); + goto fail; + } + } + + /* Create source */ + pa_source_new_data_init(&source_data); + source_data.driver = __FILE__; + source_data.module = m; + if (!(source_data.name = pa_xstrdup(pa_modargs_get_value(ma, "source_name", NULL)))) + source_data.name = pa_sprintf_malloc("%s.echo-cancel", source_master->name); + pa_source_new_data_set_sample_spec(&source_data, &source_ss); + pa_source_new_data_set_channel_map(&source_data, &source_map); + pa_proplist_sets(source_data.proplist, PA_PROP_DEVICE_MASTER_DEVICE, source_master->name); + pa_proplist_sets(source_data.proplist, PA_PROP_DEVICE_CLASS, "filter"); + pa_proplist_sets(source_data.proplist, PA_PROP_DEVICE_INTENDED_ROLES, "phone"); + pa_proplist_sets(source_data.proplist, "device.echo-cancel.name", source_data.name); + + if (pa_modargs_get_proplist(ma, "source_properties", source_data.proplist, PA_UPDATE_REPLACE) < 0) { + pa_log("Invalid properties"); + pa_source_new_data_done(&source_data); + goto fail; + } + + if ((u->source_auto_desc = !pa_proplist_contains(source_data.proplist, PA_PROP_DEVICE_DESCRIPTION))) { + const char *z; + + z = pa_proplist_gets(source_master->proplist, PA_PROP_DEVICE_DESCRIPTION); + pa_proplist_setf(source_data.proplist, PA_PROP_DEVICE_DESCRIPTION, "Echo-Cancel Source %s on %s", source_data.name, z ? z : source_master->name); + } + + u->source = pa_source_new(m->core, &source_data, + PA_SOURCE_HW_MUTE_CTRL|PA_SOURCE_HW_VOLUME_CTRL|PA_SOURCE_DECIBEL_VOLUME| + (source_master->flags & (PA_SOURCE_LATENCY|PA_SOURCE_DYNAMIC_LATENCY))); + pa_source_new_data_done(&source_data); + + if (!u->source) { + pa_log("Failed to create source."); + goto fail; + } + + u->source->parent.process_msg = source_process_msg_cb; + u->source->set_state = source_set_state_cb; + u->source->update_requested_latency = source_update_requested_latency_cb; + u->source->set_volume = source_set_volume_cb; + u->source->set_mute = source_set_mute_cb; + u->source->get_volume = source_get_volume_cb; + u->source->get_mute = source_get_mute_cb; + u->source->userdata = u; + + pa_source_set_asyncmsgq(u->source, source_master->asyncmsgq); + + /* Create sink */ + pa_sink_new_data_init(&sink_data); + sink_data.driver = __FILE__; + sink_data.module = m; + if (!(sink_data.name = pa_xstrdup(pa_modargs_get_value(ma, "sink_name", NULL)))) + sink_data.name = pa_sprintf_malloc("%s.echo-cancel", sink_master->name); + pa_sink_new_data_set_sample_spec(&sink_data, &sink_ss); + pa_sink_new_data_set_channel_map(&sink_data, &sink_map); + pa_proplist_sets(sink_data.proplist, PA_PROP_DEVICE_MASTER_DEVICE, sink_master->name); + pa_proplist_sets(sink_data.proplist, PA_PROP_DEVICE_CLASS, "filter"); + pa_proplist_sets(sink_data.proplist, PA_PROP_DEVICE_INTENDED_ROLES, "phone"); + pa_proplist_sets(sink_data.proplist, "device.echo-cancel.name", sink_data.name); + + if (pa_modargs_get_proplist(ma, "sink_properties", sink_data.proplist, PA_UPDATE_REPLACE) < 0) { + pa_log("Invalid properties"); + pa_sink_new_data_done(&sink_data); + goto fail; + } + + if ((u->sink_auto_desc = !pa_proplist_contains(sink_data.proplist, PA_PROP_DEVICE_DESCRIPTION))) { + const char *z; + + z = pa_proplist_gets(sink_master->proplist, PA_PROP_DEVICE_DESCRIPTION); + pa_proplist_setf(sink_data.proplist, PA_PROP_DEVICE_DESCRIPTION, "Echo-Cancel Sink %s on %s", sink_data.name, z ? z : sink_master->name); + } + + u->sink = pa_sink_new(m->core, &sink_data, + PA_SINK_HW_MUTE_CTRL|PA_SINK_HW_VOLUME_CTRL|PA_SINK_DECIBEL_VOLUME| + (sink_master->flags & (PA_SINK_LATENCY|PA_SINK_DYNAMIC_LATENCY))); + pa_sink_new_data_done(&sink_data); + + if (!u->sink) { + pa_log("Failed to create sink."); + goto fail; + } + + u->sink->parent.process_msg = sink_process_msg_cb; + u->sink->set_state = sink_set_state_cb; + u->sink->update_requested_latency = sink_update_requested_latency_cb; + u->sink->request_rewind = sink_request_rewind_cb; + u->sink->set_volume = sink_set_volume_cb; + u->sink->set_mute = sink_set_mute_cb; + u->sink->userdata = u; + + pa_sink_set_asyncmsgq(u->sink, sink_master->asyncmsgq); + + /* Create source output */ + pa_source_output_new_data_init(&source_output_data); + source_output_data.driver = __FILE__; + source_output_data.module = m; + source_output_data.source = source_master; + /* FIXME + source_output_data.flags = PA_SOURCE_OUTPUT_DONT_INHIBIT_AUTO_SUSPEND; */ + + pa_proplist_sets(source_output_data.proplist, PA_PROP_MEDIA_NAME, "Echo-Cancel Source Stream"); + pa_proplist_sets(source_output_data.proplist, PA_PROP_MEDIA_ROLE, "filter"); + pa_source_output_new_data_set_sample_spec(&source_output_data, &source_ss); + pa_source_output_new_data_set_channel_map(&source_output_data, &source_map); + + pa_source_output_new(&u->source_output, m->core, &source_output_data); + pa_source_output_new_data_done(&source_output_data); + + if (!u->source_output) + goto fail; + + u->source_output->parent.process_msg = source_output_process_msg_cb; + u->source_output->push = source_output_push_cb; + u->source_output->process_rewind = source_output_process_rewind_cb; + u->source_output->update_max_rewind = source_output_update_max_rewind_cb; + u->source_output->update_source_requested_latency = source_output_update_source_requested_latency_cb; + u->source_output->update_source_latency_range = source_output_update_source_latency_range_cb; + u->source_output->update_source_fixed_latency = source_output_update_source_fixed_latency_cb; + u->source_output->kill = source_output_kill_cb; + u->source_output->attach = source_output_attach_cb; + u->source_output->detach = source_output_detach_cb; + u->source_output->state_change = source_output_state_change_cb; + u->source_output->may_move_to = source_output_may_move_to_cb; + u->source_output->moving = source_output_moving_cb; + u->source_output->userdata = u; + + /* Create sink input */ + pa_sink_input_new_data_init(&sink_input_data); + sink_input_data.driver = __FILE__; + sink_input_data.module = m; + sink_input_data.sink = sink_master; + pa_proplist_sets(sink_input_data.proplist, PA_PROP_MEDIA_NAME, "Echo-Cancel Sink Stream"); + pa_proplist_sets(sink_input_data.proplist, PA_PROP_MEDIA_ROLE, "filter"); + pa_sink_input_new_data_set_sample_spec(&sink_input_data, &sink_ss); + pa_sink_input_new_data_set_channel_map(&sink_input_data, &sink_map); + sink_input_data.flags = PA_SINK_INPUT_VARIABLE_RATE; + + pa_sink_input_new(&u->sink_input, m->core, &sink_input_data); + pa_sink_input_new_data_done(&sink_input_data); + + if (!u->sink_input) + goto fail; + + u->sink_input->parent.process_msg = sink_input_process_msg_cb; + u->sink_input->pop = sink_input_pop_cb; + u->sink_input->process_rewind = sink_input_process_rewind_cb; + u->sink_input->update_max_rewind = sink_input_update_max_rewind_cb; + u->sink_input->update_max_request = sink_input_update_max_request_cb; + u->sink_input->update_sink_requested_latency = sink_input_update_sink_requested_latency_cb; + u->sink_input->update_sink_latency_range = sink_input_update_sink_latency_range_cb; + u->sink_input->update_sink_fixed_latency = sink_input_update_sink_fixed_latency_cb; + u->sink_input->kill = sink_input_kill_cb; + u->sink_input->attach = sink_input_attach_cb; + u->sink_input->detach = sink_input_detach_cb; + u->sink_input->state_change = sink_input_state_change_cb; + u->sink_input->may_move_to = sink_input_may_move_to_cb; + u->sink_input->moving = sink_input_moving_cb; + u->sink_input->volume_changed = sink_input_volume_changed_cb; + u->sink_input->mute_changed = sink_input_mute_changed_cb; + u->sink_input->userdata = u; + + pa_sink_input_get_silence(u->sink_input, &silence); + + u->source_memblockq = pa_memblockq_new(0, MEMBLOCKQ_MAXLENGTH, 0, + pa_frame_size(&source_ss), 1, 1, 0, &silence); + u->sink_memblockq = pa_memblockq_new(0, MEMBLOCKQ_MAXLENGTH, 0, + pa_frame_size(&sink_ss), 1, 1, 0, &silence); + + pa_memblock_unref(silence.memblock); + + if (!u->source_memblockq || !u->sink_memblockq) { + pa_log("Failed to create memblockq."); + goto fail; + } + + /* our source and sink are not suspended when we create them */ + u->active_mask = 3; + + if (u->adjust_time > 0) + u->time_event = pa_core_rttime_new(m->core, pa_rtclock_now() + u->adjust_time, time_callback, u); + + if (u->save_aec) { + pa_log("Creating AEC files in /tmp"); + u->captured_file = fopen("/tmp/aec_rec.sw", "wb"); + if (u->captured_file == NULL) + perror ("fopen failed"); + u->played_file = fopen("/tmp/aec_play.sw", "wb"); + if (u->played_file == NULL) + perror ("fopen failed"); + u->canceled_file = fopen("/tmp/aec_out.sw", "wb"); + if (u->canceled_file == NULL) + perror ("fopen failed"); + } + + pa_sink_put(u->sink); + pa_source_put(u->source); + + pa_sink_input_put(u->sink_input); + pa_source_output_put(u->source_output); + + pa_modargs_free(ma); + + return 0; + + fail: + if (ma) + pa_modargs_free(ma); + + pa__done(m); + + return -1; +} + +int pa__get_n_used(pa_module *m) { + struct userdata *u; + + pa_assert(m); + pa_assert_se(u = m->userdata); + + return pa_sink_linked_by(u->sink) + pa_source_linked_by(u->source); +} + +void pa__done(pa_module*m) { + struct userdata *u; + + pa_assert(m); + + if (!(u = m->userdata)) + return; + + /* See comments in source_output_kill_cb() above regarding + * destruction order! */ + + if (u->time_event) + u->core->mainloop->time_free(u->time_event); + + if (u->source_output) + pa_source_output_unlink(u->source_output); + if (u->sink_input) + pa_sink_input_unlink(u->sink_input); + + if (u->source) + pa_source_unlink(u->source); + if (u->sink) + pa_sink_unlink(u->sink); + + if (u->source_output) + pa_source_output_unref(u->source_output); + if (u->sink_input) + pa_sink_input_unref(u->sink_input); + + if (u->source) + pa_source_unref(u->source); + if (u->sink) + pa_sink_unref(u->sink); + + if (u->source_memblockq) + pa_memblockq_free(u->source_memblockq); + if (u->sink_memblockq) + pa_memblockq_free(u->sink_memblockq); + + if (u->ec) { + if (u->ec->done) + u->ec->done(u->ec); + + pa_xfree(u->ec); + } + + if (u->asyncmsgq) + pa_asyncmsgq_unref(u->asyncmsgq); + + pa_xfree(u); +} diff --git a/src/modules/echo-cancel/speex.c b/src/modules/echo-cancel/speex.c new file mode 100644 index 0000000..7851510 --- /dev/null +++ b/src/modules/echo-cancel/speex.c @@ -0,0 +1,116 @@ +/*** + This file is part of PulseAudio. + + Copyright 2010 Wim Taymans + + Contributor: Arun Raghavan + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include "echo-cancel.h" + +/* should be between 10-20 ms */ +#define DEFAULT_FRAME_SIZE_MS 20 +/* should be between 100-500 ms */ +#define DEFAULT_FILTER_SIZE_MS 200 + +static const char* const valid_modargs[] = { + "frame_size_ms", + "filter_size_ms", + NULL +}; + +static void pa_speex_ec_fixate_spec(pa_sample_spec *source_ss, pa_channel_map *source_map, + pa_sample_spec *sink_ss, pa_channel_map *sink_map) +{ + source_ss->format = PA_SAMPLE_S16NE; + + *sink_ss = *source_ss; + *sink_map = *source_map; +} + +pa_bool_t pa_speex_ec_init(pa_core *c, pa_echo_canceller *ec, + pa_sample_spec *source_ss, pa_channel_map *source_map, + pa_sample_spec *sink_ss, pa_channel_map *sink_map, + uint32_t *blocksize, const char *args) +{ + int framelen, y, rate; + uint32_t frame_size_ms, filter_size_ms; + pa_modargs *ma; + + if (!(ma = pa_modargs_new(args, valid_modargs))) { + pa_log("Failed to parse submodule arguments."); + goto fail; + } + + filter_size_ms = DEFAULT_FILTER_SIZE_MS; + if (pa_modargs_get_value_u32(ma, "filter_size_ms", &filter_size_ms) < 0 || filter_size_ms < 1 || filter_size_ms > 2000) { + pa_log("Invalid filter_size_ms specification"); + goto fail; + } + + frame_size_ms = DEFAULT_FRAME_SIZE_MS; + if (pa_modargs_get_value_u32(ma, "frame_size_ms", &frame_size_ms) < 0 || frame_size_ms < 1 || frame_size_ms > 200) { + pa_log("Invalid frame_size_ms specification"); + goto fail; + } + + pa_speex_ec_fixate_spec(source_ss, source_map, sink_ss, sink_map); + + rate = source_ss->rate; + framelen = (rate * frame_size_ms) / 1000; + /* framelen should be a power of 2, round down to nearest power of two */ + y = 1 << ((8 * sizeof (int)) - 2); + while (y > framelen) + y >>= 1; + framelen = y; + + *blocksize = framelen * pa_frame_size (source_ss); + + pa_log_debug ("Using framelen %d, blocksize %u, channels %d, rate %d", framelen, *blocksize, source_ss->channels, source_ss->rate); + + ec->params.priv.speex.state = speex_echo_state_init_mc (framelen, (rate * filter_size_ms) / 1000, source_ss->channels, source_ss->channels); + + if (!ec->params.priv.speex.state) + goto fail; + + speex_echo_ctl(ec->params.priv.speex.state, SPEEX_ECHO_SET_SAMPLING_RATE, &rate); + + pa_modargs_free(ma); + return TRUE; + +fail: + if (ma) + pa_modargs_free(ma); + return FALSE; +} + +void pa_speex_ec_run(pa_echo_canceller *ec, const uint8_t *rec, const uint8_t *play, uint8_t *out) +{ + speex_echo_cancellation(ec->params.priv.speex.state, (const spx_int16_t *) rec, (const spx_int16_t *) play, (spx_int16_t *) out); +} + +void pa_speex_ec_done(pa_echo_canceller *ec) +{ + speex_echo_state_destroy (ec->params.priv.speex.state); + ec->params.priv.speex.state = NULL; +} diff --git a/src/modules/gconf/gconf-helper.c b/src/modules/gconf/gconf-helper.c new file mode 100644 index 0000000..fbd8cfd --- /dev/null +++ b/src/modules/gconf/gconf-helper.c @@ -0,0 +1,133 @@ +/*** + This file is part of PulseAudio. + + Copyright 2006 Lennart Poettering + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include + +#include +#include + +#include + +#define PA_GCONF_ROOT "/system/pulseaudio" +#define PA_GCONF_PATH_MODULES PA_GCONF_ROOT"/modules" + +static void handle_module(GConfClient *client, const char *name) { + gchar p[1024]; + gboolean enabled, locked; + int i; + + pa_snprintf(p, sizeof(p), PA_GCONF_PATH_MODULES"/%s/locked", name); + locked = gconf_client_get_bool(client, p, FALSE); + + if (locked) + return; + + pa_snprintf(p, sizeof(p), PA_GCONF_PATH_MODULES"/%s/enabled", name); + enabled = gconf_client_get_bool(client, p, FALSE); + + printf("%c%s%c", enabled ? '+' : '-', name, 0); + + if (enabled) { + + for (i = 0; i < 10; i++) { + gchar *n, *a; + + pa_snprintf(p, sizeof(p), PA_GCONF_PATH_MODULES"/%s/name%i", name, i); + if (!(n = gconf_client_get_string(client, p, NULL)) || !*n) + break; + + pa_snprintf(p, sizeof(p), PA_GCONF_PATH_MODULES"/%s/args%i", name, i); + a = gconf_client_get_string(client, p, NULL); + + printf("%s%c%s%c", n, 0, a ? a : "", 0); + + g_free(n); + g_free(a); + } + + printf("%c", 0); + } + + fflush(stdout); +} + +static void modules_callback( + GConfClient* client, + guint cnxn_id, + GConfEntry *entry, + gpointer user_data) { + + const char *n; + char buf[128]; + + g_assert(strncmp(entry->key, PA_GCONF_PATH_MODULES"/", sizeof(PA_GCONF_PATH_MODULES)) == 0); + + n = entry->key + sizeof(PA_GCONF_PATH_MODULES); + + g_strlcpy(buf, n, sizeof(buf)); + buf[strcspn(buf, "/")] = 0; + + handle_module(client, buf); +} + +int main(int argc, char *argv[]) { + GMainLoop *g; + GConfClient *client; + GSList *modules, *m; + + g_type_init(); + + if (!(client = gconf_client_get_default())) + goto fail; + + gconf_client_add_dir(client, PA_GCONF_ROOT, GCONF_CLIENT_PRELOAD_RECURSIVE, NULL); + gconf_client_notify_add(client, PA_GCONF_PATH_MODULES, modules_callback, NULL, NULL, NULL); + + modules = gconf_client_all_dirs(client, PA_GCONF_PATH_MODULES, NULL); + + for (m = modules; m; m = m->next) { + char *e = strrchr(m->data, '/'); + handle_module(client, e ? e+1 : m->data); + } + + g_slist_free(modules); + + /* Signal the parent that we are now initialized */ + printf("!"); + fflush(stdout); + + g = g_main_loop_new(NULL, FALSE); + g_main_loop_run(g); + g_main_loop_unref(g); + + g_object_unref(G_OBJECT(client)); + + return 0; + +fail: + return 1; +} diff --git a/src/modules/gconf/module-gconf-symdef.h b/src/modules/gconf/module-gconf-symdef.h new file mode 100644 index 0000000..90d5c3a --- /dev/null +++ b/src/modules/gconf/module-gconf-symdef.h @@ -0,0 +1,29 @@ +#ifndef foomodulegconfsymdeffoo +#define foomodulegconfsymdeffoo + +#include +#include +#include + +#define pa__init module_gconf_LTX_pa__init +#define pa__done module_gconf_LTX_pa__done +#define pa__get_author module_gconf_LTX_pa__get_author +#define pa__get_description module_gconf_LTX_pa__get_description +#define pa__get_usage module_gconf_LTX_pa__get_usage +#define pa__get_version module_gconf_LTX_pa__get_version +#define pa__get_deprecated module_gconf_LTX_pa__get_deprecated +#define pa__load_once module_gconf_LTX_pa__load_once +#define pa__get_n_used module_gconf_LTX_pa__get_n_used + +int pa__init(pa_module*m); +void pa__done(pa_module*m); +int pa__get_n_used(pa_module*m); + +const char* pa__get_author(void); +const char* pa__get_description(void); +const char* pa__get_usage(void); +const char* pa__get_version(void); +const char* pa__get_deprecated(void); +pa_bool_t pa__load_once(void); + +#endif diff --git a/src/modules/gconf/module-gconf.c b/src/modules/gconf/module-gconf.c new file mode 100644 index 0000000..5f31d68 --- /dev/null +++ b/src/modules/gconf/module-gconf.c @@ -0,0 +1,404 @@ +/*** + This file is part of PulseAudio. + + Copyright 2006 Lennart Poettering + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "module-gconf-symdef.h" + +PA_MODULE_AUTHOR("Lennart Poettering"); +PA_MODULE_DESCRIPTION("GConf Adapter"); +PA_MODULE_VERSION(PACKAGE_VERSION); +PA_MODULE_LOAD_ONCE(TRUE); + +#define MAX_MODULES 10 +#define BUF_MAX 2048 + +struct module_item { + char *name; + char *args; + uint32_t index; +}; + +struct module_info { + char *name; + + struct module_item items[MAX_MODULES]; + unsigned n_items; +}; + +struct userdata { + pa_core *core; + pa_module *module; + + pa_hashmap *module_infos; + + pid_t pid; + + int fd; + int fd_type; + pa_io_event *io_event; + + char buf[BUF_MAX]; + size_t buf_fill; +}; + +static int fill_buf(struct userdata *u) { + ssize_t r; + pa_assert(u); + + if (u->buf_fill >= BUF_MAX) { + pa_log("read buffer overflow"); + return -1; + } + + if ((r = pa_read(u->fd, u->buf + u->buf_fill, BUF_MAX - u->buf_fill, &u->fd_type)) <= 0) + return -1; + + u->buf_fill += (size_t) r; + return 0; +} + +static int read_byte(struct userdata *u) { + int ret; + pa_assert(u); + + if (u->buf_fill < 1) + if (fill_buf(u) < 0) + return -1; + + ret = u->buf[0]; + pa_assert(u->buf_fill > 0); + u->buf_fill--; + memmove(u->buf, u->buf+1, u->buf_fill); + return ret; +} + +static char *read_string(struct userdata *u) { + pa_assert(u); + + for (;;) { + char *e; + + if ((e = memchr(u->buf, 0, u->buf_fill))) { + char *ret = pa_xstrdup(u->buf); + u->buf_fill -= (size_t) (e - u->buf +1); + memmove(u->buf, e+1, u->buf_fill); + return ret; + } + + if (fill_buf(u) < 0) + return NULL; + } +} + +static void unload_one_module(struct userdata *u, struct module_info*m, unsigned i) { + pa_assert(u); + pa_assert(m); + pa_assert(i < m->n_items); + + if (m->items[i].index == PA_INVALID_INDEX) + return; + + pa_log_debug("Unloading module #%i", m->items[i].index); + pa_module_unload_by_index(u->core, m->items[i].index, TRUE); + m->items[i].index = PA_INVALID_INDEX; + pa_xfree(m->items[i].name); + pa_xfree(m->items[i].args); + m->items[i].name = m->items[i].args = NULL; +} + +static void unload_all_modules(struct userdata *u, struct module_info*m) { + unsigned i; + + pa_assert(u); + pa_assert(m); + + for (i = 0; i < m->n_items; i++) + unload_one_module(u, m, i); + + m->n_items = 0; +} + +static void load_module( + struct userdata *u, + struct module_info *m, + unsigned i, + const char *name, + const char *args, + pa_bool_t is_new) { + + pa_module *mod; + + pa_assert(u); + pa_assert(m); + pa_assert(name); + pa_assert(args); + + if (!is_new) { + if (m->items[i].index != PA_INVALID_INDEX && + strcmp(m->items[i].name, name) == 0 && + strcmp(m->items[i].args, args) == 0) + return; + + unload_one_module(u, m, i); + } + + pa_log_debug("Loading module '%s' with args '%s' due to GConf configuration.", name, args); + + m->items[i].name = pa_xstrdup(name); + m->items[i].args = pa_xstrdup(args); + m->items[i].index = PA_INVALID_INDEX; + + if (!(mod = pa_module_load(u->core, name, args))) { + pa_log("pa_module_load() failed"); + return; + } + + m->items[i].index = mod->index; +} + +static void module_info_free(void *p, void *userdata) { + struct module_info *m = p; + struct userdata *u = userdata; + + pa_assert(m); + pa_assert(u); + + unload_all_modules(u, m); + pa_xfree(m->name); + pa_xfree(m); +} + +static int handle_event(struct userdata *u) { + int opcode; + int ret = 0; + + do { + if ((opcode = read_byte(u)) < 0){ + if (errno == EINTR || errno == EAGAIN) + break; + goto fail; + } + + switch (opcode) { + case '!': + /* The helper tool is now initialized */ + ret = 1; + break; + + case '+': { + char *name; + struct module_info *m; + unsigned i, j; + + if (!(name = read_string(u))) + goto fail; + + if (!(m = pa_hashmap_get(u->module_infos, name))) { + m = pa_xnew(struct module_info, 1); + m->name = name; + m->n_items = 0; + pa_hashmap_put(u->module_infos, m->name, m); + } else + pa_xfree(name); + + i = 0; + while (i < MAX_MODULES) { + char *module, *args; + + if (!(module = read_string(u))) { + if (i > m->n_items) m->n_items = i; + goto fail; + } + + if (!*module) { + pa_xfree(module); + break; + } + + if (!(args = read_string(u))) { + pa_xfree(module); + + if (i > m->n_items) m->n_items = i; + goto fail; + } + + load_module(u, m, i, module, args, i >= m->n_items); + + i++; + + pa_xfree(module); + pa_xfree(args); + } + + /* Unload all removed modules */ + for (j = i; j < m->n_items; j++) + unload_one_module(u, m, j); + + m->n_items = i; + + break; + } + + case '-': { + char *name; + struct module_info *m; + + if (!(name = read_string(u))) + goto fail; + + if ((m = pa_hashmap_get(u->module_infos, name))) { + pa_hashmap_remove(u->module_infos, name); + module_info_free(m, u); + } + + pa_xfree(name); + + break; + } + } + } while (u->buf_fill > 0 && ret == 0); + + return ret; + +fail: + pa_log("Unable to read or parse data from client."); + return -1; +} + +static void io_event_cb( + pa_mainloop_api*a, + pa_io_event* e, + int fd, + pa_io_event_flags_t events, + void *userdata) { + + struct userdata *u = userdata; + + if (handle_event(u) < 0) { + + if (u->io_event) { + u->core->mainloop->io_free(u->io_event); + u->io_event = NULL; + } + + pa_module_unload_request(u->module, TRUE); + } +} + +int pa__init(pa_module*m) { + struct userdata *u; + int r; + + u = pa_xnew(struct userdata, 1); + u->core = m->core; + u->module = m; + m->userdata = u; + u->module_infos = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func); + u->pid = (pid_t) -1; + u->fd = -1; + u->fd_type = 0; + u->io_event = NULL; + u->buf_fill = 0; + + if ((u->fd = pa_start_child_for_read( +#if defined(__linux__) && !defined(__OPTIMIZE__) + pa_run_from_build_tree() ? PA_BUILDDIR "/gconf-helper" : +#endif + PA_GCONF_HELPER, NULL, &u->pid)) < 0) + goto fail; + + u->io_event = m->core->mainloop->io_new( + m->core->mainloop, + u->fd, + PA_IO_EVENT_INPUT, + io_event_cb, + u); + + do { + if ((r = handle_event(u)) < 0) + goto fail; + + /* Read until the client signalled us that it is ready with + * initialization */ + } while (r != 1); + + return 0; + +fail: + pa__done(m); + return -1; +} + +void pa__done(pa_module*m) { + struct userdata *u; + + pa_assert(m); + + if (!(u = m->userdata)) + return; + + if (u->pid != (pid_t) -1) { + kill(u->pid, SIGTERM); + + for (;;) { + if (waitpid(u->pid, NULL, 0) >= 0) + break; + + if (errno != EINTR) { + pa_log("waitpid() failed: %s", pa_cstrerror(errno)); + break; + } + } + } + + if (u->io_event) + m->core->mainloop->io_free(u->io_event); + + if (u->fd >= 0) + pa_close(u->fd); + + if (u->module_infos) + pa_hashmap_free(u->module_infos, module_info_free, u); + + pa_xfree(u); +} diff --git a/src/modules/hal-util.c b/src/modules/hal-util.c new file mode 100644 index 0000000..2d59f51 --- /dev/null +++ b/src/modules/hal-util.c @@ -0,0 +1,130 @@ +/*** + This file is part of PulseAudio. + + Copyright 2009 Lennart Poettering + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation; either version 2.1 of the + License, or (at your option) any later version. + + PulseAudio 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 Lesser General Public + License along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include + +#include + +#include "hal-util.h" + +int pa_hal_get_info(pa_core *core, pa_proplist *p, int card) { + pa_dbus_connection *c = NULL; + LibHalContext *hal = NULL; + DBusError error; + int r = -1; + char **udis = NULL, *t; + int n, i; + + pa_assert(core); + pa_assert(p); + pa_assert(card >= 0); + + dbus_error_init(&error); + + if (!(c = pa_dbus_bus_get(core, DBUS_BUS_SYSTEM, &error)) || dbus_error_is_set(&error)) { + pa_log_error("Unable to contact DBUS system bus: %s: %s", error.name, error.message); + goto finish; + } + + + if (!(hal = libhal_ctx_new())) { + pa_log_error("libhal_ctx_new() finished"); + goto finish; + } + + if (!libhal_ctx_set_dbus_connection(hal, pa_dbus_connection_get(c))) { + pa_log_error("Error establishing DBUS connection: %s: %s", error.name, error.message); + goto finish; + } + + if (!libhal_ctx_init(hal, &error)) { + pa_log_error("Couldn't connect to hald: %s: %s", error.name, error.message); + goto finish; + } + + if (!(udis = libhal_find_device_by_capability(hal, "sound", &n, &error))) { + pa_log_error("Couldn't find devices: %s: %s", error.name, error.message); + goto finish; + } + + for (i = 0; i < n; i++) { + dbus_int32_t this_card; + + this_card = libhal_device_get_property_int(hal, udis[i], "sound.card", &error); + if (dbus_error_is_set(&error)) { + dbus_error_free(&error); + continue; + } + + if (this_card == card) + break; + + } + + if (i >= n) + goto finish; + + pa_proplist_sets(p, "hal.udi", udis[i]); + + /* The data HAL stores in info.product is not actually a product + * string but simply the ALSA card name. We will hence not write + * it to PA_PROP_DEVICE_PRODUCT_NAME */ + t = libhal_device_get_property_string(hal, udis[i], "info.product", &error); + if (dbus_error_is_set(&error)) + dbus_error_free(&error); + if (t) { + pa_proplist_sets(p, "hal.product", t); + libhal_free_string(t); + } + + t = libhal_device_get_property_string(hal, udis[i], "sound.card_id", &error); + if (dbus_error_is_set(&error)) + dbus_error_free(&error); + if (t) { + pa_proplist_sets(p, "hal.card_id", t); + libhal_free_string(t); + } + + r = 0; + +finish: + + if (udis) + libhal_free_string_array(udis); + + dbus_error_free(&error); + + if (hal) { + libhal_ctx_shutdown(hal, &error); + libhal_ctx_free(hal); + dbus_error_free(&error); + } + + if (c) + pa_dbus_connection_unref(c); + + return r; +} diff --git a/src/modules/hal-util.h b/src/modules/hal-util.h new file mode 100644 index 0000000..19e41d7 --- /dev/null +++ b/src/modules/hal-util.h @@ -0,0 +1,30 @@ +#ifndef foohalutilhfoo +#define foohalutilhfoo + +/*** + This file is part of PulseAudio. + + Copyright 2009 Lennart Poettering + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation; either version 2.1 of the + License, or (at your option) any later version. + + PulseAudio 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 Lesser General Public + License along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + + +#include + +int pa_hal_get_info(pa_core *core, pa_proplist *p, int card); + +#endif diff --git a/src/modules/jack/module-jack-sink-symdef.h b/src/modules/jack/module-jack-sink-symdef.h new file mode 100644 index 0000000..857d3f0 --- /dev/null +++ b/src/modules/jack/module-jack-sink-symdef.h @@ -0,0 +1,29 @@ +#ifndef foomodulejacksinksymdeffoo +#define foomodulejacksinksymdeffoo + +#include +#include +#include + +#define pa__init module_jack_sink_LTX_pa__init +#define pa__done module_jack_sink_LTX_pa__done +#define pa__get_author module_jack_sink_LTX_pa__get_author +#define pa__get_description module_jack_sink_LTX_pa__get_description +#define pa__get_usage module_jack_sink_LTX_pa__get_usage +#define pa__get_version module_jack_sink_LTX_pa__get_version +#define pa__get_deprecated module_jack_sink_LTX_pa__get_deprecated +#define pa__load_once module_jack_sink_LTX_pa__load_once +#define pa__get_n_used module_jack_sink_LTX_pa__get_n_used + +int pa__init(pa_module*m); +void pa__done(pa_module*m); +int pa__get_n_used(pa_module*m); + +const char* pa__get_author(void); +const char* pa__get_description(void); +const char* pa__get_usage(void); +const char* pa__get_version(void); +const char* pa__get_deprecated(void); +pa_bool_t pa__load_once(void); + +#endif diff --git a/src/modules/jack/module-jack-sink.c b/src/modules/jack/module-jack-sink.c new file mode 100644 index 0000000..9f3e071 --- /dev/null +++ b/src/modules/jack/module-jack-sink.c @@ -0,0 +1,504 @@ +/*** + This file is part of PulseAudio. + + Copyright 2006 Lennart Poettering + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "module-jack-sink-symdef.h" + +/* General overview: + * + * Because JACK has a very unflexible event loop management which + * doesn't allow us to add our own event sources to the event thread + * we cannot use the JACK real-time thread for dispatching our PA + * work. Instead, we run an additional RT thread which does most of + * the PA handling, and have the JACK RT thread request data from it + * via pa_asyncmsgq. The cost is an additional context switch which + * should hopefully not be that expensive if RT scheduling is + * enabled. A better fix would only be possible with additional event + * source support in JACK. + */ + +PA_MODULE_AUTHOR("Lennart Poettering"); +PA_MODULE_DESCRIPTION("JACK Sink"); +PA_MODULE_LOAD_ONCE(TRUE); +PA_MODULE_VERSION(PACKAGE_VERSION); +PA_MODULE_USAGE( + "sink_name= " + "sink_properties= " + "server_name= " + "client_name= " + "channels= " + "channel_map= " + "connect="); + +#define DEFAULT_SINK_NAME "jack_out" + +struct userdata { + pa_core *core; + pa_module *module; + pa_sink *sink; + + unsigned channels; + + jack_port_t* port[PA_CHANNELS_MAX]; + jack_client_t *client; + + void *buffer[PA_CHANNELS_MAX]; + + pa_thread_mq thread_mq; + pa_asyncmsgq *jack_msgq; + pa_rtpoll *rtpoll; + pa_rtpoll_item *rtpoll_item; + + pa_thread *thread; + + jack_nframes_t frames_in_buffer; + jack_nframes_t saved_frame_time; + pa_bool_t saved_frame_time_valid; +}; + +static const char* const valid_modargs[] = { + "sink_name", + "sink_properties", + "server_name", + "client_name", + "channels", + "channel_map", + "connect", + NULL +}; + +enum { + SINK_MESSAGE_RENDER = PA_SINK_MESSAGE_MAX, + SINK_MESSAGE_BUFFER_SIZE, + SINK_MESSAGE_ON_SHUTDOWN +}; + +static int sink_process_msg(pa_msgobject *o, int code, void *data, int64_t offset, pa_memchunk *memchunk) { + struct userdata *u = PA_SINK(o)->userdata; + + switch (code) { + + case SINK_MESSAGE_RENDER: + + /* Handle the request from the JACK thread */ + + if (u->sink->thread_info.state == PA_SINK_RUNNING) { + pa_memchunk chunk; + size_t nbytes; + void *p; + + pa_assert(offset > 0); + nbytes = (size_t) offset * pa_frame_size(&u->sink->sample_spec); + + pa_sink_render_full(u->sink, nbytes, &chunk); + + p = (uint8_t*) pa_memblock_acquire(chunk.memblock) + chunk.index; + pa_deinterleave(p, u->buffer, u->channels, sizeof(float), (unsigned) offset); + pa_memblock_release(chunk.memblock); + + pa_memblock_unref(chunk.memblock); + } else { + unsigned c; + pa_sample_spec ss; + + /* Humm, we're not RUNNING, hence let's write some silence */ + + ss = u->sink->sample_spec; + ss.channels = 1; + + for (c = 0; c < u->channels; c++) + pa_silence_memory(u->buffer[c], (size_t) offset * pa_sample_size(&ss), &ss); + } + + u->frames_in_buffer = (jack_nframes_t) offset; + u->saved_frame_time = * (jack_nframes_t*) data; + u->saved_frame_time_valid = TRUE; + + return 0; + + case SINK_MESSAGE_BUFFER_SIZE: + pa_sink_set_max_request_within_thread(u->sink, (size_t) offset * pa_frame_size(&u->sink->sample_spec)); + return 0; + + case SINK_MESSAGE_ON_SHUTDOWN: + pa_asyncmsgq_post(u->thread_mq.outq, PA_MSGOBJECT(u->core), PA_CORE_MESSAGE_UNLOAD_MODULE, u->module, 0, NULL, NULL); + return 0; + + case PA_SINK_MESSAGE_GET_LATENCY: { + jack_nframes_t l, ft, d; + size_t n; + + /* This is the "worst-case" latency */ + l = jack_port_get_total_latency(u->client, u->port[0]) + u->frames_in_buffer; + + if (u->saved_frame_time_valid) { + /* Adjust the worst case latency by the time that + * passed since we last handed data to JACK */ + + ft = jack_frame_time(u->client); + d = ft > u->saved_frame_time ? ft - u->saved_frame_time : 0; + l = l > d ? l - d : 0; + } + + /* Convert it to usec */ + n = l * pa_frame_size(&u->sink->sample_spec); + *((pa_usec_t*) data) = pa_bytes_to_usec(n, &u->sink->sample_spec); + + return 0; + } + + } + + return pa_sink_process_msg(o, code, data, offset, memchunk); +} + +static int jack_process(jack_nframes_t nframes, void *arg) { + struct userdata *u = arg; + unsigned c; + jack_nframes_t frame_time; + pa_assert(u); + + /* We just forward the request to our other RT thread */ + + for (c = 0; c < u->channels; c++) + pa_assert_se(u->buffer[c] = jack_port_get_buffer(u->port[c], nframes)); + + frame_time = jack_frame_time(u->client); + + pa_assert_se(pa_asyncmsgq_send(u->jack_msgq, PA_MSGOBJECT(u->sink), SINK_MESSAGE_RENDER, &frame_time, nframes, NULL) == 0); + return 0; +} + +static void thread_func(void *userdata) { + struct userdata *u = userdata; + + pa_assert(u); + + pa_log_debug("Thread starting up"); + + if (u->core->realtime_scheduling) + pa_make_realtime(u->core->realtime_priority); + + pa_thread_mq_install(&u->thread_mq); + + for (;;) { + int ret; + + if (PA_SINK_IS_OPENED(u->sink->thread_info.state)) + if (u->sink->thread_info.rewind_requested) + pa_sink_process_rewind(u->sink, 0); + + if ((ret = pa_rtpoll_run(u->rtpoll, TRUE)) < 0) + goto fail; + + if (ret == 0) + goto finish; + } + +fail: + /* If this was no regular exit from the loop we have to continue + * processing messages until we received PA_MESSAGE_SHUTDOWN */ + pa_asyncmsgq_post(u->thread_mq.outq, PA_MSGOBJECT(u->core), PA_CORE_MESSAGE_UNLOAD_MODULE, u->module, 0, NULL, NULL); + pa_asyncmsgq_wait_for(u->thread_mq.inq, PA_MESSAGE_SHUTDOWN); + +finish: + pa_log_debug("Thread shutting down"); +} + +static void jack_error_func(const char*t) { + char *s; + + s = pa_xstrndup(t, strcspn(t, "\n\r")); + pa_log_warn("JACK error >%s<", s); + pa_xfree(s); +} + +static void jack_init(void *arg) { + struct userdata *u = arg; + + pa_log_info("JACK thread starting up."); + + if (u->core->realtime_scheduling) + pa_make_realtime(u->core->realtime_priority+4); +} + +static void jack_shutdown(void* arg) { + struct userdata *u = arg; + + pa_log_info("JACK thread shutting down."); + pa_asyncmsgq_post(u->jack_msgq, PA_MSGOBJECT(u->sink), SINK_MESSAGE_ON_SHUTDOWN, NULL, 0, NULL, NULL); +} + +static int jack_buffer_size(jack_nframes_t nframes, void *arg) { + struct userdata *u = arg; + + pa_log_info("JACK buffer size changed."); + pa_asyncmsgq_post(u->jack_msgq, PA_MSGOBJECT(u->sink), SINK_MESSAGE_BUFFER_SIZE, NULL, nframes, NULL, NULL); + return 0; +} + +int pa__init(pa_module*m) { + struct userdata *u = NULL; + pa_sample_spec ss; + pa_channel_map map; + pa_modargs *ma = NULL; + jack_status_t status; + const char *server_name, *client_name; + uint32_t channels = 0; + pa_bool_t do_connect = TRUE; + unsigned i; + const char **ports = NULL, **p; + pa_sink_new_data data; + + pa_assert(m); + + jack_set_error_function(jack_error_func); + + if (!(ma = pa_modargs_new(m->argument, valid_modargs))) { + pa_log("Failed to parse module arguments."); + goto fail; + } + + if (pa_modargs_get_value_boolean(ma, "connect", &do_connect) < 0) { + pa_log("Failed to parse connect= argument."); + goto fail; + } + + server_name = pa_modargs_get_value(ma, "server_name", NULL); + client_name = pa_modargs_get_value(ma, "client_name", "PulseAudio JACK Sink"); + + m->userdata = u = pa_xnew0(struct userdata, 1); + u->core = m->core; + u->module = m; + u->saved_frame_time_valid = FALSE; + u->rtpoll = pa_rtpoll_new(); + pa_thread_mq_init(&u->thread_mq, m->core->mainloop, u->rtpoll); + + /* The queue linking the JACK thread and our RT thread */ + u->jack_msgq = pa_asyncmsgq_new(0); + + /* The msgq from the JACK RT thread should have an even higher + * priority than the normal message queues, to match the guarantee + * all other drivers make: supplying the audio device with data is + * the top priority -- and as long as that is possible we don't do + * anything else */ + u->rtpoll_item = pa_rtpoll_item_new_asyncmsgq_read(u->rtpoll, PA_RTPOLL_EARLY-1, u->jack_msgq); + + if (!(u->client = jack_client_open(client_name, server_name ? JackServerName : JackNullOption, &status, server_name))) { + pa_log("jack_client_open() failed."); + goto fail; + } + + ports = jack_get_ports(u->client, NULL, JACK_DEFAULT_AUDIO_TYPE, JackPortIsPhysical|JackPortIsInput); + + channels = 0; + for (p = ports; *p; p++) + channels++; + + if (!channels) + channels = m->core->default_sample_spec.channels; + + if (pa_modargs_get_value_u32(ma, "channels", &channels) < 0 || + channels <= 0 || + channels > PA_CHANNELS_MAX) { + pa_log("Failed to parse channels= argument."); + goto fail; + } + + if (channels == m->core->default_channel_map.channels) + map = m->core->default_channel_map; + else + pa_channel_map_init_extend(&map, channels, PA_CHANNEL_MAP_ALSA); + + if (pa_modargs_get_channel_map(ma, NULL, &map) < 0 || map.channels != channels) { + pa_log("Failed to parse channel_map= argument."); + goto fail; + } + + pa_log_info("Successfully connected as '%s'", jack_get_client_name(u->client)); + + u->channels = ss.channels = (uint8_t) channels; + ss.rate = jack_get_sample_rate(u->client); + ss.format = PA_SAMPLE_FLOAT32NE; + + pa_assert(pa_sample_spec_valid(&ss)); + + for (i = 0; i < ss.channels; i++) { + if (!(u->port[i] = jack_port_register(u->client, pa_channel_position_to_string(map.map[i]), JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput|JackPortIsTerminal, 0))) { + pa_log("jack_port_register() failed."); + goto fail; + } + } + + pa_sink_new_data_init(&data); + data.driver = __FILE__; + data.module = m; + pa_sink_new_data_set_name(&data, pa_modargs_get_value(ma, "sink_name", DEFAULT_SINK_NAME)); + pa_sink_new_data_set_sample_spec(&data, &ss); + pa_sink_new_data_set_channel_map(&data, &map); + pa_proplist_sets(data.proplist, PA_PROP_DEVICE_API, "jack"); + if (server_name) + pa_proplist_sets(data.proplist, PA_PROP_DEVICE_STRING, server_name); + pa_proplist_setf(data.proplist, PA_PROP_DEVICE_DESCRIPTION, "Jack sink (%s)", jack_get_client_name(u->client)); + pa_proplist_sets(data.proplist, "jack.client_name", jack_get_client_name(u->client)); + + if (pa_modargs_get_proplist(ma, "sink_properties", data.proplist, PA_UPDATE_REPLACE) < 0) { + pa_log("Invalid properties"); + pa_sink_new_data_done(&data); + goto fail; + } + + u->sink = pa_sink_new(m->core, &data, PA_SINK_LATENCY); + pa_sink_new_data_done(&data); + + if (!u->sink) { + pa_log("Failed to create sink."); + goto fail; + } + + u->sink->parent.process_msg = sink_process_msg; + u->sink->userdata = u; + + pa_sink_set_asyncmsgq(u->sink, u->thread_mq.inq); + pa_sink_set_rtpoll(u->sink, u->rtpoll); + pa_sink_set_max_request(u->sink, jack_get_buffer_size(u->client) * pa_frame_size(&u->sink->sample_spec)); + + jack_set_process_callback(u->client, jack_process, u); + jack_on_shutdown(u->client, jack_shutdown, u); + jack_set_thread_init_callback(u->client, jack_init, u); + jack_set_buffer_size_callback(u->client, jack_buffer_size, u); + + if (!(u->thread = pa_thread_new(thread_func, u))) { + pa_log("Failed to create thread."); + goto fail; + } + + if (jack_activate(u->client)) { + pa_log("jack_activate() failed"); + goto fail; + } + + if (do_connect) { + for (i = 0, p = ports; i < ss.channels; i++, p++) { + + if (!*p) { + pa_log("Not enough physical output ports, leaving unconnected."); + break; + } + + pa_log_info("Connecting %s to %s", jack_port_name(u->port[i]), *p); + + if (jack_connect(u->client, jack_port_name(u->port[i]), *p)) { + pa_log("Failed to connect %s to %s, leaving unconnected.", jack_port_name(u->port[i]), *p); + break; + } + } + } + + pa_sink_put(u->sink); + + free(ports); + pa_modargs_free(ma); + + return 0; + +fail: + if (ma) + pa_modargs_free(ma); + + free(ports); + + pa__done(m); + + return -1; +} + +int pa__get_n_used(pa_module *m) { + struct userdata *u; + + pa_assert(m); + pa_assert_se(u = m->userdata); + + return pa_sink_linked_by(u->sink); +} + +void pa__done(pa_module*m) { + struct userdata *u; + + pa_assert(m); + + if (!(u = m->userdata)) + return; + + if (u->client) + jack_client_close(u->client); + + if (u->sink) + pa_sink_unlink(u->sink); + + if (u->thread) { + pa_asyncmsgq_send(u->thread_mq.inq, NULL, PA_MESSAGE_SHUTDOWN, NULL, 0, NULL); + pa_thread_free(u->thread); + } + + pa_thread_mq_done(&u->thread_mq); + + if (u->sink) + pa_sink_unref(u->sink); + + if (u->rtpoll_item) + pa_rtpoll_item_free(u->rtpoll_item); + + if (u->jack_msgq) + pa_asyncmsgq_unref(u->jack_msgq); + + if (u->rtpoll) + pa_rtpoll_free(u->rtpoll); + + pa_xfree(u); +} diff --git a/src/modules/jack/module-jack-source-symdef.h b/src/modules/jack/module-jack-source-symdef.h new file mode 100644 index 0000000..a5b3af1 --- /dev/null +++ b/src/modules/jack/module-jack-source-symdef.h @@ -0,0 +1,29 @@ +#ifndef foomodulejacksourcesymdeffoo +#define foomodulejacksourcesymdeffoo + +#include +#include +#include + +#define pa__init module_jack_source_LTX_pa__init +#define pa__done module_jack_source_LTX_pa__done +#define pa__get_author module_jack_source_LTX_pa__get_author +#define pa__get_description module_jack_source_LTX_pa__get_description +#define pa__get_usage module_jack_source_LTX_pa__get_usage +#define pa__get_version module_jack_source_LTX_pa__get_version +#define pa__get_deprecated module_jack_source_LTX_pa__get_deprecated +#define pa__load_once module_jack_source_LTX_pa__load_once +#define pa__get_n_used module_jack_source_LTX_pa__get_n_used + +int pa__init(pa_module*m); +void pa__done(pa_module*m); +int pa__get_n_used(pa_module*m); + +const char* pa__get_author(void); +const char* pa__get_description(void); +const char* pa__get_usage(void); +const char* pa__get_version(void); +const char* pa__get_deprecated(void); +pa_bool_t pa__load_once(void); + +#endif diff --git a/src/modules/jack/module-jack-source.c b/src/modules/jack/module-jack-source.c new file mode 100644 index 0000000..6c68527 --- /dev/null +++ b/src/modules/jack/module-jack-source.c @@ -0,0 +1,454 @@ +/*** + This file is part of PulseAudio. + + Copyright 2006 Lennart Poettering + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "module-jack-source-symdef.h" + +/* See module-jack-sink for a few comments how this module basically + * works */ + +PA_MODULE_AUTHOR("Lennart Poettering"); +PA_MODULE_DESCRIPTION("JACK Source"); +PA_MODULE_VERSION(PACKAGE_VERSION); +PA_MODULE_LOAD_ONCE(TRUE); +PA_MODULE_USAGE( + "source_name= " + "source_properties= " + "server_name= " + "client_name= " + "channels= " + "channel_map= " + "connect="); + +#define DEFAULT_SOURCE_NAME "jack_in" + +struct userdata { + pa_core *core; + pa_module *module; + pa_source *source; + + unsigned channels; + + jack_port_t* port[PA_CHANNELS_MAX]; + jack_client_t *client; + + pa_thread_mq thread_mq; + pa_asyncmsgq *jack_msgq; + pa_rtpoll *rtpoll; + pa_rtpoll_item *rtpoll_item; + + pa_thread *thread; + + jack_nframes_t saved_frame_time; + pa_bool_t saved_frame_time_valid; +}; + +static const char* const valid_modargs[] = { + "source_name", + "source_properties", + "server_name", + "client_name", + "channels", + "channel_map", + "connect", + NULL +}; + +enum { + SOURCE_MESSAGE_POST = PA_SOURCE_MESSAGE_MAX, + SOURCE_MESSAGE_ON_SHUTDOWN +}; + +static int source_process_msg(pa_msgobject *o, int code, void *data, int64_t offset, pa_memchunk *chunk) { + struct userdata *u = PA_SOURCE(o)->userdata; + + switch (code) { + + case SOURCE_MESSAGE_POST: + + /* Handle the new block from the JACK thread */ + pa_assert(chunk); + pa_assert(chunk->length > 0); + + if (u->source->thread_info.state == PA_SOURCE_RUNNING) + pa_source_post(u->source, chunk); + + u->saved_frame_time = (jack_nframes_t) offset; + u->saved_frame_time_valid = TRUE; + + return 0; + + case SOURCE_MESSAGE_ON_SHUTDOWN: + pa_asyncmsgq_post(u->thread_mq.outq, PA_MSGOBJECT(u->core), PA_CORE_MESSAGE_UNLOAD_MODULE, u->module, 0, NULL, NULL); + return 0; + + case PA_SOURCE_MESSAGE_GET_LATENCY: { + jack_nframes_t l, ft, d; + size_t n; + + /* This is the "worst-case" latency */ + l = jack_port_get_total_latency(u->client, u->port[0]); + + if (u->saved_frame_time_valid) { + /* Adjust the worst case latency by the time that + * passed since we last handed data to JACK */ + + ft = jack_frame_time(u->client); + d = ft > u->saved_frame_time ? ft - u->saved_frame_time : 0; + l += d; + } + + /* Convert it to usec */ + n = l * pa_frame_size(&u->source->sample_spec); + *((pa_usec_t*) data) = pa_bytes_to_usec(n, &u->source->sample_spec); + + return 0; + } + } + + return pa_source_process_msg(o, code, data, offset, chunk); +} + +static int jack_process(jack_nframes_t nframes, void *arg) { + unsigned c; + struct userdata *u = arg; + const void *buffer[PA_CHANNELS_MAX]; + void *p; + jack_nframes_t frame_time; + pa_memchunk chunk; + + pa_assert(u); + + for (c = 0; c < u->channels; c++) + pa_assert_se(buffer[c] = jack_port_get_buffer(u->port[c], nframes)); + + /* We interleave the data and pass it on to the other RT thread */ + + pa_memchunk_reset(&chunk); + chunk.length = nframes * pa_frame_size(&u->source->sample_spec); + chunk.memblock = pa_memblock_new(u->core->mempool, chunk.length); + p = pa_memblock_acquire(chunk.memblock); + pa_interleave(buffer, u->channels, p, sizeof(float), nframes); + pa_memblock_release(chunk.memblock); + + frame_time = jack_frame_time(u->client); + + pa_asyncmsgq_post(u->jack_msgq, PA_MSGOBJECT(u->source), SOURCE_MESSAGE_POST, NULL, frame_time, &chunk, NULL); + + pa_memblock_unref(chunk.memblock); + + return 0; +} + +static void thread_func(void *userdata) { + struct userdata *u = userdata; + + pa_assert(u); + + pa_log_debug("Thread starting up"); + + if (u->core->realtime_scheduling) + pa_make_realtime(u->core->realtime_priority); + + pa_thread_mq_install(&u->thread_mq); + + for (;;) { + int ret; + + if ((ret = pa_rtpoll_run(u->rtpoll, TRUE)) < 0) + goto fail; + + if (ret == 0) + goto finish; + } + +fail: + /* If this was no regular exit from the loop we have to continue + * processing messages until we received PA_MESSAGE_SHUTDOWN */ + pa_asyncmsgq_post(u->thread_mq.outq, PA_MSGOBJECT(u->core), PA_CORE_MESSAGE_UNLOAD_MODULE, u->module, 0, NULL, NULL); + pa_asyncmsgq_wait_for(u->thread_mq.inq, PA_MESSAGE_SHUTDOWN); + +finish: + pa_log_debug("Thread shutting down"); +} + +static void jack_error_func(const char*t) { + char *s; + + s = pa_xstrndup(t, strcspn(t, "\n\r")); + pa_log_warn("JACK error >%s<", s); + pa_xfree(s); +} + +static void jack_init(void *arg) { + struct userdata *u = arg; + + pa_log_info("JACK thread starting up."); + + if (u->core->realtime_scheduling) + pa_make_realtime(u->core->realtime_priority+4); +} + +static void jack_shutdown(void* arg) { + struct userdata *u = arg; + + pa_log_info("JACK thread shutting down.."); + pa_asyncmsgq_post(u->jack_msgq, PA_MSGOBJECT(u->source), SOURCE_MESSAGE_ON_SHUTDOWN, NULL, 0, NULL, NULL); +} + +int pa__init(pa_module*m) { + struct userdata *u = NULL; + pa_sample_spec ss; + pa_channel_map map; + pa_modargs *ma = NULL; + jack_status_t status; + const char *server_name, *client_name; + uint32_t channels = 0; + pa_bool_t do_connect = TRUE; + unsigned i; + const char **ports = NULL, **p; + pa_source_new_data data; + + pa_assert(m); + + jack_set_error_function(jack_error_func); + + if (!(ma = pa_modargs_new(m->argument, valid_modargs))) { + pa_log("Failed to parse module arguments."); + goto fail; + } + + if (pa_modargs_get_value_boolean(ma, "connect", &do_connect) < 0) { + pa_log("Failed to parse connect= argument."); + goto fail; + } + + server_name = pa_modargs_get_value(ma, "server_name", NULL); + client_name = pa_modargs_get_value(ma, "client_name", "PulseAudio JACK Source"); + + m->userdata = u = pa_xnew0(struct userdata, 1); + u->core = m->core; + u->module = m; + u->saved_frame_time_valid = FALSE; + u->rtpoll = pa_rtpoll_new(); + pa_thread_mq_init(&u->thread_mq, m->core->mainloop, u->rtpoll); + + u->jack_msgq = pa_asyncmsgq_new(0); + u->rtpoll_item = pa_rtpoll_item_new_asyncmsgq_read(u->rtpoll, PA_RTPOLL_EARLY-1, u->jack_msgq); + + if (!(u->client = jack_client_open(client_name, server_name ? JackServerName : JackNullOption, &status, server_name))) { + pa_log("jack_client_open() failed."); + goto fail; + } + + ports = jack_get_ports(u->client, NULL, JACK_DEFAULT_AUDIO_TYPE, JackPortIsPhysical|JackPortIsOutput); + + channels = 0; + for (p = ports; *p; p++) + channels++; + + if (!channels) + channels = m->core->default_sample_spec.channels; + + if (pa_modargs_get_value_u32(ma, "channels", &channels) < 0 || + channels <= 0 || + channels >= PA_CHANNELS_MAX) { + pa_log("failed to parse channels= argument."); + goto fail; + } + + if (channels == m->core->default_channel_map.channels) + map = m->core->default_channel_map; + else + pa_channel_map_init_extend(&map, channels, PA_CHANNEL_MAP_ALSA); + + if (pa_modargs_get_channel_map(ma, NULL, &map) < 0 || map.channels != channels) { + pa_log("failed to parse channel_map= argument."); + goto fail; + } + + pa_log_info("Successfully connected as '%s'", jack_get_client_name(u->client)); + + u->channels = ss.channels = (uint8_t) channels; + ss.rate = jack_get_sample_rate(u->client); + ss.format = PA_SAMPLE_FLOAT32NE; + + pa_assert(pa_sample_spec_valid(&ss)); + + for (i = 0; i < ss.channels; i++) { + if (!(u->port[i] = jack_port_register(u->client, pa_channel_position_to_string(map.map[i]), JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput|JackPortIsTerminal, 0))) { + pa_log("jack_port_register() failed."); + goto fail; + } + } + + pa_source_new_data_init(&data); + data.driver = __FILE__; + data.module = m; + pa_source_new_data_set_name(&data, pa_modargs_get_value(ma, "source_name", DEFAULT_SOURCE_NAME)); + pa_source_new_data_set_sample_spec(&data, &ss); + pa_source_new_data_set_channel_map(&data, &map); + pa_proplist_sets(data.proplist, PA_PROP_DEVICE_API, "jack"); + if (server_name) + pa_proplist_sets(data.proplist, PA_PROP_DEVICE_STRING, server_name); + pa_proplist_setf(data.proplist, PA_PROP_DEVICE_DESCRIPTION, "Jack source (%s)", jack_get_client_name(u->client)); + pa_proplist_sets(data.proplist, "jack.client_name", jack_get_client_name(u->client)); + + if (pa_modargs_get_proplist(ma, "source_properties", data.proplist, PA_UPDATE_REPLACE) < 0) { + pa_log("Invalid properties"); + pa_source_new_data_done(&data); + goto fail; + } + + u->source = pa_source_new(m->core, &data, PA_SOURCE_LATENCY); + pa_source_new_data_done(&data); + + if (!u->source) { + pa_log("Failed to create source."); + goto fail; + } + + u->source->parent.process_msg = source_process_msg; + u->source->userdata = u; + + pa_source_set_asyncmsgq(u->source, u->thread_mq.inq); + pa_source_set_rtpoll(u->source, u->rtpoll); + + jack_set_process_callback(u->client, jack_process, u); + jack_on_shutdown(u->client, jack_shutdown, u); + jack_set_thread_init_callback(u->client, jack_init, u); + + if (!(u->thread = pa_thread_new(thread_func, u))) { + pa_log("Failed to create thread."); + goto fail; + } + + if (jack_activate(u->client)) { + pa_log("jack_activate() failed"); + goto fail; + } + + if (do_connect) { + for (i = 0, p = ports; i < ss.channels; i++, p++) { + + if (!*p) { + pa_log("Not enough physical output ports, leaving unconnected."); + break; + } + + pa_log_info("Connecting %s to %s", jack_port_name(u->port[i]), *p); + + if (jack_connect(u->client, *p, jack_port_name(u->port[i]))) { + pa_log("Failed to connect %s to %s, leaving unconnected.", jack_port_name(u->port[i]), *p); + break; + } + } + + } + + pa_source_put(u->source); + + free(ports); + pa_modargs_free(ma); + + return 0; + +fail: + if (ma) + pa_modargs_free(ma); + + free(ports); + + pa__done(m); + + return -1; +} + +int pa__get_n_used(pa_module *m) { + struct userdata *u; + + pa_assert(m); + pa_assert_se(u = m->userdata); + + return pa_source_linked_by(u->source); +} + +void pa__done(pa_module*m) { + struct userdata *u; + pa_assert(m); + + if (!(u = m->userdata)) + return; + + if (u->client) + jack_client_close(u->client); + + if (u->source) + pa_source_unlink(u->source); + + if (u->thread) { + pa_asyncmsgq_send(u->thread_mq.inq, NULL, PA_MESSAGE_SHUTDOWN, NULL, 0, NULL); + pa_thread_free(u->thread); + } + + pa_thread_mq_done(&u->thread_mq); + + if (u->source) + pa_source_unref(u->source); + + if (u->rtpoll_item) + pa_rtpoll_item_free(u->rtpoll_item); + + if (u->jack_msgq) + pa_asyncmsgq_unref(u->jack_msgq); + + if (u->rtpoll) + pa_rtpoll_free(u->rtpoll); + + pa_xfree(u); +} diff --git a/src/modules/ladspa.h b/src/modules/ladspa.h new file mode 100644 index 0000000..b1a9c4e --- /dev/null +++ b/src/modules/ladspa.h @@ -0,0 +1,603 @@ +/* ladspa.h + + Linux Audio Developer's Simple Plugin API Version 1.1[LGPL]. + Copyright (C) 2000-2002 Richard W.E. Furse, Paul Barton-Davis, + Stefan Westerfeld. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public License + as published by the Free Software Foundation; either version 2.1 of + the License, or (at your option) any later version. + + This library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. */ + +#ifndef LADSPA_INCLUDED +#define LADSPA_INCLUDED + +#define LADSPA_VERSION "1.1" +#define LADSPA_VERSION_MAJOR 1 +#define LADSPA_VERSION_MINOR 1 + +#ifdef __cplusplus +extern "C" { +#endif + +/*****************************************************************************/ + +/* Overview: + + There is a large number of synthesis packages in use or development + on the Linux platform at this time. This API (`The Linux Audio + Developer's Simple Plugin API') attempts to give programmers the + ability to write simple `plugin' audio processors in C/C++ and link + them dynamically (`plug') into a range of these packages (`hosts'). + It should be possible for any host and any plugin to communicate + completely through this interface. + + This API is deliberately short and simple. To achieve compatibility + with a range of promising Linux sound synthesis packages it + attempts to find the `greatest common divisor' in their logical + behaviour. Having said this, certain limiting decisions are + implicit, notably the use of a fixed type (LADSPA_Data) for all + data transfer and absence of a parameterised `initialisation' + phase. See below for the LADSPA_Data typedef. + + Plugins are expected to distinguish between control and audio + data. Plugins have `ports' that are inputs or outputs for audio or + control data and each plugin is `run' for a `block' corresponding + to a short time interval measured in samples. Audio data is + communicated using arrays of LADSPA_Data, allowing a block of audio + to be processed by the plugin in a single pass. Control data is + communicated using single LADSPA_Data values. Control data has a + single value at the start of a call to the `run()' or `run_adding()' + function, and may be considered to remain this value for its + duration. The plugin may assume that all its input and output ports + have been connected to the relevant data location (see the + `connect_port()' function below) before it is asked to run. + + Plugins will reside in shared object files suitable for dynamic + linking by dlopen() and family. The file will provide a number of + `plugin types' that can be used to instantiate actual plugins + (sometimes known as `plugin instances') that can be connected + together to perform tasks. + + This API contains very limited error-handling. */ + +/*****************************************************************************/ + +/* Fundamental data type passed in and out of plugin. This data type + is used to communicate audio samples and control values. It is + assumed that the plugin will work sensibly given any numeric input + value although it may have a preferred range (see hints below). + + For audio it is generally assumed that 1.0f is the `0dB' reference + amplitude and is a `normal' signal level. */ + +typedef float LADSPA_Data; + +/*****************************************************************************/ + +/* Special Plugin Properties: + + Optional features of the plugin type are encapsulated in the + LADSPA_Properties type. This is assembled by ORing individual + properties together. */ + +typedef int LADSPA_Properties; + +/* Property LADSPA_PROPERTY_REALTIME indicates that the plugin has a + real-time dependency (e.g. listens to a MIDI device) and so its + output must not be cached or subject to significant latency. */ +#define LADSPA_PROPERTY_REALTIME 0x1 + +/* Property LADSPA_PROPERTY_INPLACE_BROKEN indicates that the plugin + may cease to work correctly if the host elects to use the same data + location for both input and output (see connect_port()). This + should be avoided as enabling this flag makes it impossible for + hosts to use the plugin to process audio `in-place.' */ +#define LADSPA_PROPERTY_INPLACE_BROKEN 0x2 + +/* Property LADSPA_PROPERTY_HARD_RT_CAPABLE indicates that the plugin + is capable of running not only in a conventional host but also in a + `hard real-time' environment. To qualify for this the plugin must + satisfy all of the following: + + (1) The plugin must not use malloc(), free() or other heap memory + management within its run() or run_adding() functions. All new + memory used in run() must be managed via the stack. These + restrictions only apply to the run() function. + + (2) The plugin will not attempt to make use of any library + functions with the exceptions of functions in the ANSI standard C + and C maths libraries, which the host is expected to provide. + + (3) The plugin will not access files, devices, pipes, sockets, IPC + or any other mechanism that might result in process or thread + blocking. + + (4) The plugin will take an amount of time to execute a run() or + run_adding() call approximately of form (A+B*SampleCount) where A + and B depend on the machine and host in use. This amount of time + may not depend on input signals or plugin state. The host is left + the responsibility to perform timings to estimate upper bounds for + A and B. */ +#define LADSPA_PROPERTY_HARD_RT_CAPABLE 0x4 + +#define LADSPA_IS_REALTIME(x) ((x) & LADSPA_PROPERTY_REALTIME) +#define LADSPA_IS_INPLACE_BROKEN(x) ((x) & LADSPA_PROPERTY_INPLACE_BROKEN) +#define LADSPA_IS_HARD_RT_CAPABLE(x) ((x) & LADSPA_PROPERTY_HARD_RT_CAPABLE) + +/*****************************************************************************/ + +/* Plugin Ports: + + Plugins have `ports' that are inputs or outputs for audio or + data. Ports can communicate arrays of LADSPA_Data (for audio + inputs/outputs) or single LADSPA_Data values (for control + input/outputs). This information is encapsulated in the + LADSPA_PortDescriptor type which is assembled by ORing individual + properties together. + + Note that a port must be an input or an output port but not both + and that a port must be a control or audio port but not both. */ + +typedef int LADSPA_PortDescriptor; + +/* Property LADSPA_PORT_INPUT indicates that the port is an input. */ +#define LADSPA_PORT_INPUT 0x1 + +/* Property LADSPA_PORT_OUTPUT indicates that the port is an output. */ +#define LADSPA_PORT_OUTPUT 0x2 + +/* Property LADSPA_PORT_CONTROL indicates that the port is a control + port. */ +#define LADSPA_PORT_CONTROL 0x4 + +/* Property LADSPA_PORT_AUDIO indicates that the port is a audio + port. */ +#define LADSPA_PORT_AUDIO 0x8 + +#define LADSPA_IS_PORT_INPUT(x) ((x) & LADSPA_PORT_INPUT) +#define LADSPA_IS_PORT_OUTPUT(x) ((x) & LADSPA_PORT_OUTPUT) +#define LADSPA_IS_PORT_CONTROL(x) ((x) & LADSPA_PORT_CONTROL) +#define LADSPA_IS_PORT_AUDIO(x) ((x) & LADSPA_PORT_AUDIO) + +/*****************************************************************************/ + +/* Plugin Port Range Hints: + + The host may wish to provide a representation of data entering or + leaving a plugin (e.g. to generate a GUI automatically). To make + this more meaningful, the plugin should provide `hints' to the host + describing the usual values taken by the data. + + Note that these are only hints. The host may ignore them and the + plugin must not assume that data supplied to it is meaningful. If + the plugin receives invalid input data it is expected to continue + to run without failure and, where possible, produce a sensible + output (e.g. a high-pass filter given a negative cutoff frequency + might switch to an all-pass mode). + + Hints are meaningful for all input and output ports but hints for + input control ports are expected to be particularly useful. + + More hint information is encapsulated in the + LADSPA_PortRangeHintDescriptor type which is assembled by ORing + individual hint types together. Hints may require further + LowerBound and UpperBound information. + + All the hint information for a particular port is aggregated in the + LADSPA_PortRangeHint structure. */ + +typedef int LADSPA_PortRangeHintDescriptor; + +/* Hint LADSPA_HINT_BOUNDED_BELOW indicates that the LowerBound field + of the LADSPA_PortRangeHint should be considered meaningful. The + value in this field should be considered the (inclusive) lower + bound of the valid range. If LADSPA_HINT_SAMPLE_RATE is also + specified then the value of LowerBound should be multiplied by the + sample rate. */ +#define LADSPA_HINT_BOUNDED_BELOW 0x1 + +/* Hint LADSPA_HINT_BOUNDED_ABOVE indicates that the UpperBound field + of the LADSPA_PortRangeHint should be considered meaningful. The + value in this field should be considered the (inclusive) upper + bound of the valid range. If LADSPA_HINT_SAMPLE_RATE is also + specified then the value of UpperBound should be multiplied by the + sample rate. */ +#define LADSPA_HINT_BOUNDED_ABOVE 0x2 + +/* Hint LADSPA_HINT_TOGGLED indicates that the data item should be + considered a Boolean toggle. Data less than or equal to zero should + be considered `off' or `false,' and data above zero should be + considered `on' or `true.' LADSPA_HINT_TOGGLED may not be used in + conjunction with any other hint except LADSPA_HINT_DEFAULT_0 or + LADSPA_HINT_DEFAULT_1. */ +#define LADSPA_HINT_TOGGLED 0x4 + +/* Hint LADSPA_HINT_SAMPLE_RATE indicates that any bounds specified + should be interpreted as multiples of the sample rate. For + instance, a frequency range from 0Hz to the Nyquist frequency (half + the sample rate) could be requested by this hint in conjunction + with LowerBound = 0 and UpperBound = 0.5. Hosts that support bounds + at all must support this hint to retain meaning. */ +#define LADSPA_HINT_SAMPLE_RATE 0x8 + +/* Hint LADSPA_HINT_LOGARITHMIC indicates that it is likely that the + user will find it more intuitive to view values using a logarithmic + scale. This is particularly useful for frequencies and gains. */ +#define LADSPA_HINT_LOGARITHMIC 0x10 + +/* Hint LADSPA_HINT_INTEGER indicates that a user interface would + probably wish to provide a stepped control taking only integer + values. Any bounds set should be slightly wider than the actual + integer range required to avoid floating point rounding errors. For + instance, the integer set {0,1,2,3} might be described as [-0.1, + 3.1]. */ +#define LADSPA_HINT_INTEGER 0x20 + +/* The various LADSPA_HINT_HAS_DEFAULT_* hints indicate a `normal' + value for the port that is sensible as a default. For instance, + this value is suitable for use as an initial value in a user + interface or as a value the host might assign to a control port + when the user has not provided one. Defaults are encoded using a + mask so only one default may be specified for a port. Some of the + hints make use of lower and upper bounds, in which case the + relevant bound or bounds must be available and + LADSPA_HINT_SAMPLE_RATE must be applied as usual. The resulting + default must be rounded if LADSPA_HINT_INTEGER is present. Default + values were introduced in LADSPA v1.1. */ +#define LADSPA_HINT_DEFAULT_MASK 0x3C0 + +/* This default values indicates that no default is provided. */ +#define LADSPA_HINT_DEFAULT_NONE 0x0 + +/* This default hint indicates that the suggested lower bound for the + port should be used. */ +#define LADSPA_HINT_DEFAULT_MINIMUM 0x40 + +/* This default hint indicates that a low value between the suggested + lower and upper bounds should be chosen. For ports with + LADSPA_HINT_LOGARITHMIC, this should be exp(log(lower) * 0.75 + + log(upper) * 0.25). Otherwise, this should be (lower * 0.75 + upper + * 0.25). */ +#define LADSPA_HINT_DEFAULT_LOW 0x80 + +/* This default hint indicates that a middle value between the + suggested lower and upper bounds should be chosen. For ports with + LADSPA_HINT_LOGARITHMIC, this should be exp(log(lower) * 0.5 + + log(upper) * 0.5). Otherwise, this should be (lower * 0.5 + upper * + 0.5). */ +#define LADSPA_HINT_DEFAULT_MIDDLE 0xC0 + +/* This default hint indicates that a high value between the suggested + lower and upper bounds should be chosen. For ports with + LADSPA_HINT_LOGARITHMIC, this should be exp(log(lower) * 0.25 + + log(upper) * 0.75). Otherwise, this should be (lower * 0.25 + upper + * 0.75). */ +#define LADSPA_HINT_DEFAULT_HIGH 0x100 + +/* This default hint indicates that the suggested upper bound for the + port should be used. */ +#define LADSPA_HINT_DEFAULT_MAXIMUM 0x140 + +/* This default hint indicates that the number 0 should be used. Note + that this default may be used in conjunction with + LADSPA_HINT_TOGGLED. */ +#define LADSPA_HINT_DEFAULT_0 0x200 + +/* This default hint indicates that the number 1 should be used. Note + that this default may be used in conjunction with + LADSPA_HINT_TOGGLED. */ +#define LADSPA_HINT_DEFAULT_1 0x240 + +/* This default hint indicates that the number 100 should be used. */ +#define LADSPA_HINT_DEFAULT_100 0x280 + +/* This default hint indicates that the Hz frequency of `concert A' + should be used. This will be 440 unless the host uses an unusual + tuning convention, in which case it may be within a few Hz. */ +#define LADSPA_HINT_DEFAULT_440 0x2C0 + +#define LADSPA_IS_HINT_BOUNDED_BELOW(x) ((x) & LADSPA_HINT_BOUNDED_BELOW) +#define LADSPA_IS_HINT_BOUNDED_ABOVE(x) ((x) & LADSPA_HINT_BOUNDED_ABOVE) +#define LADSPA_IS_HINT_TOGGLED(x) ((x) & LADSPA_HINT_TOGGLED) +#define LADSPA_IS_HINT_SAMPLE_RATE(x) ((x) & LADSPA_HINT_SAMPLE_RATE) +#define LADSPA_IS_HINT_LOGARITHMIC(x) ((x) & LADSPA_HINT_LOGARITHMIC) +#define LADSPA_IS_HINT_INTEGER(x) ((x) & LADSPA_HINT_INTEGER) + +#define LADSPA_IS_HINT_HAS_DEFAULT(x) ((x) & LADSPA_HINT_DEFAULT_MASK) +#define LADSPA_IS_HINT_DEFAULT_MINIMUM(x) (((x) & LADSPA_HINT_DEFAULT_MASK) \ + == LADSPA_HINT_DEFAULT_MINIMUM) +#define LADSPA_IS_HINT_DEFAULT_LOW(x) (((x) & LADSPA_HINT_DEFAULT_MASK) \ + == LADSPA_HINT_DEFAULT_LOW) +#define LADSPA_IS_HINT_DEFAULT_MIDDLE(x) (((x) & LADSPA_HINT_DEFAULT_MASK) \ + == LADSPA_HINT_DEFAULT_MIDDLE) +#define LADSPA_IS_HINT_DEFAULT_HIGH(x) (((x) & LADSPA_HINT_DEFAULT_MASK) \ + == LADSPA_HINT_DEFAULT_HIGH) +#define LADSPA_IS_HINT_DEFAULT_MAXIMUM(x) (((x) & LADSPA_HINT_DEFAULT_MASK) \ + == LADSPA_HINT_DEFAULT_MAXIMUM) +#define LADSPA_IS_HINT_DEFAULT_0(x) (((x) & LADSPA_HINT_DEFAULT_MASK) \ + == LADSPA_HINT_DEFAULT_0) +#define LADSPA_IS_HINT_DEFAULT_1(x) (((x) & LADSPA_HINT_DEFAULT_MASK) \ + == LADSPA_HINT_DEFAULT_1) +#define LADSPA_IS_HINT_DEFAULT_100(x) (((x) & LADSPA_HINT_DEFAULT_MASK) \ + == LADSPA_HINT_DEFAULT_100) +#define LADSPA_IS_HINT_DEFAULT_440(x) (((x) & LADSPA_HINT_DEFAULT_MASK) \ + == LADSPA_HINT_DEFAULT_440) + +typedef struct _LADSPA_PortRangeHint { + + /* Hints about the port. */ + LADSPA_PortRangeHintDescriptor HintDescriptor; + + /* Meaningful when hint LADSPA_HINT_BOUNDED_BELOW is active. When + LADSPA_HINT_SAMPLE_RATE is also active then this value should be + multiplied by the relevant sample rate. */ + LADSPA_Data LowerBound; + + /* Meaningful when hint LADSPA_HINT_BOUNDED_ABOVE is active. When + LADSPA_HINT_SAMPLE_RATE is also active then this value should be + multiplied by the relevant sample rate. */ + LADSPA_Data UpperBound; + +} LADSPA_PortRangeHint; + +/*****************************************************************************/ + +/* Plugin Handles: + + This plugin handle indicates a particular instance of the plugin + concerned. It is valid to compare this to NULL (0 for C++) but + otherwise the host should not attempt to interpret it. The plugin + may use it to reference internal instance data. */ + +typedef void * LADSPA_Handle; + +/*****************************************************************************/ + +/* Descriptor for a Type of Plugin: + + This structure is used to describe a plugin type. It provides a + number of functions to examine the type, instantiate it, link it to + buffers and workspaces and to run it. */ + +typedef struct _LADSPA_Descriptor { + + /* This numeric identifier indicates the plugin type + uniquely. Plugin programmers may reserve ranges of IDs from a + central body to avoid clashes. Hosts may assume that IDs are + below 0x1000000. */ + unsigned long UniqueID; + + /* This identifier can be used as a unique, case-sensitive + identifier for the plugin type within the plugin file. Plugin + types should be identified by file and label rather than by index + or plugin name, which may be changed in new plugin + versions. Labels must not contain white-space characters. */ + const char * Label; + + /* This indicates a number of properties of the plugin. */ + LADSPA_Properties Properties; + + /* This member points to the null-terminated name of the plugin + (e.g. "Sine Oscillator"). */ + const char * Name; + + /* This member points to the null-terminated string indicating the + maker of the plugin. This can be an empty string but not NULL. */ + const char * Maker; + + /* This member points to the null-terminated string indicating any + copyright applying to the plugin. If no Copyright applies the + string "None" should be used. */ + const char * Copyright; + + /* This indicates the number of ports (input AND output) present on + the plugin. */ + unsigned long PortCount; + + /* This member indicates an array of port descriptors. Valid indices + vary from 0 to PortCount-1. */ + const LADSPA_PortDescriptor * PortDescriptors; + + /* This member indicates an array of null-terminated strings + describing ports (e.g. "Frequency (Hz)"). Valid indices vary from + 0 to PortCount-1. */ + const char * const * PortNames; + + /* This member indicates an array of range hints for each port (see + above). Valid indices vary from 0 to PortCount-1. */ + const LADSPA_PortRangeHint * PortRangeHints; + + /* This may be used by the plugin developer to pass any custom + implementation data into an instantiate call. It must not be used + or interpreted by the host. It is expected that most plugin + writers will not use this facility as LADSPA_Handle should be + used to hold instance data. */ + void * ImplementationData; + + /* This member is a function pointer that instantiates a plugin. A + handle is returned indicating the new plugin instance. The + instantiation function accepts a sample rate as a parameter. The + plugin descriptor from which this instantiate function was found + must also be passed. This function must return NULL if + instantiation fails. + + Note that instance initialisation should generally occur in + activate() rather than here. */ + LADSPA_Handle (*instantiate)(const struct _LADSPA_Descriptor * Descriptor, + unsigned long SampleRate); + + /* This member is a function pointer that connects a port on an + instantiated plugin to a memory location at which a block of data + for the port will be read/written. The data location is expected + to be an array of LADSPA_Data for audio ports or a single + LADSPA_Data value for control ports. Memory issues will be + managed by the host. The plugin must read/write the data at these + locations every time run() or run_adding() is called and the data + present at the time of this connection call should not be + considered meaningful. + + connect_port() may be called more than once for a plugin instance + to allow the host to change the buffers that the plugin is + reading or writing. These calls may be made before or after + activate() or deactivate() calls. + + connect_port() must be called at least once for each port before + run() or run_adding() is called. When working with blocks of + LADSPA_Data the plugin should pay careful attention to the block + size passed to the run function as the block allocated may only + just be large enough to contain the block of samples. + + Plugin writers should be aware that the host may elect to use the + same buffer for more than one port and even use the same buffer + for both input and output (see LADSPA_PROPERTY_INPLACE_BROKEN). + However, overlapped buffers or use of a single buffer for both + audio and control data may result in unexpected behaviour. */ + void (*connect_port)(LADSPA_Handle Instance, + unsigned long Port, + LADSPA_Data * DataLocation); + + /* This member is a function pointer that initialises a plugin + instance and activates it for use. This is separated from + instantiate() to aid real-time support and so that hosts can + reinitialise a plugin instance by calling deactivate() and then + activate(). In this case the plugin instance must reset all state + information dependent on the history of the plugin instance + except for any data locations provided by connect_port() and any + gain set by set_run_adding_gain(). If there is nothing for + activate() to do then the plugin writer may provide a NULL rather + than an empty function. + + When present, hosts must call this function once before run() (or + run_adding()) is called for the first time. This call should be + made as close to the run() call as possible and indicates to + real-time plugins that they are now live. Plugins should not rely + on a prompt call to run() after activate(). activate() may not be + called again unless deactivate() is called first. Note that + connect_port() may be called before or after a call to + activate(). */ + void (*activate)(LADSPA_Handle Instance); + + /* This method is a function pointer that runs an instance of a + plugin for a block. Two parameters are required: the first is a + handle to the particular instance to be run and the second + indicates the block size (in samples) for which the plugin + instance may run. + + Note that if an activate() function exists then it must be called + before run() or run_adding(). If deactivate() is called for a + plugin instance then the plugin instance may not be reused until + activate() has been called again. + + If the plugin has the property LADSPA_PROPERTY_HARD_RT_CAPABLE + then there are various things that the plugin should not do + within the run() or run_adding() functions (see above). */ + void (*run)(LADSPA_Handle Instance, + unsigned long SampleCount); + + /* This method is a function pointer that runs an instance of a + plugin for a block. This has identical behaviour to run() except + in the way data is output from the plugin. When run() is used, + values are written directly to the memory areas associated with + the output ports. However when run_adding() is called, values + must be added to the values already present in the memory + areas. Furthermore, output values written must be scaled by the + current gain set by set_run_adding_gain() (see below) before + addition. + + run_adding() is optional. When it is not provided by a plugin, + this function pointer must be set to NULL. When it is provided, + the function set_run_adding_gain() must be provided also. */ + void (*run_adding)(LADSPA_Handle Instance, + unsigned long SampleCount); + + /* This method is a function pointer that sets the output gain for + use when run_adding() is called (see above). If this function is + never called the gain is assumed to default to 1. Gain + information should be retained when activate() or deactivate() + are called. + + This function should be provided by the plugin if and only if the + run_adding() function is provided. When it is absent this + function pointer must be set to NULL. */ + void (*set_run_adding_gain)(LADSPA_Handle Instance, + LADSPA_Data Gain); + + /* This is the counterpart to activate() (see above). If there is + nothing for deactivate() to do then the plugin writer may provide + a NULL rather than an empty function. + + Hosts must deactivate all activated units after they have been + run() (or run_adding()) for the last time. This call should be + made as close to the last run() call as possible and indicates to + real-time plugins that they are no longer live. Plugins should + not rely on prompt deactivation. Note that connect_port() may be + called before or after a call to deactivate(). + + Deactivation is not similar to pausing as the plugin instance + will be reinitialised when activate() is called to reuse it. */ + void (*deactivate)(LADSPA_Handle Instance); + + /* Once an instance of a plugin has been finished with it can be + deleted using the following function. The instance handle passed + ceases to be valid after this call. + + If activate() was called for a plugin instance then a + corresponding call to deactivate() must be made before cleanup() + is called. */ + void (*cleanup)(LADSPA_Handle Instance); + +} LADSPA_Descriptor; + +/**********************************************************************/ + +/* Accessing a Plugin: */ + +/* The exact mechanism by which plugins are loaded is host-dependent, + however all most hosts will need to know is the name of shared + object file containing the plugin types. To allow multiple hosts to + share plugin types, hosts may wish to check for environment + variable LADSPA_PATH. If present, this should contain a + colon-separated path indicating directories that should be searched + (in order) when loading plugin types. + + A plugin programmer must include a function called + "ladspa_descriptor" with the following function prototype within + the shared object file. This function will have C-style linkage (if + you are using C++ this is taken care of by the `extern "C"' clause + at the top of the file). + + A host will find the plugin shared object file by one means or + another, find the ladspa_descriptor() function, call it, and + proceed from there. + + Plugin types are accessed by index (not ID) using values from 0 + upwards. Out of range indexes must result in this function + returning NULL, so the plugin count can be determined by checking + for the least index that results in NULL being returned. */ + +const LADSPA_Descriptor * ladspa_descriptor(unsigned long Index); + +/* Datatype corresponding to the ladspa_descriptor() function. */ +typedef const LADSPA_Descriptor * +(*LADSPA_Descriptor_Function)(unsigned long Index); + +/**********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* LADSPA_INCLUDED */ + +/* EOF */ diff --git a/src/modules/module-always-sink-symdef.h b/src/modules/module-always-sink-symdef.h new file mode 100644 index 0000000..3987aa2 --- /dev/null +++ b/src/modules/module-always-sink-symdef.h @@ -0,0 +1,29 @@ +#ifndef foomodulealwayssinksymdeffoo +#define foomodulealwayssinksymdeffoo + +#include +#include +#include + +#define pa__init module_always_sink_LTX_pa__init +#define pa__done module_always_sink_LTX_pa__done +#define pa__get_author module_always_sink_LTX_pa__get_author +#define pa__get_description module_always_sink_LTX_pa__get_description +#define pa__get_usage module_always_sink_LTX_pa__get_usage +#define pa__get_version module_always_sink_LTX_pa__get_version +#define pa__get_deprecated module_always_sink_LTX_pa__get_deprecated +#define pa__load_once module_always_sink_LTX_pa__load_once +#define pa__get_n_used module_always_sink_LTX_pa__get_n_used + +int pa__init(pa_module*m); +void pa__done(pa_module*m); +int pa__get_n_used(pa_module*m); + +const char* pa__get_author(void); +const char* pa__get_description(void); +const char* pa__get_usage(void); +const char* pa__get_version(void); +const char* pa__get_deprecated(void); +pa_bool_t pa__load_once(void); + +#endif diff --git a/src/modules/module-always-sink.c b/src/modules/module-always-sink.c new file mode 100644 index 0000000..3d7de9c --- /dev/null +++ b/src/modules/module-always-sink.c @@ -0,0 +1,190 @@ +/*** + This file is part of PulseAudio. + + Copyright 2008 Colin Guthrie + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include + +#include +#include +#include +#include +#include +#include + +#include "module-always-sink-symdef.h" + +PA_MODULE_AUTHOR("Colin Guthrie"); +PA_MODULE_DESCRIPTION(_("Always keeps at least one sink loaded even if it's a null one")); +PA_MODULE_VERSION(PACKAGE_VERSION); +PA_MODULE_LOAD_ONCE(TRUE); +PA_MODULE_USAGE( + "sink_name="); + +#define DEFAULT_SINK_NAME "auto_null" + +static const char* const valid_modargs[] = { + "sink_name", + NULL, +}; + +struct userdata { + pa_hook_slot *put_slot, *unlink_slot; + uint32_t null_module; + pa_bool_t ignore; + char *sink_name; +}; + +static void load_null_sink_if_needed(pa_core *c, pa_sink *sink, struct userdata* u) { + pa_sink *target; + uint32_t idx; + char *t; + pa_module *m; + + pa_assert(c); + pa_assert(u); + pa_assert(u->null_module == PA_INVALID_INDEX); + + /* Loop through all sinks and check to see if we have *any* + * sinks. Ignore the sink passed in (if it's not null) */ + for (target = pa_idxset_first(c->sinks, &idx); target; target = pa_idxset_next(c->sinks, &idx)) + if (!sink || target != sink) + break; + + if (target) + return; + + pa_log_debug("Autoloading null-sink as no other sinks detected."); + + u->ignore = TRUE; + + t = pa_sprintf_malloc("sink_name=%s sink_properties='device.description=\"%s\"'", u->sink_name, + _("Dummy Output")); + m = pa_module_load(c, "module-null-sink", t); + u->null_module = m ? m->index : PA_INVALID_INDEX; + pa_xfree(t); + + u->ignore = FALSE; + + if (!m) + pa_log_warn("Unable to load module-null-sink"); +} + +static pa_hook_result_t put_hook_callback(pa_core *c, pa_sink *sink, void* userdata) { + struct userdata *u = userdata; + + pa_assert(c); + pa_assert(sink); + pa_assert(u); + + /* This is us detecting ourselves on load... just ignore this. */ + if (u->ignore) + return PA_HOOK_OK; + + /* There's no point in doing anything if the core is shut down anyway */ + if (c->state == PA_CORE_SHUTDOWN) + return PA_HOOK_OK; + + /* Auto-loaded null-sink not active, so ignoring newly detected sink. */ + if (u->null_module == PA_INVALID_INDEX) + return PA_HOOK_OK; + + /* This is us detecting ourselves on load in a different way... just ignore this too. */ + if (sink->module && sink->module->index == u->null_module) + return PA_HOOK_OK; + + pa_log_info("A new sink has been discovered. Unloading null-sink."); + + pa_module_unload_request_by_index(c, u->null_module, TRUE); + u->null_module = PA_INVALID_INDEX; + + return PA_HOOK_OK; +} + +static pa_hook_result_t unlink_hook_callback(pa_core *c, pa_sink *sink, void* userdata) { + struct userdata *u = userdata; + + pa_assert(c); + pa_assert(sink); + pa_assert(u); + + /* First check to see if it's our own null-sink that's been removed... */ + if (u->null_module != PA_INVALID_INDEX && sink->module && sink->module->index == u->null_module) { + pa_log_debug("Autoloaded null-sink removed"); + u->null_module = PA_INVALID_INDEX; + return PA_HOOK_OK; + } + + /* There's no point in doing anything if the core is shut down anyway */ + if (c->state == PA_CORE_SHUTDOWN) + return PA_HOOK_OK; + + load_null_sink_if_needed(c, sink, u); + + return PA_HOOK_OK; +} + +int pa__init(pa_module*m) { + pa_modargs *ma = NULL; + struct userdata *u; + + pa_assert(m); + + if (!(ma = pa_modargs_new(m->argument, valid_modargs))) { + pa_log("Failed to parse module arguments"); + return -1; + } + + m->userdata = u = pa_xnew(struct userdata, 1); + u->sink_name = pa_xstrdup(pa_modargs_get_value(ma, "sink_name", DEFAULT_SINK_NAME)); + u->put_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_PUT], PA_HOOK_LATE, (pa_hook_cb_t) put_hook_callback, u); + u->unlink_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_UNLINK], PA_HOOK_EARLY, (pa_hook_cb_t) unlink_hook_callback, u); + u->null_module = PA_INVALID_INDEX; + u->ignore = FALSE; + + pa_modargs_free(ma); + + load_null_sink_if_needed(m->core, NULL, u); + + return 0; +} + +void pa__done(pa_module*m) { + struct userdata *u; + + pa_assert(m); + + if (!(u = m->userdata)) + return; + + if (u->put_slot) + pa_hook_slot_free(u->put_slot); + if (u->unlink_slot) + pa_hook_slot_free(u->unlink_slot); + if (u->null_module != PA_INVALID_INDEX && m->core->state != PA_CORE_SHUTDOWN) + pa_module_unload_request_by_index(m->core, u->null_module, TRUE); + + pa_xfree(u->sink_name); + pa_xfree(u); +} diff --git a/src/modules/module-augment-properties-symdef.h b/src/modules/module-augment-properties-symdef.h new file mode 100644 index 0000000..c073ffb --- /dev/null +++ b/src/modules/module-augment-properties-symdef.h @@ -0,0 +1,29 @@ +#ifndef foomoduleaugmentpropertiessymdeffoo +#define foomoduleaugmentpropertiessymdeffoo + +#include +#include +#include + +#define pa__init module_augment_properties_LTX_pa__init +#define pa__done module_augment_properties_LTX_pa__done +#define pa__get_author module_augment_properties_LTX_pa__get_author +#define pa__get_description module_augment_properties_LTX_pa__get_description +#define pa__get_usage module_augment_properties_LTX_pa__get_usage +#define pa__get_version module_augment_properties_LTX_pa__get_version +#define pa__get_deprecated module_augment_properties_LTX_pa__get_deprecated +#define pa__load_once module_augment_properties_LTX_pa__load_once +#define pa__get_n_used module_augment_properties_LTX_pa__get_n_used + +int pa__init(pa_module*m); +void pa__done(pa_module*m); +int pa__get_n_used(pa_module*m); + +const char* pa__get_author(void); +const char* pa__get_description(void); +const char* pa__get_usage(void); +const char* pa__get_version(void); +const char* pa__get_deprecated(void); +pa_bool_t pa__load_once(void); + +#endif diff --git a/src/modules/module-augment-properties.c b/src/modules/module-augment-properties.c new file mode 100644 index 0000000..15aa3a1 --- /dev/null +++ b/src/modules/module-augment-properties.c @@ -0,0 +1,349 @@ +/*** + This file is part of PulseAudio. + + Copyright 2009 Lennart Poettering + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "module-augment-properties-symdef.h" + +PA_MODULE_AUTHOR("Lennart Poettering"); +PA_MODULE_DESCRIPTION("Augment the property sets of streams with additional static information"); +PA_MODULE_VERSION(PACKAGE_VERSION); +PA_MODULE_LOAD_ONCE(TRUE); + +#define STAT_INTERVAL 30 +#define MAX_CACHE_SIZE 50 + +static const char* const valid_modargs[] = { + NULL +}; + +struct rule { + time_t timestamp; + pa_bool_t good; + time_t mtime; + char *process_name; + char *application_name; + char *icon_name; + char *role; + pa_proplist *proplist; +}; + +struct userdata { + pa_hashmap *cache; + pa_hook_slot *client_new_slot, *client_proplist_changed_slot; +}; + +static void rule_free(struct rule *r) { + pa_assert(r); + + pa_xfree(r->process_name); + pa_xfree(r->application_name); + pa_xfree(r->icon_name); + pa_xfree(r->role); + if (r->proplist) + pa_proplist_free(r->proplist); + pa_xfree(r); +} + +static int parse_properties( + const char *filename, + unsigned line, + const char *section, + const char *lvalue, + const char *rvalue, + void *data, + void *userdata) { + + struct rule *r = userdata; + pa_proplist *n; + + if (!(n = pa_proplist_from_string(rvalue))) + return -1; + + if (r->proplist) { + pa_proplist_update(r->proplist, PA_UPDATE_MERGE, n); + pa_proplist_free(n); + } else + r->proplist = n; + + return 0; +} + +static int parse_categories( + const char *filename, + unsigned line, + const char *section, + const char *lvalue, + const char *rvalue, + void *data, + void *userdata) { + + struct rule *r = userdata; + const char *state = NULL; + char *c; + + while ((c = pa_split(rvalue, ";", &state))) { + + if (pa_streq(c, "Game")) { + pa_xfree(r->role); + r->role = pa_xstrdup("game"); + } else if (pa_streq(c, "Telephony")) { + pa_xfree(r->role); + r->role = pa_xstrdup("phone"); + } + + pa_xfree(c); + } + + return 0; +} + +static int check_type( + const char *filename, + unsigned line, + const char *section, + const char *lvalue, + const char *rvalue, + void *data, + void *userdata) { + + return pa_streq(rvalue, "Application") ? 0 : -1; +} + +static int catch_all( + const char *filename, + unsigned line, + const char *section, + const char *lvalue, + const char *rvalue, + void *data, + void *userdata) { + + return 0; +} + +static void update_rule(struct rule *r) { + char *fn; + struct stat st; + static pa_config_item table[] = { + { "Name", pa_config_parse_string, NULL, "Desktop Entry" }, + { "Icon", pa_config_parse_string, NULL, "Desktop Entry" }, + { "Type", check_type, NULL, "Desktop Entry" }, + { "X-PulseAudio-Properties", parse_properties, NULL, "Desktop Entry" }, + { "Categories", parse_categories, NULL, "Desktop Entry" }, + { NULL, catch_all, NULL, NULL }, + { NULL, NULL, NULL, NULL }, + }; + + pa_assert(r); + fn = pa_sprintf_malloc(DESKTOPFILEDIR PA_PATH_SEP "%s.desktop", r->process_name); + + if (stat(fn, &st) < 0) { + r->good = FALSE; + pa_xfree(fn); + return; + } + + if (r->good && st.st_mtime == r->mtime) { + pa_xfree(fn); + return; + } + + r->good = TRUE; + r->mtime = st.st_mtime; + pa_xfree(r->application_name); + pa_xfree(r->icon_name); + pa_xfree(r->role); + r->application_name = r->icon_name = r->role = NULL; + if (r->proplist) + pa_proplist_clear(r->proplist); + + table[0].data = &r->application_name; + table[1].data = &r->icon_name; + + if (pa_config_parse(fn, NULL, table, r) < 0) + pa_log_warn("Failed to parse .desktop file %s.", fn); + + pa_xfree(fn); +} + +static void apply_rule(struct rule *r, pa_proplist *p) { + pa_assert(r); + pa_assert(p); + + if (!r->good) + return; + + if (r->proplist) + pa_proplist_update(p, PA_UPDATE_MERGE, r->proplist); + + if (r->icon_name) + if (!pa_proplist_contains(p, PA_PROP_APPLICATION_ICON_NAME)) + pa_proplist_sets(p, PA_PROP_APPLICATION_ICON_NAME, r->icon_name); + + if (r->application_name) { + const char *t; + + t = pa_proplist_gets(p, PA_PROP_APPLICATION_NAME); + + if (!t || pa_streq(t, r->process_name)) + pa_proplist_sets(p, PA_PROP_APPLICATION_NAME, r->application_name); + } + + if (r->role) + if (!pa_proplist_contains(p, PA_PROP_MEDIA_ROLE)) + pa_proplist_sets(p, PA_PROP_MEDIA_ROLE, r->role); +} + +static void make_room(pa_hashmap *cache) { + pa_assert(cache); + + while (pa_hashmap_size(cache) >= MAX_CACHE_SIZE) { + struct rule *r; + + pa_assert_se(r = pa_hashmap_steal_first(cache)); + rule_free(r); + } +} + +static pa_hook_result_t process(struct userdata *u, pa_proplist *p) { + struct rule *r; + time_t now; + const char *pn; + + pa_assert(u); + pa_assert(p); + + if (!(pn = pa_proplist_gets(p, PA_PROP_APPLICATION_PROCESS_BINARY))) + return PA_HOOK_OK; + + if (*pn == '.' || strchr(pn, '/')) + return PA_HOOK_OK; + + time(&now); + + pa_log_debug("Looking for .desktop file for %s", pn); + + if ((r = pa_hashmap_get(u->cache, pn))) { + if (now-r->timestamp > STAT_INTERVAL) { + r->timestamp = now; + update_rule(r); + } + } else { + make_room(u->cache); + + r = pa_xnew0(struct rule, 1); + r->process_name = pa_xstrdup(pn); + r->timestamp = now; + pa_hashmap_put(u->cache, r->process_name, r); + update_rule(r); + } + + apply_rule(r, p); + return PA_HOOK_OK; +} + +static pa_hook_result_t client_new_cb(pa_core *core, pa_client_new_data *data, struct userdata *u) { + pa_core_assert_ref(core); + pa_assert(data); + pa_assert(u); + + return process(u, data->proplist); +} + +static pa_hook_result_t client_proplist_changed_cb(pa_core *core, pa_client *client, struct userdata *u) { + pa_core_assert_ref(core); + pa_assert(client); + pa_assert(u); + + return process(u, client->proplist); +} + +int pa__init(pa_module *m) { + pa_modargs *ma = NULL; + struct userdata *u; + + pa_assert(m); + + if (!(ma = pa_modargs_new(m->argument, valid_modargs))) { + pa_log("Failed to parse module arguments"); + goto fail; + } + + m->userdata = u = pa_xnew(struct userdata, 1); + + u->cache = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func); + u->client_new_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_CLIENT_NEW], PA_HOOK_EARLY, (pa_hook_cb_t) client_new_cb, u); + u->client_proplist_changed_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_CLIENT_PROPLIST_CHANGED], PA_HOOK_EARLY, (pa_hook_cb_t) client_proplist_changed_cb, u); + + pa_modargs_free(ma); + + return 0; + +fail: + pa__done(m); + + if (ma) + pa_modargs_free(ma); + + return -1; +} + +void pa__done(pa_module *m) { + struct userdata* u; + + pa_assert(m); + + if (!(u = m->userdata)) + return; + + if (u->client_new_slot) + pa_hook_slot_free(u->client_new_slot); + if (u->client_proplist_changed_slot) + pa_hook_slot_free(u->client_proplist_changed_slot); + + if (u->cache) { + struct rule *r; + + while ((r = pa_hashmap_steal_first(u->cache))) + rule_free(r); + + pa_hashmap_free(u->cache, NULL, NULL); + } + + pa_xfree(u); +} diff --git a/src/modules/module-card-restore-symdef.h b/src/modules/module-card-restore-symdef.h new file mode 100644 index 0000000..fcb0680 --- /dev/null +++ b/src/modules/module-card-restore-symdef.h @@ -0,0 +1,29 @@ +#ifndef foomodulecardrestoresymdeffoo +#define foomodulecardrestoresymdeffoo + +#include +#include +#include + +#define pa__init module_card_restore_LTX_pa__init +#define pa__done module_card_restore_LTX_pa__done +#define pa__get_author module_card_restore_LTX_pa__get_author +#define pa__get_description module_card_restore_LTX_pa__get_description +#define pa__get_usage module_card_restore_LTX_pa__get_usage +#define pa__get_version module_card_restore_LTX_pa__get_version +#define pa__get_deprecated module_card_restore_LTX_pa__get_deprecated +#define pa__load_once module_card_restore_LTX_pa__load_once +#define pa__get_n_used module_card_restore_LTX_pa__get_n_used + +int pa__init(pa_module*m); +void pa__done(pa_module*m); +int pa__get_n_used(pa_module*m); + +const char* pa__get_author(void); +const char* pa__get_description(void); +const char* pa__get_usage(void); +const char* pa__get_version(void); +const char* pa__get_deprecated(void); +pa_bool_t pa__load_once(void); + +#endif diff --git a/src/modules/module-card-restore.c b/src/modules/module-card-restore.c new file mode 100644 index 0000000..7dea94f --- /dev/null +++ b/src/modules/module-card-restore.c @@ -0,0 +1,278 @@ +/*** + This file is part of PulseAudio. + + Copyright 2006-2008 Lennart Poettering + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "module-card-restore-symdef.h" + +PA_MODULE_AUTHOR("Lennart Poettering"); +PA_MODULE_DESCRIPTION("Automatically restore profile of cards"); +PA_MODULE_VERSION(PACKAGE_VERSION); +PA_MODULE_LOAD_ONCE(TRUE); + +#define SAVE_INTERVAL (10 * PA_USEC_PER_SEC) + +static const char* const valid_modargs[] = { + NULL +}; + +struct userdata { + pa_core *core; + pa_module *module; + pa_subscription *subscription; + pa_hook_slot *card_new_hook_slot; + pa_time_event *save_time_event; + pa_database *database; +}; + +#define ENTRY_VERSION 1 + +struct entry { + uint8_t version; + char profile[PA_NAME_MAX]; +} PA_GCC_PACKED ; + +static void save_time_callback(pa_mainloop_api*a, pa_time_event* e, const struct timeval *t, void *userdata) { + struct userdata *u = userdata; + + pa_assert(a); + pa_assert(e); + pa_assert(u); + + pa_assert(e == u->save_time_event); + u->core->mainloop->time_free(u->save_time_event); + u->save_time_event = NULL; + + pa_database_sync(u->database); + pa_log_info("Synced."); +} + +static struct entry* read_entry(struct userdata *u, const char *name) { + pa_datum key, data; + struct entry *e; + + pa_assert(u); + pa_assert(name); + + key.data = (char*) name; + key.size = strlen(name); + + pa_zero(data); + + if (!pa_database_get(u->database, &key, &data)) + goto fail; + + if (data.size != sizeof(struct entry)) { + pa_log_debug("Database contains entry for card %s of wrong size %lu != %lu. Probably due to upgrade, ignoring.", name, (unsigned long) data.size, (unsigned long) sizeof(struct entry)); + goto fail; + } + + e = (struct entry*) data.data; + + if (e->version != ENTRY_VERSION) { + pa_log_debug("Version of database entry for card %s doesn't match our version. Probably due to upgrade, ignoring.", name); + goto fail; + } + + if (!memchr(e->profile, 0, sizeof(e->profile))) { + pa_log_warn("Database contains entry for card %s with missing NUL byte in profile name", name); + goto fail; + } + + return e; + +fail: + + pa_datum_free(&data); + return NULL; +} + +static void trigger_save(struct userdata *u) { + if (u->save_time_event) + return; + + u->save_time_event = pa_core_rttime_new(u->core, pa_rtclock_now() + SAVE_INTERVAL, save_time_callback, u); +} + +static void subscribe_callback(pa_core *c, pa_subscription_event_type_t t, uint32_t idx, void *userdata) { + struct userdata *u = userdata; + struct entry entry, *old; + pa_datum key, data; + pa_card *card; + + pa_assert(c); + pa_assert(u); + + if (t != (PA_SUBSCRIPTION_EVENT_CARD|PA_SUBSCRIPTION_EVENT_NEW) && + t != (PA_SUBSCRIPTION_EVENT_CARD|PA_SUBSCRIPTION_EVENT_CHANGE)) + return; + + pa_zero(entry); + entry.version = ENTRY_VERSION; + + if (!(card = pa_idxset_get_by_index(c->cards, idx))) + return; + + if (!card->save_profile) + return; + + pa_strlcpy(entry.profile, card->active_profile ? card->active_profile->name : "", sizeof(entry.profile)); + + if ((old = read_entry(u, card->name))) { + + if (strncmp(old->profile, entry.profile, sizeof(entry.profile)) == 0) { + pa_xfree(old); + return; + } + + pa_xfree(old); + } + + key.data = card->name; + key.size = strlen(card->name); + + data.data = &entry; + data.size = sizeof(entry); + + pa_log_info("Storing profile for card %s.", card->name); + + pa_database_set(u->database, &key, &data, TRUE); + + trigger_save(u); +} + +static pa_hook_result_t card_new_hook_callback(pa_core *c, pa_card_new_data *new_data, struct userdata *u) { + struct entry *e; + + pa_assert(new_data); + + if ((e = read_entry(u, new_data->name)) && e->profile[0]) { + + if (!new_data->active_profile) { + pa_log_info("Restoring profile for card %s.", new_data->name); + pa_card_new_data_set_profile(new_data, e->profile); + new_data->save_profile = TRUE; + } else + pa_log_debug("Not restoring profile for card %s, because already set.", new_data->name); + + pa_xfree(e); + } + + return PA_HOOK_OK; +} + +int pa__init(pa_module*m) { + pa_modargs *ma = NULL; + struct userdata *u; + char *fname; + pa_card *card; + uint32_t idx; + + pa_assert(m); + + if (!(ma = pa_modargs_new(m->argument, valid_modargs))) { + pa_log("Failed to parse module arguments"); + goto fail; + } + + m->userdata = u = pa_xnew0(struct userdata, 1); + u->core = m->core; + u->module = m; + + u->subscription = pa_subscription_new(m->core, PA_SUBSCRIPTION_MASK_CARD, subscribe_callback, u); + + u->card_new_hook_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_CARD_NEW], PA_HOOK_EARLY, (pa_hook_cb_t) card_new_hook_callback, u); + + if (!(fname = pa_state_path("card-database", TRUE))) + goto fail; + + if (!(u->database = pa_database_open(fname, TRUE))) { + pa_log("Failed to open volume database '%s': %s", fname, pa_cstrerror(errno)); + pa_xfree(fname); + goto fail; + } + + pa_log_info("Sucessfully opened database file '%s'.", fname); + pa_xfree(fname); + + for (card = pa_idxset_first(m->core->cards, &idx); card; card = pa_idxset_next(m->core->cards, &idx)) + subscribe_callback(m->core, PA_SUBSCRIPTION_EVENT_CARD|PA_SUBSCRIPTION_EVENT_NEW, card->index, u); + + pa_modargs_free(ma); + return 0; + +fail: + pa__done(m); + + if (ma) + pa_modargs_free(ma); + + return -1; +} + +void pa__done(pa_module*m) { + struct userdata* u; + + pa_assert(m); + + if (!(u = m->userdata)) + return; + + if (u->subscription) + pa_subscription_free(u->subscription); + + if (u->card_new_hook_slot) + pa_hook_slot_free(u->card_new_hook_slot); + + if (u->save_time_event) + u->core->mainloop->time_free(u->save_time_event); + + if (u->database) + pa_database_close(u->database); + + pa_xfree(u); +} diff --git a/src/modules/module-cli-protocol-tcp-symdef.h b/src/modules/module-cli-protocol-tcp-symdef.h new file mode 100644 index 0000000..a839177 --- /dev/null +++ b/src/modules/module-cli-protocol-tcp-symdef.h @@ -0,0 +1,29 @@ +#ifndef foomodulecliprotocoltcpsymdeffoo +#define foomodulecliprotocoltcpsymdeffoo + +#include +#include +#include + +#define pa__init module_cli_protocol_tcp_LTX_pa__init +#define pa__done module_cli_protocol_tcp_LTX_pa__done +#define pa__get_author module_cli_protocol_tcp_LTX_pa__get_author +#define pa__get_description module_cli_protocol_tcp_LTX_pa__get_description +#define pa__get_usage module_cli_protocol_tcp_LTX_pa__get_usage +#define pa__get_version module_cli_protocol_tcp_LTX_pa__get_version +#define pa__get_deprecated module_cli_protocol_tcp_LTX_pa__get_deprecated +#define pa__load_once module_cli_protocol_tcp_LTX_pa__load_once +#define pa__get_n_used module_cli_protocol_tcp_LTX_pa__get_n_used + +int pa__init(pa_module*m); +void pa__done(pa_module*m); +int pa__get_n_used(pa_module*m); + +const char* pa__get_author(void); +const char* pa__get_description(void); +const char* pa__get_usage(void); +const char* pa__get_version(void); +const char* pa__get_deprecated(void); +pa_bool_t pa__load_once(void); + +#endif diff --git a/src/modules/module-cli-protocol-unix-symdef.h b/src/modules/module-cli-protocol-unix-symdef.h new file mode 100644 index 0000000..add1e60 --- /dev/null +++ b/src/modules/module-cli-protocol-unix-symdef.h @@ -0,0 +1,29 @@ +#ifndef foomodulecliprotocolunixsymdeffoo +#define foomodulecliprotocolunixsymdeffoo + +#include +#include +#include + +#define pa__init module_cli_protocol_unix_LTX_pa__init +#define pa__done module_cli_protocol_unix_LTX_pa__done +#define pa__get_author module_cli_protocol_unix_LTX_pa__get_author +#define pa__get_description module_cli_protocol_unix_LTX_pa__get_description +#define pa__get_usage module_cli_protocol_unix_LTX_pa__get_usage +#define pa__get_version module_cli_protocol_unix_LTX_pa__get_version +#define pa__get_deprecated module_cli_protocol_unix_LTX_pa__get_deprecated +#define pa__load_once module_cli_protocol_unix_LTX_pa__load_once +#define pa__get_n_used module_cli_protocol_unix_LTX_pa__get_n_used + +int pa__init(pa_module*m); +void pa__done(pa_module*m); +int pa__get_n_used(pa_module*m); + +const char* pa__get_author(void); +const char* pa__get_description(void); +const char* pa__get_usage(void); +const char* pa__get_version(void); +const char* pa__get_deprecated(void); +pa_bool_t pa__load_once(void); + +#endif diff --git a/src/modules/module-cli-symdef.h b/src/modules/module-cli-symdef.h new file mode 100644 index 0000000..a7d7e3d --- /dev/null +++ b/src/modules/module-cli-symdef.h @@ -0,0 +1,29 @@ +#ifndef foomoduleclisymdeffoo +#define foomoduleclisymdeffoo + +#include +#include +#include + +#define pa__init module_cli_LTX_pa__init +#define pa__done module_cli_LTX_pa__done +#define pa__get_author module_cli_LTX_pa__get_author +#define pa__get_description module_cli_LTX_pa__get_description +#define pa__get_usage module_cli_LTX_pa__get_usage +#define pa__get_version module_cli_LTX_pa__get_version +#define pa__get_deprecated module_cli_LTX_pa__get_deprecated +#define pa__load_once module_cli_LTX_pa__load_once +#define pa__get_n_used module_cli_LTX_pa__get_n_used + +int pa__init(pa_module*m); +void pa__done(pa_module*m); +int pa__get_n_used(pa_module*m); + +const char* pa__get_author(void); +const char* pa__get_description(void); +const char* pa__get_usage(void); +const char* pa__get_version(void); +const char* pa__get_deprecated(void); +pa_bool_t pa__load_once(void); + +#endif diff --git a/src/modules/module-cli.c b/src/modules/module-cli.c new file mode 100644 index 0000000..421cb21 --- /dev/null +++ b/src/modules/module-cli.c @@ -0,0 +1,140 @@ +/*** + This file is part of PulseAudio. + + Copyright 2004-2006 Lennart Poettering + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "module-cli-symdef.h" + +PA_MODULE_AUTHOR("Lennart Poettering"); +PA_MODULE_DESCRIPTION("Command line interface"); +PA_MODULE_VERSION(PACKAGE_VERSION); +PA_MODULE_LOAD_ONCE(TRUE); +PA_MODULE_USAGE("exit_on_eof="); + +static const char* const valid_modargs[] = { + "exit_on_eof", + NULL +}; + +static void eof_and_unload_cb(pa_cli*c, void *userdata) { + pa_module *m = userdata; + + pa_assert(c); + pa_assert(m); + + pa_module_unload_request(m, TRUE); +} + +static void eof_and_exit_cb(pa_cli*c, void *userdata) { + pa_module *m = userdata; + + pa_assert(c); + pa_assert(m); + + pa_core_exit(m->core, FALSE, 0); +} + +int pa__init(pa_module*m) { + pa_iochannel *io; + pa_modargs *ma; + pa_bool_t exit_on_eof = FALSE; + int fd; + + pa_assert(m); + + if (m->core->running_as_daemon) { + pa_log_info("Running as daemon, refusing to load this module."); + return 0; + } + + if (!(ma = pa_modargs_new(m->argument, valid_modargs))) { + pa_log("failed to parse module arguments."); + goto fail; + } + + if (pa_modargs_get_value_boolean(ma, "exit_on_eof", &exit_on_eof) < 0) { + pa_log("exit_on_eof= expects boolean argument."); + goto fail; + } + + if (pa_stdio_acquire() < 0) { + pa_log("STDIN/STDOUT already in use."); + goto fail; + } + + /* We try to open the controlling tty anew here. This has the + * benefit of giving us a new fd that doesn't share the O_NDELAY + * flag with fds 0, 1, or 2. Since pa_iochannel_xxx needs O_NDELAY + * on its fd using those fds directly could set O_NDELAY which + * fprintf() doesn't really like, resulting in truncated output + * of log messages, particularly because if stdout and stderr are + * dup'ed they share the same O_NDELAY, too. */ + + if ((fd = open("/dev/tty", O_RDWR|O_NONBLOCK)) >= 0) { + pa_make_fd_cloexec(fd); + io = pa_iochannel_new(m->core->mainloop, fd, fd); + pa_log_debug("Managed to open /dev/tty."); + } else { + io = pa_iochannel_new(m->core->mainloop, STDIN_FILENO, STDOUT_FILENO); + pa_iochannel_set_noclose(io, TRUE); + pa_log_debug("Failed to open /dev/tty, using stdin/stdout fds instead."); + } + + m->userdata = pa_cli_new(m->core, io, m); + pa_cli_set_eof_callback(m->userdata, exit_on_eof ? eof_and_exit_cb : eof_and_unload_cb, m); + + pa_modargs_free(ma); + + return 0; + +fail: + + if (ma) + pa_modargs_free(ma); + + return -1; +} + +void pa__done(pa_module*m) { + pa_assert(m); + + if (m->userdata) { + pa_cli_free(m->userdata); + pa_stdio_release(); + } +} diff --git a/src/modules/module-combine-symdef.h b/src/modules/module-combine-symdef.h new file mode 100644 index 0000000..8b10a42 --- /dev/null +++ b/src/modules/module-combine-symdef.h @@ -0,0 +1,29 @@ +#ifndef foomodulecombinesymdeffoo +#define foomodulecombinesymdeffoo + +#include +#include +#include + +#define pa__init module_combine_LTX_pa__init +#define pa__done module_combine_LTX_pa__done +#define pa__get_author module_combine_LTX_pa__get_author +#define pa__get_description module_combine_LTX_pa__get_description +#define pa__get_usage module_combine_LTX_pa__get_usage +#define pa__get_version module_combine_LTX_pa__get_version +#define pa__get_deprecated module_combine_LTX_pa__get_deprecated +#define pa__load_once module_combine_LTX_pa__load_once +#define pa__get_n_used module_combine_LTX_pa__get_n_used + +int pa__init(pa_module*m); +void pa__done(pa_module*m); +int pa__get_n_used(pa_module*m); + +const char* pa__get_author(void); +const char* pa__get_description(void); +const char* pa__get_usage(void); +const char* pa__get_version(void); +const char* pa__get_deprecated(void); +pa_bool_t pa__load_once(void); + +#endif diff --git a/src/modules/module-combine.c b/src/modules/module-combine.c new file mode 100644 index 0000000..cffb901 --- /dev/null +++ b/src/modules/module-combine.c @@ -0,0 +1,1383 @@ +/*** + This file is part of PulseAudio. + + Copyright 2004-2008 Lennart Poettering + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "module-combine-symdef.h" + +PA_MODULE_AUTHOR("Lennart Poettering"); +PA_MODULE_DESCRIPTION("Combine multiple sinks to one"); +PA_MODULE_VERSION(PACKAGE_VERSION); +PA_MODULE_LOAD_ONCE(FALSE); +PA_MODULE_USAGE( + "sink_name= " + "sink_properties= " + "slaves= " + "adjust_time= " + "resample_method= " + "format= " + "rate= " + "channels= " + "channel_map="); + +#define DEFAULT_SINK_NAME "combined" + +#define MEMBLOCKQ_MAXLENGTH (1024*1024*16) + +#define DEFAULT_ADJUST_TIME_USEC (10*PA_USEC_PER_SEC) + +#define BLOCK_USEC (PA_USEC_PER_MSEC * 200) + +static const char* const valid_modargs[] = { + "sink_name", + "sink_properties", + "slaves", + "adjust_time", + "resample_method", + "format", + "rate", + "channels", + "channel_map", + NULL +}; + +struct output { + struct userdata *userdata; + + pa_sink *sink; + pa_sink_input *sink_input; + pa_bool_t ignore_state_change; + + pa_asyncmsgq *inq, /* Message queue from the sink thread to this sink input */ + *outq; /* Message queue from this sink input to the sink thread */ + pa_rtpoll_item *inq_rtpoll_item_read, *inq_rtpoll_item_write; + pa_rtpoll_item *outq_rtpoll_item_read, *outq_rtpoll_item_write; + + pa_memblockq *memblockq; + + /* For communication of the stream latencies to the main thread */ + pa_usec_t total_latency; + + /* For coomunication of the stream parameters to the sink thread */ + pa_atomic_t max_request; + pa_atomic_t requested_latency; + + PA_LLIST_FIELDS(struct output); +}; + +struct userdata { + pa_core *core; + pa_module *module; + pa_sink *sink; + + pa_thread *thread; + pa_thread_mq thread_mq; + pa_rtpoll *rtpoll; + + pa_time_event *time_event; + pa_usec_t adjust_time; + + pa_bool_t automatic; + pa_bool_t auto_desc; + + pa_hook_slot *sink_put_slot, *sink_unlink_slot, *sink_state_changed_slot; + + pa_resample_method_t resample_method; + + pa_usec_t block_usec; + + pa_idxset* outputs; /* managed in main context */ + + struct { + PA_LLIST_HEAD(struct output, active_outputs); /* managed in IO thread context */ + pa_atomic_t running; /* we cache that value here, so that every thread can query it cheaply */ + pa_usec_t timestamp; + pa_bool_t in_null_mode; + pa_smoother *smoother; + uint64_t counter; + } thread_info; +}; + +enum { + SINK_MESSAGE_ADD_OUTPUT = PA_SINK_MESSAGE_MAX, + SINK_MESSAGE_REMOVE_OUTPUT, + SINK_MESSAGE_NEED, + SINK_MESSAGE_UPDATE_LATENCY, + SINK_MESSAGE_UPDATE_MAX_REQUEST, + SINK_MESSAGE_UPDATE_REQUESTED_LATENCY +}; + +enum { + SINK_INPUT_MESSAGE_POST = PA_SINK_INPUT_MESSAGE_MAX, +}; + +static void output_disable(struct output *o); +static void output_enable(struct output *o); +static void output_free(struct output *o); +static int output_create_sink_input(struct output *o); + +static void adjust_rates(struct userdata *u) { + struct output *o; + pa_usec_t max_sink_latency = 0, min_total_latency = (pa_usec_t) -1, target_latency, avg_total_latency = 0; + uint32_t base_rate; + uint32_t idx; + unsigned n = 0; + + pa_assert(u); + pa_sink_assert_ref(u->sink); + + if (pa_idxset_size(u->outputs) <= 0) + return; + + if (!PA_SINK_IS_OPENED(pa_sink_get_state(u->sink))) + return; + + PA_IDXSET_FOREACH(o, u->outputs, idx) { + pa_usec_t sink_latency; + + if (!o->sink_input || !PA_SINK_IS_OPENED(pa_sink_get_state(o->sink))) + continue; + + o->total_latency = pa_sink_input_get_latency(o->sink_input, &sink_latency); + o->total_latency += sink_latency; + + if (sink_latency > max_sink_latency) + max_sink_latency = sink_latency; + + if (min_total_latency == (pa_usec_t) -1 || o->total_latency < min_total_latency) + min_total_latency = o->total_latency; + + avg_total_latency += o->total_latency; + n++; + + pa_log_debug("[%s] total=%0.2fms sink=%0.2fms ", o->sink->name, (double) o->total_latency / PA_USEC_PER_MSEC, (double) sink_latency / PA_USEC_PER_MSEC); + + if (o->total_latency > 10*PA_USEC_PER_SEC) + pa_log_warn("[%s] Total latency of output is very high (%0.2fms), most likely the audio timing in one of your drivers is broken.", o->sink->name, (double) o->total_latency / PA_USEC_PER_MSEC); + } + + if (min_total_latency == (pa_usec_t) -1) + return; + + avg_total_latency /= n; + + target_latency = max_sink_latency > min_total_latency ? max_sink_latency : min_total_latency; + + pa_log_info("[%s] avg total latency is %0.2f msec.", u->sink->name, (double) avg_total_latency / PA_USEC_PER_MSEC); + pa_log_info("[%s] target latency is %0.2f msec.", u->sink->name, (double) target_latency / PA_USEC_PER_MSEC); + + base_rate = u->sink->sample_spec.rate; + + PA_IDXSET_FOREACH(o, u->outputs, idx) { + uint32_t r = base_rate; + + if (!o->sink_input || !PA_SINK_IS_OPENED(pa_sink_get_state(o->sink))) + continue; + + if (o->total_latency < target_latency) + r -= (uint32_t) ((((double) (target_latency - o->total_latency))/(double)u->adjust_time)*(double)r); + else if (o->total_latency > target_latency) + r += (uint32_t) ((((double) (o->total_latency - target_latency))/(double)u->adjust_time)*(double)r); + + if (r < (uint32_t) (base_rate*0.9) || r > (uint32_t) (base_rate*1.1)) { + pa_log_warn("[%s] sample rates too different, not adjusting (%u vs. %u).", o->sink_input->sink->name, base_rate, r); + pa_sink_input_set_rate(o->sink_input, base_rate); + } else { + pa_log_info("[%s] new rate is %u Hz; ratio is %0.3f; latency is %0.0f usec.", o->sink_input->sink->name, r, (double) r / base_rate, (float) o->total_latency); + pa_sink_input_set_rate(o->sink_input, r); + } + } + + pa_asyncmsgq_send(u->sink->asyncmsgq, PA_MSGOBJECT(u->sink), SINK_MESSAGE_UPDATE_LATENCY, NULL, (int64_t) avg_total_latency, NULL); +} + +static void time_callback(pa_mainloop_api *a, pa_time_event *e, const struct timeval *t, void *userdata) { + struct userdata *u = userdata; + + pa_assert(u); + pa_assert(a); + pa_assert(u->time_event == e); + + adjust_rates(u); + + pa_core_rttime_restart(u->core, e, pa_rtclock_now() + u->adjust_time); +} + +static void process_render_null(struct userdata *u, pa_usec_t now) { + size_t ate = 0; + pa_assert(u); + + if (u->thread_info.in_null_mode) + u->thread_info.timestamp = now; + + while (u->thread_info.timestamp < now + u->block_usec) { + pa_memchunk chunk; + + pa_sink_render(u->sink, u->sink->thread_info.max_request, &chunk); + pa_memblock_unref(chunk.memblock); + + u->thread_info.counter += chunk.length; + +/* pa_log_debug("Ate %lu bytes.", (unsigned long) chunk.length); */ + u->thread_info.timestamp += pa_bytes_to_usec(chunk.length, &u->sink->sample_spec); + + ate += chunk.length; + + if (ate >= u->sink->thread_info.max_request) + break; + } + +/* pa_log_debug("Ate in sum %lu bytes (of %lu)", (unsigned long) ate, (unsigned long) nbytes); */ + + pa_smoother_put(u->thread_info.smoother, now, + pa_bytes_to_usec(u->thread_info.counter, &u->sink->sample_spec) - (u->thread_info.timestamp - now)); +} + +static void thread_func(void *userdata) { + struct userdata *u = userdata; + + pa_assert(u); + + pa_log_debug("Thread starting up"); + + if (u->core->realtime_scheduling) + pa_make_realtime(u->core->realtime_priority+1); + + pa_thread_mq_install(&u->thread_mq); + + u->thread_info.timestamp = pa_rtclock_now(); + u->thread_info.in_null_mode = FALSE; + + for (;;) { + int ret; + + if (PA_SINK_IS_OPENED(u->sink->thread_info.state)) + if (u->sink->thread_info.rewind_requested) + pa_sink_process_rewind(u->sink, 0); + + /* If no outputs are connected, render some data and drop it immediately. */ + if (PA_SINK_IS_OPENED(u->sink->thread_info.state) && !u->thread_info.active_outputs) { + pa_usec_t now; + + now = pa_rtclock_now(); + + if (!u->thread_info.in_null_mode || u->thread_info.timestamp <= now) + process_render_null(u, now); + + pa_rtpoll_set_timer_absolute(u->rtpoll, u->thread_info.timestamp); + u->thread_info.in_null_mode = TRUE; + } else { + pa_rtpoll_set_timer_disabled(u->rtpoll); + u->thread_info.in_null_mode = FALSE; + } + + /* Hmm, nothing to do. Let's sleep */ + if ((ret = pa_rtpoll_run(u->rtpoll, TRUE)) < 0) { + pa_log_info("pa_rtpoll_run() = %i", ret); + goto fail; + } + + if (ret == 0) + goto finish; + } + +fail: + /* If this was no regular exit from the loop we have to continue + * processing messages until we received PA_MESSAGE_SHUTDOWN */ + pa_asyncmsgq_post(u->thread_mq.outq, PA_MSGOBJECT(u->core), PA_CORE_MESSAGE_UNLOAD_MODULE, u->module, 0, NULL, NULL); + pa_asyncmsgq_wait_for(u->thread_mq.inq, PA_MESSAGE_SHUTDOWN); + +finish: + pa_log_debug("Thread shutting down"); +} + +/* Called from I/O thread context */ +static void render_memblock(struct userdata *u, struct output *o, size_t length) { + pa_assert(u); + pa_assert(o); + + /* We are run by the sink thread, on behalf of an output (o). The + * output is waiting for us, hence it is safe to access its + * mainblockq and asyncmsgq directly. */ + + /* If we are not running, we cannot produce any data */ + if (!pa_atomic_load(&u->thread_info.running)) + return; + + /* Maybe there's some data in the requesting output's queue + * now? */ + while (pa_asyncmsgq_process_one(o->inq) > 0) + ; + + /* Ok, now let's prepare some data if we really have to */ + while (!pa_memblockq_is_readable(o->memblockq)) { + struct output *j; + pa_memchunk chunk; + + /* Render data! */ + pa_sink_render(u->sink, length, &chunk); + + u->thread_info.counter += chunk.length; + + /* OK, let's send this data to the other threads */ + PA_LLIST_FOREACH(j, u->thread_info.active_outputs) { + if (j == o) + continue; + + pa_asyncmsgq_post(j->inq, PA_MSGOBJECT(j->sink_input), SINK_INPUT_MESSAGE_POST, NULL, 0, &chunk, NULL); + } + + /* And place it directly into the requesting output's queue */ + pa_memblockq_push_align(o->memblockq, &chunk); + pa_memblock_unref(chunk.memblock); + } +} + +/* Called from I/O thread context */ +static void request_memblock(struct output *o, size_t length) { + pa_assert(o); + pa_sink_input_assert_ref(o->sink_input); + pa_sink_assert_ref(o->userdata->sink); + + /* If another thread already prepared some data we received + * the data over the asyncmsgq, hence let's first process + * it. */ + while (pa_asyncmsgq_process_one(o->inq) > 0) + ; + + /* Check whether we're now readable */ + if (pa_memblockq_is_readable(o->memblockq)) + return; + + /* OK, we need to prepare new data, but only if the sink is actually running */ + if (pa_atomic_load(&o->userdata->thread_info.running)) + pa_asyncmsgq_send(o->outq, PA_MSGOBJECT(o->userdata->sink), SINK_MESSAGE_NEED, o, (int64_t) length, NULL); +} + +/* Called from I/O thread context */ +static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk) { + struct output *o; + + pa_sink_input_assert_ref(i); + pa_assert_se(o = i->userdata); + + /* If necessary, get some new data */ + request_memblock(o, nbytes); + + /* pa_log("%s q size is %u + %u (%u/%u)", */ + /* i->sink->name, */ + /* pa_memblockq_get_nblocks(o->memblockq), */ + /* pa_memblockq_get_nblocks(i->thread_info.render_memblockq), */ + /* pa_memblockq_get_maxrewind(o->memblockq), */ + /* pa_memblockq_get_maxrewind(i->thread_info.render_memblockq)); */ + + if (pa_memblockq_peek(o->memblockq, chunk) < 0) + return -1; + + pa_memblockq_drop(o->memblockq, chunk->length); + + return 0; +} + +/* Called from I/O thread context */ +static void sink_input_process_rewind_cb(pa_sink_input *i, size_t nbytes) { + struct output *o; + + pa_sink_input_assert_ref(i); + pa_assert_se(o = i->userdata); + + pa_memblockq_rewind(o->memblockq, nbytes); +} + +/* Called from I/O thread context */ +static void sink_input_update_max_rewind_cb(pa_sink_input *i, size_t nbytes) { + struct output *o; + + pa_sink_input_assert_ref(i); + pa_assert_se(o = i->userdata); + + pa_memblockq_set_maxrewind(o->memblockq, nbytes); +} + +/* Called from I/O thread context */ +static void sink_input_update_max_request_cb(pa_sink_input *i, size_t nbytes) { + struct output *o; + + pa_sink_input_assert_ref(i); + pa_assert_se(o = i->userdata); + + if (pa_atomic_load(&o->max_request) == (int) nbytes) + return; + + pa_atomic_store(&o->max_request, (int) nbytes); + pa_asyncmsgq_post(o->outq, PA_MSGOBJECT(o->userdata->sink), SINK_MESSAGE_UPDATE_MAX_REQUEST, NULL, 0, NULL, NULL); +} + +/* Called from thread context */ +static void sink_input_update_sink_requested_latency_cb(pa_sink_input *i) { + struct output *o; + pa_usec_t c; + + pa_assert(i); + + pa_sink_input_assert_ref(i); + pa_assert_se(o = i->userdata); + + c = pa_sink_get_requested_latency_within_thread(i->sink); + + if (c == (pa_usec_t) -1) + c = i->sink->thread_info.max_latency; + + if (pa_atomic_load(&o->requested_latency) == (int) c) + return; + + pa_atomic_store(&o->requested_latency, (int) c); + pa_asyncmsgq_post(o->outq, PA_MSGOBJECT(o->userdata->sink), SINK_MESSAGE_UPDATE_REQUESTED_LATENCY, NULL, 0, NULL, NULL); +} + +/* Called from I/O thread context */ +static void sink_input_attach_cb(pa_sink_input *i) { + struct output *o; + pa_usec_t c; + + pa_sink_input_assert_ref(i); + pa_assert_se(o = i->userdata); + + /* Set up the queue from the sink thread to us */ + pa_assert(!o->inq_rtpoll_item_read && !o->outq_rtpoll_item_write); + + o->inq_rtpoll_item_read = pa_rtpoll_item_new_asyncmsgq_read( + i->sink->thread_info.rtpoll, + PA_RTPOLL_LATE, /* This one is not that important, since we check for data in _peek() anyway. */ + o->inq); + + o->outq_rtpoll_item_write = pa_rtpoll_item_new_asyncmsgq_write( + i->sink->thread_info.rtpoll, + PA_RTPOLL_EARLY, + o->outq); + + pa_sink_input_request_rewind(i, 0, FALSE, TRUE, TRUE); + + pa_atomic_store(&o->max_request, (int) pa_sink_input_get_max_request(i)); + + c = pa_sink_get_requested_latency_within_thread(i->sink); + pa_atomic_store(&o->requested_latency, (int) (c == (pa_usec_t) -1 ? 0 : c)); + + pa_asyncmsgq_post(o->outq, PA_MSGOBJECT(o->userdata->sink), SINK_MESSAGE_UPDATE_MAX_REQUEST, NULL, 0, NULL, NULL); + pa_asyncmsgq_post(o->outq, PA_MSGOBJECT(o->userdata->sink), SINK_MESSAGE_UPDATE_REQUESTED_LATENCY, NULL, 0, NULL, NULL); +} + +/* Called from I/O thread context */ +static void sink_input_detach_cb(pa_sink_input *i) { + struct output *o; + + pa_sink_input_assert_ref(i); + pa_assert_se(o = i->userdata); + + if (o->inq_rtpoll_item_read) { + pa_rtpoll_item_free(o->inq_rtpoll_item_read); + o->inq_rtpoll_item_read = NULL; + } + + if (o->outq_rtpoll_item_write) { + pa_rtpoll_item_free(o->outq_rtpoll_item_write); + o->outq_rtpoll_item_write = NULL; + } +} + +/* Called from main context */ +static void sink_input_kill_cb(pa_sink_input *i) { + struct output *o; + + pa_sink_input_assert_ref(i); + pa_assert_se(o = i->userdata); + + pa_module_unload_request(o->userdata->module, TRUE); + output_free(o); +} + +/* Called from thread context */ +static int sink_input_process_msg(pa_msgobject *obj, int code, void *data, int64_t offset, pa_memchunk *chunk) { + struct output *o = PA_SINK_INPUT(obj)->userdata; + + switch (code) { + + case PA_SINK_INPUT_MESSAGE_GET_LATENCY: { + pa_usec_t *r = data; + + *r = pa_bytes_to_usec(pa_memblockq_get_length(o->memblockq), &o->sink_input->sample_spec); + + /* Fall through, the default handler will add in the extra + * latency added by the resampler */ + break; + } + + case SINK_INPUT_MESSAGE_POST: + + if (PA_SINK_IS_OPENED(o->sink_input->sink->thread_info.state)) + pa_memblockq_push_align(o->memblockq, chunk); + else + pa_memblockq_flush_write(o->memblockq, TRUE); + + return 0; + } + + return pa_sink_input_process_msg(obj, code, data, offset, chunk); +} + +/* Called from main context */ +static void suspend(struct userdata *u) { + struct output *o; + uint32_t idx; + + pa_assert(u); + + /* Let's suspend by unlinking all streams */ + PA_IDXSET_FOREACH(o, u->outputs, idx) + output_disable(o); + + pa_log_info("Device suspended..."); +} + +/* Called from main context */ +static void unsuspend(struct userdata *u) { + struct output *o; + uint32_t idx; + + pa_assert(u); + + /* Let's resume */ + PA_IDXSET_FOREACH(o, u->outputs, idx) + output_enable(o); + + pa_log_info("Resumed successfully..."); +} + +/* Called from main context */ +static int sink_set_state(pa_sink *sink, pa_sink_state_t state) { + struct userdata *u; + + pa_sink_assert_ref(sink); + pa_assert_se(u = sink->userdata); + + /* Please note that in contrast to the ALSA modules we call + * suspend/unsuspend from main context here! */ + + switch (state) { + case PA_SINK_SUSPENDED: + pa_assert(PA_SINK_IS_OPENED(pa_sink_get_state(u->sink))); + + suspend(u); + break; + + case PA_SINK_IDLE: + case PA_SINK_RUNNING: + + if (pa_sink_get_state(u->sink) == PA_SINK_SUSPENDED) + unsuspend(u); + + break; + + case PA_SINK_UNLINKED: + case PA_SINK_INIT: + case PA_SINK_INVALID_STATE: + ; + } + + return 0; +} + +/* Called from IO context */ +static void update_max_request(struct userdata *u) { + size_t max_request = 0; + struct output *o; + + pa_assert(u); + pa_sink_assert_io_context(u->sink); + + /* Collects the max_request values of all streams and sets the + * largest one locally */ + + PA_LLIST_FOREACH(o, u->thread_info.active_outputs) { + size_t mr = (size_t) pa_atomic_load(&o->max_request); + + if (mr > max_request) + max_request = mr; + } + + if (max_request <= 0) + max_request = pa_usec_to_bytes(u->block_usec, &u->sink->sample_spec); + + pa_sink_set_max_request_within_thread(u->sink, max_request); +} + +/* Called from IO context */ +static void update_fixed_latency(struct userdata *u) { + pa_usec_t fixed_latency = 0; + struct output *o; + + pa_assert(u); + pa_sink_assert_io_context(u->sink); + + /* Collects the requested_latency values of all streams and sets + * the largest one as fixed_latency locally */ + + PA_LLIST_FOREACH(o, u->thread_info.active_outputs) { + pa_usec_t rl = (size_t) pa_atomic_load(&o->requested_latency); + + if (rl > fixed_latency) + fixed_latency = rl; + } + + if (fixed_latency <= 0) + fixed_latency = u->block_usec; + + pa_sink_set_fixed_latency_within_thread(u->sink, fixed_latency); +} + +/* Called from thread context of the io thread */ +static void output_add_within_thread(struct output *o) { + pa_assert(o); + pa_sink_assert_io_context(o->sink); + + PA_LLIST_PREPEND(struct output, o->userdata->thread_info.active_outputs, o); + + pa_assert(!o->outq_rtpoll_item_read && !o->inq_rtpoll_item_write); + + o->outq_rtpoll_item_read = pa_rtpoll_item_new_asyncmsgq_read( + o->userdata->rtpoll, + PA_RTPOLL_EARLY-1, /* This item is very important */ + o->outq); + o->inq_rtpoll_item_write = pa_rtpoll_item_new_asyncmsgq_write( + o->userdata->rtpoll, + PA_RTPOLL_EARLY, + o->inq); +} + +/* Called from thread context of the io thread */ +static void output_remove_within_thread(struct output *o) { + pa_assert(o); + pa_sink_assert_io_context(o->sink); + + PA_LLIST_REMOVE(struct output, o->userdata->thread_info.active_outputs, o); + + if (o->outq_rtpoll_item_read) { + pa_rtpoll_item_free(o->outq_rtpoll_item_read); + o->outq_rtpoll_item_read = NULL; + } + + if (o->inq_rtpoll_item_write) { + pa_rtpoll_item_free(o->inq_rtpoll_item_write); + o->inq_rtpoll_item_write = NULL; + } +} + +/* Called from thread context of the io thread */ +static int sink_process_msg(pa_msgobject *o, int code, void *data, int64_t offset, pa_memchunk *chunk) { + struct userdata *u = PA_SINK(o)->userdata; + + switch (code) { + + case PA_SINK_MESSAGE_SET_STATE: + pa_atomic_store(&u->thread_info.running, PA_PTR_TO_UINT(data) == PA_SINK_RUNNING); + + if (PA_PTR_TO_UINT(data) == PA_SINK_SUSPENDED) + pa_smoother_pause(u->thread_info.smoother, pa_rtclock_now()); + else + pa_smoother_resume(u->thread_info.smoother, pa_rtclock_now(), TRUE); + + break; + + case PA_SINK_MESSAGE_GET_LATENCY: { + pa_usec_t x, y, c, *delay = data; + + x = pa_rtclock_now(); + y = pa_smoother_get(u->thread_info.smoother, x); + + c = pa_bytes_to_usec(u->thread_info.counter, &u->sink->sample_spec); + + if (y < c) + *delay = c - y; + else + *delay = 0; + + return 0; + } + + case SINK_MESSAGE_ADD_OUTPUT: + output_add_within_thread(data); + update_max_request(u); + update_fixed_latency(u); + return 0; + + case SINK_MESSAGE_REMOVE_OUTPUT: + output_remove_within_thread(data); + update_max_request(u); + update_fixed_latency(u); + return 0; + + case SINK_MESSAGE_NEED: + render_memblock(u, (struct output*) data, (size_t) offset); + return 0; + + case SINK_MESSAGE_UPDATE_LATENCY: { + pa_usec_t x, y, latency = (pa_usec_t) offset; + + x = pa_rtclock_now(); + y = pa_bytes_to_usec(u->thread_info.counter, &u->sink->sample_spec); + + if (y > latency) + y -= latency; + else + y = 0; + + pa_smoother_put(u->thread_info.smoother, x, y); + return 0; + } + + case SINK_MESSAGE_UPDATE_MAX_REQUEST: + update_max_request(u); + break; + + case SINK_MESSAGE_UPDATE_REQUESTED_LATENCY: + update_fixed_latency(u); + break; +} + + return pa_sink_process_msg(o, code, data, offset, chunk); +} + +static void update_description(struct userdata *u) { + pa_bool_t first = TRUE; + char *t; + struct output *o; + uint32_t idx; + + pa_assert(u); + + if (!u->auto_desc) + return; + + if (pa_idxset_isempty(u->outputs)) { + pa_sink_set_description(u->sink, "Simultaneous output"); + return; + } + + t = pa_xstrdup("Simultaneous output to"); + + PA_IDXSET_FOREACH(o, u->outputs, idx) { + char *e; + + if (first) { + e = pa_sprintf_malloc("%s %s", t, pa_strnull(pa_proplist_gets(o->sink->proplist, PA_PROP_DEVICE_DESCRIPTION))); + first = FALSE; + } else + e = pa_sprintf_malloc("%s, %s", t, pa_strnull(pa_proplist_gets(o->sink->proplist, PA_PROP_DEVICE_DESCRIPTION))); + + pa_xfree(t); + t = e; + } + + pa_sink_set_description(u->sink, t); + pa_xfree(t); +} + +static int output_create_sink_input(struct output *o) { + pa_sink_input_new_data data; + + pa_assert(o); + + if (o->sink_input) + return 0; + + pa_sink_input_new_data_init(&data); + data.sink = o->sink; + data.driver = __FILE__; + pa_proplist_setf(data.proplist, PA_PROP_MEDIA_NAME, "Simultaneous output on %s", pa_strnull(pa_proplist_gets(o->sink->proplist, PA_PROP_DEVICE_DESCRIPTION))); + pa_proplist_sets(data.proplist, PA_PROP_MEDIA_ROLE, "filter"); + pa_sink_input_new_data_set_sample_spec(&data, &o->userdata->sink->sample_spec); + pa_sink_input_new_data_set_channel_map(&data, &o->userdata->sink->channel_map); + data.module = o->userdata->module; + data.resample_method = o->userdata->resample_method; + data.flags = PA_SINK_INPUT_VARIABLE_RATE|PA_SINK_INPUT_DONT_MOVE|PA_SINK_INPUT_NO_CREATE_ON_SUSPEND; + + pa_sink_input_new(&o->sink_input, o->userdata->core, &data); + + pa_sink_input_new_data_done(&data); + + if (!o->sink_input) + return -1; + + o->sink_input->parent.process_msg = sink_input_process_msg; + o->sink_input->pop = sink_input_pop_cb; + o->sink_input->process_rewind = sink_input_process_rewind_cb; + o->sink_input->update_max_rewind = sink_input_update_max_rewind_cb; + o->sink_input->update_max_request = sink_input_update_max_request_cb; + o->sink_input->update_sink_requested_latency = sink_input_update_sink_requested_latency_cb; + o->sink_input->attach = sink_input_attach_cb; + o->sink_input->detach = sink_input_detach_cb; + o->sink_input->kill = sink_input_kill_cb; + o->sink_input->userdata = o; + + pa_sink_input_set_requested_latency(o->sink_input, BLOCK_USEC); + + return 0; +} + +/* Called from main context */ +static struct output *output_new(struct userdata *u, pa_sink *sink) { + struct output *o; + + pa_assert(u); + pa_assert(sink); + pa_assert(u->sink); + + o = pa_xnew0(struct output, 1); + o->userdata = u; + o->inq = pa_asyncmsgq_new(0); + o->outq = pa_asyncmsgq_new(0); + o->sink = sink; + o->memblockq = pa_memblockq_new( + 0, + MEMBLOCKQ_MAXLENGTH, + MEMBLOCKQ_MAXLENGTH, + pa_frame_size(&u->sink->sample_spec), + 1, + 0, + 0, + &u->sink->silence); + + pa_assert_se(pa_idxset_put(u->outputs, o, NULL) == 0); + update_description(u); + + return o; +} + +/* Called from main context */ +static void output_free(struct output *o) { + pa_assert(o); + + output_disable(o); + + pa_assert_se(pa_idxset_remove_by_data(o->userdata->outputs, o, NULL)); + update_description(o->userdata); + + if (o->inq_rtpoll_item_read) + pa_rtpoll_item_free(o->inq_rtpoll_item_read); + if (o->inq_rtpoll_item_write) + pa_rtpoll_item_free(o->inq_rtpoll_item_write); + + if (o->outq_rtpoll_item_read) + pa_rtpoll_item_free(o->outq_rtpoll_item_read); + if (o->outq_rtpoll_item_write) + pa_rtpoll_item_free(o->outq_rtpoll_item_write); + + if (o->inq) + pa_asyncmsgq_unref(o->inq); + + if (o->outq) + pa_asyncmsgq_unref(o->outq); + + if (o->memblockq) + pa_memblockq_free(o->memblockq); + + pa_xfree(o); +} + +/* Called from main context */ +static void output_enable(struct output *o) { + pa_assert(o); + + if (o->sink_input) + return; + + /* This might cause the sink to be resumed. The state change hook + * of the sink might hence be called from here, which might then + * cause us to be called in a loop. Make sure that state changes + * for this output don't cause this loop by setting a flag here */ + o->ignore_state_change = TRUE; + + if (output_create_sink_input(o) >= 0) { + + if (pa_sink_get_state(o->sink) != PA_SINK_INIT) { + + /* First we register the output. That means that the sink + * will start to pass data to this output. */ + pa_asyncmsgq_send(o->userdata->sink->asyncmsgq, PA_MSGOBJECT(o->userdata->sink), SINK_MESSAGE_ADD_OUTPUT, o, 0, NULL); + + /* Then we enable the sink input. That means that the sink + * is now asked for new data. */ + pa_sink_input_put(o->sink_input); + + } else + /* Hmm the sink is not yet started, do things right here */ + output_add_within_thread(o); + } + + o->ignore_state_change = FALSE; +} + +/* Called from main context */ +static void output_disable(struct output *o) { + pa_assert(o); + + if (!o->sink_input) + return; + + /* First we disable the sink input. That means that the sink is + * not asked for new data anymore */ + pa_sink_input_unlink(o->sink_input); + + /* Then we unregister the output. That means that the sink doesn't + * pass any further data to this output */ + pa_asyncmsgq_send(o->userdata->sink->asyncmsgq, PA_MSGOBJECT(o->userdata->sink), SINK_MESSAGE_REMOVE_OUTPUT, o, 0, NULL); + + /* Now dellocate the stream */ + pa_sink_input_unref(o->sink_input); + o->sink_input = NULL; + + /* Finally, drop all queued data */ + pa_memblockq_flush_write(o->memblockq, TRUE); + pa_asyncmsgq_flush(o->inq, FALSE); + pa_asyncmsgq_flush(o->outq, FALSE); +} + +/* Called from main context */ +static void output_verify(struct output *o) { + pa_assert(o); + + if (PA_SINK_IS_OPENED(pa_sink_get_state(o->userdata->sink))) + output_enable(o); + else + output_disable(o); +} + +/* Called from main context */ +static pa_bool_t is_suitable_sink(struct userdata *u, pa_sink *s) { + const char *t; + + pa_sink_assert_ref(s); + + if (s == u->sink) + return FALSE; + + if (!(s->flags & PA_SINK_HARDWARE)) + return FALSE; + + if (!(s->flags & PA_SINK_LATENCY)) + return FALSE; + + if ((t = pa_proplist_gets(s->proplist, PA_PROP_DEVICE_CLASS))) + if (!pa_streq(t, "sound")) + return FALSE; + + return TRUE; +} + +/* Called from main context */ +static pa_hook_result_t sink_put_hook_cb(pa_core *c, pa_sink *s, struct userdata* u) { + struct output *o; + + pa_core_assert_ref(c); + pa_sink_assert_ref(s); + pa_assert(u); + pa_assert(u->automatic); + + if (!is_suitable_sink(u, s)) + return PA_HOOK_OK; + + pa_log_info("Configuring new sink: %s", s->name); + if (!(o = output_new(u, s))) { + pa_log("Failed to create sink input on sink '%s'.", s->name); + return PA_HOOK_OK; + } + + output_verify(o); + + return PA_HOOK_OK; +} + +/* Called from main context */ +static struct output* find_output(struct userdata *u, pa_sink *s) { + struct output *o; + uint32_t idx; + + pa_assert(u); + pa_assert(s); + + if (u->sink == s) + return NULL; + + PA_IDXSET_FOREACH(o, u->outputs, idx) + if (o->sink == s) + return o; + + return NULL; +} + +/* Called from main context */ +static pa_hook_result_t sink_unlink_hook_cb(pa_core *c, pa_sink *s, struct userdata* u) { + struct output *o; + + pa_assert(c); + pa_sink_assert_ref(s); + pa_assert(u); + + if (!(o = find_output(u, s))) + return PA_HOOK_OK; + + pa_log_info("Unconfiguring sink: %s", s->name); + output_free(o); + + return PA_HOOK_OK; +} + +/* Called from main context */ +static pa_hook_result_t sink_state_changed_hook_cb(pa_core *c, pa_sink *s, struct userdata* u) { + struct output *o; + + if (!(o = find_output(u, s))) + return PA_HOOK_OK; + + /* This state change might be triggered because we are creating a + * stream here, in that case we don't want to create it a second + * time here and enter a loop */ + if (o->ignore_state_change) + return PA_HOOK_OK; + + output_verify(o); + + return PA_HOOK_OK; +} + +int pa__init(pa_module*m) { + struct userdata *u; + pa_modargs *ma = NULL; + const char *slaves, *rm; + int resample_method = PA_RESAMPLER_TRIVIAL; + pa_sample_spec ss; + pa_channel_map map; + struct output *o; + uint32_t idx; + pa_sink_new_data data; + uint32_t adjust_time_sec; + + pa_assert(m); + + if (!(ma = pa_modargs_new(m->argument, valid_modargs))) { + pa_log("failed to parse module arguments"); + goto fail; + } + + if ((rm = pa_modargs_get_value(ma, "resample_method", NULL))) { + if ((resample_method = pa_parse_resample_method(rm)) < 0) { + pa_log("invalid resample method '%s'", rm); + goto fail; + } + } + + m->userdata = u = pa_xnew0(struct userdata, 1); + u->core = m->core; + u->module = m; + u->rtpoll = pa_rtpoll_new(); + pa_thread_mq_init(&u->thread_mq, m->core->mainloop, u->rtpoll); + u->resample_method = resample_method; + u->outputs = pa_idxset_new(NULL, NULL); + u->thread_info.smoother = pa_smoother_new( + PA_USEC_PER_SEC, + PA_USEC_PER_SEC*2, + TRUE, + TRUE, + 10, + 0, + FALSE); + + adjust_time_sec = DEFAULT_ADJUST_TIME_USEC / PA_USEC_PER_SEC; + if (pa_modargs_get_value_u32(ma, "adjust_time", &adjust_time_sec) < 0) { + pa_log("Failed to parse adjust_time value"); + goto fail; + } + + if (adjust_time_sec != DEFAULT_ADJUST_TIME_USEC / PA_USEC_PER_SEC) + u->adjust_time = adjust_time_sec * PA_USEC_PER_SEC; + else + u->adjust_time = DEFAULT_ADJUST_TIME_USEC; + + slaves = pa_modargs_get_value(ma, "slaves", NULL); + u->automatic = !slaves; + + ss = m->core->default_sample_spec; + map = m->core->default_channel_map; + + /* Check the specified slave sinks for sample_spec and channel_map to use for the combined sink */ + if (!u->automatic) { + const char*split_state = NULL; + char *n = NULL; + pa_sample_spec slaves_spec; + pa_channel_map slaves_map; + pa_bool_t is_first_slave = TRUE; + + pa_sample_spec_init(&slaves_spec); + + while ((n = pa_split(slaves, ",", &split_state))) { + pa_sink *slave_sink; + + if (!(slave_sink = pa_namereg_get(m->core, n, PA_NAMEREG_SINK))) { + pa_log("Invalid slave sink '%s'", n); + pa_xfree(n); + goto fail; + } + + pa_xfree(n); + + if (is_first_slave) { + slaves_spec = slave_sink->sample_spec; + slaves_map = slave_sink->channel_map; + is_first_slave = FALSE; + } else { + if (slaves_spec.format != slave_sink->sample_spec.format) + slaves_spec.format = PA_SAMPLE_INVALID; + + if (slaves_spec.rate < slave_sink->sample_spec.rate) + slaves_spec.rate = slave_sink->sample_spec.rate; + + if (!pa_channel_map_equal(&slaves_map, &slave_sink->channel_map)) + slaves_spec.channels = 0; + } + } + + if (!is_first_slave) { + if (slaves_spec.format != PA_SAMPLE_INVALID) + ss.format = slaves_spec.format; + + ss.rate = slaves_spec.rate; + + if (slaves_spec.channels > 0) { + map = slaves_map; + ss.channels = slaves_map.channels; + } + } + } + + if ((pa_modargs_get_sample_spec_and_channel_map(ma, &ss, &map, PA_CHANNEL_MAP_DEFAULT) < 0)) { + pa_log("Invalid sample specification."); + goto fail; + } + + pa_sink_new_data_init(&data); + data.namereg_fail = FALSE; + data.driver = __FILE__; + data.module = m; + pa_sink_new_data_set_name(&data, pa_modargs_get_value(ma, "sink_name", DEFAULT_SINK_NAME)); + pa_sink_new_data_set_sample_spec(&data, &ss); + pa_sink_new_data_set_channel_map(&data, &map); + pa_proplist_sets(data.proplist, PA_PROP_DEVICE_CLASS, "filter"); + + if (slaves) + pa_proplist_sets(data.proplist, "combine.slaves", slaves); + + if (pa_modargs_get_proplist(ma, "sink_properties", data.proplist, PA_UPDATE_REPLACE) < 0) { + pa_log("Invalid properties"); + pa_sink_new_data_done(&data); + goto fail; + } + + /* Check proplist for a description & fill in a default value if not */ + u->auto_desc = FALSE; + if (NULL == pa_proplist_gets(data.proplist, PA_PROP_DEVICE_DESCRIPTION)) { + u->auto_desc = TRUE; + pa_proplist_sets(data.proplist, PA_PROP_DEVICE_DESCRIPTION, "Simultaneous Output"); + } + + u->sink = pa_sink_new(m->core, &data, PA_SINK_LATENCY); + pa_sink_new_data_done(&data); + + if (!u->sink) { + pa_log("Failed to create sink"); + goto fail; + } + + u->sink->parent.process_msg = sink_process_msg; + u->sink->set_state = sink_set_state; + u->sink->userdata = u; + + pa_sink_set_rtpoll(u->sink, u->rtpoll); + pa_sink_set_asyncmsgq(u->sink, u->thread_mq.inq); + + u->block_usec = BLOCK_USEC; + pa_sink_set_max_request(u->sink, pa_usec_to_bytes(u->block_usec, &u->sink->sample_spec)); + + if (!u->automatic) { + const char*split_state; + char *n = NULL; + pa_assert(slaves); + + /* The slaves have been specified manually */ + + split_state = NULL; + while ((n = pa_split(slaves, ",", &split_state))) { + pa_sink *slave_sink; + + if (!(slave_sink = pa_namereg_get(m->core, n, PA_NAMEREG_SINK)) || slave_sink == u->sink) { + pa_log("Invalid slave sink '%s'", n); + pa_xfree(n); + goto fail; + } + + pa_xfree(n); + + if (!output_new(u, slave_sink)) { + pa_log("Failed to create slave sink input on sink '%s'.", slave_sink->name); + goto fail; + } + } + + if (pa_idxset_size(u->outputs) <= 1) + pa_log_warn("No slave sinks specified."); + + u->sink_put_slot = NULL; + + } else { + pa_sink *s; + + /* We're in automatic mode, we add every sink that matches our needs */ + + PA_IDXSET_FOREACH(s, m->core->sinks, idx) { + + if (!is_suitable_sink(u, s)) + continue; + + if (!output_new(u, s)) { + pa_log("Failed to create sink input on sink '%s'.", s->name); + goto fail; + } + } + + u->sink_put_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_PUT], PA_HOOK_LATE, (pa_hook_cb_t) sink_put_hook_cb, u); + } + + u->sink_unlink_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_UNLINK], PA_HOOK_EARLY, (pa_hook_cb_t) sink_unlink_hook_cb, u); + u->sink_state_changed_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_STATE_CHANGED], PA_HOOK_NORMAL, (pa_hook_cb_t) sink_state_changed_hook_cb, u); + + if (!(u->thread = pa_thread_new(thread_func, u))) { + pa_log("Failed to create thread."); + goto fail; + } + + /* Activate the sink and the sink inputs */ + pa_sink_put(u->sink); + + PA_IDXSET_FOREACH(o, u->outputs, idx) + output_verify(o); + + if (u->adjust_time > 0) + u->time_event = pa_core_rttime_new(m->core, pa_rtclock_now() + u->adjust_time, time_callback, u); + + pa_modargs_free(ma); + + return 0; + +fail: + + if (ma) + pa_modargs_free(ma); + + pa__done(m); + + return -1; +} + +void pa__done(pa_module*m) { + struct userdata *u; + struct output *o; + + pa_assert(m); + + if (!(u = m->userdata)) + return; + + if (u->sink_put_slot) + pa_hook_slot_free(u->sink_put_slot); + + if (u->sink_unlink_slot) + pa_hook_slot_free(u->sink_unlink_slot); + + if (u->sink_state_changed_slot) + pa_hook_slot_free(u->sink_state_changed_slot); + + if (u->outputs) { + while ((o = pa_idxset_first(u->outputs, NULL))) + output_free(o); + + pa_idxset_free(u->outputs, NULL, NULL); + } + + if (u->sink) + pa_sink_unlink(u->sink); + + if (u->thread) { + pa_asyncmsgq_send(u->thread_mq.inq, NULL, PA_MESSAGE_SHUTDOWN, NULL, 0, NULL); + pa_thread_free(u->thread); + } + + pa_thread_mq_done(&u->thread_mq); + + if (u->sink) + pa_sink_unref(u->sink); + + if (u->rtpoll) + pa_rtpoll_free(u->rtpoll); + + if (u->time_event) + u->core->mainloop->time_free(u->time_event); + + if (u->thread_info.smoother) + pa_smoother_free(u->thread_info.smoother); + + pa_xfree(u); +} diff --git a/src/modules/module-console-kit-symdef.h b/src/modules/module-console-kit-symdef.h new file mode 100644 index 0000000..cba6505 --- /dev/null +++ b/src/modules/module-console-kit-symdef.h @@ -0,0 +1,29 @@ +#ifndef foomoduleconsolekitsymdeffoo +#define foomoduleconsolekitsymdeffoo + +#include +#include +#include + +#define pa__init module_console_kit_LTX_pa__init +#define pa__done module_console_kit_LTX_pa__done +#define pa__get_author module_console_kit_LTX_pa__get_author +#define pa__get_description module_console_kit_LTX_pa__get_description +#define pa__get_usage module_console_kit_LTX_pa__get_usage +#define pa__get_version module_console_kit_LTX_pa__get_version +#define pa__get_deprecated module_console_kit_LTX_pa__get_deprecated +#define pa__load_once module_console_kit_LTX_pa__load_once +#define pa__get_n_used module_console_kit_LTX_pa__get_n_used + +int pa__init(pa_module*m); +void pa__done(pa_module*m); +int pa__get_n_used(pa_module*m); + +const char* pa__get_author(void); +const char* pa__get_description(void); +const char* pa__get_usage(void); +const char* pa__get_version(void); +const char* pa__get_deprecated(void); +pa_bool_t pa__load_once(void); + +#endif diff --git a/src/modules/module-console-kit.c b/src/modules/module-console-kit.c new file mode 100644 index 0000000..103f5c4 --- /dev/null +++ b/src/modules/module-console-kit.c @@ -0,0 +1,367 @@ +/*** + This file is part of PulseAudio. + + Copyright 2008 Lennart Poettering + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "module-console-kit-symdef.h" + +PA_MODULE_AUTHOR("Lennart Poettering"); +PA_MODULE_DESCRIPTION("Create a client for each ConsoleKit session of this user"); +PA_MODULE_VERSION(PACKAGE_VERSION); +PA_MODULE_LOAD_ONCE(TRUE); + +static const char* const valid_modargs[] = { + NULL +}; + +struct session { + char *id; + pa_client *client; +}; + +struct userdata { + pa_module *module; + pa_core *core; + pa_dbus_connection *connection; + pa_hashmap *sessions; +}; + +static void add_session(struct userdata *u, const char *id) { + DBusError error; + DBusMessage *m = NULL, *reply = NULL; + uint32_t uid; + struct session *session; + pa_client_new_data data; + + dbus_error_init (&error); + + if (pa_hashmap_get(u->sessions, id)) { + pa_log_warn("Duplicate session %s, ignoring.", id); + return; + } + + if (!(m = dbus_message_new_method_call("org.freedesktop.ConsoleKit", id, "org.freedesktop.ConsoleKit.Session", "GetUnixUser"))) { + pa_log("Failed to allocate GetUnixUser() method call."); + goto fail; + } + + if (!(reply = dbus_connection_send_with_reply_and_block(pa_dbus_connection_get(u->connection), m, -1, &error))) { + pa_log("GetUnixUser() call failed: %s: %s", error.name, error.message); + goto fail; + } + + /* CK 0.3 this changed from int32 to uint32 */ + if (!dbus_message_get_args(reply, &error, DBUS_TYPE_UINT32, &uid, DBUS_TYPE_INVALID)) { + dbus_error_free(&error); + + if (!dbus_message_get_args(reply, &error, DBUS_TYPE_INT32, &uid, DBUS_TYPE_INVALID)) { + pa_log("Failed to parse GetUnixUser() result: %s: %s", error.name, error.message); + goto fail; + } + } + + /* We only care about our own sessions */ + if ((uid_t) uid != getuid()) + goto fail; + + session = pa_xnew(struct session, 1); + session->id = pa_xstrdup(id); + + pa_client_new_data_init(&data); + data.module = u->module; + data.driver = __FILE__; + pa_proplist_setf(data.proplist, PA_PROP_APPLICATION_NAME, "ConsoleKit Session %s", id); + pa_proplist_sets(data.proplist, "console-kit.session", id); + session->client = pa_client_new(u->core, &data); + pa_client_new_data_done(&data); + + if (!session->client) { + pa_xfree(session->id); + pa_xfree(session); + goto fail; + } + + pa_hashmap_put(u->sessions, session->id, session); + + pa_log_debug("Added new session %s", id); + +fail: + + if (m) + dbus_message_unref(m); + + if (reply) + dbus_message_unref(reply); + + dbus_error_free(&error); +} + +static void free_session(struct session *session) { + pa_assert(session); + + pa_log_debug("Removing session %s", session->id); + + pa_client_free(session->client); + pa_xfree(session->id); + pa_xfree(session); +} + +static void remove_session(struct userdata *u, const char *id) { + struct session *session; + + if (!(session = pa_hashmap_remove(u->sessions, id))) + return; + + free_session(session); +} + +static DBusHandlerResult filter_cb(DBusConnection *bus, DBusMessage *message, void *userdata) { + struct userdata *u = userdata; + DBusError error; + const char *path; + + pa_assert(bus); + pa_assert(message); + pa_assert(u); + + dbus_error_init(&error); + + pa_log_debug("dbus: interface=%s, path=%s, member=%s\n", + dbus_message_get_interface(message), + dbus_message_get_path(message), + dbus_message_get_member(message)); + + if (dbus_message_is_signal(message, "org.freedesktop.ConsoleKit.Seat", "SessionAdded")) { + + /* CK API changed to match spec in 0.3 */ + if (!dbus_message_get_args(message, &error, DBUS_TYPE_OBJECT_PATH, &path, DBUS_TYPE_INVALID)) { + dbus_error_free(&error); + + if (!dbus_message_get_args(message, &error, DBUS_TYPE_STRING, &path, DBUS_TYPE_INVALID)) { + pa_log_error("Failed to parse SessionAdded message: %s: %s", error.name, error.message); + goto finish; + } + } + + add_session(u, path); + + } else if (dbus_message_is_signal(message, "org.freedesktop.ConsoleKit.Seat", "SessionRemoved")) { + + /* CK API changed to match spec in 0.3 */ + if (!dbus_message_get_args(message, &error, DBUS_TYPE_OBJECT_PATH, &path, DBUS_TYPE_INVALID)) { + dbus_error_free(&error); + + if (!dbus_message_get_args(message, &error, DBUS_TYPE_STRING, &path, DBUS_TYPE_INVALID)) { + pa_log_error("Failed to parse SessionRemoved message: %s: %s", error.name, error.message); + goto finish; + } + } + + remove_session(u, path); + } + +finish: + dbus_error_free(&error); + + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; +} + +static int get_session_list(struct userdata *u) { + DBusError error; + DBusMessage *m = NULL, *reply = NULL; + uint32_t uid; + DBusMessageIter iter, sub; + int ret = -1; + + pa_assert(u); + + dbus_error_init(&error); + + if (!(m = dbus_message_new_method_call("org.freedesktop.ConsoleKit", "/org/freedesktop/ConsoleKit/Manager", "org.freedesktop.ConsoleKit.Manager", "GetSessionsForUnixUser"))) { + pa_log("Failed to allocate GetSessionsForUnixUser() method call."); + goto fail; + } + + uid = (uint32_t) getuid(); + if (!(dbus_message_append_args(m, DBUS_TYPE_UINT32, &uid, DBUS_TYPE_INVALID))) { + pa_log("Failed to append arguments to GetSessionsForUnixUser() method call."); + goto fail; + } + + if (!(reply = dbus_connection_send_with_reply_and_block(pa_dbus_connection_get(u->connection), m, -1, &error))) { + pa_log("GetSessionsForUnixUser() call failed: %s: %s", error.name, error.message); + goto fail; + } + + dbus_message_iter_init(reply, &iter); + + if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY || + dbus_message_iter_get_element_type(&iter) != DBUS_TYPE_OBJECT_PATH) { + pa_log("Failed to parse GetSessionsForUnixUser() result."); + goto fail; + } + + dbus_message_iter_recurse(&iter, &sub); + + for (;;) { + int at; + const char *id; + + if ((at = dbus_message_iter_get_arg_type(&sub)) == DBUS_TYPE_INVALID) + break; + + assert(at == DBUS_TYPE_OBJECT_PATH); + dbus_message_iter_get_basic(&sub, &id); + + add_session(u, id); + + dbus_message_iter_next(&sub); + } + + ret = 0; + +fail: + + if (m) + dbus_message_unref(m); + + if (reply) + dbus_message_unref(reply); + + dbus_error_free(&error); + + return ret; +} + +int pa__init(pa_module*m) { + DBusError error; + pa_dbus_connection *connection; + struct userdata *u = NULL; + pa_modargs *ma; + + pa_assert(m); + + dbus_error_init(&error); + + if (!(ma = pa_modargs_new(m->argument, valid_modargs))) { + pa_log("Failed to parse module arguments"); + goto fail; + } + + if (!(connection = pa_dbus_bus_get(m->core, DBUS_BUS_SYSTEM, &error)) || dbus_error_is_set(&error)) { + + if (connection) + pa_dbus_connection_unref(connection); + + pa_log_error("Unable to contact D-Bus system bus: %s: %s", error.name, error.message); + goto fail; + } + + m->userdata = u = pa_xnew(struct userdata, 1); + u->core = m->core; + u->module = m; + u->connection = connection; + u->sessions = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func); + + if (!dbus_connection_add_filter(pa_dbus_connection_get(connection), filter_cb, u, NULL)) { + pa_log_error("Failed to add filter function"); + goto fail; + } + + if (pa_dbus_add_matches( + pa_dbus_connection_get(connection), &error, + "type='signal',sender='org.freedesktop.ConsoleKit',interface='org.freedesktop.ConsoleKit.Seat',member='SessionAdded'", + "type='signal',sender='org.freedesktop.ConsoleKit',interface='org.freedesktop.ConsoleKit.Seat',member='SessionRemoved'", NULL) < 0) { + pa_log_error("Unable to subscribe to ConsoleKit signals: %s: %s", error.name, error.message); + goto fail; + } + + if (get_session_list(u) < 0) + goto fail; + + pa_modargs_free(ma); + + return 0; + +fail: + if (ma) + pa_modargs_free(ma); + + dbus_error_free(&error); + pa__done(m); + + return -1; +} + + +void pa__done(pa_module *m) { + struct userdata *u; + struct session *session; + + pa_assert(m); + + if (!(u = m->userdata)) + return; + + if (u->sessions) { + while ((session = pa_hashmap_steal_first(u->sessions))) + free_session(session); + + pa_hashmap_free(u->sessions, NULL, NULL); + } + + if (u->connection) { + pa_dbus_remove_matches( + pa_dbus_connection_get(u->connection), + "type='signal',sender='org.freedesktop.ConsoleKit',interface='org.freedesktop.ConsoleKit.Seat',member='SessionAdded'", + "type='signal',sender='org.freedesktop.ConsoleKit',interface='org.freedesktop.ConsoleKit.Seat',member='SessionRemoved'", NULL); + + dbus_connection_remove_filter(pa_dbus_connection_get(u->connection), filter_cb, u); + pa_dbus_connection_unref(u->connection); + } + + pa_xfree(u); +} diff --git a/src/modules/module-cork-music-on-phone-symdef.h b/src/modules/module-cork-music-on-phone-symdef.h new file mode 100644 index 0000000..a5c142f --- /dev/null +++ b/src/modules/module-cork-music-on-phone-symdef.h @@ -0,0 +1,29 @@ +#ifndef foomodulecorkmusiconphonesymdeffoo +#define foomodulecorkmusiconphonesymdeffoo + +#include +#include +#include + +#define pa__init module_cork_music_on_phone_LTX_pa__init +#define pa__done module_cork_music_on_phone_LTX_pa__done +#define pa__get_author module_cork_music_on_phone_LTX_pa__get_author +#define pa__get_description module_cork_music_on_phone_LTX_pa__get_description +#define pa__get_usage module_cork_music_on_phone_LTX_pa__get_usage +#define pa__get_version module_cork_music_on_phone_LTX_pa__get_version +#define pa__get_deprecated module_cork_music_on_phone_LTX_pa__get_deprecated +#define pa__load_once module_cork_music_on_phone_LTX_pa__load_once +#define pa__get_n_used module_cork_music_on_phone_LTX_pa__get_n_used + +int pa__init(pa_module*m); +void pa__done(pa_module*m); +int pa__get_n_used(pa_module*m); + +const char* pa__get_author(void); +const char* pa__get_description(void); +const char* pa__get_usage(void); +const char* pa__get_version(void); +const char* pa__get_deprecated(void); +pa_bool_t pa__load_once(void); + +#endif diff --git a/src/modules/module-cork-music-on-phone.c b/src/modules/module-cork-music-on-phone.c new file mode 100644 index 0000000..d3a2b00 --- /dev/null +++ b/src/modules/module-cork-music-on-phone.c @@ -0,0 +1,223 @@ +/*** + This file is part of PulseAudio. + + Copyright 2009 Lennart Poettering + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include +#include +#include +#include + +#include "module-cork-music-on-phone-symdef.h" + +PA_MODULE_AUTHOR("Lennart Poettering"); +PA_MODULE_DESCRIPTION("Mute or cork music while a phone stream exists"); +PA_MODULE_VERSION(PACKAGE_VERSION); +PA_MODULE_LOAD_ONCE(TRUE); + +static const char* const valid_modargs[] = { + NULL +}; + +struct userdata { + pa_core *core; + pa_hashmap *cork_state; + pa_hook_slot + *sink_input_put_slot, + *sink_input_unlink_slot, + *sink_input_move_start_slot, + *sink_input_move_finish_slot; +}; + +static pa_bool_t shall_cork(pa_sink *s, pa_sink_input *ignore) { + pa_sink_input *j; + uint32_t idx; + pa_sink_assert_ref(s); + + for (j = PA_SINK_INPUT(pa_idxset_first(s->inputs, &idx)); j; j = PA_SINK_INPUT(pa_idxset_next(s->inputs, &idx))) { + const char *role; + + if (j == ignore) + continue; + + if (!(role = pa_proplist_gets(j->proplist, PA_PROP_MEDIA_ROLE))) + continue; + + if (pa_streq(role, "phone")) + return TRUE; + } + + return FALSE; +} + +static void apply_cork(struct userdata *u, pa_sink *s, pa_sink_input *ignore, pa_bool_t cork) { + pa_sink_input *j; + uint32_t idx; + + pa_assert(u); + pa_sink_assert_ref(s); + + for (j = PA_SINK_INPUT(pa_idxset_first(s->inputs, &idx)); j; j = PA_SINK_INPUT(pa_idxset_next(s->inputs, &idx))) { + pa_bool_t corked; + const char *role; + + if (j == ignore) + continue; + + if (!(role = pa_proplist_gets(j->proplist, PA_PROP_MEDIA_ROLE))) + continue; + + if (!pa_streq(role, "video") && + !pa_streq(role, "music")) + continue; + + corked = !!pa_hashmap_get(u->cork_state, j); + + if (cork && !corked) { + pa_hashmap_put(u->cork_state, j, PA_INT_TO_PTR(1)); + pa_sink_input_set_mute(j, TRUE, FALSE); + pa_sink_input_send_event(j, PA_STREAM_EVENT_REQUEST_CORK, NULL); + } else if (!cork) { + pa_hashmap_remove(u->cork_state, j); + + if (corked) { + pa_sink_input_set_mute(j, FALSE, FALSE); + pa_sink_input_send_event(j, PA_STREAM_EVENT_REQUEST_UNCORK, NULL); + } + } + } +} + +static pa_hook_result_t process(struct userdata *u, pa_sink_input *i, pa_bool_t create) { + pa_bool_t cork = FALSE; + const char *role; + + pa_assert(u); + pa_sink_input_assert_ref(i); + + if (!create) + pa_hashmap_remove(u->cork_state, i); + + if (!(role = pa_proplist_gets(i->proplist, PA_PROP_MEDIA_ROLE))) + return PA_HOOK_OK; + + if (!pa_streq(role, "phone") && + !pa_streq(role, "music") && + !pa_streq(role, "video")) + return PA_HOOK_OK; + + cork = shall_cork(i->sink, create ? NULL : i); + apply_cork(u, i->sink, create ? NULL : i, cork); + + return PA_HOOK_OK; +} + +static pa_hook_result_t sink_input_put_cb(pa_core *core, pa_sink_input *i, struct userdata *u) { + pa_core_assert_ref(core); + pa_sink_input_assert_ref(i); + + return process(u, i, TRUE); +} + +static pa_hook_result_t sink_input_unlink_cb(pa_core *core, pa_sink_input *i, struct userdata *u) { + pa_sink_input_assert_ref(i); + + return process(u, i, FALSE); +} + +static pa_hook_result_t sink_input_move_start_cb(pa_core *core, pa_sink_input *i, struct userdata *u) { + pa_core_assert_ref(core); + pa_sink_input_assert_ref(i); + + return process(u, i, FALSE); +} + +static pa_hook_result_t sink_input_move_finish_cb(pa_core *core, pa_sink_input *i, struct userdata *u) { + pa_core_assert_ref(core); + pa_sink_input_assert_ref(i); + + return process(u, i, TRUE); +} + +int pa__init(pa_module *m) { + pa_modargs *ma = NULL; + struct userdata *u; + + pa_assert(m); + + if (!(ma = pa_modargs_new(m->argument, valid_modargs))) { + pa_log("Failed to parse module arguments"); + goto fail; + } + + m->userdata = u = pa_xnew(struct userdata, 1); + + u->core = m->core; + u->cork_state = pa_hashmap_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func); + + u->sink_input_put_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_INPUT_PUT], PA_HOOK_LATE, (pa_hook_cb_t) sink_input_put_cb, u); + u->sink_input_unlink_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_INPUT_UNLINK], PA_HOOK_LATE, (pa_hook_cb_t) sink_input_unlink_cb, u); + u->sink_input_move_start_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_INPUT_MOVE_START], PA_HOOK_LATE, (pa_hook_cb_t) sink_input_move_start_cb, u); + u->sink_input_move_finish_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_INPUT_MOVE_FINISH], PA_HOOK_LATE, (pa_hook_cb_t) sink_input_move_finish_cb, u); + + pa_modargs_free(ma); + + return 0; + +fail: + pa__done(m); + + if (ma) + pa_modargs_free(ma); + + return -1; + + +} + +void pa__done(pa_module *m) { + struct userdata* u; + + pa_assert(m); + + if (!(u = m->userdata)) + return; + + if (u->sink_input_put_slot) + pa_hook_slot_free(u->sink_input_put_slot); + if (u->sink_input_unlink_slot) + pa_hook_slot_free(u->sink_input_unlink_slot); + if (u->sink_input_move_start_slot) + pa_hook_slot_free(u->sink_input_move_start_slot); + if (u->sink_input_move_finish_slot) + pa_hook_slot_free(u->sink_input_move_finish_slot); + + if (u->cork_state) + pa_hashmap_free(u->cork_state, NULL, NULL); + + pa_xfree(u); + +} diff --git a/src/modules/module-default-device-restore-symdef.h b/src/modules/module-default-device-restore-symdef.h new file mode 100644 index 0000000..d78355c --- /dev/null +++ b/src/modules/module-default-device-restore-symdef.h @@ -0,0 +1,29 @@ +#ifndef foomoduledefaultdevicerestoresymdeffoo +#define foomoduledefaultdevicerestoresymdeffoo + +#include +#include +#include + +#define pa__init module_default_device_restore_LTX_pa__init +#define pa__done module_default_device_restore_LTX_pa__done +#define pa__get_author module_default_device_restore_LTX_pa__get_author +#define pa__get_description module_default_device_restore_LTX_pa__get_description +#define pa__get_usage module_default_device_restore_LTX_pa__get_usage +#define pa__get_version module_default_device_restore_LTX_pa__get_version +#define pa__get_deprecated module_default_device_restore_LTX_pa__get_deprecated +#define pa__load_once module_default_device_restore_LTX_pa__load_once +#define pa__get_n_used module_default_device_restore_LTX_pa__get_n_used + +int pa__init(pa_module*m); +void pa__done(pa_module*m); +int pa__get_n_used(pa_module*m); + +const char* pa__get_author(void); +const char* pa__get_description(void); +const char* pa__get_usage(void); +const char* pa__get_version(void); +const char* pa__get_deprecated(void); +pa_bool_t pa__load_once(void); + +#endif diff --git a/src/modules/module-default-device-restore.c b/src/modules/module-default-device-restore.c new file mode 100644 index 0000000..27ae60e --- /dev/null +++ b/src/modules/module-default-device-restore.c @@ -0,0 +1,199 @@ +/*** + This file is part of PulseAudio. + + Copyright 2006-2008 Lennart Poettering + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "module-default-device-restore-symdef.h" + +PA_MODULE_AUTHOR("Lennart Poettering"); +PA_MODULE_DESCRIPTION("Automatically restore the default sink and source"); +PA_MODULE_VERSION(PACKAGE_VERSION); +PA_MODULE_LOAD_ONCE(TRUE); + +#define SAVE_INTERVAL (5 * PA_USEC_PER_SEC) + +struct userdata { + pa_core *core; + pa_subscription *subscription; + pa_time_event *time_event; + char *sink_filename, *source_filename; + pa_bool_t modified; +}; + +static void load(struct userdata *u) { + FILE *f; + + /* We never overwrite manually configured settings */ + + if (u->core->default_sink) + pa_log_info("Manually configured default sink, not overwriting."); + else if ((f = fopen(u->sink_filename, "r"))) { + char ln[256] = ""; + pa_sink *s; + + (void) fgets(ln, sizeof(ln)-1, f); + pa_strip_nl(ln); + fclose(f); + + if (!ln[0]) + pa_log_info("No previous default sink setting, ignoring."); + else if ((s = pa_namereg_get(u->core, ln, PA_NAMEREG_SINK))) { + pa_namereg_set_default_sink(u->core, s); + pa_log_info("Restored default sink '%s'.", ln); + } else + pa_log_info("Saved default sink '%s' not existant, not restoring default sink setting.", ln); + + } else if (errno != ENOENT) + pa_log("Failed to load default sink: %s", pa_cstrerror(errno)); + + if (u->core->default_source) + pa_log_info("Manually configured default source, not overwriting."); + else if ((f = fopen(u->source_filename, "r"))) { + char ln[256] = ""; + pa_source *s; + + (void) fgets(ln, sizeof(ln)-1, f); + pa_strip_nl(ln); + fclose(f); + + if (!ln[0]) + pa_log_info("No previous default source setting, ignoring."); + else if ((s = pa_namereg_get(u->core, ln, PA_NAMEREG_SOURCE))) { + pa_namereg_set_default_source(u->core, s); + pa_log_info("Restored default source '%s'.", ln); + } else + pa_log_info("Saved default source '%s' not existant, not restoring default source setting.", ln); + + } else if (errno != ENOENT) + pa_log("Failed to load default sink: %s", pa_cstrerror(errno)); +} + +static void save(struct userdata *u) { + FILE *f; + + if (!u->modified) + return; + + if (u->sink_filename) { + if ((f = fopen(u->sink_filename, "w"))) { + pa_sink *s = pa_namereg_get_default_sink(u->core); + fprintf(f, "%s\n", s ? s->name : ""); + fclose(f); + } else + pa_log("Failed to save default sink: %s", pa_cstrerror(errno)); + } + + if (u->source_filename) { + if ((f = fopen(u->source_filename, "w"))) { + pa_source *s = pa_namereg_get_default_source(u->core); + fprintf(f, "%s\n", s ? s->name : ""); + fclose(f); + } else + pa_log("Failed to save default source: %s", pa_cstrerror(errno)); + } + + u->modified = FALSE; +} + +static void time_cb(pa_mainloop_api *a, pa_time_event *e, const struct timeval *t, void *userdata) { + struct userdata *u = userdata; + + pa_assert(u); + save(u); + + if (u->time_event) { + u->core->mainloop->time_free(u->time_event); + u->time_event = NULL; + } +} + +static void subscribe_cb(pa_core *c, pa_subscription_event_type_t t, uint32_t idx, void *userdata) { + struct userdata *u = userdata; + + pa_assert(u); + + u->modified = TRUE; + + if (!u->time_event) + u->time_event = pa_core_rttime_new(u->core, pa_rtclock_now() + SAVE_INTERVAL, time_cb, u); +} + +int pa__init(pa_module *m) { + struct userdata *u; + + pa_assert(m); + + m->userdata = u = pa_xnew0(struct userdata, 1); + u->core = m->core; + + if (!(u->sink_filename = pa_state_path("default-sink", TRUE))) + goto fail; + + if (!(u->source_filename = pa_state_path("default-source", TRUE))) + goto fail; + + load(u); + + u->subscription = pa_subscription_new(u->core, PA_SUBSCRIPTION_MASK_SERVER, subscribe_cb, u); + + return 0; + +fail: + pa__done(m); + + return -1; +} + +void pa__done(pa_module*m) { + struct userdata *u; + + pa_assert(m); + + if (!(u = m->userdata)) + return; + + save(u); + + if (u->subscription) + pa_subscription_free(u->subscription); + + if (u->time_event) + m->core->mainloop->time_free(u->time_event); + + pa_xfree(u->sink_filename); + pa_xfree(u->source_filename); + pa_xfree(u); +} diff --git a/src/modules/module-defs.h.m4 b/src/modules/module-defs.h.m4 new file mode 100644 index 0000000..b6a60b6 --- /dev/null +++ b/src/modules/module-defs.h.m4 @@ -0,0 +1,35 @@ +changecom(`/*', `*/')dnl +define(`module_name', patsubst(patsubst(patsubst(fname, `-symdef.h$'), `^.*/'), `[^0-9a-zA-Z]', `_'))dnl +define(`c_symbol', patsubst(module_name, `[^0-9a-zA-Z]', `_'))dnl +define(`c_macro', patsubst(module_name, `[^0-9a-zA-Z]', `'))dnl +define(`incmacro', `foo'c_macro`symdeffoo')dnl +define(`gen_symbol', `#define $1 'module_name`_LTX_$1')dnl +#ifndef incmacro +#define incmacro + +#include +#include +#include + +gen_symbol(pa__init) +gen_symbol(pa__done) +gen_symbol(pa__get_author) +gen_symbol(pa__get_description) +gen_symbol(pa__get_usage) +gen_symbol(pa__get_version) +gen_symbol(pa__get_deprecated) +gen_symbol(pa__load_once) +gen_symbol(pa__get_n_used) + +int pa__init(pa_module*m); +void pa__done(pa_module*m); +int pa__get_n_used(pa_module*m); + +const char* pa__get_author(void); +const char* pa__get_description(void); +const char* pa__get_usage(void); +const char* pa__get_version(void); +const char* pa__get_deprecated(void); +pa_bool_t pa__load_once(void); + +#endif diff --git a/src/modules/module-detect-symdef.h b/src/modules/module-detect-symdef.h new file mode 100644 index 0000000..ad8c08f --- /dev/null +++ b/src/modules/module-detect-symdef.h @@ -0,0 +1,29 @@ +#ifndef foomoduledetectsymdeffoo +#define foomoduledetectsymdeffoo + +#include +#include +#include + +#define pa__init module_detect_LTX_pa__init +#define pa__done module_detect_LTX_pa__done +#define pa__get_author module_detect_LTX_pa__get_author +#define pa__get_description module_detect_LTX_pa__get_description +#define pa__get_usage module_detect_LTX_pa__get_usage +#define pa__get_version module_detect_LTX_pa__get_version +#define pa__get_deprecated module_detect_LTX_pa__get_deprecated +#define pa__load_once module_detect_LTX_pa__load_once +#define pa__get_n_used module_detect_LTX_pa__get_n_used + +int pa__init(pa_module*m); +void pa__done(pa_module*m); +int pa__get_n_used(pa_module*m); + +const char* pa__get_author(void); +const char* pa__get_description(void); +const char* pa__get_usage(void); +const char* pa__get_version(void); +const char* pa__get_deprecated(void); +pa_bool_t pa__load_once(void); + +#endif diff --git a/src/modules/module-detect.c b/src/modules/module-detect.c new file mode 100644 index 0000000..b1f24e1 --- /dev/null +++ b/src/modules/module-detect.c @@ -0,0 +1,271 @@ +/*** + This file is part of PulseAudio. + + Copyright 2006 Lennart Poettering + Copyright 2006 Pierre Ossman for Cendio AB + Copyright 2006 Diego Pettenò + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include + +#include "module-detect-symdef.h" + +PA_MODULE_AUTHOR("Lennart Poettering"); +PA_MODULE_DESCRIPTION("Detect available audio hardware and load matching drivers"); +PA_MODULE_VERSION(PACKAGE_VERSION); +PA_MODULE_LOAD_ONCE(TRUE); +PA_MODULE_USAGE("just-one="); +PA_MODULE_DEPRECATED("Please use module-udev-detect instead of module-detect!"); + +static const char* const valid_modargs[] = { + "just-one", + NULL +}; + +#ifdef HAVE_ALSA + +static int detect_alsa(pa_core *c, int just_one) { + FILE *f; + int n = 0, n_sink = 0, n_source = 0; + + if (!(f = fopen("/proc/asound/devices", "r"))) { + + if (errno != ENOENT) + pa_log_error("open(\"/proc/asound/devices\") failed: %s", pa_cstrerror(errno)); + + return -1; + } + + while (!feof(f)) { + char line[64], args[64]; + unsigned device, subdevice; + int is_sink; + + if (!fgets(line, sizeof(line), f)) + break; + + line[strcspn(line, "\r\n")] = 0; + + if (pa_endswith(line, "digital audio playback")) + is_sink = 1; + else if (pa_endswith(line, "digital audio capture")) + is_sink = 0; + else + continue; + + if (just_one && is_sink && n_sink >= 1) + continue; + + if (just_one && !is_sink && n_source >= 1) + continue; + + if (sscanf(line, " %*i: [%u- %u]: ", &device, &subdevice) != 2) + continue; + + /* Only one sink per device */ + if (subdevice != 0) + continue; + + pa_snprintf(args, sizeof(args), "device_id=%u", device); + if (!pa_module_load(c, is_sink ? "module-alsa-sink" : "module-alsa-source", args)) + continue; + + n++; + + if (is_sink) + n_sink++; + else + n_source++; + } + + fclose(f); + + return n; +} +#endif + +#ifdef HAVE_OSS_OUTPUT +static int detect_oss(pa_core *c, int just_one) { + FILE *f; + int n = 0, b = 0; + + if (!(f = fopen("/dev/sndstat", "r")) && + !(f = fopen("/proc/sndstat", "r")) && + !(f = fopen("/proc/asound/oss/sndstat", "r"))) { + + if (errno != ENOENT) + pa_log_error("failed to open OSS sndstat device: %s", pa_cstrerror(errno)); + + return -1; + } + + while (!feof(f)) { + char line[64], args[64]; + unsigned device; + + if (!fgets(line, sizeof(line), f)) + break; + + line[strcspn(line, "\r\n")] = 0; + + if (!b) { + b = strcmp(line, "Audio devices:") == 0 || strcmp(line, "Installed devices:") == 0; + continue; + } + + if (line[0] == 0) + break; + + if (sscanf(line, "%u: ", &device) == 1) { + if (device == 0) + pa_snprintf(args, sizeof(args), "device=/dev/dsp"); + else + pa_snprintf(args, sizeof(args), "device=/dev/dsp%u", device); + + if (!pa_module_load(c, "module-oss", args)) + continue; + + } else if (sscanf(line, "pcm%u: ", &device) == 1) { + /* FreeBSD support, the devices are named /dev/dsp0.0, dsp0.1 and so on */ + pa_snprintf(args, sizeof(args), "device=/dev/dsp%u.0", device); + + if (!pa_module_load(c, "module-oss", args)) + continue; + } + + n++; + + if (just_one) + break; + } + + fclose(f); + return n; +} +#endif + +#ifdef HAVE_SOLARIS +static int detect_solaris(pa_core *c, int just_one) { + struct stat s; + const char *dev; + char args[64]; + + dev = getenv("AUDIODEV"); + if (!dev) + dev = "/dev/audio"; + + if (stat(dev, &s) < 0) { + if (errno != ENOENT) + pa_log_error("failed to open device %s: %s", dev, pa_cstrerror(errno)); + return -1; + } + + if (!S_ISCHR(s.st_mode)) + return 0; + + pa_snprintf(args, sizeof(args), "device=%s", dev); + + if (!pa_module_load(c, "module-solaris", args)) + return 0; + + return 1; +} +#endif + +#ifdef OS_IS_WIN32 +static int detect_waveout(pa_core *c, int just_one) { + /* + * FIXME: No point in enumerating devices until the plugin supports + * selecting anything but the first. + */ + if (!pa_module_load(c, "module-waveout", "")) + return 0; + + return 1; +} +#endif + +int pa__init(pa_module*m) { + pa_bool_t just_one = FALSE; + int n = 0; + pa_modargs *ma; + + pa_assert(m); + + if (!(ma = pa_modargs_new(m->argument, valid_modargs))) { + pa_log("Failed to parse module arguments"); + goto fail; + } + + if (pa_modargs_get_value_boolean(ma, "just-one", &just_one) < 0) { + pa_log("just_one= expects a boolean argument."); + goto fail; + } + +#ifdef HAVE_ALSA + if ((n = detect_alsa(m->core, just_one)) <= 0) +#endif +#ifdef HAVE_OSS_OUTPUT + if ((n = detect_oss(m->core, just_one)) <= 0) +#endif +#ifdef HAVE_SOLARIS + if ((n = detect_solaris(m->core, just_one)) <= 0) +#endif +#ifdef OS_IS_WIN32 + if ((n = detect_waveout(m->core, just_one)) <= 0) +#endif + { + pa_log_warn("failed to detect any sound hardware."); + goto fail; + } + + pa_log_info("loaded %i modules.", n); + + /* We were successful and can unload ourselves now. */ + pa_module_unload_request(m, TRUE); + + pa_modargs_free(ma); + + return 0; + +fail: + if (ma) + pa_modargs_free(ma); + + return -1; +} diff --git a/src/modules/module-device-manager-symdef.h b/src/modules/module-device-manager-symdef.h new file mode 100644 index 0000000..70edb51 --- /dev/null +++ b/src/modules/module-device-manager-symdef.h @@ -0,0 +1,29 @@ +#ifndef foomoduledevicemanagersymdeffoo +#define foomoduledevicemanagersymdeffoo + +#include +#include +#include + +#define pa__init module_device_manager_LTX_pa__init +#define pa__done module_device_manager_LTX_pa__done +#define pa__get_author module_device_manager_LTX_pa__get_author +#define pa__get_description module_device_manager_LTX_pa__get_description +#define pa__get_usage module_device_manager_LTX_pa__get_usage +#define pa__get_version module_device_manager_LTX_pa__get_version +#define pa__get_deprecated module_device_manager_LTX_pa__get_deprecated +#define pa__load_once module_device_manager_LTX_pa__load_once +#define pa__get_n_used module_device_manager_LTX_pa__get_n_used + +int pa__init(pa_module*m); +void pa__done(pa_module*m); +int pa__get_n_used(pa_module*m); + +const char* pa__get_author(void); +const char* pa__get_description(void); +const char* pa__get_usage(void); +const char* pa__get_version(void); +const char* pa__get_deprecated(void); +pa_bool_t pa__load_once(void); + +#endif diff --git a/src/modules/module-device-manager.c b/src/modules/module-device-manager.c new file mode 100644 index 0000000..3991043 --- /dev/null +++ b/src/modules/module-device-manager.c @@ -0,0 +1,1540 @@ +/*** + This file is part of PulseAudio. + + Copyright 2006-2008 Lennart Poettering + Copyright 2009 Colin Guthrie + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "module-device-manager-symdef.h" + +PA_MODULE_AUTHOR("Colin Guthrie"); +PA_MODULE_DESCRIPTION("Keep track of devices (and their descriptions) both past and present and prioritise by role"); +PA_MODULE_VERSION(PACKAGE_VERSION); +PA_MODULE_LOAD_ONCE(TRUE); +PA_MODULE_USAGE( + "do_routing= " + "on_hotplug= " + "on_rescue="); + +#define SAVE_INTERVAL (10 * PA_USEC_PER_SEC) +#define DUMP_DATABASE + +static const char* const valid_modargs[] = { + "do_routing", + "on_hotplug", + "on_rescue", + NULL +}; + +#define NUM_ROLES 9 +enum { + ROLE_NONE, + ROLE_VIDEO, + ROLE_MUSIC, + ROLE_GAME, + ROLE_EVENT, + ROLE_PHONE, + ROLE_ANIMATION, + ROLE_PRODUCTION, + ROLE_A11Y, +}; + +typedef uint32_t role_indexes_t[NUM_ROLES]; + +static const char* role_names[NUM_ROLES] = { + "none", + "video", + "music", + "game", + "event", + "phone", + "animation", + "production", + "a11y", +}; + +struct userdata { + pa_core *core; + pa_module *module; + pa_subscription *subscription; + pa_hook_slot + *sink_new_hook_slot, + *source_new_hook_slot, + *sink_input_new_hook_slot, + *source_output_new_hook_slot, + *sink_put_hook_slot, + *source_put_hook_slot, + *sink_unlink_hook_slot, + *source_unlink_hook_slot, + *connection_unlink_hook_slot; + pa_time_event *save_time_event; + pa_database *database; + + pa_native_protocol *protocol; + pa_idxset *subscribed; + + pa_bool_t on_hotplug; + pa_bool_t on_rescue; + pa_bool_t do_routing; + + role_indexes_t preferred_sinks; + role_indexes_t preferred_sources; +}; + +#define ENTRY_VERSION 1 + +struct entry { + uint8_t version; + char description[PA_NAME_MAX]; + pa_bool_t user_set_description; + char icon[PA_NAME_MAX]; + role_indexes_t priority; +} PA_GCC_PACKED; + +enum { + SUBCOMMAND_TEST, + SUBCOMMAND_READ, + SUBCOMMAND_RENAME, + SUBCOMMAND_DELETE, + SUBCOMMAND_ROLE_DEVICE_PRIORITY_ROUTING, + SUBCOMMAND_REORDER, + SUBCOMMAND_SUBSCRIBE, + SUBCOMMAND_EVENT +}; + + +static struct entry* read_entry(struct userdata *u, const char *name) { + pa_datum key, data; + struct entry *e; + + pa_assert(u); + pa_assert(name); + + key.data = (char*) name; + key.size = strlen(name); + + pa_zero(data); + + if (!pa_database_get(u->database, &key, &data)) + goto fail; + + if (data.size != sizeof(struct entry)) { + pa_log_debug("Database contains entry for device %s of wrong size %lu != %lu. Probably due to upgrade, ignoring.", name, (unsigned long) data.size, (unsigned long) sizeof(struct entry)); + goto fail; + } + + e = (struct entry*) data.data; + + if (e->version != ENTRY_VERSION) { + pa_log_debug("Version of database entry for device %s doesn't match our version. Probably due to upgrade, ignoring.", name); + goto fail; + } + + if (!memchr(e->description, 0, sizeof(e->description))) { + pa_log_warn("Database contains entry for device %s with missing NUL byte in description", name); + goto fail; + } + + if (!memchr(e->icon, 0, sizeof(e->icon))) { + pa_log_warn("Database contains entry for device %s with missing NUL byte in icon", name); + goto fail; + } + + return e; + +fail: + + pa_datum_free(&data); + return NULL; +} + +#ifdef DUMP_DATABASE +static void dump_database_helper(struct userdata *u, uint32_t role_index, const char* human, pa_bool_t sink_mode) { + pa_assert(u); + pa_assert(human); + + if (sink_mode) { + pa_sink *s; + if (PA_INVALID_INDEX != u->preferred_sinks[role_index] && (s = pa_idxset_get_by_index(u->core->sinks, u->preferred_sinks[role_index]))) + pa_log_debug(" %s %s (%s)", human, pa_strnull(pa_proplist_gets(s->proplist, PA_PROP_DEVICE_DESCRIPTION)), s->name); + else + pa_log_debug(" %s No sink specified", human); + } else { + pa_source *s; + if (PA_INVALID_INDEX != u->preferred_sources[role_index] && (s = pa_idxset_get_by_index(u->core->sources, u->preferred_sources[role_index]))) + pa_log_debug(" %s %s (%s)", human, pa_strnull(pa_proplist_gets(s->proplist, PA_PROP_DEVICE_DESCRIPTION)), s->name); + else + pa_log_debug(" %s No source specified", human); + } +} + +static void dump_database(struct userdata *u) { + pa_datum key; + pa_bool_t done; + + pa_assert(u); + + done = !pa_database_first(u->database, &key, NULL); + + pa_log_debug("Dumping database"); + while (!done) { + char *name; + struct entry *e; + pa_datum next_key; + + done = !pa_database_next(u->database, &key, &next_key, NULL); + + name = pa_xstrndup(key.data, key.size); + + if ((e = read_entry(u, name))) { + pa_log_debug(" Got entry: %s", name); + pa_log_debug(" Description: %s", e->description); + pa_log_debug(" Priorities: None: %3u, Video: %3u, Music: %3u, Game: %3u, Event: %3u", + e->priority[ROLE_NONE], e->priority[ROLE_VIDEO], e->priority[ROLE_MUSIC], e->priority[ROLE_GAME], e->priority[ROLE_EVENT]); + pa_log_debug(" Phone: %3u, Anim: %3u, Prodtn: %3u, A11y: %3u", + e->priority[ROLE_PHONE], e->priority[ROLE_ANIMATION], e->priority[ROLE_PRODUCTION], e->priority[ROLE_A11Y]); + pa_xfree(e); + } + + pa_xfree(name); + + pa_datum_free(&key); + key = next_key; + } + + if (u->do_routing) { + pa_log_debug(" Highest priority devices per-role:"); + + pa_log_debug(" Sinks:"); + for (uint32_t role = ROLE_NONE; role < NUM_ROLES; ++role) { + char name[13]; + uint32_t len = PA_MIN(12u, strlen(role_names[role])); + strncpy(name, role_names[role], len); + for (int i = len+1; i < 12; ++i) name[i] = ' '; + name[len] = ':'; name[0] -= 32; name[12] = '\0'; + dump_database_helper(u, role, name, TRUE); + } + + pa_log_debug(" Sources:"); + for (uint32_t role = ROLE_NONE; role < NUM_ROLES; ++role) { + char name[13]; + uint32_t len = PA_MIN(12u, strlen(role_names[role])); + strncpy(name, role_names[role], len); + for (int i = len+1; i < 12; ++i) name[i] = ' '; + name[len] = ':'; name[0] -= 32; name[12] = '\0'; + dump_database_helper(u, role, name, FALSE); + } + } + + pa_log_debug("Completed database dump"); +} +#endif + +static void save_time_callback(pa_mainloop_api*a, pa_time_event* e, const struct timeval *t, void *userdata) { + struct userdata *u = userdata; + + pa_assert(a); + pa_assert(e); + pa_assert(u); + + pa_assert(e == u->save_time_event); + u->core->mainloop->time_free(u->save_time_event); + u->save_time_event = NULL; + + pa_database_sync(u->database); + pa_log_info("Synced."); + +#ifdef DUMP_DATABASE + dump_database(u); +#endif +} + +static void notify_subscribers(struct userdata *u) { + + pa_native_connection *c; + uint32_t idx; + + pa_assert(u); + + for (c = pa_idxset_first(u->subscribed, &idx); c; c = pa_idxset_next(u->subscribed, &idx)) { + pa_tagstruct *t; + + t = pa_tagstruct_new(NULL, 0); + pa_tagstruct_putu32(t, PA_COMMAND_EXTENSION); + pa_tagstruct_putu32(t, 0); + pa_tagstruct_putu32(t, u->module->index); + pa_tagstruct_puts(t, u->module->name); + pa_tagstruct_putu32(t, SUBCOMMAND_EVENT); + + pa_pstream_send_tagstruct(pa_native_connection_get_pstream(c), t); + } +} + +static void trigger_save(struct userdata *u) { + + pa_assert(u); + + notify_subscribers(u); + + if (u->save_time_event) + return; + + u->save_time_event = pa_core_rttime_new(u->core, pa_rtclock_now() + SAVE_INTERVAL, save_time_callback, u); +} + +static pa_bool_t entries_equal(const struct entry *a, const struct entry *b) { + + pa_assert(a); + pa_assert(b); + + if (strncmp(a->description, b->description, sizeof(a->description)) + || a->user_set_description != b->user_set_description + || strncmp(a->icon, b->icon, sizeof(a->icon))) + return FALSE; + + for (int i=0; i < NUM_ROLES; ++i) + if (a->priority[i] != b->priority[i]) + return FALSE; + + return TRUE; +} + +static char *get_name(const char *key, const char *prefix) { + char *t; + + if (strncmp(key, prefix, strlen(prefix))) + return NULL; + + t = pa_xstrdup(key + strlen(prefix)); + return t; +} + +static inline struct entry *load_or_initialize_entry(struct userdata *u, struct entry *entry, const char *name, const char *prefix) { + struct entry *old; + + pa_assert(u); + pa_assert(entry); + pa_assert(name); + pa_assert(prefix); + + if ((old = read_entry(u, name))) + *entry = *old; + else { + /* This is a new device, so make sure we write it's priority list correctly */ + role_indexes_t max_priority; + pa_datum key; + pa_bool_t done; + + pa_zero(max_priority); + done = !pa_database_first(u->database, &key, NULL); + + /* Find all existing devices with the same prefix so we calculate the current max priority for each role */ + while (!done) { + pa_datum next_key; + + done = !pa_database_next(u->database, &key, &next_key, NULL); + + if (key.size > strlen(prefix) && strncmp(key.data, prefix, strlen(prefix)) == 0) { + char *name2; + struct entry *e; + + name2 = pa_xstrndup(key.data, key.size); + + if ((e = read_entry(u, name2))) { + for (uint32_t i = 0; i < NUM_ROLES; ++i) { + max_priority[i] = PA_MAX(max_priority[i], e->priority[i]); + } + + pa_xfree(e); + } + + pa_xfree(name2); + } + pa_datum_free(&key); + key = next_key; + } + + /* Actually initialise our entry now we've calculated it */ + for (uint32_t i = 0; i < NUM_ROLES; ++i) { + entry->priority[i] = max_priority[i] + 1; + } + entry->user_set_description = FALSE; + } + + return old; +} + +static uint32_t get_role_index(const char* role) { + pa_assert(role); + + for (uint32_t i = ROLE_NONE; i < NUM_ROLES; ++i) + if (strcmp(role, role_names[i]) == 0) + return i; + + return PA_INVALID_INDEX; +} + +static void update_highest_priority_device_indexes(struct userdata *u, const char *prefix, void *ignore_device) { + role_indexes_t *indexes, highest_priority_available; + pa_datum key; + pa_bool_t done, sink_mode; + + pa_assert(u); + pa_assert(prefix); + + sink_mode = (strcmp(prefix, "sink:") == 0); + + if (sink_mode) + indexes = &u->preferred_sinks; + else + indexes = &u->preferred_sources; + + for (uint32_t i = 0; i < NUM_ROLES; ++i) { + (*indexes)[i] = PA_INVALID_INDEX; + } + pa_zero(highest_priority_available); + + done = !pa_database_first(u->database, &key, NULL); + + /* Find all existing devices with the same prefix so we find the highest priority device for each role */ + while (!done) { + pa_datum next_key; + + done = !pa_database_next(u->database, &key, &next_key, NULL); + + if (key.size > strlen(prefix) && strncmp(key.data, prefix, strlen(prefix)) == 0) { + char *name, *device_name; + struct entry *e; + + name = pa_xstrndup(key.data, key.size); + device_name = get_name(name, prefix); + + if ((e = read_entry(u, name))) { + for (uint32_t i = 0; i < NUM_ROLES; ++i) { + if (!highest_priority_available[i] || e->priority[i] < highest_priority_available[i]) { + /* We've found a device with a higher priority than that we've currently got, + so see if it is currently available or not and update our list */ + uint32_t idx; + pa_bool_t found = FALSE; + + if (sink_mode) { + pa_sink *sink; + + PA_IDXSET_FOREACH(sink, u->core->sinks, idx) { + if ((pa_sink*) ignore_device == sink) + continue; + if (strcmp(sink->name, device_name) == 0) { + found = TRUE; + idx = sink->index; /* Is this needed? */ + break; + } + } + } else { + pa_source *source; + + PA_IDXSET_FOREACH(source, u->core->sources, idx) { + if ((pa_source*) ignore_device == source) + continue; + if (strcmp(source->name, device_name) == 0) { + found = TRUE; + idx = source->index; /* Is this needed? */ + break; + } + } + } + if (found) { + highest_priority_available[i] = e->priority[i]; + (*indexes)[i] = idx; + } + + } + } + + pa_xfree(e); + } + + pa_xfree(name); + pa_xfree(device_name); + } + + pa_datum_free(&key); + key = next_key; + } +} + + +static void route_sink_input(struct userdata *u, pa_sink_input *si) { + const char *role; + uint32_t role_index, device_index; + pa_sink *sink; + + pa_assert(u); + pa_assert(u->do_routing); + + if (si->save_sink) + return; + + /* Skip this if it is already in the process of being moved anyway */ + if (!si->sink) + return; + + /* It might happen that a stream and a sink are set up at the + same time, in which case we want to make sure we don't + interfere with that */ + if (!PA_SINK_INPUT_IS_LINKED(pa_sink_input_get_state(si))) + return; + + if (!(role = pa_proplist_gets(si->proplist, PA_PROP_MEDIA_ROLE))) + role_index = get_role_index("none"); + else + role_index = get_role_index(role); + + if (PA_INVALID_INDEX == role_index) + return; + + device_index = u->preferred_sinks[role_index]; + if (PA_INVALID_INDEX == device_index) + return; + + if (!(sink = pa_idxset_get_by_index(u->core->sinks, device_index))) + return; + + if (si->sink != sink) + pa_sink_input_move_to(si, sink, FALSE); +} + +static pa_hook_result_t route_sink_inputs(struct userdata *u, pa_sink *ignore_sink) { + pa_sink_input *si; + uint32_t idx; + + pa_assert(u); + + if (!u->do_routing) + return PA_HOOK_OK; + + update_highest_priority_device_indexes(u, "sink:", ignore_sink); + + PA_IDXSET_FOREACH(si, u->core->sink_inputs, idx) { + route_sink_input(u, si); + } + + return PA_HOOK_OK; +} + +static void route_source_output(struct userdata *u, pa_source_output *so) { + const char *role; + uint32_t role_index, device_index; + pa_source *source; + + pa_assert(u); + pa_assert(u->do_routing); + + if (so->save_source) + return; + + if (so->direct_on_input) + return; + + /* Skip this if it is already in the process of being moved anyway */ + if (!so->source) + return; + + /* It might happen that a stream and a source are set up at the + same time, in which case we want to make sure we don't + interfere with that */ + if (!PA_SOURCE_OUTPUT_IS_LINKED(pa_source_output_get_state(so))) + return; + + if (!(role = pa_proplist_gets(so->proplist, PA_PROP_MEDIA_ROLE))) + role_index = get_role_index("none"); + else + role_index = get_role_index(role); + + if (PA_INVALID_INDEX == role_index) + return; + + device_index = u->preferred_sources[role_index]; + if (PA_INVALID_INDEX == device_index) + return; + + if (!(source = pa_idxset_get_by_index(u->core->sources, device_index))) + return; + + if (so->source != source) + pa_source_output_move_to(so, source, FALSE); +} + +static pa_hook_result_t route_source_outputs(struct userdata *u, pa_source* ignore_source) { + pa_source_output *so; + uint32_t idx; + + pa_assert(u); + + if (!u->do_routing) + return PA_HOOK_OK; + + update_highest_priority_device_indexes(u, "source:", ignore_source); + + PA_IDXSET_FOREACH(so, u->core->source_outputs, idx) { + route_source_output(u, so); + } + + return PA_HOOK_OK; +} + +static void subscribe_callback(pa_core *c, pa_subscription_event_type_t t, uint32_t idx, void *userdata) { + struct userdata *u = userdata; + struct entry entry, *old = NULL; + char *name = NULL; + pa_datum key, data; + + pa_assert(c); + pa_assert(u); + + if (t != (PA_SUBSCRIPTION_EVENT_SINK|PA_SUBSCRIPTION_EVENT_NEW) && + t != (PA_SUBSCRIPTION_EVENT_SINK|PA_SUBSCRIPTION_EVENT_CHANGE) && + t != (PA_SUBSCRIPTION_EVENT_SOURCE|PA_SUBSCRIPTION_EVENT_NEW) && + t != (PA_SUBSCRIPTION_EVENT_SOURCE|PA_SUBSCRIPTION_EVENT_CHANGE) && + + /*t != (PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_NEW) &&*/ + t != (PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_CHANGE) && + /*t != (PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT|PA_SUBSCRIPTION_EVENT_NEW) &&*/ + t != (PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT|PA_SUBSCRIPTION_EVENT_CHANGE)) + return; + + pa_zero(entry); + entry.version = ENTRY_VERSION; + + if ((t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) == PA_SUBSCRIPTION_EVENT_SINK_INPUT) { + pa_sink_input *si; + + if (!u->do_routing) + return; + if (!(si = pa_idxset_get_by_index(c->sink_inputs, idx))) + return; + + /* The role may change mid-stream, so we reroute */ + route_sink_input(u, si); + + return; + } else if ((t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) == PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT) { + pa_source_output *so; + + if (!u->do_routing) + return; + if (!(so = pa_idxset_get_by_index(c->source_outputs, idx))) + return; + + /* The role may change mid-stream, so we reroute */ + route_source_output(u, so); + + return; + } else if ((t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) == PA_SUBSCRIPTION_EVENT_SINK) { + pa_sink *sink; + + if (!(sink = pa_idxset_get_by_index(c->sinks, idx))) + return; + + name = pa_sprintf_malloc("sink:%s", sink->name); + + old = load_or_initialize_entry(u, &entry, name, "sink:"); + + if (!entry.user_set_description) + pa_strlcpy(entry.description, pa_strnull(pa_proplist_gets(sink->proplist, PA_PROP_DEVICE_DESCRIPTION)), sizeof(entry.description)); + else if (strncmp(entry.description, pa_strnull(pa_proplist_gets(sink->proplist, PA_PROP_DEVICE_DESCRIPTION)), sizeof(entry.description)) != 0) { + /* Warning: If two modules fight over the description, this could cause an infinite loop. + by changing the description here, we retrigger this subscription callback. The only thing stopping us from + looping is the fact that the string comparison will fail on the second iteration. If another module tries to manage + the description, this will fail... */ + pa_sink_set_description(sink, entry.description); + } + + pa_strlcpy(entry.icon, pa_strnull(pa_proplist_gets(sink->proplist, PA_PROP_DEVICE_ICON_NAME)), sizeof(entry.icon)); + + } else if ((t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) == PA_SUBSCRIPTION_EVENT_SOURCE) { + pa_source *source; + + pa_assert((t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) == PA_SUBSCRIPTION_EVENT_SOURCE); + + if (!(source = pa_idxset_get_by_index(c->sources, idx))) + return; + + if (source->monitor_of) + return; + + name = pa_sprintf_malloc("source:%s", source->name); + + old = load_or_initialize_entry(u, &entry, name, "source:"); + + if (!entry.user_set_description) + pa_strlcpy(entry.description, pa_strnull(pa_proplist_gets(source->proplist, PA_PROP_DEVICE_DESCRIPTION)), sizeof(entry.description)); + else if (strncmp(entry.description, pa_strnull(pa_proplist_gets(source->proplist, PA_PROP_DEVICE_DESCRIPTION)), sizeof(entry.description)) != 0) { + /* Warning: If two modules fight over the description, this could cause an infinite loop. + by changing the description here, we retrigger this subscription callback. The only thing stopping us from + looping is the fact that the string comparison will fail on the second iteration. If another module tries to manage + the description, this will fail... */ + pa_source_set_description(source, entry.description); + } + + pa_strlcpy(entry.icon, pa_strnull(pa_proplist_gets(source->proplist, PA_PROP_DEVICE_ICON_NAME)), sizeof(entry.icon)); + } + + pa_assert(name); + + if (old) { + + if (entries_equal(old, &entry)) { + pa_xfree(old); + pa_xfree(name); + + return; + } + + pa_xfree(old); + } + + key.data = name; + key.size = strlen(name); + + data.data = &entry; + data.size = sizeof(entry); + + pa_log_info("Storing device %s.", name); + + if (pa_database_set(u->database, &key, &data, TRUE) == 0) + trigger_save(u); + else + pa_log_warn("Could not save device");; + + pa_xfree(name); +} + +static pa_hook_result_t sink_new_hook_callback(pa_core *c, pa_sink_new_data *new_data, struct userdata *u) { + char *name; + struct entry *e; + + pa_assert(c); + pa_assert(new_data); + pa_assert(u); + + name = pa_sprintf_malloc("sink:%s", new_data->name); + + if ((e = read_entry(u, name))) { + if (e->user_set_description && strncmp(e->description, pa_proplist_gets(new_data->proplist, PA_PROP_DEVICE_DESCRIPTION), sizeof(e->description)) != 0) { + pa_log_info("Restoring description for sink %s.", new_data->name); + pa_proplist_sets(new_data->proplist, PA_PROP_DEVICE_DESCRIPTION, e->description); + } + + pa_xfree(e); + } + + pa_xfree(name); + + return PA_HOOK_OK; +} + +static pa_hook_result_t source_new_hook_callback(pa_core *c, pa_source_new_data *new_data, struct userdata *u) { + char *name; + struct entry *e; + + pa_assert(c); + pa_assert(new_data); + pa_assert(u); + + name = pa_sprintf_malloc("source:%s", new_data->name); + + if ((e = read_entry(u, name))) { + if (e->user_set_description && strncmp(e->description, pa_proplist_gets(new_data->proplist, PA_PROP_DEVICE_DESCRIPTION), sizeof(e->description)) != 0) { + /* NB, We cannot detect if we are a monitor here... this could mess things up a bit... */ + pa_log_info("Restoring description for source %s.", new_data->name); + pa_proplist_sets(new_data->proplist, PA_PROP_DEVICE_DESCRIPTION, e->description); + } + + pa_xfree(e); + } + + pa_xfree(name); + + return PA_HOOK_OK; +} + +static pa_hook_result_t sink_input_new_hook_callback(pa_core *c, pa_sink_input_new_data *new_data, struct userdata *u) { + const char *role; + uint32_t role_index; + + pa_assert(c); + pa_assert(new_data); + pa_assert(u); + + if (!u->do_routing) + return PA_HOOK_OK; + + if (new_data->sink) + pa_log_debug("Not restoring device for stream because already set."); + else { + if (!(role = pa_proplist_gets(new_data->proplist, PA_PROP_MEDIA_ROLE))) + role_index = get_role_index("none"); + else + role_index = get_role_index(role); + + if (PA_INVALID_INDEX != role_index) { + uint32_t device_index; + + device_index = u->preferred_sinks[role_index]; + if (PA_INVALID_INDEX != device_index) { + pa_sink *sink; + + if ((sink = pa_idxset_get_by_index(u->core->sinks, device_index))) { + new_data->sink = sink; + new_data->save_sink = FALSE; + } + } + } + } + + return PA_HOOK_OK; +} + +static pa_hook_result_t source_output_new_hook_callback(pa_core *c, pa_source_output_new_data *new_data, struct userdata *u) { + const char *role; + uint32_t role_index; + + pa_assert(c); + pa_assert(new_data); + pa_assert(u); + + if (!u->do_routing) + return PA_HOOK_OK; + + if (new_data->direct_on_input) + return PA_HOOK_OK; + + if (new_data->source) + pa_log_debug("Not restoring device for stream because already set."); + else { + if (!(role = pa_proplist_gets(new_data->proplist, PA_PROP_MEDIA_ROLE))) + role_index = get_role_index("none"); + else + role_index = get_role_index(role); + + if (PA_INVALID_INDEX != role_index) { + uint32_t device_index; + + device_index = u->preferred_sources[role_index]; + if (PA_INVALID_INDEX != device_index) { + pa_source *source; + + if ((source = pa_idxset_get_by_index(u->core->sources, device_index))) { + new_data->source = source; + new_data->save_source = FALSE; + } + } + } + } + + return PA_HOOK_OK; +} + + +static pa_hook_result_t sink_put_hook_callback(pa_core *c, PA_GCC_UNUSED pa_sink *sink, struct userdata *u) { + pa_assert(c); + pa_assert(u); + pa_assert(u->core == c); + pa_assert(u->on_hotplug); + + notify_subscribers(u); + + return route_sink_inputs(u, NULL); +} + +static pa_hook_result_t source_put_hook_callback(pa_core *c, PA_GCC_UNUSED pa_source *source, struct userdata *u) { + pa_assert(c); + pa_assert(u); + pa_assert(u->core == c); + pa_assert(u->on_hotplug); + + notify_subscribers(u); + + return route_source_outputs(u, NULL); +} + +static pa_hook_result_t sink_unlink_hook_callback(pa_core *c, pa_sink *sink, struct userdata *u) { + pa_assert(c); + pa_assert(sink); + pa_assert(u); + pa_assert(u->core == c); + pa_assert(u->on_rescue); + + /* There's no point in doing anything if the core is shut down anyway */ + if (c->state == PA_CORE_SHUTDOWN) + return PA_HOOK_OK; + + notify_subscribers(u); + + return route_sink_inputs(u, sink); +} + +static pa_hook_result_t source_unlink_hook_callback(pa_core *c, pa_source *source, struct userdata *u) { + pa_assert(c); + pa_assert(source); + pa_assert(u); + pa_assert(u->core == c); + pa_assert(u->on_rescue); + + /* There's no point in doing anything if the core is shut down anyway */ + if (c->state == PA_CORE_SHUTDOWN) + return PA_HOOK_OK; + + notify_subscribers(u); + + return route_source_outputs(u, source); +} + + +static void apply_entry(struct userdata *u, const char *name, struct entry *e) { + uint32_t idx; + char *n; + + pa_assert(u); + pa_assert(name); + pa_assert(e); + + if (!e->user_set_description) + return; + + if ((n = get_name(name, "sink:"))) { + pa_sink *s; + PA_IDXSET_FOREACH(s, u->core->sinks, idx) { + if (!pa_streq(s->name, n)) { + continue; + } + + pa_log_info("Setting description for sink %s to '%s'", s->name, e->description); + pa_sink_set_description(s, e->description); + } + pa_xfree(n); + } + else if ((n = get_name(name, "source:"))) { + pa_source *s; + PA_IDXSET_FOREACH(s, u->core->sources, idx) { + if (!pa_streq(s->name, n)) { + continue; + } + + if (s->monitor_of) { + pa_log_warn("Cowardly refusing to set the description for monitor source %s.", s->name); + continue; + } + + pa_log_info("Setting description for source %s to '%s'", s->name, e->description); + pa_source_set_description(s, e->description); + } + pa_xfree(n); + } +} + + +#define EXT_VERSION 1 + +static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connection *c, uint32_t tag, pa_tagstruct *t) { + struct userdata *u; + uint32_t command; + pa_tagstruct *reply = NULL; + + pa_assert(p); + pa_assert(m); + pa_assert(c); + pa_assert(t); + + u = m->userdata; + + if (pa_tagstruct_getu32(t, &command) < 0) + goto fail; + + reply = pa_tagstruct_new(NULL, 0); + pa_tagstruct_putu32(reply, PA_COMMAND_REPLY); + pa_tagstruct_putu32(reply, tag); + + switch (command) { + case SUBCOMMAND_TEST: { + if (!pa_tagstruct_eof(t)) + goto fail; + + pa_tagstruct_putu32(reply, EXT_VERSION); + break; + } + + case SUBCOMMAND_READ: { + pa_datum key; + pa_bool_t done; + + if (!pa_tagstruct_eof(t)) + goto fail; + + done = !pa_database_first(u->database, &key, NULL); + + while (!done) { + pa_datum next_key; + struct entry *e; + char *name; + + done = !pa_database_next(u->database, &key, &next_key, NULL); + + name = pa_xstrndup(key.data, key.size); + pa_datum_free(&key); + + if ((e = read_entry(u, name))) { + uint32_t idx; + char *devname; + uint32_t found_index = PA_INVALID_INDEX; + + if ((devname = get_name(name, "sink:"))) { + pa_sink* s; + PA_IDXSET_FOREACH(s, u->core->sinks, idx) { + if (strcmp(s->name, devname) == 0) { + found_index = s->index; + break; + } + } + pa_xfree(devname); + } else if ((devname = get_name(name, "source:"))) { + pa_source* s; + PA_IDXSET_FOREACH(s, u->core->sources, idx) { + if (strcmp(s->name, devname) == 0) { + found_index = s->index; + break; + } + } + pa_xfree(devname); + } + + pa_tagstruct_puts(reply, name); + pa_tagstruct_puts(reply, e->description); + pa_tagstruct_puts(reply, e->icon); + pa_tagstruct_putu32(reply, found_index); + pa_tagstruct_putu32(reply, NUM_ROLES); + + for (uint32_t i = ROLE_NONE; i < NUM_ROLES; ++i) { + pa_tagstruct_puts(reply, role_names[i]); + pa_tagstruct_putu32(reply, e->priority[i]); + } + + pa_xfree(e); + } + + pa_xfree(name); + + key = next_key; + } + + break; + } + + case SUBCOMMAND_RENAME: { + + struct entry *e; + const char *device, *description; + + if (pa_tagstruct_gets(t, &device) < 0 || + pa_tagstruct_gets(t, &description) < 0) + goto fail; + + if (!device || !*device || !description || !*description) + goto fail; + + if ((e = read_entry(u, device))) { + pa_datum key, data; + + pa_strlcpy(e->description, description, sizeof(e->description)); + e->user_set_description = TRUE; + + key.data = (char *) device; + key.size = strlen(device); + + data.data = e; + data.size = sizeof(*e); + + if (pa_database_set(u->database, &key, &data, TRUE) == 0) { + apply_entry(u, device, e); + + trigger_save(u); + } + else + pa_log_warn("Could not save device"); + + pa_xfree(e); + } + else + pa_log_warn("Could not rename device %s, no entry in database", device); + + break; + } + + case SUBCOMMAND_DELETE: + + while (!pa_tagstruct_eof(t)) { + const char *name; + pa_datum key; + + if (pa_tagstruct_gets(t, &name) < 0) + goto fail; + + key.data = (char*) name; + key.size = strlen(name); + + /** @todo: Reindex the priorities */ + pa_database_unset(u->database, &key); + } + + trigger_save(u); + + break; + + case SUBCOMMAND_ROLE_DEVICE_PRIORITY_ROUTING: { + + pa_bool_t enable; + + if (pa_tagstruct_get_boolean(t, &enable) < 0) + goto fail; + + if ((u->do_routing = enable)) { + /* Update our caches */ + update_highest_priority_device_indexes(u, "sink:", NULL); + update_highest_priority_device_indexes(u, "source:", NULL); + } + + break; + } + + case SUBCOMMAND_REORDER: { + + const char *role; + struct entry *e; + uint32_t role_index, n_devices; + pa_datum key, data; + pa_bool_t done, sink_mode = TRUE; + struct device_t { uint32_t prio; char *device; }; + struct device_t *device; + struct device_t **devices; + uint32_t i, idx, offset; + pa_hashmap *h; + /*void *state;*/ + pa_bool_t first; + + if (pa_tagstruct_gets(t, &role) < 0 || + pa_tagstruct_getu32(t, &n_devices) < 0 || + n_devices < 1) + goto fail; + + if (PA_INVALID_INDEX == (role_index = get_role_index(role))) + goto fail; + + /* Cycle through the devices given and make sure they exist */ + h = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func); + first = TRUE; + idx = 0; + for (i = 0; i < n_devices; ++i) { + const char *s; + if (pa_tagstruct_gets(t, &s) < 0) { + while ((device = pa_hashmap_steal_first(h))) { + pa_xfree(device->device); + pa_xfree(device); + } + + pa_hashmap_free(h, NULL, NULL); + pa_log_error("Protocol error on reorder"); + goto fail; + } + + /* Ensure this is a valid entry */ + if (!(e = read_entry(u, s))) { + while ((device = pa_hashmap_steal_first(h))) { + pa_xfree(device->device); + pa_xfree(device); + } + + pa_hashmap_free(h, NULL, NULL); + pa_log_error("Client specified an unknown device in it's reorder list."); + goto fail; + } + pa_xfree(e); + + if (first) { + first = FALSE; + sink_mode = (0 == strncmp("sink:", s, 5)); + } else if ((sink_mode && 0 != strncmp("sink:", s, 5)) + || (!sink_mode && 0 != strncmp("source:", s, 7))) + { + while ((device = pa_hashmap_steal_first(h))) { + pa_xfree(device->device); + pa_xfree(device); + } + + pa_hashmap_free(h, NULL, NULL); + pa_log_error("Attempted to reorder mixed devices (sinks and sources)"); + goto fail; + } + + /* Add the device to our hashmap. If it's alredy in it, free it now and carry on */ + device = pa_xnew(struct device_t, 1); + device->device = pa_xstrdup(s); + if (pa_hashmap_put(h, device->device, device) == 0) { + device->prio = idx; + idx++; + } else { + pa_xfree(device->device); + pa_xfree(device); + } + } + + /*pa_log_debug("Hashmap contents (received from client)"); + PA_HASHMAP_FOREACH(device, h, state) { + pa_log_debug(" - %s (%d)", device->device, device->prio); + }*/ + + /* Now cycle through our list and add all the devices. + This has the effect of addign in any in our DB, + not specified in the device list (and thus will be + tacked on at the end) */ + offset = idx; + done = !pa_database_first(u->database, &key, NULL); + + while (!done && idx < 256) { + pa_datum next_key; + + done = !pa_database_next(u->database, &key, &next_key, NULL); + + device = pa_xnew(struct device_t, 1); + device->device = pa_xstrndup(key.data, key.size); + if ((sink_mode && 0 == strncmp("sink:", device->device, 5)) + || (!sink_mode && 0 == strncmp("source:", device->device, 7))) { + + /* Add the device to our hashmap. If it's alredy in it, free it now and carry on */ + if (pa_hashmap_put(h, device->device, device) == 0 + && (e = read_entry(u, device->device))) { + /* We add offset on to the existing priorirty so that when we order, the + existing entries are always lower priority than the new ones. */ + device->prio = (offset + e->priority[role_index]); + pa_xfree(e); + } + else { + pa_xfree(device->device); + pa_xfree(device); + } + } else { + pa_xfree(device->device); + pa_xfree(device); + } + + pa_datum_free(&key); + + key = next_key; + } + + /*pa_log_debug("Hashmap contents (combined with database)"); + PA_HASHMAP_FOREACH(device, h, state) { + pa_log_debug(" - %s (%d)", device->device, device->prio); + }*/ + + /* Now we put all the entries in a simple list for sorting it. */ + n_devices = pa_hashmap_size(h); + devices = pa_xnew(struct device_t *, n_devices); + idx = 0; + while ((device = pa_hashmap_steal_first(h))) { + devices[idx++] = device; + } + pa_hashmap_free(h, NULL, NULL); + + /* Simple bubble sort */ + for (i = 0; i < n_devices; ++i) { + for (uint32_t j = i; j < n_devices; ++j) { + if (devices[i]->prio > devices[j]->prio) { + struct device_t *tmp; + tmp = devices[i]; + devices[i] = devices[j]; + devices[j] = tmp; + } + } + } + + /*pa_log_debug("Sorted device list"); + for (i = 0; i < n_devices; ++i) { + pa_log_debug(" - %s (%d)", devices[i]->device, devices[i]->prio); + }*/ + + /* Go through in order and write the new entry and cleanup our own list */ + idx = 1; + first = TRUE; + for (i = 0; i < n_devices; ++i) { + if ((e = read_entry(u, devices[i]->device))) { + if (e->priority[role_index] == idx) + idx++; + else { + e->priority[role_index] = idx; + + key.data = (char *) devices[i]->device; + key.size = strlen(devices[i]->device); + + data.data = e; + data.size = sizeof(*e); + + if (pa_database_set(u->database, &key, &data, TRUE) == 0) { + first = FALSE; + idx++; + } + } + + pa_xfree(e); + } + pa_xfree(devices[i]->device); + pa_xfree(devices[i]); + } + + if (!first) { + trigger_save(u); + + if (sink_mode) + route_sink_inputs(u, NULL); + else + route_source_outputs(u, NULL); + } + + break; + } + + case SUBCOMMAND_SUBSCRIBE: { + + pa_bool_t enabled; + + if (pa_tagstruct_get_boolean(t, &enabled) < 0 || + !pa_tagstruct_eof(t)) + goto fail; + + if (enabled) + pa_idxset_put(u->subscribed, c, NULL); + else + pa_idxset_remove_by_data(u->subscribed, c, NULL); + + break; + } + + default: + goto fail; + } + + pa_pstream_send_tagstruct(pa_native_connection_get_pstream(c), reply); + return 0; + + fail: + + if (reply) + pa_tagstruct_free(reply); + + return -1; +} + +static pa_hook_result_t connection_unlink_hook_cb(pa_native_protocol *p, pa_native_connection *c, struct userdata *u) { + pa_assert(p); + pa_assert(c); + pa_assert(u); + + pa_idxset_remove_by_data(u->subscribed, c, NULL); + return PA_HOOK_OK; +} + +int pa__init(pa_module*m) { + pa_modargs *ma = NULL; + struct userdata *u; + char *fname; + pa_sink *sink; + pa_source *source; + uint32_t idx; + pa_bool_t do_routing = FALSE, on_hotplug = TRUE, on_rescue = TRUE; + + pa_assert(m); + + if (!(ma = pa_modargs_new(m->argument, valid_modargs))) { + pa_log("Failed to parse module arguments"); + goto fail; + } + + if (pa_modargs_get_value_boolean(ma, "do_routing", &do_routing) < 0 || + pa_modargs_get_value_boolean(ma, "on_hotplug", &on_hotplug) < 0 || + pa_modargs_get_value_boolean(ma, "on_rescue", &on_rescue) < 0) { + pa_log("on_hotplug= and on_rescue= expect boolean arguments"); + goto fail; + } + + m->userdata = u = pa_xnew0(struct userdata, 1); + u->core = m->core; + u->module = m; + u->do_routing = do_routing; + u->on_hotplug = on_hotplug; + u->on_rescue = on_rescue; + u->subscribed = pa_idxset_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func); + + u->protocol = pa_native_protocol_get(m->core); + pa_native_protocol_install_ext(u->protocol, m, extension_cb); + + u->connection_unlink_hook_slot = pa_hook_connect(&pa_native_protocol_hooks(u->protocol)[PA_NATIVE_HOOK_CONNECTION_UNLINK], PA_HOOK_NORMAL, (pa_hook_cb_t) connection_unlink_hook_cb, u); + + u->subscription = pa_subscription_new(m->core, PA_SUBSCRIPTION_MASK_SINK|PA_SUBSCRIPTION_MASK_SOURCE|PA_SUBSCRIPTION_MASK_SINK_INPUT|PA_SUBSCRIPTION_MASK_SOURCE_OUTPUT, subscribe_callback, u); + + /* Used to handle device description management */ + u->sink_new_hook_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_NEW], PA_HOOK_EARLY, (pa_hook_cb_t) sink_new_hook_callback, u); + u->source_new_hook_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SOURCE_NEW], PA_HOOK_EARLY, (pa_hook_cb_t) source_new_hook_callback, u); + + /* The following slots are used to deal with routing */ + /* A little bit later than module-stream-restore, but before module-intended-roles */ + u->sink_input_new_hook_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_INPUT_NEW], PA_HOOK_EARLY+5, (pa_hook_cb_t) sink_input_new_hook_callback, u); + u->source_output_new_hook_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SOURCE_OUTPUT_NEW], PA_HOOK_EARLY+5, (pa_hook_cb_t) source_output_new_hook_callback, u); + + if (on_hotplug) { + /* A little bit later than module-stream-restore, but before module-intended-roles */ + u->sink_put_hook_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_PUT], PA_HOOK_LATE+5, (pa_hook_cb_t) sink_put_hook_callback, u); + u->source_put_hook_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SOURCE_PUT], PA_HOOK_LATE+5, (pa_hook_cb_t) source_put_hook_callback, u); + } + + if (on_rescue) { + /* A little bit later than module-stream-restore, a little bit earlier than module-intended-roles, module-rescue-streams, ... */ + u->sink_unlink_hook_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_UNLINK], PA_HOOK_LATE+5, (pa_hook_cb_t) sink_unlink_hook_callback, u); + u->source_unlink_hook_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SOURCE_UNLINK], PA_HOOK_LATE+5, (pa_hook_cb_t) source_unlink_hook_callback, u); + } + + if (!(fname = pa_state_path("device-manager", TRUE))) + goto fail; + + if (!(u->database = pa_database_open(fname, TRUE))) { + pa_log("Failed to open volume database '%s': %s", fname, pa_cstrerror(errno)); + pa_xfree(fname); + goto fail; + } + + pa_log_info("Sucessfully opened database file '%s'.", fname); + pa_xfree(fname); + + /* We cycle over all the available sinks so that they are added to our database if they are not in it yet */ + PA_IDXSET_FOREACH(sink, m->core->sinks, idx) + subscribe_callback(m->core, PA_SUBSCRIPTION_EVENT_SINK|PA_SUBSCRIPTION_EVENT_NEW, sink->index, u); + + PA_IDXSET_FOREACH(source, m->core->sources, idx) + subscribe_callback(m->core, PA_SUBSCRIPTION_EVENT_SOURCE|PA_SUBSCRIPTION_EVENT_NEW, source->index, u); + + /* Perform the routing (if it's enabled) which will update our priority list cache too */ + for (uint32_t i = 0; i < NUM_ROLES; ++i) { + u->preferred_sinks[i] = u->preferred_sources[i] = PA_INVALID_INDEX; + } + + route_sink_inputs(u, NULL); + route_source_outputs(u, NULL); + +#ifdef DUMP_DATABASE + dump_database(u); +#endif + + pa_modargs_free(ma); + return 0; + +fail: + pa__done(m); + + if (ma) + pa_modargs_free(ma); + + return -1; +} + +void pa__done(pa_module*m) { + struct userdata* u; + + pa_assert(m); + + if (!(u = m->userdata)) + return; + + if (u->subscription) + pa_subscription_free(u->subscription); + + if (u->sink_new_hook_slot) + pa_hook_slot_free(u->sink_new_hook_slot); + if (u->source_new_hook_slot) + pa_hook_slot_free(u->source_new_hook_slot); + + if (u->sink_input_new_hook_slot) + pa_hook_slot_free(u->sink_input_new_hook_slot); + if (u->source_output_new_hook_slot) + pa_hook_slot_free(u->source_output_new_hook_slot); + + if (u->sink_put_hook_slot) + pa_hook_slot_free(u->sink_put_hook_slot); + if (u->source_put_hook_slot) + pa_hook_slot_free(u->source_put_hook_slot); + + if (u->sink_unlink_hook_slot) + pa_hook_slot_free(u->sink_unlink_hook_slot); + if (u->source_unlink_hook_slot) + pa_hook_slot_free(u->source_unlink_hook_slot); + + if (u->save_time_event) + u->core->mainloop->time_free(u->save_time_event); + + if (u->database) + pa_database_close(u->database); + + if (u->protocol) { + pa_native_protocol_remove_ext(u->protocol, m); + pa_native_protocol_unref(u->protocol); + } + + if (u->subscribed) + pa_idxset_free(u->subscribed, NULL, NULL); + + pa_xfree(u); +} diff --git a/src/modules/module-device-restore-symdef.h b/src/modules/module-device-restore-symdef.h new file mode 100644 index 0000000..a97febf --- /dev/null +++ b/src/modules/module-device-restore-symdef.h @@ -0,0 +1,29 @@ +#ifndef foomoduledevicerestoresymdeffoo +#define foomoduledevicerestoresymdeffoo + +#include +#include +#include + +#define pa__init module_device_restore_LTX_pa__init +#define pa__done module_device_restore_LTX_pa__done +#define pa__get_author module_device_restore_LTX_pa__get_author +#define pa__get_description module_device_restore_LTX_pa__get_description +#define pa__get_usage module_device_restore_LTX_pa__get_usage +#define pa__get_version module_device_restore_LTX_pa__get_version +#define pa__get_deprecated module_device_restore_LTX_pa__get_deprecated +#define pa__load_once module_device_restore_LTX_pa__load_once +#define pa__get_n_used module_device_restore_LTX_pa__get_n_used + +int pa__init(pa_module*m); +void pa__done(pa_module*m); +int pa__get_n_used(pa_module*m); + +const char* pa__get_author(void); +const char* pa__get_description(void); +const char* pa__get_usage(void); +const char* pa__get_version(void); +const char* pa__get_deprecated(void); +pa_bool_t pa__load_once(void); + +#endif diff --git a/src/modules/module-device-restore.c b/src/modules/module-device-restore.c new file mode 100644 index 0000000..da6c966 --- /dev/null +++ b/src/modules/module-device-restore.c @@ -0,0 +1,547 @@ +/*** + This file is part of PulseAudio. + + Copyright 2006-2008 Lennart Poettering + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "module-device-restore-symdef.h" + +PA_MODULE_AUTHOR("Lennart Poettering"); +PA_MODULE_DESCRIPTION("Automatically restore the volume/mute state of devices"); +PA_MODULE_VERSION(PACKAGE_VERSION); +PA_MODULE_LOAD_ONCE(TRUE); +PA_MODULE_USAGE( + "restore_port= " + "restore_volume= " + "restore_muted="); + +#define SAVE_INTERVAL (10 * PA_USEC_PER_SEC) + +static const char* const valid_modargs[] = { + "restore_volume", + "restore_muted", + "restore_port", + NULL +}; + +struct userdata { + pa_core *core; + pa_module *module; + pa_subscription *subscription; + pa_hook_slot + *sink_new_hook_slot, + *sink_fixate_hook_slot, + *source_new_hook_slot, + *source_fixate_hook_slot; + pa_time_event *save_time_event; + pa_database *database; + + pa_bool_t restore_volume:1; + pa_bool_t restore_muted:1; + pa_bool_t restore_port:1; +}; + +#define ENTRY_VERSION 2 + +struct entry { + uint8_t version; + pa_bool_t muted_valid:1, volume_valid:1, port_valid:1; + pa_bool_t muted:1; + pa_channel_map channel_map; + pa_cvolume volume; + char port[PA_NAME_MAX]; +} PA_GCC_PACKED; + +static void save_time_callback(pa_mainloop_api*a, pa_time_event* e, const struct timeval *t, void *userdata) { + struct userdata *u = userdata; + + pa_assert(a); + pa_assert(e); + pa_assert(u); + + pa_assert(e == u->save_time_event); + u->core->mainloop->time_free(u->save_time_event); + u->save_time_event = NULL; + + pa_database_sync(u->database); + pa_log_info("Synced."); +} + +static struct entry* read_entry(struct userdata *u, const char *name) { + pa_datum key, data; + struct entry *e; + + pa_assert(u); + pa_assert(name); + + key.data = (char*) name; + key.size = strlen(name); + + pa_zero(data); + + if (!pa_database_get(u->database, &key, &data)) + goto fail; + + if (data.size != sizeof(struct entry)) { + pa_log_debug("Database contains entry for device %s of wrong size %lu != %lu. Probably due to upgrade, ignoring.", name, (unsigned long) data.size, (unsigned long) sizeof(struct entry)); + goto fail; + } + + e = (struct entry*) data.data; + + if (e->version != ENTRY_VERSION) { + pa_log_debug("Version of database entry for device %s doesn't match our version. Probably due to upgrade, ignoring.", name); + goto fail; + } + + if (!memchr(e->port, 0, sizeof(e->port))) { + pa_log_warn("Database contains entry for device %s with missing NUL byte in port name", name); + goto fail; + } + + if (e->volume_valid && !pa_channel_map_valid(&e->channel_map)) { + pa_log_warn("Invalid channel map stored in database for device %s", name); + goto fail; + } + + if (e->volume_valid && (!pa_cvolume_valid(&e->volume) || !pa_cvolume_compatible_with_channel_map(&e->volume, &e->channel_map))) { + pa_log_warn("Volume and channel map don't match in database entry for device %s", name); + goto fail; + } + + return e; + +fail: + + pa_datum_free(&data); + return NULL; +} + +static void trigger_save(struct userdata *u) { + if (u->save_time_event) + return; + + u->save_time_event = pa_core_rttime_new(u->core, pa_rtclock_now() + SAVE_INTERVAL, save_time_callback, u); +} + +static pa_bool_t entries_equal(const struct entry *a, const struct entry *b) { + pa_cvolume t; + + if (a->port_valid != b->port_valid || + (a->port_valid && strncmp(a->port, b->port, sizeof(a->port)))) + return FALSE; + + if (a->muted_valid != b->muted_valid || + (a->muted_valid && (a->muted != b->muted))) + return FALSE; + + t = b->volume; + if (a->volume_valid != b->volume_valid || + (a->volume_valid && !pa_cvolume_equal(pa_cvolume_remap(&t, &b->channel_map, &a->channel_map), &a->volume))) + return FALSE; + + return TRUE; +} + +static void subscribe_callback(pa_core *c, pa_subscription_event_type_t t, uint32_t idx, void *userdata) { + struct userdata *u = userdata; + struct entry entry, *old; + char *name; + pa_datum key, data; + + pa_assert(c); + pa_assert(u); + + if (t != (PA_SUBSCRIPTION_EVENT_SINK|PA_SUBSCRIPTION_EVENT_NEW) && + t != (PA_SUBSCRIPTION_EVENT_SINK|PA_SUBSCRIPTION_EVENT_CHANGE) && + t != (PA_SUBSCRIPTION_EVENT_SOURCE|PA_SUBSCRIPTION_EVENT_NEW) && + t != (PA_SUBSCRIPTION_EVENT_SOURCE|PA_SUBSCRIPTION_EVENT_CHANGE)) + return; + + pa_zero(entry); + entry.version = ENTRY_VERSION; + + if ((t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) == PA_SUBSCRIPTION_EVENT_SINK) { + pa_sink *sink; + + if (!(sink = pa_idxset_get_by_index(c->sinks, idx))) + return; + + name = pa_sprintf_malloc("sink:%s", sink->name); + + if ((old = read_entry(u, name))) + entry = *old; + + if (sink->save_volume) { + entry.channel_map = sink->channel_map; + entry.volume = *pa_sink_get_volume(sink, FALSE); + entry.volume_valid = TRUE; + } + + if (sink->save_muted) { + entry.muted = pa_sink_get_mute(sink, FALSE); + entry.muted_valid = TRUE; + } + + if (sink->save_port) { + pa_strlcpy(entry.port, sink->active_port ? sink->active_port->name : "", sizeof(entry.port)); + entry.port_valid = TRUE; + } + + } else { + pa_source *source; + + pa_assert((t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) == PA_SUBSCRIPTION_EVENT_SOURCE); + + if (!(source = pa_idxset_get_by_index(c->sources, idx))) + return; + + name = pa_sprintf_malloc("source:%s", source->name); + + if ((old = read_entry(u, name))) + entry = *old; + + if (source->save_volume) { + entry.channel_map = source->channel_map; + entry.volume = *pa_source_get_volume(source, FALSE); + entry.volume_valid = TRUE; + } + + if (source->save_muted) { + entry.muted = pa_source_get_mute(source, FALSE); + entry.muted_valid = TRUE; + } + + if (source->save_port) { + pa_strlcpy(entry.port, source->active_port ? source->active_port->name : "", sizeof(entry.port)); + entry.port_valid = TRUE; + } + } + + if (old) { + + if (entries_equal(old, &entry)) { + pa_xfree(old); + pa_xfree(name); + return; + } + + pa_xfree(old); + } + + key.data = name; + key.size = strlen(name); + + data.data = &entry; + data.size = sizeof(entry); + + pa_log_info("Storing volume/mute/port for device %s.", name); + + pa_database_set(u->database, &key, &data, TRUE); + + pa_xfree(name); + + trigger_save(u); +} + +static pa_hook_result_t sink_new_hook_callback(pa_core *c, pa_sink_new_data *new_data, struct userdata *u) { + char *name; + struct entry *e; + + pa_assert(c); + pa_assert(new_data); + pa_assert(u); + pa_assert(u->restore_port); + + name = pa_sprintf_malloc("sink:%s", new_data->name); + + if ((e = read_entry(u, name))) { + + if (e->port_valid) { + if (!new_data->active_port) { + pa_log_info("Restoring port for sink %s.", name); + pa_sink_new_data_set_port(new_data, e->port); + new_data->save_port = TRUE; + } else + pa_log_debug("Not restoring port for sink %s, because already set.", name); + } + + pa_xfree(e); + } + + pa_xfree(name); + + return PA_HOOK_OK; +} + +static pa_hook_result_t sink_fixate_hook_callback(pa_core *c, pa_sink_new_data *new_data, struct userdata *u) { + char *name; + struct entry *e; + + pa_assert(c); + pa_assert(new_data); + pa_assert(u); + pa_assert(u->restore_volume || u->restore_muted); + + name = pa_sprintf_malloc("sink:%s", new_data->name); + + if ((e = read_entry(u, name))) { + + if (u->restore_volume && e->volume_valid) { + + if (!new_data->volume_is_set) { + pa_cvolume v; + + pa_log_info("Restoring volume for sink %s.", new_data->name); + + v = e->volume; + pa_cvolume_remap(&v, &e->channel_map, &new_data->channel_map); + pa_sink_new_data_set_volume(new_data, &v); + + new_data->save_volume = TRUE; + } else + pa_log_debug("Not restoring volume for sink %s, because already set.", new_data->name); + } + + if (u->restore_muted && e->muted_valid) { + + if (!new_data->muted_is_set) { + pa_log_info("Restoring mute state for sink %s.", new_data->name); + pa_sink_new_data_set_muted(new_data, e->muted); + new_data->save_muted = TRUE; + } else + pa_log_debug("Not restoring mute state for sink %s, because already set.", new_data->name); + } + + pa_xfree(e); + } + + pa_xfree(name); + + return PA_HOOK_OK; +} + +static pa_hook_result_t source_new_hook_callback(pa_core *c, pa_source_new_data *new_data, struct userdata *u) { + char *name; + struct entry *e; + + pa_assert(c); + pa_assert(new_data); + pa_assert(u); + pa_assert(u->restore_port); + + name = pa_sprintf_malloc("source:%s", new_data->name); + + if ((e = read_entry(u, name))) { + + if (e->port_valid) { + if (!new_data->active_port) { + pa_log_info("Restoring port for source %s.", name); + pa_source_new_data_set_port(new_data, e->port); + new_data->save_port = TRUE; + } else + pa_log_debug("Not restoring port for source %s, because already set.", name); + } + + pa_xfree(e); + } + + pa_xfree(name); + + return PA_HOOK_OK; +} + +static pa_hook_result_t source_fixate_hook_callback(pa_core *c, pa_source_new_data *new_data, struct userdata *u) { + char *name; + struct entry *e; + + pa_assert(c); + pa_assert(new_data); + pa_assert(u); + pa_assert(u->restore_volume || u->restore_muted); + + name = pa_sprintf_malloc("source:%s", new_data->name); + + if ((e = read_entry(u, name))) { + + if (u->restore_volume && e->volume_valid) { + + if (!new_data->volume_is_set) { + pa_cvolume v; + + pa_log_info("Restoring volume for source %s.", new_data->name); + + v = e->volume; + pa_cvolume_remap(&v, &e->channel_map, &new_data->channel_map); + pa_source_new_data_set_volume(new_data, &v); + + new_data->save_volume = TRUE; + } else + pa_log_debug("Not restoring volume for source %s, because already set.", new_data->name); + } + + if (u->restore_muted && e->muted_valid) { + + if (!new_data->muted_is_set) { + pa_log_info("Restoring mute state for source %s.", new_data->name); + pa_source_new_data_set_muted(new_data, e->muted); + new_data->save_muted = TRUE; + } else + pa_log_debug("Not restoring mute state for source %s, because already set.", new_data->name); + } + + pa_xfree(e); + } + + pa_xfree(name); + + return PA_HOOK_OK; +} + +int pa__init(pa_module*m) { + pa_modargs *ma = NULL; + struct userdata *u; + char *fname; + pa_sink *sink; + pa_source *source; + uint32_t idx; + pa_bool_t restore_volume = TRUE, restore_muted = TRUE, restore_port = TRUE; + + pa_assert(m); + + if (!(ma = pa_modargs_new(m->argument, valid_modargs))) { + pa_log("Failed to parse module arguments"); + goto fail; + } + + if (pa_modargs_get_value_boolean(ma, "restore_volume", &restore_volume) < 0 || + pa_modargs_get_value_boolean(ma, "restore_muted", &restore_muted) < 0 || + pa_modargs_get_value_boolean(ma, "restore_port", &restore_port) < 0) { + pa_log("restore_port=, restore_volume= and restore_muted= expect boolean arguments"); + goto fail; + } + + if (!restore_muted && !restore_volume && !restore_port) + pa_log_warn("Neither restoring volume, nor restoring muted, nor restoring port enabled!"); + + m->userdata = u = pa_xnew0(struct userdata, 1); + u->core = m->core; + u->module = m; + u->restore_volume = restore_volume; + u->restore_muted = restore_muted; + u->restore_port = restore_port; + + u->subscription = pa_subscription_new(m->core, PA_SUBSCRIPTION_MASK_SINK|PA_SUBSCRIPTION_MASK_SOURCE, subscribe_callback, u); + + if (restore_port) { + u->sink_new_hook_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_NEW], PA_HOOK_EARLY, (pa_hook_cb_t) sink_new_hook_callback, u); + u->source_new_hook_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SOURCE_NEW], PA_HOOK_EARLY, (pa_hook_cb_t) source_new_hook_callback, u); + } + + if (restore_muted || restore_volume) { + u->sink_fixate_hook_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_FIXATE], PA_HOOK_EARLY, (pa_hook_cb_t) sink_fixate_hook_callback, u); + u->source_fixate_hook_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SOURCE_FIXATE], PA_HOOK_EARLY, (pa_hook_cb_t) source_fixate_hook_callback, u); + } + + if (!(fname = pa_state_path("device-volumes", TRUE))) + goto fail; + + if (!(u->database = pa_database_open(fname, TRUE))) { + pa_log("Failed to open volume database '%s': %s", fname, pa_cstrerror(errno)); + pa_xfree(fname); + goto fail; + } + + pa_log_info("Sucessfully opened database file '%s'.", fname); + pa_xfree(fname); + + for (sink = pa_idxset_first(m->core->sinks, &idx); sink; sink = pa_idxset_next(m->core->sinks, &idx)) + subscribe_callback(m->core, PA_SUBSCRIPTION_EVENT_SINK|PA_SUBSCRIPTION_EVENT_NEW, sink->index, u); + + for (source = pa_idxset_first(m->core->sources, &idx); source; source = pa_idxset_next(m->core->sources, &idx)) + subscribe_callback(m->core, PA_SUBSCRIPTION_EVENT_SOURCE|PA_SUBSCRIPTION_EVENT_NEW, source->index, u); + + pa_modargs_free(ma); + return 0; + +fail: + pa__done(m); + + if (ma) + pa_modargs_free(ma); + + return -1; +} + +void pa__done(pa_module*m) { + struct userdata* u; + + pa_assert(m); + + if (!(u = m->userdata)) + return; + + if (u->subscription) + pa_subscription_free(u->subscription); + + if (u->sink_fixate_hook_slot) + pa_hook_slot_free(u->sink_fixate_hook_slot); + if (u->source_fixate_hook_slot) + pa_hook_slot_free(u->source_fixate_hook_slot); + if (u->sink_new_hook_slot) + pa_hook_slot_free(u->sink_new_hook_slot); + if (u->source_new_hook_slot) + pa_hook_slot_free(u->source_new_hook_slot); + + if (u->save_time_event) + u->core->mainloop->time_free(u->save_time_event); + + if (u->database) + pa_database_close(u->database); + + pa_xfree(u); +} diff --git a/src/modules/module-esound-compat-spawnfd-symdef.h b/src/modules/module-esound-compat-spawnfd-symdef.h new file mode 100644 index 0000000..8621a8c --- /dev/null +++ b/src/modules/module-esound-compat-spawnfd-symdef.h @@ -0,0 +1,29 @@ +#ifndef foomoduleesoundcompatspawnfdsymdeffoo +#define foomoduleesoundcompatspawnfdsymdeffoo + +#include +#include +#include + +#define pa__init module_esound_compat_spawnfd_LTX_pa__init +#define pa__done module_esound_compat_spawnfd_LTX_pa__done +#define pa__get_author module_esound_compat_spawnfd_LTX_pa__get_author +#define pa__get_description module_esound_compat_spawnfd_LTX_pa__get_description +#define pa__get_usage module_esound_compat_spawnfd_LTX_pa__get_usage +#define pa__get_version module_esound_compat_spawnfd_LTX_pa__get_version +#define pa__get_deprecated module_esound_compat_spawnfd_LTX_pa__get_deprecated +#define pa__load_once module_esound_compat_spawnfd_LTX_pa__load_once +#define pa__get_n_used module_esound_compat_spawnfd_LTX_pa__get_n_used + +int pa__init(pa_module*m); +void pa__done(pa_module*m); +int pa__get_n_used(pa_module*m); + +const char* pa__get_author(void); +const char* pa__get_description(void); +const char* pa__get_usage(void); +const char* pa__get_version(void); +const char* pa__get_deprecated(void); +pa_bool_t pa__load_once(void); + +#endif diff --git a/src/modules/module-esound-compat-spawnfd.c b/src/modules/module-esound-compat-spawnfd.c new file mode 100644 index 0000000..56cda4d --- /dev/null +++ b/src/modules/module-esound-compat-spawnfd.c @@ -0,0 +1,78 @@ +/*** + This file is part of PulseAudio. + + Copyright 2004-2006 Lennart Poettering + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "module-esound-compat-spawnfd-symdef.h" + +PA_MODULE_AUTHOR("Lennart Poettering"); +PA_MODULE_DESCRIPTION("ESOUND compatibility module: -spawnfd emulation"); +PA_MODULE_LOAD_ONCE(TRUE); +PA_MODULE_VERSION(PACKAGE_VERSION); +PA_MODULE_USAGE("fd="); + +static const char* const valid_modargs[] = { + "fd", + NULL, +}; + +int pa__init(pa_module*m) { + pa_modargs *ma = NULL; + int ret = -1, fd = -1; + char x = 1; + + pa_assert(m); + + if (!(ma = pa_modargs_new(m->argument, valid_modargs)) || + pa_modargs_get_value_s32(ma, "fd", &fd) < 0 || + fd < 0) { + + pa_log("Failed to parse module arguments"); + goto finish; + } + + if (pa_loop_write(fd, &x, sizeof(x), NULL) != sizeof(x)) + pa_log_warn("write(%u, 1, 1) failed: %s", fd, pa_cstrerror(errno)); + + pa_assert_se(pa_close(fd) == 0); + + pa_module_unload_request(m, TRUE); + + ret = 0; + +finish: + if (ma) + pa_modargs_free(ma); + + return ret; +} diff --git a/src/modules/module-esound-compat-spawnpid-symdef.h b/src/modules/module-esound-compat-spawnpid-symdef.h new file mode 100644 index 0000000..bf173f0 --- /dev/null +++ b/src/modules/module-esound-compat-spawnpid-symdef.h @@ -0,0 +1,29 @@ +#ifndef foomoduleesoundcompatspawnpidsymdeffoo +#define foomoduleesoundcompatspawnpidsymdeffoo + +#include +#include +#include + +#define pa__init module_esound_compat_spawnpid_LTX_pa__init +#define pa__done module_esound_compat_spawnpid_LTX_pa__done +#define pa__get_author module_esound_compat_spawnpid_LTX_pa__get_author +#define pa__get_description module_esound_compat_spawnpid_LTX_pa__get_description +#define pa__get_usage module_esound_compat_spawnpid_LTX_pa__get_usage +#define pa__get_version module_esound_compat_spawnpid_LTX_pa__get_version +#define pa__get_deprecated module_esound_compat_spawnpid_LTX_pa__get_deprecated +#define pa__load_once module_esound_compat_spawnpid_LTX_pa__load_once +#define pa__get_n_used module_esound_compat_spawnpid_LTX_pa__get_n_used + +int pa__init(pa_module*m); +void pa__done(pa_module*m); +int pa__get_n_used(pa_module*m); + +const char* pa__get_author(void); +const char* pa__get_description(void); +const char* pa__get_usage(void); +const char* pa__get_version(void); +const char* pa__get_deprecated(void); +pa_bool_t pa__load_once(void); + +#endif diff --git a/src/modules/module-esound-compat-spawnpid.c b/src/modules/module-esound-compat-spawnpid.c new file mode 100644 index 0000000..5925f59 --- /dev/null +++ b/src/modules/module-esound-compat-spawnpid.c @@ -0,0 +1,77 @@ + +/*** + This file is part of PulseAudio. + + Copyright 2004-2006 Lennart Poettering + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "module-esound-compat-spawnpid-symdef.h" + +PA_MODULE_AUTHOR("Lennart Poettering"); +PA_MODULE_DESCRIPTION("ESOUND compatibility module: -spawnpid emulation"); +PA_MODULE_VERSION(PACKAGE_VERSION); +PA_MODULE_LOAD_ONCE(TRUE); +PA_MODULE_USAGE("pid="); + +static const char* const valid_modargs[] = { + "pid", + NULL, +}; + +int pa__init(pa_module*m) { + pa_modargs *ma = NULL; + int ret = -1; + uint32_t pid = 0; + + pa_assert(m); + + if (!(ma = pa_modargs_new(m->argument, valid_modargs)) || + pa_modargs_get_value_u32(ma, "pid", &pid) < 0 || + !pid) { + pa_log("Failed to parse module arguments"); + goto finish; + } + + if (kill((pid_t) pid, SIGUSR1) < 0) + pa_log_warn("kill(%u) failed: %s", pid, pa_cstrerror(errno)); + + pa_module_unload_request(m, TRUE); + + ret = 0; + +finish: + if (ma) + pa_modargs_free(ma); + + return ret; +} diff --git a/src/modules/module-esound-protocol-tcp-symdef.h b/src/modules/module-esound-protocol-tcp-symdef.h new file mode 100644 index 0000000..334eed3 --- /dev/null +++ b/src/modules/module-esound-protocol-tcp-symdef.h @@ -0,0 +1,29 @@ +#ifndef foomoduleesoundprotocoltcpsymdeffoo +#define foomoduleesoundprotocoltcpsymdeffoo + +#include +#include +#include + +#define pa__init module_esound_protocol_tcp_LTX_pa__init +#define pa__done module_esound_protocol_tcp_LTX_pa__done +#define pa__get_author module_esound_protocol_tcp_LTX_pa__get_author +#define pa__get_description module_esound_protocol_tcp_LTX_pa__get_description +#define pa__get_usage module_esound_protocol_tcp_LTX_pa__get_usage +#define pa__get_version module_esound_protocol_tcp_LTX_pa__get_version +#define pa__get_deprecated module_esound_protocol_tcp_LTX_pa__get_deprecated +#define pa__load_once module_esound_protocol_tcp_LTX_pa__load_once +#define pa__get_n_used module_esound_protocol_tcp_LTX_pa__get_n_used + +int pa__init(pa_module*m); +void pa__done(pa_module*m); +int pa__get_n_used(pa_module*m); + +const char* pa__get_author(void); +const char* pa__get_description(void); +const char* pa__get_usage(void); +const char* pa__get_version(void); +const char* pa__get_deprecated(void); +pa_bool_t pa__load_once(void); + +#endif diff --git a/src/modules/module-esound-protocol-unix-symdef.h b/src/modules/module-esound-protocol-unix-symdef.h new file mode 100644 index 0000000..175c989 --- /dev/null +++ b/src/modules/module-esound-protocol-unix-symdef.h @@ -0,0 +1,29 @@ +#ifndef foomoduleesoundprotocolunixsymdeffoo +#define foomoduleesoundprotocolunixsymdeffoo + +#include +#include +#include + +#define pa__init module_esound_protocol_unix_LTX_pa__init +#define pa__done module_esound_protocol_unix_LTX_pa__done +#define pa__get_author module_esound_protocol_unix_LTX_pa__get_author +#define pa__get_description module_esound_protocol_unix_LTX_pa__get_description +#define pa__get_usage module_esound_protocol_unix_LTX_pa__get_usage +#define pa__get_version module_esound_protocol_unix_LTX_pa__get_version +#define pa__get_deprecated module_esound_protocol_unix_LTX_pa__get_deprecated +#define pa__load_once module_esound_protocol_unix_LTX_pa__load_once +#define pa__get_n_used module_esound_protocol_unix_LTX_pa__get_n_used + +int pa__init(pa_module*m); +void pa__done(pa_module*m); +int pa__get_n_used(pa_module*m); + +const char* pa__get_author(void); +const char* pa__get_description(void); +const char* pa__get_usage(void); +const char* pa__get_version(void); +const char* pa__get_deprecated(void); +pa_bool_t pa__load_once(void); + +#endif diff --git a/src/modules/module-esound-sink-symdef.h b/src/modules/module-esound-sink-symdef.h new file mode 100644 index 0000000..1a10885 --- /dev/null +++ b/src/modules/module-esound-sink-symdef.h @@ -0,0 +1,29 @@ +#ifndef foomoduleesoundsinksymdeffoo +#define foomoduleesoundsinksymdeffoo + +#include +#include +#include + +#define pa__init module_esound_sink_LTX_pa__init +#define pa__done module_esound_sink_LTX_pa__done +#define pa__get_author module_esound_sink_LTX_pa__get_author +#define pa__get_description module_esound_sink_LTX_pa__get_description +#define pa__get_usage module_esound_sink_LTX_pa__get_usage +#define pa__get_version module_esound_sink_LTX_pa__get_version +#define pa__get_deprecated module_esound_sink_LTX_pa__get_deprecated +#define pa__load_once module_esound_sink_LTX_pa__load_once +#define pa__get_n_used module_esound_sink_LTX_pa__get_n_used + +int pa__init(pa_module*m); +void pa__done(pa_module*m); +int pa__get_n_used(pa_module*m); + +const char* pa__get_author(void); +const char* pa__get_description(void); +const char* pa__get_usage(void); +const char* pa__get_version(void); +const char* pa__get_deprecated(void); +pa_bool_t pa__load_once(void); + +#endif diff --git a/src/modules/module-esound-sink.c b/src/modules/module-esound-sink.c new file mode 100644 index 0000000..d7c678c --- /dev/null +++ b/src/modules/module-esound-sink.c @@ -0,0 +1,705 @@ +/*** + This file is part of PulseAudio. + + Copyright 2004-2006 Lennart Poettering + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef HAVE_LINUX_SOCKIOS_H +#include +#endif + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "module-esound-sink-symdef.h" + +PA_MODULE_AUTHOR("Lennart Poettering"); +PA_MODULE_DESCRIPTION("ESOUND Sink"); +PA_MODULE_VERSION(PACKAGE_VERSION); +PA_MODULE_LOAD_ONCE(FALSE); +PA_MODULE_USAGE( + "sink_name= " + "sink_properties= " + "server=
cookie= " + "format= " + "rate= " + "channels="); + +#define DEFAULT_SINK_NAME "esound_out" + +struct userdata { + pa_core *core; + pa_module *module; + pa_sink *sink; + + pa_thread_mq thread_mq; + pa_rtpoll *rtpoll; + pa_rtpoll_item *rtpoll_item; + pa_thread *thread; + + pa_memchunk memchunk; + + void *write_data; + size_t write_length, write_index; + + void *read_data; + size_t read_length, read_index; + + enum { + STATE_AUTH, + STATE_LATENCY, + STATE_PREPARE, + STATE_RUNNING, + STATE_DEAD + } state; + + pa_usec_t latency; + + esd_format_t format; + int32_t rate; + + pa_smoother *smoother; + int fd; + + int64_t offset; + + pa_iochannel *io; + pa_socket_client *client; + + size_t block_size; +}; + +static const char* const valid_modargs[] = { + "sink_name", + "sink_properties", + "server", + "cookie", + "format", + "rate", + "channels", + NULL +}; + +enum { + SINK_MESSAGE_PASS_SOCKET = PA_SINK_MESSAGE_MAX +}; + +static int sink_process_msg(pa_msgobject *o, int code, void *data, int64_t offset, pa_memchunk *chunk) { + struct userdata *u = PA_SINK(o)->userdata; + + switch (code) { + + case PA_SINK_MESSAGE_SET_STATE: + + switch ((pa_sink_state_t) PA_PTR_TO_UINT(data)) { + + case PA_SINK_SUSPENDED: + pa_assert(PA_SINK_IS_OPENED(u->sink->thread_info.state)); + + pa_smoother_pause(u->smoother, pa_rtclock_now()); + break; + + case PA_SINK_IDLE: + case PA_SINK_RUNNING: + + if (u->sink->thread_info.state == PA_SINK_SUSPENDED) + pa_smoother_resume(u->smoother, pa_rtclock_now(), TRUE); + + break; + + case PA_SINK_UNLINKED: + case PA_SINK_INIT: + case PA_SINK_INVALID_STATE: + ; + } + + break; + + case PA_SINK_MESSAGE_GET_LATENCY: { + pa_usec_t w, r; + + r = pa_smoother_get(u->smoother, pa_rtclock_now()); + w = pa_bytes_to_usec((uint64_t) u->offset + u->memchunk.length, &u->sink->sample_spec); + + *((pa_usec_t*) data) = w > r ? w - r : 0; + return 0; + } + + case SINK_MESSAGE_PASS_SOCKET: { + struct pollfd *pollfd; + + pa_assert(!u->rtpoll_item); + + u->rtpoll_item = pa_rtpoll_item_new(u->rtpoll, PA_RTPOLL_NEVER, 1); + pollfd = pa_rtpoll_item_get_pollfd(u->rtpoll_item, NULL); + pollfd->fd = u->fd; + pollfd->events = pollfd->revents = 0; + + return 0; + } + } + + return pa_sink_process_msg(o, code, data, offset, chunk); +} + +static void thread_func(void *userdata) { + struct userdata *u = userdata; + int write_type = 0; + + pa_assert(u); + + pa_log_debug("Thread starting up"); + + pa_thread_mq_install(&u->thread_mq); + + pa_smoother_set_time_offset(u->smoother, pa_rtclock_now()); + + for (;;) { + int ret; + + if (PA_SINK_IS_OPENED(u->sink->thread_info.state)) + if (u->sink->thread_info.rewind_requested) + pa_sink_process_rewind(u->sink, 0); + + if (u->rtpoll_item) { + struct pollfd *pollfd; + pollfd = pa_rtpoll_item_get_pollfd(u->rtpoll_item, NULL); + + /* Render some data and write it to the fifo */ + if (PA_SINK_IS_OPENED(u->sink->thread_info.state) && pollfd->revents) { + pa_usec_t usec; + int64_t n; + + for (;;) { + ssize_t l; + void *p; + + if (u->memchunk.length <= 0) + pa_sink_render(u->sink, u->block_size, &u->memchunk); + + pa_assert(u->memchunk.length > 0); + + p = pa_memblock_acquire(u->memchunk.memblock); + l = pa_write(u->fd, (uint8_t*) p + u->memchunk.index, u->memchunk.length, &write_type); + pa_memblock_release(u->memchunk.memblock); + + pa_assert(l != 0); + + if (l < 0) { + + if (errno == EINTR) + continue; + else if (errno == EAGAIN) { + + /* OK, we filled all socket buffers up + * now. */ + goto filled_up; + + } else { + pa_log("Failed to write data to FIFO: %s", pa_cstrerror(errno)); + goto fail; + } + + } else { + u->offset += l; + + u->memchunk.index += (size_t) l; + u->memchunk.length -= (size_t) l; + + if (u->memchunk.length <= 0) { + pa_memblock_unref(u->memchunk.memblock); + pa_memchunk_reset(&u->memchunk); + } + + pollfd->revents = 0; + + if (u->memchunk.length > 0) + + /* OK, we wrote less that we asked for, + * hence we can assume that the socket + * buffers are full now */ + goto filled_up; + } + } + + filled_up: + + /* At this spot we know that the socket buffers are + * fully filled up. This is the best time to estimate + * the playback position of the server */ + + n = u->offset; + +#ifdef SIOCOUTQ + { + int l; + if (ioctl(u->fd, SIOCOUTQ, &l) >= 0 && l > 0) + n -= l; + } +#endif + + usec = pa_bytes_to_usec((uint64_t) n, &u->sink->sample_spec); + + if (usec > u->latency) + usec -= u->latency; + else + usec = 0; + + pa_smoother_put(u->smoother, pa_rtclock_now(), usec); + } + + /* Hmm, nothing to do. Let's sleep */ + pollfd->events = (short) (PA_SINK_IS_OPENED(u->sink->thread_info.state) ? POLLOUT : 0); + } + + if ((ret = pa_rtpoll_run(u->rtpoll, TRUE)) < 0) + goto fail; + + if (ret == 0) + goto finish; + + if (u->rtpoll_item) { + struct pollfd* pollfd; + + pollfd = pa_rtpoll_item_get_pollfd(u->rtpoll_item, NULL); + + if (pollfd->revents & ~POLLOUT) { + pa_log("FIFO shutdown."); + goto fail; + } + } + } + +fail: + /* If this was no regular exit from the loop we have to continue + * processing messages until we received PA_MESSAGE_SHUTDOWN */ + pa_asyncmsgq_post(u->thread_mq.outq, PA_MSGOBJECT(u->core), PA_CORE_MESSAGE_UNLOAD_MODULE, u->module, 0, NULL, NULL); + pa_asyncmsgq_wait_for(u->thread_mq.inq, PA_MESSAGE_SHUTDOWN); + +finish: + pa_log_debug("Thread shutting down"); +} + +static int do_write(struct userdata *u) { + ssize_t r; + pa_assert(u); + + if (!pa_iochannel_is_writable(u->io)) + return 0; + + if (u->write_data) { + pa_assert(u->write_index < u->write_length); + + if ((r = pa_iochannel_write(u->io, (uint8_t*) u->write_data + u->write_index, u->write_length - u->write_index)) <= 0) { + pa_log("write() failed: %s", pa_cstrerror(errno)); + return -1; + } + + u->write_index += (size_t) r; + pa_assert(u->write_index <= u->write_length); + + if (u->write_index == u->write_length) { + pa_xfree(u->write_data); + u->write_data = NULL; + u->write_index = u->write_length = 0; + } + } + + if (!u->write_data && u->state == STATE_PREPARE) { + int so_sndbuf = 0; + socklen_t sl = sizeof(int); + + /* OK, we're done with sending all control data we need to, so + * let's hand the socket over to the IO thread now */ + + pa_assert(u->fd < 0); + u->fd = pa_iochannel_get_send_fd(u->io); + + pa_iochannel_set_noclose(u->io, TRUE); + pa_iochannel_free(u->io); + u->io = NULL; + + pa_make_tcp_socket_low_delay(u->fd); + + if (getsockopt(u->fd, SOL_SOCKET, SO_SNDBUF, &so_sndbuf, &sl) < 0) + pa_log_warn("getsockopt(SO_SNDBUF) failed: %s", pa_cstrerror(errno)); + else { + pa_log_debug("SO_SNDBUF is %zu.", (size_t) so_sndbuf); + pa_sink_set_max_request(u->sink, PA_MAX((size_t) so_sndbuf, u->block_size)); + } + + pa_log_debug("Connection authenticated, handing fd to IO thread..."); + + pa_asyncmsgq_post(u->thread_mq.inq, PA_MSGOBJECT(u->sink), SINK_MESSAGE_PASS_SOCKET, NULL, 0, NULL, NULL); + u->state = STATE_RUNNING; + } + + return 0; +} + +static int handle_response(struct userdata *u) { + pa_assert(u); + + switch (u->state) { + + case STATE_AUTH: + pa_assert(u->read_length == sizeof(int32_t)); + + /* Process auth data */ + if (!*(int32_t*) u->read_data) { + pa_log("Authentication failed: %s", pa_cstrerror(errno)); + return -1; + } + + /* Request latency data */ + pa_assert(!u->write_data); + *(int32_t*) (u->write_data = pa_xmalloc(u->write_length = sizeof(int32_t))) = ESD_PROTO_LATENCY; + + u->write_index = 0; + u->state = STATE_LATENCY; + + /* Space for next response */ + pa_assert(u->read_length >= sizeof(int32_t)); + u->read_index = 0; + u->read_length = sizeof(int32_t); + + break; + + case STATE_LATENCY: { + int32_t *p; + pa_assert(u->read_length == sizeof(int32_t)); + + /* Process latency info */ + u->latency = (pa_usec_t) ((double) (*(int32_t*) u->read_data) * 1000000 / 44100); + if (u->latency > 10000000) { + pa_log_warn("Invalid latency information received from server"); + u->latency = 0; + } + + /* Create stream */ + pa_assert(!u->write_data); + p = u->write_data = pa_xmalloc0(u->write_length = sizeof(int32_t)*3+ESD_NAME_MAX); + *(p++) = ESD_PROTO_STREAM_PLAY; + *(p++) = u->format; + *(p++) = u->rate; + pa_strlcpy((char*) p, "PulseAudio Tunnel", ESD_NAME_MAX); + + u->write_index = 0; + u->state = STATE_PREPARE; + + /* Don't read any further */ + pa_xfree(u->read_data); + u->read_data = NULL; + u->read_index = u->read_length = 0; + + break; + } + + default: + pa_assert_not_reached(); + } + + return 0; +} + +static int do_read(struct userdata *u) { + pa_assert(u); + + if (!pa_iochannel_is_readable(u->io)) + return 0; + + if (u->state == STATE_AUTH || u->state == STATE_LATENCY) { + ssize_t r; + + if (!u->read_data) + return 0; + + pa_assert(u->read_index < u->read_length); + + if ((r = pa_iochannel_read(u->io, (uint8_t*) u->read_data + u->read_index, u->read_length - u->read_index)) <= 0) { + pa_log("read() failed: %s", r < 0 ? pa_cstrerror(errno) : "EOF"); + return -1; + } + + u->read_index += (size_t) r; + pa_assert(u->read_index <= u->read_length); + + if (u->read_index == u->read_length) + return handle_response(u); + } + + return 0; +} + +static void io_callback(pa_iochannel *io, void*userdata) { + struct userdata *u = userdata; + pa_assert(u); + + if (do_read(u) < 0 || do_write(u) < 0) { + + if (u->io) { + pa_iochannel_free(u->io); + u->io = NULL; + } + + pa_module_unload_request(u->module, TRUE); + } +} + +static void on_connection(pa_socket_client *c, pa_iochannel*io, void *userdata) { + struct userdata *u = userdata; + + pa_socket_client_unref(u->client); + u->client = NULL; + + if (!io) { + pa_log("Connection failed: %s", pa_cstrerror(errno)); + pa_module_unload_request(u->module, TRUE); + return; + } + + pa_assert(!u->io); + u->io = io; + pa_iochannel_set_callback(u->io, io_callback, u); + + pa_log_debug("Connection established, authenticating ..."); +} + +int pa__init(pa_module*m) { + struct userdata *u = NULL; + pa_sample_spec ss; + pa_modargs *ma = NULL; + const char *espeaker; + uint32_t key; + pa_sink_new_data data; + + pa_assert(m); + + if (!(ma = pa_modargs_new(m->argument, valid_modargs))) { + pa_log("failed to parse module arguments"); + goto fail; + } + + ss = m->core->default_sample_spec; + if (pa_modargs_get_sample_spec(ma, &ss) < 0) { + pa_log("invalid sample format specification"); + goto fail; + } + + if ((ss.format != PA_SAMPLE_U8 && ss.format != PA_SAMPLE_S16NE) || + (ss.channels > 2)) { + pa_log("esound sample type support is limited to mono/stereo and U8 or S16NE sample data"); + goto fail; + } + + u = pa_xnew0(struct userdata, 1); + u->core = m->core; + u->module = m; + m->userdata = u; + u->fd = -1; + u->smoother = pa_smoother_new( + PA_USEC_PER_SEC, + PA_USEC_PER_SEC*2, + TRUE, + TRUE, + 10, + 0, + FALSE); + pa_memchunk_reset(&u->memchunk); + u->offset = 0; + + u->rtpoll = pa_rtpoll_new(); + pa_thread_mq_init(&u->thread_mq, m->core->mainloop, u->rtpoll); + u->rtpoll_item = NULL; + + u->format = + (ss.format == PA_SAMPLE_U8 ? ESD_BITS8 : ESD_BITS16) | + (ss.channels == 2 ? ESD_STEREO : ESD_MONO); + u->rate = (int32_t) ss.rate; + u->block_size = pa_usec_to_bytes(PA_USEC_PER_SEC/20, &ss); + + u->read_data = u->write_data = NULL; + u->read_index = u->write_index = u->read_length = u->write_length = 0; + + u->state = STATE_AUTH; + u->latency = 0; + + if (!(espeaker = getenv("ESPEAKER"))) + espeaker = ESD_UNIX_SOCKET_NAME; + + espeaker = pa_modargs_get_value(ma, "server", espeaker); + + pa_sink_new_data_init(&data); + data.driver = __FILE__; + data.module = m; + pa_sink_new_data_set_name(&data, pa_modargs_get_value(ma, "sink_name", DEFAULT_SINK_NAME)); + pa_sink_new_data_set_sample_spec(&data, &ss); + pa_proplist_sets(data.proplist, PA_PROP_DEVICE_STRING, espeaker); + pa_proplist_sets(data.proplist, PA_PROP_DEVICE_API, "esd"); + pa_proplist_setf(data.proplist, PA_PROP_DEVICE_DESCRIPTION, "EsounD Output on %s", espeaker); + + if (pa_modargs_get_proplist(ma, "sink_properties", data.proplist, PA_UPDATE_REPLACE) < 0) { + pa_log("Invalid properties"); + pa_sink_new_data_done(&data); + goto fail; + } + + u->sink = pa_sink_new(m->core, &data, PA_SINK_LATENCY|PA_SINK_NETWORK); + pa_sink_new_data_done(&data); + + if (!u->sink) { + pa_log("Failed to create sink."); + goto fail; + } + + u->sink->parent.process_msg = sink_process_msg; + u->sink->userdata = u; + + pa_sink_set_asyncmsgq(u->sink, u->thread_mq.inq); + pa_sink_set_rtpoll(u->sink, u->rtpoll); + + if (!(u->client = pa_socket_client_new_string(u->core->mainloop, TRUE, espeaker, ESD_DEFAULT_PORT))) { + pa_log("Failed to connect to server."); + goto fail; + } + + pa_socket_client_set_callback(u->client, on_connection, u); + + /* Prepare the initial request */ + u->write_data = pa_xmalloc(u->write_length = ESD_KEY_LEN + sizeof(int32_t)); + if (pa_authkey_load_auto(pa_modargs_get_value(ma, "cookie", ".esd_auth"), u->write_data, ESD_KEY_LEN) < 0) { + pa_log("Failed to load cookie"); + goto fail; + } + + key = ESD_ENDIAN_KEY; + memcpy((uint8_t*) u->write_data + ESD_KEY_LEN, &key, sizeof(key)); + + /* Reserve space for the response */ + u->read_data = pa_xmalloc(u->read_length = sizeof(int32_t)); + + if (!(u->thread = pa_thread_new(thread_func, u))) { + pa_log("Failed to create thread."); + goto fail; + } + + pa_sink_put(u->sink); + + pa_modargs_free(ma); + + return 0; + +fail: + if (ma) + pa_modargs_free(ma); + + pa__done(m); + + return -1; +} + +int pa__get_n_used(pa_module *m) { + struct userdata *u; + + pa_assert(m); + pa_assert_se(u = m->userdata); + + return pa_sink_linked_by(u->sink); +} + +void pa__done(pa_module*m) { + struct userdata *u; + pa_assert(m); + + if (!(u = m->userdata)) + return; + + if (u->sink) + pa_sink_unlink(u->sink); + + if (u->thread) { + pa_asyncmsgq_send(u->thread_mq.inq, NULL, PA_MESSAGE_SHUTDOWN, NULL, 0, NULL); + pa_thread_free(u->thread); + } + + pa_thread_mq_done(&u->thread_mq); + + if (u->sink) + pa_sink_unref(u->sink); + + if (u->io) + pa_iochannel_free(u->io); + + if (u->rtpoll_item) + pa_rtpoll_item_free(u->rtpoll_item); + + if (u->rtpoll) + pa_rtpoll_free(u->rtpoll); + + if (u->memchunk.memblock) + pa_memblock_unref(u->memchunk.memblock); + + if (u->client) + pa_socket_client_unref(u->client); + + pa_xfree(u->read_data); + pa_xfree(u->write_data); + + if (u->smoother) + pa_smoother_free(u->smoother); + + if (u->fd >= 0) + pa_close(u->fd); + + pa_xfree(u); +} diff --git a/src/modules/module-hal-detect-compat.c b/src/modules/module-hal-detect-compat.c new file mode 100644 index 0000000..14cf814 --- /dev/null +++ b/src/modules/module-hal-detect-compat.c @@ -0,0 +1,84 @@ +/*** + This file is part of PulseAudio. + + Copyright 2009 Lennart Poettering + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include +#include +#include +#include + +#include "module-hal-detect-symdef.h" + +PA_MODULE_AUTHOR("Lennart Poettering"); +PA_MODULE_DESCRIPTION("Compatibility module"); +PA_MODULE_VERSION(PACKAGE_VERSION); +PA_MODULE_LOAD_ONCE(TRUE); +PA_MODULE_DEPRECATED("Please use module-udev-detect instead of module-hal-detect!"); + +static const char* const valid_modargs[] = { + "api", + "tsched", + "subdevices", + NULL, +}; + +int pa__init(pa_module*m) { + pa_modargs *ma = NULL; + pa_bool_t tsched = TRUE; + pa_module *n; + char *t; + + pa_assert(m); + + if (!(ma = pa_modargs_new(m->argument, valid_modargs))) { + pa_log("Failed to parse module arguments"); + goto fail; + } + + if (pa_modargs_get_value_boolean(ma, "tsched", &tsched) < 0) { + pa_log("tsched= expects boolean arguments"); + goto fail; + } + + pa_log_warn("We will now load module-udev-detect. Please make sure to remove module-hal-detect from your configuration."); + + t = pa_sprintf_malloc("tsched=%s", pa_yes_no(tsched)); + n = pa_module_load(m->core, "module-udev-detect", t); + pa_xfree(t); + + if (n) + pa_module_unload_request(m, TRUE); + + pa_modargs_free(ma); + + return n ? 0 : -1; + +fail: + if (ma) + pa_modargs_free(ma); + + return -1; +} diff --git a/src/modules/module-hal-detect-symdef.h b/src/modules/module-hal-detect-symdef.h new file mode 100644 index 0000000..db92a45 --- /dev/null +++ b/src/modules/module-hal-detect-symdef.h @@ -0,0 +1,29 @@ +#ifndef foomodulehaldetectsymdeffoo +#define foomodulehaldetectsymdeffoo + +#include +#include +#include + +#define pa__init module_hal_detect_LTX_pa__init +#define pa__done module_hal_detect_LTX_pa__done +#define pa__get_author module_hal_detect_LTX_pa__get_author +#define pa__get_description module_hal_detect_LTX_pa__get_description +#define pa__get_usage module_hal_detect_LTX_pa__get_usage +#define pa__get_version module_hal_detect_LTX_pa__get_version +#define pa__get_deprecated module_hal_detect_LTX_pa__get_deprecated +#define pa__load_once module_hal_detect_LTX_pa__load_once +#define pa__get_n_used module_hal_detect_LTX_pa__get_n_used + +int pa__init(pa_module*m); +void pa__done(pa_module*m); +int pa__get_n_used(pa_module*m); + +const char* pa__get_author(void); +const char* pa__get_description(void); +const char* pa__get_usage(void); +const char* pa__get_version(void); +const char* pa__get_deprecated(void); +pa_bool_t pa__load_once(void); + +#endif diff --git a/src/modules/module-hal-detect.c b/src/modules/module-hal-detect.c new file mode 100644 index 0000000..1851913 --- /dev/null +++ b/src/modules/module-hal-detect.c @@ -0,0 +1,864 @@ +/*** + This file is part of PulseAudio. + + Copyright 2006 Lennart Poettering + Copyright 2006 Shams E. King + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "module-hal-detect-symdef.h" + +PA_MODULE_AUTHOR("Shahms King"); +PA_MODULE_DESCRIPTION("Detect available audio hardware and load matching drivers"); +PA_MODULE_VERSION(PACKAGE_VERSION); +PA_MODULE_LOAD_ONCE(TRUE); +#if defined(HAVE_ALSA) && defined(HAVE_OSS_OUTPUT) +PA_MODULE_USAGE("api= " + "tsched=" + "subdevices="); +#elif defined(HAVE_ALSA) +PA_MODULE_USAGE("api= " + "tsched="); +#elif defined(HAVE_OSS_OUTPUT) +PA_MODULE_USAGE("api=" + "subdevices="); +#endif +PA_MODULE_DEPRECATED("Please use module-udev-detect instead of module-hal-detect!"); + +struct device { + char *udi, *originating_udi; + char *card_name, *sink_name, *source_name; + uint32_t module; + pa_bool_t acl_race_fix; +}; + +struct userdata { + pa_core *core; + LibHalContext *context; + pa_dbus_connection *connection; + pa_hashmap *devices; /* Every entry is indexed twice in this table: by the udi we found the device with and by the originating device's udi */ + const char *capability; +#ifdef HAVE_ALSA + pa_bool_t use_tsched; +#endif +#ifdef HAVE_OSS_OUTPUT + pa_bool_t init_subdevs; +#endif +}; + +#define CAPABILITY_ALSA "alsa" +#define CAPABILITY_OSS "oss" + +static const char* const valid_modargs[] = { + "api", +#ifdef HAVE_ALSA + "tsched", +#endif +#ifdef HAVE_OSS_OUTPUT + "subdevices", +#endif + NULL +}; + +static void device_free(struct device* d) { + pa_assert(d); + + pa_xfree(d->udi); + pa_xfree(d->originating_udi); + pa_xfree(d->sink_name); + pa_xfree(d->source_name); + pa_xfree(d->card_name); + pa_xfree(d); +} + +static const char *strip_udi(const char *udi) { + const char *slash; + + pa_assert(udi); + + if ((slash = strrchr(udi, '/'))) + return slash+1; + + return udi; +} + +#ifdef HAVE_ALSA + +enum alsa_type { + ALSA_TYPE_PLAYBACK, + ALSA_TYPE_CAPTURE, + ALSA_TYPE_CONTROL, + ALSA_TYPE_OTHER +}; + +static enum alsa_type hal_alsa_device_get_type(LibHalContext *context, const char *udi) { + char *type; + enum alsa_type t = ALSA_TYPE_OTHER; + DBusError error; + + dbus_error_init(&error); + + pa_assert(context); + pa_assert(udi); + + if (!(type = libhal_device_get_property_string(context, udi, "alsa.type", &error))) + goto finish; + + if (pa_streq(type, "playback")) + t = ALSA_TYPE_PLAYBACK; + else if (pa_streq(type, "capture")) + t = ALSA_TYPE_CAPTURE; + else if (pa_streq(type, "control")) + t = ALSA_TYPE_CONTROL; + + libhal_free_string(type); + +finish: + if (dbus_error_is_set(&error)) { + pa_log_error("D-Bus error while parsing HAL ALSA data: %s: %s", error.name, error.message); + dbus_error_free(&error); + } + + return t; +} + +static pa_bool_t hal_alsa_device_is_modem(LibHalContext *context, const char *udi) { + char *class; + pa_bool_t r = FALSE; + DBusError error; + + dbus_error_init(&error); + + pa_assert(context); + pa_assert(udi); + + if (!(class = libhal_device_get_property_string(context, udi, "alsa.pcm_class", &error))) + goto finish; + + r = pa_streq(class, "modem"); + libhal_free_string(class); + +finish: + if (dbus_error_is_set(&error)) { + if (!dbus_error_has_name(&error, "org.freedesktop.Hal.NoSuchProperty")) + pa_log_error("D-Bus error while parsing HAL ALSA data: %s: %s", error.name, error.message); + dbus_error_free(&error); + } + + return r; +} + +static int hal_device_load_alsa(struct userdata *u, const char *udi, struct device *d) { + enum alsa_type type; + int card; + DBusError error; + pa_module *m; + char *args, *originating_udi = NULL, *card_name = NULL; + + dbus_error_init(&error); + + pa_assert(u); + pa_assert(udi); + pa_assert(d); + + /* We only care for PCM devices */ + type = hal_alsa_device_get_type(u->context, udi); + + /* For each ALSA card that appears the control device will be the + * last one to be created, this is considered part of the ALSA + * usperspace API. We rely on this and load our modules only when + * the control device is available assuming that *all* device + * nodes have been properly created and assigned the right ACLs at + * that time. Also see: + * + * http://mailman.alsa-project.org/pipermail/alsa-devel/2009-April/015958.html + * + * and the associated thread.*/ + + if (type != ALSA_TYPE_CONTROL) + goto fail; + + /* We don't care for modems -- this is most likely not set for + * control devices, so kind of pointless here. */ + if (hal_alsa_device_is_modem(u->context, udi)) + goto fail; + + /* We store only one entry per card, hence we look for the originating device */ + originating_udi = libhal_device_get_property_string(u->context, udi, "alsa.originating_device", &error); + if (dbus_error_is_set(&error) || !originating_udi) + goto fail; + + /* Make sure we only load one module per card */ + if (pa_hashmap_get(u->devices, originating_udi)) + goto fail; + + /* We need the identifier */ + card = libhal_device_get_property_int(u->context, udi, "alsa.card", &error); + if (dbus_error_is_set(&error)) + goto fail; + + card_name = pa_sprintf_malloc("alsa_card.%s", strip_udi(originating_udi)); + args = pa_sprintf_malloc("device_id=%u name=\"%s\" card_name=\"%s\" tsched=%i card_properties=\"module-hal-detect.discovered=1\"", card, strip_udi(originating_udi), card_name, (int) u->use_tsched); + + pa_log_debug("Loading module-alsa-card with arguments '%s'", args); + m = pa_module_load(u->core, "module-alsa-card", args); + pa_xfree(args); + + if (!m) + goto fail; + + d->originating_udi = originating_udi; + d->module = m->index; + d->card_name = card_name; + + return 0; + +fail: + if (dbus_error_is_set(&error)) { + pa_log_error("D-Bus error while parsing HAL ALSA data: %s: %s", error.name, error.message); + dbus_error_free(&error); + } + + pa_xfree(originating_udi); + pa_xfree(card_name); + + return -1; +} + +#endif + +#ifdef HAVE_OSS_OUTPUT + +static pa_bool_t hal_oss_device_is_pcm(LibHalContext *context, const char *udi, pa_bool_t init_subdevices) { + char *class = NULL, *dev = NULL, *e; + int device; + pa_bool_t r = FALSE; + DBusError error; + + dbus_error_init(&error); + + pa_assert(context); + pa_assert(udi); + + /* We only care for PCM devices */ + class = libhal_device_get_property_string(context, udi, "oss.type", &error); + if (dbus_error_is_set(&error) || !class) + goto finish; + + if (!pa_streq(class, "pcm")) + goto finish; + + /* We don't like /dev/audio */ + dev = libhal_device_get_property_string(context, udi, "oss.device_file", &error); + if (dbus_error_is_set(&error) || !dev) + goto finish; + + if ((e = strrchr(dev, '/'))) + if (pa_startswith(e + 1, "audio")) + goto finish; + + /* We only care for the main device */ + device = libhal_device_get_property_int(context, udi, "oss.device", &error); + if (dbus_error_is_set(&error) || (device != 0 && init_subdevices == FALSE)) + goto finish; + + r = TRUE; + +finish: + + if (dbus_error_is_set(&error)) { + pa_log_error("D-Bus error while parsing HAL OSS data: %s: %s", error.name, error.message); + dbus_error_free(&error); + } + + libhal_free_string(class); + libhal_free_string(dev); + + return r; +} + +static int hal_device_load_oss(struct userdata *u, const char *udi, struct device *d) { + DBusError error; + pa_module *m; + char *args, *originating_udi = NULL, *device, *sink_name = NULL, *source_name = NULL; + + dbus_error_init(&error); + + pa_assert(u); + pa_assert(udi); + pa_assert(d); + + /* We only care for OSS PCM devices */ + if (!hal_oss_device_is_pcm(u->context, udi, u->init_subdevs)) + goto fail; + + /* We store only one entry per card, hence we look for the originating device */ + originating_udi = libhal_device_get_property_string(u->context, udi, "oss.originating_device", &error); + if (dbus_error_is_set(&error) || !originating_udi) + goto fail; + + /* Make sure we only load one module per card */ + if (pa_hashmap_get(u->devices, originating_udi)) + goto fail; + + /* We need the device file */ + device = libhal_device_get_property_string(u->context, udi, "oss.device_file", &error); + if (!device || dbus_error_is_set(&error)) + goto fail; + + sink_name = pa_sprintf_malloc("oss_output.%s", strip_udi(udi)); + source_name = pa_sprintf_malloc("oss_input.%s", strip_udi(udi)); + args = pa_sprintf_malloc("device=%s sink_name=%s source_name=%s", device, sink_name, source_name); + + libhal_free_string(device); + + pa_log_debug("Loading module-oss with arguments '%s'", args); + m = pa_module_load(u->core, "module-oss", args); + pa_xfree(args); + + if (!m) + goto fail; + + d->originating_udi = originating_udi; + d->module = m->index; + d->sink_name = sink_name; + d->source_name = source_name; + + return 0; + +fail: + if (dbus_error_is_set(&error)) { + pa_log_error("D-Bus error while parsing OSS HAL data: %s: %s", error.name, error.message); + dbus_error_free(&error); + } + + pa_xfree(originating_udi); + pa_xfree(source_name); + pa_xfree(sink_name); + + return -1; +} +#endif + +static struct device* hal_device_add(struct userdata *u, const char *udi) { + struct device *d; + int r; + + pa_assert(u); + pa_assert(u->capability); + + d = pa_xnew(struct device, 1); + d->acl_race_fix = FALSE; + d->udi = pa_xstrdup(udi); + d->originating_udi = NULL; + d->module = PA_INVALID_INDEX; + d->sink_name = d->source_name = d->card_name = NULL; + r = -1; + +#ifdef HAVE_ALSA + if (pa_streq(u->capability, CAPABILITY_ALSA)) + r = hal_device_load_alsa(u, udi, d); +#endif +#ifdef HAVE_OSS_OUTPUT + if (pa_streq(u->capability, CAPABILITY_OSS)) + r = hal_device_load_oss(u, udi, d); +#endif + + if (r < 0) { + device_free(d); + return NULL; + } + + pa_hashmap_put(u->devices, d->udi, d); + pa_hashmap_put(u->devices, d->originating_udi, d); + + return d; +} + +static int hal_device_add_all(struct userdata *u) { + int n, count = 0; + char** udis; + DBusError error; + + dbus_error_init(&error); + + pa_assert(u); + + udis = libhal_find_device_by_capability(u->context, u->capability, &n, &error); + if (dbus_error_is_set(&error) || !udis) + goto fail; + + if (n > 0) { + int i; + + for (i = 0; i < n; i++) { + if (hal_device_add(u, udis[i])) { + count++; + pa_log_debug("Loaded device %s", udis[i]); + } else + pa_log_debug("Not loaded device %s", udis[i]); + } + } + + libhal_free_string_array(udis); + + return count; + +fail: + if (dbus_error_is_set(&error)) { + pa_log_error("D-Bus error while parsing HAL data: %s: %s", error.name, error.message); + dbus_error_free(&error); + } + + return -1; +} + +static void device_added_cb(LibHalContext *context, const char *udi) { + DBusError error; + struct userdata *u; + pa_bool_t good = FALSE; + + dbus_error_init(&error); + + pa_assert(context); + pa_assert(udi); + + pa_assert_se(u = libhal_ctx_get_user_data(context)); + + good = libhal_device_query_capability(context, udi, u->capability, &error); + if (dbus_error_is_set(&error) || !good) + goto finish; + + if (!hal_device_add(u, udi)) + pa_log_debug("Not loaded device %s", udi); + else + pa_log_debug("Loaded device %s", udi); + +finish: + if (dbus_error_is_set(&error)) { + if (!dbus_error_has_name(&error, "org.freedesktop.Hal.NoSuchProperty")) + pa_log_error("D-Bus error while parsing HAL data: %s: %s", error.name, error.message); + dbus_error_free(&error); + } +} + +static void device_removed_cb(LibHalContext* context, const char *udi) { + struct device *d; + struct userdata *u; + + pa_assert(context); + pa_assert(udi); + + pa_assert_se(u = libhal_ctx_get_user_data(context)); + + if (!(d = pa_hashmap_get(u->devices, udi))) + return; + + pa_hashmap_remove(u->devices, d->originating_udi); + pa_hashmap_remove(u->devices, d->udi); + + pa_log_debug("Removing HAL device: %s", d->originating_udi); + + pa_module_unload_request_by_index(u->core, d->module, TRUE); + device_free(d); +} + +static void new_capability_cb(LibHalContext *context, const char *udi, const char* capability) { + struct userdata *u; + + pa_assert(context); + pa_assert(udi); + pa_assert(capability); + + pa_assert_se(u = libhal_ctx_get_user_data(context)); + + if (pa_streq(u->capability, capability)) + /* capability we care about, pretend it's a new device */ + device_added_cb(context, udi); +} + +static void lost_capability_cb(LibHalContext *context, const char *udi, const char* capability) { + struct userdata *u; + + pa_assert(context); + pa_assert(udi); + pa_assert(capability); + + pa_assert_se(u = libhal_ctx_get_user_data(context)); + + if (pa_streq(u->capability, capability)) + /* capability we care about, pretend it was removed */ + device_removed_cb(context, udi); +} + +static DBusHandlerResult filter_cb(DBusConnection *bus, DBusMessage *message, void *userdata) { + struct userdata*u; + DBusError error; + + pa_assert(bus); + pa_assert(message); + pa_assert_se(u = userdata); + + dbus_error_init(&error); + + pa_log_debug("dbus: interface=%s, path=%s, member=%s\n", + dbus_message_get_interface(message), + dbus_message_get_path(message), + dbus_message_get_member(message)); + + if (dbus_message_is_signal(message, "org.freedesktop.Hal.Device.AccessControl", "ACLAdded") || + dbus_message_is_signal(message, "org.freedesktop.Hal.Device.AccessControl", "ACLRemoved")) { + uint32_t uid; + pa_bool_t suspend = strcmp(dbus_message_get_member(message), "ACLRemoved") == 0; + + if (!dbus_message_get_args(message, &error, DBUS_TYPE_UINT32, &uid, DBUS_TYPE_INVALID) || dbus_error_is_set(&error)) { + pa_log_error("Failed to parse ACL message: %s: %s", error.name, error.message); + goto finish; + } + + /* Check if this is about us? */ + if (uid == getuid() || uid == geteuid()) { + struct device *d; + const char *udi; + + udi = dbus_message_get_path(message); + + if ((d = pa_hashmap_get(u->devices, udi))) { + pa_bool_t send_acl_race_fix_message = FALSE; + d->acl_race_fix = FALSE; + + if (d->sink_name) { + pa_sink *sink; + + if ((sink = pa_namereg_get(u->core, d->sink_name, PA_NAMEREG_SINK))) { + pa_bool_t success = pa_sink_suspend(sink, suspend, PA_SUSPEND_SESSION) >= 0; + + if (!success && !suspend) + d->acl_race_fix = TRUE; /* resume failed, let's try again */ + else if (suspend) + send_acl_race_fix_message = TRUE; /* suspend finished, let's tell everyone to try again */ + } + } + + if (d->source_name) { + pa_source *source; + + if ((source = pa_namereg_get(u->core, d->source_name, PA_NAMEREG_SOURCE))) { + pa_bool_t success = pa_source_suspend(source, suspend, PA_SUSPEND_SESSION) >= 0; + + if (!success && !suspend) + d->acl_race_fix = TRUE; /* resume failed, let's try again */ + else if (suspend) + send_acl_race_fix_message = TRUE; /* suspend finished, let's tell everyone to try again */ + } + } + + if (d->card_name) { + pa_card *card; + + if ((card = pa_namereg_get(u->core, d->card_name, PA_NAMEREG_CARD))) { + pa_bool_t success = pa_card_suspend(card, suspend, PA_SUSPEND_SESSION) >= 0; + + if (!success && !suspend) + d->acl_race_fix = TRUE; /* resume failed, let's try again */ + else if (suspend) + send_acl_race_fix_message = TRUE; /* suspend finished, let's tell everyone to try again */ + } + } + + if (send_acl_race_fix_message) { + DBusMessage *msg; + msg = dbus_message_new_signal(udi, "org.pulseaudio.Server", "DirtyGiveUpMessage"); + dbus_connection_send(pa_dbus_connection_get(u->connection), msg, NULL); + dbus_message_unref(msg); + } + + } else if (!suspend) + device_added_cb(u->context, udi); + + } + + } else if (dbus_message_is_signal(message, "org.pulseaudio.Server", "DirtyGiveUpMessage")) { + /* We use this message to avoid a dirty race condition when we + get an ACLAdded message before the previously owning PA + sever has closed the device. We can remove this as + soon as HAL learns frevoke() */ + + struct device *d; + const char *udi; + + udi = dbus_message_get_path(message); + + if ((d = pa_hashmap_get(u->devices, udi))) { + + if (d->acl_race_fix) { + d->acl_race_fix = FALSE; + pa_log_debug("Got dirty give up message for '%s', trying resume ...", udi); + + if (d->sink_name) { + pa_sink *sink; + + if ((sink = pa_namereg_get(u->core, d->sink_name, PA_NAMEREG_SINK))) + pa_sink_suspend(sink, FALSE, PA_SUSPEND_SESSION); + } + + if (d->source_name) { + pa_source *source; + + if ((source = pa_namereg_get(u->core, d->source_name, PA_NAMEREG_SOURCE))) + pa_source_suspend(source, FALSE, PA_SUSPEND_SESSION); + } + + if (d->card_name) { + pa_card *card; + + if ((card = pa_namereg_get(u->core, d->source_name, PA_NAMEREG_CARD))) + pa_card_suspend(card, FALSE, PA_SUSPEND_SESSION); + } + } + + } else + /* Yes, we don't check the UDI for validity, but hopefully HAL will */ + device_added_cb(u->context, udi); + + } + +finish: + dbus_error_free(&error); + + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; +} + +static void hal_context_free(LibHalContext* hal_context) { + DBusError error; + + dbus_error_init(&error); + + libhal_ctx_shutdown(hal_context, &error); + libhal_ctx_free(hal_context); + + dbus_error_free(&error); +} + +static LibHalContext* hal_context_new(DBusConnection *connection) { + DBusError error; + LibHalContext *hal_context = NULL; + + dbus_error_init(&error); + + pa_assert(connection); + + if (!(hal_context = libhal_ctx_new())) { + pa_log_error("libhal_ctx_new() failed"); + goto fail; + } + + if (!libhal_ctx_set_dbus_connection(hal_context, connection)) { + pa_log_error("Error establishing DBUS connection: %s: %s", error.name, error.message); + goto fail; + } + + if (!libhal_ctx_init(hal_context, &error)) { + pa_log_error("Couldn't connect to hald: %s: %s", error.name, error.message); + goto fail; + } + + return hal_context; + +fail: + if (hal_context) + hal_context_free(hal_context); + + dbus_error_free(&error); + + return NULL; +} + +int pa__init(pa_module*m) { + DBusError error; + struct userdata *u = NULL; + int n = 0; + pa_modargs *ma; + const char *api; + + pa_assert(m); + + dbus_error_init(&error); + + if (!(ma = pa_modargs_new(m->argument, valid_modargs))) { + pa_log("Failed to parse module arguments"); + goto fail; + } + + m->userdata = u = pa_xnew(struct userdata, 1); + u->core = m->core; + u->context = NULL; + u->connection = NULL; + u->devices = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func); + u->capability = NULL; + +#ifdef HAVE_ALSA + u->use_tsched = TRUE; + + if (pa_modargs_get_value_boolean(ma, "tsched", &u->use_tsched) < 0) { + pa_log("Failed to parse tsched argument."); + goto fail; + } + + api = pa_modargs_get_value(ma, "api", "alsa"); + + if (pa_streq(api, "alsa")) + u->capability = CAPABILITY_ALSA; +#else + api = pa_modargs_get_value(ma, "api", "oss"); +#endif + +#ifdef HAVE_OSS_OUTPUT + if (pa_streq(api, "oss")) + u->capability = CAPABILITY_OSS; +#endif + + if (!u->capability) { + pa_log_error("Invalid API specification."); + goto fail; + } + +#ifdef HAVE_OSS_OUTPUT + if (pa_modargs_get_value_boolean(ma, "subdevices", &u->init_subdevs) < 0) { + pa_log("Failed to parse subdevices= argument."); + goto fail; + } +#endif + + if (!(u->connection = pa_dbus_bus_get(m->core, DBUS_BUS_SYSTEM, &error)) || dbus_error_is_set(&error)) { + pa_log_error("Unable to contact DBUS system bus: %s: %s", error.name, error.message); + goto fail; + } + + if (!(u->context = hal_context_new(pa_dbus_connection_get(u->connection)))) { + /* pa_hal_context_new() logs appropriate errors */ + goto fail; + } + + n = hal_device_add_all(u); + + libhal_ctx_set_user_data(u->context, u); + libhal_ctx_set_device_added(u->context, device_added_cb); + libhal_ctx_set_device_removed(u->context, device_removed_cb); + libhal_ctx_set_device_new_capability(u->context, new_capability_cb); + libhal_ctx_set_device_lost_capability(u->context, lost_capability_cb); + + if (!libhal_device_property_watch_all(u->context, &error)) { + pa_log_error("Error monitoring device list: %s: %s", error.name, error.message); + goto fail; + } + + if (!dbus_connection_add_filter(pa_dbus_connection_get(u->connection), filter_cb, u, NULL)) { + pa_log_error("Failed to add filter function"); + goto fail; + } + + if (pa_dbus_add_matches( + pa_dbus_connection_get(u->connection), &error, + "type='signal',sender='org.freedesktop.Hal',interface='org.freedesktop.Hal.Device.AccessControl',member='ACLAdded'", + "type='signal',sender='org.freedesktop.Hal',interface='org.freedesktop.Hal.Device.AccessControl',member='ACLRemoved'", + "type='signal',interface='org.pulseaudio.Server',member='DirtyGiveUpMessage'", NULL) < 0) { + pa_log_error("Unable to subscribe to HAL ACL signals: %s: %s", error.name, error.message); + goto fail; + } + + pa_log_info("Loaded %i modules.", n); + + pa_modargs_free(ma); + + return 0; + +fail: + if (ma) + pa_modargs_free(ma); + + dbus_error_free(&error); + pa__done(m); + + return -1; +} + +void pa__done(pa_module *m) { + struct userdata *u; + + pa_assert(m); + + if (!(u = m->userdata)) + return; + + if (u->context) + hal_context_free(u->context); + + if (u->devices) { + struct device *d; + + while ((d = pa_hashmap_first(u->devices))) { + pa_hashmap_remove(u->devices, d->udi); + pa_hashmap_remove(u->devices, d->originating_udi); + device_free(d); + } + + pa_hashmap_free(u->devices, NULL, NULL); + } + + if (u->connection) { + pa_dbus_remove_matches( + pa_dbus_connection_get(u->connection), + "type='signal',sender='org.freedesktop.Hal',interface='org.freedesktop.Hal.Device.AccessControl',member='ACLAdded'", + "type='signal',sender='org.freedesktop.Hal',interface='org.freedesktop.Hal.Device.AccessControl',member='ACLRemoved'", + "type='signal',interface='org.pulseaudio.Server',member='DirtyGiveUpMessage'", NULL); + + dbus_connection_remove_filter(pa_dbus_connection_get(u->connection), filter_cb, u); + pa_dbus_connection_unref(u->connection); + } + + pa_xfree(u); +} diff --git a/src/modules/module-http-protocol-tcp-symdef.h b/src/modules/module-http-protocol-tcp-symdef.h new file mode 100644 index 0000000..4f59137 --- /dev/null +++ b/src/modules/module-http-protocol-tcp-symdef.h @@ -0,0 +1,29 @@ +#ifndef foomodulehttpprotocoltcpsymdeffoo +#define foomodulehttpprotocoltcpsymdeffoo + +#include +#include +#include + +#define pa__init module_http_protocol_tcp_LTX_pa__init +#define pa__done module_http_protocol_tcp_LTX_pa__done +#define pa__get_author module_http_protocol_tcp_LTX_pa__get_author +#define pa__get_description module_http_protocol_tcp_LTX_pa__get_description +#define pa__get_usage module_http_protocol_tcp_LTX_pa__get_usage +#define pa__get_version module_http_protocol_tcp_LTX_pa__get_version +#define pa__get_deprecated module_http_protocol_tcp_LTX_pa__get_deprecated +#define pa__load_once module_http_protocol_tcp_LTX_pa__load_once +#define pa__get_n_used module_http_protocol_tcp_LTX_pa__get_n_used + +int pa__init(pa_module*m); +void pa__done(pa_module*m); +int pa__get_n_used(pa_module*m); + +const char* pa__get_author(void); +const char* pa__get_description(void); +const char* pa__get_usage(void); +const char* pa__get_version(void); +const char* pa__get_deprecated(void); +pa_bool_t pa__load_once(void); + +#endif diff --git a/src/modules/module-http-protocol-unix-symdef.h b/src/modules/module-http-protocol-unix-symdef.h new file mode 100644 index 0000000..d57aff0 --- /dev/null +++ b/src/modules/module-http-protocol-unix-symdef.h @@ -0,0 +1,29 @@ +#ifndef foomodulehttpprotocolunixsymdeffoo +#define foomodulehttpprotocolunixsymdeffoo + +#include +#include +#include + +#define pa__init module_http_protocol_unix_LTX_pa__init +#define pa__done module_http_protocol_unix_LTX_pa__done +#define pa__get_author module_http_protocol_unix_LTX_pa__get_author +#define pa__get_description module_http_protocol_unix_LTX_pa__get_description +#define pa__get_usage module_http_protocol_unix_LTX_pa__get_usage +#define pa__get_version module_http_protocol_unix_LTX_pa__get_version +#define pa__get_deprecated module_http_protocol_unix_LTX_pa__get_deprecated +#define pa__load_once module_http_protocol_unix_LTX_pa__load_once +#define pa__get_n_used module_http_protocol_unix_LTX_pa__get_n_used + +int pa__init(pa_module*m); +void pa__done(pa_module*m); +int pa__get_n_used(pa_module*m); + +const char* pa__get_author(void); +const char* pa__get_description(void); +const char* pa__get_usage(void); +const char* pa__get_version(void); +const char* pa__get_deprecated(void); +pa_bool_t pa__load_once(void); + +#endif diff --git a/src/modules/module-intended-roles-symdef.h b/src/modules/module-intended-roles-symdef.h new file mode 100644 index 0000000..a3aa825 --- /dev/null +++ b/src/modules/module-intended-roles-symdef.h @@ -0,0 +1,29 @@ +#ifndef foomoduleintendedrolessymdeffoo +#define foomoduleintendedrolessymdeffoo + +#include +#include +#include + +#define pa__init module_intended_roles_LTX_pa__init +#define pa__done module_intended_roles_LTX_pa__done +#define pa__get_author module_intended_roles_LTX_pa__get_author +#define pa__get_description module_intended_roles_LTX_pa__get_description +#define pa__get_usage module_intended_roles_LTX_pa__get_usage +#define pa__get_version module_intended_roles_LTX_pa__get_version +#define pa__get_deprecated module_intended_roles_LTX_pa__get_deprecated +#define pa__load_once module_intended_roles_LTX_pa__load_once +#define pa__get_n_used module_intended_roles_LTX_pa__get_n_used + +int pa__init(pa_module*m); +void pa__done(pa_module*m); +int pa__get_n_used(pa_module*m); + +const char* pa__get_author(void); +const char* pa__get_description(void); +const char* pa__get_usage(void); +const char* pa__get_version(void); +const char* pa__get_deprecated(void); +pa_bool_t pa__load_once(void); + +#endif diff --git a/src/modules/module-intended-roles.c b/src/modules/module-intended-roles.c new file mode 100644 index 0000000..b9924df --- /dev/null +++ b/src/modules/module-intended-roles.c @@ -0,0 +1,466 @@ +/*** + This file is part of PulseAudio. + + Copyright 2009 Lennart Poettering + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "module-intended-roles-symdef.h" + +PA_MODULE_AUTHOR("Lennart Poettering"); +PA_MODULE_DESCRIPTION("Automatically set device of streams based of intended roles of devices"); +PA_MODULE_VERSION(PACKAGE_VERSION); +PA_MODULE_LOAD_ONCE(TRUE); +PA_MODULE_USAGE( + "on_hotplug= " + "on_rescue="); + +static const char* const valid_modargs[] = { + "on_hotplug", + "on_rescue", + NULL +}; + +struct userdata { + pa_core *core; + pa_module *module; + + pa_hook_slot + *sink_input_new_hook_slot, + *source_output_new_hook_slot, + *sink_put_hook_slot, + *source_put_hook_slot, + *sink_unlink_hook_slot, + *source_unlink_hook_slot; + + pa_bool_t on_hotplug:1; + pa_bool_t on_rescue:1; +}; + +static pa_bool_t role_match(pa_proplist *proplist, const char *role) { + const char *ir; + char *r; + const char *state = NULL; + + if (!(ir = pa_proplist_gets(proplist, PA_PROP_DEVICE_INTENDED_ROLES))) + return FALSE; + + while ((r = pa_split_spaces(ir, &state))) { + + if (pa_streq(role, r)) { + pa_xfree(r); + return TRUE; + } + + pa_xfree(r); + } + + return FALSE; +} + +static pa_hook_result_t sink_input_new_hook_callback(pa_core *c, pa_sink_input_new_data *new_data, struct userdata *u) { + const char *role; + pa_sink *s, *def; + uint32_t idx; + + pa_assert(c); + pa_assert(new_data); + pa_assert(u); + + if (!new_data->proplist) { + pa_log_debug("New stream lacks property data."); + return PA_HOOK_OK; + } + + if (new_data->sink) { + pa_log_debug("Not setting device for stream %s, because already set.", pa_strnull(pa_proplist_gets(new_data->proplist, PA_PROP_MEDIA_NAME))); + return PA_HOOK_OK; + } + + if (!(role = pa_proplist_gets(new_data->proplist, PA_PROP_MEDIA_ROLE))) { + pa_log_debug("Not setting device for stream %s, because it lacks role.", pa_strnull(pa_proplist_gets(new_data->proplist, PA_PROP_MEDIA_NAME))); + return PA_HOOK_OK; + } + + /* Prefer the default sink over any other sink, just in case... */ + if ((def = pa_namereg_get_default_sink(c))) + if (role_match(def->proplist, role)) { + new_data->sink = def; + new_data->save_sink = FALSE; + return PA_HOOK_OK; + } + + PA_IDXSET_FOREACH(s, c->sinks, idx) { + if (s == def) + continue; + + if (!PA_SINK_IS_LINKED(pa_sink_get_state(s))) + continue; + + if (role_match(s->proplist, role)) { + new_data->sink = s; + new_data->save_sink = FALSE; + return PA_HOOK_OK; + } + } + + return PA_HOOK_OK; +} + +static pa_hook_result_t source_output_new_hook_callback(pa_core *c, pa_source_output_new_data *new_data, struct userdata *u) { + const char *role; + pa_source *s, *def; + uint32_t idx; + + pa_assert(c); + pa_assert(new_data); + pa_assert(u); + + if (!new_data->proplist) { + pa_log_debug("New stream lacks property data."); + return PA_HOOK_OK; + } + + if (new_data->source) { + pa_log_debug("Not setting device for stream %s, because already set.", pa_strnull(pa_proplist_gets(new_data->proplist, PA_PROP_MEDIA_NAME))); + return PA_HOOK_OK; + } + + if (!(role = pa_proplist_gets(new_data->proplist, PA_PROP_MEDIA_ROLE))) { + pa_log_debug("Not setting device for stream %s, because it lacks role.", pa_strnull(pa_proplist_gets(new_data->proplist, PA_PROP_MEDIA_NAME))); + return PA_HOOK_OK; + } + + /* Prefer the default source over any other source, just in case... */ + if ((def = pa_namereg_get_default_source(c))) + if (role_match(def->proplist, role)) { + new_data->source = def; + new_data->save_source = FALSE; + return PA_HOOK_OK; + } + + PA_IDXSET_FOREACH(s, c->sources, idx) { + if (s == def) + continue; + + if (!PA_SOURCE_IS_LINKED(pa_source_get_state(s))) + continue; + + if (role_match(s->proplist, role)) { + new_data->source = s; + new_data->save_source = FALSE; + return PA_HOOK_OK; + } + } + + return PA_HOOK_OK; +} + +static pa_hook_result_t sink_put_hook_callback(pa_core *c, pa_sink *sink, struct userdata *u) { + pa_sink_input *si; + uint32_t idx; + + pa_assert(c); + pa_assert(sink); + pa_assert(u); + pa_assert(u->on_hotplug); + + PA_IDXSET_FOREACH(si, c->sink_inputs, idx) { + const char *role; + + if (si->sink == sink) + continue; + + if (si->save_sink) + continue; + + /* Skip this if it is already in the process of being moved + * anyway */ + if (!si->sink) + continue; + + /* It might happen that a stream and a sink are set up at the + same time, in which case we want to make sure we don't + interfere with that */ + if (!PA_SINK_INPUT_IS_LINKED(pa_sink_input_get_state(si))) + continue; + + if (!(role = pa_proplist_gets(si->proplist, PA_PROP_MEDIA_ROLE))) + continue; + + if (role_match(si->sink->proplist, role)) + continue; + + if (!role_match(sink->proplist, role)) + continue; + + pa_sink_input_move_to(si, sink, FALSE); + } + + return PA_HOOK_OK; +} + +static pa_hook_result_t source_put_hook_callback(pa_core *c, pa_source *source, struct userdata *u) { + pa_source_output *so; + uint32_t idx; + + pa_assert(c); + pa_assert(source); + pa_assert(u); + pa_assert(u->on_hotplug); + + PA_IDXSET_FOREACH(so, c->source_outputs, idx) { + const char *role; + + if (so->source == source) + continue; + + if (so->save_source) + continue; + + if (so->direct_on_input) + continue; + + /* Skip this if it is already in the process of being moved + * anyway */ + if (!so->source) + continue; + + /* It might happen that a stream and a source are set up at the + same time, in which case we want to make sure we don't + interfere with that */ + if (!PA_SOURCE_OUTPUT_IS_LINKED(pa_source_output_get_state(so))) + continue; + + if (!(role = pa_proplist_gets(so->proplist, PA_PROP_MEDIA_ROLE))) + continue; + + if (role_match(so->source->proplist, role)) + continue; + + if (!role_match(source->proplist, role)) + continue; + + pa_source_output_move_to(so, source, FALSE); + } + + return PA_HOOK_OK; +} + +static pa_hook_result_t sink_unlink_hook_callback(pa_core *c, pa_sink *sink, struct userdata *u) { + pa_sink_input *si; + uint32_t idx; + pa_sink *def; + + pa_assert(c); + pa_assert(sink); + pa_assert(u); + pa_assert(u->on_rescue); + + /* There's no point in doing anything if the core is shut down anyway */ + if (c->state == PA_CORE_SHUTDOWN) + return PA_HOOK_OK; + + /* If there not default sink, then there is no sink at all */ + if (!(def = pa_namereg_get_default_sink(c))) + return PA_HOOK_OK; + + PA_IDXSET_FOREACH(si, sink->inputs, idx) { + const char *role; + uint32_t jdx; + pa_sink *d; + + if (!si->sink) + continue; + + if (!(role = pa_proplist_gets(si->proplist, PA_PROP_MEDIA_ROLE))) + continue; + + /* Would the default sink fit? If so, let's use it */ + if (def != sink && role_match(def->proplist, role)) + if (pa_sink_input_move_to(si, def, FALSE) >= 0) + continue; + + /* Try to find some other fitting sink */ + PA_IDXSET_FOREACH(d, c->sinks, jdx) { + if (d == def || d == sink) + continue; + + if (!PA_SINK_IS_LINKED(pa_sink_get_state(d))) + continue; + + if (role_match(d->proplist, role)) + if (pa_sink_input_move_to(si, d, FALSE) >= 0) + break; + } + } + + return PA_HOOK_OK; +} + +static pa_hook_result_t source_unlink_hook_callback(pa_core *c, pa_source *source, struct userdata *u) { + pa_source_output *so; + uint32_t idx; + pa_source *def; + + pa_assert(c); + pa_assert(source); + pa_assert(u); + pa_assert(u->on_rescue); + + /* There's no point in doing anything if the core is shut down anyway */ + if (c->state == PA_CORE_SHUTDOWN) + return PA_HOOK_OK; + + /* If there not default source, then there is no source at all */ + if (!(def = pa_namereg_get_default_source(c))) + return PA_HOOK_OK; + + PA_IDXSET_FOREACH(so, source->outputs, idx) { + const char *role; + uint32_t jdx; + pa_source *d; + + if (so->direct_on_input) + continue; + + if (!so->source) + continue; + + if (!(role = pa_proplist_gets(so->proplist, PA_PROP_MEDIA_ROLE))) + continue; + + /* Would the default source fit? If so, let's use it */ + if (def != source && role_match(def->proplist, role) && !source->monitor_of == !def->monitor_of) { + pa_source_output_move_to(so, def, FALSE); + continue; + } + + /* Try to find some other fitting source */ + PA_IDXSET_FOREACH(d, c->sources, jdx) { + if (d == def || d == source) + continue; + + if (!PA_SOURCE_IS_LINKED(pa_source_get_state(d))) + continue; + + if (role_match(d->proplist, role) && !source->monitor_of == !d->monitor_of) { + pa_source_output_move_to(so, d, FALSE); + break; + } + } + } + + return PA_HOOK_OK; +} + +int pa__init(pa_module*m) { + pa_modargs *ma = NULL; + struct userdata *u; + pa_bool_t on_hotplug = TRUE, on_rescue = TRUE; + + pa_assert(m); + + if (!(ma = pa_modargs_new(m->argument, valid_modargs))) { + pa_log("Failed to parse module arguments"); + goto fail; + } + + if (pa_modargs_get_value_boolean(ma, "on_hotplug", &on_hotplug) < 0 || + pa_modargs_get_value_boolean(ma, "on_rescue", &on_rescue) < 0) { + pa_log("on_hotplug= and on_rescue= expect boolean arguments"); + goto fail; + } + + m->userdata = u = pa_xnew0(struct userdata, 1); + u->core = m->core; + u->module = m; + u->on_hotplug = on_hotplug; + u->on_rescue = on_rescue; + + /* A little bit later than module-stream-restore */ + u->sink_input_new_hook_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_INPUT_NEW], PA_HOOK_EARLY+10, (pa_hook_cb_t) sink_input_new_hook_callback, u); + u->source_output_new_hook_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SOURCE_OUTPUT_NEW], PA_HOOK_EARLY+10, (pa_hook_cb_t) source_output_new_hook_callback, u); + + if (on_hotplug) { + /* A little bit later than module-stream-restore */ + u->sink_put_hook_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_PUT], PA_HOOK_LATE+10, (pa_hook_cb_t) sink_put_hook_callback, u); + u->source_put_hook_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SOURCE_PUT], PA_HOOK_LATE+10, (pa_hook_cb_t) source_put_hook_callback, u); + } + + if (on_rescue) { + /* A little bit later than module-stream-restore, a little bit earlier than module-rescue-streams, ... */ + u->sink_unlink_hook_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_UNLINK], PA_HOOK_LATE+10, (pa_hook_cb_t) sink_unlink_hook_callback, u); + u->source_unlink_hook_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SOURCE_UNLINK], PA_HOOK_LATE+10, (pa_hook_cb_t) source_unlink_hook_callback, u); + } + + pa_modargs_free(ma); + return 0; + +fail: + pa__done(m); + + if (ma) + pa_modargs_free(ma); + + return -1; +} + +void pa__done(pa_module*m) { + struct userdata* u; + + pa_assert(m); + + if (!(u = m->userdata)) + return; + + if (u->sink_input_new_hook_slot) + pa_hook_slot_free(u->sink_input_new_hook_slot); + if (u->source_output_new_hook_slot) + pa_hook_slot_free(u->source_output_new_hook_slot); + + if (u->sink_put_hook_slot) + pa_hook_slot_free(u->sink_put_hook_slot); + if (u->source_put_hook_slot) + pa_hook_slot_free(u->source_put_hook_slot); + + if (u->sink_unlink_hook_slot) + pa_hook_slot_free(u->sink_unlink_hook_slot); + if (u->source_unlink_hook_slot) + pa_hook_slot_free(u->source_unlink_hook_slot); + + pa_xfree(u); +} diff --git a/src/modules/module-ladspa-sink-symdef.h b/src/modules/module-ladspa-sink-symdef.h new file mode 100644 index 0000000..688ec2b --- /dev/null +++ b/src/modules/module-ladspa-sink-symdef.h @@ -0,0 +1,29 @@ +#ifndef foomoduleladspasinksymdeffoo +#define foomoduleladspasinksymdeffoo + +#include +#include +#include + +#define pa__init module_ladspa_sink_LTX_pa__init +#define pa__done module_ladspa_sink_LTX_pa__done +#define pa__get_author module_ladspa_sink_LTX_pa__get_author +#define pa__get_description module_ladspa_sink_LTX_pa__get_description +#define pa__get_usage module_ladspa_sink_LTX_pa__get_usage +#define pa__get_version module_ladspa_sink_LTX_pa__get_version +#define pa__get_deprecated module_ladspa_sink_LTX_pa__get_deprecated +#define pa__load_once module_ladspa_sink_LTX_pa__load_once +#define pa__get_n_used module_ladspa_sink_LTX_pa__get_n_used + +int pa__init(pa_module*m); +void pa__done(pa_module*m); +int pa__get_n_used(pa_module*m); + +const char* pa__get_author(void); +const char* pa__get_description(void); +const char* pa__get_usage(void); +const char* pa__get_version(void); +const char* pa__get_deprecated(void); +pa_bool_t pa__load_once(void); + +#endif diff --git a/src/modules/module-ladspa-sink.c b/src/modules/module-ladspa-sink.c new file mode 100644 index 0000000..994c778 --- /dev/null +++ b/src/modules/module-ladspa-sink.c @@ -0,0 +1,927 @@ +/*** + This file is part of PulseAudio. + + Copyright 2004-2008 Lennart Poettering + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +/* TODO: Some plugins cause latency, and some even report it by using a control + out port. We don't currently use the latency information. */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "module-ladspa-sink-symdef.h" +#include "ladspa.h" + +PA_MODULE_AUTHOR("Lennart Poettering"); +PA_MODULE_DESCRIPTION(_("Virtual LADSPA sink")); +PA_MODULE_VERSION(PACKAGE_VERSION); +PA_MODULE_LOAD_ONCE(FALSE); +PA_MODULE_USAGE( + _("sink_name= " + "sink_properties= " + "master= " + "format= " + "rate= " + "channels= " + "channel_map= " + "plugin= " + "label= " + "control=")); + +#define MEMBLOCKQ_MAXLENGTH (16*1024*1024) + +struct userdata { + pa_module *module; + + pa_sink *sink; + pa_sink_input *sink_input; + + const LADSPA_Descriptor *descriptor; + unsigned channels; + LADSPA_Handle handle[PA_CHANNELS_MAX]; + LADSPA_Data *input, *output; + size_t block_size; + unsigned long input_port, output_port; + LADSPA_Data *control; + + /* This is a dummy buffer. Every port must be connected, but we don't care + about control out ports. We connect them all to this single buffer. */ + LADSPA_Data control_out; + + pa_memblockq *memblockq; + + pa_bool_t auto_desc; +}; + +static const char* const valid_modargs[] = { + "sink_name", + "sink_properties", + "master", + "format", + "rate", + "channels", + "channel_map", + "plugin", + "label", + "control", + NULL +}; + +/* Called from I/O thread context */ +static int sink_process_msg_cb(pa_msgobject *o, int code, void *data, int64_t offset, pa_memchunk *chunk) { + struct userdata *u = PA_SINK(o)->userdata; + + switch (code) { + + case PA_SINK_MESSAGE_GET_LATENCY: + + /* The sink is _put() before the sink input is, so let's + * make sure we don't access it in that time. Also, the + * sink input is first shut down, the sink second. */ + if (!PA_SINK_IS_LINKED(u->sink->thread_info.state) || + !PA_SINK_INPUT_IS_LINKED(u->sink_input->thread_info.state)) { + *((pa_usec_t*) data) = 0; + return 0; + } + + *((pa_usec_t*) data) = + + /* Get the latency of the master sink */ + pa_sink_get_latency_within_thread(u->sink_input->sink) + + + /* Add the latency internal to our sink input on top */ + pa_bytes_to_usec(pa_memblockq_get_length(u->sink_input->thread_info.render_memblockq), &u->sink_input->sink->sample_spec); + + return 0; + } + + return pa_sink_process_msg(o, code, data, offset, chunk); +} + +/* Called from main context */ +static int sink_set_state_cb(pa_sink *s, pa_sink_state_t state) { + struct userdata *u; + + pa_sink_assert_ref(s); + pa_assert_se(u = s->userdata); + + if (!PA_SINK_IS_LINKED(state) || + !PA_SINK_INPUT_IS_LINKED(pa_sink_input_get_state(u->sink_input))) + return 0; + + pa_sink_input_cork(u->sink_input, state == PA_SINK_SUSPENDED); + return 0; +} + +/* Called from I/O thread context */ +static void sink_request_rewind_cb(pa_sink *s) { + struct userdata *u; + + pa_sink_assert_ref(s); + pa_assert_se(u = s->userdata); + + if (!PA_SINK_IS_LINKED(u->sink->thread_info.state) || + !PA_SINK_INPUT_IS_LINKED(u->sink_input->thread_info.state)) + return; + + /* Just hand this one over to the master sink */ + pa_sink_input_request_rewind(u->sink_input, s->thread_info.rewind_nbytes + pa_memblockq_get_length(u->memblockq), TRUE, FALSE, FALSE); +} + +/* Called from I/O thread context */ +static void sink_update_requested_latency_cb(pa_sink *s) { + struct userdata *u; + + pa_sink_assert_ref(s); + pa_assert_se(u = s->userdata); + + if (!PA_SINK_IS_LINKED(u->sink->thread_info.state) || + !PA_SINK_INPUT_IS_LINKED(u->sink_input->thread_info.state)) + return; + + /* Just hand this one over to the master sink */ + pa_sink_input_set_requested_latency_within_thread( + u->sink_input, + pa_sink_get_requested_latency_within_thread(s)); +} + +/* Called from main context */ +static void sink_set_volume_cb(pa_sink *s) { + struct userdata *u; + + pa_sink_assert_ref(s); + pa_assert_se(u = s->userdata); + + if (!PA_SINK_IS_LINKED(pa_sink_get_state(s)) || + !PA_SINK_INPUT_IS_LINKED(pa_sink_input_get_state(u->sink_input))) + return; + + pa_sink_input_set_volume(u->sink_input, &s->real_volume, s->save_volume, TRUE); +} + +/* Called from main context */ +static void sink_set_mute_cb(pa_sink *s) { + struct userdata *u; + + pa_sink_assert_ref(s); + pa_assert_se(u = s->userdata); + + if (!PA_SINK_IS_LINKED(pa_sink_get_state(s)) || + !PA_SINK_INPUT_IS_LINKED(pa_sink_input_get_state(u->sink_input))) + return; + + pa_sink_input_set_mute(u->sink_input, s->muted, s->save_muted); +} + +/* Called from I/O thread context */ +static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk) { + struct userdata *u; + float *src, *dst; + size_t fs; + unsigned n, c; + pa_memchunk tchunk; + + pa_sink_input_assert_ref(i); + pa_assert(chunk); + pa_assert_se(u = i->userdata); + + /* Hmm, process any rewind request that might be queued up */ + pa_sink_process_rewind(u->sink, 0); + + while (pa_memblockq_peek(u->memblockq, &tchunk) < 0) { + pa_memchunk nchunk; + + pa_sink_render(u->sink, nbytes, &nchunk); + pa_memblockq_push(u->memblockq, &nchunk); + pa_memblock_unref(nchunk.memblock); + } + + tchunk.length = PA_MIN(nbytes, tchunk.length); + pa_assert(tchunk.length > 0); + + fs = pa_frame_size(&i->sample_spec); + n = (unsigned) (PA_MIN(tchunk.length, u->block_size) / fs); + + pa_assert(n > 0); + + chunk->index = 0; + chunk->length = n*fs; + chunk->memblock = pa_memblock_new(i->sink->core->mempool, chunk->length); + + pa_memblockq_drop(u->memblockq, chunk->length); + + src = (float*) ((uint8_t*) pa_memblock_acquire(tchunk.memblock) + tchunk.index); + dst = (float*) pa_memblock_acquire(chunk->memblock); + + for (c = 0; c < u->channels; c++) { + pa_sample_clamp(PA_SAMPLE_FLOAT32NE, u->input, sizeof(float), src+c, u->channels*sizeof(float), n); + u->descriptor->run(u->handle[c], n); + pa_sample_clamp(PA_SAMPLE_FLOAT32NE, dst+c, u->channels*sizeof(float), u->output, sizeof(float), n); + } + + pa_memblock_release(tchunk.memblock); + pa_memblock_release(chunk->memblock); + + pa_memblock_unref(tchunk.memblock); + + return 0; +} + +/* Called from I/O thread context */ +static void sink_input_process_rewind_cb(pa_sink_input *i, size_t nbytes) { + struct userdata *u; + size_t amount = 0; + + pa_sink_input_assert_ref(i); + pa_assert_se(u = i->userdata); + + if (u->sink->thread_info.rewind_nbytes > 0) { + size_t max_rewrite; + + max_rewrite = nbytes + pa_memblockq_get_length(u->memblockq); + amount = PA_MIN(u->sink->thread_info.rewind_nbytes, max_rewrite); + u->sink->thread_info.rewind_nbytes = 0; + + if (amount > 0) { + unsigned c; + + pa_memblockq_seek(u->memblockq, - (int64_t) amount, PA_SEEK_RELATIVE, TRUE); + + pa_log_debug("Resetting plugin"); + + /* Reset the plugin */ + if (u->descriptor->deactivate) + for (c = 0; c < u->channels; c++) + u->descriptor->deactivate(u->handle[c]); + if (u->descriptor->activate) + for (c = 0; c < u->channels; c++) + u->descriptor->activate(u->handle[c]); + } + } + + pa_sink_process_rewind(u->sink, amount); + pa_memblockq_rewind(u->memblockq, nbytes); +} + +/* Called from I/O thread context */ +static void sink_input_update_max_rewind_cb(pa_sink_input *i, size_t nbytes) { + struct userdata *u; + + pa_sink_input_assert_ref(i); + pa_assert_se(u = i->userdata); + + pa_memblockq_set_maxrewind(u->memblockq, nbytes); + pa_sink_set_max_rewind_within_thread(u->sink, nbytes); +} + +/* Called from I/O thread context */ +static void sink_input_update_max_request_cb(pa_sink_input *i, size_t nbytes) { + struct userdata *u; + + pa_sink_input_assert_ref(i); + pa_assert_se(u = i->userdata); + + pa_sink_set_max_request_within_thread(u->sink, nbytes); +} + +/* Called from I/O thread context */ +static void sink_input_update_sink_latency_range_cb(pa_sink_input *i) { + struct userdata *u; + + pa_sink_input_assert_ref(i); + pa_assert_se(u = i->userdata); + + pa_sink_set_latency_range_within_thread(u->sink, i->sink->thread_info.min_latency, i->sink->thread_info.max_latency); +} + +/* Called from I/O thread context */ +static void sink_input_update_sink_fixed_latency_cb(pa_sink_input *i) { + struct userdata *u; + + pa_sink_input_assert_ref(i); + pa_assert_se(u = i->userdata); + + pa_sink_set_fixed_latency_within_thread(u->sink, i->sink->thread_info.fixed_latency); +} + +/* Called from I/O thread context */ +static void sink_input_detach_cb(pa_sink_input *i) { + struct userdata *u; + + pa_sink_input_assert_ref(i); + pa_assert_se(u = i->userdata); + + pa_sink_detach_within_thread(u->sink); + + pa_sink_set_rtpoll(u->sink, NULL); +} + +/* Called from I/O thread context */ +static void sink_input_attach_cb(pa_sink_input *i) { + struct userdata *u; + + pa_sink_input_assert_ref(i); + pa_assert_se(u = i->userdata); + + pa_sink_set_rtpoll(u->sink, i->sink->thread_info.rtpoll); + pa_sink_set_latency_range_within_thread(u->sink, i->sink->thread_info.min_latency, i->sink->thread_info.max_latency); + pa_sink_set_fixed_latency_within_thread(u->sink, i->sink->thread_info.fixed_latency); + pa_sink_set_max_request_within_thread(u->sink, pa_sink_input_get_max_request(i)); + pa_sink_set_max_rewind_within_thread(u->sink, pa_sink_input_get_max_rewind(i)); + + pa_sink_attach_within_thread(u->sink); +} + +/* Called from main context */ +static void sink_input_kill_cb(pa_sink_input *i) { + struct userdata *u; + + pa_sink_input_assert_ref(i); + pa_assert_se(u = i->userdata); + + /* The order here matters! We first kill the sink input, followed + * by the sink. That means the sink callbacks must be protected + * against an unconnected sink input! */ + pa_sink_input_unlink(u->sink_input); + pa_sink_unlink(u->sink); + + pa_sink_input_unref(u->sink_input); + u->sink_input = NULL; + + pa_sink_unref(u->sink); + u->sink = NULL; + + pa_module_unload_request(u->module, TRUE); +} + +/* Called from IO thread context */ +static void sink_input_state_change_cb(pa_sink_input *i, pa_sink_input_state_t state) { + struct userdata *u; + + pa_sink_input_assert_ref(i); + pa_assert_se(u = i->userdata); + + /* If we are added for the first time, ask for a rewinding so that + * we are heard right-away. */ + if (PA_SINK_INPUT_IS_LINKED(state) && + i->thread_info.state == PA_SINK_INPUT_INIT) { + pa_log_debug("Requesting rewind due to state change."); + pa_sink_input_request_rewind(i, 0, FALSE, TRUE, TRUE); + } +} + +/* Called from main context */ +static pa_bool_t sink_input_may_move_to_cb(pa_sink_input *i, pa_sink *dest) { + struct userdata *u; + + pa_sink_input_assert_ref(i); + pa_assert_se(u = i->userdata); + + return u->sink != dest; +} + +/* Called from main context */ +static void sink_input_moving_cb(pa_sink_input *i, pa_sink *dest) { + struct userdata *u; + + pa_sink_input_assert_ref(i); + pa_assert_se(u = i->userdata); + + if (dest) { + pa_sink_set_asyncmsgq(u->sink, dest->asyncmsgq); + pa_sink_update_flags(u->sink, PA_SINK_LATENCY|PA_SINK_DYNAMIC_LATENCY, dest->flags); + } else + pa_sink_set_asyncmsgq(u->sink, NULL); + + if (u->auto_desc && dest) { + const char *z; + pa_proplist *pl; + + pl = pa_proplist_new(); + z = pa_proplist_gets(dest->proplist, PA_PROP_DEVICE_DESCRIPTION); + pa_proplist_setf(pl, PA_PROP_DEVICE_DESCRIPTION, "LADSPA Plugin %s on %s", + pa_proplist_gets(u->sink->proplist, "device.ladspa.name"), z ? z : dest->name); + + pa_sink_update_proplist(u->sink, PA_UPDATE_REPLACE, pl); + pa_proplist_free(pl); + } +} + +/* Called from main context */ +static void sink_input_volume_changed_cb(pa_sink_input *i) { + struct userdata *u; + + pa_sink_input_assert_ref(i); + pa_assert_se(u = i->userdata); + + pa_sink_volume_changed(u->sink, &i->volume); +} + +/* Called from main context */ +static void sink_input_mute_changed_cb(pa_sink_input *i) { + struct userdata *u; + + pa_sink_input_assert_ref(i); + pa_assert_se(u = i->userdata); + + pa_sink_mute_changed(u->sink, i->muted); +} + +int pa__init(pa_module*m) { + struct userdata *u; + pa_sample_spec ss; + pa_channel_map map; + pa_modargs *ma; + char *t; + pa_sink *master; + pa_sink_input_new_data sink_input_data; + pa_sink_new_data sink_data; + const char *plugin, *label; + LADSPA_Descriptor_Function descriptor_func; + const char *e, *cdata; + const LADSPA_Descriptor *d; + unsigned long input_port, output_port, p, j, n_control; + unsigned c; + pa_bool_t *use_default = NULL; + + pa_assert(m); + + pa_assert_cc(sizeof(LADSPA_Data) == sizeof(float)); + + if (!(ma = pa_modargs_new(m->argument, valid_modargs))) { + pa_log("Failed to parse module arguments."); + goto fail; + } + + if (!(master = pa_namereg_get(m->core, pa_modargs_get_value(ma, "master", NULL), PA_NAMEREG_SINK))) { + pa_log("Master sink not found"); + goto fail; + } + + ss = master->sample_spec; + ss.format = PA_SAMPLE_FLOAT32; + map = master->channel_map; + if (pa_modargs_get_sample_spec_and_channel_map(ma, &ss, &map, PA_CHANNEL_MAP_DEFAULT) < 0) { + pa_log("Invalid sample format specification or channel map"); + goto fail; + } + + if (!(plugin = pa_modargs_get_value(ma, "plugin", NULL))) { + pa_log("Missing LADSPA plugin name"); + goto fail; + } + + if (!(label = pa_modargs_get_value(ma, "label", NULL))) { + pa_log("Missing LADSPA plugin label"); + goto fail; + } + + cdata = pa_modargs_get_value(ma, "control", NULL); + + u = pa_xnew0(struct userdata, 1); + u->module = m; + m->userdata = u; + u->memblockq = pa_memblockq_new(0, MEMBLOCKQ_MAXLENGTH, 0, pa_frame_size(&ss), 1, 1, 0, NULL); + + if (!(e = getenv("LADSPA_PATH"))) + e = LADSPA_PATH; + + /* FIXME: This is not exactly thread safe */ + t = pa_xstrdup(lt_dlgetsearchpath()); + lt_dlsetsearchpath(e); + m->dl = lt_dlopenext(plugin); + lt_dlsetsearchpath(t); + pa_xfree(t); + + if (!m->dl) { + pa_log("Failed to load LADSPA plugin: %s", lt_dlerror()); + goto fail; + } + + if (!(descriptor_func = (LADSPA_Descriptor_Function) pa_load_sym(m->dl, NULL, "ladspa_descriptor"))) { + pa_log("LADSPA module lacks ladspa_descriptor() symbol."); + goto fail; + } + + for (j = 0;; j++) { + + if (!(d = descriptor_func(j))) { + pa_log("Failed to find plugin label '%s' in plugin '%s'.", label, plugin); + goto fail; + } + + if (strcmp(d->Label, label) == 0) + break; + } + + u->descriptor = d; + + pa_log_debug("Module: %s", plugin); + pa_log_debug("Label: %s", d->Label); + pa_log_debug("Unique ID: %lu", d->UniqueID); + pa_log_debug("Name: %s", d->Name); + pa_log_debug("Maker: %s", d->Maker); + pa_log_debug("Copyright: %s", d->Copyright); + + input_port = output_port = (unsigned long) -1; + n_control = 0; + + for (p = 0; p < d->PortCount; p++) { + + if (LADSPA_IS_PORT_INPUT(d->PortDescriptors[p]) && LADSPA_IS_PORT_AUDIO(d->PortDescriptors[p])) { + + if (strcmp(d->PortNames[p], "Input") == 0) { + pa_assert(input_port == (unsigned long) -1); + input_port = p; + } else { + pa_log("Found audio input port on plugin we cannot handle: %s", d->PortNames[p]); + goto fail; + } + + } else if (LADSPA_IS_PORT_OUTPUT(d->PortDescriptors[p]) && LADSPA_IS_PORT_AUDIO(d->PortDescriptors[p])) { + + if (strcmp(d->PortNames[p], "Output") == 0) { + pa_assert(output_port == (unsigned long) -1); + output_port = p; + } else { + pa_log("Found audio output port on plugin we cannot handle: %s", d->PortNames[p]); + goto fail; + } + + } else if (LADSPA_IS_PORT_INPUT(d->PortDescriptors[p]) && LADSPA_IS_PORT_CONTROL(d->PortDescriptors[p])) + n_control++; + else { + pa_assert(LADSPA_IS_PORT_OUTPUT(d->PortDescriptors[p]) && LADSPA_IS_PORT_CONTROL(d->PortDescriptors[p])); + pa_log_debug("Ignored control output port \"%s\".", d->PortNames[p]); + } + } + + if ((input_port == (unsigned long) -1) || (output_port == (unsigned long) -1)) { + pa_log("Failed to identify input and output ports. " + "Right now this module can only deal with plugins which provide an 'Input' and an 'Output' audio port. " + "Patches welcome!"); + goto fail; + } + + u->block_size = pa_frame_align(pa_mempool_block_size_max(m->core->mempool), &ss); + + u->input = (LADSPA_Data*) pa_xnew(uint8_t, (unsigned) u->block_size); + if (LADSPA_IS_INPLACE_BROKEN(d->Properties)) + u->output = (LADSPA_Data*) pa_xnew(uint8_t, (unsigned) u->block_size); + else + u->output = u->input; + + u->channels = ss.channels; + + for (c = 0; c < ss.channels; c++) { + if (!(u->handle[c] = d->instantiate(d, ss.rate))) { + pa_log("Failed to instantiate plugin %s with label %s for channel %i", plugin, d->Label, c); + goto fail; + } + + d->connect_port(u->handle[c], input_port, u->input); + d->connect_port(u->handle[c], output_port, u->output); + } + + if (!cdata && n_control > 0) { + pa_log("This plugin requires specification of %lu control parameters.", n_control); + goto fail; + } + + if (n_control > 0) { + const char *state = NULL; + char *k; + unsigned long h; + + u->control = pa_xnew(LADSPA_Data, (unsigned) n_control); + use_default = pa_xnew(pa_bool_t, (unsigned) n_control); + p = 0; + + while ((k = pa_split(cdata, ",", &state)) && p < n_control) { + double f; + + if (*k == 0) { + use_default[p++] = TRUE; + pa_xfree(k); + continue; + } + + if (pa_atod(k, &f) < 0) { + pa_log("Failed to parse control value '%s'", k); + pa_xfree(k); + goto fail; + } + + pa_xfree(k); + + use_default[p] = FALSE; + u->control[p++] = (LADSPA_Data) f; + } + + /* The previous loop doesn't take the last control value into account + if it is left empty, so we do it here. */ + if (*cdata == 0 || cdata[strlen(cdata) - 1] == ',') { + if (p < n_control) + use_default[p] = TRUE; + p++; + } + + if (p > n_control || k) { + pa_log("Too many control values passed, %lu expected.", n_control); + pa_xfree(k); + goto fail; + } + + if (p < n_control) { + pa_log("Not enough control values passed, %lu expected, %lu passed.", n_control, p); + goto fail; + } + + h = 0; + for (p = 0; p < d->PortCount; p++) { + LADSPA_PortRangeHintDescriptor hint = d->PortRangeHints[p].HintDescriptor; + + if (!LADSPA_IS_PORT_CONTROL(d->PortDescriptors[p])) + continue; + + if (LADSPA_IS_PORT_OUTPUT(d->PortDescriptors[p])) { + for (c = 0; c < ss.channels; c++) + d->connect_port(u->handle[c], p, &u->control_out); + continue; + } + + pa_assert(h < n_control); + + if (use_default[h]) { + LADSPA_Data lower, upper; + + if (!LADSPA_IS_HINT_HAS_DEFAULT(hint)) { + pa_log("Control port value left empty but plugin defines no default."); + goto fail; + } + + lower = d->PortRangeHints[p].LowerBound; + upper = d->PortRangeHints[p].UpperBound; + + if (LADSPA_IS_HINT_SAMPLE_RATE(hint)) { + lower *= (LADSPA_Data) ss.rate; + upper *= (LADSPA_Data) ss.rate; + } + + switch (hint & LADSPA_HINT_DEFAULT_MASK) { + + case LADSPA_HINT_DEFAULT_MINIMUM: + u->control[h] = lower; + break; + + case LADSPA_HINT_DEFAULT_MAXIMUM: + u->control[h] = upper; + break; + + case LADSPA_HINT_DEFAULT_LOW: + if (LADSPA_IS_HINT_LOGARITHMIC(hint)) + u->control[h] = (LADSPA_Data) exp(log(lower) * 0.75 + log(upper) * 0.25); + else + u->control[h] = (LADSPA_Data) (lower * 0.75 + upper * 0.25); + break; + + case LADSPA_HINT_DEFAULT_MIDDLE: + if (LADSPA_IS_HINT_LOGARITHMIC(hint)) + u->control[h] = (LADSPA_Data) exp(log(lower) * 0.5 + log(upper) * 0.5); + else + u->control[h] = (LADSPA_Data) (lower * 0.5 + upper * 0.5); + break; + + case LADSPA_HINT_DEFAULT_HIGH: + if (LADSPA_IS_HINT_LOGARITHMIC(hint)) + u->control[h] = (LADSPA_Data) exp(log(lower) * 0.25 + log(upper) * 0.75); + else + u->control[h] = (LADSPA_Data) (lower * 0.25 + upper * 0.75); + break; + + case LADSPA_HINT_DEFAULT_0: + u->control[h] = 0; + break; + + case LADSPA_HINT_DEFAULT_1: + u->control[h] = 1; + break; + + case LADSPA_HINT_DEFAULT_100: + u->control[h] = 100; + break; + + case LADSPA_HINT_DEFAULT_440: + u->control[h] = 440; + break; + + default: + pa_assert_not_reached(); + } + } + + if (LADSPA_IS_HINT_INTEGER(hint)) + u->control[h] = roundf(u->control[h]); + + pa_log_debug("Binding %f to port %s", u->control[h], d->PortNames[p]); + + for (c = 0; c < ss.channels; c++) + d->connect_port(u->handle[c], p, &u->control[h]); + + h++; + } + + pa_assert(h == n_control); + } + + if (d->activate) + for (c = 0; c < u->channels; c++) + d->activate(u->handle[c]); + + /* Create sink */ + pa_sink_new_data_init(&sink_data); + sink_data.driver = __FILE__; + sink_data.module = m; + if (!(sink_data.name = pa_xstrdup(pa_modargs_get_value(ma, "sink_name", NULL)))) + sink_data.name = pa_sprintf_malloc("%s.ladspa", master->name); + pa_sink_new_data_set_sample_spec(&sink_data, &ss); + pa_sink_new_data_set_channel_map(&sink_data, &map); + pa_proplist_sets(sink_data.proplist, PA_PROP_DEVICE_MASTER_DEVICE, master->name); + pa_proplist_sets(sink_data.proplist, PA_PROP_DEVICE_CLASS, "filter"); + pa_proplist_sets(sink_data.proplist, "device.ladspa.module", plugin); + pa_proplist_sets(sink_data.proplist, "device.ladspa.label", d->Label); + pa_proplist_sets(sink_data.proplist, "device.ladspa.name", d->Name); + pa_proplist_sets(sink_data.proplist, "device.ladspa.maker", d->Maker); + pa_proplist_sets(sink_data.proplist, "device.ladspa.copyright", d->Copyright); + pa_proplist_setf(sink_data.proplist, "device.ladspa.unique_id", "%lu", (unsigned long) d->UniqueID); + + if (pa_modargs_get_proplist(ma, "sink_properties", sink_data.proplist, PA_UPDATE_REPLACE) < 0) { + pa_log("Invalid properties"); + pa_sink_new_data_done(&sink_data); + goto fail; + } + + if ((u->auto_desc = !pa_proplist_contains(sink_data.proplist, PA_PROP_DEVICE_DESCRIPTION))) { + const char *z; + + z = pa_proplist_gets(master->proplist, PA_PROP_DEVICE_DESCRIPTION); + pa_proplist_setf(sink_data.proplist, PA_PROP_DEVICE_DESCRIPTION, "LADSPA Plugin %s on %s", d->Name, z ? z : master->name); + } + + u->sink = pa_sink_new(m->core, &sink_data, + PA_SINK_HW_MUTE_CTRL|PA_SINK_HW_VOLUME_CTRL|PA_SINK_DECIBEL_VOLUME| + (master->flags & (PA_SINK_LATENCY|PA_SINK_DYNAMIC_LATENCY))); + pa_sink_new_data_done(&sink_data); + + if (!u->sink) { + pa_log("Failed to create sink."); + goto fail; + } + + u->sink->parent.process_msg = sink_process_msg_cb; + u->sink->set_state = sink_set_state_cb; + u->sink->update_requested_latency = sink_update_requested_latency_cb; + u->sink->request_rewind = sink_request_rewind_cb; + u->sink->set_volume = sink_set_volume_cb; + u->sink->set_mute = sink_set_mute_cb; + u->sink->userdata = u; + + pa_sink_set_asyncmsgq(u->sink, master->asyncmsgq); + + /* Create sink input */ + pa_sink_input_new_data_init(&sink_input_data); + sink_input_data.driver = __FILE__; + sink_input_data.module = m; + sink_input_data.sink = master; + pa_proplist_sets(sink_input_data.proplist, PA_PROP_MEDIA_NAME, "LADSPA Stream"); + pa_proplist_sets(sink_input_data.proplist, PA_PROP_MEDIA_ROLE, "filter"); + pa_sink_input_new_data_set_sample_spec(&sink_input_data, &ss); + pa_sink_input_new_data_set_channel_map(&sink_input_data, &map); + + pa_sink_input_new(&u->sink_input, m->core, &sink_input_data); + pa_sink_input_new_data_done(&sink_input_data); + + if (!u->sink_input) + goto fail; + + u->sink_input->pop = sink_input_pop_cb; + u->sink_input->process_rewind = sink_input_process_rewind_cb; + u->sink_input->update_max_rewind = sink_input_update_max_rewind_cb; + u->sink_input->update_max_request = sink_input_update_max_request_cb; + u->sink_input->update_sink_latency_range = sink_input_update_sink_latency_range_cb; + u->sink_input->update_sink_fixed_latency = sink_input_update_sink_fixed_latency_cb; + u->sink_input->kill = sink_input_kill_cb; + u->sink_input->attach = sink_input_attach_cb; + u->sink_input->detach = sink_input_detach_cb; + u->sink_input->state_change = sink_input_state_change_cb; + u->sink_input->may_move_to = sink_input_may_move_to_cb; + u->sink_input->moving = sink_input_moving_cb; + u->sink_input->volume_changed = sink_input_volume_changed_cb; + u->sink_input->mute_changed = sink_input_mute_changed_cb; + u->sink_input->userdata = u; + + pa_sink_put(u->sink); + pa_sink_input_put(u->sink_input); + + pa_modargs_free(ma); + + pa_xfree(use_default); + + return 0; + +fail: + if (ma) + pa_modargs_free(ma); + + pa_xfree(use_default); + + pa__done(m); + + return -1; +} + +int pa__get_n_used(pa_module *m) { + struct userdata *u; + + pa_assert(m); + pa_assert_se(u = m->userdata); + + return pa_sink_linked_by(u->sink); +} + +void pa__done(pa_module*m) { + struct userdata *u; + unsigned c; + + pa_assert(m); + + if (!(u = m->userdata)) + return; + + /* See comments in sink_input_kill_cb() above regarding + * destruction order! */ + + if (u->sink_input) + pa_sink_input_unlink(u->sink_input); + + if (u->sink) + pa_sink_unlink(u->sink); + + if (u->sink_input) + pa_sink_input_unref(u->sink_input); + + if (u->sink) + pa_sink_unref(u->sink); + + for (c = 0; c < u->channels; c++) + if (u->handle[c]) { + if (u->descriptor->deactivate) + u->descriptor->deactivate(u->handle[c]); + u->descriptor->cleanup(u->handle[c]); + } + + if (u->output != u->input) + pa_xfree(u->output); + + if (u->memblockq) + pa_memblockq_free(u->memblockq); + + pa_xfree(u->input); + + pa_xfree(u->control); + + pa_xfree(u); +} diff --git a/src/modules/module-lirc-symdef.h b/src/modules/module-lirc-symdef.h new file mode 100644 index 0000000..b499962 --- /dev/null +++ b/src/modules/module-lirc-symdef.h @@ -0,0 +1,29 @@ +#ifndef foomodulelircsymdeffoo +#define foomodulelircsymdeffoo + +#include +#include +#include + +#define pa__init module_lirc_LTX_pa__init +#define pa__done module_lirc_LTX_pa__done +#define pa__get_author module_lirc_LTX_pa__get_author +#define pa__get_description module_lirc_LTX_pa__get_description +#define pa__get_usage module_lirc_LTX_pa__get_usage +#define pa__get_version module_lirc_LTX_pa__get_version +#define pa__get_deprecated module_lirc_LTX_pa__get_deprecated +#define pa__load_once module_lirc_LTX_pa__load_once +#define pa__get_n_used module_lirc_LTX_pa__get_n_used + +int pa__init(pa_module*m); +void pa__done(pa_module*m); +int pa__get_n_used(pa_module*m); + +const char* pa__get_author(void); +const char* pa__get_description(void); +const char* pa__get_usage(void); +const char* pa__get_version(void); +const char* pa__get_deprecated(void); +pa_bool_t pa__load_once(void); + +#endif diff --git a/src/modules/module-lirc.c b/src/modules/module-lirc.c new file mode 100644 index 0000000..d0e902f --- /dev/null +++ b/src/modules/module-lirc.c @@ -0,0 +1,232 @@ +/*** + This file is part of PulseAudio. + + Copyright 2005-2006 Lennart Poettering + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include + +#include + +#include + +#include +#include +#include +#include +#include +#include + +#include "module-lirc-symdef.h" + +PA_MODULE_AUTHOR("Lennart Poettering"); +PA_MODULE_DESCRIPTION("LIRC volume control"); +PA_MODULE_VERSION(PACKAGE_VERSION); +PA_MODULE_LOAD_ONCE(TRUE); +PA_MODULE_USAGE("config= sink= appname="); + +static const char* const valid_modargs[] = { + "config", + "sink", + "appname", + NULL, +}; + +struct userdata { + int lirc_fd; + pa_io_event *io; + struct lirc_config *config; + char *sink_name; + pa_module *module; + float mute_toggle_save; +}; + +#define DELTA (PA_VOLUME_NORM/20) + +static void io_callback(pa_mainloop_api *io, pa_io_event *e, int fd, pa_io_event_flags_t events, void*userdata) { + struct userdata *u = userdata; + char *name = NULL, *code = NULL; + + pa_assert(io); + pa_assert(u); + + if (events & (PA_IO_EVENT_HANGUP|PA_IO_EVENT_ERROR)) { + pa_log("Lost connection to LIRC daemon."); + goto fail; + } + + if (events & PA_IO_EVENT_INPUT) { + char *c; + + if (lirc_nextcode(&code) != 0 || !code) { + pa_log("lirc_nextcode() failed."); + goto fail; + } + + c = pa_xstrdup(code); + c[strcspn(c, "\n\r")] = 0; + pa_log_debug("Raw IR code '%s'", c); + pa_xfree(c); + + while (lirc_code2char(u->config, code, &name) == 0 && name) { + enum { + INVALID, + UP, + DOWN, + MUTE, + RESET, + MUTE_TOGGLE + } volchange = INVALID; + + pa_log_info("Translated IR code '%s'", name); + + if (strcasecmp(name, "volume-up") == 0) + volchange = UP; + else if (strcasecmp(name, "volume-down") == 0) + volchange = DOWN; + else if (strcasecmp(name, "mute") == 0) + volchange = MUTE; + else if (strcasecmp(name, "mute-toggle") == 0) + volchange = MUTE_TOGGLE; + else if (strcasecmp(name, "reset") == 0) + volchange = RESET; + + if (volchange == INVALID) + pa_log_warn("Received unknown IR code '%s'", name); + else { + pa_sink *s; + + if (!(s = pa_namereg_get(u->module->core, u->sink_name, PA_NAMEREG_SINK))) + pa_log("Failed to get sink '%s'", u->sink_name); + else { + pa_cvolume cv = *pa_sink_get_volume(s, FALSE); + + switch (volchange) { + case UP: + pa_cvolume_inc(&cv, DELTA); + pa_sink_set_volume(s, &cv, TRUE, TRUE); + break; + + case DOWN: + pa_cvolume_dec(&cv, DELTA); + pa_sink_set_volume(s, &cv, TRUE, TRUE); + break; + + case MUTE: + pa_sink_set_mute(s, TRUE, TRUE); + break; + + case RESET: + pa_sink_set_mute(s, FALSE, TRUE); + break; + + case MUTE_TOGGLE: + pa_sink_set_mute(s, !pa_sink_get_mute(s, FALSE), TRUE); + break; + + case INVALID: + pa_assert_not_reached(); + } + } + } + } + } + + pa_xfree(code); + + return; + +fail: + u->module->core->mainloop->io_free(u->io); + u->io = NULL; + + pa_module_unload_request(u->module, TRUE); + + pa_xfree(code); +} + +int pa__init(pa_module*m) { + pa_modargs *ma = NULL; + struct userdata *u; + + pa_assert(m); + + if (!(ma = pa_modargs_new(m->argument, valid_modargs))) { + pa_log("Failed to parse module arguments"); + goto fail; + } + + m->userdata = u = pa_xnew(struct userdata, 1); + u->module = m; + u->io = NULL; + u->config = NULL; + u->sink_name = pa_xstrdup(pa_modargs_get_value(ma, "sink", NULL)); + u->lirc_fd = -1; + u->mute_toggle_save = 0; + + if ((u->lirc_fd = lirc_init((char*) pa_modargs_get_value(ma, "appname", "pulseaudio"), 1)) < 0) { + pa_log("lirc_init() failed."); + goto fail; + } + + if (lirc_readconfig((char*) pa_modargs_get_value(ma, "config", NULL), &u->config, NULL) < 0) { + pa_log("lirc_readconfig() failed."); + goto fail; + } + + u->io = m->core->mainloop->io_new(m->core->mainloop, u->lirc_fd, PA_IO_EVENT_INPUT|PA_IO_EVENT_HANGUP, io_callback, u); + + pa_modargs_free(ma); + + return 0; + +fail: + + if (ma) + pa_modargs_free(ma); + + pa__done(m); + return -1; +} + +void pa__done(pa_module*m) { + struct userdata *u; + pa_assert(m); + + if (!(u = m->userdata)) + return; + + if (u->io) + m->core->mainloop->io_free(u->io); + + if (u->config) + lirc_freeconfig(u->config); + + if (u->lirc_fd >= 0) + lirc_deinit(); + + pa_xfree(u->sink_name); + pa_xfree(u); +} diff --git a/src/modules/module-loopback-symdef.h b/src/modules/module-loopback-symdef.h new file mode 100644 index 0000000..3311308 --- /dev/null +++ b/src/modules/module-loopback-symdef.h @@ -0,0 +1,29 @@ +#ifndef foomoduleloopbacksymdeffoo +#define foomoduleloopbacksymdeffoo + +#include +#include +#include + +#define pa__init module_loopback_LTX_pa__init +#define pa__done module_loopback_LTX_pa__done +#define pa__get_author module_loopback_LTX_pa__get_author +#define pa__get_description module_loopback_LTX_pa__get_description +#define pa__get_usage module_loopback_LTX_pa__get_usage +#define pa__get_version module_loopback_LTX_pa__get_version +#define pa__get_deprecated module_loopback_LTX_pa__get_deprecated +#define pa__load_once module_loopback_LTX_pa__load_once +#define pa__get_n_used module_loopback_LTX_pa__get_n_used + +int pa__init(pa_module*m); +void pa__done(pa_module*m); +int pa__get_n_used(pa_module*m); + +const char* pa__get_author(void); +const char* pa__get_description(void); +const char* pa__get_usage(void); +const char* pa__get_version(void); +const char* pa__get_deprecated(void); +pa_bool_t pa__load_once(void); + +#endif diff --git a/src/modules/module-loopback.c b/src/modules/module-loopback.c new file mode 100644 index 0000000..e70dbb0 --- /dev/null +++ b/src/modules/module-loopback.c @@ -0,0 +1,785 @@ +/*** + This file is part of PulseAudio. + + Copyright 2009 Intel Corporation + Contributor: Pierre-Louis Bossart + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include + +#include + +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "module-loopback-symdef.h" + +PA_MODULE_AUTHOR("Pierre-Louis Bossart"); +PA_MODULE_DESCRIPTION("Loopback from source to sink"); +PA_MODULE_VERSION(PACKAGE_VERSION); +PA_MODULE_LOAD_ONCE(FALSE); +PA_MODULE_USAGE( + "source= " + "sink= " + "adjust_time= " + "latency_msec= " + "format= " + "rate= " + "channels= " + "channel_map="); + +#define DEFAULT_LATENCY_MSEC 200 + +#define MEMBLOCKQ_MAXLENGTH (1024*1024*16) + +#define DEFAULT_ADJUST_TIME_USEC (10*PA_USEC_PER_SEC) + +struct userdata { + pa_core *core; + pa_module *module; + + pa_sink_input *sink_input; + pa_source_output *source_output; + + pa_asyncmsgq *asyncmsgq; + pa_memblockq *memblockq; + + pa_rtpoll_item *rtpoll_item_read, *rtpoll_item_write; + + pa_time_event *time_event; + pa_usec_t adjust_time; + + int64_t recv_counter; + int64_t send_counter; + + size_t skip; + pa_usec_t latency; + + pa_bool_t in_pop; + size_t min_memblockq_length; + + struct { + int64_t send_counter; + size_t source_output_buffer; + pa_usec_t source_latency; + + int64_t recv_counter; + size_t sink_input_buffer; + pa_usec_t sink_latency; + + size_t min_memblockq_length; + size_t max_request; + } latency_snapshot; +}; + +static const char* const valid_modargs[] = { + "source", + "sink", + "latency_msec", + "format", + "rate", + "channels", + "channel_map", + NULL, +}; + +enum { + SINK_INPUT_MESSAGE_POST = PA_SINK_INPUT_MESSAGE_MAX, + SINK_INPUT_MESSAGE_REWIND, + SINK_INPUT_MESSAGE_LATENCY_SNAPSHOT, + SINK_INPUT_MESSAGE_MAX_REQUEST_CHANGED +}; + +enum { + SOURCE_OUTPUT_MESSAGE_LATENCY_SNAPSHOT +}; + +/* Called from main context */ +static void teardown(struct userdata *u) { + pa_assert(u); + pa_assert_ctl_context(); + + if (u->sink_input) + pa_sink_input_unlink(u->sink_input); + + if (u->source_output) + pa_source_output_unlink(u->source_output); + + if (u->sink_input) { + pa_sink_input_unref(u->sink_input); + u->sink_input = NULL; + } + + if (u->source_output) { + pa_source_output_unref(u->source_output); + u->source_output = NULL; + } +} + +/* Called from main context */ +static void adjust_rates(struct userdata *u) { + size_t buffer, fs; + uint32_t old_rate, base_rate, new_rate; + pa_usec_t buffer_latency; + + pa_assert(u); + pa_assert_ctl_context(); + + pa_asyncmsgq_send(u->source_output->source->asyncmsgq, PA_MSGOBJECT(u->source_output), SOURCE_OUTPUT_MESSAGE_LATENCY_SNAPSHOT, NULL, 0, NULL); + pa_asyncmsgq_send(u->sink_input->sink->asyncmsgq, PA_MSGOBJECT(u->sink_input), SINK_INPUT_MESSAGE_LATENCY_SNAPSHOT, NULL, 0, NULL); + + buffer = + u->latency_snapshot.sink_input_buffer + + u->latency_snapshot.source_output_buffer; + + if (u->latency_snapshot.recv_counter <= u->latency_snapshot.send_counter) + buffer += (size_t) (u->latency_snapshot.send_counter - u->latency_snapshot.recv_counter); + else + buffer += PA_CLIP_SUB(buffer, (size_t) (u->latency_snapshot.recv_counter - u->latency_snapshot.send_counter)); + + buffer_latency = pa_bytes_to_usec(buffer, &u->sink_input->sample_spec); + + pa_log_info("Loopback overall latency is %0.2f ms + %0.2f ms + %0.2f ms = %0.2f ms", + (double) u->latency_snapshot.sink_latency / PA_USEC_PER_MSEC, + (double) buffer_latency / PA_USEC_PER_MSEC, + (double) u->latency_snapshot.source_latency / PA_USEC_PER_MSEC, + ((double) u->latency_snapshot.sink_latency + buffer_latency + u->latency_snapshot.source_latency) / PA_USEC_PER_MSEC); + + pa_log_info("Should buffer %zu bytes, buffered at minimum %zu bytes", + u->latency_snapshot.max_request*2, + u->latency_snapshot.min_memblockq_length); + + fs = pa_frame_size(&u->sink_input->sample_spec); + old_rate = u->sink_input->sample_spec.rate; + base_rate = u->source_output->sample_spec.rate; + + if (u->latency_snapshot.min_memblockq_length < u->latency_snapshot.max_request*2) + new_rate = base_rate - (((u->latency_snapshot.max_request*2 - u->latency_snapshot.min_memblockq_length) / fs) *PA_USEC_PER_SEC)/u->adjust_time; + else + new_rate = base_rate + (((u->latency_snapshot.min_memblockq_length - u->latency_snapshot.max_request*2) / fs) *PA_USEC_PER_SEC)/u->adjust_time; + + pa_log_info("Old rate %lu Hz, new rate %lu Hz", (unsigned long) old_rate, (unsigned long) new_rate); + + pa_sink_input_set_rate(u->sink_input, new_rate); + + pa_core_rttime_restart(u->core, u->time_event, pa_rtclock_now() + u->adjust_time); +} + +/* Called from main context */ +static void time_callback(pa_mainloop_api *a, pa_time_event *e, const struct timeval *t, void *userdata) { + struct userdata *u = userdata; + + pa_assert(u); + pa_assert(a); + pa_assert(u->time_event == e); + + adjust_rates(u); +} + +/* Called from input thread context */ +static void source_output_push_cb(pa_source_output *o, const pa_memchunk *chunk) { + struct userdata *u; + pa_memchunk copy; + + pa_source_output_assert_ref(o); + pa_source_output_assert_io_context(o); + pa_assert_se(u = o->userdata); + + if (u->skip > chunk->length) { + u->skip -= chunk->length; + return; + } + + if (u->skip > 0) { + copy = *chunk; + copy.index += u->skip; + copy.length -= u->skip; + u->skip = 0; + + chunk = © + } + + pa_asyncmsgq_post(u->asyncmsgq, PA_MSGOBJECT(u->sink_input), SINK_INPUT_MESSAGE_POST, NULL, 0, chunk, NULL); + u->send_counter += (int64_t) chunk->length; +} + +/* Called from input thread context */ +static void source_output_process_rewind_cb(pa_source_output *o, size_t nbytes) { + struct userdata *u; + + pa_source_output_assert_ref(o); + pa_source_output_assert_io_context(o); + pa_assert_se(u = o->userdata); + + pa_asyncmsgq_post(u->asyncmsgq, PA_MSGOBJECT(u->sink_input), SINK_INPUT_MESSAGE_REWIND, NULL, (int64_t) nbytes, NULL, NULL); + u->send_counter -= (int64_t) nbytes; +} + +/* Called from output thread context */ +static int source_output_process_msg_cb(pa_msgobject *obj, int code, void *data, int64_t offset, pa_memchunk *chunk) { + struct userdata *u = PA_SOURCE_OUTPUT(obj)->userdata; + + switch (code) { + + case SOURCE_OUTPUT_MESSAGE_LATENCY_SNAPSHOT: { + size_t length; + + length = pa_memblockq_get_length(u->source_output->thread_info.delay_memblockq); + + u->latency_snapshot.send_counter = u->send_counter; + u->latency_snapshot.source_output_buffer = u->source_output->thread_info.resampler ? pa_resampler_result(u->source_output->thread_info.resampler, length) : length; + u->latency_snapshot.source_latency = pa_source_get_latency_within_thread(u->source_output->source); + + return 0; + } + } + + return pa_source_output_process_msg(obj, code, data, offset, chunk); +} + +/* Called from output thread context */ +static void source_output_attach_cb(pa_source_output *o) { + struct userdata *u; + + pa_source_output_assert_ref(o); + pa_source_output_assert_io_context(o); + pa_assert_se(u = o->userdata); + + u->rtpoll_item_write = pa_rtpoll_item_new_asyncmsgq_write( + o->source->thread_info.rtpoll, + PA_RTPOLL_LATE, + u->asyncmsgq); +} + +/* Called from output thread context */ +static void source_output_detach_cb(pa_source_output *o) { + struct userdata *u; + + pa_source_output_assert_ref(o); + pa_source_output_assert_io_context(o); + pa_assert_se(u = o->userdata); + + if (u->rtpoll_item_write) { + pa_rtpoll_item_free(u->rtpoll_item_write); + u->rtpoll_item_write = NULL; + } +} + +/* Called from output thread context */ +static void source_output_state_change_cb(pa_source_output *o, pa_source_output_state_t state) { + struct userdata *u; + + pa_source_output_assert_ref(o); + pa_source_output_assert_io_context(o); + pa_assert_se(u = o->userdata); + + if (PA_SOURCE_OUTPUT_IS_LINKED(state) && o->thread_info.state == PA_SOURCE_OUTPUT_INIT) { + + u->skip = pa_usec_to_bytes(PA_CLIP_SUB(pa_source_get_latency_within_thread(o->source), + u->latency), + &o->sample_spec); + + pa_log_info("Skipping %lu bytes", (unsigned long) u->skip); + } +} + +/* Called from main thread */ +static void source_output_kill_cb(pa_source_output *o) { + struct userdata *u; + + pa_source_output_assert_ref(o); + pa_assert_ctl_context(); + pa_assert_se(u = o->userdata); + + teardown(u); + pa_module_unload_request(u->module, TRUE); +} + +/* Called from main thread */ +static pa_bool_t source_output_may_move_to_cb(pa_source_output *o, pa_source *dest) { + struct userdata *u; + + pa_source_output_assert_ref(o); + pa_assert_ctl_context(); + pa_assert_se(u = o->userdata); + + return dest != u->sink_input->sink->monitor_source; +} + +/* Called from main thread */ +static void source_output_moving_cb(pa_source_output *o, pa_source *dest) { + pa_proplist *p; + const char *n; + struct userdata *u; + + pa_source_output_assert_ref(o); + pa_assert_ctl_context(); + pa_assert_se(u = o->userdata); + + p = pa_proplist_new(); + pa_proplist_setf(p, PA_PROP_MEDIA_NAME, "Loopback of %s", pa_strnull(pa_proplist_gets(dest->proplist, PA_PROP_DEVICE_DESCRIPTION))); + + if ((n = pa_proplist_gets(dest->proplist, PA_PROP_DEVICE_ICON_NAME))) + pa_proplist_sets(p, PA_PROP_MEDIA_ICON_NAME, n); + + pa_sink_input_update_proplist(u->sink_input, PA_UPDATE_REPLACE, p); + pa_proplist_free(p); +} + +/* Called from output thread context */ +static void update_min_memblockq_length(struct userdata *u) { + size_t length; + + pa_assert(u); + pa_sink_input_assert_io_context(u->sink_input); + + length = pa_memblockq_get_length(u->memblockq); + + if (u->min_memblockq_length == (size_t) -1 || + length < u->min_memblockq_length) + u->min_memblockq_length = length; +} + +/* Called from output thread context */ +static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk) { + struct userdata *u; + + pa_sink_input_assert_ref(i); + pa_sink_input_assert_io_context(i); + pa_assert_se(u = i->userdata); + pa_assert(chunk); + + u->in_pop = TRUE; + while (pa_asyncmsgq_process_one(u->asyncmsgq) > 0) + ; + u->in_pop = FALSE; + + if (pa_memblockq_peek(u->memblockq, chunk) < 0) { + pa_log_info("Coud not peek into queue"); + return -1; + } + + chunk->length = PA_MIN(chunk->length, nbytes); + pa_memblockq_drop(u->memblockq, chunk->length); + + update_min_memblockq_length(u); + + return 0; +} + +/* Called from output thread context */ +static void sink_input_process_rewind_cb(pa_sink_input *i, size_t nbytes) { + struct userdata *u; + + pa_sink_input_assert_ref(i); + pa_sink_input_assert_io_context(i); + pa_assert_se(u = i->userdata); + + pa_memblockq_rewind(u->memblockq, nbytes); +} + +/* Called from output thread context */ +static int sink_input_process_msg_cb(pa_msgobject *obj, int code, void *data, int64_t offset, pa_memchunk *chunk) { + struct userdata *u = PA_SINK_INPUT(obj)->userdata; + + switch (code) { + + case PA_SINK_INPUT_MESSAGE_GET_LATENCY: { + pa_usec_t *r = data; + + pa_sink_input_assert_io_context(u->sink_input); + + *r = pa_bytes_to_usec(pa_memblockq_get_length(u->memblockq), &u->sink_input->sample_spec); + + /* Fall through, the default handler will add in the extra + * latency added by the resampler */ + break; + } + + case SINK_INPUT_MESSAGE_POST: + + pa_sink_input_assert_io_context(u->sink_input); + + if (PA_SINK_IS_OPENED(u->sink_input->sink->thread_info.state)) + pa_memblockq_push_align(u->memblockq, chunk); + else + pa_memblockq_flush_write(u->memblockq, TRUE); + + update_min_memblockq_length(u); + + /* Is this the end of an underrun? Then let's start things + * right-away */ + if (!u->in_pop && + u->sink_input->thread_info.underrun_for > 0 && + pa_memblockq_is_readable(u->memblockq)) { + + pa_log_debug("Requesting rewind due to end of underrun."); + pa_sink_input_request_rewind(u->sink_input, + (size_t) (u->sink_input->thread_info.underrun_for == (size_t) -1 ? 0 : u->sink_input->thread_info.underrun_for), + FALSE, TRUE, FALSE); + } + + u->recv_counter += (int64_t) chunk->length; + + return 0; + + case SINK_INPUT_MESSAGE_REWIND: + + pa_sink_input_assert_io_context(u->sink_input); + + if (PA_SINK_IS_OPENED(u->sink_input->sink->thread_info.state)) + pa_memblockq_seek(u->memblockq, -offset, PA_SEEK_RELATIVE, TRUE); + else + pa_memblockq_flush_write(u->memblockq, TRUE); + + u->recv_counter -= offset; + + update_min_memblockq_length(u); + + return 0; + + case SINK_INPUT_MESSAGE_LATENCY_SNAPSHOT: { + size_t length; + + update_min_memblockq_length(u); + + length = pa_memblockq_get_length(u->sink_input->thread_info.render_memblockq); + + u->latency_snapshot.recv_counter = u->recv_counter; + u->latency_snapshot.sink_input_buffer = + pa_memblockq_get_length(u->memblockq) + + (u->sink_input->thread_info.resampler ? pa_resampler_request(u->sink_input->thread_info.resampler, length) : length); + u->latency_snapshot.sink_latency = pa_sink_get_latency_within_thread(u->sink_input->sink); + + u->latency_snapshot.max_request = pa_sink_input_get_max_request(u->sink_input); + + u->latency_snapshot.min_memblockq_length = u->min_memblockq_length; + u->min_memblockq_length = (size_t) -1; + + return 0; + } + + case SINK_INPUT_MESSAGE_MAX_REQUEST_CHANGED: { + /* This message is sent from the IO thread to the main + * thread! So don't be confused. All the user cases above + * are executed in thread context, but this one is not! */ + + pa_assert_ctl_context(); + + if (u->adjust_time > 0) + adjust_rates(u); + return 0; + } + } + + return pa_sink_input_process_msg(obj, code, data, offset, chunk); +} + +/* Called from output thread context */ +static void sink_input_attach_cb(pa_sink_input *i) { + struct userdata *u; + + pa_sink_input_assert_ref(i); + pa_sink_input_assert_io_context(i); + pa_assert_se(u = i->userdata); + + u->rtpoll_item_read = pa_rtpoll_item_new_asyncmsgq_read( + i->sink->thread_info.rtpoll, + PA_RTPOLL_LATE, + u->asyncmsgq); + + pa_memblockq_set_prebuf(u->memblockq, pa_sink_input_get_max_request(i)*2); + pa_memblockq_set_maxrewind(u->memblockq, pa_sink_input_get_max_rewind(i)); + + u->min_memblockq_length = (size_t) -1; +} + +/* Called from output thread context */ +static void sink_input_detach_cb(pa_sink_input *i) { + struct userdata *u; + + pa_sink_input_assert_ref(i); + pa_sink_input_assert_io_context(i); + pa_assert_se(u = i->userdata); + + if (u->rtpoll_item_read) { + pa_rtpoll_item_free(u->rtpoll_item_read); + u->rtpoll_item_read = NULL; + } +} + +/* Called from output thread context */ +static void sink_input_update_max_rewind_cb(pa_sink_input *i, size_t nbytes) { + struct userdata *u; + + pa_sink_input_assert_ref(i); + pa_sink_input_assert_io_context(i); + pa_assert_se(u = i->userdata); + + pa_memblockq_set_maxrewind(u->memblockq, nbytes); +} + +/* Called from output thread context */ +static void sink_input_update_max_request_cb(pa_sink_input *i, size_t nbytes) { + struct userdata *u; + + pa_sink_input_assert_ref(i); + pa_sink_input_assert_io_context(i); + pa_assert_se(u = i->userdata); + + pa_memblockq_set_prebuf(u->memblockq, nbytes*2); + pa_log_info("Max request changed"); + pa_asyncmsgq_post(pa_thread_mq_get()->outq, PA_MSGOBJECT(u->sink_input), SINK_INPUT_MESSAGE_MAX_REQUEST_CHANGED, NULL, 0, NULL, NULL); +} + +/* Called from main thread */ +static void sink_input_kill_cb(pa_sink_input *i) { + struct userdata *u; + + pa_sink_input_assert_ref(i); + pa_assert_ctl_context(); + pa_assert_se(u = i->userdata); + + teardown(u); + pa_module_unload_request(u->module, TRUE); +} + +/* Called from main thread */ +static void sink_input_moving_cb(pa_sink_input *i, pa_sink *dest) { + struct userdata *u; + pa_proplist *p; + const char *n; + + pa_sink_input_assert_ref(i); + pa_assert_ctl_context(); + pa_assert_se(u = i->userdata); + + p = pa_proplist_new(); + pa_proplist_setf(p, PA_PROP_MEDIA_NAME, "Loopback to %s", pa_strnull(pa_proplist_gets(dest->proplist, PA_PROP_DEVICE_DESCRIPTION))); + + if ((n = pa_proplist_gets(dest->proplist, PA_PROP_DEVICE_ICON_NAME))) + pa_proplist_sets(p, PA_PROP_MEDIA_ICON_NAME, n); + + pa_source_output_update_proplist(u->source_output, PA_UPDATE_REPLACE, p); + pa_proplist_free(p); +} + +/* Called from main thread */ +static pa_bool_t sink_input_may_move_to_cb(pa_sink_input *i, pa_sink *dest) { + struct userdata *u; + + pa_sink_input_assert_ref(i); + pa_assert_ctl_context(); + pa_assert_se(u = i->userdata); + + if (!u->source_output->source->monitor_of) + return TRUE; + + return dest != u->source_output->source->monitor_of; +} + +int pa__init(pa_module *m) { + pa_modargs *ma = NULL; + struct userdata *u; + pa_sink *sink; + pa_sink_input_new_data sink_input_data; + pa_source *source; + pa_source_output_new_data source_output_data; + uint32_t latency_msec; + pa_sample_spec ss; + pa_channel_map map; + pa_memchunk silence; + uint32_t adjust_time_sec; + const char *n; + + pa_assert(m); + + if (!(ma = pa_modargs_new(m->argument, valid_modargs))) { + pa_log("Failed to parse module arguments"); + goto fail; + } + + if (!(source = pa_namereg_get(m->core, pa_modargs_get_value(ma, "source", NULL), PA_NAMEREG_SOURCE))) { + pa_log("No such source."); + goto fail; + } + + if (!(sink = pa_namereg_get(m->core, pa_modargs_get_value(ma, "sink", NULL), PA_NAMEREG_SINK))) { + pa_log("No such sink."); + goto fail; + } + + ss = sink->sample_spec; + map = sink->channel_map; + if (pa_modargs_get_sample_spec_and_channel_map(ma, &ss, &map, PA_CHANNEL_MAP_DEFAULT) < 0) { + pa_log("Invalid sample format specification or channel map"); + goto fail; + } + + latency_msec = DEFAULT_LATENCY_MSEC; + if (pa_modargs_get_value_u32(ma, "latency_msec", &latency_msec) < 0 || latency_msec < 1 || latency_msec > 2000) { + pa_log("Invalid latency specification"); + goto fail; + } + + m->userdata = u = pa_xnew0(struct userdata, 1); + u->core = m->core; + u->module = m; + u->latency = (pa_usec_t) latency_msec * PA_USEC_PER_MSEC; + + adjust_time_sec = DEFAULT_ADJUST_TIME_USEC / PA_USEC_PER_SEC; + if (pa_modargs_get_value_u32(ma, "adjust_time", &adjust_time_sec) < 0) { + pa_log("Failed to parse adjust_time value"); + goto fail; + } + + if (adjust_time_sec != DEFAULT_ADJUST_TIME_USEC / PA_USEC_PER_SEC) + u->adjust_time = adjust_time_sec * PA_USEC_PER_SEC; + else + u->adjust_time = DEFAULT_ADJUST_TIME_USEC; + + pa_sink_input_new_data_init(&sink_input_data); + sink_input_data.driver = __FILE__; + sink_input_data.module = m; + sink_input_data.sink = sink; + + pa_proplist_setf(sink_input_data.proplist, PA_PROP_MEDIA_NAME, "Loopback of %s", + pa_strnull(pa_proplist_gets(source->proplist, PA_PROP_DEVICE_DESCRIPTION))); + if ((n = pa_proplist_gets(source->proplist, PA_PROP_DEVICE_ICON_NAME))) + pa_proplist_sets(sink_input_data.proplist, PA_PROP_MEDIA_ICON_NAME, n); + pa_proplist_sets(sink_input_data.proplist, PA_PROP_MEDIA_ROLE, "abstract"); + pa_sink_input_new_data_set_sample_spec(&sink_input_data, &ss); + pa_sink_input_new_data_set_channel_map(&sink_input_data, &map); + sink_input_data.flags = PA_SINK_INPUT_VARIABLE_RATE; + + pa_sink_input_new(&u->sink_input, m->core, &sink_input_data); + pa_sink_input_new_data_done(&sink_input_data); + + if (!u->sink_input) + goto fail; + + u->sink_input->parent.process_msg = sink_input_process_msg_cb; + u->sink_input->pop = sink_input_pop_cb; + u->sink_input->process_rewind = sink_input_process_rewind_cb; + u->sink_input->kill = sink_input_kill_cb; + u->sink_input->attach = sink_input_attach_cb; + u->sink_input->detach = sink_input_detach_cb; + u->sink_input->update_max_rewind = sink_input_update_max_rewind_cb; + u->sink_input->update_max_request = sink_input_update_max_request_cb; + u->sink_input->may_move_to = sink_input_may_move_to_cb; + u->sink_input->moving = sink_input_moving_cb; + u->sink_input->userdata = u; + + pa_sink_input_set_requested_latency(u->sink_input, u->latency/3); + + pa_source_output_new_data_init(&source_output_data); + source_output_data.driver = __FILE__; + source_output_data.module = m; + source_output_data.source = source; + pa_proplist_setf(source_output_data.proplist, PA_PROP_MEDIA_NAME, "Loopback to %s", + pa_strnull(pa_proplist_gets(sink->proplist, PA_PROP_DEVICE_DESCRIPTION))); + if ((n = pa_proplist_gets(sink->proplist, PA_PROP_DEVICE_ICON_NAME))) + pa_proplist_sets(source_output_data.proplist, PA_PROP_MEDIA_ICON_NAME, n); + pa_proplist_sets(source_output_data.proplist, PA_PROP_MEDIA_ROLE, "abstract"); + pa_source_output_new_data_set_sample_spec(&source_output_data, &ss); + pa_sink_input_new_data_set_channel_map(&sink_input_data, &map); + + pa_source_output_new(&u->source_output, m->core, &source_output_data); + pa_source_output_new_data_done(&source_output_data); + + if (!u->source_output) + goto fail; + + u->source_output->parent.process_msg = source_output_process_msg_cb; + u->source_output->push = source_output_push_cb; + u->source_output->process_rewind = source_output_process_rewind_cb; + u->source_output->kill = source_output_kill_cb; + u->source_output->attach = source_output_attach_cb; + u->source_output->detach = source_output_detach_cb; + u->source_output->state_change = source_output_state_change_cb; + u->source_output->may_move_to = source_output_may_move_to_cb; + u->source_output->moving = source_output_moving_cb; + u->source_output->userdata = u; + + pa_source_output_set_requested_latency(u->source_output, u->latency/3); + + pa_sink_input_get_silence(u->sink_input, &silence); + u->memblockq = pa_memblockq_new( + 0, /* idx */ + MEMBLOCKQ_MAXLENGTH, /* maxlength */ + MEMBLOCKQ_MAXLENGTH, /* tlength */ + pa_frame_size(&ss), /* base */ + 0, /* prebuf */ + 0, /* minreq */ + 0, /* maxrewind */ + &silence); /* silence frame */ + pa_memblock_unref(silence.memblock); + + u->asyncmsgq = pa_asyncmsgq_new(0); + + pa_sink_input_put(u->sink_input); + pa_source_output_put(u->source_output); + + if (u->adjust_time > 0) + u->time_event = pa_core_rttime_new(m->core, pa_rtclock_now() + u->adjust_time, time_callback, u); + + pa_modargs_free(ma); + return 0; + +fail: + if (ma) + pa_modargs_free(ma); + + pa__done(m); + + return -1; +} + +void pa__done(pa_module*m) { + struct userdata *u; + + pa_assert(m); + + if (!(u = m->userdata)) + return; + + teardown(u); + + if (u->memblockq) + pa_memblockq_free(u->memblockq); + + if (u->asyncmsgq) + pa_asyncmsgq_unref(u->asyncmsgq); + + if (u->time_event) + u->core->mainloop->time_free(u->time_event); + + pa_xfree(u); +} diff --git a/src/modules/module-match-symdef.h b/src/modules/module-match-symdef.h new file mode 100644 index 0000000..ab7e290 --- /dev/null +++ b/src/modules/module-match-symdef.h @@ -0,0 +1,29 @@ +#ifndef foomodulematchsymdeffoo +#define foomodulematchsymdeffoo + +#include +#include +#include + +#define pa__init module_match_LTX_pa__init +#define pa__done module_match_LTX_pa__done +#define pa__get_author module_match_LTX_pa__get_author +#define pa__get_description module_match_LTX_pa__get_description +#define pa__get_usage module_match_LTX_pa__get_usage +#define pa__get_version module_match_LTX_pa__get_version +#define pa__get_deprecated module_match_LTX_pa__get_deprecated +#define pa__load_once module_match_LTX_pa__load_once +#define pa__get_n_used module_match_LTX_pa__get_n_used + +int pa__init(pa_module*m); +void pa__done(pa_module*m); +int pa__get_n_used(pa_module*m); + +const char* pa__get_author(void); +const char* pa__get_description(void); +const char* pa__get_usage(void); +const char* pa__get_version(void); +const char* pa__get_deprecated(void); +pa_bool_t pa__load_once(void); + +#endif diff --git a/src/modules/module-match.c b/src/modules/module-match.c new file mode 100644 index 0000000..0bd781d --- /dev/null +++ b/src/modules/module-match.c @@ -0,0 +1,287 @@ +/*** + This file is part of PulseAudio. + + Copyright 2004-2006 Lennart Poettering + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "module-match-symdef.h" + +PA_MODULE_AUTHOR("Lennart Poettering"); +PA_MODULE_DESCRIPTION("Playback stream expression matching module"); +PA_MODULE_VERSION(PACKAGE_VERSION); +PA_MODULE_LOAD_ONCE(TRUE); +PA_MODULE_USAGE("table= " + "key="); + +#define WHITESPACE "\n\r \t" + +#define DEFAULT_MATCH_TABLE_FILE PA_DEFAULT_CONFIG_DIR"/match.table" +#define DEFAULT_MATCH_TABLE_FILE_USER "match.table" + +static const char* const valid_modargs[] = { + "table", + "key", + NULL, +}; + +struct rule { + regex_t regex; + pa_volume_t volume; + pa_proplist *proplist; + struct rule *next; +}; + +struct userdata { + struct rule *rules; + char *property_key; + pa_subscription *subscription; +}; + +static int load_rules(struct userdata *u, const char *filename) { + FILE *f; + int n = 0; + int ret = -1; + struct rule *end = NULL; + char *fn = NULL; + + pa_assert(u); + + if (filename) + f = fopen(fn = pa_xstrdup(filename), "r"); + else + f = pa_open_config_file(DEFAULT_MATCH_TABLE_FILE, DEFAULT_MATCH_TABLE_FILE_USER, NULL, &fn); + + if (!f) { + pa_xfree(fn); + pa_log("Failed to open file config file: %s", pa_cstrerror(errno)); + goto finish; + } + + pa_lock_fd(fileno(f), 1); + + while (!feof(f)) { + char *d, *v; + pa_volume_t volume = PA_VOLUME_NORM; + uint32_t k; + regex_t regex; + char ln[256]; + struct rule *rule; + pa_proplist *proplist = NULL; + + if (!fgets(ln, sizeof(ln), f)) + break; + + n++; + + pa_strip_nl(ln); + + if (ln[0] == '#' || !*ln ) + continue; + + d = ln+strcspn(ln, WHITESPACE); + v = d+strspn(d, WHITESPACE); + + + if (!*v) { + pa_log(__FILE__ ": [%s:%u] failed to parse line - too few words", filename, n); + goto finish; + } + + *d = 0; + if (pa_atou(v, &k) >= 0) { + volume = (pa_volume_t) k; + } else if (*v == '"') { + char *e; + + e = strchr(v+1, '"'); + if (!e) { + pa_log(__FILE__ ": [%s:%u] failed to parse line - missing role closing quote", filename, n); + goto finish; + } + + *e = '\0'; + e = pa_sprintf_malloc("media.role=\"%s\"", v+1); + proplist = pa_proplist_from_string(e); + pa_xfree(e); + } else { + char *e; + + e = v+strspn(v, WHITESPACE); + if (!*e) { + pa_log(__FILE__ ": [%s:%u] failed to parse line - missing end of property list", filename, n); + goto finish; + } + *e = '\0'; + proplist = pa_proplist_from_string(v); + } + + if (regcomp(®ex, ln, REG_EXTENDED|REG_NOSUB) != 0) { + pa_log("[%s:%u] invalid regular expression", filename, n); + goto finish; + } + + rule = pa_xnew(struct rule, 1); + rule->regex = regex; + rule->proplist = proplist; + rule->volume = volume; + rule->next = NULL; + + if (end) + end->next = rule; + else + u->rules = rule; + end = rule; + + *d = 0; + } + + ret = 0; + +finish: + if (f) { + pa_lock_fd(fileno(f), 0); + fclose(f); + } + + if (fn) + pa_xfree(fn); + + return ret; +} + +static void callback(pa_core *c, pa_subscription_event_type_t t, uint32_t idx, void *userdata) { + struct userdata *u = userdata; + pa_sink_input *si; + struct rule *r; + const char *n; + + pa_assert(c); + pa_assert(u); + + if (t != (PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_NEW)) + return; + + if (!(si = pa_idxset_get_by_index(c->sink_inputs, idx))) + return; + + if (!(n = pa_proplist_gets(si->proplist, u->property_key))) + return; + + pa_log_debug("Matching with %s", n); + + for (r = u->rules; r; r = r->next) { + if (!regexec(&r->regex, n, 0, NULL, 0)) { + if (r->proplist) { + pa_log_debug("updating proplist of sink input '%s'", n); + pa_proplist_update(si->proplist, PA_UPDATE_MERGE, r->proplist); + } else { + pa_cvolume cv; + pa_log_debug("changing volume of sink input '%s' to 0x%03x", n, r->volume); + pa_cvolume_set(&cv, si->sample_spec.channels, r->volume); + pa_sink_input_set_volume(si, &cv, TRUE, FALSE); + } + } + } +} + +int pa__init(pa_module*m) { + pa_modargs *ma = NULL; + struct userdata *u; + + pa_assert(m); + + if (!(ma = pa_modargs_new(m->argument, valid_modargs))) { + pa_log("Failed to parse module arguments"); + goto fail; + } + + u = pa_xnew(struct userdata, 1); + u->rules = NULL; + u->subscription = NULL; + m->userdata = u; + + u->property_key = pa_xstrdup(pa_modargs_get_value(ma, "key", PA_PROP_MEDIA_NAME)); + + if (load_rules(u, pa_modargs_get_value(ma, "table", NULL)) < 0) + goto fail; + + /* FIXME: Doing this asynchronously is just broken. This needs to + * use a hook! */ + + u->subscription = pa_subscription_new(m->core, PA_SUBSCRIPTION_MASK_SINK_INPUT, callback, u); + + pa_modargs_free(ma); + return 0; + +fail: + pa__done(m); + + if (ma) + pa_modargs_free(ma); + return -1; +} + +void pa__done(pa_module*m) { + struct userdata* u; + struct rule *r, *n; + + pa_assert(m); + + if (!(u = m->userdata)) + return; + + if (u->subscription) + pa_subscription_free(u->subscription); + + if (u->property_key) + pa_xfree(u->property_key); + + for (r = u->rules; r; r = n) { + n = r->next; + + regfree(&r->regex); + if (r->proplist) + pa_proplist_free(r->proplist); + pa_xfree(r); + } + + pa_xfree(u); +} diff --git a/src/modules/module-mmkbd-evdev-symdef.h b/src/modules/module-mmkbd-evdev-symdef.h new file mode 100644 index 0000000..094c51f --- /dev/null +++ b/src/modules/module-mmkbd-evdev-symdef.h @@ -0,0 +1,29 @@ +#ifndef foomodulemmkbdevdevsymdeffoo +#define foomodulemmkbdevdevsymdeffoo + +#include +#include +#include + +#define pa__init module_mmkbd_evdev_LTX_pa__init +#define pa__done module_mmkbd_evdev_LTX_pa__done +#define pa__get_author module_mmkbd_evdev_LTX_pa__get_author +#define pa__get_description module_mmkbd_evdev_LTX_pa__get_description +#define pa__get_usage module_mmkbd_evdev_LTX_pa__get_usage +#define pa__get_version module_mmkbd_evdev_LTX_pa__get_version +#define pa__get_deprecated module_mmkbd_evdev_LTX_pa__get_deprecated +#define pa__load_once module_mmkbd_evdev_LTX_pa__load_once +#define pa__get_n_used module_mmkbd_evdev_LTX_pa__get_n_used + +int pa__init(pa_module*m); +void pa__done(pa_module*m); +int pa__get_n_used(pa_module*m); + +const char* pa__get_author(void); +const char* pa__get_description(void); +const char* pa__get_usage(void); +const char* pa__get_version(void); +const char* pa__get_deprecated(void); +pa_bool_t pa__load_once(void); + +#endif diff --git a/src/modules/module-mmkbd-evdev.c b/src/modules/module-mmkbd-evdev.c new file mode 100644 index 0000000..516bf41 --- /dev/null +++ b/src/modules/module-mmkbd-evdev.c @@ -0,0 +1,248 @@ +/*** + This file is part of PulseAudio. + + Copyright 2005-2006 Lennart Poettering + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include +#include +#include + +#include + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "module-mmkbd-evdev-symdef.h" + +PA_MODULE_AUTHOR("Lennart Poettering"); +PA_MODULE_DESCRIPTION("Multimedia keyboard support via Linux evdev"); +PA_MODULE_VERSION(PACKAGE_VERSION); +PA_MODULE_LOAD_ONCE(FALSE); +PA_MODULE_USAGE("device= sink="); + +#define DEFAULT_DEVICE "/dev/input/event0" + +static const char* const valid_modargs[] = { + "device", + "sink", + NULL, +}; + +struct userdata { + int fd, fd_type; + pa_io_event *io; + char *sink_name; + pa_module *module; +}; + +#define DELTA (PA_VOLUME_NORM/20) + +static void io_callback(pa_mainloop_api *io, pa_io_event *e, int fd, pa_io_event_flags_t events, void*userdata) { + struct userdata *u = userdata; + + pa_assert(io); + pa_assert(u); + + if (events & (PA_IO_EVENT_HANGUP|PA_IO_EVENT_ERROR)) { + pa_log("Lost connection to evdev device."); + goto fail; + } + + if (events & PA_IO_EVENT_INPUT) { + struct input_event ev; + + if (pa_loop_read(u->fd, &ev, sizeof(ev), &u->fd_type) <= 0) { + pa_log("Failed to read from event device: %s", pa_cstrerror(errno)); + goto fail; + } + + if (ev.type == EV_KEY && (ev.value == 1 || ev.value == 2)) { + enum { + INVALID, + UP, + DOWN, + MUTE_TOGGLE + } volchange = INVALID; + + pa_log_debug("Key code=%u, value=%u", ev.code, ev.value); + + switch (ev.code) { + case KEY_VOLUMEDOWN: + volchange = DOWN; + break; + + case KEY_VOLUMEUP: + volchange = UP; + break; + + case KEY_MUTE: + volchange = MUTE_TOGGLE; + break; + } + + if (volchange != INVALID) { + pa_sink *s; + + if (!(s = pa_namereg_get(u->module->core, u->sink_name, PA_NAMEREG_SINK))) + pa_log("Failed to get sink '%s'", u->sink_name); + else { + pa_cvolume cv = *pa_sink_get_volume(s, FALSE); + + switch (volchange) { + case UP: + pa_cvolume_inc(&cv, DELTA); + pa_sink_set_volume(s, &cv, TRUE, TRUE); + break; + + case DOWN: + pa_cvolume_dec(&cv, DELTA); + pa_sink_set_volume(s, &cv, TRUE, TRUE); + break; + + case MUTE_TOGGLE: + pa_sink_set_mute(s, !pa_sink_get_mute(s, FALSE), TRUE); + break; + + case INVALID: + pa_assert_not_reached(); + } + } + } + } + } + + return; + +fail: + u->module->core->mainloop->io_free(u->io); + u->io = NULL; + + pa_module_unload_request(u->module, TRUE); +} + +#define test_bit(bit, array) (array[bit/8] & (1<<(bit%8))) + +int pa__init(pa_module*m) { + + pa_modargs *ma = NULL; + struct userdata *u; + int version; + struct input_id input_id; + char name[256]; + uint8_t evtype_bitmask[EV_MAX/8 + 1]; + + pa_assert(m); + + if (!(ma = pa_modargs_new(m->argument, valid_modargs))) { + pa_log("Failed to parse module arguments"); + goto fail; + } + + m->userdata = u = pa_xnew(struct userdata, 1); + u->module = m; + u->io = NULL; + u->sink_name = pa_xstrdup(pa_modargs_get_value(ma, "sink", NULL)); + u->fd = -1; + u->fd_type = 0; + + if ((u->fd = open(pa_modargs_get_value(ma, "device", DEFAULT_DEVICE), O_RDONLY|O_NOCTTY)) < 0) { + pa_log("Failed to open evdev device: %s", pa_cstrerror(errno)); + goto fail; + } + + if (ioctl(u->fd, EVIOCGVERSION, &version) < 0) { + pa_log("EVIOCGVERSION failed: %s", pa_cstrerror(errno)); + goto fail; + } + + pa_log_info("evdev driver version %i.%i.%i", version >> 16, (version >> 8) & 0xff, version & 0xff); + + if(ioctl(u->fd, EVIOCGID, &input_id)) { + pa_log("EVIOCGID failed: %s", pa_cstrerror(errno)); + goto fail; + } + + pa_log_info("evdev vendor 0x%04hx product 0x%04hx version 0x%04hx bustype %u", + input_id.vendor, input_id.product, input_id.version, input_id.bustype); + + memset(name, 0, sizeof(name)); + if (ioctl(u->fd, EVIOCGNAME(sizeof(name)), name) < 0) { + pa_log("EVIOCGNAME failed: %s", pa_cstrerror(errno)); + goto fail; + } + + pa_log_info("evdev device name: %s", name); + + memset(evtype_bitmask, 0, sizeof(evtype_bitmask)); + if (ioctl(u->fd, EVIOCGBIT(0, EV_MAX), evtype_bitmask) < 0) { + pa_log("EVIOCGBIT failed: %s", pa_cstrerror(errno)); + goto fail; + } + + if (!test_bit(EV_KEY, evtype_bitmask)) { + pa_log("Device has no keys."); + goto fail; + } + + u->io = m->core->mainloop->io_new(m->core->mainloop, u->fd, PA_IO_EVENT_INPUT|PA_IO_EVENT_HANGUP, io_callback, u); + + pa_modargs_free(ma); + + return 0; + +fail: + + if (ma) + pa_modargs_free(ma); + + pa__done(m); + return -1; +} + +void pa__done(pa_module*m) { + struct userdata *u; + + pa_assert(m); + + if (!(u = m->userdata)) + return; + + if (u->io) + m->core->mainloop->io_free(u->io); + + if (u->fd >= 0) + pa_assert_se(pa_close(u->fd) == 0); + + pa_xfree(u->sink_name); + pa_xfree(u); +} diff --git a/src/modules/module-native-protocol-fd-symdef.h b/src/modules/module-native-protocol-fd-symdef.h new file mode 100644 index 0000000..c607c3f --- /dev/null +++ b/src/modules/module-native-protocol-fd-symdef.h @@ -0,0 +1,29 @@ +#ifndef foomodulenativeprotocolfdsymdeffoo +#define foomodulenativeprotocolfdsymdeffoo + +#include +#include +#include + +#define pa__init module_native_protocol_fd_LTX_pa__init +#define pa__done module_native_protocol_fd_LTX_pa__done +#define pa__get_author module_native_protocol_fd_LTX_pa__get_author +#define pa__get_description module_native_protocol_fd_LTX_pa__get_description +#define pa__get_usage module_native_protocol_fd_LTX_pa__get_usage +#define pa__get_version module_native_protocol_fd_LTX_pa__get_version +#define pa__get_deprecated module_native_protocol_fd_LTX_pa__get_deprecated +#define pa__load_once module_native_protocol_fd_LTX_pa__load_once +#define pa__get_n_used module_native_protocol_fd_LTX_pa__get_n_used + +int pa__init(pa_module*m); +void pa__done(pa_module*m); +int pa__get_n_used(pa_module*m); + +const char* pa__get_author(void); +const char* pa__get_description(void); +const char* pa__get_usage(void); +const char* pa__get_version(void); +const char* pa__get_deprecated(void); +pa_bool_t pa__load_once(void); + +#endif diff --git a/src/modules/module-native-protocol-fd.c b/src/modules/module-native-protocol-fd.c new file mode 100644 index 0000000..eed0505 --- /dev/null +++ b/src/modules/module-native-protocol-fd.c @@ -0,0 +1,96 @@ +/*** + This file is part of PulseAudio. + + Copyright 2004-2006 Lennart Poettering + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include + +#include +#include +#include +#include +#include +#include + +#include "module-native-protocol-fd-symdef.h" + +PA_MODULE_AUTHOR("Lennart Poettering"); +PA_MODULE_DESCRIPTION("Native protocol autospawn helper"); +PA_MODULE_VERSION(PACKAGE_VERSION); +PA_MODULE_LOAD_ONCE(TRUE); + +static const char* const valid_modargs[] = { + "fd", + NULL, +}; + +int pa__init(pa_module*m) { + pa_iochannel *io; + pa_modargs *ma; + int32_t fd; + int r = -1; + pa_native_options *options = NULL; + + pa_assert(m); + + if (!(ma = pa_modargs_new(m->argument, valid_modargs))) { + pa_log("Failed to parse module arguments."); + goto finish; + } + + if (pa_modargs_get_value_s32(ma, "fd", &fd) < 0) { + pa_log("Invalid file descriptor."); + goto finish; + } + + m->userdata = pa_native_protocol_get(m->core); + + io = pa_iochannel_new(m->core->mainloop, fd, fd); + + options = pa_native_options_new(); + options->module = m; + options->auth_anonymous = TRUE; + + pa_native_protocol_connect(m->userdata, io, options); + + r = 0; + +finish: + if (ma) + pa_modargs_free(ma); + + if (options) + pa_native_options_unref(options); + + return r; +} + +void pa__done(pa_module*m) { + pa_assert(m); + + if (m->userdata) { + pa_native_protocol_disconnect(m->userdata, m); + pa_native_protocol_unref(m->userdata); + } +} diff --git a/src/modules/module-native-protocol-tcp-symdef.h b/src/modules/module-native-protocol-tcp-symdef.h new file mode 100644 index 0000000..6a3a668 --- /dev/null +++ b/src/modules/module-native-protocol-tcp-symdef.h @@ -0,0 +1,29 @@ +#ifndef foomodulenativeprotocoltcpsymdeffoo +#define foomodulenativeprotocoltcpsymdeffoo + +#include +#include +#include + +#define pa__init module_native_protocol_tcp_LTX_pa__init +#define pa__done module_native_protocol_tcp_LTX_pa__done +#define pa__get_author module_native_protocol_tcp_LTX_pa__get_author +#define pa__get_description module_native_protocol_tcp_LTX_pa__get_description +#define pa__get_usage module_native_protocol_tcp_LTX_pa__get_usage +#define pa__get_version module_native_protocol_tcp_LTX_pa__get_version +#define pa__get_deprecated module_native_protocol_tcp_LTX_pa__get_deprecated +#define pa__load_once module_native_protocol_tcp_LTX_pa__load_once +#define pa__get_n_used module_native_protocol_tcp_LTX_pa__get_n_used + +int pa__init(pa_module*m); +void pa__done(pa_module*m); +int pa__get_n_used(pa_module*m); + +const char* pa__get_author(void); +const char* pa__get_description(void); +const char* pa__get_usage(void); +const char* pa__get_version(void); +const char* pa__get_deprecated(void); +pa_bool_t pa__load_once(void); + +#endif diff --git a/src/modules/module-native-protocol-unix-symdef.h b/src/modules/module-native-protocol-unix-symdef.h new file mode 100644 index 0000000..5e237e1 --- /dev/null +++ b/src/modules/module-native-protocol-unix-symdef.h @@ -0,0 +1,29 @@ +#ifndef foomodulenativeprotocolunixsymdeffoo +#define foomodulenativeprotocolunixsymdeffoo + +#include +#include +#include + +#define pa__init module_native_protocol_unix_LTX_pa__init +#define pa__done module_native_protocol_unix_LTX_pa__done +#define pa__get_author module_native_protocol_unix_LTX_pa__get_author +#define pa__get_description module_native_protocol_unix_LTX_pa__get_description +#define pa__get_usage module_native_protocol_unix_LTX_pa__get_usage +#define pa__get_version module_native_protocol_unix_LTX_pa__get_version +#define pa__get_deprecated module_native_protocol_unix_LTX_pa__get_deprecated +#define pa__load_once module_native_protocol_unix_LTX_pa__load_once +#define pa__get_n_used module_native_protocol_unix_LTX_pa__get_n_used + +int pa__init(pa_module*m); +void pa__done(pa_module*m); +int pa__get_n_used(pa_module*m); + +const char* pa__get_author(void); +const char* pa__get_description(void); +const char* pa__get_usage(void); +const char* pa__get_version(void); +const char* pa__get_deprecated(void); +pa_bool_t pa__load_once(void); + +#endif diff --git a/src/modules/module-null-sink-symdef.h b/src/modules/module-null-sink-symdef.h new file mode 100644 index 0000000..0a52794 --- /dev/null +++ b/src/modules/module-null-sink-symdef.h @@ -0,0 +1,29 @@ +#ifndef foomodulenullsinksymdeffoo +#define foomodulenullsinksymdeffoo + +#include +#include +#include + +#define pa__init module_null_sink_LTX_pa__init +#define pa__done module_null_sink_LTX_pa__done +#define pa__get_author module_null_sink_LTX_pa__get_author +#define pa__get_description module_null_sink_LTX_pa__get_description +#define pa__get_usage module_null_sink_LTX_pa__get_usage +#define pa__get_version module_null_sink_LTX_pa__get_version +#define pa__get_deprecated module_null_sink_LTX_pa__get_deprecated +#define pa__load_once module_null_sink_LTX_pa__load_once +#define pa__get_n_used module_null_sink_LTX_pa__get_n_used + +int pa__init(pa_module*m); +void pa__done(pa_module*m); +int pa__get_n_used(pa_module*m); + +const char* pa__get_author(void); +const char* pa__get_description(void); +const char* pa__get_usage(void); +const char* pa__get_version(void); +const char* pa__get_deprecated(void); +pa_bool_t pa__load_once(void); + +#endif diff --git a/src/modules/module-null-sink.c b/src/modules/module-null-sink.c new file mode 100644 index 0000000..74a2ebb --- /dev/null +++ b/src/modules/module-null-sink.c @@ -0,0 +1,374 @@ +/*** + This file is part of PulseAudio. + + Copyright 2004-2008 Lennart Poettering + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "module-null-sink-symdef.h" + +PA_MODULE_AUTHOR("Lennart Poettering"); +PA_MODULE_DESCRIPTION(_("Clocked NULL sink")); +PA_MODULE_VERSION(PACKAGE_VERSION); +PA_MODULE_LOAD_ONCE(FALSE); +PA_MODULE_USAGE( + "sink_name= " + "sink_properties= " + "format= " + "rate= " + "channels= " + "channel_map="); + +#define DEFAULT_SINK_NAME "null" +#define BLOCK_USEC (PA_USEC_PER_SEC * 2) + +struct userdata { + pa_core *core; + pa_module *module; + pa_sink *sink; + + pa_thread *thread; + pa_thread_mq thread_mq; + pa_rtpoll *rtpoll; + + pa_usec_t block_usec; + pa_usec_t timestamp; +}; + +static const char* const valid_modargs[] = { + "sink_name", + "sink_properties", + "format", + "rate", + "channels", + "channel_map", + "description", /* supported for compatibility reasons, made redundant by sink_properties= */ + NULL +}; + +static int sink_process_msg( + pa_msgobject *o, + int code, + void *data, + int64_t offset, + pa_memchunk *chunk) { + + struct userdata *u = PA_SINK(o)->userdata; + + switch (code) { + case PA_SINK_MESSAGE_SET_STATE: + + if (PA_PTR_TO_UINT(data) == PA_SINK_RUNNING) + u->timestamp = pa_rtclock_now(); + + break; + + case PA_SINK_MESSAGE_GET_LATENCY: { + pa_usec_t now; + + now = pa_rtclock_now(); + *((pa_usec_t*) data) = u->timestamp > now ? u->timestamp - now : 0ULL; + + return 0; + } + } + + return pa_sink_process_msg(o, code, data, offset, chunk); +} + +static void sink_update_requested_latency_cb(pa_sink *s) { + struct userdata *u; + size_t nbytes; + + pa_sink_assert_ref(s); + pa_assert_se(u = s->userdata); + + u->block_usec = pa_sink_get_requested_latency_within_thread(s); + + if (u->block_usec == (pa_usec_t) -1) + u->block_usec = s->thread_info.max_latency; + + nbytes = pa_usec_to_bytes(u->block_usec, &s->sample_spec); + pa_sink_set_max_rewind_within_thread(s, nbytes); + pa_sink_set_max_request_within_thread(s, nbytes); +} + +static void process_rewind(struct userdata *u, pa_usec_t now) { + size_t rewind_nbytes, in_buffer; + pa_usec_t delay; + + pa_assert(u); + + /* Figure out how much we shall rewind and reset the counter */ + rewind_nbytes = u->sink->thread_info.rewind_nbytes; + u->sink->thread_info.rewind_nbytes = 0; + + pa_assert(rewind_nbytes > 0); + pa_log_debug("Requested to rewind %lu bytes.", (unsigned long) rewind_nbytes); + + if (u->timestamp <= now) + goto do_nothing; + + delay = u->timestamp - now; + in_buffer = pa_usec_to_bytes(delay, &u->sink->sample_spec); + + if (in_buffer <= 0) + goto do_nothing; + + if (rewind_nbytes > in_buffer) + rewind_nbytes = in_buffer; + + pa_sink_process_rewind(u->sink, rewind_nbytes); + u->timestamp -= pa_bytes_to_usec(rewind_nbytes, &u->sink->sample_spec); + + pa_log_debug("Rewound %lu bytes.", (unsigned long) rewind_nbytes); + return; + +do_nothing: + + pa_sink_process_rewind(u->sink, 0); +} + +static void process_render(struct userdata *u, pa_usec_t now) { + size_t ate = 0; + + pa_assert(u); + + /* This is the configured latency. Sink inputs connected to us + might not have a single frame more than the maxrequest value + queed. Hence: at maximum read this many bytes from the sink + inputs. */ + + /* Fill the buffer up the the latency size */ + while (u->timestamp < now + u->block_usec) { + pa_memchunk chunk; + + pa_sink_render(u->sink, u->sink->thread_info.max_request, &chunk); + pa_memblock_unref(chunk.memblock); + +/* pa_log_debug("Ate %lu bytes.", (unsigned long) chunk.length); */ + u->timestamp += pa_bytes_to_usec(chunk.length, &u->sink->sample_spec); + + ate += chunk.length; + + if (ate >= u->sink->thread_info.max_request) + break; + } + +/* pa_log_debug("Ate in sum %lu bytes (of %lu)", (unsigned long) ate, (unsigned long) nbytes); */ +} + +static void thread_func(void *userdata) { + struct userdata *u = userdata; + + pa_assert(u); + + pa_log_debug("Thread starting up"); + + pa_thread_mq_install(&u->thread_mq); + + u->timestamp = pa_rtclock_now(); + + for (;;) { + int ret; + + /* Render some data and drop it immediately */ + if (PA_SINK_IS_OPENED(u->sink->thread_info.state)) { + pa_usec_t now; + + now = pa_rtclock_now(); + + if (u->sink->thread_info.rewind_requested) { + if (u->sink->thread_info.rewind_nbytes > 0) + process_rewind(u, now); + else + pa_sink_process_rewind(u->sink, 0); + } + + if (u->timestamp <= now) + process_render(u, now); + + pa_rtpoll_set_timer_absolute(u->rtpoll, u->timestamp); + } else + pa_rtpoll_set_timer_disabled(u->rtpoll); + + /* Hmm, nothing to do. Let's sleep */ + if ((ret = pa_rtpoll_run(u->rtpoll, TRUE)) < 0) + goto fail; + + if (ret == 0) + goto finish; + } + +fail: + /* If this was no regular exit from the loop we have to continue + * processing messages until we received PA_MESSAGE_SHUTDOWN */ + pa_asyncmsgq_post(u->thread_mq.outq, PA_MSGOBJECT(u->core), PA_CORE_MESSAGE_UNLOAD_MODULE, u->module, 0, NULL, NULL); + pa_asyncmsgq_wait_for(u->thread_mq.inq, PA_MESSAGE_SHUTDOWN); + +finish: + pa_log_debug("Thread shutting down"); +} + +int pa__init(pa_module*m) { + struct userdata *u = NULL; + pa_sample_spec ss; + pa_channel_map map; + pa_modargs *ma = NULL; + pa_sink_new_data data; + size_t nbytes; + + pa_assert(m); + + if (!(ma = pa_modargs_new(m->argument, valid_modargs))) { + pa_log("Failed to parse module arguments."); + goto fail; + } + + ss = m->core->default_sample_spec; + map = m->core->default_channel_map; + if (pa_modargs_get_sample_spec_and_channel_map(ma, &ss, &map, PA_CHANNEL_MAP_DEFAULT) < 0) { + pa_log("Invalid sample format specification or channel map"); + goto fail; + } + + m->userdata = u = pa_xnew0(struct userdata, 1); + u->core = m->core; + u->module = m; + u->rtpoll = pa_rtpoll_new(); + pa_thread_mq_init(&u->thread_mq, m->core->mainloop, u->rtpoll); + + pa_sink_new_data_init(&data); + data.driver = __FILE__; + data.module = m; + pa_sink_new_data_set_name(&data, pa_modargs_get_value(ma, "sink_name", DEFAULT_SINK_NAME)); + pa_sink_new_data_set_sample_spec(&data, &ss); + pa_sink_new_data_set_channel_map(&data, &map); + pa_proplist_sets(data.proplist, PA_PROP_DEVICE_DESCRIPTION, pa_modargs_get_value(ma, "description", _("Null Output"))); + pa_proplist_sets(data.proplist, PA_PROP_DEVICE_CLASS, "abstract"); + + if (pa_modargs_get_proplist(ma, "sink_properties", data.proplist, PA_UPDATE_REPLACE) < 0) { + pa_log("Invalid properties"); + pa_sink_new_data_done(&data); + goto fail; + } + + u->sink = pa_sink_new(m->core, &data, PA_SINK_LATENCY|PA_SINK_DYNAMIC_LATENCY); + pa_sink_new_data_done(&data); + + if (!u->sink) { + pa_log("Failed to create sink object."); + goto fail; + } + + u->sink->parent.process_msg = sink_process_msg; + u->sink->update_requested_latency = sink_update_requested_latency_cb; + u->sink->userdata = u; + + pa_sink_set_asyncmsgq(u->sink, u->thread_mq.inq); + pa_sink_set_rtpoll(u->sink, u->rtpoll); + + u->block_usec = BLOCK_USEC; + nbytes = pa_usec_to_bytes(u->block_usec, &u->sink->sample_spec); + pa_sink_set_max_rewind(u->sink, nbytes); + pa_sink_set_max_request(u->sink, nbytes); + + if (!(u->thread = pa_thread_new(thread_func, u))) { + pa_log("Failed to create thread."); + goto fail; + } + + pa_sink_put(u->sink); + + pa_modargs_free(ma); + + return 0; + +fail: + if (ma) + pa_modargs_free(ma); + + pa__done(m); + + return -1; +} + +int pa__get_n_used(pa_module *m) { + struct userdata *u; + + pa_assert(m); + pa_assert_se(u = m->userdata); + + return pa_sink_linked_by(u->sink); +} + +void pa__done(pa_module*m) { + struct userdata *u; + + pa_assert(m); + + if (!(u = m->userdata)) + return; + + if (u->sink) + pa_sink_unlink(u->sink); + + if (u->thread) { + pa_asyncmsgq_send(u->thread_mq.inq, NULL, PA_MESSAGE_SHUTDOWN, NULL, 0, NULL); + pa_thread_free(u->thread); + } + + pa_thread_mq_done(&u->thread_mq); + + if (u->sink) + pa_sink_unref(u->sink); + + if (u->rtpoll) + pa_rtpoll_free(u->rtpoll); + + pa_xfree(u); +} diff --git a/src/modules/module-pipe-sink-symdef.h b/src/modules/module-pipe-sink-symdef.h new file mode 100644 index 0000000..76d2617 --- /dev/null +++ b/src/modules/module-pipe-sink-symdef.h @@ -0,0 +1,29 @@ +#ifndef foomodulepipesinksymdeffoo +#define foomodulepipesinksymdeffoo + +#include +#include +#include + +#define pa__init module_pipe_sink_LTX_pa__init +#define pa__done module_pipe_sink_LTX_pa__done +#define pa__get_author module_pipe_sink_LTX_pa__get_author +#define pa__get_description module_pipe_sink_LTX_pa__get_description +#define pa__get_usage module_pipe_sink_LTX_pa__get_usage +#define pa__get_version module_pipe_sink_LTX_pa__get_version +#define pa__get_deprecated module_pipe_sink_LTX_pa__get_deprecated +#define pa__load_once module_pipe_sink_LTX_pa__load_once +#define pa__get_n_used module_pipe_sink_LTX_pa__get_n_used + +int pa__init(pa_module*m); +void pa__done(pa_module*m); +int pa__get_n_used(pa_module*m); + +const char* pa__get_author(void); +const char* pa__get_description(void); +const char* pa__get_usage(void); +const char* pa__get_version(void); +const char* pa__get_deprecated(void); +pa_bool_t pa__load_once(void); + +#endif diff --git a/src/modules/module-pipe-sink.c b/src/modules/module-pipe-sink.c new file mode 100644 index 0000000..9c16932 --- /dev/null +++ b/src/modules/module-pipe-sink.c @@ -0,0 +1,378 @@ +/*** + This file is part of PulseAudio. + + Copyright 2004-2006 Lennart Poettering + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "module-pipe-sink-symdef.h" + +PA_MODULE_AUTHOR("Lennart Poettering"); +PA_MODULE_DESCRIPTION("UNIX pipe sink"); +PA_MODULE_VERSION(PACKAGE_VERSION); +PA_MODULE_LOAD_ONCE(FALSE); +PA_MODULE_USAGE( + "sink_name= " + "sink_properties= " + "file= " + "format= " + "rate=" + "channels= " + "channel_map="); + +#define DEFAULT_FILE_NAME "fifo_output" +#define DEFAULT_SINK_NAME "fifo_output" + +struct userdata { + pa_core *core; + pa_module *module; + pa_sink *sink; + + pa_thread *thread; + pa_thread_mq thread_mq; + pa_rtpoll *rtpoll; + + char *filename; + int fd; + + pa_memchunk memchunk; + + pa_rtpoll_item *rtpoll_item; + + int write_type; +}; + +static const char* const valid_modargs[] = { + "sink_name", + "sink_properties", + "file", + "format", + "rate", + "channels", + "channel_map", + NULL +}; + +static int sink_process_msg(pa_msgobject *o, int code, void *data, int64_t offset, pa_memchunk *chunk) { + struct userdata *u = PA_SINK(o)->userdata; + + switch (code) { + + case PA_SINK_MESSAGE_GET_LATENCY: { + size_t n = 0; + int l; + +#ifdef FIONREAD + if (ioctl(u->fd, FIONREAD, &l) >= 0 && l > 0) + n = (size_t) l; +#endif + + n += u->memchunk.length; + + *((pa_usec_t*) data) = pa_bytes_to_usec(n, &u->sink->sample_spec); + return 0; + } + } + + return pa_sink_process_msg(o, code, data, offset, chunk); +} + +static int process_render(struct userdata *u) { + pa_assert(u); + + if (u->memchunk.length <= 0) + pa_sink_render(u->sink, pa_pipe_buf(u->fd), &u->memchunk); + + pa_assert(u->memchunk.length > 0); + + for (;;) { + ssize_t l; + void *p; + + p = pa_memblock_acquire(u->memchunk.memblock); + l = pa_write(u->fd, (uint8_t*) p + u->memchunk.index, u->memchunk.length, &u->write_type); + pa_memblock_release(u->memchunk.memblock); + + pa_assert(l != 0); + + if (l < 0) { + + if (errno == EINTR) + continue; + else if (errno == EAGAIN) + return 0; + else { + pa_log("Failed to write data to FIFO: %s", pa_cstrerror(errno)); + return -1; + } + + } else { + + u->memchunk.index += (size_t) l; + u->memchunk.length -= (size_t) l; + + if (u->memchunk.length <= 0) { + pa_memblock_unref(u->memchunk.memblock); + pa_memchunk_reset(&u->memchunk); + } + } + + return 0; + } +} + +static void thread_func(void *userdata) { + struct userdata *u = userdata; + + pa_assert(u); + + pa_log_debug("Thread starting up"); + + pa_thread_mq_install(&u->thread_mq); + + for (;;) { + struct pollfd *pollfd; + int ret; + + pollfd = pa_rtpoll_item_get_pollfd(u->rtpoll_item, NULL); + + /* Render some data and write it to the fifo */ + if (PA_SINK_IS_OPENED(u->sink->thread_info.state)) { + + if (u->sink->thread_info.rewind_requested) + pa_sink_process_rewind(u->sink, 0); + + if (pollfd->revents) { + if (process_render(u) < 0) + goto fail; + + pollfd->revents = 0; + } + } + + /* Hmm, nothing to do. Let's sleep */ + pollfd->events = (short) (u->sink->thread_info.state == PA_SINK_RUNNING ? POLLOUT : 0); + + if ((ret = pa_rtpoll_run(u->rtpoll, TRUE)) < 0) + goto fail; + + if (ret == 0) + goto finish; + + pollfd = pa_rtpoll_item_get_pollfd(u->rtpoll_item, NULL); + + if (pollfd->revents & ~POLLOUT) { + pa_log("FIFO shutdown."); + goto fail; + } + } + +fail: + /* If this was no regular exit from the loop we have to continue + * processing messages until we received PA_MESSAGE_SHUTDOWN */ + pa_asyncmsgq_post(u->thread_mq.outq, PA_MSGOBJECT(u->core), PA_CORE_MESSAGE_UNLOAD_MODULE, u->module, 0, NULL, NULL); + pa_asyncmsgq_wait_for(u->thread_mq.inq, PA_MESSAGE_SHUTDOWN); + +finish: + pa_log_debug("Thread shutting down"); +} + +int pa__init(pa_module*m) { + struct userdata *u; + struct stat st; + pa_sample_spec ss; + pa_channel_map map; + pa_modargs *ma; + struct pollfd *pollfd; + pa_sink_new_data data; + + pa_assert(m); + + if (!(ma = pa_modargs_new(m->argument, valid_modargs))) { + pa_log("Failed to parse module arguments."); + goto fail; + } + + ss = m->core->default_sample_spec; + map = m->core->default_channel_map; + if (pa_modargs_get_sample_spec_and_channel_map(ma, &ss, &map, PA_CHANNEL_MAP_DEFAULT) < 0) { + pa_log("Invalid sample format specification or channel map"); + goto fail; + } + + u = pa_xnew0(struct userdata, 1); + u->core = m->core; + u->module = m; + m->userdata = u; + pa_memchunk_reset(&u->memchunk); + u->rtpoll = pa_rtpoll_new(); + pa_thread_mq_init(&u->thread_mq, m->core->mainloop, u->rtpoll); + u->write_type = 0; + + u->filename = pa_runtime_path(pa_modargs_get_value(ma, "file", DEFAULT_FILE_NAME)); + + mkfifo(u->filename, 0666); + if ((u->fd = open(u->filename, O_RDWR|O_NOCTTY)) < 0) { + pa_log("open('%s'): %s", u->filename, pa_cstrerror(errno)); + goto fail; + } + + pa_make_fd_cloexec(u->fd); + pa_make_fd_nonblock(u->fd); + + if (fstat(u->fd, &st) < 0) { + pa_log("fstat('%s'): %s", u->filename, pa_cstrerror(errno)); + goto fail; + } + + if (!S_ISFIFO(st.st_mode)) { + pa_log("'%s' is not a FIFO.", u->filename); + goto fail; + } + + pa_sink_new_data_init(&data); + data.driver = __FILE__; + data.module = m; + pa_sink_new_data_set_name(&data, pa_modargs_get_value(ma, "sink_name", DEFAULT_SINK_NAME)); + pa_proplist_sets(data.proplist, PA_PROP_DEVICE_STRING, u->filename); + pa_proplist_setf(data.proplist, PA_PROP_DEVICE_DESCRIPTION, "Unix FIFO sink %s", u->filename); + pa_sink_new_data_set_sample_spec(&data, &ss); + pa_sink_new_data_set_channel_map(&data, &map); + + if (pa_modargs_get_proplist(ma, "sink_properties", data.proplist, PA_UPDATE_REPLACE) < 0) { + pa_log("Invalid properties"); + pa_sink_new_data_done(&data); + goto fail; + } + + u->sink = pa_sink_new(m->core, &data, PA_SINK_LATENCY); + pa_sink_new_data_done(&data); + + if (!u->sink) { + pa_log("Failed to create sink."); + goto fail; + } + + u->sink->parent.process_msg = sink_process_msg; + u->sink->userdata = u; + + pa_sink_set_asyncmsgq(u->sink, u->thread_mq.inq); + pa_sink_set_rtpoll(u->sink, u->rtpoll); + pa_sink_set_max_request(u->sink, pa_pipe_buf(u->fd)); + pa_sink_set_fixed_latency(u->sink, pa_bytes_to_usec(pa_pipe_buf(u->fd), &u->sink->sample_spec)); + + u->rtpoll_item = pa_rtpoll_item_new(u->rtpoll, PA_RTPOLL_NEVER, 1); + pollfd = pa_rtpoll_item_get_pollfd(u->rtpoll_item, NULL); + pollfd->fd = u->fd; + pollfd->events = pollfd->revents = 0; + + if (!(u->thread = pa_thread_new(thread_func, u))) { + pa_log("Failed to create thread."); + goto fail; + } + + pa_sink_put(u->sink); + + pa_modargs_free(ma); + + return 0; + +fail: + if (ma) + pa_modargs_free(ma); + + pa__done(m); + + return -1; +} + +int pa__get_n_used(pa_module *m) { + struct userdata *u; + + pa_assert(m); + pa_assert_se(u = m->userdata); + + return pa_sink_linked_by(u->sink); +} + +void pa__done(pa_module*m) { + struct userdata *u; + + pa_assert(m); + + if (!(u = m->userdata)) + return; + + if (u->sink) + pa_sink_unlink(u->sink); + + if (u->thread) { + pa_asyncmsgq_send(u->thread_mq.inq, NULL, PA_MESSAGE_SHUTDOWN, NULL, 0, NULL); + pa_thread_free(u->thread); + } + + pa_thread_mq_done(&u->thread_mq); + + if (u->sink) + pa_sink_unref(u->sink); + + if (u->memchunk.memblock) + pa_memblock_unref(u->memchunk.memblock); + + if (u->rtpoll_item) + pa_rtpoll_item_free(u->rtpoll_item); + + if (u->rtpoll) + pa_rtpoll_free(u->rtpoll); + + if (u->filename) { + unlink(u->filename); + pa_xfree(u->filename); + } + + if (u->fd >= 0) + pa_assert_se(pa_close(u->fd) == 0); + + pa_xfree(u); +} diff --git a/src/modules/module-pipe-source-symdef.h b/src/modules/module-pipe-source-symdef.h new file mode 100644 index 0000000..d2a9baf --- /dev/null +++ b/src/modules/module-pipe-source-symdef.h @@ -0,0 +1,29 @@ +#ifndef foomodulepipesourcesymdeffoo +#define foomodulepipesourcesymdeffoo + +#include +#include +#include + +#define pa__init module_pipe_source_LTX_pa__init +#define pa__done module_pipe_source_LTX_pa__done +#define pa__get_author module_pipe_source_LTX_pa__get_author +#define pa__get_description module_pipe_source_LTX_pa__get_description +#define pa__get_usage module_pipe_source_LTX_pa__get_usage +#define pa__get_version module_pipe_source_LTX_pa__get_version +#define pa__get_deprecated module_pipe_source_LTX_pa__get_deprecated +#define pa__load_once module_pipe_source_LTX_pa__load_once +#define pa__get_n_used module_pipe_source_LTX_pa__get_n_used + +int pa__init(pa_module*m); +void pa__done(pa_module*m); +int pa__get_n_used(pa_module*m); + +const char* pa__get_author(void); +const char* pa__get_description(void); +const char* pa__get_usage(void); +const char* pa__get_version(void); +const char* pa__get_deprecated(void); +pa_bool_t pa__load_once(void); + +#endif diff --git a/src/modules/module-pipe-source.c b/src/modules/module-pipe-source.c new file mode 100644 index 0000000..49104f8 --- /dev/null +++ b/src/modules/module-pipe-source.c @@ -0,0 +1,362 @@ +/*** + This file is part of PulseAudio. + + Copyright 2004-2006 Lennart Poettering + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "module-pipe-source-symdef.h" + +PA_MODULE_AUTHOR("Lennart Poettering"); +PA_MODULE_DESCRIPTION("UNIX pipe source"); +PA_MODULE_VERSION(PACKAGE_VERSION); +PA_MODULE_LOAD_ONCE(FALSE); +PA_MODULE_USAGE( + "source_name= " + "source_properties= " + "file= " + "format= " + "rate= " + "channels= " + "channel_map="); + +#define DEFAULT_FILE_NAME "/tmp/music.input" +#define DEFAULT_SOURCE_NAME "fifo_input" + +struct userdata { + pa_core *core; + pa_module *module; + pa_source *source; + + pa_thread *thread; + pa_thread_mq thread_mq; + pa_rtpoll *rtpoll; + + char *filename; + int fd; + + pa_memchunk memchunk; + + pa_rtpoll_item *rtpoll_item; +}; + +static const char* const valid_modargs[] = { + "source_name", + "source_properties", + "file", + "format", + "rate", + "channels", + "channel_map", + NULL +}; + +static int source_process_msg( + pa_msgobject *o, + int code, + void *data, + int64_t offset, + pa_memchunk *chunk) { + + struct userdata *u = PA_SOURCE(o)->userdata; + + switch (code) { + + case PA_SOURCE_MESSAGE_GET_LATENCY: { + size_t n = 0; + int l; + +#ifdef FIONREAD + if (ioctl(u->fd, FIONREAD, &l) >= 0 && l > 0) + n = (size_t) l; +#endif + + *((pa_usec_t*) data) = pa_bytes_to_usec(n, &u->source->sample_spec); + return 0; + } + } + + return pa_source_process_msg(o, code, data, offset, chunk); +} + +static void thread_func(void *userdata) { + struct userdata *u = userdata; + int read_type = 0; + + pa_assert(u); + + pa_log_debug("Thread starting up"); + + pa_thread_mq_install(&u->thread_mq); + + for (;;) { + int ret; + struct pollfd *pollfd; + + pollfd = pa_rtpoll_item_get_pollfd(u->rtpoll_item, NULL); + + /* Try to read some data and pass it on to the source driver */ + if (u->source->thread_info.state == PA_SOURCE_RUNNING && pollfd->revents) { + ssize_t l; + void *p; + + if (!u->memchunk.memblock) { + u->memchunk.memblock = pa_memblock_new(u->core->mempool, pa_pipe_buf(u->fd)); + u->memchunk.index = u->memchunk.length = 0; + } + + pa_assert(pa_memblock_get_length(u->memchunk.memblock) > u->memchunk.index); + + p = pa_memblock_acquire(u->memchunk.memblock); + l = pa_read(u->fd, (uint8_t*) p + u->memchunk.index, pa_memblock_get_length(u->memchunk.memblock) - u->memchunk.index, &read_type); + pa_memblock_release(u->memchunk.memblock); + + pa_assert(l != 0); /* EOF cannot happen, since we opened the fifo for both reading and writing */ + + if (l < 0) { + + if (errno == EINTR) + continue; + else if (errno != EAGAIN) { + pa_log("Faile to read data from FIFO: %s", pa_cstrerror(errno)); + goto fail; + } + + } else { + + u->memchunk.length = (size_t) l; + pa_source_post(u->source, &u->memchunk); + u->memchunk.index += (size_t) l; + + if (u->memchunk.index >= pa_memblock_get_length(u->memchunk.memblock)) { + pa_memblock_unref(u->memchunk.memblock); + pa_memchunk_reset(&u->memchunk); + } + + pollfd->revents = 0; + } + } + + /* Hmm, nothing to do. Let's sleep */ + pollfd->events = (short) (u->source->thread_info.state == PA_SOURCE_RUNNING ? POLLIN : 0); + + if ((ret = pa_rtpoll_run(u->rtpoll, TRUE)) < 0) + goto fail; + + if (ret == 0) + goto finish; + + pollfd = pa_rtpoll_item_get_pollfd(u->rtpoll_item, NULL); + + if (pollfd->revents & ~POLLIN) { + pa_log("FIFO shutdown."); + goto fail; + } + } + +fail: + /* If this was no regular exit from the loop we have to continue + * processing messages until we received PA_MESSAGE_SHUTDOWN */ + pa_asyncmsgq_post(u->thread_mq.outq, PA_MSGOBJECT(u->core), PA_CORE_MESSAGE_UNLOAD_MODULE, u->module, 0, NULL, NULL); + pa_asyncmsgq_wait_for(u->thread_mq.inq, PA_MESSAGE_SHUTDOWN); + +finish: + pa_log_debug("Thread shutting down"); +} + +int pa__init(pa_module*m) { + struct userdata *u; + struct stat st; + pa_sample_spec ss; + pa_channel_map map; + pa_modargs *ma; + struct pollfd *pollfd; + pa_source_new_data data; + + pa_assert(m); + + if (!(ma = pa_modargs_new(m->argument, valid_modargs))) { + pa_log("failed to parse module arguments."); + goto fail; + } + + ss = m->core->default_sample_spec; + map = m->core->default_channel_map; + if (pa_modargs_get_sample_spec_and_channel_map(ma, &ss, &map, PA_CHANNEL_MAP_DEFAULT) < 0) { + pa_log("invalid sample format specification or channel map"); + goto fail; + } + + m->userdata = u = pa_xnew0(struct userdata, 1); + u->core = m->core; + u->module = m; + pa_memchunk_reset(&u->memchunk); + u->rtpoll = pa_rtpoll_new(); + pa_thread_mq_init(&u->thread_mq, m->core->mainloop, u->rtpoll); + + u->filename = pa_runtime_path(pa_modargs_get_value(ma, "file", DEFAULT_FILE_NAME)); + + mkfifo(u->filename, 0666); + if ((u->fd = open(u->filename, O_RDWR|O_NOCTTY)) < 0) { + pa_log("open('%s'): %s", u->filename, pa_cstrerror(errno)); + goto fail; + } + + pa_make_fd_cloexec(u->fd); + pa_make_fd_nonblock(u->fd); + + if (fstat(u->fd, &st) < 0) { + pa_log("fstat('%s'): %s",u->filename, pa_cstrerror(errno)); + goto fail; + } + + if (!S_ISFIFO(st.st_mode)) { + pa_log("'%s' is not a FIFO.", u->filename); + goto fail; + } + + pa_source_new_data_init(&data); + data.driver = __FILE__; + data.module = m; + pa_source_new_data_set_name(&data, pa_modargs_get_value(ma, "source_name", DEFAULT_SOURCE_NAME)); + pa_proplist_sets(data.proplist, PA_PROP_DEVICE_STRING, u->filename); + pa_proplist_setf(data.proplist, PA_PROP_DEVICE_DESCRIPTION, "Unix FIFO source %s", u->filename); + pa_source_new_data_set_sample_spec(&data, &ss); + pa_source_new_data_set_channel_map(&data, &map); + + if (pa_modargs_get_proplist(ma, "source_properties", data.proplist, PA_UPDATE_REPLACE) < 0) { + pa_log("Invalid properties"); + pa_source_new_data_done(&data); + goto fail; + } + + u->source = pa_source_new(m->core, &data, PA_SOURCE_LATENCY); + pa_source_new_data_done(&data); + + if (!u->source) { + pa_log("Failed to create source."); + goto fail; + } + + u->source->parent.process_msg = source_process_msg; + u->source->userdata = u; + + pa_source_set_asyncmsgq(u->source, u->thread_mq.inq); + pa_source_set_rtpoll(u->source, u->rtpoll); + pa_source_set_fixed_latency(u->source, pa_bytes_to_usec(PIPE_BUF, &u->source->sample_spec)); + + u->rtpoll_item = pa_rtpoll_item_new(u->rtpoll, PA_RTPOLL_NEVER, 1); + pollfd = pa_rtpoll_item_get_pollfd(u->rtpoll_item, NULL); + pollfd->fd = u->fd; + pollfd->events = pollfd->revents = 0; + + if (!(u->thread = pa_thread_new(thread_func, u))) { + pa_log("Failed to create thread."); + goto fail; + } + + pa_source_put(u->source); + + pa_modargs_free(ma); + + return 0; + +fail: + if (ma) + pa_modargs_free(ma); + + pa__done(m); + + return -1; +} + +int pa__get_n_used(pa_module *m) { + struct userdata *u; + + pa_assert(m); + pa_assert_se(u = m->userdata); + + return pa_source_linked_by(u->source); +} + +void pa__done(pa_module*m) { + struct userdata *u; + + pa_assert(m); + + if (!(u = m->userdata)) + return; + + if (u->source) + pa_source_unlink(u->source); + + if (u->thread) { + pa_asyncmsgq_send(u->thread_mq.inq, NULL, PA_MESSAGE_SHUTDOWN, NULL, 0, NULL); + pa_thread_free(u->thread); + } + + pa_thread_mq_done(&u->thread_mq); + + if (u->source) + pa_source_unref(u->source); + + if (u->memchunk.memblock) + pa_memblock_unref(u->memchunk.memblock); + + if (u->rtpoll_item) + pa_rtpoll_item_free(u->rtpoll_item); + + if (u->rtpoll) + pa_rtpoll_free(u->rtpoll); + + if (u->filename) { + unlink(u->filename); + pa_xfree(u->filename); + } + + if (u->fd >= 0) + pa_assert_se(pa_close(u->fd) == 0); + + pa_xfree(u); +} diff --git a/src/modules/module-policy-symdef.h b/src/modules/module-policy-symdef.h new file mode 100644 index 0000000..3d7d1cc --- /dev/null +++ b/src/modules/module-policy-symdef.h @@ -0,0 +1,29 @@ +#ifndef foomodulepolicysymdeffoo +#define foomodulepolicysymdeffoo + +#include +#include +#include + +#define pa__init module_policy_LTX_pa__init +#define pa__done module_policy_LTX_pa__done +#define pa__get_author module_policy_LTX_pa__get_author +#define pa__get_description module_policy_LTX_pa__get_description +#define pa__get_usage module_policy_LTX_pa__get_usage +#define pa__get_version module_policy_LTX_pa__get_version +#define pa__get_deprecated module_policy_LTX_pa__get_deprecated +#define pa__load_once module_policy_LTX_pa__load_once +#define pa__get_n_used module_policy_LTX_pa__get_n_used + +int pa__init(pa_module*m); +void pa__done(pa_module*m); +int pa__get_n_used(pa_module*m); + +const char* pa__get_author(void); +const char* pa__get_description(void); +const char* pa__get_usage(void); +const char* pa__get_version(void); +const char* pa__get_deprecated(void); +pa_bool_t pa__load_once(void); + +#endif diff --git a/src/modules/module-policy.c b/src/modules/module-policy.c new file mode 100644 index 0000000..ecc786c --- /dev/null +++ b/src/modules/module-policy.c @@ -0,0 +1,709 @@ +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include // for mono + +#include "module-policy-symdef.h" + +PA_MODULE_AUTHOR("Seungbae Shin"); +PA_MODULE_DESCRIPTION("Media Policy module"); +PA_MODULE_VERSION(PACKAGE_VERSION); +PA_MODULE_LOAD_ONCE(TRUE); +PA_MODULE_USAGE( + "on_hotplug= "); + +static const char* const valid_modargs[] = { + "on_hotplug", + NULL +}; + +struct userdata { + pa_core *core; + pa_module *module; + + pa_hook_slot *sink_input_new_hook_slot,*sink_put_hook_slot; + + pa_hook_slot *sink_input_unlink_slot,*sink_unlink_slot; + pa_hook_slot *sink_input_unlink_post_slot, *sink_unlink_post_slot; + pa_hook_slot *sink_input_move_start_slot,*sink_input_move_finish_slot; + pa_subscription *subscription; + + pa_bool_t on_hotplug:1; + int bt_off_idx; + + int is_mono; + pa_module* module_mono_bt; + pa_module* module_combined; + pa_module* module_mono_combined; + pa_native_protocol *protocol; +}; + +enum { + SUBCOMMAND_TEST, + SUBCOMMAND_MONO, +}; + +/* DEFINEs */ +#define SINK_ALSA "alsa_output.0.analog-stereo" +#define SINK_MONO_ALSA "mono_alsa" +#define SINK_MONO_BT "mono_bt" +#define SINK_COMBINED "combined" +#define SINK_MONO_COMBINED "mono_combined" +#define POLICY_AUTO "auto" +#define POLICY_PHONE "phone" +#define POLICY_ALL "all" +#define BLUEZ_API "bluez" +#define MONO_KEY "db/setting/accessibility/mono_audio" + +/* check if this sink is bluez */ +static pa_bool_t policy_is_bluez (pa_sink* sink) +{ + const char* api_name = NULL; + + if (sink == NULL) { + pa_log_warn ("input param sink is null"); + return FALSE; + } + + api_name = pa_proplist_gets(sink->proplist, PA_PROP_DEVICE_API); + if (api_name) { + if (pa_streq (api_name, BLUEZ_API)) { +#ifdef DEBUG_DETAIL + pa_log_debug("[POLICY][%s] [%s] exists and it is [%s]...TRUE !!", __func__, PA_PROP_DEVICE_API, api_name); +#endif + return TRUE; + } else { +#ifdef DEBUG_DETAIL + pa_log_debug("[POLICY][%s] [%s] exists, but not bluez...FALSE !!", __func__, PA_PROP_DEVICE_API); +#endif + } + } else { +#ifdef DEBUG_DETAIL + pa_log_debug("[POLICY][%s] No [%s] exists...FALSE!!", __func__, PA_PROP_DEVICE_API); +#endif + } + + return FALSE; +} + +/* Get sink by name */ +static pa_sink* policy_get_sink_by_name (pa_core *c, const char* sink_name) +{ + pa_sink *s = NULL; + uint32_t idx; + + if (c == NULL || sink_name == NULL) { + pa_log_warn ("input param is null"); + return NULL; + } + + PA_IDXSET_FOREACH(s, c->sinks, idx) { + if (pa_streq (s->name, sink_name)) { + pa_log_debug ("[POLICY][%s] return [%p] for [%s]\n", __func__, s, sink_name); + return s; + } + } + return NULL; +} + +/* Get bt sink if available */ +static pa_sink* policy_get_bt_sink (pa_core *c) +{ + pa_sink *s = NULL; + uint32_t idx; + + if (c == NULL) { + pa_log_warn ("input param is null"); + return NULL; + } + + PA_IDXSET_FOREACH(s, c->sinks, idx) { + if (policy_is_bluez (s)) { + pa_log_debug ("[POLICY][%s] return [%p] for [%s]\n", __func__, s, s->name); + return s; + } + } + return NULL; +} + +/* Select sink for given condition */ +static pa_sink* policy_select_proper_sink (pa_core *c, const char* policy, int is_mono) +{ + pa_sink* sink = NULL; + pa_sink* bt_sink = NULL; + pa_sink* def = NULL; + + if (c == NULL || policy == NULL) { + pa_log_warn ("input param is null"); + return NULL; + } + + pa_assert (c); + + bt_sink = policy_get_bt_sink(c); + def = pa_namereg_get_default_sink(c); + pa_log_debug ("[POLICY][%s] policy[%s], is_mono[%d], current default[%s], bt sink[%s]\n", + __func__, policy, is_mono, def->name, (bt_sink)? bt_sink->name:"null"); + + /* Select sink to */ + if (pa_streq(policy, POLICY_ALL)) { + /* all */ + if (bt_sink) { + sink = policy_get_sink_by_name(c, (is_mono)? SINK_MONO_COMBINED : SINK_COMBINED); + } else { + sink = policy_get_sink_by_name (c, (is_mono)? SINK_MONO_ALSA : SINK_ALSA); + } + + } else if (pa_streq(policy, POLICY_PHONE)) { + /* phone */ + sink = policy_get_sink_by_name (c, (is_mono)? SINK_MONO_ALSA : SINK_ALSA); + } else { + /* auto */ + if (pa_streq (def->name, SINK_ALSA)) { + sink = (is_mono)? policy_get_sink_by_name (c, SINK_MONO_ALSA) : def; + } else { + sink = (is_mono)? policy_get_sink_by_name (c, SINK_MONO_BT) : def; + } + } + + pa_log_debug ("[POLICY][%s] selected sink : [%s]\n", __func__, (sink)? sink->name : "null"); + return sink; +} + +static pa_bool_t policy_is_filter (pa_sink_input* si) +{ + const char* role = NULL; + + if (si == NULL) { + pa_log_warn ("input param sink-input is null"); + return FALSE; + } + + if ((role = pa_proplist_gets(si->proplist, PA_PROP_MEDIA_ROLE))) { +#ifdef DEBUG_DETAIL + pa_log_debug("[POLICY][%s] Role of sink input [%d] = %s", __func__, si->index, role); +#endif + if (pa_streq(role, "filter")) { +#ifdef DEBUG_DETAIL + pa_log_debug("[POLICY] no need to change of sink for %s", role); +#endif + return TRUE; + } + } + + return FALSE; +} + + + +#define EXT_VERSION 1 + +static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connection *c, uint32_t tag, pa_tagstruct *t) { + struct userdata *u = NULL; + uint32_t command; + pa_tagstruct *reply = NULL; + + pa_sink_input *si = NULL; + uint32_t idx; + pa_sink* sink_to_move = NULL; + + pa_assert(p); + pa_assert(m); + pa_assert(c); + pa_assert(t); + + u = m->userdata; + + if (pa_tagstruct_getu32(t, &command) < 0) + goto fail; + + reply = pa_tagstruct_new(NULL, 0); + pa_tagstruct_putu32(reply, PA_COMMAND_REPLY); + pa_tagstruct_putu32(reply, tag); + + switch (command) { + case SUBCOMMAND_TEST: { + if (!pa_tagstruct_eof(t)) + goto fail; + + pa_tagstruct_putu32(reply, EXT_VERSION); + break; + } + + case SUBCOMMAND_MONO: { + + pa_bool_t enable; + + if (pa_tagstruct_get_boolean(t, &enable) < 0) + goto fail; + + pa_log_debug ("[POLICY][%s] new mono value = %d\n", __func__, enable); + if (enable == u->is_mono) { + pa_log_debug ("[POLICY][%s] No changes in mono value = %d", __func__, u->is_mono); + break; + } + + u->is_mono = enable; + + /* Move current sink-input to proper mono sink */ + PA_IDXSET_FOREACH(si, u->core->sink_inputs, idx) { + const char *policy = NULL; + + /* Skip this if it is already in the process of being moved + * anyway */ + if (!si->sink) + continue; + + /* It might happen that a stream and a sink are set up at the + same time, in which case we want to make sure we don't + interfere with that */ + if (!PA_SINK_INPUT_IS_LINKED(pa_sink_input_get_state(si))) + continue; + + /* Get role (if role is filter, skip it) */ + if (policy_is_filter(si)) + continue; + + /* Check policy, if no policy exists, treat as AUTO */ + if (!(policy = pa_proplist_gets(si->proplist, PA_PROP_MEDIA_POLICY))) { + pa_log_debug("[POLICY] set policy of sink-input[%d] from [%s] to [auto]", si->index, "null"); + policy = POLICY_AUTO; + } + pa_log_debug("[POLICY] Policy of sink input [%d] = %s", si->index, policy); + + /* Select sink to move and move to it */ + sink_to_move = policy_select_proper_sink (u->core, policy, u->is_mono); + if (sink_to_move) { + pa_log_debug("[POLICY][%s] Moving sink-input[%d] from [%s] to [%s]", __func__, si->index, si->sink->name, sink_to_move->name); + pa_sink_input_move_to(si, sink_to_move, FALSE); + } else { + pa_log_debug("[POLICY][%s] Can't move sink-input....", __func__); + } + } + break; + } + + default: + goto fail; + } + + pa_pstream_send_tagstruct(pa_native_connection_get_pstream(c), reply); + return 0; + + fail: + + if (reply) + pa_tagstruct_free(reply); + + return -1; +} + +/* Called when new sink-input is creating */ +static pa_hook_result_t sink_input_new_hook_callback(pa_core *c, pa_sink_input_new_data *new_data, struct userdata *u) +{ + const char *policy = NULL; + + pa_assert(c); + pa_assert(new_data); + pa_assert(u); + + if (!new_data->proplist) { + pa_log_debug("[POLICY] New stream lacks property data."); + return PA_HOOK_OK; + } + + /* If sink-input has already sink, skip */ + if (new_data->sink) { + /* sink-input with filter role will be also here because sink is already set */ +#ifdef DEBUG_DETAIL + pa_log_debug("[POLICY] Not setting device for stream [%s], because already set.", + pa_strnull(pa_proplist_gets(new_data->proplist, PA_PROP_MEDIA_NAME))); +#endif + return PA_HOOK_OK; + } + + /* If no policy exists, skip */ + if (!(policy = pa_proplist_gets(new_data->proplist, PA_PROP_MEDIA_POLICY))) { + pa_log_debug("[POLICY][%s] Not setting device for stream [%s], because it lacks policy.", + __func__, pa_strnull(pa_proplist_gets(new_data->proplist, PA_PROP_MEDIA_NAME))); + return PA_HOOK_OK; + } + pa_log_debug("[POLICY][%s] Policy for stream [%s] = [%s]", + __func__, pa_strnull(pa_proplist_gets(new_data->proplist, PA_PROP_MEDIA_NAME)), policy); + + /* Set proper sink to sink-input */ + new_data->save_sink = FALSE; + new_data->sink = policy_select_proper_sink (c, policy, u->is_mono); + pa_log_debug("[POLICY][%s] set sink of sink-input to [%s]", __func__, (new_data->sink)? new_data->sink->name : "null"); + + return PA_HOOK_OK; +} + +/* Called when new sink is added while sink-input is existing */ +static pa_hook_result_t sink_put_hook_callback(pa_core *c, pa_sink *sink, struct userdata *u) +{ + pa_sink_input *si; + pa_sink *sink_to_move; + uint32_t idx; + char *args = NULL; + + pa_assert(c); + pa_assert(sink); + pa_assert(u); + pa_assert(u->on_hotplug); + + /* If connected sink is BLUETOOTH, set as default */ + /* we are checking with device.api property */ + if (policy_is_bluez(sink)) { + pa_log_debug("[POLICY][%s] set default sink to sink[%s][%d]", __func__, sink->name, sink->index); + pa_namereg_set_default_sink (c,sink); + } else { + pa_log_debug("[POLICY][%s] this sink [%s][%d] is not a bluez....return", __func__, sink->name, sink->index); + return PA_HOOK_OK; + } + + /* Load mono_bt sink */ + args = pa_sprintf_malloc("sink_name=%s master=%s channels=1", SINK_MONO_BT, sink->name); + u->module_mono_bt = pa_module_load(u->module->core, "module-remap-sink", args); + pa_xfree(args); + + /* load combine sink */ + args = pa_sprintf_malloc("sink_name=%s slaves=\"%s,%s\"", SINK_COMBINED, sink->name, SINK_ALSA); + u->module_combined = pa_module_load(u->module->core, "module-combine", args); + pa_xfree(args); + + /* load mono_combine sink */ + args = pa_sprintf_malloc("sink_name=%s master=%s channels=1", SINK_MONO_COMBINED, SINK_COMBINED); + u->module_mono_combined = pa_module_load(u->module->core, "module-remap-sink", args); + pa_xfree(args); + + + /* Iterate each sink inputs to decide whether we should move to new sink */ + PA_IDXSET_FOREACH(si, c->sink_inputs, idx) { + const char *policy = NULL; + + if (si->sink == sink) + continue; + + /* Skip this if it is already in the process of being moved + * anyway */ + if (!si->sink) + continue; + + /* It might happen that a stream and a sink are set up at the + same time, in which case we want to make sure we don't + interfere with that */ + if (!PA_SINK_INPUT_IS_LINKED(pa_sink_input_get_state(si))) + continue; + + /* Get role (if role is filter, skip it) */ + if (policy_is_filter(si)) + continue; + + /* Check policy */ + if (!(policy = pa_proplist_gets(si->proplist, PA_PROP_MEDIA_POLICY))) { + /* No policy exists, this means auto */ + pa_log_debug("[POLICY][%s] set policy of sink-input[%d] from [%s] to [auto]", __func__, si->index, "null"); + policy = POLICY_AUTO; + } + + sink_to_move = policy_select_proper_sink (c, policy, u->is_mono); + if (sink_to_move) { + pa_log_debug("[POLICY][%s] Moving sink-input[%d] from [%s] to [%s]", __func__, si->index, si->sink->name, sink_to_move->name); + pa_sink_input_move_to(si, sink_to_move, FALSE); + } else { + pa_log_debug("[POLICY][%s] Can't move sink-input....",__func__); + } + } + + return PA_HOOK_OK; +} + +static void subscribe_cb(pa_core *c, pa_subscription_event_type_t t, uint32_t idx, void *userdata) +{ + struct userdata *u = userdata; + pa_sink *def; + pa_sink_input *si; + uint32_t idx2; + pa_sink *sink_to_move = NULL; + pa_assert(u); + + pa_log_debug("[POLICY][%s] subscribe_cb() t=[0x%x], idx=[%d]", __func__, t, idx); + + /* We only handle server changes */ + if (t == (PA_SUBSCRIPTION_EVENT_SERVER|PA_SUBSCRIPTION_EVENT_CHANGE)) { + + def = pa_namereg_get_default_sink(c); + pa_log_debug("[POLICY][%s] trying to move stream to current default sink = [%s]", __func__, def->name); + + /* Iterate each sink inputs to decide whether we should move to new DEFAULT sink */ + PA_IDXSET_FOREACH(si, c->sink_inputs, idx2) { + const char *policy = NULL; + + if (!si->sink) + continue; + + /* Get role (if role is filter, skip it) */ + if (policy_is_filter(si)) + continue; + + /* Get policy */ + if (!(policy = pa_proplist_gets(si->proplist, PA_PROP_MEDIA_POLICY))) { + /* No policy exists, this means auto */ + pa_log_debug("[POLICY][%s] set policy of sink-input[%d] from [%s] to [auto]", __func__, si->index, "null"); + policy = POLICY_AUTO; + } + + sink_to_move = policy_select_proper_sink (c, policy, u->is_mono); + if (sink_to_move) { + /* Move sink-input to new DEFAULT sink */ + pa_log_debug("[POLICY][%s] Moving sink-input[%d] from [%s] to [%s]", __func__, si->index, si->sink->name, sink_to_move->name); + pa_sink_input_move_to(si, sink_to_move, FALSE); + } + } + } +} + +static pa_hook_result_t sink_unlink_hook_callback(pa_core *c, pa_sink *sink, void* userdata) { + struct userdata *u = userdata; + uint32_t idx; + pa_sink *sink_to_move; + pa_sink_input *si; + + pa_assert(c); + pa_assert(sink); + pa_assert(u); + + /* There's no point in doing anything if the core is shut down anyway */ + if (c->state == PA_CORE_SHUTDOWN) + return PA_HOOK_OK; + + /* if unloading sink is not bt, just return */ + if (!policy_is_bluez (sink)) { + pa_log_debug("[POLICY][%s] sink[%s][%d] unlinked but not a bluez....return\n", __func__, sink->name, sink->index); + return PA_HOOK_OK; + } + + pa_log_debug ("[POLICY][%s] SINK unlinked ================================ sink [%s][%d], bt_off_idx was [%d]", + __func__, sink->name, sink->index,u->bt_off_idx); + + u->bt_off_idx = sink->index; + pa_log_debug ("[POLICY][%s] bt_off_idx is set to [%d]", __func__, u->bt_off_idx); + + /* BT sink is unloading, move sink-input to proper sink */ + PA_IDXSET_FOREACH(si, c->sink_inputs, idx) { + + if (!si->sink) + continue; + + /* Get role (if role is filter, skip it) */ + if (policy_is_filter(si)) + continue; + + /* Find who were using bt sink or bt related sink and move them to proper sink (alsa/mono_alsa) */ + if (pa_streq (si->sink->name, SINK_MONO_BT) || + pa_streq (si->sink->name, SINK_MONO_COMBINED) || + pa_streq (si->sink->name, SINK_COMBINED) || + policy_is_bluez (si->sink)) { + + /* Move sink-input to proper sink : only alsa related sink is available now */ + sink_to_move = policy_get_sink_by_name (c, (u->is_mono)? SINK_MONO_ALSA : SINK_ALSA); + pa_log_debug("[POLICY][%s] Moving sink-input[%d] from [%s] to [%s]", __func__, si->index, si->sink->name, sink_to_move->name); + pa_sink_input_move_to(si, sink_to_move, FALSE); + } + } + + pa_log_debug ("[POLICY][%s] unload sink in dependencies", __func__); + + /* Unload mono_combine sink */ + if (u->module_mono_combined) { + pa_module_unload(u->module->core, u->module_mono_combined, TRUE); + u->module_mono_combined = NULL; + } + + /* Unload combine sink */ + if (u->module_combined) { + pa_module_unload(u->module->core, u->module_combined, TRUE); + u->module_combined = NULL; + } + + /* Unload mono_bt sink */ + if (u->module_mono_bt) { + pa_module_unload(u->module->core, u->module_mono_bt, TRUE); + u->module_mono_bt = NULL; + } + + return PA_HOOK_OK; +} + +static pa_hook_result_t sink_unlink_post_hook_callback(pa_core *c, pa_sink *sink, void* userdata) { + struct userdata *u = userdata; + + pa_assert(c); + pa_assert(sink); + pa_assert(u); + + pa_log_debug("[POLICY][%s] SINK unlinked POST ================================ sink [%s][%d]", __func__, sink->name, sink->index); + + /* There's no point in doing anything if the core is shut down anyway */ + if (c->state == PA_CORE_SHUTDOWN) + return PA_HOOK_OK; + + /* if unloading sink is not bt, just return */ + if (!policy_is_bluez (sink)) { + pa_log_debug("[POLICY][%s] not a bluez....return\n", __func__); + return PA_HOOK_OK; + } + + u->bt_off_idx = -1; + pa_log_debug ("[POLICY][%s] bt_off_idx is cleared to [%d]", __func__, u->bt_off_idx); + + return PA_HOOK_OK; +} + +static pa_hook_result_t sink_input_move_start_cb(pa_core *core, pa_sink_input *i, struct userdata *u) { + pa_core_assert_ref(core); + pa_sink_input_assert_ref(i); + + /* There's no point in doing anything if the core is shut down anyway */ + if (core->state == PA_CORE_SHUTDOWN) + return PA_HOOK_OK; + + pa_log_debug ("[POLICY][%s] sink_input_move_start_cb -------------------------------------- sink-input [%d] was sink [%s][%d] : Trying to mute!!!", + __func__, i->index, i->sink->name, i->sink->index); + pa_sink_input_set_mute(i, TRUE, FALSE); + + return PA_HOOK_OK; +} + +static pa_hook_result_t sink_input_move_finish_cb(pa_core *core, pa_sink_input *i, struct userdata *u) { + pa_core_assert_ref(core); + pa_sink_input_assert_ref(i); + + /* There's no point in doing anything if the core is shut down anyway */ + if (core->state == PA_CORE_SHUTDOWN) + return PA_HOOK_OK; + + pa_log_debug("[POLICY][%s] sink_input_move_finish_cb -------------------------------------- sink-input [%d], sink [%s][%d], bt_off_idx [%d] : %s", + __func__, i->index, i->sink->name, i->sink->index, u->bt_off_idx, + (u->bt_off_idx == -1)? "Trying to un-mute!!!!" : "skip un-mute..."); + + /* If sink input move is caused by bt sink unlink, then skip un-mute operation */ + if (u->bt_off_idx == -1) { + pa_sink_input_set_mute(i, FALSE, FALSE); + } + + return PA_HOOK_OK; +} + +int pa__init(pa_module *m) +{ + pa_modargs *ma = NULL; + struct userdata *u; + pa_bool_t on_hotplug = TRUE, on_rescue = TRUE; + + pa_assert(m); + + if (!(ma = pa_modargs_new(m->argument, valid_modargs))) { + pa_log("Failed to parse module arguments"); + goto fail; + } + + if (pa_modargs_get_value_boolean(ma, "on_hotplug", &on_hotplug) < 0 || + pa_modargs_get_value_boolean(ma, "on_rescue", &on_rescue) < 0) { + pa_log("on_hotplug= and on_rescue= expect boolean arguments"); + goto fail; + } + + m->userdata = u = pa_xnew0(struct userdata, 1); + u->core = m->core; + u->module = m; + u->on_hotplug = on_hotplug; + + + /* A little bit later than module-stream-restore */ + u->sink_input_new_hook_slot = + pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_INPUT_NEW], PA_HOOK_EARLY+10, (pa_hook_cb_t) sink_input_new_hook_callback, u); + + if (on_hotplug) { + /* A little bit later than module-stream-restore */ + u->sink_put_hook_slot = + pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_PUT], PA_HOOK_LATE+10, (pa_hook_cb_t) sink_put_hook_callback, u); + } + + /* sink unlink comes before sink-input unlink */ + u->sink_unlink_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_UNLINK], PA_HOOK_EARLY, (pa_hook_cb_t) sink_unlink_hook_callback, u); + u->sink_unlink_post_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_UNLINK_POST], PA_HOOK_EARLY, (pa_hook_cb_t) sink_unlink_post_hook_callback, u); + + u->sink_input_move_start_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_INPUT_MOVE_START], PA_HOOK_LATE, (pa_hook_cb_t) sink_input_move_start_cb, u); + u->sink_input_move_finish_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_INPUT_MOVE_FINISH], PA_HOOK_LATE, (pa_hook_cb_t) sink_input_move_finish_cb, u); + + u->subscription = pa_subscription_new(u->core, PA_SUBSCRIPTION_MASK_SERVER, subscribe_cb, u); + + + u->bt_off_idx = -1; /* initial bt off sink index */ + + u->module_mono_bt = NULL; + u->module_combined = NULL; + u->module_mono_combined = NULL; + + u->protocol = pa_native_protocol_get(m->core); + pa_native_protocol_install_ext(u->protocol, m, extension_cb); + + /* Get mono key value for init */ + vconf_get_bool(MONO_KEY, &u->is_mono); + + pa_log_info("policy module is loaded\n"); + + return 0; + +fail: + pa__done(m); + + return -1; +} + +void pa__done(pa_module *m) +{ + struct userdata* u; + + pa_assert(m); + + if (!(u = m->userdata)) + return; + + if (u->sink_input_new_hook_slot) + pa_hook_slot_free(u->sink_input_new_hook_slot); + if (u->sink_put_hook_slot) + pa_hook_slot_free(u->sink_put_hook_slot); + if (u->subscription) + pa_subscription_free(u->subscription); + if (u->protocol) { + pa_native_protocol_remove_ext(u->protocol, m); + pa_native_protocol_unref(u->protocol); + } + + pa_xfree(u); + + + pa_log_info("policy module is unloaded\n"); +} diff --git a/src/modules/module-position-event-sounds-symdef.h b/src/modules/module-position-event-sounds-symdef.h new file mode 100644 index 0000000..ea60485 --- /dev/null +++ b/src/modules/module-position-event-sounds-symdef.h @@ -0,0 +1,29 @@ +#ifndef foomodulepositioneventsoundssymdeffoo +#define foomodulepositioneventsoundssymdeffoo + +#include +#include +#include + +#define pa__init module_position_event_sounds_LTX_pa__init +#define pa__done module_position_event_sounds_LTX_pa__done +#define pa__get_author module_position_event_sounds_LTX_pa__get_author +#define pa__get_description module_position_event_sounds_LTX_pa__get_description +#define pa__get_usage module_position_event_sounds_LTX_pa__get_usage +#define pa__get_version module_position_event_sounds_LTX_pa__get_version +#define pa__get_deprecated module_position_event_sounds_LTX_pa__get_deprecated +#define pa__load_once module_position_event_sounds_LTX_pa__load_once +#define pa__get_n_used module_position_event_sounds_LTX_pa__get_n_used + +int pa__init(pa_module*m); +void pa__done(pa_module*m); +int pa__get_n_used(pa_module*m); + +const char* pa__get_author(void); +const char* pa__get_description(void); +const char* pa__get_usage(void); +const char* pa__get_version(void); +const char* pa__get_deprecated(void); +pa_bool_t pa__load_once(void); + +#endif diff --git a/src/modules/module-position-event-sounds.c b/src/modules/module-position-event-sounds.c new file mode 100644 index 0000000..ee4c8c8 --- /dev/null +++ b/src/modules/module-position-event-sounds.c @@ -0,0 +1,182 @@ +/*** + This file is part of PulseAudio. + + Copyright 2006 Lennart Poettering + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include "module-position-event-sounds-symdef.h" + +PA_MODULE_AUTHOR("Lennart Poettering"); +PA_MODULE_DESCRIPTION("Position event sounds between L and R depending on the position on screen of the widget triggering them."); +PA_MODULE_VERSION(PACKAGE_VERSION); +PA_MODULE_LOAD_ONCE(TRUE); + +static const char* const valid_modargs[] = { + NULL +}; + +struct userdata { + pa_hook_slot *sink_input_fixate_hook_slot; +}; + +static int parse_pos(const char *pos, double *f) { + + if (pa_atod(pos, f) < 0) { + pa_log_warn("Failed to parse hpos/vpos property '%s'.", pos); + return -1; + } + + if (*f < 0.0 || *f > 1.0) { + pa_log_debug("Property hpos/vpos out of range %0.2f", *f); + + *f = PA_CLAMP(*f, 0.0, 1.0); + } + + return 0; +} + +static pa_hook_result_t sink_input_fixate_hook_callback(pa_core *core, pa_sink_input_new_data *data, struct userdata *u) { + const char *hpos, *vpos, *role, *id; + double f; + char t[PA_CVOLUME_SNPRINT_MAX]; + pa_cvolume v; + + pa_assert(data); + + if (!(role = pa_proplist_gets(data->proplist, PA_PROP_MEDIA_ROLE))) + return PA_HOOK_OK; + + if (!pa_streq(role, "event")) + return PA_HOOK_OK; + + if ((id = pa_proplist_gets(data->proplist, PA_PROP_EVENT_ID))) { + + /* The test sounds should never be positioned in space, since + * they might be trigered themselves to configure the speakers + * in space, which we don't want to mess up. */ + + if (pa_startswith(id, "audio-channel-")) + return PA_HOOK_OK; + + if (pa_streq(id, "audio-volume-change")) + return PA_HOOK_OK; + + if (pa_streq(id, "audio-test-signal")) + return PA_HOOK_OK; + } + + if (!(hpos = pa_proplist_gets(data->proplist, PA_PROP_EVENT_MOUSE_HPOS))) + hpos = pa_proplist_gets(data->proplist, PA_PROP_WINDOW_HPOS); + + if (!(vpos = pa_proplist_gets(data->proplist, PA_PROP_EVENT_MOUSE_VPOS))) + vpos = pa_proplist_gets(data->proplist, PA_PROP_WINDOW_VPOS); + + if (!hpos && !vpos) + return PA_HOOK_OK; + + pa_cvolume_reset(&v, data->sink->sample_spec.channels); + + if (hpos) { + if (parse_pos(hpos, &f) < 0) + return PA_HOOK_OK; + + if (pa_channel_map_can_balance(&data->sink->channel_map)) { + pa_log_debug("Positioning event sound '%s' horizontally at %0.2f.", pa_strnull(pa_proplist_gets(data->proplist, PA_PROP_EVENT_ID)), f); + pa_cvolume_set_balance(&v, &data->sink->channel_map, f*2.0-1.0); + } + } + + if (vpos) { + if (parse_pos(vpos, &f) < 0) + return PA_HOOK_OK; + + if (pa_channel_map_can_fade(&data->sink->channel_map)) { + pa_log_debug("Positioning event sound '%s' vertically at %0.2f.", pa_strnull(pa_proplist_gets(data->proplist, PA_PROP_EVENT_ID)), f); + pa_cvolume_set_fade(&v, &data->sink->channel_map, f*2.0-1.0); + } + } + + pa_log_debug("Final volume factor %s.", pa_cvolume_snprint(t, sizeof(t), &v)); + pa_sink_input_new_data_apply_volume_factor_sink(data, &v); + + return PA_HOOK_OK; +} + +int pa__init(pa_module*m) { + pa_modargs *ma = NULL; + struct userdata *u; + + pa_assert(m); + + if (!(ma = pa_modargs_new(m->argument, valid_modargs))) { + pa_log("Failed to parse module arguments"); + goto fail; + } + + m->userdata = u = pa_xnew(struct userdata, 1); + u->sink_input_fixate_hook_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_INPUT_FIXATE], PA_HOOK_EARLY, (pa_hook_cb_t) sink_input_fixate_hook_callback, u); + + pa_modargs_free(ma); + + return 0; + +fail: + pa__done(m); + + if (ma) + pa_modargs_free(ma); + + return -1; +} + +void pa__done(pa_module*m) { + struct userdata* u; + + pa_assert(m); + + if (!(u = m->userdata)) + return; + + if (u->sink_input_fixate_hook_slot) + pa_hook_slot_free(u->sink_input_fixate_hook_slot); + + pa_xfree(u); +} diff --git a/src/modules/module-protocol-stub.c b/src/modules/module-protocol-stub.c new file mode 100644 index 0000000..5b351d1 --- /dev/null +++ b/src/modules/module-protocol-stub.c @@ -0,0 +1,519 @@ +/*** + This file is part of PulseAudio. + + Copyright 2004-2006 Lennart Poettering + Copyright 2006 Pierre Ossman for Cendio AB + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include +#include + +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_ARPA_INET_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef USE_TCP_SOCKETS +#define SOCKET_DESCRIPTION "(TCP sockets)" +#define SOCKET_USAGE "port= listen=
" +#else +#define SOCKET_DESCRIPTION "(UNIX sockets)" +#define SOCKET_USAGE "socket=" +#endif + +#if defined(USE_PROTOCOL_SIMPLE) +# include +# define TCPWRAP_SERVICE "pulseaudio-simple" +# define IPV4_PORT 4711 +# define UNIX_SOCKET "simple" +# define MODULE_ARGUMENTS "rate", "format", "channels", "sink", "source", "playback", "record", + +# if defined(USE_TCP_SOCKETS) +# include "module-simple-protocol-tcp-symdef.h" +# else +# include "module-simple-protocol-unix-symdef.h" +# endif + + PA_MODULE_DESCRIPTION("Simple protocol "SOCKET_DESCRIPTION); + PA_MODULE_USAGE("rate= " + "format= " + "channels= " + "sink= " + "source= " + "playback= " + "record= " + SOCKET_USAGE); +#elif defined(USE_PROTOCOL_CLI) +# include +# define TCPWRAP_SERVICE "pulseaudio-cli" +# define IPV4_PORT 4712 +# define UNIX_SOCKET "cli" +# define MODULE_ARGUMENTS + +# ifdef USE_TCP_SOCKETS +# include "module-cli-protocol-tcp-symdef.h" +# else +# include "module-cli-protocol-unix-symdef.h" +# endif + + PA_MODULE_DESCRIPTION("Command line interface protocol "SOCKET_DESCRIPTION); + PA_MODULE_USAGE(SOCKET_USAGE); +#elif defined(USE_PROTOCOL_HTTP) +# include +# define TCPWRAP_SERVICE "pulseaudio-http" +# define IPV4_PORT 4714 +# define UNIX_SOCKET "http" +# define MODULE_ARGUMENTS + +# ifdef USE_TCP_SOCKETS +# include "module-http-protocol-tcp-symdef.h" +# else +# include "module-http-protocol-unix-symdef.h" +# endif + + PA_MODULE_DESCRIPTION("HTTP "SOCKET_DESCRIPTION); + PA_MODULE_USAGE(SOCKET_USAGE); +#elif defined(USE_PROTOCOL_NATIVE) +# include +# define TCPWRAP_SERVICE "pulseaudio-native" +# define IPV4_PORT PA_NATIVE_DEFAULT_PORT +# define UNIX_SOCKET PA_NATIVE_DEFAULT_UNIX_SOCKET +# define MODULE_ARGUMENTS_COMMON "cookie", "auth-cookie", "auth-cookie-enabled", "auth-anonymous", + +# ifdef USE_TCP_SOCKETS +# include "module-native-protocol-tcp-symdef.h" +# else +# include "module-native-protocol-unix-symdef.h" +# endif + +# if defined(HAVE_CREDS) && !defined(USE_TCP_SOCKETS) +# define MODULE_ARGUMENTS MODULE_ARGUMENTS_COMMON "auth-group", "auth-group-enable", +# define AUTH_USAGE "auth-group= auth-group-enable= " +# elif defined(USE_TCP_SOCKETS) +# define MODULE_ARGUMENTS MODULE_ARGUMENTS_COMMON "auth-ip-acl", +# define AUTH_USAGE "auth-ip-acl= " +# else +# define MODULE_ARGUMENTS MODULE_ARGUMENTS_COMMON +# define AUTH_USAGE +# endif + + PA_MODULE_DESCRIPTION("Native protocol "SOCKET_DESCRIPTION); + PA_MODULE_USAGE("auth-anonymous= " + "auth-cookie= " + "auth-cookie-enabled= +# include +# define TCPWRAP_SERVICE "esound" +# define IPV4_PORT ESD_DEFAULT_PORT +# define MODULE_ARGUMENTS_COMMON "sink", "source", "auth-anonymous", "cookie", "auth-cookie", "auth-cookie-enabled", + +# ifdef USE_TCP_SOCKETS +# include "module-esound-protocol-tcp-symdef.h" +# else +# include "module-esound-protocol-unix-symdef.h" +# endif + +# if defined(USE_TCP_SOCKETS) +# define MODULE_ARGUMENTS MODULE_ARGUMENTS_COMMON "auth-ip-acl", +# define AUTH_USAGE "auth-ip-acl= " +# else +# define MODULE_ARGUMENTS MODULE_ARGUMENTS_COMMON +# define AUTH_USAGE +# endif + + PA_MODULE_DESCRIPTION("ESOUND protocol "SOCKET_DESCRIPTION); + PA_MODULE_USAGE("sink= " + "source= " + "auth-anonymous= " + "auth-cookie= " + "auth-cookie-enabled=simple_protocol, io, u->simple_options); +#elif defined(USE_PROTOCOL_CLI) + pa_cli_protocol_connect(u->cli_protocol, io, u->module); +#elif defined(USE_PROTOCOL_HTTP) + pa_http_protocol_connect(u->http_protocol, io, u->module); +#elif defined(USE_PROTOCOL_NATIVE) + pa_native_protocol_connect(u->native_protocol, io, u->native_options); +#else + pa_esound_protocol_connect(u->esound_protocol, io, u->esound_options); +#endif +} + +int pa__init(pa_module*m) { + pa_modargs *ma = NULL; + struct userdata *u = NULL; + +#if defined(USE_TCP_SOCKETS) + uint32_t port = IPV4_PORT; + const char *listen_on; +#else + int r; +#endif + +#if defined(USE_PROTOCOL_NATIVE) || defined(USE_PROTOCOL_HTTP) + char t[256]; +#endif + + pa_assert(m); + + if (!(ma = pa_modargs_new(m->argument, valid_modargs))) { + pa_log("Failed to parse module arguments"); + goto fail; + } + + m->userdata = u = pa_xnew0(struct userdata, 1); + u->module = m; + +#if defined(USE_PROTOCOL_SIMPLE) + u->simple_protocol = pa_simple_protocol_get(m->core); + + u->simple_options = pa_simple_options_new(); + if (pa_simple_options_parse(u->simple_options, m->core, ma) < 0) + goto fail; + u->simple_options->module = m; +#elif defined(USE_PROTOCOL_CLI) + u->cli_protocol = pa_cli_protocol_get(m->core); +#elif defined(USE_PROTOCOL_HTTP) + u->http_protocol = pa_http_protocol_get(m->core); +#elif defined(USE_PROTOCOL_NATIVE) + u->native_protocol = pa_native_protocol_get(m->core); + + u->native_options = pa_native_options_new(); + if (pa_native_options_parse(u->native_options, m->core, ma) < 0) + goto fail; + u->native_options->module = m; +#else + u->esound_protocol = pa_esound_protocol_get(m->core); + + u->esound_options = pa_esound_options_new(); + if (pa_esound_options_parse(u->esound_options, m->core, ma) < 0) + goto fail; + u->esound_options->module = m; +#endif + +#if defined(USE_TCP_SOCKETS) + if (pa_modargs_get_value_u32(ma, "port", &port) < 0 || port < 1 || port > 0xFFFF) { + pa_log("port= expects a numerical argument between 1 and 65535."); + goto fail; + } + + listen_on = pa_modargs_get_value(ma, "listen", NULL); + + if (listen_on) { +# ifdef HAVE_IPV6 + u->socket_server_ipv6 = pa_socket_server_new_ipv6_string(m->core->mainloop, listen_on, (uint16_t) port, TCPWRAP_SERVICE); +# endif + u->socket_server_ipv4 = pa_socket_server_new_ipv4_string(m->core->mainloop, listen_on, (uint16_t) port, TCPWRAP_SERVICE); + } else { +# ifdef HAVE_IPV6 + u->socket_server_ipv6 = pa_socket_server_new_ipv6_any(m->core->mainloop, (uint16_t) port, TCPWRAP_SERVICE); +# endif + u->socket_server_ipv4 = pa_socket_server_new_ipv4_any(m->core->mainloop, (uint16_t) port, TCPWRAP_SERVICE); + } + +# ifdef HAVE_IPV6 + if (!u->socket_server_ipv4 && !u->socket_server_ipv6) +# else + if (!u->socket_server_ipv4) +# endif + goto fail; + + if (u->socket_server_ipv4) + pa_socket_server_set_callback(u->socket_server_ipv4, socket_server_on_connection_cb, u); +# ifdef HAVE_IPV6 + if (u->socket_server_ipv6) + pa_socket_server_set_callback(u->socket_server_ipv6, socket_server_on_connection_cb, u); +# endif + +#else + +# if defined(USE_PROTOCOL_ESOUND) + +# if defined(USE_PER_USER_ESOUND_SOCKET) + u->socket_path = pa_sprintf_malloc("/tmp/.esd-%lu/socket", (unsigned long) getuid()); +# else + u->socket_path = pa_xstrdup("/tmp/.esd/socket"); +# endif + + /* This socket doesn't reside in our own runtime dir but in + * /tmp/.esd/, hence we have to create the dir first */ + + if (pa_make_secure_parent_dir(u->socket_path, pa_in_system_mode() ? 0755U : 0700U, (uid_t)-1, (gid_t)-1) < 0) { + pa_log("Failed to create socket directory '%s': %s\n", u->socket_path, pa_cstrerror(errno)); + goto fail; + } + +# else + if (!(u->socket_path = pa_runtime_path(pa_modargs_get_value(ma, "socket", UNIX_SOCKET)))) { + pa_log("Failed to generate socket path."); + goto fail; + } +# endif + + if ((r = pa_unix_socket_remove_stale(u->socket_path)) < 0) { + pa_log("Failed to remove stale UNIX socket '%s': %s", u->socket_path, pa_cstrerror(errno)); + goto fail; + } else if (r > 0) + pa_log_info("Removed stale UNIX socket '%s'.", u->socket_path); + + if (!(u->socket_server_unix = pa_socket_server_new_unix(m->core->mainloop, u->socket_path))) + goto fail; + + pa_socket_server_set_callback(u->socket_server_unix, socket_server_on_connection_cb, u); + +#endif + +#if defined(USE_PROTOCOL_NATIVE) +# if defined(USE_TCP_SOCKETS) + if (u->socket_server_ipv4) + if (pa_socket_server_get_address(u->socket_server_ipv4, t, sizeof(t))) + pa_native_protocol_add_server_string(u->native_protocol, t); + +# ifdef HAVE_IPV6 + if (u->socket_server_ipv6) + if (pa_socket_server_get_address(u->socket_server_ipv6, t, sizeof(t))) + pa_native_protocol_add_server_string(u->native_protocol, t); +# endif +# else + if (pa_socket_server_get_address(u->socket_server_unix, t, sizeof(t))) + pa_native_protocol_add_server_string(u->native_protocol, t); + +# endif +#endif + +#if defined(USE_PROTOCOL_HTTP) +#if defined(USE_TCP_SOCKETS) + if (u->socket_server_ipv4) + if (pa_socket_server_get_address(u->socket_server_ipv4, t, sizeof(t))) + pa_http_protocol_add_server_string(u->http_protocol, t); + +#ifdef HAVE_IPV6 + if (u->socket_server_ipv6) + if (pa_socket_server_get_address(u->socket_server_ipv6, t, sizeof(t))) + pa_http_protocol_add_server_string(u->http_protocol, t); +#endif /* HAVE_IPV6 */ +#else /* USE_TCP_SOCKETS */ + if (pa_socket_server_get_address(u->socket_server_unix, t, sizeof(t))) + pa_http_protocol_add_server_string(u->http_protocol, t); + +#endif /* USE_TCP_SOCKETS */ +#endif /* USE_PROTOCOL_HTTP */ + + if (ma) + pa_modargs_free(ma); + + return 0; + +fail: + + if (ma) + pa_modargs_free(ma); + + pa__done(m); + + return -1; +} + +void pa__done(pa_module*m) { + struct userdata *u; + + pa_assert(m); + + if (!(u = m->userdata)) + return; + +#if defined(USE_PROTOCOL_SIMPLE) + if (u->simple_protocol) { + pa_simple_protocol_disconnect(u->simple_protocol, u->module); + pa_simple_protocol_unref(u->simple_protocol); + } + if (u->simple_options) + pa_simple_options_unref(u->simple_options); +#elif defined(USE_PROTOCOL_CLI) + if (u->cli_protocol) { + pa_cli_protocol_disconnect(u->cli_protocol, u->module); + pa_cli_protocol_unref(u->cli_protocol); + } +#elif defined(USE_PROTOCOL_HTTP) + if (u->http_protocol) { + char t[256]; + +#if defined(USE_TCP_SOCKETS) + if (u->socket_server_ipv4) + if (pa_socket_server_get_address(u->socket_server_ipv4, t, sizeof(t))) + pa_http_protocol_remove_server_string(u->http_protocol, t); + +#ifdef HAVE_IPV6 + if (u->socket_server_ipv6) + if (pa_socket_server_get_address(u->socket_server_ipv6, t, sizeof(t))) + pa_http_protocol_remove_server_string(u->http_protocol, t); +#endif /* HAVE_IPV6 */ +#else /* USE_TCP_SOCKETS */ + if (u->socket_server_unix) + if (pa_socket_server_get_address(u->socket_server_unix, t, sizeof(t))) + pa_http_protocol_remove_server_string(u->http_protocol, t); +#endif /* USE_PROTOCOL_HTTP */ + + pa_http_protocol_disconnect(u->http_protocol, u->module); + pa_http_protocol_unref(u->http_protocol); + } +#elif defined(USE_PROTOCOL_NATIVE) + if (u->native_protocol) { + + char t[256]; + +# if defined(USE_TCP_SOCKETS) + if (u->socket_server_ipv4) + if (pa_socket_server_get_address(u->socket_server_ipv4, t, sizeof(t))) + pa_native_protocol_remove_server_string(u->native_protocol, t); + +# ifdef HAVE_IPV6 + if (u->socket_server_ipv6) + if (pa_socket_server_get_address(u->socket_server_ipv6, t, sizeof(t))) + pa_native_protocol_remove_server_string(u->native_protocol, t); +# endif +# else + if (u->socket_server_unix) + if (pa_socket_server_get_address(u->socket_server_unix, t, sizeof(t))) + pa_native_protocol_remove_server_string(u->native_protocol, t); +# endif + + pa_native_protocol_disconnect(u->native_protocol, u->module); + pa_native_protocol_unref(u->native_protocol); + } + if (u->native_options) + pa_native_options_unref(u->native_options); +#else + if (u->esound_protocol) { + pa_esound_protocol_disconnect(u->esound_protocol, u->module); + pa_esound_protocol_unref(u->esound_protocol); + } + if (u->esound_options) + pa_esound_options_unref(u->esound_options); +#endif + +#if defined(USE_TCP_SOCKETS) + if (u->socket_server_ipv4) + pa_socket_server_unref(u->socket_server_ipv4); +# ifdef HAVE_IPV6 + if (u->socket_server_ipv6) + pa_socket_server_unref(u->socket_server_ipv6); +# endif +#else + if (u->socket_server_unix) + pa_socket_server_unref(u->socket_server_unix); + +# if defined(USE_PROTOCOL_ESOUND) && !defined(USE_PER_USER_ESOUND_SOCKET) + if (u->socket_path) { + char *p = pa_parent_dir(u->socket_path); + rmdir(p); + pa_xfree(p); + } +# endif + + pa_xfree(u->socket_path); +#endif + + pa_xfree(u); +} diff --git a/src/modules/module-remap-sink-symdef.h b/src/modules/module-remap-sink-symdef.h new file mode 100644 index 0000000..01c2161 --- /dev/null +++ b/src/modules/module-remap-sink-symdef.h @@ -0,0 +1,29 @@ +#ifndef foomoduleremapsinksymdeffoo +#define foomoduleremapsinksymdeffoo + +#include +#include +#include + +#define pa__init module_remap_sink_LTX_pa__init +#define pa__done module_remap_sink_LTX_pa__done +#define pa__get_author module_remap_sink_LTX_pa__get_author +#define pa__get_description module_remap_sink_LTX_pa__get_description +#define pa__get_usage module_remap_sink_LTX_pa__get_usage +#define pa__get_version module_remap_sink_LTX_pa__get_version +#define pa__get_deprecated module_remap_sink_LTX_pa__get_deprecated +#define pa__load_once module_remap_sink_LTX_pa__load_once +#define pa__get_n_used module_remap_sink_LTX_pa__get_n_used + +int pa__init(pa_module*m); +void pa__done(pa_module*m); +int pa__get_n_used(pa_module*m); + +const char* pa__get_author(void); +const char* pa__get_description(void); +const char* pa__get_usage(void); +const char* pa__get_version(void); +const char* pa__get_deprecated(void); +pa_bool_t pa__load_once(void); + +#endif diff --git a/src/modules/module-remap-sink.c b/src/modules/module-remap-sink.c new file mode 100644 index 0000000..43748bd --- /dev/null +++ b/src/modules/module-remap-sink.c @@ -0,0 +1,498 @@ +/*** + This file is part of PulseAudio. + + Copyright 2004-2009 Lennart Poettering + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "module-remap-sink-symdef.h" + +PA_MODULE_AUTHOR("Lennart Poettering"); +PA_MODULE_DESCRIPTION("Virtual channel remapping sink"); +PA_MODULE_VERSION(PACKAGE_VERSION); +PA_MODULE_LOAD_ONCE(FALSE); +PA_MODULE_USAGE( + "sink_name= " + "sink_properties= " + "master= " + "master_channel_map= " + "format= " + "rate= " + "channels= " + "channel_map= " + "remix="); + +struct userdata { + pa_module *module; + + pa_sink *sink; + pa_sink_input *sink_input; + + pa_bool_t auto_desc; +}; + +static const char* const valid_modargs[] = { + "sink_name", + "sink_properties", + "master", + "master_channel_map", + "format", + "rate", + "channels", + "channel_map", + "remix", + NULL +}; + +/* Called from I/O thread context */ +static int sink_process_msg(pa_msgobject *o, int code, void *data, int64_t offset, pa_memchunk *chunk) { + struct userdata *u = PA_SINK(o)->userdata; + + switch (code) { + + case PA_SINK_MESSAGE_GET_LATENCY: + + /* The sink is _put() before the sink input is, so let's + * make sure we don't access it yet */ + if (!PA_SINK_IS_LINKED(u->sink->thread_info.state) || + !PA_SINK_INPUT_IS_LINKED(u->sink_input->thread_info.state)) { + *((pa_usec_t*) data) = 0; + return 0; + } + + *((pa_usec_t*) data) = + /* Get the latency of the master sink */ + pa_sink_get_latency_within_thread(u->sink_input->sink) + + + /* Add the latency internal to our sink input on top */ + pa_bytes_to_usec(pa_memblockq_get_length(u->sink_input->thread_info.render_memblockq), &u->sink_input->sink->sample_spec); + + return 0; + } + + return pa_sink_process_msg(o, code, data, offset, chunk); +} + +/* Called from main context */ +static int sink_set_state(pa_sink *s, pa_sink_state_t state) { + struct userdata *u; + + pa_sink_assert_ref(s); + pa_assert_se(u = s->userdata); + + if (!PA_SINK_IS_LINKED(state) || + !PA_SINK_INPUT_IS_LINKED(pa_sink_input_get_state(u->sink_input))) + return 0; + + pa_sink_input_cork(u->sink_input, state == PA_SINK_SUSPENDED); + return 0; +} + +/* Called from I/O thread context */ +static void sink_request_rewind(pa_sink *s) { + struct userdata *u; + + pa_sink_assert_ref(s); + pa_assert_se(u = s->userdata); + + if (!PA_SINK_IS_LINKED(u->sink->thread_info.state) || + !PA_SINK_INPUT_IS_LINKED(u->sink_input->thread_info.state)) + return; + + pa_sink_input_request_rewind(u->sink_input, s->thread_info.rewind_nbytes, TRUE, FALSE, FALSE); +} + +/* Called from I/O thread context */ +static void sink_update_requested_latency(pa_sink *s) { + struct userdata *u; + + pa_sink_assert_ref(s); + pa_assert_se(u = s->userdata); + + if (!PA_SINK_IS_LINKED(u->sink->thread_info.state) || + !PA_SINK_INPUT_IS_LINKED(u->sink_input->thread_info.state)) + return; + + /* Just hand this one over to the master sink */ + pa_sink_input_set_requested_latency_within_thread( + u->sink_input, + pa_sink_get_requested_latency_within_thread(s)); +} + +/* Called from I/O thread context */ +static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk) { + struct userdata *u; + + pa_sink_input_assert_ref(i); + pa_assert(chunk); + pa_assert_se(u = i->userdata); + + /* Hmm, process any rewind request that might be queued up */ + pa_sink_process_rewind(u->sink, 0); + + pa_sink_render(u->sink, nbytes, chunk); + return 0; +} + +/* Called from I/O thread context */ +static void sink_input_process_rewind_cb(pa_sink_input *i, size_t nbytes) { + size_t amount = 0; + struct userdata *u; + + pa_sink_input_assert_ref(i); + pa_assert_se(u = i->userdata); + + if (u->sink->thread_info.rewind_nbytes > 0) { + amount = PA_MIN(u->sink->thread_info.rewind_nbytes, nbytes); + u->sink->thread_info.rewind_nbytes = 0; + } + + pa_sink_process_rewind(u->sink, amount); +} + +/* Called from I/O thread context */ +static void sink_input_update_max_rewind_cb(pa_sink_input *i, size_t nbytes) { + struct userdata *u; + + pa_sink_input_assert_ref(i); + pa_assert_se(u = i->userdata); + + pa_sink_set_max_rewind_within_thread(u->sink, nbytes); +} + +/* Called from I/O thread context */ +static void sink_input_update_max_request_cb(pa_sink_input *i, size_t nbytes) { + struct userdata *u; + + pa_sink_input_assert_ref(i); + pa_assert_se(u = i->userdata); + + pa_sink_set_max_request_within_thread(u->sink, nbytes); +} + +/* Called from I/O thread context */ +static void sink_input_update_sink_latency_range_cb(pa_sink_input *i) { + struct userdata *u; + + pa_sink_input_assert_ref(i); + pa_assert_se(u = i->userdata); + + pa_sink_set_latency_range_within_thread(u->sink, i->sink->thread_info.min_latency, i->sink->thread_info.max_latency); +} + +/* Called from I/O thread context */ +static void sink_input_update_sink_fixed_latency_cb(pa_sink_input *i) { + struct userdata *u; + + pa_sink_input_assert_ref(i); + pa_assert_se(u = i->userdata); + + pa_sink_set_fixed_latency_within_thread(u->sink, i->sink->thread_info.fixed_latency); +} + +/* Called from I/O thread context */ +static void sink_input_detach_cb(pa_sink_input *i) { + struct userdata *u; + + pa_sink_input_assert_ref(i); + pa_assert_se(u = i->userdata); + + pa_sink_detach_within_thread(u->sink); + + pa_sink_set_rtpoll(u->sink, NULL); +} + +/* Called from I/O thread context */ +static void sink_input_attach_cb(pa_sink_input *i) { + struct userdata *u; + + pa_sink_input_assert_ref(i); + pa_assert_se(u = i->userdata); + + pa_sink_set_rtpoll(u->sink, i->sink->thread_info.rtpoll); + pa_sink_set_latency_range_within_thread(u->sink, i->sink->thread_info.min_latency, i->sink->thread_info.max_latency); + pa_sink_set_fixed_latency_within_thread(u->sink, i->sink->thread_info.fixed_latency); + pa_sink_set_max_request_within_thread(u->sink, pa_sink_input_get_max_request(i)); + pa_sink_set_max_rewind_within_thread(u->sink, pa_sink_input_get_max_rewind(i)); + + pa_sink_attach_within_thread(u->sink); +} + +/* Called from main context */ +static void sink_input_kill_cb(pa_sink_input *i) { + struct userdata *u; + + pa_sink_input_assert_ref(i); + pa_assert_se(u = i->userdata); + + /* The order here matters! We first kill the sink input, followed + * by the sink. That means the sink callbacks must be protected + * against an unconnected sink input! */ + pa_sink_input_unlink(u->sink_input); + pa_sink_unlink(u->sink); + + pa_sink_input_unref(u->sink_input); + u->sink_input = NULL; + + pa_sink_unref(u->sink); + u->sink = NULL; + + pa_module_unload_request(u->module, TRUE); +} + +/* Called from IO thread context */ +static void sink_input_state_change_cb(pa_sink_input *i, pa_sink_input_state_t state) { + struct userdata *u; + + pa_sink_input_assert_ref(i); + pa_assert_se(u = i->userdata); + + /* If we are added for the first time, ask for a rewinding so that + * we are heard right-away. */ + if (PA_SINK_INPUT_IS_LINKED(state) && + i->thread_info.state == PA_SINK_INPUT_INIT) { + pa_log_debug("Requesting rewind due to state change."); + pa_sink_input_request_rewind(i, 0, FALSE, TRUE, TRUE); + } +} + +/* Called from main context */ +static pa_bool_t sink_input_may_move_to_cb(pa_sink_input *i, pa_sink *dest) { + struct userdata *u; + + pa_sink_input_assert_ref(i); + pa_assert_se(u = i->userdata); + + return u->sink != dest; +} + +/* Called from main context */ +static void sink_input_moving_cb(pa_sink_input *i, pa_sink *dest) { + struct userdata *u; + + pa_sink_input_assert_ref(i); + pa_assert_se(u = i->userdata); + + if (dest) { + pa_sink_set_asyncmsgq(u->sink, dest->asyncmsgq); + pa_sink_update_flags(u->sink, PA_SINK_LATENCY|PA_SINK_DYNAMIC_LATENCY, dest->flags); + } else + pa_sink_set_asyncmsgq(u->sink, NULL); + + if (u->auto_desc && dest) { + const char *k; + pa_proplist *pl; + + pl = pa_proplist_new(); + k = pa_proplist_gets(dest->proplist, PA_PROP_DEVICE_DESCRIPTION); + pa_proplist_setf(pl, PA_PROP_DEVICE_DESCRIPTION, "Remapped %s", k ? k : dest->name); + + pa_sink_update_proplist(u->sink, PA_UPDATE_REPLACE, pl); + pa_proplist_free(pl); + } +} + +int pa__init(pa_module*m) { + struct userdata *u; + pa_sample_spec ss; + pa_channel_map sink_map, stream_map; + pa_modargs *ma; + pa_sink *master; + pa_sink_input_new_data sink_input_data; + pa_sink_new_data sink_data; + pa_bool_t remix = TRUE; + + pa_assert(m); + + if (!(ma = pa_modargs_new(m->argument, valid_modargs))) { + pa_log("Failed to parse module arguments."); + goto fail; + } + + if (!(master = pa_namereg_get(m->core, pa_modargs_get_value(ma, "master", NULL), PA_NAMEREG_SINK))) { + pa_log("Master sink not found"); + goto fail; + } + + ss = master->sample_spec; + sink_map = master->channel_map; + if (pa_modargs_get_sample_spec_and_channel_map(ma, &ss, &sink_map, PA_CHANNEL_MAP_DEFAULT) < 0) { + pa_log("Invalid sample format specification or channel map"); + goto fail; + } + + stream_map = sink_map; + if (pa_modargs_get_channel_map(ma, "master_channel_map", &stream_map) < 0) { + pa_log("Invalid master channel map"); + goto fail; + } + + if (stream_map.channels != ss.channels) { + pa_log("Number of channels doesn't match"); + goto fail; + } + + if (pa_channel_map_equal(&stream_map, &master->channel_map)) + pa_log_warn("No remapping configured, proceeding nonetheless!"); + + if (pa_modargs_get_value_boolean(ma, "remix", &remix) < 0) { + pa_log("Invalid boolean remix parameter"); + goto fail; + } + + u = pa_xnew0(struct userdata, 1); + u->module = m; + m->userdata = u; + + /* Create sink */ + pa_sink_new_data_init(&sink_data); + sink_data.driver = __FILE__; + sink_data.module = m; + if (!(sink_data.name = pa_xstrdup(pa_modargs_get_value(ma, "sink_name", NULL)))) + sink_data.name = pa_sprintf_malloc("%s.remapped", master->name); + pa_sink_new_data_set_sample_spec(&sink_data, &ss); + pa_sink_new_data_set_channel_map(&sink_data, &sink_map); + pa_proplist_sets(sink_data.proplist, PA_PROP_DEVICE_MASTER_DEVICE, master->name); + pa_proplist_sets(sink_data.proplist, PA_PROP_DEVICE_CLASS, "filter"); + + if (pa_modargs_get_proplist(ma, "sink_properties", sink_data.proplist, PA_UPDATE_REPLACE) < 0) { + pa_log("Invalid properties"); + pa_sink_new_data_done(&sink_data); + goto fail; + } + + if ((u->auto_desc = !pa_proplist_contains(sink_data.proplist, PA_PROP_DEVICE_DESCRIPTION))) { + const char *k; + + k = pa_proplist_gets(master->proplist, PA_PROP_DEVICE_DESCRIPTION); + pa_proplist_setf(sink_data.proplist, PA_PROP_DEVICE_DESCRIPTION, "Remapped %s", k ? k : master->name); + } + + u->sink = pa_sink_new(m->core, &sink_data, master->flags & (PA_SINK_LATENCY|PA_SINK_DYNAMIC_LATENCY)); + pa_sink_new_data_done(&sink_data); + + if (!u->sink) { + pa_log("Failed to create sink."); + goto fail; + } + + u->sink->parent.process_msg = sink_process_msg; + u->sink->set_state = sink_set_state; + u->sink->update_requested_latency = sink_update_requested_latency; + u->sink->request_rewind = sink_request_rewind; + u->sink->userdata = u; + + pa_sink_set_asyncmsgq(u->sink, master->asyncmsgq); + + /* Create sink input */ + pa_sink_input_new_data_init(&sink_input_data); + sink_input_data.driver = __FILE__; + sink_input_data.module = m; + sink_input_data.sink = master; + pa_proplist_sets(sink_input_data.proplist, PA_PROP_MEDIA_NAME, "Remapped Stream"); + pa_proplist_sets(sink_input_data.proplist, PA_PROP_MEDIA_ROLE, "filter"); + pa_sink_input_new_data_set_sample_spec(&sink_input_data, &ss); + pa_sink_input_new_data_set_channel_map(&sink_input_data, &stream_map); + sink_input_data.flags = (remix ? 0 : PA_SINK_INPUT_NO_REMIX); + + pa_sink_input_new(&u->sink_input, m->core, &sink_input_data); + pa_sink_input_new_data_done(&sink_input_data); + + if (!u->sink_input) + goto fail; + + u->sink_input->pop = sink_input_pop_cb; + u->sink_input->process_rewind = sink_input_process_rewind_cb; + u->sink_input->update_max_rewind = sink_input_update_max_rewind_cb; + u->sink_input->update_max_request = sink_input_update_max_request_cb; + u->sink_input->update_sink_latency_range = sink_input_update_sink_latency_range_cb; + u->sink_input->update_sink_fixed_latency = sink_input_update_sink_fixed_latency_cb; + u->sink_input->attach = sink_input_attach_cb; + u->sink_input->detach = sink_input_detach_cb; + u->sink_input->kill = sink_input_kill_cb; + u->sink_input->state_change = sink_input_state_change_cb; + u->sink_input->may_move_to = sink_input_may_move_to_cb; + u->sink_input->moving = sink_input_moving_cb; + u->sink_input->userdata = u; + + pa_sink_put(u->sink); + pa_sink_input_put(u->sink_input); + + pa_modargs_free(ma); + + return 0; + +fail: + if (ma) + pa_modargs_free(ma); + + pa__done(m); + + return -1; +} + +int pa__get_n_used(pa_module *m) { + struct userdata *u; + + pa_assert(m); + pa_assert_se(u = m->userdata); + + return pa_sink_linked_by(u->sink); +} + +void pa__done(pa_module*m) { + struct userdata *u; + + pa_assert(m); + + if (!(u = m->userdata)) + return; + + /* See comments in sink_input_kill_cb() above regarding + * destruction order! */ + + if (u->sink_input) + pa_sink_input_unlink(u->sink_input); + + if (u->sink) + pa_sink_unlink(u->sink); + + if (u->sink_input) + pa_sink_input_unref(u->sink_input); + + if (u->sink) + pa_sink_unref(u->sink); + + pa_xfree(u); +} diff --git a/src/modules/module-rescue-streams-symdef.h b/src/modules/module-rescue-streams-symdef.h new file mode 100644 index 0000000..c38bd1f --- /dev/null +++ b/src/modules/module-rescue-streams-symdef.h @@ -0,0 +1,29 @@ +#ifndef foomodulerescuestreamssymdeffoo +#define foomodulerescuestreamssymdeffoo + +#include +#include +#include + +#define pa__init module_rescue_streams_LTX_pa__init +#define pa__done module_rescue_streams_LTX_pa__done +#define pa__get_author module_rescue_streams_LTX_pa__get_author +#define pa__get_description module_rescue_streams_LTX_pa__get_description +#define pa__get_usage module_rescue_streams_LTX_pa__get_usage +#define pa__get_version module_rescue_streams_LTX_pa__get_version +#define pa__get_deprecated module_rescue_streams_LTX_pa__get_deprecated +#define pa__load_once module_rescue_streams_LTX_pa__load_once +#define pa__get_n_used module_rescue_streams_LTX_pa__get_n_used + +int pa__init(pa_module*m); +void pa__done(pa_module*m); +int pa__get_n_used(pa_module*m); + +const char* pa__get_author(void); +const char* pa__get_description(void); +const char* pa__get_usage(void); +const char* pa__get_version(void); +const char* pa__get_deprecated(void); +pa_bool_t pa__load_once(void); + +#endif diff --git a/src/modules/module-rescue-streams.c b/src/modules/module-rescue-streams.c new file mode 100644 index 0000000..722d84b --- /dev/null +++ b/src/modules/module-rescue-streams.c @@ -0,0 +1,277 @@ +/*** + This file is part of PulseAudio. + + Copyright 2006 Lennart Poettering + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "module-rescue-streams-symdef.h" + +PA_MODULE_AUTHOR("Lennart Poettering"); +PA_MODULE_DESCRIPTION("When a sink/source is removed, try to move their streams to the default sink/source"); +PA_MODULE_VERSION(PACKAGE_VERSION); +PA_MODULE_LOAD_ONCE(TRUE); + +static const char* const valid_modargs[] = { + NULL, +}; + +struct userdata { + pa_hook_slot + *sink_unlink_slot, + *source_unlink_slot, + *sink_input_move_fail_slot, + *source_output_move_fail_slot; +}; + +static pa_sink* find_evacuation_sink(pa_core *c, pa_sink_input *i, pa_sink *skip) { + pa_sink *target, *def; + uint32_t idx; + + pa_assert(c); + pa_assert(i); + + def = pa_namereg_get_default_sink(c); + + if (def && def != skip && pa_sink_input_may_move_to(i, def)) + return def; + + PA_IDXSET_FOREACH(target, c->sinks, idx) { + if (target == def) + continue; + + if (target == skip) + continue; + + if (!PA_SINK_IS_LINKED(pa_sink_get_state(target))) + continue; + + if (pa_sink_input_may_move_to(i, target)) + return target; + } + + pa_log_debug("No evacuation sink found."); + return NULL; +} + +static pa_hook_result_t sink_unlink_hook_callback(pa_core *c, pa_sink *sink, void* userdata) { + pa_sink_input *i; + uint32_t idx; + + pa_assert(c); + pa_assert(sink); + + /* There's no point in doing anything if the core is shut down anyway */ + if (c->state == PA_CORE_SHUTDOWN) + return PA_HOOK_OK; + + if (pa_idxset_size(sink->inputs) <= 0) { + pa_log_debug("No sink inputs to move away."); + return PA_HOOK_OK; + } + + PA_IDXSET_FOREACH(i, sink->inputs, idx) { + pa_sink *target; + + if (!(target = find_evacuation_sink(c, i, sink))) + continue; + + if (pa_sink_input_move_to(i, target, FALSE) < 0) + pa_log_info("Failed to move sink input %u \"%s\" to %s.", i->index, + pa_strnull(pa_proplist_gets(i->proplist, PA_PROP_APPLICATION_NAME)), target->name); + else + pa_log_info("Sucessfully moved sink input %u \"%s\" to %s.", i->index, + pa_strnull(pa_proplist_gets(i->proplist, PA_PROP_APPLICATION_NAME)), target->name); + } + + return PA_HOOK_OK; +} + +static pa_hook_result_t sink_input_move_fail_hook_callback(pa_core *c, pa_sink_input *i, void *userdata) { + pa_sink *target; + + pa_assert(c); + pa_assert(i); + + /* There's no point in doing anything if the core is shut down anyway */ + if (c->state == PA_CORE_SHUTDOWN) + return PA_HOOK_OK; + + if (!(target = find_evacuation_sink(c, i, NULL))) + return PA_HOOK_OK; + + if (pa_sink_input_finish_move(i, target, FALSE) < 0) { + pa_log_info("Failed to move sink input %u \"%s\" to %s.", i->index, + pa_strnull(pa_proplist_gets(i->proplist, PA_PROP_APPLICATION_NAME)), target->name); + return PA_HOOK_OK; + + } else { + pa_log_info("Sucessfully moved sink input %u \"%s\" to %s.", i->index, + pa_strnull(pa_proplist_gets(i->proplist, PA_PROP_APPLICATION_NAME)), target->name); + return PA_HOOK_STOP; + } +} + +static pa_source* find_evacuation_source(pa_core *c, pa_source_output *o, pa_source *skip) { + pa_source *target, *def; + uint32_t idx; + + pa_assert(c); + pa_assert(o); + + def = pa_namereg_get_default_source(c); + + if (def && def != skip && pa_source_output_may_move_to(o, def)) + return def; + + PA_IDXSET_FOREACH(target, c->sources, idx) { + if (target == def) + continue; + + if (target == skip) + continue; + + if (!target->monitor_of != !skip->monitor_of) + continue; + + if (!PA_SOURCE_IS_LINKED(pa_source_get_state(target))) + continue; + + if (pa_source_output_may_move_to(o, target)) + return target; + } + + pa_log_debug("No evacuation source found."); + return NULL; +} + +static pa_hook_result_t source_unlink_hook_callback(pa_core *c, pa_source *source, void* userdata) { + pa_source_output *o; + uint32_t idx; + + pa_assert(c); + pa_assert(source); + + /* There's no point in doing anything if the core is shut down anyway */ + if (c->state == PA_CORE_SHUTDOWN) + return PA_HOOK_OK; + + if (pa_idxset_size(source->outputs) <= 0) { + pa_log_debug("No source outputs to move away."); + return PA_HOOK_OK; + } + + PA_IDXSET_FOREACH(o, source->outputs, idx) { + pa_source *target; + + if (!(target = find_evacuation_source(c, o, source))) + continue; + + if (pa_source_output_move_to(o, target, FALSE) < 0) + pa_log_info("Failed to move source output %u \"%s\" to %s.", o->index, + pa_strnull(pa_proplist_gets(o->proplist, PA_PROP_APPLICATION_NAME)), target->name); + else + pa_log_info("Sucessfully moved source output %u \"%s\" to %s.", o->index, + pa_strnull(pa_proplist_gets(o->proplist, PA_PROP_APPLICATION_NAME)), target->name); + } + + return PA_HOOK_OK; +} + +static pa_hook_result_t source_output_move_fail_hook_callback(pa_core *c, pa_source_output *i, void *userdata) { + pa_source *target; + + pa_assert(c); + pa_assert(i); + + /* There's no point in doing anything if the core is shut down anyway */ + if (c->state == PA_CORE_SHUTDOWN) + return PA_HOOK_OK; + + if (!(target = find_evacuation_source(c, i, NULL))) + return PA_HOOK_OK; + + if (pa_source_output_finish_move(i, target, FALSE) < 0) { + pa_log_info("Failed to move source input %u \"%s\" to %s.", i->index, + pa_strnull(pa_proplist_gets(i->proplist, PA_PROP_APPLICATION_NAME)), target->name); + return PA_HOOK_OK; + + } else { + pa_log_info("Sucessfully moved source input %u \"%s\" to %s.", i->index, + pa_strnull(pa_proplist_gets(i->proplist, PA_PROP_APPLICATION_NAME)), target->name); + return PA_HOOK_STOP; + } +} + +int pa__init(pa_module*m) { + pa_modargs *ma; + struct userdata *u; + + pa_assert(m); + + if (!(ma = pa_modargs_new(m->argument, valid_modargs))) { + pa_log("Failed to parse module arguments"); + return -1; + } + + m->userdata = u = pa_xnew(struct userdata, 1); + + /* A little bit later than module-stream-restore, module-intended-roles... */ + u->sink_unlink_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_UNLINK], PA_HOOK_LATE+20, (pa_hook_cb_t) sink_unlink_hook_callback, u); + u->source_unlink_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SOURCE_UNLINK], PA_HOOK_LATE+20, (pa_hook_cb_t) source_unlink_hook_callback, u); + + u->sink_input_move_fail_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_INPUT_MOVE_FAIL], PA_HOOK_LATE+20, (pa_hook_cb_t) sink_input_move_fail_hook_callback, u); + u->source_output_move_fail_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SOURCE_OUTPUT_MOVE_FAIL], PA_HOOK_LATE+20, (pa_hook_cb_t) source_output_move_fail_hook_callback, u); + + pa_modargs_free(ma); + return 0; +} + +void pa__done(pa_module*m) { + struct userdata *u; + + pa_assert(m); + + if (!(u = m->userdata)) + return; + + if (u->sink_unlink_slot) + pa_hook_slot_free(u->sink_unlink_slot); + if (u->source_unlink_slot) + pa_hook_slot_free(u->source_unlink_slot); + + if (u->sink_input_move_fail_slot) + pa_hook_slot_free(u->sink_input_move_fail_slot); + if (u->source_output_move_fail_slot) + pa_hook_slot_free(u->source_output_move_fail_slot); + + pa_xfree(u); +} diff --git a/src/modules/module-rygel-media-server-symdef.h b/src/modules/module-rygel-media-server-symdef.h new file mode 100644 index 0000000..8645fa6 --- /dev/null +++ b/src/modules/module-rygel-media-server-symdef.h @@ -0,0 +1,29 @@ +#ifndef foomodulerygelmediaserversymdeffoo +#define foomodulerygelmediaserversymdeffoo + +#include +#include +#include + +#define pa__init module_rygel_media_server_LTX_pa__init +#define pa__done module_rygel_media_server_LTX_pa__done +#define pa__get_author module_rygel_media_server_LTX_pa__get_author +#define pa__get_description module_rygel_media_server_LTX_pa__get_description +#define pa__get_usage module_rygel_media_server_LTX_pa__get_usage +#define pa__get_version module_rygel_media_server_LTX_pa__get_version +#define pa__get_deprecated module_rygel_media_server_LTX_pa__get_deprecated +#define pa__load_once module_rygel_media_server_LTX_pa__load_once +#define pa__get_n_used module_rygel_media_server_LTX_pa__get_n_used + +int pa__init(pa_module*m); +void pa__done(pa_module*m); +int pa__get_n_used(pa_module*m); + +const char* pa__get_author(void); +const char* pa__get_description(void); +const char* pa__get_usage(void); +const char* pa__get_version(void); +const char* pa__get_deprecated(void); +pa_bool_t pa__load_once(void); + +#endif diff --git a/src/modules/module-rygel-media-server.c b/src/modules/module-rygel-media-server.c new file mode 100644 index 0000000..82bcd14 --- /dev/null +++ b/src/modules/module-rygel-media-server.c @@ -0,0 +1,870 @@ +/*** + This file is part of PulseAudio. + + Copyright 2005-2009 Lennart Poettering + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "module-rygel-media-server-symdef.h" + +PA_MODULE_AUTHOR("Lennart Poettering"); +PA_MODULE_DESCRIPTION("UPnP MediaServer Plugin for Rygel"); +PA_MODULE_VERSION(PACKAGE_VERSION); +PA_MODULE_LOAD_ONCE(TRUE); +PA_MODULE_USAGE( + "display_name="); + +/* This implements http://live.gnome.org/Rygel/MediaServerSpec */ + +#define SERVICE_NAME "org.gnome.UPnP.MediaServer1.PulseAudio" + +#define OBJECT_ROOT "/org/gnome/UPnP/MediaServer1/PulseAudio" +#define OBJECT_SINKS "/org/gnome/UPnP/MediaServer1/PulseAudio/Sinks" +#define OBJECT_SOURCES "/org/gnome/UPnP/MediaServer1/PulseAudio/Sources" + +#define CONTAINER_INTROSPECT_XML_PREFIX \ + DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE \ + "" \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " + +#define CONTAINER_INTROSPECT_XML_POSTFIX \ + "" + +#define ROOT_INTROSPECT_XML \ + CONTAINER_INTROSPECT_XML_PREFIX \ + "" \ + "" \ + CONTAINER_INTROSPECT_XML_POSTFIX + +#define ITEM_INTROSPECT_XML \ + DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE \ + "" \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + "" + + +static const char* const valid_modargs[] = { + "display_name", + NULL +}; + +struct userdata { + pa_core *core; + pa_module *module; + + pa_dbus_connection *bus; + pa_bool_t got_name:1; + + char *display_name; + + pa_hook_slot *source_new_slot, *source_unlink_slot; + + pa_http_protocol *http; +}; + +static void send_signal(struct userdata *u, pa_source *s) { + DBusMessage *m; + const char *parent; + + pa_assert(u); + pa_source_assert_ref(s); + + if (u->core->state == PA_CORE_SHUTDOWN) + return; + + if (s->monitor_of) + parent = OBJECT_SINKS; + else + parent = OBJECT_SOURCES; + + pa_assert_se(m = dbus_message_new_signal(parent, "org.gnome.UPnP.MediaContainer1", "Updated")); + pa_assert_se(dbus_connection_send(pa_dbus_connection_get(u->bus), m, NULL)); + + dbus_message_unref(m); +} + +static pa_hook_result_t source_new_or_unlink_cb(pa_core *c, pa_source *s, struct userdata *u) { + pa_assert(c); + pa_source_assert_ref(s); + + send_signal(u, s); + + return PA_HOOK_OK; +} + +static pa_bool_t message_is_property_get(DBusMessage *m, const char *interface, const char *property) { + const char *i, *p; + DBusError error; + + dbus_error_init(&error); + + pa_assert(m); + + if (!dbus_message_is_method_call(m, "org.freedesktop.DBus.Properties", "Get")) + return FALSE; + + if (!dbus_message_get_args(m, &error, DBUS_TYPE_STRING, &i, DBUS_TYPE_STRING, &p, DBUS_TYPE_INVALID) || dbus_error_is_set(&error)) { + dbus_error_free(&error); + return FALSE; + } + + return pa_streq(i, interface) && pa_streq(p, property); +} + +static pa_bool_t message_is_property_get_all(DBusMessage *m, const char *interface) { + const char *i; + DBusError error; + + dbus_error_init(&error); + + pa_assert(m); + + if (!dbus_message_is_method_call(m, "org.freedesktop.DBus.Properties", "GetAll")) + return FALSE; + + if (!dbus_message_get_args(m, &error, DBUS_TYPE_STRING, &i, DBUS_TYPE_INVALID) || dbus_error_is_set(&error)) { + dbus_error_free(&error); + return FALSE; + } + + return pa_streq(i, interface); +} + +static void append_variant_object_array(DBusMessage *m, DBusMessageIter *iter, const char *path[], unsigned n) { + DBusMessageIter _iter, variant, array; + unsigned c; + + pa_assert(m); + pa_assert(path); + + if (!iter) { + dbus_message_iter_init_append(m, &_iter); + iter = &_iter; + } + + pa_assert_se(dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, "ao", &variant)); + pa_assert_se(dbus_message_iter_open_container(&variant, DBUS_TYPE_ARRAY, "o", &array)); + + for (c = 0; c < n; c++) + pa_assert_se(dbus_message_iter_append_basic(&array, DBUS_TYPE_OBJECT_PATH, path + c)); + + pa_assert_se(dbus_message_iter_close_container(&variant, &array)); + pa_assert_se(dbus_message_iter_close_container(iter, &variant)); +} + +static void append_variant_string(DBusMessage *m, DBusMessageIter *iter, const char *s) { + DBusMessageIter _iter, sub; + + pa_assert(m); + pa_assert(s); + + if (!iter) { + dbus_message_iter_init_append(m, &_iter); + iter = &_iter; + } + + pa_assert_se(dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, "s", &sub)); + pa_assert_se(dbus_message_iter_append_basic(&sub, DBUS_TYPE_STRING, &s)); + pa_assert_se(dbus_message_iter_close_container(iter, &sub)); +} + +static void append_variant_object(DBusMessage *m, DBusMessageIter *iter, const char *s) { + DBusMessageIter _iter, sub; + + pa_assert(m); + pa_assert(s); + + if (!iter) { + dbus_message_iter_init_append(m, &_iter); + iter = &_iter; + } + + pa_assert_se(dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, "o", &sub)); + pa_assert_se(dbus_message_iter_append_basic(&sub, DBUS_TYPE_OBJECT_PATH, &s)); + pa_assert_se(dbus_message_iter_close_container(iter, &sub)); +} + +static void append_variant_unsigned(DBusMessage *m, DBusMessageIter *iter, unsigned u) { + DBusMessageIter _iter, sub; + + pa_assert(m); + + if (!iter) { + dbus_message_iter_init_append(m, &_iter); + iter = &_iter; + } + + pa_assert_se(dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, "u", &sub)); + pa_assert_se(dbus_message_iter_append_basic(&sub, DBUS_TYPE_UINT32, &u)); + pa_assert_se(dbus_message_iter_close_container(iter, &sub)); +} + +static void append_property_dict_entry_object_array(DBusMessage *m, DBusMessageIter *iter, const char *name, const char *path[], unsigned n) { + DBusMessageIter sub; + + pa_assert(iter); + + pa_assert_se(dbus_message_iter_open_container(iter, DBUS_TYPE_DICT_ENTRY, NULL, &sub)); + pa_assert_se(dbus_message_iter_append_basic(&sub, DBUS_TYPE_STRING, &name)); + append_variant_object_array(m, &sub, path, n); + pa_assert_se(dbus_message_iter_close_container(iter, &sub)); +} + +static void append_property_dict_entry_string(DBusMessage *m, DBusMessageIter *iter, const char *name, const char *value) { + DBusMessageIter sub; + + pa_assert(iter); + + pa_assert_se(dbus_message_iter_open_container(iter, DBUS_TYPE_DICT_ENTRY, NULL, &sub)); + pa_assert_se(dbus_message_iter_append_basic(&sub, DBUS_TYPE_STRING, &name)); + append_variant_string(m, &sub, value); + pa_assert_se(dbus_message_iter_close_container(iter, &sub)); +} + +static void append_property_dict_entry_object(DBusMessage *m, DBusMessageIter *iter, const char *name, const char *value) { + DBusMessageIter sub; + + pa_assert(iter); + + pa_assert_se(dbus_message_iter_open_container(iter, DBUS_TYPE_DICT_ENTRY, NULL, &sub)); + pa_assert_se(dbus_message_iter_append_basic(&sub, DBUS_TYPE_STRING, &name)); + append_variant_object(m, &sub, value); + pa_assert_se(dbus_message_iter_close_container(iter, &sub)); +} + +static void append_property_dict_entry_unsigned(DBusMessage *m, DBusMessageIter *iter, const char *name, unsigned u) { + DBusMessageIter sub; + + pa_assert(iter); + + pa_assert_se(dbus_message_iter_open_container(iter, DBUS_TYPE_DICT_ENTRY, NULL, &sub)); + pa_assert_se(dbus_message_iter_append_basic(&sub, DBUS_TYPE_STRING, &name)); + append_variant_unsigned(m, &sub, u); + pa_assert_se(dbus_message_iter_close_container(iter, &sub)); +} + +static const char *array_root_containers[] = { OBJECT_SINKS, OBJECT_SOURCES }; +static const char *array_no_children[] = { }; + +static DBusHandlerResult root_handler(DBusConnection *c, DBusMessage *m, void *userdata) { + struct userdata *u = userdata; + DBusMessage *r = NULL; + + pa_assert(u); + + if (message_is_property_get(m, "org.gnome.UPnP.MediaContainer1", "Containers")) { + pa_assert_se(r = dbus_message_new_method_return(m)); + append_variant_object_array(r, NULL, (const char**) array_root_containers, PA_ELEMENTSOF(array_root_containers)); + + } else if (message_is_property_get(m, "org.gnome.UPnP.MediaContainer1", "ContainerCount")) { + pa_assert_se(r = dbus_message_new_method_return(m)); + append_variant_unsigned(r, NULL, PA_ELEMENTSOF(array_root_containers)); + + } else if (message_is_property_get(m, "org.gnome.UPnP.MediaContainer1", "Items")) { + pa_assert_se(r = dbus_message_new_method_return(m)); + append_variant_object_array(r, NULL, array_no_children, PA_ELEMENTSOF(array_no_children)); + + } else if (message_is_property_get(m, "org.gnome.UPnP.MediaContainer1", "ItemCount")) { + pa_assert_se(r = dbus_message_new_method_return(m)); + append_variant_unsigned(r, NULL, PA_ELEMENTSOF(array_no_children)); + + } else if (message_is_property_get_all(m, "org.gnome.UPnP.MediaContainer1")) { + DBusMessageIter iter, sub; + + pa_assert_se(r = dbus_message_new_method_return(m)); + dbus_message_iter_init_append(r, &iter); + + pa_assert_se(dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "{sv}", &sub)); + append_property_dict_entry_object_array(r, &sub, "Containers", array_root_containers, PA_ELEMENTSOF(array_root_containers)); + append_property_dict_entry_unsigned(r, &sub, "ContainerCount", PA_ELEMENTSOF(array_root_containers)); + append_property_dict_entry_object_array(r, &sub, "Items", array_no_children, PA_ELEMENTSOF(array_no_children)); + append_property_dict_entry_unsigned(r, &sub, "ItemCount", PA_ELEMENTSOF(array_no_children)); + pa_assert_se(dbus_message_iter_close_container(&iter, &sub)); + + } else if (message_is_property_get(m, "org.gnome.UPnP.MediaObject1", "Parent")) { + pa_assert_se(r = dbus_message_new_method_return(m)); + append_variant_object(r, NULL, OBJECT_ROOT); + + } else if (message_is_property_get(m, "org.gnome.UPnP.MediaObject1", "DisplayName")) { + pa_assert_se(r = dbus_message_new_method_return(m)); + append_variant_string(r, NULL, u->display_name); + + } else if (message_is_property_get_all(m, "org.gnome.UPnP.MediaObject1")) { + DBusMessageIter iter, sub; + + pa_assert_se(r = dbus_message_new_method_return(m)); + dbus_message_iter_init_append(r, &iter); + + pa_assert_se(dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "{sv}", &sub)); + append_property_dict_entry_string(r, &sub, "DisplayName", u->display_name); + pa_assert_se(dbus_message_iter_close_container(&iter, &sub)); + + } else if (dbus_message_is_method_call(m, "org.freedesktop.DBus.Introspectable", "Introspect")) { + const char *xml = ROOT_INTROSPECT_XML; + + pa_assert_se(r = dbus_message_new_method_return(m)); + pa_assert_se(dbus_message_append_args( + r, + DBUS_TYPE_STRING, &xml, + DBUS_TYPE_INVALID)); + + } else + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + + if (r) { + pa_assert_se(dbus_connection_send(pa_dbus_connection_get(u->bus), r, NULL)); + dbus_message_unref(r); + } + + return DBUS_HANDLER_RESULT_HANDLED; +} + +static char *compute_url(struct userdata *u, const char *name) { + pa_strlist *i; + + pa_assert(u); + pa_assert(name); + + for (i = pa_http_protocol_servers(u->http); i; i = pa_strlist_next(i)) { + pa_parsed_address a; + + if (pa_parse_address(pa_strlist_data(i), &a) >= 0 && + (a.type == PA_PARSED_ADDRESS_TCP4 || + a.type == PA_PARSED_ADDRESS_TCP6 || + a.type == PA_PARSED_ADDRESS_TCP_AUTO)) { + + const char *address; + char *s; + + if (pa_is_ip_address(a.path_or_host)) + address = a.path_or_host; + else + address = "@ADDRESS@"; + + if (a.port <= 0) + a.port = 4714; + + s = pa_sprintf_malloc("http://%s:%u/listen/source/%s", address, a.port, name); + + pa_xfree(a.path_or_host); + return s; + } + + pa_xfree(a.path_or_host); + } + + return pa_sprintf_malloc("http://@ADDRESS@:4714/listen/source/%s", name); +} + +static char **child_array(struct userdata *u, const char *path, unsigned *n) { + unsigned m; + uint32_t idx; + char **array; + + pa_assert(u); + pa_assert(path); + pa_assert(n); + + if (pa_streq(path, OBJECT_SINKS)) + m = pa_idxset_size(u->core->sinks); + else { + unsigned k; + + m = pa_idxset_size(u->core->sources); + k = pa_idxset_size(u->core->sinks); + + pa_assert(m >= k); + + /* Subtract the monitor sources from the numbers of + * sources. There is one monitor source for each sink */ + m -= k; + } + + array = pa_xnew(char*, m); + *n = 0; + + if (pa_streq(path, OBJECT_SINKS)) { + pa_sink *sink; + + PA_IDXSET_FOREACH(sink, u->core->sinks, idx) { + pa_assert((*n) < m); + array[(*n)++] = pa_sprintf_malloc(OBJECT_SINKS "/%u", sink->index); + } + } else { + pa_source *source; + + PA_IDXSET_FOREACH(source, u->core->sources, idx) { + + if (!source->monitor_of) { + pa_assert((*n) < m); + array[(*n)++] = pa_sprintf_malloc(OBJECT_SOURCES "/%u", source->index); + } + } + } + + pa_assert((*n) <= m); + + return array; +} + +static void free_child_array(char **array, unsigned n) { + + for (; n >= 1; n--) + pa_xfree(array[n-1]); + + pa_xfree(array); +} + +static DBusHandlerResult sinks_and_sources_handler(DBusConnection *c, DBusMessage *m, void *userdata) { + struct userdata *u = userdata; + DBusMessage *r = NULL; + const char *path; + + pa_assert(u); + + path = dbus_message_get_path(m); + + if (pa_streq(path, OBJECT_SINKS) || pa_streq(path, OBJECT_SOURCES)) { + + /* Container nodes */ + + if (message_is_property_get(m, "org.gnome.UPnP.MediaContainer1", "Containers")) { + pa_assert_se(r = dbus_message_new_method_return(m)); + append_variant_object_array(r, NULL, array_no_children, PA_ELEMENTSOF(array_no_children)); + + } else if (message_is_property_get(m, "org.gnome.UPnP.MediaContainer1", "ContainerCount")) { + pa_assert_se(r = dbus_message_new_method_return(m)); + append_variant_unsigned(r, NULL, PA_ELEMENTSOF(array_no_children)); + + } else if (message_is_property_get(m, "org.gnome.UPnP.MediaContainer1", "Items")) { + char ** array; + unsigned n; + + array = child_array(u, path, &n); + + pa_assert_se(r = dbus_message_new_method_return(m)); + append_variant_object_array(r, NULL, (const char**) array, n); + + free_child_array(array, n); + + } else if (message_is_property_get(m, "org.gnome.UPnP.MediaContainer1", "ItemCount")) { + unsigned n, k; + + n = pa_idxset_size(u->core->sinks); + k = pa_idxset_size(u->core->sources); + pa_assert(k >= n); + + pa_assert_se(r = dbus_message_new_method_return(m)); + append_variant_unsigned(r, NULL, + pa_streq(path, OBJECT_SINKS) ? n : k - n); + + } else if (message_is_property_get_all(m, "org.gnome.UPnP.MediaContainer1")) { + DBusMessageIter iter, sub; + char **array; + unsigned n, k; + + pa_assert_se(r = dbus_message_new_method_return(m)); + dbus_message_iter_init_append(r, &iter); + + pa_assert_se(dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "{sv}", &sub)); + append_property_dict_entry_object_array(r, &sub, "Containers", array_no_children, PA_ELEMENTSOF(array_no_children)); + append_property_dict_entry_unsigned(r, &sub, "ContainerCount", 0); + + array = child_array(u, path, &n); + append_property_dict_entry_object_array(r, &sub, "Items", (const char**) array, n); + free_child_array(array, n); + + n = pa_idxset_size(u->core->sinks); + k = pa_idxset_size(u->core->sources); + pa_assert(k >= n); + + append_property_dict_entry_unsigned(r, &sub, "ItemCount", + pa_streq(path, OBJECT_SINKS) ? n : k - n); + + pa_assert_se(dbus_message_iter_close_container(&iter, &sub)); + + } else if (message_is_property_get(m, "org.gnome.UPnP.MediaObject1", "Parent")) { + pa_assert_se(r = dbus_message_new_method_return(m)); + append_variant_object(r, NULL, OBJECT_ROOT); + + } else if (message_is_property_get(m, "org.gnome.UPnP.MediaObject1", "DisplayName")) { + pa_assert_se(r = dbus_message_new_method_return(m)); + append_variant_string(r, + NULL, + pa_streq(path, OBJECT_SINKS) ? + _("Output Devices") : + _("Input Devices")); + + } else if (message_is_property_get_all(m, "org.gnome.UPnP.MediaObject1")) { + DBusMessageIter iter, sub; + + pa_assert_se(r = dbus_message_new_method_return(m)); + + dbus_message_iter_init_append(r, &iter); + + pa_assert_se(dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "{sv}", &sub)); + append_property_dict_entry_object(m, &sub, "Parent", OBJECT_ROOT); + append_property_dict_entry_string(m, &sub, "DisplayName", + pa_streq(path, OBJECT_SINKS) ? + _("Output Devices") : + _("Input Devices")); + pa_assert_se(dbus_message_iter_close_container(&iter, &sub)); + + } else if (dbus_message_is_method_call(m, "org.freedesktop.DBus.Introspectable", "Introspect")) { + pa_strbuf *sb; + char *xml; + uint32_t idx; + + sb = pa_strbuf_new(); + pa_strbuf_puts(sb, CONTAINER_INTROSPECT_XML_PREFIX); + + if (pa_streq(path, OBJECT_SINKS)) { + pa_sink *sink; + + PA_IDXSET_FOREACH(sink, u->core->sinks, idx) + pa_strbuf_printf(sb, "", sink->index); + } else { + pa_source *source; + + PA_IDXSET_FOREACH(source, u->core->sources, idx) + if (!source->monitor_of) + pa_strbuf_printf(sb, "", source->index); + } + + pa_strbuf_puts(sb, CONTAINER_INTROSPECT_XML_POSTFIX); + xml = pa_strbuf_tostring_free(sb); + + pa_assert_se(r = dbus_message_new_method_return(m)); + pa_assert_se(dbus_message_append_args( + r, + DBUS_TYPE_STRING, &xml, + DBUS_TYPE_INVALID)); + + pa_xfree(xml); + } else + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + + } else { + pa_sink *sink = NULL; + pa_source *source = NULL; + + /* Child nodes */ + + if (pa_startswith(path, OBJECT_SINKS "/")) + sink = pa_namereg_get(u->core, path + sizeof(OBJECT_SINKS), PA_NAMEREG_SINK); + else if (pa_startswith(path, OBJECT_SOURCES "/")) + source = pa_namereg_get(u->core, path + sizeof(OBJECT_SOURCES), PA_NAMEREG_SOURCE); + + if (!sink && !source) + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + + if (message_is_property_get(m, "org.gnome.UPnP.MediaObject1", "Parent")) { + pa_assert_se(r = dbus_message_new_method_return(m)); + append_variant_object(r, NULL, sink ? OBJECT_SINKS : OBJECT_SOURCES); + + } else if (message_is_property_get(m, "org.gnome.UPnP.MediaObject1", "DisplayName")) { + pa_assert_se(r = dbus_message_new_method_return(m)); + append_variant_string(r, NULL, pa_strna(pa_proplist_gets(sink ? sink->proplist : source->proplist, PA_PROP_DEVICE_DESCRIPTION))); + + } else if (message_is_property_get_all(m, "org.gnome.UPnP.MediaObject1")) { + DBusMessageIter iter, sub; + + pa_assert_se(r = dbus_message_new_method_return(m)); + dbus_message_iter_init_append(r, &iter); + + pa_assert_se(dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "{sv}", &sub)); + append_property_dict_entry_object(r, &sub, "Parent", sink ? OBJECT_SINKS : OBJECT_SOURCES); + append_property_dict_entry_string(r, &sub, "DisplayName", pa_strna(pa_proplist_gets(sink ? sink->proplist : source->proplist, PA_PROP_DEVICE_DESCRIPTION))); + pa_assert_se(dbus_message_iter_close_container(&iter, &sub)); + + } else if (message_is_property_get(m, "org.gnome.UPnP.MediaItem1", "Type")) { + pa_assert_se(r = dbus_message_new_method_return(m)); + append_variant_string(r, NULL, "audio"); + + } else if (message_is_property_get(m, "org.gnome.UPnP.MediaItem1", "MIMEType")) { + char *t; + + if (sink) + t = pa_sample_spec_to_mime_type_mimefy(&sink->sample_spec, &sink->channel_map); + else + t = pa_sample_spec_to_mime_type_mimefy(&source->sample_spec, &source->channel_map); + + pa_assert_se(r = dbus_message_new_method_return(m)); + append_variant_string(r, NULL, t); + pa_xfree(t); + + } else if (message_is_property_get(m, "org.gnome.UPnP.MediaItem1", "URLs")) { + DBusMessageIter iter, sub, array; + char *url; + + pa_assert_se(r = dbus_message_new_method_return(m)); + + dbus_message_iter_init_append(r, &iter); + + url = compute_url(u, sink ? sink->monitor_source->name : source->name); + + pa_assert_se(dbus_message_iter_open_container(&iter, DBUS_TYPE_VARIANT, "as", &sub)); + pa_assert_se(dbus_message_iter_open_container(&sub, DBUS_TYPE_ARRAY, "s", &array)); + pa_assert_se(dbus_message_iter_append_basic(&array, DBUS_TYPE_STRING, &url)); + pa_assert_se(dbus_message_iter_close_container(&sub, &array)); + pa_assert_se(dbus_message_iter_close_container(&iter, &sub)); + + pa_xfree(url); + + } else if (message_is_property_get_all(m, "org.gnome.UPnP.MediaItem1")) { + DBusMessageIter iter, sub, dict, variant, array; + char *url, *t; + const char *un = "URLs"; + + pa_assert_se(r = dbus_message_new_method_return(m)); + dbus_message_iter_init_append(r, &iter); + + pa_assert_se(dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "{sv}", &sub)); + append_property_dict_entry_string(r, &sub, "Type", "audio"); + + if (sink) + t = pa_sample_spec_to_mime_type_mimefy(&sink->sample_spec, &sink->channel_map); + else + t = pa_sample_spec_to_mime_type_mimefy(&source->sample_spec, &source->channel_map); + + append_property_dict_entry_string(r, &sub, "MIMEType", t); + pa_xfree(t); + + pa_assert_se(dbus_message_iter_open_container(&sub, DBUS_TYPE_DICT_ENTRY, NULL, &dict)); + pa_assert_se(dbus_message_iter_append_basic(&dict, DBUS_TYPE_STRING, &un)); + + url = compute_url(u, sink ? sink->monitor_source->name : source->name); + + pa_assert_se(dbus_message_iter_open_container(&dict, DBUS_TYPE_VARIANT, "as", &variant)); + pa_assert_se(dbus_message_iter_open_container(&variant, DBUS_TYPE_ARRAY, "s", &array)); + pa_assert_se(dbus_message_iter_append_basic(&array, DBUS_TYPE_STRING, &url)); + pa_assert_se(dbus_message_iter_close_container(&variant, &array)); + pa_assert_se(dbus_message_iter_close_container(&dict, &variant)); + pa_assert_se(dbus_message_iter_close_container(&sub, &dict)); + + pa_xfree(url); + + pa_assert_se(dbus_message_iter_close_container(&iter, &sub)); + + } else if (dbus_message_is_method_call(m, "org.freedesktop.DBus.Introspectable", "Introspect")) { + const char *xml = + ITEM_INTROSPECT_XML; + + pa_assert_se(r = dbus_message_new_method_return(m)); + pa_assert_se(dbus_message_append_args( + r, + DBUS_TYPE_STRING, &xml, + DBUS_TYPE_INVALID)); + + } else + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + } + + if (r) { + pa_assert_se(dbus_connection_send(pa_dbus_connection_get(u->bus), r, NULL)); + dbus_message_unref(r); + } + + return DBUS_HANDLER_RESULT_HANDLED; +} + +int pa__init(pa_module *m) { + + struct userdata *u; + pa_modargs *ma = NULL; + DBusError error; + const char *t; + + static const DBusObjectPathVTable vtable_root = { + .message_function = root_handler, + }; + static const DBusObjectPathVTable vtable_sinks_and_sources = { + .message_function = sinks_and_sources_handler, + }; + + dbus_error_init(&error); + + if (!(ma = pa_modargs_new(m->argument, valid_modargs))) { + pa_log("Failed to parse module arguments."); + goto fail; + } + + m->userdata = u = pa_xnew0(struct userdata, 1); + u->core = m->core; + u->module = m; + u->http = pa_http_protocol_get(u->core); + + if ((t = pa_modargs_get_value(ma, "display_name", NULL))) + u->display_name = pa_utf8_filter(t); + else + u->display_name = pa_xstrdup(_("Audio on @HOSTNAME@")); + + u->source_new_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SOURCE_PUT], PA_HOOK_LATE, (pa_hook_cb_t) source_new_or_unlink_cb, u); + u->source_unlink_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SOURCE_UNLINK], PA_HOOK_LATE, (pa_hook_cb_t) source_new_or_unlink_cb, u); + + if (!(u->bus = pa_dbus_bus_get(m->core, DBUS_BUS_SESSION, &error))) { + pa_log("Failed to get session bus connection: %s", error.message); + goto fail; + } + + pa_assert_se(dbus_connection_register_object_path(pa_dbus_connection_get(u->bus), OBJECT_ROOT, &vtable_root, u)); + pa_assert_se(dbus_connection_register_fallback(pa_dbus_connection_get(u->bus), OBJECT_SINKS, &vtable_sinks_and_sources, u)); + pa_assert_se(dbus_connection_register_fallback(pa_dbus_connection_get(u->bus), OBJECT_SOURCES, &vtable_sinks_and_sources, u)); + + if (dbus_bus_request_name(pa_dbus_connection_get(u->bus), SERVICE_NAME, DBUS_NAME_FLAG_DO_NOT_QUEUE, &error) != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) { + pa_log("Failed to request service name " SERVICE_NAME ": %s", error.message); + goto fail; + } + + u->got_name = TRUE; + + pa_modargs_free(ma); + + return 0; + +fail: + pa__done(m); + + if (ma) + pa_modargs_free(ma); + + dbus_error_free(&error); + + return -1; +} + +void pa__done(pa_module*m) { + struct userdata*u; + pa_assert(m); + + if (!(u = m->userdata)) + return; + + if (u->source_new_slot) + pa_hook_slot_free(u->source_new_slot); + if (u->source_unlink_slot) + pa_hook_slot_free(u->source_unlink_slot); + + if (u->bus) { + DBusError error; + + dbus_error_init(&error); + + dbus_connection_unregister_object_path(pa_dbus_connection_get(u->bus), OBJECT_ROOT); + dbus_connection_unregister_object_path(pa_dbus_connection_get(u->bus), OBJECT_SINKS); + dbus_connection_unregister_object_path(pa_dbus_connection_get(u->bus), OBJECT_SOURCES); + + if (u->got_name) { + if (dbus_bus_release_name(pa_dbus_connection_get(u->bus), SERVICE_NAME, &error) != DBUS_RELEASE_NAME_REPLY_RELEASED) { + pa_log("Failed to release service name " SERVICE_NAME ": %s", error.message); + dbus_error_free(&error); + } + } + + pa_dbus_connection_unref(u->bus); + } + + pa_xfree(u->display_name); + + if (u->http) + pa_http_protocol_unref(u->http); + + pa_xfree(u); +} diff --git a/src/modules/module-simple-protocol-tcp-symdef.h b/src/modules/module-simple-protocol-tcp-symdef.h new file mode 100644 index 0000000..3fcef40 --- /dev/null +++ b/src/modules/module-simple-protocol-tcp-symdef.h @@ -0,0 +1,29 @@ +#ifndef foomodulesimpleprotocoltcpsymdeffoo +#define foomodulesimpleprotocoltcpsymdeffoo + +#include +#include +#include + +#define pa__init module_simple_protocol_tcp_LTX_pa__init +#define pa__done module_simple_protocol_tcp_LTX_pa__done +#define pa__get_author module_simple_protocol_tcp_LTX_pa__get_author +#define pa__get_description module_simple_protocol_tcp_LTX_pa__get_description +#define pa__get_usage module_simple_protocol_tcp_LTX_pa__get_usage +#define pa__get_version module_simple_protocol_tcp_LTX_pa__get_version +#define pa__get_deprecated module_simple_protocol_tcp_LTX_pa__get_deprecated +#define pa__load_once module_simple_protocol_tcp_LTX_pa__load_once +#define pa__get_n_used module_simple_protocol_tcp_LTX_pa__get_n_used + +int pa__init(pa_module*m); +void pa__done(pa_module*m); +int pa__get_n_used(pa_module*m); + +const char* pa__get_author(void); +const char* pa__get_description(void); +const char* pa__get_usage(void); +const char* pa__get_version(void); +const char* pa__get_deprecated(void); +pa_bool_t pa__load_once(void); + +#endif diff --git a/src/modules/module-simple-protocol-unix-symdef.h b/src/modules/module-simple-protocol-unix-symdef.h new file mode 100644 index 0000000..5f30433 --- /dev/null +++ b/src/modules/module-simple-protocol-unix-symdef.h @@ -0,0 +1,29 @@ +#ifndef foomodulesimpleprotocolunixsymdeffoo +#define foomodulesimpleprotocolunixsymdeffoo + +#include +#include +#include + +#define pa__init module_simple_protocol_unix_LTX_pa__init +#define pa__done module_simple_protocol_unix_LTX_pa__done +#define pa__get_author module_simple_protocol_unix_LTX_pa__get_author +#define pa__get_description module_simple_protocol_unix_LTX_pa__get_description +#define pa__get_usage module_simple_protocol_unix_LTX_pa__get_usage +#define pa__get_version module_simple_protocol_unix_LTX_pa__get_version +#define pa__get_deprecated module_simple_protocol_unix_LTX_pa__get_deprecated +#define pa__load_once module_simple_protocol_unix_LTX_pa__load_once +#define pa__get_n_used module_simple_protocol_unix_LTX_pa__get_n_used + +int pa__init(pa_module*m); +void pa__done(pa_module*m); +int pa__get_n_used(pa_module*m); + +const char* pa__get_author(void); +const char* pa__get_description(void); +const char* pa__get_usage(void); +const char* pa__get_version(void); +const char* pa__get_deprecated(void); +pa_bool_t pa__load_once(void); + +#endif diff --git a/src/modules/module-sine-source-symdef.h b/src/modules/module-sine-source-symdef.h new file mode 100644 index 0000000..f35f742 --- /dev/null +++ b/src/modules/module-sine-source-symdef.h @@ -0,0 +1,29 @@ +#ifndef foomodulesinesourcesymdeffoo +#define foomodulesinesourcesymdeffoo + +#include +#include +#include + +#define pa__init module_sine_source_LTX_pa__init +#define pa__done module_sine_source_LTX_pa__done +#define pa__get_author module_sine_source_LTX_pa__get_author +#define pa__get_description module_sine_source_LTX_pa__get_description +#define pa__get_usage module_sine_source_LTX_pa__get_usage +#define pa__get_version module_sine_source_LTX_pa__get_version +#define pa__get_deprecated module_sine_source_LTX_pa__get_deprecated +#define pa__load_once module_sine_source_LTX_pa__load_once +#define pa__get_n_used module_sine_source_LTX_pa__get_n_used + +int pa__init(pa_module*m); +void pa__done(pa_module*m); +int pa__get_n_used(pa_module*m); + +const char* pa__get_author(void); +const char* pa__get_description(void); +const char* pa__get_usage(void); +const char* pa__get_version(void); +const char* pa__get_deprecated(void); +pa_bool_t pa__load_once(void); + +#endif diff --git a/src/modules/module-sine-source.c b/src/modules/module-sine-source.c new file mode 100644 index 0000000..9826e5f --- /dev/null +++ b/src/modules/module-sine-source.c @@ -0,0 +1,334 @@ +/*** + This file is part of PulseAudio. + + Copyright 2008 Lennart Poettering + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "module-sine-source-symdef.h" + +PA_MODULE_AUTHOR("Lennart Poettering"); +PA_MODULE_DESCRIPTION("Sine wave generator source"); +PA_MODULE_VERSION(PACKAGE_VERSION); +PA_MODULE_LOAD_ONCE(FALSE); +PA_MODULE_USAGE( + "source_name= " + "source_properties= " + "rate= " + "frequency="); + +#define DEFAULT_SOURCE_NAME "sine_input" +#define BLOCK_USEC (PA_USEC_PER_SEC * 2) + +struct userdata { + pa_core *core; + pa_module *module; + pa_source *source; + + pa_thread *thread; + pa_thread_mq thread_mq; + pa_rtpoll *rtpoll; + + pa_memchunk memchunk; + size_t peek_index; + + pa_usec_t block_usec; /* how much to push at once */ + pa_usec_t timestamp; /* when to push next */ +}; + +static const char* const valid_modargs[] = { + "source_name", + "source_properties", + "rate", + "frequency", + NULL +}; + +static int source_process_msg( + pa_msgobject *o, + int code, + void *data, + int64_t offset, + pa_memchunk *chunk) { + + struct userdata *u = PA_SOURCE(o)->userdata; + + switch (code) { + + case PA_SOURCE_MESSAGE_SET_STATE: + + if (PA_PTR_TO_UINT(data) == PA_SOURCE_RUNNING) + u->timestamp = pa_rtclock_now(); + + break; + + case PA_SOURCE_MESSAGE_GET_LATENCY: { + pa_usec_t now, left_to_fill; + + now = pa_rtclock_now(); + left_to_fill = u->timestamp > now ? u->timestamp - now : 0ULL; + + *((pa_usec_t*) data) = u->block_usec > left_to_fill ? u->block_usec - left_to_fill : 0ULL; + + return 0; + } + } + + return pa_source_process_msg(o, code, data, offset, chunk); +} + +static void source_update_requested_latency_cb(pa_source *s) { + struct userdata *u; + + pa_source_assert_ref(s); + pa_assert_se(u = s->userdata); + + u->block_usec = pa_source_get_requested_latency_within_thread(s); + + if (u->block_usec == (pa_usec_t) -1) + u->block_usec = s->thread_info.max_latency; + + pa_log_debug("new block msec = %lu", (unsigned long) (u->block_usec / PA_USEC_PER_MSEC)); +} + +static void process_render(struct userdata *u, pa_usec_t now) { + pa_assert(u); + + while (u->timestamp < now + u->block_usec) { + pa_memchunk chunk; + size_t k; + + k = pa_usec_to_bytes_round_up(now + u->block_usec - u->timestamp, &u->source->sample_spec); + + chunk = u->memchunk; + chunk.index += u->peek_index; + chunk.length = PA_MIN(chunk.length - u->peek_index, k); + +/* pa_log_debug("posting %lu", (unsigned long) chunk.length); */ + pa_source_post(u->source, &chunk); + + u->peek_index += chunk.length; + while (u->peek_index >= u->memchunk.length) + u->peek_index -= u->memchunk.length; + + u->timestamp += pa_bytes_to_usec(chunk.length, &u->source->sample_spec); + } +} + +static void thread_func(void *userdata) { + struct userdata *u = userdata; + + pa_assert(u); + + pa_log_debug("Thread starting up"); + + pa_thread_mq_install(&u->thread_mq); + + u->timestamp = pa_rtclock_now(); + + for (;;) { + int ret; + + if (PA_SOURCE_IS_OPENED(u->source->thread_info.state)) { + pa_usec_t now; + + now = pa_rtclock_now(); + + if (u->timestamp <= now) + process_render(u, now); + + pa_rtpoll_set_timer_absolute(u->rtpoll, u->timestamp); + } else + pa_rtpoll_set_timer_disabled(u->rtpoll); + + /* Hmm, nothing to do. Let's sleep */ + if ((ret = pa_rtpoll_run(u->rtpoll, TRUE)) < 0) + goto fail; + + if (ret == 0) + goto finish; + } + +fail: + /* If this was no regular exit from the loop we have to continue + * processing messages until we received PA_MESSAGE_SHUTDOWN */ + pa_asyncmsgq_post(u->thread_mq.outq, PA_MSGOBJECT(u->core), PA_CORE_MESSAGE_UNLOAD_MODULE, u->module, 0, NULL, NULL); + pa_asyncmsgq_wait_for(u->thread_mq.inq, PA_MESSAGE_SHUTDOWN); + +finish: + pa_log_debug("Thread shutting down"); +} + +int pa__init(pa_module*m) { + struct userdata *u; + pa_modargs *ma; + pa_source_new_data data; + uint32_t frequency; + pa_sample_spec ss; + + pa_assert(m); + + if (!(ma = pa_modargs_new(m->argument, valid_modargs))) { + pa_log("failed to parse module arguments."); + goto fail; + } + + ss.format = PA_SAMPLE_FLOAT32; + ss.channels = 1; + ss.rate = 44100; + + if (pa_modargs_get_value_u32(ma, "rate", &ss.rate) < 0 || ss.rate <= 1) { + pa_log("Invalid rate specification"); + goto fail; + } + + frequency = 440; + if (pa_modargs_get_value_u32(ma, "frequency", &frequency) < 0 || frequency < 1 || frequency > ss.rate/2) { + pa_log("Invalid frequency specification"); + goto fail; + } + + m->userdata = u = pa_xnew0(struct userdata, 1); + u->core = m->core; + u->module = m; + u->rtpoll = pa_rtpoll_new(); + pa_thread_mq_init(&u->thread_mq, m->core->mainloop, u->rtpoll); + + u->peek_index = 0; + pa_memchunk_sine(&u->memchunk, m->core->mempool, ss.rate, frequency); + + pa_source_new_data_init(&data); + data.driver = __FILE__; + data.module = m; + pa_source_new_data_set_name(&data, pa_modargs_get_value(ma, "source_name", DEFAULT_SOURCE_NAME)); + pa_proplist_setf(data.proplist, PA_PROP_DEVICE_DESCRIPTION, "Sine source at %u Hz", (unsigned) frequency); + pa_proplist_sets(data.proplist, PA_PROP_DEVICE_CLASS, "abstract"); + pa_proplist_setf(data.proplist, "sine.hz", "%u", frequency); + pa_source_new_data_set_sample_spec(&data, &ss); + + if (pa_modargs_get_proplist(ma, "source_properties", data.proplist, PA_UPDATE_REPLACE) < 0) { + pa_log("Invalid properties"); + pa_source_new_data_done(&data); + goto fail; + } + + u->source = pa_source_new(m->core, &data, PA_SOURCE_LATENCY); + pa_source_new_data_done(&data); + + if (!u->source) { + pa_log("Failed to create source."); + goto fail; + } + + u->source->parent.process_msg = source_process_msg; + u->source->update_requested_latency = source_update_requested_latency_cb; + u->source->userdata = u; + + u->block_usec = BLOCK_USEC; + + pa_source_set_asyncmsgq(u->source, u->thread_mq.inq); + pa_source_set_rtpoll(u->source, u->rtpoll); + pa_source_set_fixed_latency(u->source, u->block_usec); + + if (!(u->thread = pa_thread_new(thread_func, u))) { + pa_log("Failed to create thread."); + goto fail; + } + + pa_source_put(u->source); + + pa_modargs_free(ma); + + return 0; + +fail: + if (ma) + pa_modargs_free(ma); + + pa__done(m); + + return -1; +} + +int pa__get_n_used(pa_module *m) { + struct userdata *u; + + pa_assert(m); + pa_assert_se(u = m->userdata); + + return pa_source_linked_by(u->source); +} + +void pa__done(pa_module*m) { + struct userdata *u; + + pa_assert(m); + + if (!(u = m->userdata)) + return; + + if (u->source) + pa_source_unlink(u->source); + + if (u->thread) { + pa_asyncmsgq_send(u->thread_mq.inq, NULL, PA_MESSAGE_SHUTDOWN, NULL, 0, NULL); + pa_thread_free(u->thread); + } + + pa_thread_mq_done(&u->thread_mq); + + if (u->source) + pa_source_unref(u->source); + + if (u->memchunk.memblock) + pa_memblock_unref(u->memchunk.memblock); + + if (u->rtpoll) + pa_rtpoll_free(u->rtpoll); + + pa_xfree(u); +} diff --git a/src/modules/module-sine-symdef.h b/src/modules/module-sine-symdef.h new file mode 100644 index 0000000..6a51f03 --- /dev/null +++ b/src/modules/module-sine-symdef.h @@ -0,0 +1,29 @@ +#ifndef foomodulesinesymdeffoo +#define foomodulesinesymdeffoo + +#include +#include +#include + +#define pa__init module_sine_LTX_pa__init +#define pa__done module_sine_LTX_pa__done +#define pa__get_author module_sine_LTX_pa__get_author +#define pa__get_description module_sine_LTX_pa__get_description +#define pa__get_usage module_sine_LTX_pa__get_usage +#define pa__get_version module_sine_LTX_pa__get_version +#define pa__get_deprecated module_sine_LTX_pa__get_deprecated +#define pa__load_once module_sine_LTX_pa__load_once +#define pa__get_n_used module_sine_LTX_pa__get_n_used + +int pa__init(pa_module*m); +void pa__done(pa_module*m); +int pa__get_n_used(pa_module*m); + +const char* pa__get_author(void); +const char* pa__get_description(void); +const char* pa__get_usage(void); +const char* pa__get_version(void); +const char* pa__get_deprecated(void); +pa_bool_t pa__load_once(void); + +#endif diff --git a/src/modules/module-sine.c b/src/modules/module-sine.c new file mode 100644 index 0000000..69b2002 --- /dev/null +++ b/src/modules/module-sine.c @@ -0,0 +1,208 @@ +/*** + This file is part of PulseAudio. + + Copyright 2004-2006 Lennart Poettering + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include + +#include + +#include +#include +#include +#include +#include +#include + +#include "module-sine-symdef.h" + +PA_MODULE_AUTHOR("Lennart Poettering"); +PA_MODULE_DESCRIPTION("Sine wave generator"); +PA_MODULE_VERSION(PACKAGE_VERSION); +PA_MODULE_LOAD_ONCE(FALSE); +PA_MODULE_USAGE( + "sink= " + "frequency="); + +struct userdata { + pa_core *core; + pa_module *module; + pa_sink_input *sink_input; + pa_memchunk memchunk; + size_t peek_index; +}; + +static const char* const valid_modargs[] = { + "sink", + "frequency", + NULL, +}; + +static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk) { + struct userdata *u; + + pa_sink_input_assert_ref(i); + pa_assert_se(u = i->userdata); + pa_assert(chunk); + + *chunk = u->memchunk; + pa_memblock_ref(chunk->memblock); + + chunk->index += u->peek_index; + chunk->length -= u->peek_index; + + u->peek_index = 0; + + return 0; +} + +static void sink_input_process_rewind_cb(pa_sink_input *i, size_t nbytes) { + struct userdata *u; + + pa_sink_input_assert_ref(i); + pa_assert_se(u = i->userdata); + + nbytes %= u->memchunk.length; + + if (u->peek_index >= nbytes) + u->peek_index -= nbytes; + else + u->peek_index = u->memchunk.length + u->peek_index - nbytes; +} + +static void sink_input_kill_cb(pa_sink_input *i) { + struct userdata *u; + + pa_sink_input_assert_ref(i); + pa_assert_se(u = i->userdata); + + pa_sink_input_unlink(u->sink_input); + pa_sink_input_unref(u->sink_input); + u->sink_input = NULL; + + pa_module_unload_request(u->module, TRUE); +} + +/* Called from IO thread context */ +static void sink_input_state_change_cb(pa_sink_input *i, pa_sink_input_state_t state) { + struct userdata *u; + + pa_sink_input_assert_ref(i); + pa_assert_se(u = i->userdata); + + /* If we are added for the first time, ask for a rewinding so that + * we are heard right-away. */ + if (PA_SINK_INPUT_IS_LINKED(state) && + i->thread_info.state == PA_SINK_INPUT_INIT) + pa_sink_input_request_rewind(i, 0, FALSE, TRUE, TRUE); +} + +int pa__init(pa_module*m) { + pa_modargs *ma = NULL; + struct userdata *u; + pa_sink *sink; + pa_sample_spec ss; + uint32_t frequency; + pa_sink_input_new_data data; + + if (!(ma = pa_modargs_new(m->argument, valid_modargs))) { + pa_log("Failed to parse module arguments"); + goto fail; + } + + if (!(sink = pa_namereg_get(m->core, pa_modargs_get_value(ma, "sink", NULL), PA_NAMEREG_SINK))) { + pa_log("No such sink."); + goto fail; + } + + ss.format = PA_SAMPLE_FLOAT32; + ss.rate = sink->sample_spec.rate; + ss.channels = 1; + + frequency = 440; + if (pa_modargs_get_value_u32(ma, "frequency", &frequency) < 0 || frequency < 1 || frequency > ss.rate/2) { + pa_log("Invalid frequency specification"); + goto fail; + } + + m->userdata = u = pa_xnew0(struct userdata, 1); + u->core = m->core; + u->module = m; + u->sink_input = NULL; + + u->peek_index = 0; + pa_memchunk_sine(&u->memchunk, m->core->mempool, ss.rate, frequency); + + pa_sink_input_new_data_init(&data); + data.driver = __FILE__; + data.module = m; + data.sink = sink; + pa_proplist_setf(data.proplist, PA_PROP_MEDIA_NAME, "%u Hz Sine", frequency); + pa_proplist_sets(data.proplist, PA_PROP_MEDIA_ROLE, "abstract"); + pa_proplist_setf(data.proplist, "sine.hz", "%u", frequency); + pa_sink_input_new_data_set_sample_spec(&data, &ss); + + pa_sink_input_new(&u->sink_input, m->core, &data); + pa_sink_input_new_data_done(&data); + + if (!u->sink_input) + goto fail; + + u->sink_input->pop = sink_input_pop_cb; + u->sink_input->process_rewind = sink_input_process_rewind_cb; + u->sink_input->kill = sink_input_kill_cb; + u->sink_input->state_change = sink_input_state_change_cb; + u->sink_input->userdata = u; + + pa_sink_input_put(u->sink_input); + + pa_modargs_free(ma); + return 0; + +fail: + if (ma) + pa_modargs_free(ma); + + pa__done(m); + return -1; +} + +void pa__done(pa_module*m) { + struct userdata *u; + + pa_assert(m); + + if (!(u = m->userdata)) + return; + + if (u->sink_input) { + pa_sink_input_unlink(u->sink_input); + pa_sink_input_unref(u->sink_input); + } + + if (u->memchunk.memblock) + pa_memblock_unref(u->memchunk.memblock); + + pa_xfree(u); +} diff --git a/src/modules/module-solaris-symdef.h b/src/modules/module-solaris-symdef.h new file mode 100644 index 0000000..0ee6a00 --- /dev/null +++ b/src/modules/module-solaris-symdef.h @@ -0,0 +1,29 @@ +#ifndef foomodulesolarissymdeffoo +#define foomodulesolarissymdeffoo + +#include +#include +#include + +#define pa__init module_solaris_LTX_pa__init +#define pa__done module_solaris_LTX_pa__done +#define pa__get_author module_solaris_LTX_pa__get_author +#define pa__get_description module_solaris_LTX_pa__get_description +#define pa__get_usage module_solaris_LTX_pa__get_usage +#define pa__get_version module_solaris_LTX_pa__get_version +#define pa__get_deprecated module_solaris_LTX_pa__get_deprecated +#define pa__load_once module_solaris_LTX_pa__load_once +#define pa__get_n_used module_solaris_LTX_pa__get_n_used + +int pa__init(pa_module*m); +void pa__done(pa_module*m); +int pa__get_n_used(pa_module*m); + +const char* pa__get_author(void); +const char* pa__get_description(void); +const char* pa__get_usage(void); +const char* pa__get_version(void); +const char* pa__get_deprecated(void); +pa_bool_t pa__load_once(void); + +#endif diff --git a/src/modules/module-solaris.c b/src/modules/module-solaris.c new file mode 100644 index 0000000..b0d4db4 --- /dev/null +++ b/src/modules/module-solaris.c @@ -0,0 +1,1113 @@ +/*** + This file is part of PulseAudio. + + Copyright 2006 Lennart Poettering + Copyright 2006-2007 Pierre Ossman for Cendio AB + Copyright 2009 Finn Thain + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "module-solaris-symdef.h" + +PA_MODULE_AUTHOR("Pierre Ossman"); +PA_MODULE_DESCRIPTION("Solaris Sink/Source"); +PA_MODULE_VERSION(PACKAGE_VERSION); +PA_MODULE_USAGE( + "sink_name= " + "sink_properties= " + "source_name= " + "source_properties= " + "device=