pax_global_header00006660000000000000000000000064133402251340014507gustar00rootroot0000000000000052 comment=b0ae1edb86456f363e283bd740bbae01d58ae55c mhwaveedit-1.4.24/000077500000000000000000000000001334022513400137345ustar00rootroot00000000000000mhwaveedit-1.4.24/.gitignore000066400000000000000000000002521334022513400157230ustar00rootroot00000000000000*.po *.gmo *~ *.o Makefile Makefile.in README aclocal.m4 autom4te.cache config.h config.h.in config.log config.status configure POTFILES .deps stamp-h1 help.c mhwaveedit mhwaveedit-1.4.24/ABOUT-NLS000066400000000000000000000601571334022513400151740ustar00rootroot00000000000000Notes 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 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 at translations should 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. 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'. 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 GNU `gettext' own 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 be not what is 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 have usually 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. 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. 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 country 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'. 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. 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://www.iro.umontreal.ca/contrib/po/HTML/', in the "National 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 `translation@iro.umontreal.ca' 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 skill are praised more than programming skill, here. Available Packages ================== Languages are not equally supported in all packages. The following matrix shows the current state of internationalization, as of August 2002. 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 be bg ca cs da de el en eo es et fi fr +----------------------------------------+ a2ps | [] [] [] [] | ap-utils | | bash | [] [] [] [] | bfd | [] [] | binutils | [] [] | bison | [] [] [] [] | clisp | | clisp | [] [] [] [] | clisplow | | cpio | [] [] [] [] | darkstat | () | diffutils | [] [] [] [] [] [] | enscript | [] [] | error | [] [] [] | fetchmail | [] () [] [] [] () | fileutils | [] [] [] [] [] | findutils | [] [] [] [] [] [] | flex | [] [] [] [] [] | gas | [] [] | gawk | [] [] [] | gcal | [] [] | gcc | [] [] | gettext | [] [] [] [] [] | gnupg | [] [] [] [] [] [] [] | gprof | [] [] | gpsdrive | () () () () () | grep | [] [] [] [] [] [] [] [] | gretl | [] | gthumb | () () () | hello | [] [] [] [] [] [] [] [] [] | id-utils | [] [] [] | indent | [] [] [] [] [] | jpilot | () [] [] [] | jwhois | [] [] | kbd | [] [] [] | ld | [] [] | libc | [] [] [] [] [] [] [] [] | libiconv | [] [] [] [] | lifelines | () () | lilypond | [] [] | lingoteach | [] [] | lingoteach_lessons| () () | lynx | [] [] [] [] [] | m4 | [] [] [] [] [] | make | [] [] [] [] | man-db | [] () () [] () () | mysecretdiary | [] [] [] | nano | [] () [] [] [] [] | nano_1_0 | [] () [] [] [] [] | opcodes | [] [] [] | parted | [] [] [] [] [] | ptx | [] [] [] [] [] [] [] | python | | recode | [] [] [] [] [] [] | sed | [] [] [] [] [] [] [] [] [] [] | sh-utils | [] [] [] [] | sharutils | [] [] [] [] [] [] [] | sketch | () [] () | soundtracker | [] [] [] | sp | [] | tar | [] [] [] [] [] [] | texinfo | [] [] [] [] [] | textutils | [] [] [] [] [] | util-linux | [] [] [] [] [] [] | vorbis-tools | [] | wastesedge | | wdiff | [] [] [] [] [] [] | wget | [] [] [] [] [] [] [] [] [] [] | +----------------------------------------+ be bg ca cs da de el en eo es et fi fr 0 2 19 10 30 44 9 1 12 44 17 6 53 gl he hr hu id it ja ko lv nb nl nn +-------------------------------------+ a2ps | () () [] | ap-utils | | bash | [] | bfd | [] | binutils | [] | bison | [] [] [] [] | clisp | | clisp | [] | clisplow | | cpio | [] [] [] [] | darkstat | | diffutils | [] [] [] [] [] | enscript | [] [] | error | [] | fetchmail | [] | fileutils | [] [] [] | findutils | [] [] [] [] [] [] [] [] | flex | [] | gas | | gawk | [] | gcal | | gcc | [] | gettext | [] [] | gnupg | [] [] [] [] | gprof | [] | gpsdrive | [] () () | grep | [] [] [] [] [] [] [] | gretl | | gthumb | () () | hello | [] [] [] [] [] [] [] [] [] [] [] [] | id-utils | [] [] | indent | [] [] [] [] | jpilot | () () | jwhois | [] [] | kbd | | ld | | libc | [] [] [] [] | libiconv | [] [] [] | lifelines | | lilypond | [] | lingoteach | [] | lingoteach_lessons| | lynx | [] [] [] [] | m4 | [] [] [] [] | make | [] [] [] [] [] [] | man-db | () () | mysecretdiary | [] | nano | [] [] [] [] | nano_1_0 | [] [] [] [] [] | opcodes | [] [] | parted | [] [] [] | ptx | [] [] [] [] [] | python | | recode | [] [] [] | sed | [] [] [] [] [] [] [] [] | sh-utils | [] [] [] | sharutils | [] [] [] | sketch | () | soundtracker | [] [] | sp | | tar | [] [] [] [] [] [] | texinfo | [] [] [] | textutils | [] [] [] [] | util-linux | () [] | vorbis-tools | [] | wastesedge | | wdiff | [] [] [] | wget | [] [] [] [] [] [] | +-------------------------------------+ gl he hr hu id it ja ko lv nb nl nn 23 9 12 19 16 13 26 9 1 7 19 3 no pl pt pt_BR ru sk sl sv tr uk zh_CN zh_TW +----------------------------------------------+ a2ps | () () () [] [] [] [] [] | 10 ap-utils | () | 0 bash | [] | 6 bfd | [] [] | 5 binutils | [] [] | 5 bison | [] [] [] [] | 12 clisp | | 0 clisp | | 5 clisplow | | 0 cpio | [] [] [] [] | 12 darkstat | [] [] () () | 2 diffutils | [] [] [] [] [] [] | 17 enscript | [] [] [] [] | 8 error | [] [] [] | 7 fetchmail | () () [] | 6 fileutils | [] [] [] [] [] [] | 14 findutils | [] [] [] [] [] [] [] | 21 flex | [] [] [] | 9 gas | [] | 3 gawk | [] [] | 6 gcal | [] [] | 4 gcc | [] | 4 gettext | [] [] [] [] [] [] | 13 gnupg | [] [] [] | 14 gprof | [] [] | 5 gpsdrive | [] [] | 3 grep | [] [] [] [] [] | 20 gretl | | 1 gthumb | () () [] | 1 hello | [] [] [] [] [] [] [] | 28 id-utils | [] [] [] [] | 9 indent | [] [] [] [] [] | 14 jpilot | () () [] [] | 5 jwhois | [] () () [] [] | 7 kbd | [] [] | 5 ld | [] [] | 4 libc | [] [] [] [] [] [] | 18 libiconv | [] [] [] [] [] | 12 lifelines | [] | 1 lilypond | [] | 4 lingoteach | [] [] | 5 lingoteach_lessons| () | 0 lynx | [] [] [] [] | 13 m4 | [] [] [] [] | 13 make | [] [] [] [] [] | 15 man-db | | 3 mysecretdiary | [] [] [] | 7 nano | [] [] [] [] | 13 nano_1_0 | [] [] [] [] | 14 opcodes | [] [] [] | 8 parted | [] [] [] [] | 12 ptx | [] [] [] [] [] [] [] | 19 python | | 0 recode | [] [] [] [] [] [] | 15 sed | [] [] [] [] [] [] | 24 sh-utils | [] [] | 9 sharutils | [] [] [] [] | 14 sketch | [] () [] | 4 soundtracker | [] | 6 sp | | 1 tar | [] [] [] [] [] [] [] | 19 texinfo | [] [] | 10 textutils | [] [] [] [] [] | 14 util-linux | [] [] [] | 10 vorbis-tools | [] | 3 wastesedge | | 0 wdiff | [] [] [] [] [] | 14 wget | [] [] [] [] [] [] [] [] | 24 +----------------------------------------------+ 37 teams no pl pt pt_BR ru sk sl sv tr uk zh_CN zh_TW 68 domains 4 15 2 28 28 12 10 49 43 4 1 9 609 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 August 2002 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://www.iro.umontreal.ca/contrib/po/HTML/matrix.html'. 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 to 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 `translation@iro.umontreal.ca' to make the `.pot' files available to the translation teams. mhwaveedit-1.4.24/AUTHORS000066400000000000000000000033021334022513400150020ustar00rootroot00000000000000 Main author, maintainer: Magnus Hjorth Contributors (alphabetical order): Adam Pribyl (1.3.0, Improved toolbar icons) Andrés Delfino (1.4.9, Portability fixes) Dan Church (1.4.22, Improvements) Dan Muresan (1.4.21-1.4.22, Improvements) Dmitry "MAD" Artamonow (1.4.1, Bug fixes) Erica Andrews (1.3.2, Esound driver) Forest Bond (1.4.11, Improvements) Jacek M. Holeczek (1.4.10, Code cleanup) Jens Askengren (1.1.2, UI improvements) Konstantin Korikov (1.4.0, NLS Support) Mark Tyler (1.2.8-1.3.0, Improvements, bug fixes) Robert Emil Berge (1.4.13, SoX improvements) Tom Kelly (1.3.6, Esound improvements) Donors: Joel Brandt Adam Dingle Translators: Chinese (zh): zh_CN: lon French (fr): Gianni Moschini Olivier Humbert German (de): Georg Funke Italian (it): Andrea Primiani Polish (pl): Robert Wojewódzki Russian (ru): Konstantin Korikov Spanish (es): Sergio Rivadero Swedish (sv): Magnus Hjorth GitHub notes: See also: https://github.com/magnush/mhwaveedit/graphs/contributors New contributors are welcome to add themselves to the lists above as part of a commit series or GitHub pull request. mhwaveedit-1.4.24/BUGS000066400000000000000000000011761334022513400144240ustar00rootroot00000000000000Known bugs in mhWaveEdit: * When stopping, the cursor doesn't stop exactly where the playback stopped. * Not highly tested on big-endian systems. Feedback on this is welcome. * The ALSA driver sometimes underrun shortly after playback started or cursor jump, causing a click in the playback. * When using the EsounD driver and other programs are playing as well, the cursor position can become delayed. * Doesn't work properly with Lame version 3.92 and older. * Can crash when using GTK+ 1.2 and built with aRts driver, due to linking with both glib 1.2 and 2.x at the same time. Report bugs to magnus.hjorth@home.se. mhwaveedit-1.4.24/COPYING000066400000000000000000000430761334022513400150010ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 675 Mass Ave, Cambridge, MA 02139, 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 Appendix: 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) 19yy 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., 675 Mass Ave, Cambridge, MA 02139, 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) 19yy 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. mhwaveedit-1.4.24/ChangeLog000066400000000000000000002431441334022513400155160ustar00rootroot00000000000000 More recent history can be found in ChangeLog.git 2008-05-05 Magnus Hjorth * Released version 1.4.15. 2008-05-04 Magnus Hjorth * src/main.c (main): Change default time scale format to HH:SS.mmmm 2008-05-01 Magnus Hjorth * src/ladspadialog.c (ladspa_dialog_setup): Save the "none" channel selection as number -1, so it is consistent when the number of channels changes. * src/configdialog.c: Add option to select format on time scale. * src/chunkview.c (draw_timescale): Use find_timescale_points * src/main.c (get_time): Added support for SMPTE time code format. (find_timescale_points): New algorithm for finding time scale points. 2008-04-28 Magnus Hjorth * src/mainwindow.c (effects_normalize_proc): Don't continue if the user aborts the peak level search in the normalize to function. * src/chunk.c (chunk_amplify): Show amplification amount in progress bar. 2008-04-22 Magnus Hjorth * src/convert_inc.c: Fixes for 64-bit platforms. 2007-11-22 Magnus Hjorth * Released version 1.4.14. 2007-11-20 Magnus Hjorth * src/filetypes.c (sndfile_load): Forgot to set bigendian flag. 2007-10-16 Magnus Hjorth * src/chunkview.c (scroll_wheel): Zero-length fix. * src/document.c (document_set_view): Zero-length bugfix. * src/viewcache.c (view_cache_update): Fix empty file handling. 2007-10-03 Magnus Hjorth * src/ladspacore.c (ladspa_path_foreach): Use DEFAULT_LADSPA_PATH if environment variable not set. 2007-08-28 Magnus Hjorth * src/chunkview.c (chunk_view_button_release): Fix crash when middle-clicking before any file has been loaded. 2007-08-27 Magnus Hjorth * src/chunk.c (chunk_interpolate_endpoints): For long parts, ramp down the edges to zero. 2007-08-26 Magnus Hjorth * Released version 1.4.13. 2007-08-25 Magnus Hjorth * src/filetypes.c (wav_save): Automatically convert if the chunk has wrong sign or endian-ness. * src/document.c (document_apply_cb): Forgot to check the selection_only parameter. * src/chunk.c (chunk_byteswap): Must add conversion step back to original format. 2007-08-22 Alexis Ballier * configure.in: Add check for pkgconfig that is always run so that variables are setup properly. 2007-06-22 Robert Emil Berge * src/soxdialog.c (sox_dialog_register_main): Fix effects detection for SoX v13. 2007-05-27 Magnus Hjorth * src/dataformat.c (dither_convert_double): Several bugs fixed. Caused practically all double-to-PCM conversions to crash. 2007-05-24 Magnus Hjorth * Released version 1.4.12. * src/effectbrowser.c: Removed the OK button and replaced it with a check box. 2007-05-19 Magnus Hjorth * src/soxdialog.c (sox_dialog_register_main): If sox is not in the PATH, just return without any error message. * src/effectbrowser.c: Added context menu in effect list with commands for moving,sorting and rebuilding the effect list. 2007-05-14 Magnus Hjorth * src/effectbrowser.c: Added support for reordering effects. 2007-05-13 Magnus Hjorth * src/mainwindow.c: Support dropping files to open them. * src/filetypes.c (chunk_load_main): Fix mplayer loading bug. 2007-05-07 Magnus Hjorth * src/dataformat.c: Fix for autoconf upgrade. 2007-04-07 Magnus Hjorth * src/effectbrowser.c: Large changes to the effect list system. Removed prefix in effect ID, added a separate source ID character instead. Added extra layer of indirection in registration to allow for caching of effect list. Removed hard coupling between GUI list index and effect_list index. 2007-04-06 Magnus Hjorth * src/inifile.c (xisspace): Changed name to avoid clash with libc. * src/chunkview.c (chunk_view_init): Avoid compiler warning. 2007-03-24 Magnus Hjorth * src/rateconv.c (rateconv_new): Bug in special case inrate==outrate 2007-03-21 Magnus Hjorth * src/chunk.c (chunk_convert_samplerate): Forgot to reset conv pointer. 2007-03-02 Magnus Hjorth * src/main.c (main): Initialize threads if building with gthread library. This is a workaround for aRts library issues. * configure.in: Check for gthread library if we are using GTK2. Print warning message if we are compiling with GTK1.2 and the aRts driver. 2007-01-07 Magnus Hjorth * src/viewcache.c (view_cache_update): Fix for scrolling bug when zoomed in to <1 sample-per-pixel. 2007-01-01 Magnus Hjorth * Released version 1.4.11. * src/mainwindow.c (help_about): Updated copyright notice. 2006-12-31 Magnus Hjorth * src/chunk.c (chunk_remap_channels): Added room for ending marker to internal matrix. * src/mainwindow.c (edit_selectall): If all is already selected, select none instead. * src/gtkfiles.c (get_filename_modify_extension): Accidentaly left in debug message. 2006-12-30 Magnus Hjorth * src/chunk.c (chunk_onechannel): Rewritten using chunk_remap_channels. (chunk_copy_channel): Rewritten using chunk_remap_channels * src/mapchannelsdialog.c: New builtin effect "Map channels" * src/int_box.c (intbox_create_scale): Don't show any decimals. 2006-12-23 Magnus Hjorth * src/datasource.c (datasource_convert): Forgot to set samplebytes. 2006-12-22 Magnus Hjorth * src/chunk.c (chunk_filter_tofmt): Remember to free the convert_back struct. 2006-12-21 Magnus Hjorth * src/chunk.c (clipwarn): Option for displaying a cancel button. (chunk_dump): Changed return type back to gboolean. 2006-12-21 Forest Bond * src/mainwindow.c: Added Cursor submenus for Move, Move to, and Zero-crossing detection. * src/document.c: Added document_nudge_cursor function. * src/chunk.c (chunk_parse): Support parsing samples in reverse and from arbitrary position. Added functions for zero-crossing detection. * src/gotodialog.c: Replaced magic numbers by #defines. 2006-12-11 Magnus Hjorth * src/document.c (document_apply): Used wrong variable in document_update call, causing corrupted data. 2006-11-14 Magnus Hjorth * src/mainwindow.c (mainwindow_keypress): Ctrl-arrow now moves cursor also when not playing. (mainwindow_keypress): Arrow-up and Arrow-down zooms view about the view center. 2006-10-28 Magnus Hjorth * Released version 1.4.10. * src/session.c (session_init): Free pointer. * src/ladspacore.c (ladspa_init): Remember to free pointer. * src/rateconv.c (rateconv_new): Setup readcount and writecount. * src/player.c (player_set_buffer_pos): Always restart converter when jumping * src/rateconv.c (rateconv_new): Add ability to pass through data when outrate == inrate * src/inifile.c (inifile_init): Small memory leak found by Valgrind. * src/session.c (session_init): Make session_dir static. * src/document.c (document_save): Don't clear history if a soft error (clipping) occurred while saving. * src/chunk.c (chunk_dump): Change return value. * Make sure we always detect and warn when clipping conversion occurs. 2006-10-26 Magnus Hjorth * src/datasource.c (datasource_clip_check): Added. (datasource_read_array_main): Check for clipping when converting float to PCM * src/dataformat.c: Add unspecified dither constant. 2006-10-25 Magnus Hjorth * src/chunk.c (chunk_peak_level_proc): Only quit prematurely for PCM chunks. * src/um.c (user_input): Place window centered above parent. (user_input): Cleanups. * src/mainwindow.c: Add "Normalize to..." function. 2006-10-22 Magnus Hjorth * src/pipedialog.c (pipe_dialog_pipe_chunk_main): Progress bar fix. (pipe_dialog_pipe_chunk_main): Use different buffers for input and output. * src/soxdialog.c (sox_dialog_apply): Handle floating-point files and 24-bit PCM files by autoconverting into 32-bit PCM. (sox_dialog_register_main): Support newer versions of SoX. 2006-10-15 Magnus Hjorth * src/combo.c: Add a hack to the GTK 1 version, to avoid changing value directly after opening the dropdown list. 2006-10-13 Jacek M. Holeczek * src/filetypes.c (try_mplayer): Moved variable declaration to top. * src/dataformat.c (convert_array): Moved variable declaration to top. 2006-09-28 Magnus Hjorth * src/mainwindow.c (do_play): Set speed properly when having multiple windows with different speeds. Also fixes speed auto-reset not updating the speed slider. 2006-08-30 Magnus Hjorth * src/sound-alsalib.c (alsa_set_format): Comment out a call that sets maximum input buffer size to a bogus value. 2006-08-22 Magnus Hjorth * Released version 1.4.9. 2006-08-21 Magnus Hjorth * src/sound-oss.c (OSS_PCMFILE_DEFAULT): Use different default device under OpenBSD 2006-07-24 Magnus Hjorth * src/filetypes.c (xunsetenv): Alternate implementation if unsetenv returns void. 2006-06-10 Magnus Hjorth * Released version 1.4.8. * src/session.c (session_resume): Don't add the tempfiles to the recently opened files. (session_resume): Added a message after recovery. * src/document.c (document_forget_filename): Send the state-changed signal so the window title is updated. * src/sound-jack.c (mhjack_connect): If connection fails, append the PID to the client name and try again. * src/session.c (session_init): Use ~/.mhwaveedit directory for sessions. (session_init): Fix segfault. * src/main.c (main): Launch sessions dialog if appropriate. * src/session.c: New file. 2006-04-30 Magnus Hjorth * src/document.c (document_zoom): Small logic fix. 2006-04-02 Magnus Hjorth * src/chunk.c (chunk_replace_part): Inserted new chunk's part list in reversed order. * src/mainwindow.c (mainwindow_set_document): Change the document's status bar. 2006-02-28 Magnus Hjorth * Released version 1.4.7. 2006-02-18 Magnus Hjorth * src/mainwindow.c (mainwindow_save): Don't warn when saving new recordings. 2006-02-06 Magnus Hjorth * src/document.c (document_set_filename): Null pointer bug fixed. 2006-01-28 Magnus Hjorth * Released version 1.4.6. 2006-01-14 Magnus Hjorth * src/mainwindow.c (get_save_filename): Update extension in file dialog when the type is changed. Also dim the default settings checkbox when appropriate. * src/gtkfiles.c: Support changing extension in the file dialog. * src/document.c (document_zoom): Used old distance instead of new in some calculations causing weird zooming behaviour. 2005-11-23 Magnus Hjorth * src/filetypes.c: Support choosing MP3 quality. * src/mainwindow.c (get_save_filename): Forgot a -1. 2005-11-08 Magnus Hjorth * src/inifile.c (inifile_save): Fix segfault when settings file failed to open. (inifile_set): Handle value==NULL properly. 2005-10-30 Magnus Hjorth * src/mainwindow.c (get_save_filename): Display file format combo box and check box to use default settings. * src/filetypes.c: Support file-type specific settings when saving. * src/gtkfiles.c (get_filename): Support extra custom widget. 2005-10-29 Magnus Hjorth * If an mp3 or ogg file is loaded and then saved, display a warning about quality loss. 2005-10-23 Magnus Hjorth * src/document.c (document_set_filename): Fixed bug that caused titlename to become null when it should be "untitled". 2005-09-22 Magnus Hjorth * Released version 1.4.5. * src/configdialog.c: Added auto-detection toggle button. 2005-09-18 Magnus Hjorth * src/sound.c (sound_init): Support auto-detection. * src/sound-esound.c (esound_output_select_format): Report message shown to avoid generic error message box. * src/sound.c: Support silent auto-detection in drivers. 2005-09-17 Magnus Hjorth * src/sound.c: Integrated arts driver. Common input_supported function for the sound drivers that always return TRUE. * configure.in: Added checks for aRts C library. * src/sound-artsc.c: New file. 2005-09-12 Magnus Hjorth * src/player.c (player_switch): Handle auto-conversion properly. * src/document.c (document_update): Check for sample rate/format conversion and stop in that case. * src/sound-jack.c (mhjack_output_suggest_format): Handle if we're not connected. 2005-08-28 Magnus Hjorth * Released version 1.4.4. * src/document.c (document_set_selection): Handle special case with no selection differently. * src/chunkview.c: Shift+Drag now moves the nearest selection endpoint (left mouse button) or the other selection endpoint (right mouse button). 2005-08-26 Magnus Hjorth * src/document.c (document_play_selection): Handle case when nothing is selected as if whole file was selected. * src/chunkview.c (chunk_view_destroy): Also disconnect here. * src/mainwindow.c (mainwindow_destroy): Remember to disconnect document signals. (file_close): Also need to disconnect here. 2005-08-21 Magnus Hjorth * src/mainwindow.c (mainwindow_state_changed): Add call to view_changed so we update the horizontal scrollbar. (mainwindow_set_chunk): Set the proper follow mode when we create the document. 2005-08-18 Magnus Hjorth * src/document.c (document_set_filename): Return directly if we're setting the same filename as we already have. 2005-08-12 Magnus Hjorth * Released version 1.4.3. * src/mainwindow.c (mainwindow_save): Looked at wrong filename. * src/filetypes.c (chunk_save): Call status_bar_end_progress. * src/filetypes.c (try_mplayer): Use new mplayer -ao pcm:file syntax. * src/statusbar.c (status_bar_end_progress): Handle statusbar==NULL. * src/filetypes.c (chunk_load): Add call to status_bar_end_progress. * src/mainwindow.c (edit_paste): We must read the cursor position before updating. * src/viewcache.c (view_cache_update): Handle empty chunk. * src/chunkview.c (scroll_wheel): Handle far zoomed in view properly. * src/viewcache.c (view_cache_update): Fix for far zoomed in view. * src/chunkview.c (chunk_view_update_image): Remove now unneccesary function call. 2005-08-04 Magnus Hjorth * src/statusbar.c (status_bar_end_progress): New function that must be called in some places to go back into normal info mode. * src/chunkview.c (scroll_wheel): Check for too large view endpoint when zooming out. 2005-07-31 Magnus Hjorth * src/mainwindow.c: Added redo function. 2005-07-29 Magnus Hjorth * src/viewcache.c (view_cache_update): Removed special case for small chunks, and handle errors more gracefully. 2005-07-28 Magnus Hjorth * Large code rewrite. Stuff from chunkview.c and mainwindow.c was moved to the new document.c file. MainwindowList changed to DocumentList. Redo support added. * src/document.c: New file. 2005-07-13 Magnus Hjorth * Released version 1.4.2. 2005-07-11 Magnus Hjorth * src/chunkview.c (chunk_view_expose): Off-by-one error detected by Valgrind. 2005-06-28 Magnus Hjorth * src/mainwindow.c (do_stop): Support auto return mode. * src/chunk.c (chunk_interpolate_endpoints): Forgot to sink the original chunk after converting. 2005-06-26 Magnus Hjorth * src/mainwindow.c (edit_silence): Fixed to work with dithering support. 2005-06-21 Magnus Hjorth * src/dataformat.c (convert_array): Added triangular dithering support. 2005-06-12 Magnus Hjorth * src/configdialog.c (config_dialog_init): Added option to choose speed conversion method. 2005-06-09 Magnus Hjorth * src/filetypes.c: Change putenv("VARIABLE") calls into unsetenv calls. 2005-06-08 Magnus Hjorth * Released version 1.4.1. 2005-06-06 Magnus Hjorth * src/sound-jack.c (mhjack_output_select_format): Refuse format if sample rate is wrong. (mhjack_output_suggest_format): Set the proper sample rate. * src/player.c (player_play_main): Support auto-conversion of sample rate when varispeed is enabled. 2005-05-29 Magnus Hjorth * src/gtkfiles.c (get_filename_main): When using GtkFileChooser, handle the case where last_filename is a directory properly. 2005-05-17 Dmitry "MAD" Artamonow * src/sound-jack.c (mhjack_autoconnect): Patch to fix bug with auto-connection of JACK ports. 2005-05-14 Magnus Hjorth * Released version 1.4.0. 2005-05-11 Magnus Hjorth * src/chunkview.c (chunk_view_size_allocate): Fix bug that caused time scale to become invisible under GTK2. 2005-05-08 Magnus Hjorth * src/player.c (get_realpos_main): Never return values higher than chunk length. (player_stop): Stop stop position before unref:ing the chunk. 2005-05-05 Magnus Hjorth * src/main.c: Changed the default colors. * src/ladspacore.c: Changed calls to fprintf/perror to console_message/console_perror * src/sound.c (sound_init): Make error message a bit more informative. * src/chunkview.c (chunk_view_set_selection): Added if-case to avoid exposing the whole selection while resizing it under GTK2. * src/soxdialog.c (sox_dialog_register_main): Don't close the pipe's FD after forking. * src/main.c (main): Moved gtk_init up so GTK options like --g-fatal-warnings can be used. * src/viewcache.c (view_cache_draw_part): Use gdk_draw_segments instead of gdk_draw_lines. 2005-05-03 Magnus Hjorth * src/main.c (main): Added --driver option. * src/sound-jack.c: Added auto-connection support. 2005-04-30 Magnus Hjorth * src/mainwindow.c (do_play): Fix bug where moving the speed slider in a not playing window caused speed to change. 2005-04-27 Konstantin Korikov * Added NLS support and Russian (ru) translation. 2005-04-23 Magnus Hjorth * src/gtkfiles.h: Added include sys/types.h. Required for off_t on some systems. 2005-04-22 Magnus Hjorth * Released version 1.3.8. * src/rateest.c (rateest_log_data): Don't treat low ratio on the first period as underrun. To prevent false underrun detection when changing speeds. * src/rateest.c (LOW_RATIO_THRESHOLD): Lowered to 0.7 because ALSA OSS emulation caused false underrun detection, causing cursor to jump. 2005-04-18 Magnus Hjorth * Added configure option to choose default sound driver. 2005-04-15 Magnus Hjorth * src/player.c: Make the cursor track speed changes better. 2005-04-14 Magnus Hjorth * src/chunk.c (chunk_filter_tofmt): Fix error that occur when running with convert==TRUE and Chunk format already is in fp format. 2005-04-13 Magnus Hjorth * src/mainwindow.c (mainwindow_init): Forgot to hide the speed label if the speed slider is hidden by default. (mainwindow_init): Prevent speed label changes from resizing the sample view. 2005-04-10 Magnus Hjorth * src/sound-jack.c (mhjack_output_stop): Fixed a bug that caused playing short sections to just output silence. * src/sound.h: Support displaying other error messages than the generic "format not supported" message when starting recording and playback. 2005-04-07 Magnus Hjorth * src/mainwindow.c (mainwindow_init): Changed the zoom sliders into GtkVScale widgets. * src/sound-sun.c (sunaud_output_suggest_format): This one modified as well. * src/sound-jack.c (mhjack_output_suggest_format): Changed to avoid infinite loops. * src/player.c (get_new_data): Fixed small loop problem. 2005-04-06 Magnus Hjorth * src/chunk.c (chunk_convert_sampletype): Didn't copy the offsets/lengths properly. 2005-03-28 Magnus Hjorth * src/configdialog.c (config_dialog_init): Replaced caption "draw view" with "draw waveform" 2005-03-26 Magnus Hjorth * Released version 1.3.7. 2005-03-21 Magnus Hjorth * src/filetypes.c (chunk_save): Let the user choose format before doing anything with the file. * src/sound-esound.c: Added jump delay and settings dialog. * src/float_box.c: Added floatbox_check_limit function. 2005-03-20 Magnus Hjorth * src/mainwindow.c (do_stop): Update cursor position after stopping. * src/player.c (player_work): Modified logic for stopping. 2005-03-19 Magnus Hjorth * src/chunkview.c (chunk_view_button_press): Double clicks should only be handled when done with the first mouse button. * src/sound-portaudio.c (portaudio_output_select_format): Set played_bytes to zero before calling Pa_OpenStream. * src/sound.h: Removed output_played_bytes call and changed the output_stop call. * src/player.c (get_new_data): Fix playing selection without loop. 2005-03-03 Magnus Hjorth * src/sound-sun.c (sunaud_select_format): Forgot return statement at the end. 2005-02-22 Magnus Hjorth * Released version 1.2.6. 2005-02-20 Magnus Hjorth * src/sound-esound.c (esound_init): Pass NULL as host, and libesd will check ESPEAKER for us. * src/sound-oss.c (oss_try_format): Reversed endian-ness fixed. 2005-02-18 Magnus Hjorth * src/gtkfiles.c (get_filename_main): Never pass NULL to g_filename_to_utf8. 2005-02-07 Magnus Hjorth * src/sound-esound.c: The variable should be ESPEAKER, not ESOUND_HOST. * src/sound-sun.c (sunaud_select_format): Refuse to select format with wrong endian-ness. * src/pipedialog.c (pipe_dialog_pipe_chunk_main): Forgot to remove byteswap call causing mp3:s encoded with wrong endian-ness on big-endian systems. * src/filetypes.c (mp3_save): Fixed saving data in non-PCM or non-wav PCM formats. (ogg_save): Fixed saving floating-point data. 2005-02-06 Magnus Hjorth * src/player.c: Reworked to use the rateest code. * src/rateest.c: New file with algorithm for guessing how much data has been played. 2005-01-27 Tom Kelly * src/sound-esound.c: Use ESOUND_HOST environment variable. 2005-01-27 Magnus Hjorth * src/chunk.c (chunk_convert_speed): Fixed bug which caused speed adjustment not to work. * src/filetypes.c (wav_save): Changed the 4GB warning into 2GB, which is the real limit. * src/ringbuf.c: Made the ring buffer lock-free. 2005-01-26 Magnus Hjorth * Released version 1.3.5. 2005-01-19 Magnus Hjorth * src/tempfile.c (tempfile_write_main): Handle partial frame writes better so that you don't lose data if a partition becomes full in mid-sample. * src/sound-sun.c: Include stdlib.h to get getenv prototype. * src/configdialog.c: Added option for using floating-point temporary files. * src/chunk.c (chunk_filter_tofmt): Added flag for using floating-point temporary files (defaults to on). * src/ladspacore.c (scan_directory): Check for errors after opendir call. * src/sound.c: Add a output format suggestion function for suggesting endian-ness/sign conversions. * src/configdialog.c (config_dialog_ok): Update the fallback format. 2005-01-09 Magnus Hjorth * src/mainwindow.c (file_exit): Fix exit menu item not working when no file is loaded. 2005-01-08 Magnus Hjorth * src/sound-oss.c (oss_try_format): Refuse to play floating-point. * src/sound-portaudio.c: Same here * src/sound-alsalib.c: Updated to support new Dataformat struct. 2005-01-04 Magnus Hjorth * src/dataformat.c: Moved the Dataformat stuff into its own file. 2005-01-02 Magnus Hjorth * src/tempfile.c (get_wav_header): Support floating-point headers. 2004-12-21 Magnus Hjorth * src/datasource.h: Also represent floating-point format in Dataformat structure. Remove Datasource types DATASOURCE_REAL_FLOAT and DATASOURCE_TEMPFILE_FLOAT as they are no longer needed. * src/chunk.h: Removed old macros that were no longer used. 2004-12-20 Magnus Hjorth * Released version 1.3.4. 2004-12-16 Magnus Hjorth * Added "Quality" and "Bug reporting" sections to the docs. 2004-12-15 Magnus Hjorth * src/sound-alsalib.c (alsa_output_play): Handle underruns properly. * src/rateconv.c: Added libsamplerate support. 2004-12-10 Magnus Hjorth * src/main.c: Added switch --no-ladspa because the ladspa code confuses the debugger. * src/soxdialog.c (sox_dialog_apply): Forgot to check some of the intboxes, causing old values to be used. * src/pipedialog.c: Created some new functions for the rateconv system. 2004-12-08 Magnus Hjorth * src/rateconv.c: New file. 2004-12-07 Magnus Hjorth * src/mainwindow.c (create_menu): Cut'n'paste error.. (mainwindow_view_changed): Small bug with the hzoom slider Thanks to Mark Tyler for spotting those. 2004-11-29 Magnus Hjorth * src/mainwindowlist.c (mainwindow_list_changed): Forgot to update the format variable. * Changed widget from GtkCombo to Combo wherever possible. 2004-11-26 Magnus Hjorth * src/effectbrowser.c: Changed the prefix of effect names to [B] for built-in effects, [S] for SoX effects and [L] for Ladspa effects. 2004-11-23 Magnus Hjorth * src/combo.c: New file. * src/sound-alsalib.c (alsa_set_format): More error checking. 2004-11-18 Magnus Hjorth * src/configdialog.c (colors_click): Reordered two signal connections, apparently they could produce a crash in certain situations. 2004-10-28 Magnus Hjorth * src/player.c (player_set_buffer_pos): Get the start time after flushing the buffers. 2004-10-27 Magnus Hjorth * src/sound.h: Removed the format_supported functions and make the select_format functions return an error instead. 2004-10-25 Magnus Hjorth * src/mainwindow.c (mainwindow_view_changed): Disable the zoom menu items and "fill" the horizontal zoom slider when editing very small samples. * src/chunkview.c (chunk_view_size_allocate): Handle enlarging window properly when zoomed in to the max. (chunk_view_update_image_main): Workaround for some waveform drawing artefacts. 2004-10-07 Magnus Hjorth * Released version 1.3.3. * src/sound-esound.c: Also forgot unistd.h 2004-10-03 Magnus Hjorth * src/sound-esound.c: Forgot to include errno.h. 2004-10-02 Magnus Hjorth * src/effectbrowser.c: Replaced the old mainwindow list widget with the new MainwindowList. * src/mainwindowlist.c: New file. * src/mainwindow.c: Replaced the all_windows GList with a ListObject. * src/listobject.c: New file. 2004-09-30 Magnus Hjorth * src/configdialog.c (config_dialog_ok): Stupid bug causing warning message to be displayed too often. * src/inifile.c: Use hash table instead of linked list. * src/effectbrowser.c: Remember pane sizes along with geometry. * src/main.c (geometry_stack_push): Added an optional extra tag argument for the stack items. 2004-09-29 Magnus Hjorth * src/viewcache.c (view_cache_draw_part): Added a scaling factor argument. * src/chunkview.c (chunk_view_changed): Harmless off-by-one bug fixed. 2004-09-20 Magnus Hjorth * src/sound-esound.c: Re-written from scratch. 2004-09-18 Magnus Hjorth * src/recorddialog.c: Support pausing and resuming of the recording. 2004-09-15 Magnus Hjorth * src/datasource.c (datasource_open_sndfile): Open the file ourselves and then use sf_open_fd. 2004-09-13 Magnus Hjorth * src/mainwindow.c (mainwindow_new_with_file): Make sure file names are absolute in the recent file list. * src/viewcache.c (view_cache_update): Handle errors without spitting out too many message boxes. * src/chunk.c (chunk_open): Don't try to close the datasource that we just failed to open. 2004-09-12 Magnus Hjorth * src/soxdialog.c (sox_dialog_register_main): Call close_all_files. * src/main.c (launch_mixer): Call close_all_files. This should fix a problem with the mixer locking the sound card if it's launched in the middle of recording. * src/filetypes.c (run_decoder): Call close_all_files. * src/gtkfiles.h: Rewrote the file handling functions to use file descriptors instead of streams. Added a call to close all file handles from 3 up to the highest encountered file descriptor + 1. This can then be used before exec() is called to ensure the child process doesn't get any file descriptors other than 0,1 & 2. 2004-08-29 Magnus Hjorth * src/gtkfiles.c (get_filename): Ask when overwriting a file when using the file chooser in save mode. * Released version 1.3.2. 2004-08-25 Magnus Hjorth * src/effectbrowser.c (apply_click): Added option to re-raise the effect browser after applying effect. 2004-08-24 Magnus Hjorth * src/main.c (geometry_stack_pop): Added sanity check. * src/filetypes.c (setup_types): Changed to add ogg support if either oggenc or oggdec is found instead of only if both are found. Some people seem to just have one of those. * src/chunkview.c (chunk_view_button_press): Made right click "snap" to selection start/end if nearer than 3 pixels, same distance as for the mouse cursor to become arrows. 2004-08-23 Magnus Hjorth * src/main.c (geometry_stack_pop): Using gtk_window_set_default_size instead of gtk_widget_set_usize. * src/inifile.c (inifile_init): Changed default permission for .mhwaveedit directory to 0755 * src/mainwindow.c: Double click selects area between the nearest marks * src/viewcache.c (view_cache_update): Fixed a bug causing the first pass to be skipped when scrolling. 2004-08-22 Magnus Hjorth * src/sound-jack.c (mhjack_setup_buffers): Forgot to multiply sample rate by sizeof(float) when calculating buffer size. (mhjack_clear_buffers): Set the is_playing flag to FALSE, so we wait until there's data in the buffers. (mhjack_output_play): Don't start playing unless the buffers are nearly full. (mhjack_clear_buffers): Removed assertion that no longer must hold. 2004-08-17 Magnus Hjorth * src/mainwindow.c (mainwindow_keypress): Added keyboard commands '(' and ')' for playing the first/last 3 seconds of selection (or file if nothing is selected) * src/gtkfiles.c (file_exists): Re-written to use the stat function. 2004-08-16 Magnus Hjorth * src/main.c: Made background colour configurable. * src/viewcache.c (view_cache_update): Added a second "pass" that reads the file with higher quality. 2004-08-11 Magnus Hjorth * src/sound-esound.c: Esound driver contributed by Erica Andrews. 2004-08-08 Magnus Hjorth * src/mainwindow.c (list_widget_destroy): Fixed a segfault on exit caused by modifying a GList that is used by a calling function. * src/effectbrowser.c (effect_browser_destroy): Forgot to call inherited destroy function. 2004-08-06 Magnus Hjorth * Released version 1.3.1. 2004-08-05 Magnus Hjorth * src/player.c: Fixed a bug causing the cursor to stop before end of file. * src/filetypes.c (mp3_save): Changed to use putenv (more portable than setenv). Ditto for ogg_save. 2004-08-04 Magnus Hjorth * src/mainwindow.c (create_menu): Added Normalize and Effects dialog to need_chunk_names, apparently their keyboard shortcuts still fires otherwise on some systems. * src/configdialog.c (config_dialog_ok): Put a limit on the number of recent files just to avoid absurd values. * src/filetypes.c (mp3_save): Put filename into environment variable instead of substituting into command line. Better for security reasons. 2004-07-27 Magnus Hjorth * src/gotodialog.c: No longer a subclass of EffectDialog. * src/effectbrowser.c: Added selection of which window we want to apply the effect to. Interface updates to effectdialog and all its subclasses. * Set the default button box layout once in main instead of every time we create one. 2004-07-25 Magnus Hjorth * src/mainwindow.c: Modified the way untitled files are named, so now they're shown as untitled, untitled #2, ... instead of (untitled). Moved geometry stack stuff to main.c. * src/player.c (player_get_real_pos): Re-written to fix cursor jumping problems. (player_get_real_pos): Renamed to player_get_real_pos_main and called from player_work to get the underrun check before any data is sent. 2004-07-20 Magnus Hjorth * src/pipedialog.c (pipe_dialog_pipe_chunk_main): Don't modify the sendwav parameter. 2004-07-17 Magnus Hjorth * src/gtkfiles.c (get_filename): Make sure no double-slashes are returned. * src/mainwindow.c: Show most recently opened files in the file menu. 2004-07-14 Magnus Hjorth * src/effectbrowser.c (effect_browser_init): Put the effect settings widget inside a viewport, since some LADSPA plugins have a lot of settings. 2004-07-08 Magnus Hjorth * src/pipedialog.c (pipe_dialog_pipe_chunk_main): If sendwav == TRUE, always send the data as little-endian. 2004-06-21 Magnus Hjorth * Released version 1.3.0. 2004-06-19 Magnus Hjorth * src/sound.h: Changed name of output_play_delay_time to output_play_min_delay_time, and made the sound drivers return the latency not counting the driver's ring buffers. * src/player.c (player_get_real_pos): Avoid unneccesary while loop that causes cpu usage to slowly increase while playing loops. 2004-06-18 Magnus Hjorth * src/player.c (player_get_real_pos): Decided to only use clock time to determine cursor position since the latency check caused problems with jumping cursor and wasn't sample accurate anyway. Also added check for underruns. * src/pipedialog.c (pipe_dialog_send_chunk): Return TRUE if the whole chunk didn't get sent. * src/filetypes.c (quote_escape): Forgot zero-termination. * src/pipedialog.c (pipe_dialog_pipe_chunk_main): When not reading process's stdout, stop sending data if stderr was closed. * src/chunkview.c (chunk_view_set_cursor): Changed condition to avoid unnecessary jumping. * src/sound-jack.c (mhjack_clear_buffers): Fixed a race condition. 2004-06-17 Magnus Hjorth * src/tempfile.c (tempfile_finished_bs): Moved assertion below variable declarations to avoid compilation problems. 2004-06-15 Magnus Hjorth * src/datasource.c (datasource_backup_unlink): Try to move the file to each temporary directory before making a copy. * Replaced the toolbar pixmaps with iconset contributed by Adam Pribyl. * src/gtkfiles.c (get_directory): Implemented for both GtkFileSelection and GtkFileChooser. Also made GtkFileChooserDialog windows modal. * src/mainwindow.c: Added auto-start when jumping to mark flag. 2004-06-14 Magnus Hjorth * src/tempfile.c: API changes to support multiple temp partitions. Major rewrite to support multiple tempdirs. * src/inifile.c (inifile_set): Remove the setting if the value is NULL. 2004-06-13 Magnus Hjorth * src/mainwindow.c (file_saveselection): Forgot to free filename. (file_open): Forgot to free filename. * src/configdialog.c: Added temporary dir list config widgets. 2004-06-12 Magnus Hjorth * Removed the old chunk_create_temp macros throughout the code. * src/tempfile.c: Separated temp file related stuff from datasource.c. * src/mainwindow.c (mainwindow_keypress): Added space key shortcut for play/stop. 2004-06-09 Magnus Hjorth * src/sound-oss.c (oss_preferences): Added option to avoid select calls. Apparently selecting on input doesn't work on some OSS-"compatible" kernel drivers. * src/mainwindow.c (create_menu): Replaced Sox effects menu item with a effects dialog menu item that opens the effect browser with the last selected effect. * src/effectbrowser.c (effect_browser_new_with_effect): If effect == NULL, get the last used effect from inifile. 2004-06-05 Magnus Hjorth * src/inifile.c: When reading a setting, don't create it if it didn't exist. 2004-06-04 Magnus Hjorth * src/mainwindow.c (create_menu): Added LADSPA menu item. * src/effectbrowser.c (effect_browser_init): Changed to use a slidable container. * src/ladspadialog.c: New file. 2004-06-03 Magnus Hjorth * src/chunkview.c (scroll_wheel): Forgot to update an if-statement when adding largefile support, this caused a segfault when zooming out using the scroll wheel. 2004-06-02 Magnus Hjorth * src/ladspacore.c: New file. * src/convert_inc.c: Moved the conversion routines here from datasource.c because the Jack driver always needs the float version even if we're compiling with sample_t == double and I don't want to duplicate code. 2004-05-28 Magnus Hjorth * src/sound-jack.c: New file (Jack sound driver). 2004-05-20 Magnus Hjorth * src/um.c: Added new call popup_error that doesn't block. 2004-05-19 Magnus Hjorth * src/recorddialog.c (record_dialog_init): Remember the last used record format and automatically set it when the record dialog is re-opened. 2004-05-17 Magnus Hjorth * src/um.c (showdlg): Added a flag to prevent use of GTK before calling gtk_init. * src/main.c (main): Check for -- option. 2004-05-06 Mark Tyler * src/mainwindow.c (mainwindow_chunk_change): Reset the cursor so it won't remain as arrows after cutting. (mainwindow_show_effect_dialog): Hack that was made unnecessary by change in effect browser was removed. (create_menu): Added Ctrl-N keyboard shortcut for normalize. (create_toolbar): Added inifile entries for loop mode and follow mode toggle buttons. * src/effectbrowser.c (effect_browser_init): Change the selection mode to GTK_SELECTION_SINGLE to make keyboard shortcuts work properly. 2004-05-03 Magnus Hjorth * src/recorddialog.c: Rearranged the dialog a bit. 2004-04-29 Mark Tyler * src/recorddialog.c: Added option to limit recording time. 2004-04-29 Magnus Hjorth * src/sound-alsalib.c (alsa_output_want_data): We should have at least 4 ms of data ready to write. (to avoid 100% CPU usage) * src/soxdialog.c (sox_dialog_apply_proc): Bug causing the "butterworth band-pass" effect to crash fixed. 2004-04-28 Magnus Hjorth * src/chunkview.c (chunk_view_set_cursor): A new option to keep the cursor in center all the time when following playback was added. If it's not enabled, the view will flip one screenfull whenever the cursor goes out of the view. 2004-04-27 Magnus Hjorth * src/effectbrowser.c (effect_browser_destroy): Refcount fix. * src/filetypes.c (wav_save): Warn once when saving large wav files. * src/chunkview.c: Zero-length fix. 2004-04-26 Magnus Hjorth * src/mainwindow.c (edit_selectall): Fixed to support off_t. * src/filetypes.c (wav_load): Support loading wav files larger than 4GB if LFS is installed. 2004-04-25 Magnus Hjorth * src/datasource.c (get_wav_header_main): Avoid overflow on data size. * For large file support, guint32/gint32 was replaced with off_t in various places. * src/gtkfiles.c (e_ftell): Use ftello instead of ftell. (e_fseek): Use fseeko instead of fseek. 2004-04-24 Magnus Hjorth * src/datasource.c (tempfile_finished_main): Set file format tag to "unknown" on sample_t temporary files. (tempfile_write): Memory leak and tempfile numbering fix. * src/filetypes.c (sndfile_load): Create fake pcm tempfile if appropriate. (sndfile_load): Treat 24/32-bit PCM files as any floating-point file. * src/chunk.c (_chunk_filter): Create a fake_pcm tempfile if any of the processed datasources are floating point. (chunk_mix): If any of the processed datasources are floating point, create a floating point tempfile. * src/datasource.c: Added new datasource types DATASOURCE_TEMPFILE_FLOAT and DATASOURCE_REAL_FLOAT. (tempfile_finished_main): Take a fake_pcm argument. If it's TRUE, assume data written was sample_t values. (datasource_copy): Forgot a break inside the switch statement. * src/gtkfiles.c (get_filename): Re-introduced the savemode flag. Ask when overwriting in save mode, and refuse to load nonexisting files in load mode. (get_filename): Added support for the GTK+ 2.4 GtkFileChooser. 2004-04-23 Magnus Hjorth * src/mainwindow.c (mainwindow_init): Set a default size. * src/chunkview.c (chunk_view_size_request): Make the requisition height smaller so we can shrink the window without losing the status bar. * src/configdialog.c (colors_click): Added Alt+P,Alt+O,Alt+C keyboard shortcuts to colors dialog. * src/sound-oss.c (oss_input_store): Changed the default input read size if GETISPACE call fails to 1/50 seconds. This change has been reported to increase performance on some systems for some unknown reason. 2004-04-23 Mark Tyler * src/sound-oss.c (oss_preferences): Make the OSS preferences window modal. * src/mainwindow.c (help_about): Make the About window modal. * src/configdialog.c (colors_click): Add Enter/Esc keyboard shortcuts for OK/Cancel and make the window modal. Under GTK+ 2, disable the opacity slider and show the default palette. (color_select): Make the "previous color" block display the old colour. (config_dialog_init): Make the preferences dialog modal. 2004-04-22 Mark Tyler * src/recorddialog.c (process_input): Only update the window title if the text has changed. 2004-04-19 Magnus Hjorth * Released version 1.2.9. 2004-04-17 Magnus Hjorth * src/recorddialog.c (process_input): Forgot to change a loop condition. 2004-04-16 Magnus Hjorth * src/player.c (player_replace): Handle the same special case as in do_play here. * src/mainwindow.c (do_play): Set the new playstart to the cursor position so the looping works properly. (do_play): Handle a special case. * src/chunkview.c (chunk_view_update_cache): Didn't always update the view at the end. * src/mainwindow.c (help_readme): Avoid using page numbers in the code. 2004-04-15 Mark Tyler * src/mainwindow.c (get_save_filename): Take the window's title as an argument and use different titles for Open, Save and Save as selection. (help_readme): Under GTK 2, use a fixed-width font for the Keyboard shortcuts tab to make indentation work properly. * src/gtkfiles.c (get_filename): Take the window title as an argument. Also, use gtk_window_set_default_size instead of gtk_widget_set_usize to avoid making the file selection dialog un-shrinkable. * src/effectbrowser.c (effect_browser_init): Use OK instead of Apply when pressing Enter. * docgen/D08_keyboard.doc: Added some keyboard shortcuts. 2004-04-14 Magnus Hjorth * src/chunkview.c (draw_timescale): Updated the bigsizes and bigskip tables so we get even minutes on the time scale. * src/volumedialog.c (findtop): Updated to use maximum_float_value. * src/recorddialog.c (process_input): Updated to use maximum_float_value. * src/mainwindow.c (effects_normalize_proc): Updated to use maximum_float_value. * src/chunk.c (chunk_mix): Use maximum_float_value when checking for clipping. * src/datasource.c: Decided to change the PCM->float conversion code so that the max positive float value when converting from signed becomes a little less than 1.0. Added a function to find out maximum possible positive value for a certain format. The float->PCM code was updated to do the reverse so all information is preserved. * src/filetypes.c (sndfile_save): Tell libsndfile to use normalisation for saving. * src/datasource.c (datasource_open_sndfile): Tell libsndfile to use normalisation. * src/recorddialog.c: Added a "peak lock" button. * src/gtkfiles.c: Remember the file dialog's geometry. * src/configdialog.c (config_dialog_init): Added option to remember size/position of windows. 2004-04-13 Magnus Hjorth * src/mainwindow.c: Remember window size/position and restore in future sessions. * src/chunkview.c (chunk_view_update_image): Selection should be drawn also when selection start < view start. * src/inifile.h (INI_SETTING_REALMAX_DEFAULT): Decreased default disk editing threshold down to 128K. 2004-04-12 Magnus Hjorth * src/sound-oss.c (oss_preferences): Put window in center of screen. * src/configdialog.c (config_dialog_init): Changed layout. * src/player.c (player_replace): Fixed a bug in latency calculation that could cause a segfault. * src/mainwindow.c (mainwindow_chunk_change): off-by-one bug fixed. (edit_undo): Call fix_title. * src/chunkview.c: Various changes were made so that the image pixmap doesn't have to be reallocated and only the relevant part of the pixmap is updated. 2004-04-11 Magnus Hjorth * src/main.c (main): Set the default locale. * src/soxdialog.c (sox_dialog_apply_proc): Use the C locale when creating the command line for SoX. * src/inifile.c (inifile_get_gfloat): Always use the C locale when reading floats from the inifile. (inifile_set_gfloat): Always use the C locale when writing floats to the inifile. 2004-04-10 Magnus Hjorth * src/recorddialog.c (process_input): Don't freeze the rms values, just the peaks. * src/mainwindow.c (file_saveselection): Use the same default directory as the regular 'save as' function. * src/recorddialog.c: Made peak_values into a member of RecordDialog. * src/samplesizedialog.c (samplesize_apply_proc): Forgot to calculate samplebytes. * src/chunk.c (chunk_clone_df): Fix bug giving wrong chunk length. 2004-04-09 Magnus Hjorth * src/gtkfiles.c: Removed the fake link stuff since it's no longer needed. Changed xlink into xrename. * src/filetypes.c (wav_save): Instead of creating a link, rename the file and change the datasource type into virtual. * src/datasource.c (datasource_clone_df): Code cleanup. Always turn virtuals and sndfiles into clones. (datasource_read_array_main): Handle all fake_pcm sources the same way. Added type DATASOURCE_REF (datasource_backup_unlink): Chenged to rename the first file then copy the rest. * src/mainwindow.c (mainwindow_update_cursors): Add a check so we don't update the cursors too often. This could cause a lot of CPU usage, esp when using GTK 2. 2004-04-08 Magnus Hjorth * src/gtkfiles.c (xlink): Modified to rename the file and "remember" the old name in a fake_links table if hard links aren't available. (xunlink): Handles fake links. (e_fopen): Lookup fake link names. (is_same_file): Lookups fake link names. (errdlg_filesize): Lookups fake link names. (file_exists): Return TRUE if it's a fake link. 2004-04-08 Mark Tyler * src/recorddialog.c: Display maximum peak values. Added a 'reset peaks' button. * src/chunkview.c: cleaned up the mouse scroll wheel code so that GTK 1 & 2 use the same procedure. 2004-04-07 Magnus Hjorth * src/mainwindow.c: Added "Silence selection" menu item. * src/chunk.c (chunk_read_fp): Fixed a bug. 2004-04-06 Magnus Hjorth * src/statusbar.c (status_bar_set_info): Re-layout if max value is more than older max values. * src/mainwindow.c (mainwindow_save): Save the last saved filename into inifile entry 'lastSaveFile' and use it to select default directory for save dialog. (file_open): Save the last opened file name into inifile entry 'lastOpenFile' and use it to select default directory for open dialog. * src/chunk.c (chunk_mix): Fixed bug causing bad output and cleaned up the code a bit. Also added a warning if clipping occured. * src/statusbar.c: Made the new status bar work under GTK+ 2 as well.. 2004-04-05 Magnus Hjorth * Moved the get_time function to main.c and modified it to take a highest possible value to determine number of digits that should be shown. * Re-wrote the Statusbar widget to be a subclass of GtkFixed containing labels. This cleans up the code and improves the formatting of the text. Also removed the ugly leftover processdialog code. * src/mainwindow.c (do_play): Fixed the previous fix so play selection works properly again. 2004-04-04 Mark Tyler * src/mainwindow.c (mainwindow_keypress): Use slash key as shortcut to "play selection". 2004-04-02 Magnus Hjorth * src/mainwindow.c (do_play): Fixed wobbling sound while holding down the ',' key. * src/player.c (player_replace): Fixed cursor getting out of sync with playback when cutting out parts before it. * src/mainwindow.c (mainwindow_chunk_change): Fixed playback ending too early when cutting out parts. 2004-04-01 Magnus Hjorth * src/chunkview.c (chunk_view_update_marks_r): Fixed a bug causing segfaults when trying to go to deleted marks. * Created a new directory docgen/ containing the different chapters for the on-line help and README file and a shell script for generating README and help.c 2004-03-31 Mark Tyler * src/chunkview.c (draw_time_bars): Draw time as ss, mm:ss or hh'mm:ss instead of just seconds. (chunk_view_class_init): Support scroll wheel events under GTK+ 2.x. * src/mainwindow.c (mainwindow_keypress): Also support keypad +/- for zooming in/out. Also use '=' as alternate shortcut to '+' since the '+' key is shifted in some keyboard layouts. (help_readme): New built-in docs available from the Help menu. (mainwindow_init): Put window in center of screen and support Enter/Esc key presses as shortcuts for OK/Cancel. (create_menu): Changed keyboard shortcuts for paste to Ctrl+V and added a few other. * src/recorddialog.c (process_input): Show amount of time recorded in window title. 2004-03-30 Mark Tyler * src/chunk.c (get_time): Show hours separately. 2004-03-29 Mark Tyler * src/gtkfiles.c (get_filename): Put window in center. 2004-03-28 Mark Tyler * src/effectbrowser.c (effect_browser_init): Centre the window and add support for Enter/Esc key presses. * src/gotodialog.c (goto_dialog_new): Same here. * src/pipedialog.c (create_error_window): Same here. * src/recorddialog.c (other_format_dialog): Same here. 2004-03-27 Mark Tyler * src/configdialog.c (config_dialog_init): Put the window in center.of screen. (config_dialog_init): Enter keypress made shortcut for clicking OK, and Esc made shortcut for Cancel. 2004-03-25 Magnus Hjorth * Released version 1.2.8. * src/chunk.c (volume_ramp_proc): Avoid rounding error causing weird behaviour when fading large parts. * src/recorddialog.c (record_dialog_set_format): Forgot to set some members to NULL after freeing them. 2004-03-24 Magnus Hjorth * src/filetypes.c (chunk_save): Try opening the file for append once to make sure we don't save over write-protected files. * src/recorddialog.c (record_dialog_set_format): Handle unsupported format properly. * src/chunk.c (chunk_remove_part): Fixed bug causing segfaults. 2004-03-21 Magnus Hjorth * src/filetypes.c (chunk_load): Try opening the file once to check permissions etc. * src/chunk.c (chunk_read_array): Another fix for large files. (chunk_read_array_fp): Same here. * src/viewcache.c (view_cache_update): Fix for segfaults when editing large files (changed type from guint to guint32 on some vars). * src/filetypes.c (sndfile_save): Fix progress bar going half as fast as it should when saving stereo files. * src/main.c: A better solution to the 100% cpu bugs. Removed the old fixes. 2004-03-15 Magnus Hjorth * src/filetypes.c (chunk_save_main): Fixed a 100% cpu bug similar to the one in raw_load below. * src/sound.c (input_stop): Bug when using the "keep sound driver opened" option, opening the record dialog, then closing it again 2004-03-14 Magnus Hjorth * src/mainwindow.c (create_menu): Added fade in and fade out menu items and changed the menu layout a little bit. * src/filetypes.c (wav_save): Don't automatically create a link if we're saving a regular wav file directly into a new wav file. * src/sound-oss.c (oss_output_flush): Added a workaround for what seems to be an ALSA OSS emulation bug in some older ALSA versions (0.9.6). * src/volumedialog.c (volume_dialog_init): Modified the layout somewhat so the tab order of the widget makes more sense. * src/chunk.c (chunk_read_array): Update the buffer pointer (chunk_read_array_fp): Same here. * src/filetypes.c (raw_load): Make the progress bar inactive before showing the dialog, this avoids a 100% cpu loop. * src/recorddialog.c (check_format_change): Just wait until buttons are released, not all modifier keys as some systems seem to have some modifier keys pressed in at all times. * src/chunkview.c (chunk_view_motion_notify): Removed unneccesary if condition that also caused problems on some systems. 2004-03-11 Magnus Hjorth * src/player.c: Added gtk_object_ref/unref calls to player.c 2004-02-24 Magnus Hjorth * Released version 1.2.7. 2004-02-23 Magnus Hjorth * src/sound-portaudio.c: Added input overrun count call. * src/vu_meter.c: Re-written to look more like real analog VU meters. * src/main.c (launch_mixer): Run mixer command through /bin/sh. This makes it possible to use any shell command as mixer utility (for example "rxvt -e alsamixer") 2004-02-20 Magnus Hjorth * src/sound.c: Added ALSAlib driver * configure.in: Added checks for AlsaLib * src/sound-alsalib.c: New file. * src/sound-dummy.c (dummy_input_stop): Allow this call also when the driver is in state 2. 2004-02-19 Magnus Hjorth * src/recorddialog.c: Rewrite finished. 2004-02-15 Magnus Hjorth * src/recorddialog.c: Re-writing from scratch. 2004-02-14 Magnus Hjorth * src/mainwindow.c (mainwindow_init): Forgot to initialize the 'sensitive' member. This fixes a bug with disabled keyboard input in some windows. 2004-02-07 Magnus Hjorth * Released version 1.2.6. * src/um.c (user_message): When compiled under Gtk+ 2, use the GtkMessageDialog functions. * Replaced lots of user_message calls with user_info/warning/error calls. * src/chunkview.c: Scroll automatically when selecting. * src/mainwindow.c: Created zooming scrollbar 2004-01-31 Magnus Hjorth * src/chunkview.c: Made selection endpoints draggable and added ability to select+play using button 2 and zoom in/out using buttons 4 and 5 (scrolling wheel). 2004-01-21 Magnus Hjorth * src/datasource.c (datasource_byteswap): Moved variable declaration to top of function. This caused compilation of 1.2.5 to fail on some systems (RH 7.3). 2004-01-20 Magnus Hjorth * src/um.c (user_message): Put window in center of screen. 2004-01-19 Magnus Hjorth * Released version 1.2.5. * src/datasource.c (datasource_convert_samplesize): React to Esc keypress. 2004-01-17 Magnus Hjorth * src/sampleratedialog.c: Add support for SoX sample rate changing methods. 2004-01-15 Magnus Hjorth * src/datasource.c (datasource_dump): Increased buffer size to 64K. 2004-01-09 Magnus Hjorth * src/mainwindow.c (file_saveselection): NULL pointer error fixed. * src/filetypes.c: Display progress while saving. 2004-01-08 Magnus Hjorth * src/mainwindow.c (mainwindow_effect_manual): Forgot a gtk_object_sink call. 2004-01-07 Magnus Hjorth * configure.in: Changed to generate config.h * src/combinechannelsdialog.c: Use better channel names. * src/pipedialog.c: Added option to send wav header. * src/chunk.c (chunk_parse): Forgot a call to processdialog_finished. * src/soxdialog.c: New file. 2004-01-05 Magnus Hjorth * src/float_box.c (floatbox_set): Made the entry smaller and drop trailing zeroes. * src/int_box.c (intbox_init): Made the entry smaller. * src/gotodialog.c (goto_dialog_apply): Update player position properly if were playing at the same time. 2004-01-04 Magnus Hjorth * src/historybox.c (history_box_set_history): Fixed harmless assertion error when history is empty. * src/mainwindow.c (edit_undo): Update window title after undoing. * src/chunk.c (chunk_convert_samplesize): Fixed an incorrect assertion and a small memory leak. (chunk_convert_samplesize): Fixed bug. 2004-01-03 Magnus Hjorth * src/effectbrowser.c: New file. * src/effectdialog.c: Handle failed operations properly. 2004-01-02 Magnus Hjorth * src/mainwindow.c (file_close): Fix an assertion error when using File/Close on a window while playing. * src/processdialog.c: Made progress display in status bar instead of in separate window. 2003-12-30 Magnus Hjorth * src/statusbar.c: New file. 2003-12-27 Magnus Hjorth * src/filetypes.c (find_nearest_sndfile_format): Fixed gcc3 warning. 2003-12-26 Magnus Hjorth * Released version 1.2.4. * src/configdialog.c: Added checkbox for byte-swapped output. * src/sound.c: Add option to byte-swap output. 2003-12-22 Magnus Hjorth * Redid the bigendian stuff to a better solution.. 2003-11-30 Magnus Hjorth * Some bigendian fixes. 2003-10-07 Magnus Hjorth * src/sound.c (sound_quit): Same here. * src/sound.c (input_supports_format): Need to stop output if driver is "locked". * src/formatselector.c (format_selector_init): Wrong order of endian dialog boxes. 2003-09-26 Magnus Hjorth * src/mainwindow.c: Play/Record menu item was not dimmed properly. * Added normalize function. 2003-09-24 Magnus Hjorth * src/chunkview.c (chunk_view_set_mark): Fixed to remove gcc warning. * src/main.h (XOR): Fixed macro. 2003-09-23 Magnus Hjorth * Lots of changes to support big-endian systems with automagic byte-swapping 2003-09-11 Magnus Hjorth * src/filetypes.c (wav_load): Now recognizes big-endian RIFX files. 2003-09-08 Magnus Hjorth * src/datasource.c: PCM conversion routines now assumes that the data has same endian-ness as the system instead of always little-endian. 2003-09-07 Magnus Hjorth * src/datasource.c (datasource_read_array_fp): Fixed big memory leak. 2003-09-02 Magnus Hjorth * src/main.h: Added macro for systems without 'ceill' call. 2003-07-23 Magnus Hjorth * src/mainwindow.c (mainwindow_save): Remember which directory we saved into and use it as default for future calls. 2003-06-10 Magnus Hjorth * Released version 1.2.3. * src/um.c: Changed to use mainloop. * src/gtkfiles.c (get_filename): Changed to use mainloop. 2003-06-09 Magnus Hjorth * src/mainwindow.c (create_menu): Menu reorganisation. * src/main.c (main): Redone "scheduling" code so the program works better under CPU load (hopefully). * src/samplesizedialog.c (samplesize_apply): Make sure the texts are updated. * src/sampleratedialog.c (apply): Make sure the texts are updated. * src/chunkview.c (chunk_view_set_view): Make sure the view cache follows when scrolling * src/configdialog.c (config_dialog_ok): Make the time display mode configurable. * src/chunk.c (get_time): Show in different formats depending on the variable get_time_mode 2003-06-07 Magnus Hjorth * src/chunkview.c (draw_mark): Draw the lines even if they're near the edge of the image. * src/player.c (player_work): Removed while loop since it seems to have caused lockups for some people and it's not necessary anymore anyways. 2003-05-30 Magnus Hjorth * src/chunk.c (chunk_read_array_fp): Bug causing failed assertion was fixed. (chunk_read_array): Same bug here. 2003-05-27 Magnus Hjorth * src/gtkfiles.c: Renamed errdlg_fread_bswap to e_fread_bswap. 2003-05-26 Magnus Hjorth * Released version 1.2.2. * src/vu_meter.c (vu_meter_expose): Added peak values * Large code rewrite finished affecting a lot of files but mainly chunk.c. Parts of chunk.c has been moved to datasource.c and filetypes.c. These changes fixed a few bugs, and hopefully will make the code easier to debug in the future. 2003-05-11 Magnus Hjorth * Released version 1.2.1. * src/chunk.c (chunk_copy_channel): Optimize for mono->stereo conversion. * src/mainwindow.c (effects_splitchannel): Another one of those segfault-on-cancel bugs. 2003-05-10 Magnus Hjorth * src/chunkview.c (chunk_view_size_request): Request a nice size. * Follow mode implemented. (mainwindow.c, chunkview.c). 2003-05-07 Magnus Hjorth * "Line Mode" option was removed. "Line mode quality" replaced by "View quality". * src/chunkview.c: Changed to use ViewCache. * src/viewcache.c: New file. 2003-04-10 Magnus Hjorth * src/gtkfiles.c: Changed API. 2003-04-08 Magnus Hjorth * src/chunk.c (chunk_read_array): Fixed offset bug causing data loss. 2003-03-10 Magnus Hjorth * src/mainwindow.c (effects_mixchannels): Fixed segfault on Cancel. 2003-01-26 Magnus Hjorth * src/historybox.h: New file. * src/pipedialog.c: Implemented a 'Pipe through program' effect. 2003-01-25 Magnus Hjorth * src/pipedialog.h: New file. * src/effectdialog.h: Documented. 2003-01-17 Magnus Hjorth * Released version 1.2.0. * src/recorddialog.c (record_dialog_execute): Make sure we store all available data. * src/chunk.c (chunk_save_to_wav): If we're saving a whole tempfile (or virtual) and that tempfile is in wav format, link or copy the file. This should speed up things for example when saving to wav directly after recording. 2003-01-16 Magnus Hjorth * src/configdialog.c: "Show time scale by default" setting added. * src/chunk.c (chunk_create_temp_finished): Write tempfiles in wav format instead of raw format. * Updated copyright notices. * src/chunk.c (_chunk_read_array): Multi-chunk bug fixed. * src/chunkview.c: Time scale functions. 2003-01-15 Magnus Hjorth * src/effectdialog.c (effect_dialog_set_mainwindow): Make sure we close after all files have been closed. * src/gotodialog.c: New file. 2003-01-12 Magnus Hjorth * Decided to throw away the multi-threaded player because the single-threaded version was better. Rename playthread.c to player.c. 2003-01-06 Magnus Hjorth * src/mainwindow.c (help_about): Add some info about compilation settings. 2003-01-02 Magnus Hjorth * src/chunk.h: Redefined chunk_filter_proc to be able to use new chunk_creat_temp... * src/chunk.c (chunk_create_temp_init): Made these functions re-entrant and cleaned them up. * src/sound.h: Added new calls output_wait and output_flush_buffers. Also made output_stop output all remaining data. 2003-01-01 Magnus Hjorth * src/chunk.c (chunk_new_from_wav): Avoid choking on very large files. 2002-12-29 Magnus Hjorth * src/main.c (get_home_directory): Made it re-entrant. * configure.in: Add checks for posix threads but also support systems where glib is configured without thread support. 2002-12-27 Magnus Hjorth * src/chunk.c (get_temp_filename): Use mutex to make it thread-safe. 2002-12-26 Magnus Hjorth * src/chunk.h: API change to chunk_open/read/close to support threads. 2002-12-25 Magnus Hjorth * src/playthread.c: New file. * src/mainwindow.c: Rebuilt undo system to also restore selection, cursor, view and marks. * Removed src/menu.c and src/menu.h (no longer needed). 2002-12-24 Magnus Hjorth * src/mainwindow.c (create_menu): Use GtkItemFactory. Added keyboard shortcuts. 2002-12-10 Magnus Hjorth * Released version 1.1.6. * src/mainwindow.c (file_close): Don't ask twice if file should be saved. 2002-11-29 Magnus Hjorth * src/sound-oss.c (oss_input_store): It seems SNDCTL_DSP_GETISPACE ioctl always returns 0 on some systems. We must ignore it in that case. * src/recorddialog.c (record_dialog_getformat): Crash in record dialog fixed. 2002-11-27 Magnus Hjorth * src/chunk.c (chunk_new_from_file): Don't try to open directories and other strange files... * src/gtkfiles.c (file_is_normal): New function. 2002-11-26 Magnus Hjorth * Updated IFDEFs in the code to match the configure script. 2002-11-25 Magnus Hjorth * configure.in: Changed most of the checking code. Output a configuration summary at the end. Use pkg-config for libsndfile check and allow manually specifying libsndfile prefix. 2002-11-12 Magnus Hjorth * Released version 1.1.5. * src/chunkview.c (draw_mark): GTK 2 compatibility fixed. * src/chunk.c (chunk_new_from_sndfile): Fixed a problem with big-endian files. 2002-11-11 Magnus Hjorth * src/chunk.c (backup_savefile): New nice saving algorithm. (chunk_dump): Close file after dumping. 2002-11-10 Magnus Hjorth * src/chunk.c (chunk_save_to_file): Some major changes to the saving code. Now tries to move old file instead of copying. * src/mainwindow.c (mainwindow_goto_mark): Start playing at mark position 2002-11-09 Magnus Hjorth * src/chunkview.c: Make marks move properly when cutting/pasting etc. 2002-11-06 Magnus Hjorth * src/chunk.c (chunk_filter): Added convert argument. (chunk_filter): Changed definition of chunk_filter_proc. All such functions must be updated. 2002-11-04 Magnus Hjorth * src/combinechannelsdialog.c (combine_channels_dialog_apply_proc): Ugly bug fixed. 2002-09-20 Magnus Hjorth * src/chunkview.c (chunk_view_set_chunk): Handle setting to same chunk properly. 2002-09-19 Magnus Hjorth * src/chunk.c (chunk_sample_put_array): New function. The file type system has been redesigned with the new libsndfile format enumeration functions. 2002-09-17 Magnus Hjorth * Changed configure.in to detect libsndfile 1.x * Released version 1.1.4. 2002-08-29 Magnus Hjorth * src/chunk.c (chunk_filter): Handle if user presses Cancel properly. 2002-07-30 Magnus Hjorth * configure.in: Added --disable-gtk2 option. 2002-07-29 Magnus Hjorth * src/recorddialog.c: GTK2 * src/float_box.c: GTK 2. * src/mainwindow.c: GTK 2 compatible. * src/effectdialog.c: GTK 2 compatible * src/um.c: GTK 2 compatible. * src/processdialog.c: GTK 2 compatible. * src/chunkview.c: GTK2 compatible. * src/sound-oss.c: GTK2 compatible. * src/int_box.c: GTK2 compatible. * src/chunk.c: Changed shutdown handler into destroy handler (for GTK 2.0) and made chunk_destroy support multiple invocations without crashing. * src/chunk.h: Cleaned up and heavily documented. 2002-07-28 Magnus Hjorth * src/chunk.h: Added member samplebytes to Chunk struct. 2002-05-24 Magnus Hjorth * src/chunk.h: Made chunk_samples_to_bytes/chunk_bytes_to_samples into macros. * src/chunk.c (chunk_sample_get_array): New function (speed improvement). 2002-04-14 Magnus Hjorth * Released version 1.1.3. 2002-04-10 Magnus Hjorth * src/mainwindow.c (create_toolbar): Added "Launch mixer" button. * src/button_mixer.xpm: New file. * src/recorddialog.c (record_dialog_init): Added "Launch Mixer" button. * src/configdialog.c (config_dialog_init): Added "mixer utility" option. * src/mainwindow.c (play_callback): To support non-threaded sound drivers, output_play is called with a NULL pointer if all data has been sent. (The drivers have been updated to support this). * src/sound.c: Added OSS driver. 2002-04-09 Magnus Hjorth * src/sound-oss.c: New file. 2002-04-04 Magnus Hjorth * src/configdialog.c: Added button for sound driver preferences. * src/sound.c: Add support for sound driver specific preferences dialog. 2002-04-03 Magnus Hjorth * src/sound.c: Added #include "main.h". 2002-04-02 Magnus Hjorth * Released version 1.1.2 * src/chunk.c (chunk_save_to_file): Ask for file type if it isn't possible to tell by the extension. * src/mainwindow.c (mainwindow_save): Don't update the file name if saving failed. * src/chunkview.c (chunk_view_set_chunk): Set the cursor to 0 when setting the chunk to NULL. 2002-04-01 Magnus Hjorth * src/um.c (user_message): Use gtk_label_set_line_wrap instead of doing it ourselves. 2002-03-31 Magnus Hjorth * src/chunk.c: libsndfile support finally in place!! Now supports a lot of nice new file formats. 2002-03-14 Magnus Hjorth * src/chunk.h (chunk_new_from_file): New functions for loading files (supports multiple formats and raw files). * src/rawdialog.c: New file. 2002-02-24 Magnus Hjorth * src/chunk.h (CHUNK_SNDFILE): New chunk type. * configure.in: Check for libsndfile library. 2002-02-22 Magnus Hjorth * src/chunk.c (chunk_filter): Reimplemented using chunk_read_block/chunk_create_temp. (chunk_parse): Reimplemented using chunk_read_block (chunk_filter): Changed interface. (chunk_convert_samplerate_proc): Fixed speed change when converting multichannel chunks. 2002-02-20 Magnus Hjorth * src/chunk.c (chunk_read): Just use chunk_read_block instead of doing everything ourselves. (chunk_create_temp_*): Now has write-behind caching so it buffers the data in memory and starts writing it to disk when the amount of data exceeds MAX_REAL_SIZE. (chunk_dump): Reimplemented using chunk_read_block * src/configdialog.c: Placed the OK button to the left of the Cancel button and left-adjusted the 'Outbut buffer size' label. 2002-02-20 Jens Askengren * src/configdialog.c: Added accelerator keys and placed the buttons inside a GtkBBox. 2002-02-19 Magnus Hjorth * Released version 1.1.1 * configure.in: New option --without-check-casts. * src/mainwindow.c (play_compensate_change): Position the cursor properly. * src/chunkview.c (chunk_view_update_image): The selection should always be at least one pixel wide. 2002-02-18 Magnus Hjorth * src/recorddialog.c: Save the selected format into the inifile when ok is clicked, use that as default format next time. 2002-02-17 Magnus Hjorth * src/mainwindow.c (create_menu): New menu item 'Edit/Insert silence'. (create_menu): New menu item 'Edit/Clear undo buffer'. (create_menu): New menu item 'Edit/Clear Clipboard'. * src/chunk.c: New chunk type CHUNK_SILENCE. 2002-02-12 Magnus Hjorth * src/mainwindow.c (file_close): If File/Close is selected on the last window, don't close it, just set the chunk to NULL. * src/mainwindow.c (update_desc): Handle w->view->chunk==NULL. (mainwindow_shutdown): Small memory leak fixed. (file_close): File/Close does not always close the window now. * src/chunkview.c (chunk_view_set_chunk): Segfault fixed when changing the chunk back to NULL. (chunk_view_set_selection): Handle cv->chunk==NULL properly. * src/mainwindow.c (mainwindow_delete_event): Only stop playback when it's the same window that is playing and that is closing. 2002-02-09 Magnus Hjorth * src/chunk.c (chunk_save_to_wav): Big-endian bugfix. (big-endian is untested). (chunk_save_to_wav): Now uses chunk_dump instead of chunk_parse (should give a _big_ speedup). 2002-02-07 Magnus Hjorth * Released version 1.1 * src/chunkview.c (calc_x): Simple bug in if-statement that caused the selection color to go to the right edge in small files. (chunk_view_expose): Small cursor fix. * src/mainwindow.c (play_callback): Repeat the output loop if we reach play_end. This makes it possible to hear short looped sounds (shorter than 100ms). Don't repeat more than 1000 times though... * src/combinechannelsdialog.c: When the chunk changes, open a new dialog and close the current if the number of channels have changed, otherwise do nothing. 2002-02-06 Magnus Hjorth * src/chunkview.c (chunk_view_set_chunk): Make sure the cursor position doesn't get out of range when changing to a smaller chunk (caused segfault).. (chunk_view_update_sample_cache): Don't read samples out of range. * src/mainwindow.c (view_zoomin,view_zoomout): Using chunk_view_zoom. New menu item Edit/Mix paste! * src/chunkview.c (chunk_view_zoom): New function with better zooming. 2002-02-05 Magnus Hjorth * src/mainwindow.c (help_about): Cosmetic changes to About dialog. * src/configdialog.c (config_dialog_init): Added "use line mode by default" and "line mode quality" settings. * src/chunkview.c (chunk_view_update_image): Line mode improvements. (chunk_view_update_sample_cache): Made line mode quality an inifile entry. 2002-02-04 Magnus Hjorth * src/chunkview.c: Line mode implemented! * src/mainwindow.c (create_menu): New menu item View/Line mode * src/chunk.c: Created new type sample_t and using that for reading/writing samples. * configure.in: New option --with-double-samples. 2002-02-03 Magnus Hjorth * src/mainwindow.c: Menu reorganisation. * src/effectdialog.c (effect_dialog_set_mainwindow): Now using gtk_signal_connect_object_while_alive instead of doing its own cleanup. 2002-02-02 Magnus Hjorth * src/chunk.c: Clicking cancel during 'Mix channels...' caused segfault. Fixed. * src/float_box.c (floatbox_init): Small fix. * src/mainwindow.c: New menu item Effects/Combine channels... * src/effectdialog.c: New signal mainwindow_set * src/combinechannelsdialog.c: New file. * src/combinechannelsdialog.h: New file. 2002-02-01 Magnus Hjorth * src/mainwindow.c (create_menu): New menu item 'Edit/Preferences...'. * src/configdialog.c: New file. * src/configdialog.h: New file. * src/chunk.c: Now uses configfile setting diskEditingThreshold instead of compiled-in constant 512K. * src/sound-sdl.c, src/sound_portaudio.c: Uses configfile setting soundBufferSize for output buffer size instead of constant 64K. 2002-01-30 Magnus Hjorth * src/sound.c: Supports startup-time (instead of compile-time) selection of output driver now. * src/chunkview.c (chunk_view_motion_notify): Stupid bug, clicking in chunk view before loading anything into it caused crash. * src/inifile.c: New file. * src/inifile.h: New file. * src/chunk.c (chunk_shutdown): Another zero-length/refcounting fix. 2002-01-27 Magnus Hjorth * src/mainwindow.c (do_play): Zero-length fix. * src/recorddialog.c: Vu-meters working. * src/ringbuf.c: Thread safe (hopefully) using mutexes. 2002-01-26 Magnus Hjorth * src/chunk.c (chunk_sample_to_double): Changed type from float to double. * Sound recording works now!! * src/mainwindow.c (edit_cut): Fixed crash when cutting (or deleting) the entire file. * src/chunk.c (chunk_realize): Zero-length fix. * src/chunkview.c (chunk_view_set_view): Zero-length chunks bug fix. (calc_sample): Another zero-length fix. 2002-01-25 Magnus Hjorth * src/mainwindow.c (mainwindow_set_chunk): Set changed flag when filename != NULL * src/recorddialog.c: New file. * src/vu_meter.c: New file. * src/vu_meter.h: New file. 2002-01-24 Magnus Hjorth * src/formatselector.c: New file. * src/formatselector.h: New file. * src/recorddialog.h: New file. * src/mainwindow.c (create_toolbar): Added record button. (create_menu): Added record menuitem. * src/button_record.xpm: New file. * sound-portaudio.c: New file (portaudio sound driver). * Renamed output-* to sound-* 2002-01-23 Magnus Hjorth * src/mainwindow.c (help_about): Show the name of the sound driver. * Autoconf/automake system (yes!). *.c and *.h moved to src subdirectory. * Reorganized sound module. * mainwindow.c (mainwindow_realize): Use icon.xpm. * icon.xpm: New file. * main.h: New file. 2002-01-22 Magnus Hjorth * chunk.c (chunk_save_to_wav): Realize the saved chunk if it's small enough. * chunkview.c (chunk_view_redraw_samples): Redraw bug fixed. * mainwindow.c (create_toolbar): Two new toolbar buttons for setting selection start/end at cursor position. * button_cursorend.xpm: New file. * button_cursorstart.xpm: New file. * mainwindow.c (play_compensate_change): New internal function. This fixes segfaults when file shrinks while playing. (edit_paste): Call play_compensate_change. (edit_cut): Call play_compensate_change. (edit_pasteover): Call play_compensate_change. (edit_delete): Call play_compensate_change. (mainwindow_effect): Call do_stop or play_compensate_change. (mainwindow_effect_manual): Call do_stop or play_compensate_change. (edit_undo): Stop playing. (create_menu): New menuitems: 'Edit/Selection start at cursor' and 'Edit/Selection end at cursor'. * chunkview.c (do_chunk_view_set_cursor): Range-check the cursor argument. 2002-01-21 Magnus Hjorth * mainwindow.c (mainwindow_chunk_change): If the format is being changed on the currently playing file, playback must stop. * chunk.c (chunk_create_multichunk): Refcounting bug fixed. (chunk_create_multichunk): Forgot g_list_free(chunks);. * output-sdl.c (output_supports_format): More than two channels not supported. * README: New file. * chunk.c (chunk_new_from_wav): Better wav file format detection 2002-01-20 Magnus Hjorth * chunkview.c (chunk_view_update_image): changed selection color (calc_x): over/underflow causing selection to sometimes not draw correctly. (do_chunk_view_set_cursor): code cleanup * mainwindow.c (mainwindow_save): windows with changed==FALSE and filename==NULL have not been saved, so don't display the "are you sure?" dialog. 2002-01-19 Magnus Hjorth * Released version 1.0 mhwaveedit-1.4.24/HACKING000066400000000000000000000114401334022513400147230ustar00rootroot00000000000000Info for hackers ---------------- -- Document history -- Oct 28, 2006: First version -- General info -- mhWaveEdit is written completely in C, and tries to be as portable as possible. There's no point in being more portable than GTK+ though, since we depend on it. The only hard dependency is GTK+, version 1.2 or newer. All other dependencies should be autodetected by the configure script or at runtime. In general I prefer calling separate programs, such as Lame and SoX, rather than using libraries, because programs can be portably detected at runtime so the user can install these programs after installing mhWaveEdit. The philosophy is to never remove a feature. If a behavior is changed, there should be an option to get the old back (unless it's a bug of course). All settings should be configurable via the Preferences menu, there should not be any hidden settings, except for "automatic" things like recently opened files etc. Settings are handled through inifile.h. -- Code conventions -- Most functions returning a boolean return TRUE on failure and FALSE on success. The function that fails is usually responsible for displaying an error message, so if a function returns TRUE an error message has already been displayed. I have avoided threads for several reasons. The main reasons are that it's not portable, makes the program much more complex and a lot harder to debug. Most problems that are solved by threads can be solved by other means, for example forking, non-blocking IO, select calls, and/or clever coding. Some sound drivers use threads though. mhWaveEdit doesn't use the GTK+ main loop, instead I have coded my own (mainloop in main.h), allowing me to control the priority of the different activities. -- File handling -- File handling is separated into layers. The lowest layer is the efile functions in gtkfiles.h, that provides a wrapper around the C library IO functions. Above that is the Datasource layer. Each Datasource object gives access to some audio data. The data can be in a file, in memory or converted from another datasource. The Datasources are "immutable", meaning the data never changes after the datasource has been created. The objects are using the standard GtkObject reference counting scheme so data in memory and temporary files are removed when nobody needs them anymore. The Chunk layer is above the Datasource layer. A Chunk object is a collection of data from different Datasource objects. Each Chunk contains a list of Datasources, positions and lengths of data. Chunk objects are also immutable. The filetypes.h and tempfile.h functions are in both the Chunk layer and the Datasource layer. This is because sometimes temporary data end up in multiple files, so a Chunk must be returned to represent the data. The Document object contains a Chunk with the file currently being edited, along with information on selection, view info, history etc. The Chunkview object is a graphical GTK component displaying a Document. The Mainwindow is a GtkWindow subclass containing a Chunkview and a Document. -- Sound handling -- The sound handling is also separated into layers. The lowest layer is the sound driver. Each sound driver is in a file called sound-xyz.c. The sound drivers are not compiled separately, but are included in sound.c The layer above is the sound.h module. This contains glue code for the drivers and handles byte-swapping of output and locking of driver (an option to not actually stop the driver when playback stops). The layer above the sound module is the player.h module. This handles many things; reading data from the playing chunk, looping, converting speed (optional) and sending the data to the sound driver. Also estimating cursor position. The player has a function called player_work that has to be called periodically. The playback position and speed can be changed at runtime. There are also functions for smooth switching of playback between two Chunks to allow editing while playing. The player layer handles sample type conversion if the sound driver doesn't support the file's sample type. Sample rate conversion is done at the same time when applying varispeed. Recording is done through the recorddialog.h module, which is above the sound.h layer. This contains both the recording dialog component and a recording function. This module has it's own main loop and blocks the rest of the application while recording. -- Utility modules -- um.h has functions for displaying messages and getting simple input. rateest.h contains code for estimating the true playback sample rate and detect underruns by studying the time and size of writes to the sound driver. ringbuf.h contains a lock-free ring buffer implementation. main.h contains apart from the main() function main loop, some utility macros and functions. mhwaveedit-1.4.24/INSTALL000066400000000000000000000223061334022513400147700ustar00rootroot00000000000000Copyright 1994, 1995, 1996, 1999, 2000, 2001 Free Software Foundation, Inc. This file is free documentation; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. Basic Installation ================== These are generic installation instructions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). It can also use an optional file (typically called `config.cache' and enabled with `--cache-file=config.cache' or simply `-C') that saves the results of its tests to speed up reconfiguring. (Caching is disabled by default to prevent problems with accidental use of stale cache files.) If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If you are using the cache, and at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.ac' (or `configure.in') is used to create `configure' by a program called `autoconf'. You only need `configure.ac' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. If you're using `csh' on an old version of System V, you might need to type `sh ./configure' instead to prevent `csh' from trying to execute `configure' itself. Running `configure' takes awhile. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package. 4. Type `make install' to install the programs and any data files and documentation. 5. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. Run `./configure --help' for details on some of the pertinent environment variables. You can give `configure' initial values for variables by setting them in the environment. You can do that on the command line like this: ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you must use a version of `make' that supports the `VPATH' variable, such as GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. If you have to use a `make' that does not support the `VPATH' variable, you have to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. Installation Names ================== By default, `make install' will install the package's files in `/usr/local/bin', `/usr/local/man', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PATH'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you give `configure' the option `--exec-prefix=PATH', the package will use PATH as the prefix for installing programs and libraries. Documentation and other data files will still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=PATH' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Specifying the System Type ========================== There may be some features `configure' cannot figure out automatically, but needs to determine by the type of host the package will run on. Usually `configure' can figure that out, but if it prints a message saying it cannot guess the host type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM where SYSTEM can have one of these forms: OS KERNEL-OS See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the host type. If you are _building_ compiler tools for cross-compiling, you should use the `--target=TYPE' option to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the host platform (i.e., that on which the generated programs will eventually be run) with `--host=TYPE'. In this case, you should also specify the build platform with `--build=TYPE', because, in this case, it may not be possible to guess the build platform (it sometimes involves compiling and running simple test programs, and this can't be done if the compiler is a cross compiler). Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc will cause the specified gcc to be used as the C compiler (unless it is overridden in the site shell script). `configure' Invocation ====================== `configure' recognizes the following options to control how it operates. `--help' `-h' Print a summary of the options to `configure', and exit. `--version' `-V' Print the version of Autoconf used to generate the `configure' script, and exit. `--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally `config.cache'. FILE defaults to `/dev/null' to disable caching. `--config-cache' `-C' Alias for `--cache-file=config.cache'. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. mhwaveedit-1.4.24/Makefile.am000066400000000000000000000002041334022513400157640ustar00rootroot00000000000000SUBDIRS = m4 po src share CLEANFILES = *~ core core.* ACLOCAL_AMFLAGS = -I m4 EXTRA_DIST = config.rpath man_MANS = mhwaveedit.1 mhwaveedit-1.4.24/Makefile.in000066400000000000000000000712741334022513400160140ustar00rootroot00000000000000# Makefile.in generated by automake 1.15.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2017 Free Software Foundation, Inc. # This Makefile.in 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. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gtk.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/m4/sdl.m4 $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ $(am__configure_deps) $(am__DIST_COMMON) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } man1dir = $(mandir)/man1 am__installdirs = "$(DESTDIR)$(man1dir)" NROFF = nroff MANS = $(man_MANS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ cscope distdir dist dist-all distcheck am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \ $(LISP)config.h.in # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags CSCOPE = cscope DIST_SUBDIRS = $(SUBDIRS) am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in \ ABOUT-NLS AUTHORS COPYING ChangeLog INSTALL NEWS README TODO \ compile config.guess config.rpath config.sub depcomp \ install-sh missing mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__post_remove_distdir = $(am__remove_distdir) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best DIST_TARGETS = dist-gzip distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ ALSALIB_LIBS = @ALSALIB_LIBS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ARTSC_CFLAGS = @ARTSC_CFLAGS@ ARTSC_CONFIG = @ARTSC_CONFIG@ ARTSC_LIBS = @ARTSC_LIBS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ESOUND_CFLAGS = @ESOUND_CFLAGS@ ESOUND_LIBS = @ESOUND_LIBS@ EXEEXT = @EXEEXT@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GTHREAD_CFLAGS = @GTHREAD_CFLAGS@ GTHREAD_LIBS = @GTHREAD_LIBS@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSAMPLERATE_CFLAGS = @LIBSAMPLERATE_CFLAGS@ LIBSAMPLERATE_LIBS = @LIBSAMPLERATE_LIBS@ LN_S = @LN_S@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PORTAUDIO_LIBS = @PORTAUDIO_LIBS@ POSUB = @POSUB@ POW_LIB = @POW_LIB@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ SNDFILE_LIBS = @SNDFILE_LIBS@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = m4 po src share CLEANFILES = *~ core core.* ACLOCAL_AMFLAGS = -I m4 EXTRA_DIST = config.rpath man_MANS = mhwaveedit.1 all: config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: am--refresh: Makefile @: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): config.h: stamp-h1 @test -f $@ || rm -f stamp-h1 @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1 stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status config.h $(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f stamp-h1 touch $@ distclean-hdr: -rm -f config.h stamp-h1 install-man1: $(man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(man_MANS)'; \ test -n "$(man1dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.1[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscope: cscope.files test ! -s cscope.files \ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) clean-cscope: -rm -f cscope.files cscope.files: clean-cscope cscopelist cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -rm -f cscope.out cscope.in.out cscope.po.out cscope.files distdir: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz $(am__post_remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__post_remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__post_remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__post_remove_distdir) dist-tarZ: distdir @echo WARNING: "Support for distribution archives compressed with" \ "legacy program 'compress' is deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__post_remove_distdir) dist-shar: distdir @echo WARNING: "Support for shar distribution archives is" \ "deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz $(am__post_remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__post_remove_distdir) dist dist-all: $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' $(am__post_remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir) chmod u+w $(distdir) mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build/sub \ && ../../configure \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ --srcdir=../.. --prefix="$$dc_install_base" \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__post_remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile $(MANS) config.h installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(man1dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-hdr distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-man install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-man1 install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-man uninstall-man: uninstall-man1 .MAKE: $(am__recursive_targets) all install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ am--refresh check check-am clean clean-cscope clean-generic \ cscope cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \ dist-gzip dist-lzip dist-shar dist-tarZ dist-xz dist-zip \ distcheck distclean distclean-generic distclean-hdr \ distclean-tags distcleancheck distdir distuninstallcheck dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-man1 \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic pdf pdf-am ps ps-am tags \ tags-am uninstall uninstall-am uninstall-man uninstall-man1 .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: mhwaveedit-1.4.24/NEWS000066400000000000000000000264031334022513400144400ustar00rootroot00000000000000New features in version 1.4.24: * Add keyboard shortcut for Redo * Add 64x64 version of icon, update install paths for icons * Build and packaging fixes * Update translations: it,fr New features in version 1.4.23: * After recording, place marks where overruns happened * Playback jumping improvements for PulseAudio and JACK * Make cursor movement more smooth under PulseAudio * Add PulseAudio preferences for configuring latency * Add option to display buffer position during playback * Various bug fixes New features in version 1.4.22: * Improvements and fixes in the sample conversion and dithering code * Display zoom and speed settings next to status bar * Bug fix for value truncation in position cursor dialog * For ogg files, choose between decompression to temporary file and on-the-fly access * Various bug fixes New features in version 1.4.21: * A few new keyboard shortcuts added for navigation * In follow mode, left,right,home,end also move playback * Extended playback auto-conversion to include channel and sample rate * Select distance unit (seconds or samples) in position cursor dialog * Bug fixes for building and wav header parsing on x86_64 * Various bug fixes * New translation: Polish (pl) * Updated translation: it New features in version 1.4.20: * Fixed Alsa playback regressions * Added manual page New features in version 1.4.19: * Fixed bug causing cursor to freeze near end-of-file * Fixes for appearance in dark themes * Build system fixes New features in version 1.4.18: * Fixed bug causing playback problems with Jack and OSS * Minor user interface improvements * Bug fixes * Updated translation: it New features in version 1.4.17: * Support for SoX version 14. * New translation: Italian (it) * Updated translation: sv * Bug fixes New features in version 1.4.16: * PulseAudio driver added * Alsa driver performance improvements * New function to add channels from another file (for merging mono files into stereo etc) * The "map channels" effect is now instant. * Added option to play mono files as stereo * Minor user interface improvements * Bug fixes New features in version 1.4.15: * Time format shown on time ruler can now be changed * Support for displating SMPTE-style timecodes * Bug fixes for 64-bit platforms * Minor interface improvements * Added desktop entry New features in version 1.4.14: * Improved silence selection function * Uses a default value if LADSPA_PATH is not set * Bug fixes * Updated translation: de New features in version 1.4.13: * Support for SoX version 13. * Bug fixes * New translation: Chinese Simplified (zh_CN) New features in version 1.4.12: * Support opening files via drag'n'drop * Reordering effects in effects browser * Rate conversion crash fixed * aRts driver bug fixed * Minor bug fixes New features in version 1.4.11: * Move cursor to zero-crossing functions added. * Combine channels effect bug fixed. * Map channels effect added. * Keyboard commands improved. * Updated translation: sv New features in version 1.4.10: * Normalize to specific level. * Automatic disabling of varispeed when playing at normal speed. * ALSA recording bug fixed. * Varispeed slider bug fixed. * SoX filtering bugs fixed. * Support for newer SoX versions. * Warn user on clipping conversions. * Portability fixes * Updated translation: sv New features in version 1.4.9: * Portability fixes * New translation: German (de) New features in version 1.4.8: * Detect and reload files from crashed sessions on startup * Allow multiple instances to use Jack at the same time * Bug fixes New features in version 1.4.7: * Bug fixes * New translation: Spanish (es) New features in version 1.4.6: * Adjustable MP3 quality when saving * Ability to choose file type from a list when saving. * Bug fixes New features in version 1.4.5: * Auto detection of sound driver on start-up * aRts driver * Bug fixes * Documentation updates * Updated translation: sv New features in version 1.4.4: * Shift+drag to enlarge or shrink selection * Bug fixes * New translation: French (fr) New features in version 1.4.3: * Redo function * Bug fixes * Updated translations: sv,ru New features in version 1.4.2: * Triangular dithering support * Added 'bounce mode' (auto-return cursor after playback) * Minor bug fixes New features in version 1.4.1: * Automatic samplerate conversion for Jack * Jack port auto-connection bugfix * Minor bug fixes New features in version 1.4.0: * Native Language Support * New translations: Russian (ru), Swedish (sv) * Jack driver can now auto-connect the ports * Added --driver command-line option * Changed the default colors * Minor bug fixes New features in version 1.3.8: * Variable speed playback * Jack driver bugfixes * Some other bugfixes New features in version 1.3.7: * "Play selection" bug fixed. * Esound and Sun driver improvements. * Tries to use mplayer (if available) for decoding unknown files. * Minor bug fixes. New features in version 1.3.6: * Esound driver supports ESPEAKER variable. * Bug fixes. New features in version 1.3.5: * Added sliders to Ladspa input controls * Automatic sample format conversion for paste operations * Support recording in floating point without conversion to PCM (for JACK) * Use floating-point for temporary files to avoid rounding errors New features in version 1.3.4: * Libsamplerate support * Sun audio driver (unfinished, needs testing) * Now uses the new GtkComboBox in most dialogs when available * Major ALSA driver bug fixed * Minor interface improvements * Documentation updates * Bug fixes New features in version 1.3.3: * Vertical zooming. * Pause and resume while recording * GTK2 file chooser now asks when overwriting an existing file * Remember pane position in effect browser * EsounD code rewrite * Bug fixes New features in version 1.3.2: * View draws a second time with higher quality when zoomed out * Double click to select area between marks * Right click snaps to selection start/end * New keyboard shortcuts '(' and ')' for playing first/last 3 seconds of selection. * Max peaks shown separately in recording dialog * Configurable background color * EsounD support * Jack driver bug fixes * Two bugs causing errors when exiting were fixed New features in version 1.3.1: * Most recently opened files in File menu * Choose which window to apply effect to in Effects dialog * Effects dialog now can remember last position/size * Preferences dialog re-designed * Problems exporting mp3 files on big-endian machines fixed * Fixed cursor positioning bugs New features in version 1.3.0: * Large file support. * Supports multiple temp directories on different partitions. * LADSPA effect plugins support. * Jack sound driver (very basic, without samplerate conversion) * Simple MP3/OGG import/export using lame and oggenc/oggdec. * Option to limit recording time. * Auto-play when jumping to mark option. * Uses the new file chooser widget under GTK+ 2.4. * Minor user interface improvements. New features in version 1.2.9: * Built-in help text * "Silence selection" function added. * Time scale shows formatted time. * Time recorded is displayed in window title while recording. * Better formatted status bar. * Preferences dialog layout improved. * Customizable colors * Remembers last save/load directory across sessions. * Option to remember window sizes/positions across sessions. * "Mix paste" function fixed. * Minor bug fixes. New features in version 1.2.8: * Lots of major bugs fixed. * Added 'fade in' and 'fade out' menu items. * Workaround in OSS sound driver for "broken pipe" error in older ALSA OSS emulation. New features in version 1.2.7: * Rewrote recording dialog, now shows more statistics and looks better. * Added ALSA driver (requires alsa-lib) * Fixed a bug causing lost keypresses in some windows. New features in version 1.2.6: * Resizeable selections. * Automatic scrolling while selecting. * Zoom slider. * A bug causing compilation to fail on some systems was fixed. * Some other minor improvements. New features in version 1.2.5: * All effects are displayed in one window instead of separate windows. * Effect progress is now displayed in status bar instead of in separate window. * Support for SoX effects and high-quality sample rate conversion. * 'Position cursor' dialog now works properly while playing. * Progress display while saving. * Bug fixes. New features in version 1.2.4: * A memory leak was fixed. * Big-endian fixes. * Recording crash fixed. * A new 'normalize' function (amplify to top volume). * Keybord shortcut for "Save selection as" * 'Save as' now uses last save directory as default. New features in version 1.2.3: * Bug fixes. * Some layout changes in the main window. * Added some keyboard shortcuts. * You can now select format for the time displays. * Option to keep sound driver open all the time. New features in version 1.2.2: * Bug fixes. * The volume meters now shows "peak" values. New features in version 1.2.1: * A bug that could cause incomplete saved files was fixed. * You can now edit and play your files while they're loading. * Follow cursor while playing. * A simple 'pipe through program' effect was implemented (useful for piping raw data through sox) New features in version 1.2.0: * Time scale * Completely rewritten sound player code: * Keeps playing in background during redraws * No longer locks up on very small loops * Doesn't stop too early anymore * Keyboard shortcuts (see README file). * Undo now remembers marks, selection, cursor and zoom. * Position cursor command. * Saving directly after recording speedup. New features in version 1.1.6: * Fixed crash in record dialog. * Improved configure script. * Minor bugfixes. New features in version 1.1.5: * Now supports libsndfile 1.x instead of 0.x. * Marks that can be set/recalled while playing. * Much faster saving under some circumstances. * Bug in 'combine channels' effect fixed. * A bug causing files to be left opened was fixed. * Internal changes. New features in version 1.1.4: * Minor speed improvements and bug fixes. * Now compiles under GTK+ 2.0 New features in version 1.1.3: * OSS sound driver. * Support for launching mixer utility. * Fixed the 100% CPU usage problem. * Some other bug fixes. * Updated automake/autoconf environment. New features in version 1.1.2: * Supports some new formats through libsndfile (if available). * Internal changes. * Bug fixes. New features in version 1.1.1: * Much faster saving. * 'Insert silence' function * 'Clear undo buffer' function * 'Clear clipboard' function * Minor bug fixes. New features in version 1.1: * Recording support. * PortAudio library support (input+output). * All audio drivers can be compiled in at the same time. * "Line mode" display. * Configuration file ~/.mhwaveedit/config * New effect 'Combine channels' * "Mix paste" function (like paste over but mixing instead of overwriting). * Compilation using configure script instead of home-made Makefile. * Bug fixes. mhwaveedit-1.4.24/README000066400000000000000000000377421334022513400146310ustar00rootroot00000000000000---------------------- mhWaveEdit README file ---------------------- mhWaveEdit is a graphical program for editing sound files. It is completely free (GPL). You can find the latest release of mhWaveEdit at: http://gna.org/projects/mhwaveedit/ The contents of this file is also available inside mhWaveEdit from the help menu. ------------ Installation ------------ * Unpack the source: tar xjf mhwaveedit-1.4.24.tar.gz * Go into the source directory: cd mhwaveedit-1.4.24 * Run the configure script: ./configure * Compile the sources: make * Install the program: su -c "make install" ----------------- Configure options ----------------- For most people, just using ./configure without any arguments should work fine, but here are some options that the configure-script supports: --disable-gtk2 If you have both GTK+ 1.2 and GTK+ 2.0 installed and want to use GTK+ 1.2, specify this option. --without-portaudio --without-sdl --without-alsalib --without-oss --without-jack Specifying this option will leave out a sound driver, even if it's libs and headers are found. --without-libsndfile --without-libsamplerate Specifying this option will leave out libsndfile/libsamplerate support, even if the library is found. --with-libsndfile=prefix --with-libsamplerate=prefix This lets you specify the prefix where libsndfile/libsamplerate is installed if it wasn't auto-detected. --with-double-samples Use double precision floating point numbers for sample processing. If you intend to edit 32-bit files, you should enable this. --without-check-casts This option disables the run-time type cast checking. It makes some parts of the program faster, but makes it harder to debug. -------- Starting -------- To start the program, simply type mhwaveedit. If you want to, you can specify files to open on the command line, for example 'mhwaveedit file.wav'. ----------- Sample view ----------- The area where you 'see' the contents of the file you are editing, is called the 'sample view'. In the sample view there is a grey vertical bar called the 'cursor'. The cursor follows the sound wave when you play the sound. You can position the cursor by clicking with the right (2:nd) mouse button. If you do this while you're playing a file, the playing will continue from the new cursor position. You can also position the cursor more exact by using the 'Position Cursor...' command on the Edit menu. You can place marks in your file by holding down Ctrl and pressing a number from 0 to 9. This will place a mark (green vertical bar) with the same number at the current cursor position. You can later make the cursor go to that position again by just pressing the number. Setting and jumping to marks can be done while playing. To remove a mark, jump to the mark and set it again. ------- Playing ------- Playing a file is simple, just load the file and press the play button. The green play button plays from the current position. The yellow play button plays the current selection, or the entire file if nothing is selected. Stop the playback with the stop button (with the red square). The playback speed can be varied by adjusting the slider to the far right. You can do normal editing while the file is playing. --------- Recording --------- Recording is done with 'Record...' on the Play menu, or the Record button (the red circle). A dialog box will pop up where you can select what format you want to record in. After selecting the format, meters and numbers will appear showing info about the volume level of the sound input. When you want to start recording, press the "Start recording" button. When you've recorded everything you wanted to, press the Finish button and the record dialog will disappear and newly recorded sound will show up in a new window. Currently it is impossible to play and record at the same time, so the playback will stop when you record. ------- Editing ------- You make selections by dragging the mouse over the sample view. You can hear what you've currently selected by clicking on the "play selection" button (the button with the yellow arrow) or by selecting 'Play selection' from the Play menu. You can use the cursor to refine the selection. Use the 'Selection start at cursor' and 'Selection end at cursor' buttons to move the selection starting point or the selection end point to the current cursor position. You can also drag the selection endpoints using the mouse. The 'Cut' and 'Copy' functions work like in any other software. The 'Paste' function insert the clipboard contents at the cursor position. The 'Paste over' function works like 'Paste', except that it overwrites the data after the insert position. The 'Paste mix' function combines the clipboard data with the data at the cursor position. The 'Paste as new' function opens a new window and puts the clipboard contents into it. The 'Crop' function deletes all parts of the file that are not selected. The 'Silence selection' function replaces the selected part with silence. To avoid clicks, the silent part is a line that meets the wave at the endpoints. All editing functions work non-destructively, that is, the file you're editing isn't actually changed until you save it (the effects also work this way). ------- Effects ------- mhWaveEdit has a few simple effects, which are available from the 'Effects' menu. * Fade in/out This creates a linear fade in or fade out effect. * Normalize, Normalize to... This amplifies the sound as much as possible without getting clipping distortion. The "Normalize to..." item lets you specify which level to normalize to. * Volume adjust/fade... This effect lets you select a starting volume and a ending volume and amplifies the selection fading from the starting volume to the ending volume. Note that volumes above 100% may cause sound distortion. Use the 'Find top volume' to find out the maximum amplification possible without distortion. (You can use this for normalizing samples.) By setting starting volume and ending volume to the same value you get a simple amplification of the sound. * Convert samplerate... This converts the samplerate of the entire file to one you specify. There are different methods for doing this, usually the one in the top has the best quality but can take longer than the other methode. * Convert sample format... This converts the sample format of the entire file. The 'Don't actually change the data' option can be used if the program was wrong about the file's format. * Byte swap This "byte swaps" the selected part. It can be used to repair damaged files where the byte order is wrong. Note that if the sound looks alright but plays wrong, you should not use this option, instead you should use the "byte-swap output" option in the Preferences dialog. * Mix to mono This mixes all channels of the file together to a mono sound. * Add channel This copies the first channel to a new channel in the sound, converting mono to stereo etc. * Map channels... With this effect, you can change the number of channels in the file. You can also rearrange and add (i.e. mix) channels. * Combine channels... This effect lets you create a new sound by a linear combination of the old channels. This means you can do channel mixing / swapping / balance / panning / amplification etc. by entering different values. For example, to swap the left and right channel, you select that the new Channel 1 should be 0% of the old Channel 1 and 100% of the old Channel 2, and the new Channel 2 should be 100% of the old Channel 1 and 0% of the old Channel 2 * Speed adjustment... This effect changes the speed of the selection. The tone will change as well. * Pipe through program... This effect is for advanced users wanting to pipe raw audio data through an external program. The output of the program is read back and replaces the processed part. mhWaveEdit supports LADSPA effects and can also make use of most of the SoX utility's effects. To find the LADSPA plugins the environment variable LADSPA_PATH must be properly set up. All supported effects can be found by choosing the 'Effects...' menu item. The effects are listed with names beginning with [B] for builtin effects, [L] for LADSPA effects, and [S] for SoX effects. ------- Quality ------- Some notes on sound quality. The general rule when doing audio editing/processing is to not manipulate the data more than necessary and keep an original copy whenever you're processing your important files. Cut, copy and paste operations move the data around without modifying it, so these don't degrade the sound quality. Because of level differences, you may get a "step" at the start and end of the inserted part, which can cause a small clicking sound. The mix paste function doesn't decrease quality, unless the peaks become too high and you get clipping. In that case you will get a warning message. Sound data is normally stored as integer values. Therefore, whenever you normalize, adjust volume, decrease sample size or filter a sound, the result must be rounded. If you use 24 or 32 bit sample sizes, this is not really a problem, but if you use 8 or 16 bits sample size, this rounding causes a decrease in quality. The quality decrease that the rounding causes can be masked by adding a small amount of noise before rounding. This is called "dithering". mhWaveEdit supports basic dithering and it's enabled by default. By default, mhWaveEdit uses floating-point temporary files for storing processed results to avoid rounding until the file is saved. ------------ File formats ------------ Even if mhWaveEdit was originally built for editing wav files, it's also possible to load and save in a few other formats. mhWaveEdit always supports wav and raw files, but if it's compiled with the libsndfile library, mhWaveEdit supports a couple of other formats as well. To save a file with a different file format, use "Save as..." and choose a format in the file type selection box. mhWaveEdit has basic support for mp3 and ogg formats. For this to work you need to have LAME installed for mp3 support, and OggDec/OggEnc for Ogg support. If you have these programs, you can open and save mp3/ogg files just like any other file format. If mplayer is installed, mhwaveedit can open all formats that it supports, for example the soundtrack of a video file. Since mplayer is only a player, these files can not be saved back after editing, you have to save the file into a supported format. ----- Files ----- mhWaveEdit creates a directory ~/.mhwaveedit where it stores configuration information. The configuration file is called config. It can be hand edited, but the easiest way is through 'Preferences' on the Edit menu. Each mhwaveedit process creates a session file in the .mhwaveedit directory called mhwaveedit-session---, where is the session ID number and is a character code showing the state of the session ('r' for running sessions). Temporary files are by default also stored in the ~/.mhwaveedit directory. Which directories to use can be set through the preferences dialog. To get the best performance, you should have one temporary directory for each local filesystem. The temporary files have names of the form "mhwaveedit-temp--nnnn-". Do NOT open or remove temporary files with the same pid number as a currently running mhWaveEdit. mhWaveEdit checks on startup for leftover temporary files and lets the user open them. After opening a crashed session, the files can be saved or thrown away. ------------------ Keyboard shortcuts ------------------ F1 Help F12 Record Ctrl+(number) Set mark (number) Goto mark Ctrl+P Preferences Ctrl+E Effects Ctrl+O Open file Ctrl+S Save file Ctrl+U Save selection as Ctrl+C Copy Ctrl+X Cut Ctrl+D Delete Delete Delete Ctrl+V Paste Ctrl+Z Undo Ctrl+A Select all Ctrl+G Position cursor (Go to) Ctrl+H Position cursor at file start Ctrl+J Position cursor at file end Ctrl+K Position cursor at selection start Ctrl+L Position cursor at selection end Y,U Move cursor to nearest all-channel zero-crossing I,O Move cursor to nearest any-channel zero-crossing Ctrl+Q Selection start at cursor Ctrl+W Selection end at cursor +,= Zoom in - Zoom out > Zoom to selection < Zoom all Arrow keys Scroll left/right Home Move view to file start End Move view to file end Tab Move view to cursor Ctrl+Tab Move cursor to center of view Space Play/Stop Shift+Space Play all , Play from cursor pos . Stop / Play selection H,J Move cursor (and playback) 1/8 of view K,L Move cursor one sample Ctrl+arrow Move cursor (and playback) half second ( Play first 3 seconds of selection ) Play last 3 seconds of selection ------------- Bug reporting ------------- If you find a bug or flaw in the program that's not mentioned in the BUGS file, report the bug in the bug tracker (see contact info) or mail a bug report describing the bug to: magnus.hjorth@home.se In case of a crash, please do not send me any core dumps. They are huge and completely useless to me. Instead, create a backtrace. Backtraces tell you exactly where the program crashed. How to create a backtrace: 1. Enable core dumps: ulimit -c unlimited 2. Run the program: mhwaveedit 3. Make the program crash. You should now get a file named core or core.1234 in the directory you're in. 4. Run gdb with the program and core file: gdb /usr/local/bin/mhwaveedit core | tee backtrace.txt 5. After gdb has loaded, use the command: bt 6. Quit gdb with the command: quit 7. Now you should have a back trace in the file backtrace.txt ----------- Helping out ----------- There are plenty of things you can do if you want to help the development of mhWaveEdit. First of all, look for bugs and report all bugs you find into the bug tracker or through e-mail. Sometimes a bug can get overlooked for a long time because nobody reports it, so don't be afraid to report bugs that have been there for a few releases. You don't have to provide fixes or very detailed information, although it helps of course. Feature requests are also welcome, report them to the mailing list or to the bug tracker. If you speak a language other than English and mhWaveEdit isn't translated to your language, you can contribute a translation. To do that, copy the template mhwaveedit.pot in the po directory into a new file ll.po, where ll is your language code (see http://www.gnu.org/software/gettext/manual/html_node/gettext_221.html for a list of language codes). It's possible to edit po-files by hand, but I recommend a program such as poEdit (http://www.poedit.org) for editing translations. Note that for those translatable strings that look like "RecordStatus|Paused", you should ignore what's to the left and only translate the string to the right ("Paused" in this example). This convention is there to make it possible to translate the same string to different things depending on context. After you've filled in all the translations you want (you don't have to translate all the strings), mail in the po file to me (see contact info) and I'll add it to the next release. If a translation is incomplete, you're very welcome to translate the remaining untranslated messages and mail them in. Corrections to translations are also appreciated, but they may need to be checked with the previous translator before including them. ------- Contact ------- For bug reports, translation updates, patches and PayPal donations: magnus.hjorth@home.se Project page with bug tracker, mailing list membership: http://gna.org/projects/mhwaveedit Mailing list (you must be a subscriber before you can post messages): mhwaveedit-discuss@gna.org mhwaveedit-1.4.24/TODO000066400000000000000000000041601334022513400144250ustar00rootroot00000000000000If you have something you would like to add to this list, send a mail to magnus.hjorth@home.se Things I would like to do sooner or later: UI stuff: * Be able to do some stuff with only one channel (select, play, copy) * Display mouse pointer position. * Song split function * Command to suspend the current session and exit. The whole session (windows, tempfiles, history, clipboard, marks, selections etc) could then be recalled another time. * Integrate with the LASH session handling system. * Journalling so a session can be recovered fully after a crash. * Do the I/O for the view with async IO or thread. * Logarithmic (dB) peak display. * Amplitude scale * Preview function in effect browser * Clip information dialog box * Dialog for managing marks * Create marks from selection endpoints * Reset button for speed/zoom sliders. * Tabbed windows with more than one file. Editing: * Make the insert silence function click-free (keeping the same amplitude as the surrounding sound) * Shaped dithering * Copy/paste between mhwaveedit instances * Copy/paste to and from other audio applications * Create and edit curves and use them for effect parameters. * Remove DC component and center waveform functions. * Synchronizing/aligning files * Apply effects one time for each channel Playback/recording: * Option to record until silence. * Full duplex sound drivers. * Recording in sync with playback. * Recording anytime without stopping playback. * Separating input and output driver where possible. * Show remaining possible recording time while recording. * Do recording in completely separate thread/process * Place cursor exactly where we stopped on low-latency sound drivers. * Record a few seconds "ahead" so you can start recording a bit too late without missing anything. * Change the start/endpoint of a loop in real-time as the selection changes. File formats: * Keeping the compressed data as much as possible when editing mp3/ogg * Remember mp3/ogg metadata (artist, title etc) * A better export function. * Store marks and loop points in file. Other: * Add more accelerator keys and make sure they don't clash. mhwaveedit-1.4.24/aclocal.m4000066400000000000000000001750031334022513400156020ustar00rootroot00000000000000# generated automatically by aclocal 1.15.1 -*- Autoconf -*- # Copyright (C) 1996-2017 Free Software Foundation, Inc. # 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. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, [m4_warning([this file was generated for autoconf 2.69. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) # Configure paths for GTK+ # Owen Taylor 1997-2001 dnl AM_PATH_GTK_2_0([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND [, MODULES]]]]) dnl Test for GTK+, and define GTK_CFLAGS and GTK_LIBS, if gthread is specified in MODULES, dnl pass to pkg-config dnl AC_DEFUN([AM_PATH_GTK_2_0], [dnl dnl Get the cflags and libraries from pkg-config dnl AC_ARG_ENABLE(gtktest, [ --disable-gtktest do not try to compile and run a test GTK+ program], , enable_gtktest=yes) pkg_config_args=gtk+-2.0 for module in . $4 do case "$module" in gthread) pkg_config_args="$pkg_config_args gthread-2.0" ;; esac done no_gtk="" AC_REQUIRE([PKG_PROG_PKG_CONFIG]) PKG_PROG_PKG_CONFIG([0.7]) min_gtk_version=ifelse([$1], ,2.0.0,$1) AC_MSG_CHECKING(for GTK+ - version >= $min_gtk_version) if test x$PKG_CONFIG != xno ; then ## don't try to run the test against uninstalled libtool libs if $PKG_CONFIG --uninstalled $pkg_config_args; then echo "Will use uninstalled version of GTK+ found in PKG_CONFIG_PATH" enable_gtktest=no fi if $PKG_CONFIG --atleast-version $min_gtk_version $pkg_config_args; then : else no_gtk=yes fi fi if test x"$no_gtk" = x ; then GTK_CFLAGS=`$PKG_CONFIG $pkg_config_args --cflags` GTK_LIBS=`$PKG_CONFIG $pkg_config_args --libs` gtk_config_major_version=`$PKG_CONFIG --modversion gtk+-2.0 | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` gtk_config_minor_version=`$PKG_CONFIG --modversion gtk+-2.0 | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` gtk_config_micro_version=`$PKG_CONFIG --modversion gtk+-2.0 | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` if test "x$enable_gtktest" = "xyes" ; then ac_save_CFLAGS="$CFLAGS" ac_save_LIBS="$LIBS" CFLAGS="$CFLAGS $GTK_CFLAGS" LIBS="$GTK_LIBS $LIBS" dnl dnl Now check if the installed GTK+ is sufficiently new. (Also sanity dnl checks the results of pkg-config to some extent) dnl rm -f conf.gtktest AC_TRY_RUN([ #include #include #include int main () { int major, minor, micro; char *tmp_version; fclose (fopen ("conf.gtktest", "w")); /* HP/UX 9 (%@#!) writes to sscanf strings */ tmp_version = g_strdup("$min_gtk_version"); if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { printf("%s, bad version string\n", "$min_gtk_version"); exit(1); } if ((gtk_major_version != $gtk_config_major_version) || (gtk_minor_version != $gtk_config_minor_version) || (gtk_micro_version != $gtk_config_micro_version)) { printf("\n*** 'pkg-config --modversion gtk+-2.0' returned %d.%d.%d, but GTK+ (%d.%d.%d)\n", $gtk_config_major_version, $gtk_config_minor_version, $gtk_config_micro_version, gtk_major_version, gtk_minor_version, gtk_micro_version); printf ("*** was found! If pkg-config was correct, then it is best\n"); printf ("*** to remove the old version of GTK+. You may also be able to fix the error\n"); printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n"); printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n"); printf("*** required on your system.\n"); printf("*** If pkg-config was wrong, set the environment variable PKG_CONFIG_PATH\n"); printf("*** to point to the correct configuration files\n"); } else if ((gtk_major_version != GTK_MAJOR_VERSION) || (gtk_minor_version != GTK_MINOR_VERSION) || (gtk_micro_version != GTK_MICRO_VERSION)) { printf("*** GTK+ header files (version %d.%d.%d) do not match\n", GTK_MAJOR_VERSION, GTK_MINOR_VERSION, GTK_MICRO_VERSION); printf("*** library (version %d.%d.%d)\n", gtk_major_version, gtk_minor_version, gtk_micro_version); } else { if ((gtk_major_version > major) || ((gtk_major_version == major) && (gtk_minor_version > minor)) || ((gtk_major_version == major) && (gtk_minor_version == minor) && (gtk_micro_version >= micro))) { return 0; } else { printf("\n*** An old version of GTK+ (%d.%d.%d) was found.\n", gtk_major_version, gtk_minor_version, gtk_micro_version); printf("*** You need a version of GTK+ newer than %d.%d.%d. The latest version of\n", major, minor, micro); printf("*** GTK+ is always available from ftp://ftp.gtk.org.\n"); printf("***\n"); printf("*** If you have already installed a sufficiently new version, this error\n"); printf("*** probably means that the wrong copy of the pkg-config shell script is\n"); printf("*** being found. The easiest way to fix this is to remove the old version\n"); printf("*** of GTK+, but you can also set the PKG_CONFIG environment to point to the\n"); printf("*** correct copy of pkg-config. (In this case, you will have to\n"); printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n"); printf("*** so that the correct libraries are found at run-time))\n"); } } return 1; } ],, no_gtk=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi fi if test "x$no_gtk" = x ; then AC_MSG_RESULT(yes (version $gtk_config_major_version.$gtk_config_minor_version.$gtk_config_micro_version)) ifelse([$2], , :, [$2]) else AC_MSG_RESULT(no) if test "$PKG_CONFIG" = "no" ; then echo "*** A new enough version of pkg-config was not found." echo "*** See http://pkgconfig.sourceforge.net" else if test -f conf.gtktest ; then : else echo "*** Could not run GTK+ test program, checking why..." ac_save_CFLAGS="$CFLAGS" ac_save_LIBS="$LIBS" CFLAGS="$CFLAGS $GTK_CFLAGS" LIBS="$LIBS $GTK_LIBS" AC_TRY_LINK([ #include #include ], [ return ((gtk_major_version) || (gtk_minor_version) || (gtk_micro_version)); ], [ echo "*** The test program compiled, but did not run. This usually means" echo "*** that the run-time linker is not finding GTK+ or finding the wrong" echo "*** version of GTK+. If it is not finding GTK+, you'll need to set your" echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" echo "*** to the installed location Also, make sure you have run ldconfig if that" echo "*** is required on your system" echo "***" echo "*** If you have an old version installed, it is best to remove it, although" echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH" ], [ echo "*** The test program failed to compile or link. See the file config.log for the" echo "*** exact error that occured. This usually means GTK+ is incorrectly installed."]) CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi fi GTK_CFLAGS="" GTK_LIBS="" ifelse([$3], , :, [$3]) fi AC_SUBST(GTK_CFLAGS) AC_SUBST(GTK_LIBS) rm -f conf.gtktest ]) # pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- # serial 11 (pkg-config-0.29.1) dnl Copyright © 2004 Scott James Remnant . dnl Copyright © 2012-2015 Dan Nicholson 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 of the License, or dnl (at your option) any later version. dnl dnl This program is distributed in the hope that it will be useful, but dnl WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU dnl 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., 59 Temple Place - Suite 330, Boston, MA dnl 02111-1307, USA. dnl dnl As a special exception to the GNU General Public License, if you dnl distribute this file as part of a program that contains a dnl configuration script generated by Autoconf, you may include it under dnl the same distribution terms that you use for the rest of that dnl program. dnl PKG_PREREQ(MIN-VERSION) dnl ----------------------- dnl Since: 0.29 dnl dnl Verify that the version of the pkg-config macros are at least dnl MIN-VERSION. Unlike PKG_PROG_PKG_CONFIG, which checks the user's dnl installed version of pkg-config, this checks the developer's version dnl of pkg.m4 when generating configure. dnl dnl To ensure that this macro is defined, also add: dnl m4_ifndef([PKG_PREREQ], dnl [m4_fatal([must install pkg-config 0.29 or later before running autoconf/autogen])]) dnl dnl See the "Since" comment for each macro you use to see what version dnl of the macros you require. m4_defun([PKG_PREREQ], [m4_define([PKG_MACROS_VERSION], [0.29.1]) m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1, [m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])]) ])dnl PKG_PREREQ dnl PKG_PROG_PKG_CONFIG([MIN-VERSION]) dnl ---------------------------------- dnl Since: 0.16 dnl dnl Search for the pkg-config tool and set the PKG_CONFIG variable to dnl first found in the path. Checks that the version of pkg-config found dnl is at least MIN-VERSION. If MIN-VERSION is not specified, 0.9.0 is dnl used since that's the first version where most current features of dnl pkg-config existed. AC_DEFUN([PKG_PROG_PKG_CONFIG], [m4_pattern_forbid([^_?PKG_[A-Z_]+$]) m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) fi if test -n "$PKG_CONFIG"; then _pkg_min_version=m4_default([$1], [0.9.0]) AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) PKG_CONFIG="" fi fi[]dnl ])dnl PKG_PROG_PKG_CONFIG dnl PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) dnl ------------------------------------------------------------------- dnl Since: 0.18 dnl dnl Check to see whether a particular set of modules exists. Similar to dnl PKG_CHECK_MODULES(), but does not set variables or print errors. dnl dnl Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) dnl only at the first occurence in configure.ac, so if the first place dnl it's called might be skipped (such as if it is within an "if", you dnl have to call PKG_CHECK_EXISTS manually AC_DEFUN([PKG_CHECK_EXISTS], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl if test -n "$PKG_CONFIG" && \ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then m4_default([$2], [:]) m4_ifvaln([$3], [else $3])dnl fi]) dnl _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) dnl --------------------------------------------- dnl Internal wrapper calling pkg-config via PKG_CONFIG and setting dnl pkg_failed based on the result. m4_define([_PKG_CONFIG], [if test -n "$$1"; then pkg_cv_[]$1="$$1" elif test -n "$PKG_CONFIG"; then PKG_CHECK_EXISTS([$3], [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes ], [pkg_failed=yes]) else pkg_failed=untried fi[]dnl ])dnl _PKG_CONFIG dnl _PKG_SHORT_ERRORS_SUPPORTED dnl --------------------------- dnl Internal check to see if pkg-config supports short errors. AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], [AC_REQUIRE([PKG_PROG_PKG_CONFIG]) if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi[]dnl ])dnl _PKG_SHORT_ERRORS_SUPPORTED dnl PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], dnl [ACTION-IF-NOT-FOUND]) dnl -------------------------------------------------------------- dnl Since: 0.4.0 dnl dnl Note that if there is a possibility the first call to dnl PKG_CHECK_MODULES might not happen, you should be sure to include an dnl explicit call to PKG_PROG_PKG_CONFIG in your configure.ac AC_DEFUN([PKG_CHECK_MODULES], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl pkg_failed=no AC_MSG_CHECKING([for $1]) _PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) _PKG_CONFIG([$1][_LIBS], [libs], [$2]) m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS and $1[]_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.]) if test $pkg_failed = yes; then AC_MSG_RESULT([no]) _PKG_SHORT_ERRORS_SUPPORTED if test $_pkg_short_errors_supported = yes; then $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` else $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD m4_default([$4], [AC_MSG_ERROR( [Package requirements ($2) were not met: $$1_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. _PKG_TEXT])[]dnl ]) elif test $pkg_failed = untried; then AC_MSG_RESULT([no]) m4_default([$4], [AC_MSG_FAILURE( [The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. _PKG_TEXT To get pkg-config, see .])[]dnl ]) else $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS $1[]_LIBS=$pkg_cv_[]$1[]_LIBS AC_MSG_RESULT([yes]) $3 fi[]dnl ])dnl PKG_CHECK_MODULES dnl PKG_CHECK_MODULES_STATIC(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], dnl [ACTION-IF-NOT-FOUND]) dnl --------------------------------------------------------------------- dnl Since: 0.29 dnl dnl Checks for existence of MODULES and gathers its build flags with dnl static libraries enabled. Sets VARIABLE-PREFIX_CFLAGS from --cflags dnl and VARIABLE-PREFIX_LIBS from --libs. dnl dnl Note that if there is a possibility the first call to dnl PKG_CHECK_MODULES_STATIC might not happen, you should be sure to dnl include an explicit call to PKG_PROG_PKG_CONFIG in your dnl configure.ac. AC_DEFUN([PKG_CHECK_MODULES_STATIC], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl _save_PKG_CONFIG=$PKG_CONFIG PKG_CONFIG="$PKG_CONFIG --static" PKG_CHECK_MODULES($@) PKG_CONFIG=$_save_PKG_CONFIG[]dnl ])dnl PKG_CHECK_MODULES_STATIC dnl PKG_INSTALLDIR([DIRECTORY]) dnl ------------------------- dnl Since: 0.27 dnl dnl Substitutes the variable pkgconfigdir as the location where a module dnl should install pkg-config .pc files. By default the directory is dnl $libdir/pkgconfig, but the default can be changed by passing dnl DIRECTORY. The user can override through the --with-pkgconfigdir dnl parameter. AC_DEFUN([PKG_INSTALLDIR], [m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])]) m4_pushdef([pkg_description], [pkg-config installation directory @<:@]pkg_default[@:>@]) AC_ARG_WITH([pkgconfigdir], [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],, [with_pkgconfigdir=]pkg_default) AC_SUBST([pkgconfigdir], [$with_pkgconfigdir]) m4_popdef([pkg_default]) m4_popdef([pkg_description]) ])dnl PKG_INSTALLDIR dnl PKG_NOARCH_INSTALLDIR([DIRECTORY]) dnl -------------------------------- dnl Since: 0.27 dnl dnl Substitutes the variable noarch_pkgconfigdir as the location where a dnl module should install arch-independent pkg-config .pc files. By dnl default the directory is $datadir/pkgconfig, but the default can be dnl changed by passing DIRECTORY. The user can override through the dnl --with-noarch-pkgconfigdir parameter. AC_DEFUN([PKG_NOARCH_INSTALLDIR], [m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])]) m4_pushdef([pkg_description], [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@]) AC_ARG_WITH([noarch-pkgconfigdir], [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],, [with_noarch_pkgconfigdir=]pkg_default) AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir]) m4_popdef([pkg_default]) m4_popdef([pkg_description]) ])dnl PKG_NOARCH_INSTALLDIR dnl PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE, dnl [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) dnl ------------------------------------------- dnl Since: 0.28 dnl dnl Retrieves the value of the pkg-config variable for the given module. AC_DEFUN([PKG_CHECK_VAR], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl _PKG_CONFIG([$1], [variable="][$3]["], [$2]) AS_VAR_COPY([$1], [pkg_cv_][$1]) AS_VAR_IF([$1], [""], [$5], [$4])dnl ])dnl PKG_CHECK_VAR dnl PKG_WITH_MODULES(VARIABLE-PREFIX, MODULES, dnl [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND], dnl [DESCRIPTION], [DEFAULT]) dnl ------------------------------------------ dnl dnl Prepare a "--with-" configure option using the lowercase dnl [VARIABLE-PREFIX] name, merging the behaviour of AC_ARG_WITH and dnl PKG_CHECK_MODULES in a single macro. AC_DEFUN([PKG_WITH_MODULES], [ m4_pushdef([with_arg], m4_tolower([$1])) m4_pushdef([description], [m4_default([$5], [build with ]with_arg[ support])]) m4_pushdef([def_arg], [m4_default([$6], [auto])]) m4_pushdef([def_action_if_found], [AS_TR_SH([with_]with_arg)=yes]) m4_pushdef([def_action_if_not_found], [AS_TR_SH([with_]with_arg)=no]) m4_case(def_arg, [yes],[m4_pushdef([with_without], [--without-]with_arg)], [m4_pushdef([with_without],[--with-]with_arg)]) AC_ARG_WITH(with_arg, AS_HELP_STRING(with_without, description[ @<:@default=]def_arg[@:>@]),, [AS_TR_SH([with_]with_arg)=def_arg]) AS_CASE([$AS_TR_SH([with_]with_arg)], [yes],[PKG_CHECK_MODULES([$1],[$2],$3,$4)], [auto],[PKG_CHECK_MODULES([$1],[$2], [m4_n([def_action_if_found]) $3], [m4_n([def_action_if_not_found]) $4])]) m4_popdef([with_arg]) m4_popdef([description]) m4_popdef([def_arg]) ])dnl PKG_WITH_MODULES dnl PKG_HAVE_WITH_MODULES(VARIABLE-PREFIX, MODULES, dnl [DESCRIPTION], [DEFAULT]) dnl ----------------------------------------------- dnl dnl Convenience macro to trigger AM_CONDITIONAL after PKG_WITH_MODULES dnl check._[VARIABLE-PREFIX] is exported as make variable. AC_DEFUN([PKG_HAVE_WITH_MODULES], [ PKG_WITH_MODULES([$1],[$2],,,[$3],[$4]) AM_CONDITIONAL([HAVE_][$1], [test "$AS_TR_SH([with_]m4_tolower([$1]))" = "yes"]) ])dnl PKG_HAVE_WITH_MODULES dnl PKG_HAVE_DEFINE_WITH_MODULES(VARIABLE-PREFIX, MODULES, dnl [DESCRIPTION], [DEFAULT]) dnl ------------------------------------------------------ dnl dnl Convenience macro to run AM_CONDITIONAL and AC_DEFINE after dnl PKG_WITH_MODULES check. HAVE_[VARIABLE-PREFIX] is exported as make dnl and preprocessor variable. AC_DEFUN([PKG_HAVE_DEFINE_WITH_MODULES], [ PKG_HAVE_WITH_MODULES([$1],[$2],[$3],[$4]) AS_IF([test "$AS_TR_SH([with_]m4_tolower([$1]))" = "yes"], [AC_DEFINE([HAVE_][$1], 1, [Enable ]m4_tolower([$1])[ support])]) ])dnl PKG_HAVE_DEFINE_WITH_MODULES # Copyright (C) 2002-2017 Free Software Foundation, Inc. # # 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. # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.15' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.15.1], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.15.1])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001-2017 Free Software Foundation, Inc. # # 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. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to # '$srcdir', '$srcdir/..', or '$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is '.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997-2017 Free Software Foundation, Inc. # # 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. # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ([2.52])dnl m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999-2017 Free Software Foundation, Inc. # # 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. # There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], [$1], [CXX], [depcc="$CXX" am_compiler_list=], [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], [$1], [UPC], [depcc="$UPC" am_compiler_list=], [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES. AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE([dependency-tracking], [dnl AS_HELP_STRING( [--enable-dependency-tracking], [do not reject slow dependency extractors]) AS_HELP_STRING( [--disable-dependency-tracking], [speeds up one-time build])]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999-2017 Free Software Foundation, Inc. # # 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. # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each '.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996-2017 Free Software Foundation, Inc. # # 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. # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC]) [_AM_PROG_CC_C_O ]) # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.65])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [AC_DIAGNOSE([obsolete], [$0: two- and three-arguments forms are deprecated.]) m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if( m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) AM_MISSING_PROG([AUTOCONF], [autoconf]) AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) AM_MISSING_PROG([AUTOHEADER], [autoheader]) AM_MISSING_PROG([MAKEINFO], [makeinfo]) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) # We need awk for the "check" target (and possibly the TAP driver). The # system "awk" is bad on some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES([CC])], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES([CXX])], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) AC_REQUIRE([AM_SILENT_RULES])dnl dnl The testsuite driver may need to know about EXEEXT, so add the dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) fi fi dnl The trailing newline in this macro's definition is deliberate, for dnl backward compatibility and to allow trailing 'dnl'-style comments dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. ]) dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001-2017 Free Software Foundation, Inc. # # 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. # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST([install_sh])]) # Copyright (C) 2003-2017 Free Software Foundation, Inc. # # 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. # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Add --enable-maintainer-mode option to configure. -*- Autoconf -*- # From Jim Meyering # Copyright (C) 1996-2017 Free Software Foundation, Inc. # # 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. # AM_MAINTAINER_MODE([DEFAULT-MODE]) # ---------------------------------- # Control maintainer-specific portions of Makefiles. # Default is to disable them, unless 'enable' is passed literally. # For symmetry, 'disable' may be passed as well. Anyway, the user # can override the default with the --enable/--disable switch. AC_DEFUN([AM_MAINTAINER_MODE], [m4_case(m4_default([$1], [disable]), [enable], [m4_define([am_maintainer_other], [disable])], [disable], [m4_define([am_maintainer_other], [enable])], [m4_define([am_maintainer_other], [enable]) m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])]) AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) dnl maintainer-mode's default is 'disable' unless 'enable' is passed AC_ARG_ENABLE([maintainer-mode], [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode], am_maintainer_other[ make rules and dependencies not useful (and sometimes confusing) to the casual installer])], [USE_MAINTAINER_MODE=$enableval], [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) AC_MSG_RESULT([$USE_MAINTAINER_MODE]) AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) MAINT=$MAINTAINER_MODE_TRUE AC_SUBST([MAINT])dnl ] ) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001-2017 Free Software Foundation, Inc. # # 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. # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997-2017 Free Software Foundation, Inc. # # 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. # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it is modern enough. # If it is, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= AC_MSG_WARN(['missing' script is too old or missing]) fi ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001-2017 Free Software Foundation, Inc. # # 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. # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), [1])]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Copyright (C) 1999-2017 Free Software Foundation, Inc. # # 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. # _AM_PROG_CC_C_O # --------------- # Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC # to automatically call this. AC_DEFUN([_AM_PROG_CC_C_O], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([compile])dnl AC_LANG_PUSH([C])dnl AC_CACHE_CHECK( [whether $CC understands -c and -o together], [am_cv_prog_cc_c_o], [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i]) if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi AC_LANG_POP([C])]) # For backward compatibility. AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) # Copyright (C) 2001-2017 Free Software Foundation, Inc. # # 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. # AM_RUN_LOG(COMMAND) # ------------------- # Run COMMAND, save the exit status in ac_status, and log it. # (This has been adapted from Autoconf's _AC_RUN_LOG macro.) AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD (exit $ac_status); }]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996-2017 Free Software Foundation, Inc. # # 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. # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi if test "$[2]" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT([yes]) # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi AC_CONFIG_COMMANDS_PRE( [AC_MSG_CHECKING([that generated files are newer than configure]) if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi AC_MSG_RESULT([done])]) rm -f conftest.file ]) # Copyright (C) 2009-2017 Free Software Foundation, Inc. # # 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. # AM_SILENT_RULES([DEFAULT]) # -------------------------- # Enable less verbose build rules; with the default set to DEFAULT # ("yes" being less verbose, "no" or empty being verbose). AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [dnl AS_HELP_STRING( [--enable-silent-rules], [less verbose build output (undo: "make V=1")]) AS_HELP_STRING( [--disable-silent-rules], [verbose build output (undo: "make V=0")])dnl ]) case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; esac dnl dnl A few 'make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} AC_CACHE_CHECK([whether $am_make supports nested variables], [am_cv_make_support_nested_variables], [if AS_ECHO([['TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi]) if test $am_cv_make_support_nested_variables = yes; then dnl Using '$V' instead of '$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) # Copyright (C) 2001-2017 Free Software Foundation, Inc. # # 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. # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor 'install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in "make install-strip", and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006-2017 Free Software Foundation, Inc. # # 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. # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004-2017 Free Software Foundation, Inc. # # 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. # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of 'v7', 'ustar', or 'pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar # AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar], [# The POSIX 1988 'ustar' format is defined with fixed-size fields. # There is notably a 21 bits limit for the UID and the GID. In fact, # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 # and bug#13588). am_max_uid=2097151 # 2^21 - 1 am_max_gid=$am_max_uid # The $UID and $GID variables are not portable, so we need to resort # to the POSIX-mandated id(1) utility. Errors in the 'id' calls # below are definitely unexpected, so allow the users to see them # (that is, avoid stderr redirection). am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) if test $am_uid -le $am_max_uid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) if test $am_gid -le $am_max_gid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi], [pax], [], [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_$1-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR m4_include([m4/gettext.m4]) m4_include([m4/gtk.m4]) m4_include([m4/iconv.m4]) m4_include([m4/lib-ld.m4]) m4_include([m4/lib-link.m4]) m4_include([m4/lib-prefix.m4]) m4_include([m4/progtest.m4]) m4_include([m4/sdl.m4]) mhwaveedit-1.4.24/compile000077500000000000000000000163251334022513400153210ustar00rootroot00000000000000#!/bin/sh # Wrapper for compilers which do not understand '-c -o'. scriptversion=2016-01-11.22; # UTC # Copyright (C) 1999-2017 Free Software Foundation, Inc. # Written by Tom Tromey . # # 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, 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, see . # 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. # This file is maintained in Automake, please report # bugs to or send patches to # . nl=' ' # We need space, tab and new line, in precisely that order. Quoting is # there to prevent tools from complaining about whitespace usage. IFS=" "" $nl" file_conv= # func_file_conv build_file lazy # Convert a $build file to $host form and store it in $file # Currently only supports Windows hosts. If the determined conversion # type is listed in (the comma separated) LAZY, no conversion will # take place. func_file_conv () { file=$1 case $file in / | /[!/]*) # absolute file, and not a UNC file if test -z "$file_conv"; then # lazily determine how to convert abs files case `uname -s` in MINGW*) file_conv=mingw ;; CYGWIN*) file_conv=cygwin ;; *) file_conv=wine ;; esac fi case $file_conv/,$2, in *,$file_conv,*) ;; mingw/*) file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ;; cygwin/*) file=`cygpath -m "$file" || echo "$file"` ;; wine/*) file=`winepath -w "$file" || echo "$file"` ;; esac ;; esac } # func_cl_dashL linkdir # Make cl look for libraries in LINKDIR func_cl_dashL () { func_file_conv "$1" if test -z "$lib_path"; then lib_path=$file else lib_path="$lib_path;$file" fi linker_opts="$linker_opts -LIBPATH:$file" } # func_cl_dashl library # Do a library search-path lookup for cl func_cl_dashl () { lib=$1 found=no save_IFS=$IFS IFS=';' for dir in $lib_path $LIB do IFS=$save_IFS if $shared && test -f "$dir/$lib.dll.lib"; then found=yes lib=$dir/$lib.dll.lib break fi if test -f "$dir/$lib.lib"; then found=yes lib=$dir/$lib.lib break fi if test -f "$dir/lib$lib.a"; then found=yes lib=$dir/lib$lib.a break fi done IFS=$save_IFS if test "$found" != yes; then lib=$lib.lib fi } # func_cl_wrapper cl arg... # Adjust compile command to suit cl func_cl_wrapper () { # Assume a capable shell lib_path= shared=: linker_opts= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. eat=1 case $2 in *.o | *.[oO][bB][jJ]) func_file_conv "$2" set x "$@" -Fo"$file" shift ;; *) func_file_conv "$2" set x "$@" -Fe"$file" shift ;; esac ;; -I) eat=1 func_file_conv "$2" mingw set x "$@" -I"$file" shift ;; -I*) func_file_conv "${1#-I}" mingw set x "$@" -I"$file" shift ;; -l) eat=1 func_cl_dashl "$2" set x "$@" "$lib" shift ;; -l*) func_cl_dashl "${1#-l}" set x "$@" "$lib" shift ;; -L) eat=1 func_cl_dashL "$2" ;; -L*) func_cl_dashL "${1#-L}" ;; -static) shared=false ;; -Wl,*) arg=${1#-Wl,} save_ifs="$IFS"; IFS=',' for flag in $arg; do IFS="$save_ifs" linker_opts="$linker_opts $flag" done IFS="$save_ifs" ;; -Xlinker) eat=1 linker_opts="$linker_opts $2" ;; -*) set x "$@" "$1" shift ;; *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) func_file_conv "$1" set x "$@" -Tp"$file" shift ;; *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) func_file_conv "$1" mingw set x "$@" "$file" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -n "$linker_opts"; then linker_opts="-link$linker_opts" fi exec "$@" $linker_opts exit 1 } eat= case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: compile [--help] [--version] PROGRAM [ARGS] Wrapper for compilers which do not understand '-c -o'. Remove '-o dest.o' from ARGS, run PROGRAM with the remaining arguments, and rename the output as expected. If you are trying to build a whole package this is not the right script to run: please start by reading the file 'INSTALL'. Report bugs to . EOF exit $? ;; -v | --v*) echo "compile $scriptversion" exit $? ;; cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) func_cl_wrapper "$@" # Doesn't return... ;; esac ofile= cfile= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. # So we strip '-o arg' only if arg is an object. eat=1 case $2 in *.o | *.obj) ofile=$2 ;; *) set x "$@" -o "$2" shift ;; esac ;; *.c) cfile=$1 set x "$@" "$1" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -z "$ofile" || test -z "$cfile"; then # If no '-o' option was seen then we might have been invoked from a # pattern rule where we don't need one. That is ok -- this is a # normal compilation that the losing compiler can handle. If no # '.c' file was seen then we are probably linking. That is also # ok. exec "$@" fi # Name of file we expect compiler to create. cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` # Create the lock directory. # Note: use '[/\\:.-]' here to ensure that we don't use the same name # that we are using for the .o file. Also, base the name on the expected # object file name, since that is what matters with a parallel build. lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d while true; do if mkdir "$lockdir" >/dev/null 2>&1; then break fi sleep 1 done # FIXME: race condition here if user kills between mkdir and trap. trap "rmdir '$lockdir'; exit 1" 1 2 15 # Run the compile. "$@" ret=$? if test -f "$cofile"; then test "$cofile" = "$ofile" || mv "$cofile" "$ofile" elif test -f "${cofile}bj"; then test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" fi rmdir "$lockdir" exit $ret # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: mhwaveedit-1.4.24/config.guess000066400000000000000000001221401334022513400162510ustar00rootroot00000000000000#! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003 Free Software Foundation, Inc. timestamp='2003-08-18' # This file 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. # Originally written by Per Bothner . # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # # The plan is that this can be called by configure scripts if you # don't specify an explicit build system type. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit 0 ;; --version | -v ) echo "$version" ; exit 0 ;; --help | --h* | -h ) echo "$usage"; exit 0 ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d -q "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep __ELF__ >/dev/null then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit 0 ;; amiga:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; arc:OpenBSD:*:*) echo mipsel-unknown-openbsd${UNAME_RELEASE} exit 0 ;; hp300:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mac68k:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; macppc:OpenBSD:*:*) echo powerpc-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mvme68k:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mvme88k:OpenBSD:*:*) echo m88k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mvmeppc:OpenBSD:*:*) echo powerpc-unknown-openbsd${UNAME_RELEASE} exit 0 ;; pmax:OpenBSD:*:*) echo mipsel-unknown-openbsd${UNAME_RELEASE} exit 0 ;; sgi:OpenBSD:*:*) echo mipseb-unknown-openbsd${UNAME_RELEASE} exit 0 ;; sun3:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; wgrisc:OpenBSD:*:*) echo mipsel-unknown-openbsd${UNAME_RELEASE} exit 0 ;; *:OpenBSD:*:*) echo ${UNAME_MACHINE}-unknown-openbsd${UNAME_RELEASE} exit 0 ;; alpha:OSF1:*:*) if test $UNAME_RELEASE = "V4.0"; then UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` fi # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` exit 0 ;; Alpha*:OpenVMS:*:*) echo alpha-hp-vms exit 0 ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit 0 ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit 0 ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit 0;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit 0 ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit 0 ;; *:OS/390:*:*) echo i370-ibm-openedition exit 0 ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit 0;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit 0;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit 0 ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit 0 ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit 0 ;; DRS?6000:UNIX_SV:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7 && exit 0 ;; esac ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; i86pc:SunOS:5.*:*) echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit 0 ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit 0 ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit 0 ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit 0 ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit 0 ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit 0 ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit 0 ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit 0 ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit 0 ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit 0 ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit 0 ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit 0 ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit 0 ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit 0 ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit 0 ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c \ && $dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \ && exit 0 echo mips-mips-riscos${UNAME_RELEASE} exit 0 ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit 0 ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit 0 ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit 0 ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit 0 ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit 0 ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit 0 ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit 0 ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit 0 ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit 0 ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit 0 ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit 0 ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit 0 ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit 0 ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit 0 ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit 0 ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0 echo rs6000-ibm-aix3.2.5 elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit 0 ;; *:AIX:*:[45]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit 0 ;; *:AIX:*:*) echo rs6000-ibm-aix exit 0 ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit 0 ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit 0 ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit 0 ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit 0 ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit 0 ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit 0 ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then # avoid double evaluation of $set_cc_for_build test -n "$CC_FOR_BUILD" || eval $set_cc_for_build if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E -) | grep __LP64__ >/dev/null then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit 0 ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit 0 ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0 echo unknown-hitachi-hiuxwe2 exit 0 ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit 0 ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit 0 ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit 0 ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit 0 ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit 0 ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit 0 ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit 0 ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit 0 ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit 0 ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit 0 ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit 0 ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit 0 ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; *:UNICOS/mp:*:*) echo nv1-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit 0 ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit 0 ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit 0 ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit 0 ;; *:FreeBSD:*:*|*:GNU/FreeBSD:*:*) # Determine whether the default compiler uses glibc. eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include #if __GLIBC__ >= 2 LIBC=gnu #else LIBC= #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` # GNU/FreeBSD systems have a "k" prefix to indicate we are using # FreeBSD's kernel, but not the complete OS. case ${LIBC} in gnu) kernel_only='k' ;; esac echo ${UNAME_MACHINE}-unknown-${kernel_only}freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`${LIBC:+-$LIBC} exit 0 ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit 0 ;; i*:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit 0 ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit 0 ;; x86:Interix*:[34]*) echo i586-pc-interix${UNAME_RELEASE}|sed -e 's/\..*//' exit 0 ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit 0 ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit 0 ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit 0 ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit 0 ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; *:GNU:*:*) echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit 0 ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit 0 ;; arm*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; cris:Linux:*:*) echo cris-axis-linux-gnu exit 0 ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; mips:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips #undef mipsel #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mipsel #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0 ;; mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips64 #undef mips64el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mips64el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips64 #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0 ;; ppc:Linux:*:*) echo powerpc-unknown-linux-gnu exit 0 ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-gnu exit 0 ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} exit 0 ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-gnu ;; PA8*) echo hppa2.0-unknown-linux-gnu ;; *) echo hppa-unknown-linux-gnu ;; esac exit 0 ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-gnu exit 0 ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit 0 ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; x86_64:Linux:*:*) echo x86_64-unknown-linux-gnu exit 0 ;; i*86:Linux:*:*) # The BFD linker knows what the default object file format is, so # first see if it will tell us. cd to the root directory to prevent # problems with other programs or directories called `ld' in the path. # Set LC_ALL=C to ensure ld outputs messages in English. ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ | sed -ne '/supported targets:/!d s/[ ][ ]*/ /g s/.*supported targets: *// s/ .*// p'` case "$ld_supported_targets" in elf32-i386) TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" ;; a.out-i386-linux) echo "${UNAME_MACHINE}-pc-linux-gnuaout" exit 0 ;; coff-i386) echo "${UNAME_MACHINE}-pc-linux-gnucoff" exit 0 ;; "") # Either a pre-BFD a.out linker (linux-gnuoldld) or # one that does not give us useful --help. echo "${UNAME_MACHINE}-pc-linux-gnuoldld" exit 0 ;; esac # Determine whether the default compiler is a.out or elf eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include #ifdef __ELF__ # ifdef __GLIBC__ # if __GLIBC__ >= 2 LIBC=gnu # else LIBC=gnulibc1 # endif # else LIBC=gnulibc1 # endif #else #ifdef __INTEL_COMPILER LIBC=gnu #else LIBC=gnuaout #endif #endif #ifdef __dietlibc__ LIBC=dietlibc #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` test x"${LIBC}" != x && echo "${UNAME_MACHINE}-pc-linux-${LIBC}" && exit 0 test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0 ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit 0 ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit 0 ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit 0 ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit 0 ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit 0 ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit 0 ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit 0 ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit 0 ;; i*86:*:5:[78]*) case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit 0 ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit 0 ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i386. echo i386-pc-msdosdjgpp exit 0 ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit 0 ;; paragon:*:*:*) echo i860-intel-osf1 exit 0 ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit 0 ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit 0 ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit 0 ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit 0 ;; M68*:*:R3V[567]*:*) test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;; 3[34]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && echo i486-ncr-sysv4.3${OS_REL} && exit 0 /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && echo i486-ncr-sysv4 && exit 0 ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit 0 ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit 0 ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit 0 ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit 0 ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit 0 ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit 0 ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit 0 ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit 0 ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit 0 ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit 0 ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit 0 ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit 0 ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit 0 ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit 0 ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit 0 ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit 0 ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit 0 ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit 0 ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit 0 ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit 0 ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit 0 ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit 0 ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit 0 ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit 0 ;; *:Darwin:*:*) case `uname -p` in *86) UNAME_PROCESSOR=i686 ;; powerpc) UNAME_PROCESSOR=powerpc ;; esac echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit 0 ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit 0 ;; *:QNX:*:4*) echo i386-pc-qnx exit 0 ;; NSR-[DGKLNPTVW]:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit 0 ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit 0 ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit 0 ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit 0 ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit 0 ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit 0 ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit 0 ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit 0 ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit 0 ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit 0 ;; *:ITS:*:*) echo pdp10-unknown-its exit 0 ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit 0 ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && $dummy && exit 0 # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit 0 ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit 0 ;; c34*) echo c34-convex-bsd exit 0 ;; c38*) echo c38-convex-bsd exit 0 ;; c4*) echo c4-convex-bsd exit 0 ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: mhwaveedit-1.4.24/config.h.in000066400000000000000000000207751334022513400157720ustar00rootroot00000000000000/* config.h.in. Generated from configure.in by autoheader. */ /* Define to 1 if the `closedir' function returns void instead of `int'. */ #undef CLOSEDIR_VOID /* Default sound driver */ #undef DEFAULT_DRIVER /* Default path for LADSPA plugins */ #undef DEFAULT_LADSPA_PATH /* Default mixer application */ #undef DEFAULT_MIXERAPP /* Define to 1 if translation of program messages to the user's native language is requested. */ #undef ENABLE_NLS /* Fixed build date */ #undef FIXED_DATE /* Fixed build date */ #undef FIXED_TIME /* If defined, disables GTK+ type checking */ #undef GTK_NO_CHECK_CASTS /* Enable ALSA sound driver */ #undef HAVE_ALSALIB /* Enable aRts driver */ #undef HAVE_ARTSC /* Define to 1 if you have the `ceill' function. */ #undef HAVE_CEILL /* Define if the GNU dcgettext() function is already present or preinstalled. */ #undef HAVE_DCGETTEXT /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_DIRENT_H /* Define to 1 if you have the `dup2' function. */ #undef HAVE_DUP2 /* Enable EsounD sound driver */ #undef HAVE_ESOUND /* Define to 1 if you have the header file. */ #undef HAVE_FCNTL_H /* Define to 1 if you have the `fork' function. */ #undef HAVE_FORK /* Define to 1 if you have the `fseeko' function. */ #undef HAVE_FSEEKO /* Define to 1 if you have the `ftello' function. */ #undef HAVE_FTELLO /* Define if the GNU gettext() function is already present or preinstalled. */ #undef HAVE_GETTEXT /* Define to 1 if you have the `gettimeofday' function. */ #undef HAVE_GETTIMEOFDAY /* Defined if Glib thread support is available */ #undef HAVE_GTHREAD /* Define if you have the iconv() function. */ #undef HAVE_ICONV /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Enable JACK sound driver */ #undef HAVE_JACK /* Enable LADSPA support */ #undef HAVE_LADSPA /* Define to 1 if you have the `ibs' library (-libs). */ #undef HAVE_LIBIBS /* Define to 1 if you have the header file. */ #undef HAVE_LIBINTL_H /* Define to 1 if you have the `m' library (-lm). */ #undef HAVE_LIBM /* Define to 1 if you have the `ossaudio' library (-lossaudio). */ #undef HAVE_LIBOSSAUDIO /* Define to 1 if you have the `pthread' library (-lpthread). */ #undef HAVE_LIBPTHREAD /* Use libsamplerate library */ #undef HAVE_LIBSAMPLERATE /* Use libsndfile library */ #undef HAVE_LIBSNDFILE /* Define to 1 if you have the header file. */ #undef HAVE_LOCALE_H /* Define to 1 if you have the `lrint' function. */ #undef HAVE_LRINT /* Define to 1 if you have the `lrintf' function. */ #undef HAVE_LRINTF /* Define to 1 if you have the `memchr' function. */ #undef HAVE_MEMCHR /* Define to 1 if you have the `memmove' function. */ #undef HAVE_MEMMOVE /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the `memset' function. */ #undef HAVE_MEMSET /* Define to 1 if you have the `mkdir' function. */ #undef HAVE_MKDIR /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_NDIR_H /* Enable OSS sound driver */ #undef HAVE_OSS /* Enable PortAudio sound driver */ #undef HAVE_PORTAUDIO /* Define to 1 if you have the `pow' function. */ #undef HAVE_POW /* Enable PulseAudio sound driver */ #undef HAVE_PULSEAUDIO /* Define to 1 if you have the `putenv' function. */ #undef HAVE_PUTENV /* Define to 1 if you have the header file. */ #undef HAVE_SCHED_H /* Define to 1 if you have the `sched_yield' function. */ #undef HAVE_SCHED_YIELD /* Enable SDL sound driver */ #undef HAVE_SDL /* Define to 1 if you have the `select' function. */ #undef HAVE_SELECT /* Define to 1 if you have the `setlocale' function. */ #undef HAVE_SETLOCALE /* Define to 1 if you have the header file. */ #undef HAVE_SOUNDCARD_H /* Define to 1 if you have the `sqrt' function. */ #undef HAVE_SQRT /* Define to 1 if `stat' has the bug that it succeeds when given the zero-length file name argument. */ #undef HAVE_STAT_EMPTY_STRING_BUG /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the `strchr' function. */ #undef HAVE_STRCHR /* Define to 1 if you have the `strerror' function. */ #undef HAVE_STRERROR /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the `strrchr' function. */ #undef HAVE_STRRCHR /* Define to 1 if you have the `strstr' function. */ #undef HAVE_STRSTR /* Define to 1 if you have the `strtod' function. */ #undef HAVE_STRTOD /* Define to 1 if you have the `strtol' function. */ #undef HAVE_STRTOL /* Define to 1 if you have the `strtoul' function. */ #undef HAVE_STRTOUL /* Enable Sun audio sound driver */ #undef HAVE_SUN /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_SYS_DIR_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_IOCTL_H /* Use system LADSPA header */ #undef HAVE_SYS_LADSPA_H /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_SYS_NDIR_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SELECT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SOCKET_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SOUNDCARD_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TIME_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have that is POSIX.1 compatible. */ #undef HAVE_SYS_WAIT_H /* Define to 1 if you have the header file. */ #undef HAVE_TIME_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to 1 if you have the `vfork' function. */ #undef HAVE_VFORK /* Define to 1 if you have the header file. */ #undef HAVE_VFORK_H /* Define to 1 if `fork' works. */ #undef HAVE_WORKING_FORK /* Define to 1 if `vfork' works. */ #undef HAVE_WORKING_VFORK /* Define to 1 if `lstat' dereferences a symlink specified with a trailing slash. */ #undef LSTAT_FOLLOWS_SLASHED_SYMLINK /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Define as the return type of signal handlers (`int' or `void'). */ #undef RETSIGTYPE /* Define to the type of arg 1 for `select'. */ #undef SELECT_TYPE_ARG1 /* Define to the type of args 2, 3 and 4 for `select'. */ #undef SELECT_TYPE_ARG234 /* Define to the type of arg 5 for `select'. */ #undef SELECT_TYPE_ARG5 /* The size of `off_t', as computed by sizeof. */ #undef SIZEOF_OFF_T /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Define to 1 if you can safely include both and . */ #undef TIME_WITH_SYS_TIME /* Defined if unsetenv returns an integer */ #undef UNSETENV_RETVAL /* Use gdouble instead of gfloat as sample data type */ #undef USE_DOUBLE_SAMPLES /* Version number of package */ #undef VERSION /* Enable large inode numbers on Mac OS X 10.5. */ #ifndef _DARWIN_USE_64_BIT_INODE # define _DARWIN_USE_64_BIT_INODE 1 #endif /* Number of bits in a file offset, on hosts where this is settable. */ #undef _FILE_OFFSET_BITS /* Defined to get fseeko/ftello prototypes */ #undef _LARGEFILE_SOURCE /* Define for large files, on AIX-style hosts. */ #undef _LARGE_FILES /* Define to empty if `const' does not conform to ANSI C. */ #undef const /* Define to `long int' if does not define. */ #undef off_t /* Define to `int' if does not define. */ #undef pid_t /* Define to `unsigned int' if does not define. */ #undef size_t /* Define as `fork' if `vfork' does not work. */ #undef vfork /* Define to empty if the keyword `volatile' does not work. Warning: valid code using `volatile' can become incorrect without. Disable with care. */ #undef volatile mhwaveedit-1.4.24/config.rpath000066400000000000000000000334341334022513400162500ustar00rootroot00000000000000#! /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-2002 Free Software Foundation, Inc. # Taken from GNU libtool, 2001 # Originally by Gordon Matzigkeit , 1996 # # 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. # # 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. # All known linkers require a `.a' archive for static linking (except M$VC, # which needs '.lib'). libext=a shlibext= host="$1" host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` wl= if test "$GCC" = yes; then wl='-Wl,' else case "$host_os" in aix3* | aix4* | aix5*) wl='-Wl,' ;; hpux9* | hpux10* | hpux11*) wl='-Wl,' ;; irix5* | irix6*) wl='-Wl,' ;; linux*) echo '__INTEL_COMPILER' > conftest.$ac_ext if $CC -E conftest.$ac_ext >/dev/null | grep __INTEL_COMPILER >/dev/null then : else # Intel icc wl='-Qoption,ld,' fi ;; osf3* | osf4* | osf5*) wl='-Wl,' ;; solaris*) wl='-Wl,' ;; sunos4*) wl='-Qoption ld ' ;; sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) if test "x$host_vendor" = xsni; then wl='-LD' else wl='-Wl,' fi ;; esac fi 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 ;; openbsd*) with_gnu_ld=no ;; esac ld_shlibs=yes if test "$with_gnu_ld" = yes; then case "$host_os" in aix3* | aix4* | aix5*) # On AIX, the GNU linker is very broken ld_shlibs=no ;; 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 can use # them. ld_shlibs=no ;; beos*) if $LD --help 2>&1 | egrep ': 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' ;; solaris* | sysv5*) if $LD -v 2>&1 | egrep 'BFD 2\.8' > /dev/null; then ld_shlibs=no elif $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; sunos4*) hardcode_direct=yes ;; *) if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; esac if test "$ld_shlibs" = yes; then hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' 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 hardcode_direct=yes else # We have old collect2 hardcode_direct=unsupported hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi esac fi if test "$aix_use_runtimelinking" = yes; then hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:/usr/lib:/lib' else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' else hardcode_libdir_flag_spec='${wl}-bnolibpath ${wl}-blibpath:$libdir:/usr/lib:/lib' 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 ;; 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=yes ;; freebsd1*) ld_shlibs=no ;; freebsd2.2*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; freebsd2*) hardcode_direct=yes hardcode_minus_L=yes ;; freebsd*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; hpux9* | hpux10* | hpux11*) hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes hardcode_minus_L=yes # Not in the search PATH, but as the default # location of the library. ;; irix5* | irix6*) 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*) 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 ;; 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=: ;; sco3.2v5*) ;; solaris*) hardcode_libdir_flag_spec='-R$libdir' ;; sunos4*) hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes ;; sysv4) if test "x$host_vendor" = xsno; then hardcode_direct=yes # is this really true??? else hardcode_direct=no # Motorola manual says yes, but my tests say they lie fi ;; sysv4.3*) ;; sysv5*) hardcode_libdir_flag_spec= ;; uts4*) hardcode_libdir_flag_spec='-L$libdir' ;; dgux*) hardcode_libdir_flag_spec='-L$libdir' ;; sysv4*MP*) if test -d /usr/nec; then ld_shlibs=yes fi ;; sysv4.2uw2*) hardcode_direct=yes hardcode_minus_L=no ;; sysv5uw7* | unixware7*) ;; *) ld_shlibs=no ;; esac fi # Check dynamic linker characteristics libname_spec='lib$name' sys_lib_dlsearch_path_spec="/lib /usr/lib" sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" case "$host_os" in aix3*) shlibext=so ;; aix4* | aix5*) shlibext=so ;; amigaos*) shlibext=ixlibrary ;; beos*) shlibext=so ;; bsdi4*) shlibext=so sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" ;; cygwin* | mingw* | pw32*) case $GCC,$host_os in yes,cygwin*) shlibext=dll.a ;; yes,mingw*) shlibext=dll sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | sed -e "s/^libraries://" -e "s/;/ /g"` ;; yes,pw32*) shlibext=dll ;; *) shlibext=dll ;; esac ;; darwin* | rhapsody*) shlibext=dylib ;; freebsd1*) ;; freebsd*) shlibext=so ;; gnu*) shlibext=so ;; hpux9* | hpux10* | hpux11*) shlibext=sl ;; irix5* | irix6*) shlibext=so case "$host_os" in irix5*) libsuff= shlibsuff= ;; *) case $LD in *-32|*"-32 ") libsuff= shlibsuff= ;; *-n32|*"-n32 ") libsuff=32 shlibsuff=N32 ;; *-64|*"-64 ") libsuff=64 shlibsuff=64 ;; *) libsuff= shlibsuff= ;; esac ;; esac sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" ;; linux-gnuoldld* | linux-gnuaout* | linux-gnucoff*) ;; linux-gnu*) shlibext=so ;; netbsd*) shlibext=so ;; newsos6) shlibext=so ;; openbsd*) shlibext=so ;; os2*) libname_spec='$name' shlibext=dll ;; osf3* | osf4* | osf5*) shlibext=so sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; sco3.2v5*) shlibext=so ;; solaris*) shlibext=so ;; sunos4*) shlibext=so ;; sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) shlibext=so case "$host_vendor" in motorola) sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; uts4*) shlibext=so ;; dgux*) shlibext=so ;; sysv4*MP*) if test -d /usr/nec; then shlibext=so fi ;; esac sed_quote_subst='s/\(["`$\\]\)/\\\1/g' escaped_wl=`echo "X$wl" | 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"` escaped_sys_lib_search_path_spec=`echo "X$sys_lib_search_path_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` escaped_sys_lib_dlsearch_path_spec=`echo "X$sys_lib_dlsearch_path_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <. Submit a context # diff and a properly formatted ChangeLog entry. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit 0 ;; --version | -v ) echo "$version" ; exit 0 ;; --help | --h* | -h ) echo "$usage"; exit 0 ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit 0;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-dietlibc | kfreebsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis) os= basic_machine=$1 ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | m32r | m68000 | m68k | m88k | mcore \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64vr | mips64vrel \ | mips64orion | mips64orionel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | msp430 \ | ns16k | ns32k \ | openrisc | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ | pyramid \ | sh | sh[1234] | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv9 | sparcv9b \ | strongarm \ | tahoe | thumb | tic4x | tic80 | tron \ | v850 | v850e \ | we32k \ | x86 | xscale | xstormy16 | xtensa \ | z8k) basic_machine=$basic_machine-unknown ;; m6811 | m68hc11 | m6812 | m68hc12) # Motorola 68HC11/12. basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* \ | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ | clipper-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | m32r-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | mcore-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64vr-* | mips64vrel-* \ | mips64orion-* | mips64orionel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ | msp430-* \ | none-* | np1-* | nv1-* | ns16k-* | ns32k-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ | pyramid-* \ | romp-* | rs6000-* \ | sh-* | sh[1234]-* | sh[23]e-* | sh[34]eb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc86x-* | sparclet-* | sparclite-* \ | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \ | tahoe-* | thumb-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tron-* \ | v850-* | v850e-* | vax-* \ | we32k-* \ | x86-* | x86_64-* | xps100-* | xscale-* | xstormy16-* \ | xtensa-* \ | ymp-* \ | z8k-*) ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; c90) basic_machine=c90-cray os=-unicos ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; crds | unos) basic_machine=m68k-crds ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; # I'm not sure what "Sysv32" means. Should this be sysv3.2? i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; mmix*) basic_machine=mmix-knuth os=-mmixware ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; mvs) basic_machine=i370-ibm os=-mvs ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; nv1) basic_machine=nv1-cray os=-unicosmp ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; or32 | or32-*) basic_machine=or32-unknown os=-coff ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc) basic_machine=powerpc-unknown ;; ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tic54x | c54x*) basic_machine=tic54x-unknown os=-coff ;; tic55x | c55x*) basic_machine=tic55x-unknown os=-coff ;; tic6x | c6x*) basic_machine=tic6x-unknown os=-coff ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xps | xps100) basic_machine=xps100-honeywell ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh3 | sh4 | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sh64) basic_machine=sh64-unknown ;; sparc | sparcv9 | sparcv9b) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -netbsd* | -openbsd* | -kfreebsd* | -freebsd* | -riscix* \ | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* \ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -kaos*) os=-kaos ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 # This also exists in the configure program, but was not the # default. # os=-sunos4 ;; m68*-cisco) os=-aout ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-ibm) os=-aix ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -ptx*) vendor=sequent ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: mhwaveedit-1.4.24/configure000077500000000000000000013036351334022513400156560ustar00rootroot00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME= PACKAGE_TARNAME= PACKAGE_VERSION= PACKAGE_STRING= PACKAGE_BUGREPORT= PACKAGE_URL= ac_unique_file="src/chunk.c" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS POW_LIB LIBOBJS GTHREAD_LIBS GTHREAD_CFLAGS GTK_CONFIG GTK_LIBS GTK_CFLAGS ARTSC_LIBS ARTSC_CFLAGS ARTSC_CONFIG ESOUND_LIBS ESOUND_CFLAGS PULSE_LIBS PULSE_CFLAGS JACK_LIBS JACK_CFLAGS ALSALIB_LIBS SDL_LIBS SDL_CFLAGS SDL_CONFIG PORTAUDIO_LIBS LIBSAMPLERATE_LIBS LIBSAMPLERATE_CFLAGS SNDFILE_LIBS SNDFILE_CFLAGS LN_S EGREP GREP CPP PKG_CONFIG_LIBDIR PKG_CONFIG_PATH PKG_CONFIG POSUB LTLIBINTL LIBINTL INTLLIBS LTLIBICONV LIBICONV USE_NLS am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC MSGMERGE XGETTEXT GMSGFMT MSGFMT MKINSTALLDIRS MAINT MAINTAINER_MODE_FALSE MAINTAINER_MODE_TRUE AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_os target_vendor target_cpu target host_os host_vendor host_cpu host build_os build_vendor build_cpu build target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_silent_rules enable_maintainer_mode enable_dependency_tracking with_gnu_ld enable_rpath with_libiconv_prefix enable_nls with_libintl_prefix with_double_samples with_check_casts enable_werror with_default_driver with_default_ladspa_path with_default_mixerapp with_build_date with_build_time with_libsndfile with_libsamplerate with_portaudio with_sdl with_sdl_prefix with_sdl_exec_prefix enable_sdltest with_alsalib with_oss with_jack with_pulse with_esound with_sun with_arts enable_gtk2 enable_gtktest with_gtk_prefix with_gtk_exec_prefix enable_largefile enable_ladspa ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS PKG_CONFIG PKG_CONFIG_PATH PKG_CONFIG_LIBDIR CPP SNDFILE_CFLAGS SNDFILE_LIBS LIBSAMPLERATE_CFLAGS LIBSAMPLERATE_LIBS JACK_CFLAGS JACK_LIBS PULSE_CFLAGS PULSE_LIBS ESOUND_CFLAGS ESOUND_LIBS GTHREAD_CFLAGS GTHREAD_LIBS' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures this package to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/PACKAGE] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] --target=TARGET configure for building compilers for TARGET [HOST] _ACEOF fi if test -n "$ac_init_help"; then cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --enable-maintainer-mode enable make rules and dependencies not useful (and sometimes confusing) to the casual installer --enable-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build --disable-rpath do not hardcode runtime library paths --disable-nls do not use Native Language Support --enable-werror Treat warnings as errors during compilation --disable-sdltest Do not try to compile and run a test SDL program --disable-gtk2 Don't use GTK+ 2, use 1.2 instead --disable-gtktest do not try to compile and run a test GTK+ program --disable-gtktest Do not try to compile and run a test GTK program --disable-largefile omit support for large files --disable-ladspa Don't include any Ladspa support Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-gnu-ld assume the C compiler uses GNU ld default=no --with-libiconv-prefix=DIR search for libiconv in DIR/include and DIR/lib --without-libiconv-prefix don't search for libiconv in includedir and libdir --with-libintl-prefix=DIR search for libintl in DIR/include and DIR/lib --without-libintl-prefix don't search for libintl in includedir and libdir --with-double-samples Use double precision floating point numbers for sound processing (slows down program but may increase quality for 24/32-bit samplerates). --without-check-casts Do not type-check GTK casts. --with-default-driver=driver Choose default sound driver (one of oss,alsa,pulse, jack,sun,pa,sdl,esound,arts,auto; default: auto) --with-default-ladspa-path=path Path to use if LADSPA_PATH variable is not set (default: "/usr/lib/ladspa:/usr/local/lib/ladspa") --with-default-mixerapp=appname Default command for "launch mixer" button (default: "xmixer") --with-build-date=str Fixed string to use instead of __DATE__ --with-build-time=str Fixed string to use instead of __TIME__ --with-libsndfile=prefix Prefix where libsndfile is installed (optional) --without-libsndfile Don't use libsndfile library --with-libsamplerate=prefix Prefix where libsamplerate is installed (optional) --without-libsamplerate Don't use libsamplerate library --without-portaudio Don't use portaudio library --without-sdl Don't use SDL library --with-sdl-prefix=PFX Prefix where SDL is installed (optional) --with-sdl-exec-prefix=PFX Exec prefix where SDL is installed (optional) --without-alsalib Don't compile ALSA-lib driver --without-oss Don't compile OSS driver --without-jack Don't compile JACK driver --without-pulse Don't compile PulseAudio driver --without-esound Don't compile EsounD driver --without-sun Don't compile Sun audio driver --without-arts Don't compile aRts driver --with-gtk-prefix=PFX Prefix where GTK is installed (optional) --with-gtk-exec-prefix=PFX Exec prefix where GTK is installed (optional) Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory PKG_CONFIG path to pkg-config utility PKG_CONFIG_PATH directories to add to pkg-config's search path PKG_CONFIG_LIBDIR path overriding pkg-config's built-in search path CPP C preprocessor SNDFILE_CFLAGS C compiler flags for SNDFILE, overriding pkg-config SNDFILE_LIBS linker flags for SNDFILE, overriding pkg-config LIBSAMPLERATE_CFLAGS C compiler flags for LIBSAMPLERATE, overriding pkg-config LIBSAMPLERATE_LIBS linker flags for LIBSAMPLERATE, overriding pkg-config JACK_CFLAGS C compiler flags for JACK, overriding pkg-config JACK_LIBS linker flags for JACK, overriding pkg-config PULSE_CFLAGS C compiler flags for PULSE, overriding pkg-config PULSE_LIBS linker flags for PULSE, overriding pkg-config ESOUND_CFLAGS C compiler flags for ESOUND, overriding pkg-config ESOUND_LIBS linker flags for ESOUND, overriding pkg-config GTHREAD_CFLAGS C compiler flags for GTHREAD, overriding pkg-config GTHREAD_LIBS linker flags for GTHREAD, overriding pkg-config Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF configure generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_check_type LINENO TYPE VAR INCLUDES # ------------------------------------------- # Tests whether TYPE exists after having included INCLUDES, setting cache # variable VAR accordingly. ac_fn_c_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else eval "$3=yes" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_type # ac_fn_c_compute_int LINENO EXPR VAR INCLUDES # -------------------------------------------- # Tries to find the compile-time value of EXPR in a program that includes # INCLUDES, setting VAR accordingly. Returns whether the value could be # computed ac_fn_c_compute_int () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if test "$cross_compiling" = yes; then # Depending upon the size, compute the lo and hi bounds. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) >= 0)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_lo=0 ac_mid=0 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=$ac_mid; break else as_fn_arith $ac_mid + 1 && ac_lo=$as_val if test $ac_lo -le $ac_mid; then ac_lo= ac_hi= break fi as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) < 0)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=-1 ac_mid=-1 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) >= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_lo=$ac_mid; break else as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val if test $ac_mid -le $ac_hi; then ac_lo= ac_hi= break fi as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else ac_lo= ac_hi= fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext # Binary search between lo and hi bounds. while test "x$ac_lo" != "x$ac_hi"; do as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=$ac_mid else as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done case $ac_lo in #(( ?*) eval "$3=\$ac_lo"; ac_retval=0 ;; '') ac_retval=1 ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 static long int longval () { return $2; } static unsigned long int ulongval () { return $2; } #include #include int main () { FILE *f = fopen ("conftest.val", "w"); if (! f) return 1; if (($2) < 0) { long int i = longval (); if (i != ($2)) return 1; fprintf (f, "%ld", i); } else { unsigned long int i = ulongval (); if (i != ($2)) return 1; fprintf (f, "%lu", i); } /* Do not output a trailing newline, as this causes \r\n confusion on some platforms. */ return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : echo >>conftest.val; read $3 &5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by $as_me, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_config_headers="$ac_config_headers config.h" ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5 $as_echo_n "checking target system type... " >&6; } if ${ac_cv_target+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$target_alias" = x; then ac_cv_target=$ac_cv_host else ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5 $as_echo "$ac_cv_target" >&6; } case $ac_cv_target in *-*-*) ;; *) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;; esac target=$ac_cv_target ac_save_IFS=$IFS; IFS='-' set x $ac_cv_target shift target_cpu=$1 target_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: target_os=$* IFS=$ac_save_IFS case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac # The aliases save the names the user supplied, while $host etc. # will get canonicalized. test -n "$target_alias" && test "$program_prefix$program_suffix$program_transform_name" = \ NONENONEs,x,x, && program_prefix=${target_alias}- MHW_VERSION=1.4.24 am__api_version='1.15' # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE=mhWaveEdit VERSION=$MHW_VERSION cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target (and possibly the TAP driver). The # system "awk" is bad on some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar pax cpio none' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 fi fi # This is disabled in releases because timestamps can not be preserved through # the current Github-based release flow. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 $as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } # Check whether --enable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then : enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval else USE_MAINTAINER_MODE=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 $as_echo "$USE_MAINTAINER_MODE" >&6; } if test $USE_MAINTAINER_MODE = yes; then MAINTAINER_MODE_TRUE= MAINTAINER_MODE_FALSE='#' else MAINTAINER_MODE_TRUE='#' MAINTAINER_MODE_FALSE= fi MAINT=$MAINTAINER_MODE_TRUE MKINSTALLDIRS= if test -n "$ac_aux_dir"; then MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" fi if test -z "$MKINSTALLDIRS"; then MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs" fi # Extract the first word of "msgfmt", so it can be a program name with args. set dummy msgfmt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_MSGFMT+:} false; then : $as_echo_n "(cached) " >&6 else case "$MSGFMT" in /*) ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path. ;; *) IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then if $ac_dir/$ac_word --statistics /dev/null >/dev/null 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); then ac_cv_path_MSGFMT="$ac_dir/$ac_word" break fi fi done IFS="$ac_save_ifs" test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT=":" ;; esac fi MSGFMT="$ac_cv_path_MSGFMT" if test "$MSGFMT" != ":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5 $as_echo "$MSGFMT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "gmsgfmt", so it can be a program name with args. set dummy gmsgfmt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_GMSGFMT+:} false; then : $as_echo_n "(cached) " >&6 else case $GMSGFMT in [\\/]* | ?:[\\/]*) ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_GMSGFMT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT" ;; esac fi GMSGFMT=$ac_cv_path_GMSGFMT if test -n "$GMSGFMT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GMSGFMT" >&5 $as_echo "$GMSGFMT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "xgettext", so it can be a program name with args. set dummy xgettext; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_XGETTEXT+:} false; then : $as_echo_n "(cached) " >&6 else case "$XGETTEXT" in /*) ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path. ;; *) IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then if $ac_dir/$ac_word --omit-header --copyright-holder= /dev/null >/dev/null 2>&1 && (if $ac_dir/$ac_word --omit-header --copyright-holder= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then ac_cv_path_XGETTEXT="$ac_dir/$ac_word" break fi fi done IFS="$ac_save_ifs" test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":" ;; esac fi XGETTEXT="$ac_cv_path_XGETTEXT" if test "$XGETTEXT" != ":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XGETTEXT" >&5 $as_echo "$XGETTEXT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f messages.po # Extract the first word of "msgmerge", so it can be a program name with args. set dummy msgmerge; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_MSGMERGE+:} false; then : $as_echo_n "(cached) " >&6 else case "$MSGMERGE" in /*) ac_cv_path_MSGMERGE="$MSGMERGE" # Let the user override the test with a path. ;; *) IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then if $ac_dir/$ac_word --update -q /dev/null /dev/null >/dev/null 2>&1; then ac_cv_path_MSGMERGE="$ac_dir/$ac_word" break fi fi done IFS="$ac_save_ifs" test -z "$ac_cv_path_MSGMERGE" && ac_cv_path_MSGMERGE=":" ;; esac fi MSGMERGE="$ac_cv_path_MSGMERGE" if test "$MSGMERGE" != ":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGMERGE" >&5 $as_echo "$MSGMERGE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$GMSGFMT" != ":"; then if $GMSGFMT --statistics /dev/null >/dev/null 2>&1 && (if $GMSGFMT --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then : ; else GMSGFMT=`echo "$GMSGFMT" | sed -e 's,^.*/,,'` { $as_echo "$as_me:${as_lineno-$LINENO}: result: found $GMSGFMT program is not GNU msgfmt; ignore it" >&5 $as_echo "found $GMSGFMT program is not GNU msgfmt; ignore it" >&6; } GMSGFMT=":" fi fi if test "$XGETTEXT" != ":"; then if $XGETTEXT --omit-header --copyright-holder= /dev/null >/dev/null 2>&1 && (if $XGETTEXT --omit-header --copyright-holder= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then : ; else { $as_echo "$as_me:${as_lineno-$LINENO}: result: found xgettext program is not GNU xgettext; ignore it" >&5 $as_echo "found xgettext program is not GNU xgettext; ignore it" >&6; } XGETTEXT=":" fi rm -f messages.po fi ac_config_commands="$ac_config_commands default-1" 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" DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 $as_echo_n "checking whether $CC understands -c and -o together... " >&6; } if ${am_cv_prog_cc_c_o+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 $as_echo "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by GCC" >&5 $as_echo_n "checking for ld used by GCC... " >&6; } 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${acl_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else 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. if "$acl_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then test "$with_gnu_ld" != no && break else test "$with_gnu_ld" != yes && break fi fi done IFS="$ac_save_ifs" else acl_cv_path_LD="$LD" # Let the user override the test with a path. fi fi LD="$acl_cv_path_LD" if test -n "$LD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${acl_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU ld's only accept -v. if $LD -v 2>&1 &5; then acl_cv_prog_gnu_ld=yes else acl_cv_prog_gnu_ld=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acl_cv_prog_gnu_ld" >&5 $as_echo "$acl_cv_prog_gnu_ld" >&6; } with_gnu_ld=$acl_cv_prog_gnu_ld { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shared library run path origin" >&5 $as_echo_n "checking for shared library run path origin... " >&6; } if ${acl_cv_rpath+:} false; then : $as_echo_n "(cached) " >&6 else 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 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acl_cv_rpath" >&5 $as_echo "$acl_cv_rpath" >&6; } wl="$acl_cv_wl" libext="$acl_cv_libext" shlibext="$acl_cv_shlibext" hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" hardcode_direct="$acl_cv_hardcode_direct" hardcode_minus_L="$acl_cv_hardcode_minus_L" sys_lib_search_path_spec="$acl_cv_sys_lib_search_path_spec" sys_lib_dlsearch_path_spec="$acl_cv_sys_lib_dlsearch_path_spec" # Check whether --enable-rpath was given. if test "${enable_rpath+set}" = set; then : enableval=$enable_rpath; : else enable_rpath=yes fi use_additional=yes acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" # Check whether --with-libiconv-prefix was given. if test "${with_libiconv_prefix+set}" = set; then : withval=$with_libiconv_prefix; if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" else additional_includedir="$withval/include" additional_libdir="$withval/lib" fi fi fi LIBICONV= LTLIBICONV= INCICONV= rpathdirs= ltrpathdirs= names_already_handled= names_next_round='iconv ' 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" 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" || LIBICONV="${LIBICONV}${LIBICONV:+ }$value" eval value=\"\$LTLIB$uppername\" test -z "$value" || LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$value" else : fi else found_dir= found_la= found_so= found_a= if test $use_additional = yes; then if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then found_dir="$additional_libdir" found_so="$additional_libdir/lib$name.$shlibext" if test -f "$additional_libdir/lib$name.la"; then found_la="$additional_libdir/lib$name.la" fi else if test -f "$additional_libdir/lib$name.$libext"; then found_dir="$additional_libdir" found_a="$additional_libdir/lib$name.$libext" if test -f "$additional_libdir/lib$name.la"; then found_la="$additional_libdir/lib$name.la" fi fi fi fi if test "X$found_dir" = "X"; then for x in $LDFLAGS $LTLIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then found_dir="$dir" found_so="$dir/lib$name.$shlibext" if test -f "$dir/lib$name.la"; then found_la="$dir/lib$name.la" fi else if test -f "$dir/lib$name.$libext"; then found_dir="$dir" found_a="$dir/lib$name.$libext" if test -f "$dir/lib$name.la"; then found_la="$dir/lib$name.la" fi fi fi ;; esac if test "X$found_dir" != "X"; then break fi done fi if test "X$found_dir" != "X"; then LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/lib"; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" else 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 if test "$hardcode_direct" = yes; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" else if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" 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 haveit= for x in $LDFLAGS $LIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir" fi if test "$hardcode_minus_L" != no; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" else LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_a" else LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir -l$name" fi fi additional_includedir= case "$found_dir" in */lib | */lib/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'` additional_includedir="$basedir/include" ;; esac if test "X$additional_includedir" != "X"; then 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*) haveit=yes;; esac fi fi if test -z "$haveit"; then for x in $CPPFLAGS $INCICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" 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 INCICONV="${INCICONV}${INCICONV:+ }-I$additional_includedir" fi fi fi fi fi if test -n "$found_la"; then save_libdir="$libdir" case "$found_la" in */* | *\\*) . "$found_la" ;; *) . "./$found_la" ;; esac libdir="$save_libdir" for dep in $dependency_libs; do case "$dep" in -L*) additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` if test "X$additional_libdir" != "X/usr/lib"; then haveit= if test "X$additional_libdir" = "X/usr/local/lib"; then if test -n "$GCC"; then case $host_os in linux*) haveit=yes;; esac fi fi if test -z "$haveit"; then haveit= for x in $LDFLAGS $LIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" 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 LIBICONV="${LIBICONV}${LIBICONV:+ }-L$additional_libdir" fi fi haveit= for x in $LDFLAGS $LTLIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" 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 LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$additional_libdir" fi fi fi fi ;; -R*) dir=`echo "X$dep" | sed -e 's/^X-R//'` if test "$enable_rpath" != no; then 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 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*) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` ;; *.la) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) LIBICONV="${LIBICONV}${LIBICONV:+ }$dep" LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$dep" ;; esac done fi else LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-l$name" fi fi fi done done if test "X$rpathdirs" != "X"; then if test -n "$hardcode_libdir_separator"; then alldirs= for found_dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir" done acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBICONV="${LIBICONV}${LIBICONV:+ }$flag" else for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBICONV="${LIBICONV}${LIBICONV:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then for found_dir in $ltrpathdirs; do LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-R$found_dir" done fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether NLS is requested" >&5 $as_echo_n "checking whether NLS is requested... " >&6; } # Check whether --enable-nls was given. if test "${enable_nls+set}" = set; then : enableval=$enable_nls; USE_NLS=$enableval else USE_NLS=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5 $as_echo "$USE_NLS" >&6; } LIBINTL= LTLIBINTL= POSUB= if test "$USE_NLS" = "yes"; then gt_use_preinstalled_gnugettext=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU gettext in libc" >&5 $as_echo_n "checking for GNU gettext in libc... " >&6; } if ${gt_cv_func_gnugettext1_libc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include extern int _nl_msg_cat_cntr; extern int *_nl_domain_bindings; int main () { bindtextdomain ("", ""); return (int) gettext ("") + _nl_msg_cat_cntr + *_nl_domain_bindings ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gt_cv_func_gnugettext1_libc=yes else gt_cv_func_gnugettext1_libc=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_gnugettext1_libc" >&5 $as_echo "$gt_cv_func_gnugettext1_libc" >&6; } if test "$gt_cv_func_gnugettext1_libc" != "yes"; then am_save_CPPFLAGS="$CPPFLAGS" for element in $INCICONV; do haveit= for x in $CPPFLAGS; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X$element"; then haveit=yes break fi done if test -z "$haveit"; then CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv" >&5 $as_echo_n "checking for iconv... " >&6; } if ${am_cv_func_iconv+:} false; then : $as_echo_n "(cached) " >&6 else am_cv_func_iconv="no, consider installing GNU libiconv" am_cv_lib_iconv=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : am_cv_func_iconv=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$am_cv_func_iconv" != yes; then am_save_LIBS="$LIBS" LIBS="$LIBS $LIBICONV" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : am_cv_lib_iconv=yes am_cv_func_iconv=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$am_save_LIBS" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv" >&5 $as_echo "$am_cv_func_iconv" >&6; } if test "$am_cv_func_iconv" = yes; then $as_echo "#define HAVE_ICONV 1" >>confdefs.h fi if test "$am_cv_lib_iconv" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libiconv" >&5 $as_echo_n "checking how to link with libiconv... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBICONV" >&5 $as_echo "$LIBICONV" >&6; } else CPPFLAGS="$am_save_CPPFLAGS" LIBICONV= LTLIBICONV= fi use_additional=yes acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" # Check whether --with-libintl-prefix was given. if test "${with_libintl_prefix+set}" = set; then : withval=$with_libintl_prefix; if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" else additional_includedir="$withval/include" additional_libdir="$withval/lib" fi fi fi LIBINTL= LTLIBINTL= INCINTL= rpathdirs= ltrpathdirs= names_already_handled= names_next_round='intl ' 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" 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" || LIBINTL="${LIBINTL}${LIBINTL:+ }$value" eval value=\"\$LTLIB$uppername\" test -z "$value" || LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$value" else : fi else found_dir= found_la= found_so= found_a= if test $use_additional = yes; then if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then found_dir="$additional_libdir" found_so="$additional_libdir/lib$name.$shlibext" if test -f "$additional_libdir/lib$name.la"; then found_la="$additional_libdir/lib$name.la" fi else if test -f "$additional_libdir/lib$name.$libext"; then found_dir="$additional_libdir" found_a="$additional_libdir/lib$name.$libext" if test -f "$additional_libdir/lib$name.la"; then found_la="$additional_libdir/lib$name.la" fi fi fi fi if test "X$found_dir" = "X"; then for x in $LDFLAGS $LTLIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then found_dir="$dir" found_so="$dir/lib$name.$shlibext" if test -f "$dir/lib$name.la"; then found_la="$dir/lib$name.la" fi else if test -f "$dir/lib$name.$libext"; then found_dir="$dir" found_a="$dir/lib$name.$libext" if test -f "$dir/lib$name.la"; then found_la="$dir/lib$name.la" fi fi fi ;; esac if test "X$found_dir" != "X"; then break fi done fi if test "X$found_dir" != "X"; then LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/lib"; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" else 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 if test "$hardcode_direct" = yes; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" else if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" 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 haveit= for x in $LDFLAGS $LIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir" fi if test "$hardcode_minus_L" != no; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" else LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_a" else LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir -l$name" fi fi additional_includedir= case "$found_dir" in */lib | */lib/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'` additional_includedir="$basedir/include" ;; esac if test "X$additional_includedir" != "X"; then 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*) haveit=yes;; esac fi fi if test -z "$haveit"; then for x in $CPPFLAGS $INCINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" 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 INCINTL="${INCINTL}${INCINTL:+ }-I$additional_includedir" fi fi fi fi fi if test -n "$found_la"; then save_libdir="$libdir" case "$found_la" in */* | *\\*) . "$found_la" ;; *) . "./$found_la" ;; esac libdir="$save_libdir" for dep in $dependency_libs; do case "$dep" in -L*) additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` if test "X$additional_libdir" != "X/usr/lib"; then haveit= if test "X$additional_libdir" = "X/usr/local/lib"; then if test -n "$GCC"; then case $host_os in linux*) haveit=yes;; esac fi fi if test -z "$haveit"; then haveit= for x in $LDFLAGS $LIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" 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 LIBINTL="${LIBINTL}${LIBINTL:+ }-L$additional_libdir" fi fi haveit= for x in $LDFLAGS $LTLIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" 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 LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$additional_libdir" fi fi fi fi ;; -R*) dir=`echo "X$dep" | sed -e 's/^X-R//'` if test "$enable_rpath" != no; then 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 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*) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` ;; *.la) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) LIBINTL="${LIBINTL}${LIBINTL:+ }$dep" LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$dep" ;; esac done fi else LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name" LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-l$name" fi fi fi done done if test "X$rpathdirs" != "X"; then if test -n "$hardcode_libdir_separator"; then alldirs= for found_dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir" done acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBINTL="${LIBINTL}${LIBINTL:+ }$flag" else for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBINTL="${LIBINTL}${LIBINTL:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then for found_dir in $ltrpathdirs; do LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-R$found_dir" done fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU gettext in libintl" >&5 $as_echo_n "checking for GNU gettext in libintl... " >&6; } if ${gt_cv_func_gnugettext1_libintl+:} false; then : $as_echo_n "(cached) " >&6 else gt_save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $INCINTL" gt_save_LIBS="$LIBS" LIBS="$LIBS $LIBINTL" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (); int main () { bindtextdomain ("", ""); return (int) gettext ("") + _nl_msg_cat_cntr + *_nl_expand_alias (0) ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gt_cv_func_gnugettext1_libintl=yes else gt_cv_func_gnugettext1_libintl=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$gt_cv_func_gnugettext1_libintl" != yes && test -n "$LIBICONV"; then LIBS="$LIBS $LIBICONV" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (); int main () { bindtextdomain ("", ""); return (int) gettext ("") + _nl_msg_cat_cntr + *_nl_expand_alias (0) ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : LIBINTL="$LIBINTL $LIBICONV" LTLIBINTL="$LTLIBINTL $LTLIBICONV" gt_cv_func_gnugettext1_libintl=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi CPPFLAGS="$gt_save_CPPFLAGS" LIBS="$gt_save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_gnugettext1_libintl" >&5 $as_echo "$gt_cv_func_gnugettext1_libintl" >&6; } fi if test "$gt_cv_func_gnugettext1_libc" = "yes" \ || { test "$gt_cv_func_gnugettext1_libintl" = "yes" \ && test "$PACKAGE" != gettext; }; then gt_use_preinstalled_gnugettext=yes else LIBINTL= LTLIBINTL= INCINTL= fi if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then $as_echo "#define ENABLE_NLS 1" >>confdefs.h else USE_NLS=no fi fi if test "$USE_NLS" = "yes"; then if test "$gt_use_preinstalled_gnugettext" = "yes"; then if test "$gt_cv_func_gnugettext1_libintl" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libintl" >&5 $as_echo_n "checking how to link with libintl... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBINTL" >&5 $as_echo "$LIBINTL" >&6; } for element in $INCINTL; do haveit= for x in $CPPFLAGS; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X$element"; then haveit=yes break fi done if test -z "$haveit"; then CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" fi done fi $as_echo "#define HAVE_GETTEXT 1" >>confdefs.h $as_echo "#define HAVE_DCGETTEXT 1" >>confdefs.h fi POSUB=po fi INTLLIBS="$LIBINTL" if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 $as_echo "$ac_pt_PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG fi else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 $as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } PKG_CONFIG="" fi fi # Check whether --with-double-samples was given. if test "${with_double_samples+set}" = set; then : withval=$with_double_samples; $as_echo "#define USE_DOUBLE_SAMPLES /**/" >>confdefs.h MHW_DOUBLE="yes" fi # Check whether --with-check-casts was given. if test "${with_check_casts+set}" = set; then : withval=$with_check_casts; if test "x$withval" = "xno" ; then $as_echo "#define GTK_NO_CHECK_CASTS /**/" >>confdefs.h fi fi # Check whether --enable-werror was given. if test "${enable_werror+set}" = set; then : enableval=$enable_werror; if test "x$enableval" = "xyes" ; then AM_CFLAGS="$AM_CFLAGS -Werror" fi fi DEFAULT_DRIVER=auto # Check whether --with-default-driver was given. if test "${with_default_driver+set}" = set; then : withval=$with_default_driver; DEFAULT_DRIVER=$withval fi cat >>confdefs.h <<_ACEOF #define DEFAULT_DRIVER "${DEFAULT_DRIVER}" _ACEOF DEFAULT_LADSPA_PATH="/usr/lib/ladspa:/usr/local/lib/ladspa" # Check whether --with-default-ladspa-path was given. if test "${with_default_ladspa_path+set}" = set; then : withval=$with_default_ladspa_path; DEFAULT_LADSPA_PATH=$withval fi cat >>confdefs.h <<_ACEOF #define DEFAULT_LADSPA_PATH "${DEFAULT_LADSPA_PATH}" _ACEOF DEFAULT_MIXERAPP=xmixer # Check whether --with-default-mixerapp was given. if test "${with_default_mixerapp+set}" = set; then : withval=$with_default_mixerapp; DEFAULT_MIXERAPP=$withval fi cat >>confdefs.h <<_ACEOF #define DEFAULT_MIXERAPP "${DEFAULT_MIXERAPP}" _ACEOF FIXED_DATE_STR="__DATE__ (actual compile date)" FIXED_TIME_STR="__TIME__ (actual compile time)" # Check whether --with-build-date was given. if test "${with_build_date+set}" = set; then : withval=$with_build_date; if test "x$withval" != "xno" ; then cat >>confdefs.h <<_ACEOF #define FIXED_DATE "${withval}" _ACEOF FIXED_DATE_STR=${withval} fi fi # Check whether --with-build-time was given. if test "${with_build_time+set}" = set; then : withval=$with_build_time; if test "x$withval" != "xno" ; then cat >>confdefs.h <<_ACEOF #define FIXED_TIME "${withval}" _ACEOF FIXED_TIME_STR=${withval} fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 $as_echo_n "checking whether $CC understands -c and -o together... " >&6; } if ${am_cv_prog_cc_c_o+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 $as_echo "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" if test $ac_cv_c_compiler_gnu = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC needs -traditional" >&5 $as_echo_n "checking whether $CC needs -traditional... " >&6; } if ${ac_cv_prog_gcc_traditional+:} false; then : $as_echo_n "(cached) " >&6 else ac_pattern="Autoconf.*'x'" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include Autoconf TIOCGETP _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "$ac_pattern" >/dev/null 2>&1; then : ac_cv_prog_gcc_traditional=yes else ac_cv_prog_gcc_traditional=no fi rm -f conftest* if test $ac_cv_prog_gcc_traditional = no; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include Autoconf TCGETA _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "$ac_pattern" >/dev/null 2>&1; then : ac_cv_prog_gcc_traditional=yes fi rm -f conftest* fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_gcc_traditional" >&5 $as_echo "$ac_cv_prog_gcc_traditional" >&6; } if test $ac_cv_prog_gcc_traditional = yes; then CC="$CC -traditional" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -libs" >&5 $as_echo_n "checking for main in -libs... " >&6; } if ${ac_cv_lib_ibs_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-libs $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ibs_main=yes else ac_cv_lib_ibs_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ibs_main" >&5 $as_echo "$ac_cv_lib_ibs_main" >&6; } if test "x$ac_cv_lib_ibs_main" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBIBS 1 _ACEOF LIBS="-libs $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for round in -lm" >&5 $as_echo_n "checking for round in -lm... " >&6; } if ${ac_cv_lib_m_round+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char round (); int main () { return round (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_m_round=yes else ac_cv_lib_m_round=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_round" >&5 $as_echo "$ac_cv_lib_m_round" >&6; } if test "x$ac_cv_lib_m_round" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBM 1 _ACEOF LIBS="-lm $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_create in -lpthread" >&5 $as_echo_n "checking for pthread_create in -lpthread... " >&6; } if ${ac_cv_lib_pthread_pthread_create+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpthread $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_create (); int main () { return pthread_create (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_pthread_pthread_create=yes else ac_cv_lib_pthread_pthread_create=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_create" >&5 $as_echo "$ac_cv_lib_pthread_pthread_create" >&6; } if test "x$ac_cv_lib_pthread_pthread_create" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBPTHREAD 1 _ACEOF LIBS="-lpthread $LIBS" fi HAVE_SNDFILE=yes SKIP_SNDFILE_CHECK=no SNDFILE_LIBS="" SNDFILE_CFLAGS="" # Check whether --with-libsndfile was given. if test "${with_libsndfile+set}" = set; then : withval=$with_libsndfile; if test "x$withval" = "xno" ; then HAVE_SNDFILE=no else SNDFILE_LIBS="-L$withval/lib -lsndfile -lm" SNDFILE_CFLAGS="-I$withval/include" SKIP_SNDFILE_CHECK=yes fi fi if test "x$HAVE_SNDFILE" = "xyes" -a "x$SKIP_SNDFILE_CHECK" = "xno"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SNDFILE" >&5 $as_echo_n "checking for SNDFILE... " >&6; } if test -n "$SNDFILE_CFLAGS"; then pkg_cv_SNDFILE_CFLAGS="$SNDFILE_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"sndfile\""; } >&5 ($PKG_CONFIG --exists --print-errors "sndfile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_SNDFILE_CFLAGS=`$PKG_CONFIG --cflags "sndfile" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$SNDFILE_LIBS"; then pkg_cv_SNDFILE_LIBS="$SNDFILE_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"sndfile\""; } >&5 ($PKG_CONFIG --exists --print-errors "sndfile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_SNDFILE_LIBS=`$PKG_CONFIG --libs "sndfile" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then SNDFILE_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "sndfile" 2>&1` else SNDFILE_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "sndfile" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$SNDFILE_PKG_ERRORS" >&5 HAVE_SNDFILE=no elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } HAVE_SNDFILE=no else SNDFILE_CFLAGS=$pkg_cv_SNDFILE_CFLAGS SNDFILE_LIBS=$pkg_cv_SNDFILE_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi fi if test "x$HAVE_SNDFILE" = "xyes" ; then $as_echo "#define HAVE_LIBSNDFILE /**/" >>confdefs.h fi HAVE_LIBSAMPLERATE=yes SKIP_LIBSAMPLERATE_CHECK=no LIBSAMPLERATE_LIBS="" LIBSAMPLERATE_CFLAGS="" # Check whether --with-libsamplerate was given. if test "${with_libsamplerate+set}" = set; then : withval=$with_libsamplerate; if test "x$withval" = "xno" ; then HAVE_LIBSAMPLERATE=no else LIBSAMPLERATE_LIBS="-L$withval/lib -lsamplerate" LIBSAMPLERATE_CFLAGS="-I$withval/include" SKIP_LIBSAMPLERATE_CHECK=yes fi fi if test "x$HAVE_LIBSAMPLERATE" = "xyes" -a "x$SKIP_LIBSAMPLERATE_CHECK" = "xno"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBSAMPLERATE" >&5 $as_echo_n "checking for LIBSAMPLERATE... " >&6; } if test -n "$LIBSAMPLERATE_CFLAGS"; then pkg_cv_LIBSAMPLERATE_CFLAGS="$LIBSAMPLERATE_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"samplerate\""; } >&5 ($PKG_CONFIG --exists --print-errors "samplerate") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBSAMPLERATE_CFLAGS=`$PKG_CONFIG --cflags "samplerate" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$LIBSAMPLERATE_LIBS"; then pkg_cv_LIBSAMPLERATE_LIBS="$LIBSAMPLERATE_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"samplerate\""; } >&5 ($PKG_CONFIG --exists --print-errors "samplerate") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBSAMPLERATE_LIBS=`$PKG_CONFIG --libs "samplerate" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then LIBSAMPLERATE_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "samplerate" 2>&1` else LIBSAMPLERATE_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "samplerate" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$LIBSAMPLERATE_PKG_ERRORS" >&5 HAVE_LIBSAMPLERATE=no elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } HAVE_LIBSAMPLERATE=no else LIBSAMPLERATE_CFLAGS=$pkg_cv_LIBSAMPLERATE_CFLAGS LIBSAMPLERATE_LIBS=$pkg_cv_LIBSAMPLERATE_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi fi if test "x$HAVE_LIBSAMPLERATE" = "xyes" ; then $as_echo "#define HAVE_LIBSAMPLERATE /**/" >>confdefs.h fi PORTAUDIO_LIBS="" MHW_HAVE_PORTAUDIO=yes # Check whether --with-portaudio was given. if test "${with_portaudio+set}" = set; then : withval=$with_portaudio; if test "x$withval" = "xno"; then MHW_HAVE_PORTAUDIO=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done ac_fn_c_check_header_mongrel "$LINENO" "portaudio.h" "ac_cv_header_portaudio_h" "$ac_includes_default" if test "x$ac_cv_header_portaudio_h" = xyes; then : mhw_found_header=yes else mhw_found_header=no fi if test "x$mhw_found_header" = "xno"; then MHW_HAVE_PORTAUDIO=no fi if test "x$MHW_HAVE_PORTAUDIO" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Pa_Initialize in -lportaudio" >&5 $as_echo_n "checking for Pa_Initialize in -lportaudio... " >&6; } if ${ac_cv_lib_portaudio_Pa_Initialize+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lportaudio $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char Pa_Initialize (); int main () { return Pa_Initialize (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_portaudio_Pa_Initialize=yes else ac_cv_lib_portaudio_Pa_Initialize=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_portaudio_Pa_Initialize" >&5 $as_echo "$ac_cv_lib_portaudio_Pa_Initialize" >&6; } if test "x$ac_cv_lib_portaudio_Pa_Initialize" = xyes; then : MHW_HAVE_PORTAUDIO=yes else MHW_HAVE_PORTAUDIO=no fi fi if test "x$MHW_HAVE_PORTAUDIO" = "xyes"; then ac_fn_c_check_type "$LINENO" "PaTimestamp" "ac_cv_type_PaTimestamp" "#include " if test "x$ac_cv_type_PaTimestamp" = xyes; then : else MHW_HAVE_PORTAUDIO=no fi fi if test "x$MHW_HAVE_PORTAUDIO" = "xyes"; then $as_echo "#define HAVE_PORTAUDIO /**/" >>confdefs.h PORTAUDIO_LIBS="-lportaudio $PORTAUDIO_LIBS" fi SKIP_SDL_TEST=no MHW_HAVE_SDL=no # Check whether --with-sdl was given. if test "${with_sdl+set}" = set; then : withval=$with_sdl; if test "x$withval" = "xno" ; then SKIP_SDL_TEST=yes fi fi if test "x$SKIP_SDL_TEST" = "xno"; then # Check whether --with-sdl-prefix was given. if test "${with_sdl_prefix+set}" = set; then : withval=$with_sdl_prefix; sdl_prefix="$withval" else sdl_prefix="" fi # Check whether --with-sdl-exec-prefix was given. if test "${with_sdl_exec_prefix+set}" = set; then : withval=$with_sdl_exec_prefix; sdl_exec_prefix="$withval" else sdl_exec_prefix="" fi # Check whether --enable-sdltest was given. if test "${enable_sdltest+set}" = set; then : enableval=$enable_sdltest; else enable_sdltest=yes fi if test x$sdl_exec_prefix != x ; then sdl_config_args="$sdl_config_args --exec-prefix=$sdl_exec_prefix" if test x${SDL_CONFIG+set} != xset ; then SDL_CONFIG=$sdl_exec_prefix/bin/sdl-config fi fi if test x$sdl_prefix != x ; then sdl_config_args="$sdl_config_args --prefix=$sdl_prefix" if test x${SDL_CONFIG+set} != xset ; then SDL_CONFIG=$sdl_prefix/bin/sdl-config fi fi as_save_PATH="$PATH" if test "x$prefix" != xNONE; then PATH="$prefix/bin:$prefix/usr/bin:$PATH" fi # Extract the first word of "sdl-config", so it can be a program name with args. set dummy sdl-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_SDL_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $SDL_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_SDL_CONFIG="$SDL_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_SDL_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_SDL_CONFIG" && ac_cv_path_SDL_CONFIG="no" ;; esac fi SDL_CONFIG=$ac_cv_path_SDL_CONFIG if test -n "$SDL_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SDL_CONFIG" >&5 $as_echo "$SDL_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi PATH="$as_save_PATH" min_sdl_version=1.2.3 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SDL - version >= $min_sdl_version" >&5 $as_echo_n "checking for SDL - version >= $min_sdl_version... " >&6; } no_sdl="" if test "$SDL_CONFIG" = "no" ; then no_sdl=yes else SDL_CFLAGS=`$SDL_CONFIG $sdl_config_args --cflags` SDL_LIBS=`$SDL_CONFIG $sdl_config_args --libs` sdl_major_version=`$SDL_CONFIG $sdl_config_args --version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'` sdl_minor_version=`$SDL_CONFIG $sdl_config_args --version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'` sdl_micro_version=`$SDL_CONFIG $sdl_config_args --version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'` if test "x$enable_sdltest" = "xyes" ; then ac_save_CFLAGS="$CFLAGS" ac_save_CXXFLAGS="$CXXFLAGS" ac_save_LIBS="$LIBS" CFLAGS="$CFLAGS $SDL_CFLAGS" CXXFLAGS="$CXXFLAGS $SDL_CFLAGS" LIBS="$LIBS $SDL_LIBS" rm -f conf.sdltest if test "$cross_compiling" = yes; then : echo $ac_n "cross compiling; assumed OK... $ac_c" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include "SDL.h" char* my_strdup (char *str) { char *new_str; if (str) { new_str = (char *)malloc ((strlen (str) + 1) * sizeof(char)); strcpy (new_str, str); } else new_str = NULL; return new_str; } int main (int argc, char *argv[]) { int major, minor, micro; char *tmp_version; /* This hangs on some systems (?) system ("touch conf.sdltest"); */ { FILE *fp = fopen("conf.sdltest", "a"); if ( fp ) fclose(fp); } /* HP/UX 9 (%@#!) writes to sscanf strings */ tmp_version = my_strdup("$min_sdl_version"); if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { printf("%s, bad version string\n", "$min_sdl_version"); exit(1); } if (($sdl_major_version > major) || (($sdl_major_version == major) && ($sdl_minor_version > minor)) || (($sdl_major_version == major) && ($sdl_minor_version == minor) && ($sdl_micro_version >= micro))) { return 0; } else { printf("\n*** 'sdl-config --version' returned %d.%d.%d, but the minimum version\n", $sdl_major_version, $sdl_minor_version, $sdl_micro_version); printf("*** of SDL required is %d.%d.%d. If sdl-config is correct, then it is\n", major, minor, micro); printf("*** best to upgrade to the required version.\n"); printf("*** If sdl-config was wrong, set the environment variable SDL_CONFIG\n"); printf("*** to point to the correct copy of sdl-config, and remove the file\n"); printf("*** config.cache before re-running configure\n"); return 1; } } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else no_sdl=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi CFLAGS="$ac_save_CFLAGS" CXXFLAGS="$ac_save_CXXFLAGS" LIBS="$ac_save_LIBS" fi fi if test "x$no_sdl" = x ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define HAVE_SDL /**/" >>confdefs.h MHW_HAVE_SDL=yes else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if test "$SDL_CONFIG" = "no" ; then echo "*** The sdl-config script installed by SDL could not be found" echo "*** If SDL was installed in PREFIX, make sure PREFIX/bin is in" echo "*** your path, or set the SDL_CONFIG environment variable to the" echo "*** full path to sdl-config." else if test -f conf.sdltest ; then : else echo "*** Could not run SDL test program, checking why..." CFLAGS="$CFLAGS $SDL_CFLAGS" CXXFLAGS="$CXXFLAGS $SDL_CFLAGS" LIBS="$LIBS $SDL_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include "SDL.h" int main(int argc, char *argv[]) { return 0; } #undef main #define main K_and_R_C_main int main () { return 0; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : echo "*** The test program compiled, but did not run. This usually means" echo "*** that the run-time linker is not finding SDL or finding the wrong" echo "*** version of SDL. If it is not finding SDL, you'll need to set your" echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" echo "*** to the installed location Also, make sure you have run ldconfig if that" echo "*** is required on your system" echo "***" echo "*** If you have an old version installed, it is best to remove it, although" echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH" else echo "*** The test program failed to compile or link. See the file config.log for the" echo "*** exact error that occured. This usually means SDL was incorrectly installed" echo "*** or that you have moved SDL since it was installed. In the latter case, you" echo "*** may want to edit the sdl-config script: $SDL_CONFIG" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS="$ac_save_CFLAGS" CXXFLAGS="$ac_save_CXXFLAGS" LIBS="$ac_save_LIBS" fi fi SDL_CFLAGS="" SDL_LIBS="" : fi rm -f conf.sdltest fi ALSALIB_LIBS="" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for snd_pcm_open in -lasound" >&5 $as_echo_n "checking for snd_pcm_open in -lasound... " >&6; } if ${ac_cv_lib_asound_snd_pcm_open+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lasound $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char snd_pcm_open (); int main () { return snd_pcm_open (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_asound_snd_pcm_open=yes else ac_cv_lib_asound_snd_pcm_open=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_asound_snd_pcm_open" >&5 $as_echo "$ac_cv_lib_asound_snd_pcm_open" >&6; } if test "x$ac_cv_lib_asound_snd_pcm_open" = xyes; then : HAVE_ALSALIB=yes else HAVE_ALSALIB=no fi # Check whether --with-alsalib was given. if test "${with_alsalib+set}" = set; then : withval=$with_alsalib; if test "x$withval" = "xno" ; then HAVE_ALSALIB=no fi fi ac_fn_c_check_header_mongrel "$LINENO" "alsa/asoundlib.h" "ac_cv_header_alsa_asoundlib_h" "$ac_includes_default" if test "x$ac_cv_header_alsa_asoundlib_h" = xyes; then : mhw_found_header=yes else mhw_found_header=no fi if test "x$mhw_found_header" = "xno"; then HAVE_ALSALIB="no" fi if test "x$HAVE_ALSALIB" = "xyes"; then ALSALIB_LIBS="-lasound" $as_echo "#define HAVE_ALSALIB /**/" >>confdefs.h fi HAVE_OSS=yes # Check whether --with-oss was given. if test "${with_oss+set}" = set; then : withval=$with_oss; if test "x$withval" = "xno" ; then HAVE_OSS=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _oss_ioctl in -lossaudio" >&5 $as_echo_n "checking for _oss_ioctl in -lossaudio... " >&6; } if ${ac_cv_lib_ossaudio__oss_ioctl+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lossaudio $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char _oss_ioctl (); int main () { return _oss_ioctl (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ossaudio__oss_ioctl=yes else ac_cv_lib_ossaudio__oss_ioctl=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ossaudio__oss_ioctl" >&5 $as_echo "$ac_cv_lib_ossaudio__oss_ioctl" >&6; } if test "x$ac_cv_lib_ossaudio__oss_ioctl" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBOSSAUDIO 1 _ACEOF LIBS="-lossaudio $LIBS" fi mhw_found_one=no for ac_header in soundcard.h sys/soundcard.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF mhw_found_one=yes fi done if test "x$mhw_found_one" = "xno"; then HAVE_OSS=no fi if test "x$HAVE_OSS" = "xyes"; then $as_echo "#define HAVE_OSS /**/" >>confdefs.h fi MHW_HAVE_JACK=no MHW_SKIP_JACKTEST=no # Check whether --with-jack was given. if test "${with_jack+set}" = set; then : withval=$with_jack; if test "x$withval" = "xno" ; then MHW_SKIP_JACKTEST='yes' fi fi if test "x$MHW_SKIP_JACKTEST" = "xno" then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for JACK" >&5 $as_echo_n "checking for JACK... " >&6; } if test -n "$JACK_CFLAGS"; then pkg_cv_JACK_CFLAGS="$JACK_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"jack >= 0.98.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "jack >= 0.98.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_JACK_CFLAGS=`$PKG_CONFIG --cflags "jack >= 0.98.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$JACK_LIBS"; then pkg_cv_JACK_LIBS="$JACK_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"jack >= 0.98.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "jack >= 0.98.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_JACK_LIBS=`$PKG_CONFIG --libs "jack >= 0.98.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then JACK_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "jack >= 0.98.0" 2>&1` else JACK_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "jack >= 0.98.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$JACK_PKG_ERRORS" >&5 MHW_HAVE_JACK=no elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } MHW_HAVE_JACK=no else JACK_CFLAGS=$pkg_cv_JACK_CFLAGS JACK_LIBS=$pkg_cv_JACK_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } MHW_HAVE_JACK=yes fi fi if test "x$MHW_HAVE_JACK" = "xyes" ; then $as_echo "#define HAVE_JACK /**/" >>confdefs.h fi MHW_HAVE_PULSE=no MHW_SKIP_PULSETEST=no # Check whether --with-pulse was given. if test "${with_pulse+set}" = set; then : withval=$with_pulse; if test "x$withval" = "xno" ; then MHW_SKIP_PULSETEST='yes' fi fi if test "x$MHW_SKIP_PULSETEST" = "xno" then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PULSE" >&5 $as_echo_n "checking for PULSE... " >&6; } if test -n "$PULSE_CFLAGS"; then pkg_cv_PULSE_CFLAGS="$PULSE_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libpulse >= 0.9.10\""; } >&5 ($PKG_CONFIG --exists --print-errors "libpulse >= 0.9.10") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_PULSE_CFLAGS=`$PKG_CONFIG --cflags "libpulse >= 0.9.10" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$PULSE_LIBS"; then pkg_cv_PULSE_LIBS="$PULSE_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libpulse >= 0.9.10\""; } >&5 ($PKG_CONFIG --exists --print-errors "libpulse >= 0.9.10") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_PULSE_LIBS=`$PKG_CONFIG --libs "libpulse >= 0.9.10" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then PULSE_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libpulse >= 0.9.10" 2>&1` else PULSE_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libpulse >= 0.9.10" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$PULSE_PKG_ERRORS" >&5 MHW_HAVE_PULSE=no elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } MHW_HAVE_PULSE=no else PULSE_CFLAGS=$pkg_cv_PULSE_CFLAGS PULSE_LIBS=$pkg_cv_PULSE_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } MHW_HAVE_PULSE=yes fi fi if test "x$MHW_HAVE_PULSE" = "xyes" ; then $as_echo "#define HAVE_PULSEAUDIO /**/" >>confdefs.h fi MHW_HAVE_ESOUND=yes # Check whether --with-esound was given. if test "${with_esound+set}" = set; then : withval=$with_esound; if test "x$withval" = "xno"; then MHW_HAVE_ESOUND=no fi fi if test "x$MHW_HAVE_ESOUND" = "xyes" then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ESOUND" >&5 $as_echo_n "checking for ESOUND... " >&6; } if test -n "$ESOUND_CFLAGS"; then pkg_cv_ESOUND_CFLAGS="$ESOUND_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"esound >= 0.2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "esound >= 0.2.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_ESOUND_CFLAGS=`$PKG_CONFIG --cflags "esound >= 0.2.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$ESOUND_LIBS"; then pkg_cv_ESOUND_LIBS="$ESOUND_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"esound >= 0.2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "esound >= 0.2.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_ESOUND_LIBS=`$PKG_CONFIG --libs "esound >= 0.2.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then ESOUND_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "esound >= 0.2.0" 2>&1` else ESOUND_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "esound >= 0.2.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$ESOUND_PKG_ERRORS" >&5 MHW_HAVE_ESOUND=no elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } MHW_HAVE_ESOUND=no else ESOUND_CFLAGS=$pkg_cv_ESOUND_CFLAGS ESOUND_LIBS=$pkg_cv_ESOUND_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } MHW_HAVE_ESOUND=yes fi fi if test "x$MHW_HAVE_ESOUND" = "xyes"; then $as_echo "#define HAVE_ESOUND /**/" >>confdefs.h fi MHW_HAVE_SUNAUDIO=yes # Check whether --with-sun was given. if test "${with_sun+set}" = set; then : withval=$with_sun; if test "x$withval" = "xno" ; then MHW_HAVE_SUNAUDIO=no fi fi ac_fn_c_check_header_mongrel "$LINENO" "sys/audio.h" "ac_cv_header_sys_audio_h" "$ac_includes_default" if test "x$ac_cv_header_sys_audio_h" = xyes; then : mhw_found_one=yes else mhw_found_one=no fi if test "x$mhw_found_one" = "xno"; then MHW_HAVE_SUNAUDIO=no fi if test "x$MHW_HAVE_SUNAUDIO" = "xyes"; then $as_echo "#define HAVE_SUN /**/" >>confdefs.h fi MHW_HAVE_ARTSC=yes ARTSC_LIBS="" ARTSC_CFLAGS="" # Check whether --with-arts was given. if test "${with_arts+set}" = set; then : withval=$with_arts; if test "x$withval" = "xno"; then MHW_HAVE_ARTSC=no fi fi ARTSC_CONFIG=no if test "x$MHW_HAVE_ARTSC" = "xyes"; then # Extract the first word of "artsc-config", so it can be a program name with args. set dummy artsc-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ARTSC_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $ARTSC_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ARTSC_CONFIG="$ARTSC_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ARTSC_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_ARTSC_CONFIG" && ac_cv_path_ARTSC_CONFIG="no" ;; esac fi ARTSC_CONFIG=$ac_cv_path_ARTSC_CONFIG if test -n "$ARTSC_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ARTSC_CONFIG" >&5 $as_echo "$ARTSC_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test "x$ARTSC_CONFIG" = "xno"; then MHW_HAVE_ARTSC=no else ARTSC_CFLAGS=`$ARTSC_CONFIG --cflags` ARTSC_LIBS=`$ARTSC_CONFIG --libs` $as_echo "#define HAVE_ARTSC /**/" >>confdefs.h fi # Check whether --enable-gtk2 was given. if test "${enable_gtk2+set}" = set; then : enableval=$enable_gtk2; if test "x$enableval" = "xno" ; then DISABLE_GTK2='yes' fi else DISABLE_GTK2='no' fi FOUND_GTK="no" USES_GTK2="no" if test "x$FOUND_GTK" = "xno"; then if test "x$DISABLE_GTK2" != "xyes"; then # Check whether --enable-gtktest was given. if test "${enable_gtktest+set}" = set; then : enableval=$enable_gtktest; else enable_gtktest=yes fi pkg_config_args=gtk+-2.0 for module in . do case "$module" in gthread) pkg_config_args="$pkg_config_args gthread-2.0" ;; esac done no_gtk="" if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 $as_echo "$ac_pt_PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG fi else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.7 { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 $as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } PKG_CONFIG="" fi fi min_gtk_version=2.0.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTK+ - version >= $min_gtk_version" >&5 $as_echo_n "checking for GTK+ - version >= $min_gtk_version... " >&6; } if test x$PKG_CONFIG != xno ; then ## don't try to run the test against uninstalled libtool libs if $PKG_CONFIG --uninstalled $pkg_config_args; then echo "Will use uninstalled version of GTK+ found in PKG_CONFIG_PATH" enable_gtktest=no fi if $PKG_CONFIG --atleast-version $min_gtk_version $pkg_config_args; then : else no_gtk=yes fi fi if test x"$no_gtk" = x ; then GTK_CFLAGS=`$PKG_CONFIG $pkg_config_args --cflags` GTK_LIBS=`$PKG_CONFIG $pkg_config_args --libs` gtk_config_major_version=`$PKG_CONFIG --modversion gtk+-2.0 | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'` gtk_config_minor_version=`$PKG_CONFIG --modversion gtk+-2.0 | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'` gtk_config_micro_version=`$PKG_CONFIG --modversion gtk+-2.0 | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'` if test "x$enable_gtktest" = "xyes" ; then ac_save_CFLAGS="$CFLAGS" ac_save_LIBS="$LIBS" CFLAGS="$CFLAGS $GTK_CFLAGS" LIBS="$GTK_LIBS $LIBS" rm -f conf.gtktest if test "$cross_compiling" = yes; then : echo $ac_n "cross compiling; assumed OK... $ac_c" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { int major, minor, micro; char *tmp_version; fclose (fopen ("conf.gtktest", "w")); /* HP/UX 9 (%@#!) writes to sscanf strings */ tmp_version = g_strdup("$min_gtk_version"); if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { printf("%s, bad version string\n", "$min_gtk_version"); exit(1); } if ((gtk_major_version != $gtk_config_major_version) || (gtk_minor_version != $gtk_config_minor_version) || (gtk_micro_version != $gtk_config_micro_version)) { printf("\n*** 'pkg-config --modversion gtk+-2.0' returned %d.%d.%d, but GTK+ (%d.%d.%d)\n", $gtk_config_major_version, $gtk_config_minor_version, $gtk_config_micro_version, gtk_major_version, gtk_minor_version, gtk_micro_version); printf ("*** was found! If pkg-config was correct, then it is best\n"); printf ("*** to remove the old version of GTK+. You may also be able to fix the error\n"); printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n"); printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n"); printf("*** required on your system.\n"); printf("*** If pkg-config was wrong, set the environment variable PKG_CONFIG_PATH\n"); printf("*** to point to the correct configuration files\n"); } else if ((gtk_major_version != GTK_MAJOR_VERSION) || (gtk_minor_version != GTK_MINOR_VERSION) || (gtk_micro_version != GTK_MICRO_VERSION)) { printf("*** GTK+ header files (version %d.%d.%d) do not match\n", GTK_MAJOR_VERSION, GTK_MINOR_VERSION, GTK_MICRO_VERSION); printf("*** library (version %d.%d.%d)\n", gtk_major_version, gtk_minor_version, gtk_micro_version); } else { if ((gtk_major_version > major) || ((gtk_major_version == major) && (gtk_minor_version > minor)) || ((gtk_major_version == major) && (gtk_minor_version == minor) && (gtk_micro_version >= micro))) { return 0; } else { printf("\n*** An old version of GTK+ (%d.%d.%d) was found.\n", gtk_major_version, gtk_minor_version, gtk_micro_version); printf("*** You need a version of GTK+ newer than %d.%d.%d. The latest version of\n", major, minor, micro); printf("*** GTK+ is always available from ftp://ftp.gtk.org.\n"); printf("***\n"); printf("*** If you have already installed a sufficiently new version, this error\n"); printf("*** probably means that the wrong copy of the pkg-config shell script is\n"); printf("*** being found. The easiest way to fix this is to remove the old version\n"); printf("*** of GTK+, but you can also set the PKG_CONFIG environment to point to the\n"); printf("*** correct copy of pkg-config. (In this case, you will have to\n"); printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n"); printf("*** so that the correct libraries are found at run-time))\n"); } } return 1; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else no_gtk=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi fi if test "x$no_gtk" = x ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes (version $gtk_config_major_version.$gtk_config_minor_version.$gtk_config_micro_version)" >&5 $as_echo "yes (version $gtk_config_major_version.$gtk_config_minor_version.$gtk_config_micro_version)" >&6; } USES_GTK2="yes" FOUND_GTK="yes" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if test "$PKG_CONFIG" = "no" ; then echo "*** A new enough version of pkg-config was not found." echo "*** See http://pkgconfig.sourceforge.net" else if test -f conf.gtktest ; then : else echo "*** Could not run GTK+ test program, checking why..." ac_save_CFLAGS="$CFLAGS" ac_save_LIBS="$LIBS" CFLAGS="$CFLAGS $GTK_CFLAGS" LIBS="$LIBS $GTK_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { return ((gtk_major_version) || (gtk_minor_version) || (gtk_micro_version)); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : echo "*** The test program compiled, but did not run. This usually means" echo "*** that the run-time linker is not finding GTK+ or finding the wrong" echo "*** version of GTK+. If it is not finding GTK+, you'll need to set your" echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" echo "*** to the installed location Also, make sure you have run ldconfig if that" echo "*** is required on your system" echo "***" echo "*** If you have an old version installed, it is best to remove it, although" echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH" else echo "*** The test program failed to compile or link. See the file config.log for the" echo "*** exact error that occured. This usually means GTK+ is incorrectly installed." fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi fi GTK_CFLAGS="" GTK_LIBS="" : fi rm -f conf.gtktest fi fi if test "x$FOUND_GTK" = "xno"; then # Check whether --with-gtk-prefix was given. if test "${with_gtk_prefix+set}" = set; then : withval=$with_gtk_prefix; gtk_config_prefix="$withval" else gtk_config_prefix="" fi # Check whether --with-gtk-exec-prefix was given. if test "${with_gtk_exec_prefix+set}" = set; then : withval=$with_gtk_exec_prefix; gtk_config_exec_prefix="$withval" else gtk_config_exec_prefix="" fi # Check whether --enable-gtktest was given. if test "${enable_gtktest+set}" = set; then : enableval=$enable_gtktest; else enable_gtktest=yes fi for module in . do case "$module" in gthread) gtk_config_args="$gtk_config_args gthread" ;; esac done if test x$gtk_config_exec_prefix != x ; then gtk_config_args="$gtk_config_args --exec-prefix=$gtk_config_exec_prefix" if test x${GTK_CONFIG+set} != xset ; then GTK_CONFIG=$gtk_config_exec_prefix/bin/gtk-config fi fi if test x$gtk_config_prefix != x ; then gtk_config_args="$gtk_config_args --prefix=$gtk_config_prefix" if test x${GTK_CONFIG+set} != xset ; then GTK_CONFIG=$gtk_config_prefix/bin/gtk-config fi fi # Extract the first word of "gtk-config", so it can be a program name with args. set dummy gtk-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_GTK_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $GTK_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_GTK_CONFIG="$GTK_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_GTK_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_GTK_CONFIG" && ac_cv_path_GTK_CONFIG="no" ;; esac fi GTK_CONFIG=$ac_cv_path_GTK_CONFIG if test -n "$GTK_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GTK_CONFIG" >&5 $as_echo "$GTK_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi min_gtk_version=1.2.5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTK - version >= $min_gtk_version" >&5 $as_echo_n "checking for GTK - version >= $min_gtk_version... " >&6; } no_gtk="" if test "$GTK_CONFIG" = "no" ; then no_gtk=yes else GTK_CFLAGS=`$GTK_CONFIG $gtk_config_args --cflags` GTK_LIBS=`$GTK_CONFIG $gtk_config_args --libs` gtk_config_major_version=`$GTK_CONFIG $gtk_config_args --version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'` gtk_config_minor_version=`$GTK_CONFIG $gtk_config_args --version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'` gtk_config_micro_version=`$GTK_CONFIG $gtk_config_args --version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'` if test "x$enable_gtktest" = "xyes" ; then ac_save_CFLAGS="$CFLAGS" ac_save_LIBS="$LIBS" CFLAGS="$CFLAGS $GTK_CFLAGS" LIBS="$GTK_LIBS $LIBS" rm -f conf.gtktest if test "$cross_compiling" = yes; then : echo $ac_n "cross compiling; assumed OK... $ac_c" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { int major, minor, micro; char *tmp_version; system ("touch conf.gtktest"); /* HP/UX 9 (%@#!) writes to sscanf strings */ tmp_version = g_strdup("$min_gtk_version"); if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { printf("%s, bad version string\n", "$min_gtk_version"); exit(1); } if ((gtk_major_version != $gtk_config_major_version) || (gtk_minor_version != $gtk_config_minor_version) || (gtk_micro_version != $gtk_config_micro_version)) { printf("\n*** 'gtk-config --version' returned %d.%d.%d, but GTK+ (%d.%d.%d)\n", $gtk_config_major_version, $gtk_config_minor_version, $gtk_config_micro_version, gtk_major_version, gtk_minor_version, gtk_micro_version); printf ("*** was found! If gtk-config was correct, then it is best\n"); printf ("*** to remove the old version of GTK+. You may also be able to fix the error\n"); printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n"); printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n"); printf("*** required on your system.\n"); printf("*** If gtk-config was wrong, set the environment variable GTK_CONFIG\n"); printf("*** to point to the correct copy of gtk-config, and remove the file config.cache\n"); printf("*** before re-running configure\n"); } #if defined (GTK_MAJOR_VERSION) && defined (GTK_MINOR_VERSION) && defined (GTK_MICRO_VERSION) else if ((gtk_major_version != GTK_MAJOR_VERSION) || (gtk_minor_version != GTK_MINOR_VERSION) || (gtk_micro_version != GTK_MICRO_VERSION)) { printf("*** GTK+ header files (version %d.%d.%d) do not match\n", GTK_MAJOR_VERSION, GTK_MINOR_VERSION, GTK_MICRO_VERSION); printf("*** library (version %d.%d.%d)\n", gtk_major_version, gtk_minor_version, gtk_micro_version); } #endif /* defined (GTK_MAJOR_VERSION) ... */ else { if ((gtk_major_version > major) || ((gtk_major_version == major) && (gtk_minor_version > minor)) || ((gtk_major_version == major) && (gtk_minor_version == minor) && (gtk_micro_version >= micro))) { return 0; } else { printf("\n*** An old version of GTK+ (%d.%d.%d) was found.\n", gtk_major_version, gtk_minor_version, gtk_micro_version); printf("*** You need a version of GTK+ newer than %d.%d.%d. The latest version of\n", major, minor, micro); printf("*** GTK+ is always available from ftp://ftp.gtk.org.\n"); printf("***\n"); printf("*** If you have already installed a sufficiently new version, this error\n"); printf("*** probably means that the wrong copy of the gtk-config shell script is\n"); printf("*** being found. The easiest way to fix this is to remove the old version\n"); printf("*** of GTK+, but you can also set the GTK_CONFIG environment to point to the\n"); printf("*** correct copy of gtk-config. (In this case, you will have to\n"); printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n"); printf("*** so that the correct libraries are found at run-time))\n"); } } return 1; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else no_gtk=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi fi if test "x$no_gtk" = x ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } FOUND_GTK="yes" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if test "$GTK_CONFIG" = "no" ; then echo "*** The gtk-config script installed by GTK could not be found" echo "*** If GTK was installed in PREFIX, make sure PREFIX/bin is in" echo "*** your path, or set the GTK_CONFIG environment variable to the" echo "*** full path to gtk-config." else if test -f conf.gtktest ; then : else echo "*** Could not run GTK test program, checking why..." CFLAGS="$CFLAGS $GTK_CFLAGS" LIBS="$LIBS $GTK_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { return ((gtk_major_version) || (gtk_minor_version) || (gtk_micro_version)); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : echo "*** The test program compiled, but did not run. This usually means" echo "*** that the run-time linker is not finding GTK or finding the wrong" echo "*** version of GTK. If it is not finding GTK, you'll need to set your" echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" echo "*** to the installed location Also, make sure you have run ldconfig if that" echo "*** is required on your system" echo "***" echo "*** If you have an old version installed, it is best to remove it, although" echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH" echo "***" echo "*** If you have a RedHat 5.0 system, you should remove the GTK package that" echo "*** came with the system with the command" echo "***" echo "*** rpm --erase --nodeps gtk gtk-devel" else echo "*** The test program failed to compile or link. See the file config.log for the" echo "*** exact error that occured. This usually means GTK was incorrectly installed" echo "*** or that you have moved GTK since it was installed. In the latter case, you" echo "*** may want to edit the gtk-config script: $GTK_CONFIG" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi fi GTK_CFLAGS="" GTK_LIBS="" as_fn_error $? "mhWaveEdit requires GTK+ version 1.2.5 or higher..." "$LINENO" 5 fi rm -f conf.gtktest fi GTHREAD_CFLAGS="" GTHREAD_LIBS="" HAVE_GTHREAD="no" if test "x$USES_GTK2" = "xyes"; then HAVE_GTHREAD="yes" pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTHREAD" >&5 $as_echo_n "checking for GTHREAD... " >&6; } if test -n "$GTHREAD_CFLAGS"; then pkg_cv_GTHREAD_CFLAGS="$GTHREAD_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gthread-2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "gthread-2.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTHREAD_CFLAGS=`$PKG_CONFIG --cflags "gthread-2.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$GTHREAD_LIBS"; then pkg_cv_GTHREAD_LIBS="$GTHREAD_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gthread-2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "gthread-2.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTHREAD_LIBS=`$PKG_CONFIG --libs "gthread-2.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GTHREAD_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gthread-2.0" 2>&1` else GTHREAD_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gthread-2.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GTHREAD_PKG_ERRORS" >&5 HAVE_GTHREAD="no" elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } HAVE_GTHREAD="no" else GTHREAD_CFLAGS=$pkg_cv_GTHREAD_CFLAGS GTHREAD_LIBS=$pkg_cv_GTHREAD_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi fi if test "x$HAVE_GTHREAD" = "xyes"; then $as_echo "#define HAVE_GTHREAD /**/" >>confdefs.h fi # Check whether --enable-largefile was given. if test "${enable_largefile+set}" = set; then : enableval=$enable_largefile; fi if test "$enable_largefile" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5 $as_echo_n "checking for special C compiler options needed for large files... " >&6; } if ${ac_cv_sys_largefile_CC+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_sys_largefile_CC=no if test "$GCC" != yes; then ac_save_CC=$CC while :; do # IRIX 6.2 and later do not support large files by default, # so use the C compiler's -n32 option if that helps. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : break fi rm -f core conftest.err conftest.$ac_objext CC="$CC -n32" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_largefile_CC=' -n32'; break fi rm -f core conftest.err conftest.$ac_objext break done CC=$ac_save_CC rm -f conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5 $as_echo "$ac_cv_sys_largefile_CC" >&6; } if test "$ac_cv_sys_largefile_CC" != no; then CC=$CC$ac_cv_sys_largefile_CC fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5 $as_echo_n "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; } if ${ac_cv_sys_file_offset_bits+:} false; then : $as_echo_n "(cached) " >&6 else while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_file_offset_bits=no; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _FILE_OFFSET_BITS 64 #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_file_offset_bits=64; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_sys_file_offset_bits=unknown break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5 $as_echo "$ac_cv_sys_file_offset_bits" >&6; } case $ac_cv_sys_file_offset_bits in #( no | unknown) ;; *) cat >>confdefs.h <<_ACEOF #define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits _ACEOF ;; esac rm -rf conftest* if test $ac_cv_sys_file_offset_bits = unknown; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5 $as_echo_n "checking for _LARGE_FILES value needed for large files... " >&6; } if ${ac_cv_sys_large_files+:} false; then : $as_echo_n "(cached) " >&6 else while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_large_files=no; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _LARGE_FILES 1 #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_large_files=1; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_sys_large_files=unknown break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5 $as_echo "$ac_cv_sys_large_files" >&6; } case $ac_cv_sys_large_files in #( no | unknown) ;; *) cat >>confdefs.h <<_ACEOF #define _LARGE_FILES $ac_cv_sys_large_files _ACEOF ;; esac rm -rf conftest* fi fi $as_echo "#define _LARGEFILE_SOURCE /**/" >>confdefs.h # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of off_t" >&5 $as_echo_n "checking size of off_t... " >&6; } if ${ac_cv_sizeof_off_t+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (off_t))" "ac_cv_sizeof_off_t" "$ac_includes_default"; then : else if test "$ac_cv_type_off_t" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (off_t) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_off_t=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_off_t" >&5 $as_echo "$ac_cv_sizeof_off_t" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_OFF_T $ac_cv_sizeof_off_t _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi for ac_header in sys/time.h time.h sys/ioctl.h sys/types.h unistd.h fcntl.h sched.h libintl.h locale.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done HAVE_LADSPA=yes HAVE_LADSPA_GLOBAL=yes ac_fn_c_check_header_mongrel "$LINENO" "ladspa.h" "ac_cv_header_ladspa_h" "$ac_includes_default" if test "x$ac_cv_header_ladspa_h" = xyes; then : else HAVE_LADSPA_GLOBAL=no fi # Check whether --enable-ladspa was given. if test "${enable_ladspa+set}" = set; then : enableval=$enable_ladspa; if test "x$enableval" = "xno"; then HAVE_LADSPA=no; fi fi if test "x$HAVE_LADSPA" = "xyes"; then ac_fn_c_check_header_mongrel "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default" if test "x$ac_cv_header_dlfcn_h" = xyes; then : else HAVE_LADSPA=no fi fi if test "x$HAVE_LADSPA" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : LIBS="-ldl $LIBS" else HAVE_LADSPA=no fi fi if test "x$HAVE_LADSPA" = "xyes"; then $as_echo "#define HAVE_LADSPA /**/" >>confdefs.h fi if test "x$HAVE_LADSPA_GLOBAL" = "xyes"; then $as_echo "#define HAVE_SYS_LADSPA_H /**/" >>confdefs.h fi ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" if test "x$ac_cv_type_size_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define size_t unsigned int _ACEOF fi ac_fn_c_check_type "$LINENO" "off_t" "ac_cv_type_off_t" "$ac_includes_default" if test "x$ac_cv_type_off_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define off_t long int _ACEOF fi ac_fn_c_check_type "$LINENO" "pid_t" "ac_cv_type_pid_t" "$ac_includes_default" if test "x$ac_cv_type_pid_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define pid_t int _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking return type of signal handlers" >&5 $as_echo_n "checking return type of signal handlers... " >&6; } if ${ac_cv_type_signal+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { return *(signal (0, 0)) (0) == 1; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_type_signal=int else ac_cv_type_signal=void fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_signal" >&5 $as_echo "$ac_cv_type_signal" >&6; } cat >>confdefs.h <<_ACEOF #define RETSIGTYPE $ac_cv_type_signal _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5 $as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; } if ${ac_cv_header_time+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { if ((struct tm *) 0) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_time=yes else ac_cv_header_time=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5 $as_echo "$ac_cv_header_time" >&6; } if test $ac_cv_header_time = yes; then $as_echo "#define TIME_WITH_SYS_TIME 1" >>confdefs.h fi ac_header_dirent=no for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do as_ac_Header=`$as_echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_hdr that defines DIR" >&5 $as_echo_n "checking for $ac_hdr that defines DIR... " >&6; } if eval \${$as_ac_Header+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include <$ac_hdr> int main () { if ((DIR *) 0) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$as_ac_Header=yes" else eval "$as_ac_Header=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$as_ac_Header { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_hdr" | $as_tr_cpp` 1 _ACEOF ac_header_dirent=$ac_hdr; break fi done # Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. if test $ac_header_dirent = dirent.h; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 $as_echo_n "checking for library containing opendir... " >&6; } if ${ac_cv_search_opendir+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char opendir (); int main () { return opendir (); ; return 0; } _ACEOF for ac_lib in '' dir; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_opendir=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_opendir+:} false; then : break fi done if ${ac_cv_search_opendir+:} false; then : else ac_cv_search_opendir=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 $as_echo "$ac_cv_search_opendir" >&6; } ac_res=$ac_cv_search_opendir if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 $as_echo_n "checking for library containing opendir... " >&6; } if ${ac_cv_search_opendir+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char opendir (); int main () { return opendir (); ; return 0; } _ACEOF for ac_lib in '' x; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_opendir=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_opendir+:} false; then : break fi done if ${ac_cv_search_opendir+:} false; then : else ac_cv_search_opendir=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 $as_echo "$ac_cv_search_opendir" >&6; } ac_res=$ac_cv_search_opendir if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sys/wait.h that is POSIX.1 compatible" >&5 $as_echo_n "checking for sys/wait.h that is POSIX.1 compatible... " >&6; } if ${ac_cv_header_sys_wait_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #ifndef WEXITSTATUS # define WEXITSTATUS(stat_val) ((unsigned int) (stat_val) >> 8) #endif #ifndef WIFEXITED # define WIFEXITED(stat_val) (((stat_val) & 255) == 0) #endif int main () { int s; wait (&s); s = WIFEXITED (s) ? WEXITSTATUS (s) : 1; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_sys_wait_h=yes else ac_cv_header_sys_wait_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_sys_wait_h" >&5 $as_echo "$ac_cv_header_sys_wait_h" >&6; } if test $ac_cv_header_sys_wait_h = yes; then $as_echo "#define HAVE_SYS_WAIT_H 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 $as_echo_n "checking for an ANSI C-conforming const... " >&6; } if ${ac_cv_c_const+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __cplusplus /* Ultrix mips cc rejects this sort of thing. */ typedef int charset[2]; const charset cs = { 0, 0 }; /* SunOS 4.1.1 cc rejects this. */ char const *const *pcpcc; char **ppc; /* NEC SVR4.0.2 mips cc rejects this. */ struct point {int x, y;}; static struct point const zero = {0,0}; /* AIX XL C 1.02.0.0 rejects this. It does not let you subtract one const X* pointer from another in an arm of an if-expression whose if-part is not a constant expression */ const char *g = "string"; pcpcc = &g + (g ? g-g : 0); /* HPUX 7.0 cc rejects these. */ ++pcpcc; ppc = (char**) pcpcc; pcpcc = (char const *const *) ppc; { /* SCO 3.2v4 cc rejects this sort of thing. */ char tx; char *t = &tx; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; if (s) return 0; } { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ int x[] = {25, 17}; const int *foo = &x[0]; ++foo; } { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ typedef const int *iptr; iptr p = 0; ++p; } { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ struct s { int j; const int *ap[3]; } bx; struct s *b = &bx; b->j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; if (!foo) return 0; } return !cs[0] && !zero.x; #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_const=yes else ac_cv_c_const=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 $as_echo "$ac_cv_c_const" >&6; } if test $ac_cv_c_const = no; then $as_echo "#define const /**/" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working volatile" >&5 $as_echo_n "checking for working volatile... " >&6; } if ${ac_cv_c_volatile+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { volatile int x; int * volatile y = (int *) 0; return !x && !y; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_volatile=yes else ac_cv_c_volatile=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_volatile" >&5 $as_echo "$ac_cv_c_volatile" >&6; } if test $ac_cv_c_volatile = no; then $as_echo "#define volatile /**/" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether unsetenv returns a value" >&5 $as_echo_n "checking whether unsetenv returns a value... " >&6; } HAVE_INT_UNSETENV=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { int i; i = unsetenv("dummy"); return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : HAVE_INT_UNSETENV=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test "x$HAVE_INT_UNSETENV" = "xyes"; then $as_echo "#define UNSETENV_RETVAL /**/" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HAVE_INT_UNSETENV" >&5 $as_echo "$HAVE_INT_UNSETENV" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working memcmp" >&5 $as_echo_n "checking for working memcmp... " >&6; } if ${ac_cv_func_memcmp_working+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_memcmp_working=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { /* Some versions of memcmp are not 8-bit clean. */ char c0 = '\100', c1 = '\200', c2 = '\201'; if (memcmp(&c0, &c2, 1) >= 0 || memcmp(&c1, &c2, 1) >= 0) return 1; /* The Next x86 OpenStep bug shows up only when comparing 16 bytes or more and with at least one buffer not starting on a 4-byte boundary. William Lewis provided this test program. */ { char foo[21]; char bar[21]; int i; for (i = 0; i < 4; i++) { char *a = foo + i; char *b = bar + i; strcpy (a, "--------01111111"); strcpy (b, "--------10000000"); if (memcmp (a, b, 16) >= 0) return 1; } return 0; } ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_memcmp_working=yes else ac_cv_func_memcmp_working=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_memcmp_working" >&5 $as_echo "$ac_cv_func_memcmp_working" >&6; } test $ac_cv_func_memcmp_working = no && case " $LIBOBJS " in *" memcmp.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS memcmp.$ac_objext" ;; esac for ac_func in gettimeofday mkdir strerror strtod strtol sched_yield ceill setlocale fseeko ftello lrint lrintf dup2 memchr memmove memset pow putenv select sqrt strchr strrchr strstr strtoul do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether closedir returns void" >&5 $as_echo_n "checking whether closedir returns void... " >&6; } if ${ac_cv_func_closedir_void+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_closedir_void=yes else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default #include <$ac_header_dirent> #ifndef __cplusplus int closedir (); #endif int main () { return closedir (opendir (".")) != 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_closedir_void=no else ac_cv_func_closedir_void=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_closedir_void" >&5 $as_echo "$ac_cv_func_closedir_void" >&6; } if test $ac_cv_func_closedir_void = yes; then $as_echo "#define CLOSEDIR_VOID 1" >>confdefs.h fi for ac_header in vfork.h do : ac_fn_c_check_header_mongrel "$LINENO" "vfork.h" "ac_cv_header_vfork_h" "$ac_includes_default" if test "x$ac_cv_header_vfork_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_VFORK_H 1 _ACEOF fi done for ac_func in fork vfork do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done if test "x$ac_cv_func_fork" = xyes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working fork" >&5 $as_echo_n "checking for working fork... " >&6; } if ${ac_cv_func_fork_works+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_fork_works=cross else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { /* By Ruediger Kuhlmann. */ return fork () < 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_fork_works=yes else ac_cv_func_fork_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_fork_works" >&5 $as_echo "$ac_cv_func_fork_works" >&6; } else ac_cv_func_fork_works=$ac_cv_func_fork fi if test "x$ac_cv_func_fork_works" = xcross; then case $host in *-*-amigaos* | *-*-msdosdjgpp*) # Override, as these systems have only a dummy fork() stub ac_cv_func_fork_works=no ;; *) ac_cv_func_fork_works=yes ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: result $ac_cv_func_fork_works guessed because of cross compilation" >&5 $as_echo "$as_me: WARNING: result $ac_cv_func_fork_works guessed because of cross compilation" >&2;} fi ac_cv_func_vfork_works=$ac_cv_func_vfork if test "x$ac_cv_func_vfork" = xyes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working vfork" >&5 $as_echo_n "checking for working vfork... " >&6; } if ${ac_cv_func_vfork_works+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_vfork_works=cross else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Thanks to Paul Eggert for this test. */ $ac_includes_default #include #ifdef HAVE_VFORK_H # include #endif /* On some sparc systems, changes by the child to local and incoming argument registers are propagated back to the parent. The compiler is told about this with #include , but some compilers (e.g. gcc -O) don't grok . Test for this by using a static variable whose address is put into a register that is clobbered by the vfork. */ static void #ifdef __cplusplus sparc_address_test (int arg) # else sparc_address_test (arg) int arg; #endif { static pid_t child; if (!child) { child = vfork (); if (child < 0) { perror ("vfork"); _exit(2); } if (!child) { arg = getpid(); write(-1, "", 0); _exit (arg); } } } int main () { pid_t parent = getpid (); pid_t child; sparc_address_test (0); child = vfork (); if (child == 0) { /* Here is another test for sparc vfork register problems. This test uses lots of local variables, at least as many local variables as main has allocated so far including compiler temporaries. 4 locals are enough for gcc 1.40.3 on a Solaris 4.1.3 sparc, but we use 8 to be safe. A buggy compiler should reuse the register of parent for one of the local variables, since it will think that parent can't possibly be used any more in this routine. Assigning to the local variable will thus munge parent in the parent process. */ pid_t p = getpid(), p1 = getpid(), p2 = getpid(), p3 = getpid(), p4 = getpid(), p5 = getpid(), p6 = getpid(), p7 = getpid(); /* Convince the compiler that p..p7 are live; otherwise, it might use the same hardware register for all 8 local variables. */ if (p != p1 || p != p2 || p != p3 || p != p4 || p != p5 || p != p6 || p != p7) _exit(1); /* On some systems (e.g. IRIX 3.3), vfork doesn't separate parent from child file descriptors. If the child closes a descriptor before it execs or exits, this munges the parent's descriptor as well. Test for this by closing stdout in the child. */ _exit(close(fileno(stdout)) != 0); } else { int status; struct stat st; while (wait(&status) != child) ; return ( /* Was there some problem with vforking? */ child < 0 /* Did the child fail? (This shouldn't happen.) */ || status /* Did the vfork/compiler bug occur? */ || parent != getpid() /* Did the file descriptor bug occur? */ || fstat(fileno(stdout), &st) != 0 ); } } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_vfork_works=yes else ac_cv_func_vfork_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_vfork_works" >&5 $as_echo "$ac_cv_func_vfork_works" >&6; } fi; if test "x$ac_cv_func_fork_works" = xcross; then ac_cv_func_vfork_works=$ac_cv_func_vfork { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: result $ac_cv_func_vfork_works guessed because of cross compilation" >&5 $as_echo "$as_me: WARNING: result $ac_cv_func_vfork_works guessed because of cross compilation" >&2;} fi if test "x$ac_cv_func_vfork_works" = xyes; then $as_echo "#define HAVE_WORKING_VFORK 1" >>confdefs.h else $as_echo "#define vfork fork" >>confdefs.h fi if test "x$ac_cv_func_fork_works" = xyes; then $as_echo "#define HAVE_WORKING_FORK 1" >>confdefs.h fi for ac_header in sys/select.h sys/socket.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking types of arguments for select" >&5 $as_echo_n "checking types of arguments for select... " >&6; } if ${ac_cv_func_select_args+:} false; then : $as_echo_n "(cached) " >&6 else for ac_arg234 in 'fd_set *' 'int *' 'void *'; do for ac_arg1 in 'int' 'size_t' 'unsigned long int' 'unsigned int'; do for ac_arg5 in 'struct timeval *' 'const struct timeval *'; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default #ifdef HAVE_SYS_SELECT_H # include #endif #ifdef HAVE_SYS_SOCKET_H # include #endif int main () { extern int select ($ac_arg1, $ac_arg234, $ac_arg234, $ac_arg234, $ac_arg5); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_func_select_args="$ac_arg1,$ac_arg234,$ac_arg5"; break 3 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done done done # Provide a safe default value. : "${ac_cv_func_select_args=int,int *,struct timeval *}" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_select_args" >&5 $as_echo "$ac_cv_func_select_args" >&6; } ac_save_IFS=$IFS; IFS=',' set dummy `echo "$ac_cv_func_select_args" | sed 's/\*/\*/g'` IFS=$ac_save_IFS shift cat >>confdefs.h <<_ACEOF #define SELECT_TYPE_ARG1 $1 _ACEOF cat >>confdefs.h <<_ACEOF #define SELECT_TYPE_ARG234 ($2) _ACEOF cat >>confdefs.h <<_ACEOF #define SELECT_TYPE_ARG5 ($3) _ACEOF rm -f conftest* { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether lstat correctly handles trailing slash" >&5 $as_echo_n "checking whether lstat correctly handles trailing slash... " >&6; } if ${ac_cv_func_lstat_dereferences_slashed_symlink+:} false; then : $as_echo_n "(cached) " >&6 else rm -f conftest.sym conftest.file echo >conftest.file if test "$as_ln_s" = "ln -s" && ln -s conftest.file conftest.sym; then if test "$cross_compiling" = yes; then : ac_cv_func_lstat_dereferences_slashed_symlink=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { struct stat sbuf; /* Linux will dereference the symlink and fail, as required by POSIX. That is better in the sense that it means we will not have to compile and use the lstat wrapper. */ return lstat ("conftest.sym/", &sbuf) == 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_lstat_dereferences_slashed_symlink=yes else ac_cv_func_lstat_dereferences_slashed_symlink=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi else # If the `ln -s' command failed, then we probably don't even # have an lstat function. ac_cv_func_lstat_dereferences_slashed_symlink=no fi rm -f conftest.sym conftest.file fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_lstat_dereferences_slashed_symlink" >&5 $as_echo "$ac_cv_func_lstat_dereferences_slashed_symlink" >&6; } test $ac_cv_func_lstat_dereferences_slashed_symlink = yes && cat >>confdefs.h <<_ACEOF #define LSTAT_FOLLOWS_SLASHED_SYMLINK 1 _ACEOF if test "x$ac_cv_func_lstat_dereferences_slashed_symlink" = xno; then case " $LIBOBJS " in *" lstat.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS lstat.$ac_objext" ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stat accepts an empty string" >&5 $as_echo_n "checking whether stat accepts an empty string... " >&6; } if ${ac_cv_func_stat_empty_string_bug+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_stat_empty_string_bug=yes else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { struct stat sbuf; return stat ("", &sbuf) == 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_stat_empty_string_bug=no else ac_cv_func_stat_empty_string_bug=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_stat_empty_string_bug" >&5 $as_echo "$ac_cv_func_stat_empty_string_bug" >&6; } if test $ac_cv_func_stat_empty_string_bug = yes; then case " $LIBOBJS " in *" stat.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS stat.$ac_objext" ;; esac cat >>confdefs.h <<_ACEOF #define HAVE_STAT_EMPTY_STRING_BUG 1 _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working strtod" >&5 $as_echo_n "checking for working strtod... " >&6; } if ${ac_cv_func_strtod+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_strtod=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default #ifndef strtod double strtod (); #endif int main() { { /* Some versions of Linux strtod mis-parse strings with leading '+'. */ char *string = " +69"; char *term; double value; value = strtod (string, &term); if (value != 69 || term != (string + 4)) return 1; } { /* Under Solaris 2.4, strtod returns the wrong value for the terminating character under some conditions. */ char *string = "NaN"; char *term; strtod (string, &term); if (term != string && *(term - 1) == 0) return 1; } return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_strtod=yes else ac_cv_func_strtod=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_strtod" >&5 $as_echo "$ac_cv_func_strtod" >&6; } if test $ac_cv_func_strtod = no; then case " $LIBOBJS " in *" strtod.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS strtod.$ac_objext" ;; esac ac_fn_c_check_func "$LINENO" "pow" "ac_cv_func_pow" if test "x$ac_cv_func_pow" = xyes; then : fi if test $ac_cv_func_pow = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pow in -lm" >&5 $as_echo_n "checking for pow in -lm... " >&6; } if ${ac_cv_lib_m_pow+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pow (); int main () { return pow (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_m_pow=yes else ac_cv_lib_m_pow=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_pow" >&5 $as_echo "$ac_cv_lib_m_pow" >&6; } if test "x$ac_cv_lib_m_pow" = xyes; then : POW_LIB=-lm else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cannot find library containing definition of pow" >&5 $as_echo "$as_me: WARNING: cannot find library containing definition of pow" >&2;} fi fi fi ac_config_files="$ac_config_files Makefile src/Makefile po/Makefile.in m4/Makefile share/Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs { $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 $as_echo_n "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 $as_echo "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by $as_me, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ config.status configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # # Capture the value of obsolete ALL_LINGUAS because we need it to compute # POFILES, GMOFILES, UPDATEPOFILES, DUMMYPOFILES, CATALOGS. But hide it # from automake. eval 'ALL_LINGUAS''="$ALL_LINGUAS"' # Capture the value of LINGUAS because we need it to compute CATALOGS. LINGUAS="${LINGUAS-%UNSET%}" AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "default-1") CONFIG_COMMANDS="$CONFIG_COMMANDS default-1" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "po/Makefile.in") CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;; "m4/Makefile") CONFIG_FILES="$CONFIG_FILES m4/Makefile" ;; "share/Makefile") CONFIG_FILES="$CONFIG_FILES share/Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "default-1":C) 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 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" # ALL_LINGUAS, POFILES, GMOFILES, UPDATEPOFILES, DUMMYPOFILES 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 "$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" "$ac_given_srcdir/$ac_dir/LINGUAS"` # Hide the ALL_LINGUAS assigment from automake. eval 'ALL_LINGUAS''=$ALL_LINGUAS_' fi case "$ac_given_srcdir" in .) srcdirpre= ;; *) srcdirpre='$(srcdir)/' ;; esac POFILES= GMOFILES= UPDATEPOFILES= DUMMYPOFILES= for lang in $ALL_LINGUAS; do POFILES="$POFILES $srcdirpre$lang.po" GMOFILES="$GMOFILES $srcdirpre$lang.gmo" UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" DUMMYPOFILES="$DUMMYPOFILES $lang.nop" 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|@GMOFILES@|$GMOFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@CATALOGS@|$CATALOGS|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 ;; "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi echo echo echo "------------------------" echo "mhWaveEdit configuration" echo "------------------------" echo echo "Version: $MHW_VERSION" echo echo "Libraries: " echo -n " GTK+ version: " if test "x$USES_GTK2" = "xyes"; then echo "2.x" else echo "1.2" fi echo " Libsndfile: $HAVE_SNDFILE" echo " Libsamplerate: $HAVE_LIBSAMPLERATE" echo echo "Sound drivers:" INCLUDED_DRIVERS="" EXCLUDED_DRIVERS="" if test "x$HAVE_OSS" = "xyes"; then INCLUDED_DRIVERS="$INCLUDED_DRIVERS OSS"; else EXCLUDED_DRIVERS="$EXCLUDED_DRIVERS OSS"; fi; if test "x$HAVE_ALSALIB" = "xyes"; then INCLUDED_DRIVERS="$INCLUDED_DRIVERS ALSA"; else EXCLUDED_DRIVERS="$EXCLUDED_DRIVERS ALSA"; fi; if test "x$MHW_HAVE_JACK" = "xyes"; then INCLUDED_DRIVERS="$INCLUDED_DRIVERS JACK"; else EXCLUDED_DRIVERS="$EXCLUDED_DRIVERS JACK"; fi; if test "x$MHW_HAVE_SUNAUDIO" = "xyes"; then INCLUDED_DRIVERS="$INCLUDED_DRIVERS Sun"; else EXCLUDED_DRIVERS="$EXCLUDED_DRIVERS Sun"; fi; if test "x$MHW_HAVE_PORTAUDIO" = "xyes"; then INCLUDED_DRIVERS="$INCLUDED_DRIVERS PortAudio"; else EXCLUDED_DRIVERS="$EXCLUDED_DRIVERS PortAudio"; fi; if test "x$MHW_HAVE_SDL" = "xyes"; then INCLUDED_DRIVERS="$INCLUDED_DRIVERS SDL"; else EXCLUDED_DRIVERS="$EXCLUDED_DRIVERS SDL"; fi; if test "x$MHW_HAVE_ESOUND" = "xyes"; then INCLUDED_DRIVERS="$INCLUDED_DRIVERS EsounD"; else EXCLUDED_DRIVERS="$EXCLUDED_DRIVERS EsounD"; fi; if test "x$MHW_HAVE_ARTSC" = "xyes"; then INCLUDED_DRIVERS="$INCLUDED_DRIVERS aRts"; else EXCLUDED_DRIVERS="$EXCLUDED_DRIVERS aRts"; fi; if test "x$MHW_HAVE_PULSE" = "xyes"; then INCLUDED_DRIVERS="$INCLUDED_DRIVERS PulseAudio"; else EXCLUDED_DRIVERS="$EXCLUDED_DRIVERS PulseAudio"; fi; echo " Included drivers: $INCLUDED_DRIVERS" echo " Drivers not included: $EXCLUDED_DRIVERS" echo -n " Default sound driver: $DEFAULT_DRIVER " if test "x$DEFAULT_DRIVER" = "xauto"; then echo -n "(detect at startup)" fi echo echo echo "Other settings:" echo " LADSPA Support: $HAVE_LADSPA" if test "x$HAVE_LADSPA" = "xyes"; then echo -n " ladspa.h header file: " if test "x$HAVE_LADSPA_GLOBAL" = "xyes"; then echo "system" else echo "local" fi echo " Default plugin path: $DEFAULT_LADSPA_PATH" fi echo -n " Floating-point samples: " if test "x$MHW_DOUBLE" = "xyes"; then echo "double precision" else echo "normal precision" fi echo " Default mixer app: $DEFAULT_MIXERAPP" echo echo "Build settings:" echo -n " Compiler options: " echo $CFLAGS echo " Build date string: ${FIXED_DATE_STR}" echo " Build time string: ${FIXED_TIME_STR}" echo if test "x$USES_GTK2$MHW_HAVE_ARTSC" = "xnoyes"; then echo "---------------------------------------------------------------" echo "WARNING: There are known issues when building with GTK+ 1.2 " echo "and newer versions of aRts. If you are experiencing problems," echo "try running configure with the --without-arts option to disable " echo "aRts support" echo "---------------------------------------------------------------" echo fi echo "Type make (or gmake) to compile mhWaveEdit!" mhwaveedit-1.4.24/configure.in000066400000000000000000000354011334022513400162500ustar00rootroot00000000000000dnl Process this file with autoconf to produce a configure script. AC_INIT AC_PREREQ(2.59) AC_CONFIG_HEADERS([config.h]) AC_CONFIG_SRCDIR([src/chunk.c]) AC_CANONICAL_HOST AC_CANONICAL_TARGET MHW_VERSION=1.4.24 AM_INIT_AUTOMAKE(mhWaveEdit,$MHW_VERSION) # This is disabled in releases because timestamps can not be preserved through # the current Github-based release flow. AM_MAINTAINER_MODE([disable]) dnl Check for libintl AM_GNU_GETTEXT([external]) PKG_PROG_PKG_CONFIG dnl Various options AC_ARG_WITH(double-samples, [ --with-double-samples Use double precision floating point numbers for sound processing (slows down program but may increase quality for 24/32-bit samplerates).], AC_DEFINE([USE_DOUBLE_SAMPLES],[], [Use gdouble instead of gfloat as sample data type]) MHW_DOUBLE="yes") AC_DEFUN([AC_WITHOUT_CHECK_CASTS],[ if test "x$withval" = "xno" ; then AC_DEFINE(GTK_NO_CHECK_CASTS,[],[If defined, disables GTK+ type checking]) fi ]) AC_ARG_WITH(check-casts, [ --without-check-casts Do not type-check GTK casts.],AC_WITHOUT_CHECK_CASTS) AC_DEFUN([AC_ENABLE_WERROR],[ if test "x$enableval" = "xyes" ; then AM_CFLAGS="$AM_CFLAGS -Werror" fi ]) AC_ARG_ENABLE(werror, [ --enable-werror Treat warnings as errors during compilation], AC_ENABLE_WERROR) DEFAULT_DRIVER=auto AC_ARG_WITH(default-driver, [ --with-default-driver=driver Choose default sound driver (one of oss,alsa,pulse, jack,sun,pa,sdl,esound,arts,auto; default: auto)], DEFAULT_DRIVER=$withval) AC_DEFINE_UNQUOTED(DEFAULT_DRIVER,"${DEFAULT_DRIVER}",[Default sound driver]) DEFAULT_LADSPA_PATH="/usr/lib/ladspa:/usr/local/lib/ladspa" AC_ARG_WITH(default-ladspa-path, [ --with-default-ladspa-path=path Path to use if LADSPA_PATH variable is not set (default: "/usr/lib/ladspa:/usr/local/lib/ladspa")], DEFAULT_LADSPA_PATH=$withval) AC_DEFINE_UNQUOTED(DEFAULT_LADSPA_PATH,"${DEFAULT_LADSPA_PATH}",[Default path for LADSPA plugins]) DEFAULT_MIXERAPP=xmixer AC_ARG_WITH(default-mixerapp, [ --with-default-mixerapp=appname Default command for "launch mixer" button (default: "xmixer")], DEFAULT_MIXERAPP=$withval) AC_DEFINE_UNQUOTED(DEFAULT_MIXERAPP,"${DEFAULT_MIXERAPP}",[Default mixer application]) FIXED_DATE_STR="__DATE__ (actual compile date)" FIXED_TIME_STR="__TIME__ (actual compile time)" AC_ARG_WITH(build-date, [ --with-build-date=str Fixed string to use instead of __DATE__], if test "x$withval" != "xno" ; then AC_DEFINE_UNQUOTED(FIXED_DATE,"${withval}",[Fixed build date]) FIXED_DATE_STR=${withval} fi ) AC_ARG_WITH(build-time, [ --with-build-time=str Fixed string to use instead of __TIME__], if test "x$withval" != "xno" ; then AC_DEFINE_UNQUOTED(FIXED_TIME,"${withval}",[Fixed build date]) FIXED_TIME_STR=${withval} fi ) dnl Checks for programs. AC_PROG_CC AC_PROG_GCC_TRADITIONAL AC_PROG_LN_S AC_PROG_MAKE_SET dnl Checks for libraries. dnl Replace `main' with a function in -libs: AC_CHECK_LIB(ibs, main) AC_CHECK_LIB(m, round) dnl This is needed for PortAudio under GNU/Linux... AC_CHECK_LIB(pthread,pthread_create) dnl Check for libsndfile HAVE_SNDFILE=yes SKIP_SNDFILE_CHECK=no SNDFILE_LIBS="" SNDFILE_CFLAGS="" AC_DEFUN([AC_WITH_LIBSNDFILE],[ if test "x$withval" = "xno" ; then HAVE_SNDFILE=no else SNDFILE_LIBS="-L$withval/lib -lsndfile -lm" SNDFILE_CFLAGS="-I$withval/include" SKIP_SNDFILE_CHECK=yes fi ]) AC_ARG_WITH(libsndfile,[ --with-libsndfile=prefix Prefix where libsndfile is installed (optional) --without-libsndfile Don't use libsndfile library],AC_WITH_LIBSNDFILE) if test "x$HAVE_SNDFILE" = "xyes" -a "x$SKIP_SNDFILE_CHECK" = "xno"; then PKG_CHECK_MODULES(SNDFILE, sndfile, , HAVE_SNDFILE=no) fi if test "x$HAVE_SNDFILE" = "xyes" ; then AC_DEFINE(HAVE_LIBSNDFILE,[],[Use libsndfile library]) fi AC_SUBST(SNDFILE_LIBS) AC_SUBST(SNDFILE_CFLAGS) dnl Check for libsamplerate HAVE_LIBSAMPLERATE=yes SKIP_LIBSAMPLERATE_CHECK=no LIBSAMPLERATE_LIBS="" LIBSAMPLERATE_CFLAGS="" AC_DEFUN([AC_WITH_LIBSAMPLERATE],[ if test "x$withval" = "xno" ; then HAVE_LIBSAMPLERATE=no else LIBSAMPLERATE_LIBS="-L$withval/lib -lsamplerate" LIBSAMPLERATE_CFLAGS="-I$withval/include" SKIP_LIBSAMPLERATE_CHECK=yes fi ]) AC_ARG_WITH(libsamplerate,[ --with-libsamplerate=prefix Prefix where libsamplerate is installed (optional) --without-libsamplerate Don't use libsamplerate library],AC_WITH_LIBSAMPLERATE) if test "x$HAVE_LIBSAMPLERATE" = "xyes" -a "x$SKIP_LIBSAMPLERATE_CHECK" = "xno"; then PKG_CHECK_MODULES(LIBSAMPLERATE, samplerate, , HAVE_LIBSAMPLERATE=no) fi if test "x$HAVE_LIBSAMPLERATE" = "xyes" ; then AC_DEFINE(HAVE_LIBSAMPLERATE,[],[Use libsamplerate library]) fi AC_SUBST(LIBSAMPLERATE_LIBS) AC_SUBST(LIBSAMPLERATE_CFLAGS) dnl Check for PortAudio PORTAUDIO_LIBS="" MHW_HAVE_PORTAUDIO=yes AC_ARG_WITH(portaudio,[ --without-portaudio Don't use portaudio library], if test "x$withval" = "xno"; then MHW_HAVE_PORTAUDIO=no fi ) AC_CHECK_HEADER(portaudio.h,mhw_found_header=yes,mhw_found_header=no) if test "x$mhw_found_header" = "xno"; then MHW_HAVE_PORTAUDIO=no fi if test "x$MHW_HAVE_PORTAUDIO" = "xyes"; then AC_CHECK_LIB(portaudio,Pa_Initialize,MHW_HAVE_PORTAUDIO=yes,MHW_HAVE_PORTAUDIO=no) fi if test "x$MHW_HAVE_PORTAUDIO" = "xyes"; then AC_CHECK_TYPE(PaTimestamp,,MHW_HAVE_PORTAUDIO=no,[[#include ]]) fi if test "x$MHW_HAVE_PORTAUDIO" = "xyes"; then AC_DEFINE(HAVE_PORTAUDIO,[],[Enable PortAudio sound driver]) PORTAUDIO_LIBS="-lportaudio $PORTAUDIO_LIBS" fi AC_SUBST(PORTAUDIO_LIBS) dnl Check for SDL SKIP_SDL_TEST=no MHW_HAVE_SDL=no AC_DEFUN([AC_WITHOUT_SDL],[ if test "x$withval" = "xno" ; then SKIP_SDL_TEST=yes fi ]) AC_ARG_WITH(sdl,[ --without-sdl Don't use SDL library],AC_WITHOUT_SDL) if test "x$SKIP_SDL_TEST" = "xno"; then AM_PATH_SDL(1.2.3, AC_DEFINE(HAVE_SDL,[],[Enable SDL sound driver]) MHW_HAVE_SDL=yes) fi dnl Check for AlsaLib ALSALIB_LIBS="" AC_CHECK_LIB(asound,snd_pcm_open,HAVE_ALSALIB=yes,HAVE_ALSALIB=no) AC_DEFUN([AC_WITHOUT_ALSALIB],[ if test "x$withval" = "xno" ; then HAVE_ALSALIB=no fi ]) AC_ARG_WITH(alsalib,[ --without-alsalib Don't compile ALSA-lib driver],AC_WITHOUT_ALSALIB) AC_CHECK_HEADER(alsa/asoundlib.h,mhw_found_header=yes,mhw_found_header=no) if test "x$mhw_found_header" = "xno"; then HAVE_ALSALIB="no" fi if test "x$HAVE_ALSALIB" = "xyes"; then ALSALIB_LIBS="-lasound" AC_DEFINE(HAVE_ALSALIB,[],[Enable ALSA sound driver]) fi AC_SUBST(ALSALIB_LIBS) dnl Check for OSS HAVE_OSS=yes AC_DEFUN([AC_WITHOUT_OSS],[ if test "x$withval" = "xno" ; then HAVE_OSS=no fi ]) AC_ARG_WITH(oss,[ --without-oss Don't compile OSS driver],AC_WITHOUT_OSS) dnl Check for libossaudio, needed for OSS on OpenBSD AC_CHECK_LIB(ossaudio,_oss_ioctl) mhw_found_one=no AC_CHECK_HEADERS(soundcard.h sys/soundcard.h,mhw_found_one=yes) if test "x$mhw_found_one" = "xno"; then HAVE_OSS=no fi if test "x$HAVE_OSS" = "xyes"; then AC_DEFINE(HAVE_OSS,[],[Enable OSS sound driver]) fi dnl Check for JACK MHW_HAVE_JACK=no MHW_SKIP_JACKTEST=no AC_DEFUN([AC_WITHOUT_JACK],[ if test "x$withval" = "xno" ; then MHW_SKIP_JACKTEST='yes' fi ]) AC_ARG_WITH(jack,[ --without-jack Don't compile JACK driver],AC_WITHOUT_JACK) if test "x$MHW_SKIP_JACKTEST" = "xno" then PKG_CHECK_MODULES(JACK,jack >= 0.98.0,MHW_HAVE_JACK=yes,MHW_HAVE_JACK=no) fi if test "x$MHW_HAVE_JACK" = "xyes" ; then AC_DEFINE(HAVE_JACK,[],[Enable JACK sound driver]) fi dnl Check for PulseAudio MHW_HAVE_PULSE=no MHW_SKIP_PULSETEST=no AC_DEFUN([AC_WITHOUT_PULSE],[ if test "x$withval" = "xno" ; then MHW_SKIP_PULSETEST='yes' fi ]) AC_ARG_WITH(pulse,[ --without-pulse Don't compile PulseAudio driver],AC_WITHOUT_PULSE) if test "x$MHW_SKIP_PULSETEST" = "xno" then PKG_CHECK_MODULES(PULSE,libpulse >= 0.9.10,MHW_HAVE_PULSE=yes,MHW_HAVE_PULSE=no) fi if test "x$MHW_HAVE_PULSE" = "xyes" ; then AC_DEFINE(HAVE_PULSEAUDIO,[],[Enable PulseAudio sound driver]) fi dnl Check for Esound MHW_HAVE_ESOUND=yes AC_ARG_WITH(esound,[ --without-esound Don't compile EsounD driver], if test "x$withval" = "xno"; then MHW_HAVE_ESOUND=no fi ) if test "x$MHW_HAVE_ESOUND" = "xyes" then PKG_CHECK_MODULES(ESOUND,esound >= 0.2.0,MHW_HAVE_ESOUND=yes,MHW_HAVE_ESOUND=no) fi if test "x$MHW_HAVE_ESOUND" = "xyes"; then AC_DEFINE(HAVE_ESOUND,[],[Enable EsounD sound driver]) fi dnl Check for Sun audio MHW_HAVE_SUNAUDIO=yes AC_DEFUN([AC_WITHOUT_SUNAUDIO],[ if test "x$withval" = "xno" ; then MHW_HAVE_SUNAUDIO=no fi ]) AC_ARG_WITH(sun,[ --without-sun Don't compile Sun audio driver],AC_WITHOUT_SUNAUDIO) AC_CHECK_HEADER(sys/audio.h,mhw_found_one=yes,mhw_found_one=no) if test "x$mhw_found_one" = "xno"; then MHW_HAVE_SUNAUDIO=no fi if test "x$MHW_HAVE_SUNAUDIO" = "xyes"; then AC_DEFINE(HAVE_SUN,[],[Enable Sun audio sound driver]) fi dnl Check for aRts C interface MHW_HAVE_ARTSC=yes ARTSC_LIBS="" ARTSC_CFLAGS="" AC_DEFUN([AC_WITHOUT_ARTSC],[ if test "x$withval" = "xno"; then MHW_HAVE_ARTSC=no fi ]) AC_ARG_WITH(arts, [ --without-arts Don't compile aRts driver],AC_WITHOUT_ARTSC) ARTSC_CONFIG=no if test "x$MHW_HAVE_ARTSC" = "xyes"; then AC_PATH_PROG(ARTSC_CONFIG, artsc-config, no) fi if test "x$ARTSC_CONFIG" = "xno"; then MHW_HAVE_ARTSC=no else ARTSC_CFLAGS=`$ARTSC_CONFIG --cflags` ARTSC_LIBS=`$ARTSC_CONFIG --libs` AC_DEFINE(HAVE_ARTSC,[],[Enable aRts driver]) fi AC_SUBST(ARTSC_CFLAGS) AC_SUBST(ARTSC_LIBS) dnl Check for GTK+ AC_DEFUN([AC_DISABLE_GTK2],[ if test "x$enableval" = "xno" ; then DISABLE_GTK2='yes' fi ]) AC_ARG_ENABLE(gtk2, [ --disable-gtk2 Don't use GTK+ 2, use 1.2 instead], AC_DISABLE_GTK2, DISABLE_GTK2='no') dnl Check for GTK+ without gthread FOUND_GTK="no" USES_GTK2="no" if test "x$FOUND_GTK" = "xno"; then if test "x$DISABLE_GTK2" != "xyes"; then AM_PATH_GTK_2_0(2.0.0,USES_GTK2="yes" FOUND_GTK="yes") fi fi if test "x$FOUND_GTK" = "xno"; then AM_PATH_GTK(1.2.5,FOUND_GTK="yes",AC_MSG_ERROR(mhWaveEdit requires GTK+ version 1.2.5 or higher...)) fi dnl Check for gthread if we're using GTK+ 2 dnl Not needed by the app itself, but needed for some aRts versions. GTHREAD_CFLAGS="" GTHREAD_LIBS="" HAVE_GTHREAD="no" if test "x$USES_GTK2" = "xyes"; then HAVE_GTHREAD="yes" PKG_CHECK_MODULES(GTHREAD, gthread-2.0, , HAVE_GTHREAD="no") fi if test "x$HAVE_GTHREAD" = "xyes"; then AC_DEFINE(HAVE_GTHREAD,[],[Defined if Glib thread support is available]) fi AC_SUBST(GTHREAD_CFLAGS) AC_SUBST(GTHREAD_LIBS) dnl Check for large file support AC_SYS_LARGEFILE AC_DEFINE(_LARGEFILE_SOURCE,[],[Defined to get fseeko/ftello prototypes]) AC_CHECK_SIZEOF(off_t) dnl Checks for header files. AC_HEADER_STDC AC_CHECK_HEADERS([sys/time.h time.h sys/ioctl.h sys/types.h unistd.h fcntl.h sched.h libintl.h locale.h]) dnl Ladspa HAVE_LADSPA=yes HAVE_LADSPA_GLOBAL=yes AC_CHECK_HEADER(ladspa.h,,HAVE_LADSPA_GLOBAL=no) AC_ARG_ENABLE(ladspa, [ --disable-ladspa Don't include any Ladspa support], [if test "x$enableval" = "xno"; then HAVE_LADSPA=no; fi]) if test "x$HAVE_LADSPA" = "xyes"; then AC_CHECK_HEADER(dlfcn.h,,HAVE_LADSPA=no) fi if test "x$HAVE_LADSPA" = "xyes"; then AC_CHECK_LIB(dl,dlopen,LIBS="-ldl $LIBS",HAVE_LADSPA=no) fi if test "x$HAVE_LADSPA" = "xyes"; then AC_DEFINE(HAVE_LADSPA,[],[Enable LADSPA support]) fi if test "x$HAVE_LADSPA_GLOBAL" = "xyes"; then AC_DEFINE(HAVE_SYS_LADSPA_H,[],[Use system LADSPA header]) fi dnl Checks for typedefs, structures, and compiler characteristics. AC_TYPE_SIZE_T AC_TYPE_OFF_T AC_TYPE_PID_T AC_TYPE_SIGNAL AC_HEADER_TIME AC_HEADER_DIRENT AC_HEADER_SYS_WAIT AC_C_CONST AC_C_VOLATILE dnl Check return type of unsetenv AC_MSG_CHECKING([whether unsetenv returns a value]) HAVE_INT_UNSETENV=no AC_COMPILE_IFELSE([AC_LANG_PROGRAM([ #include ],[int i; i = unsetenv("dummy"); return 0;])],HAVE_INT_UNSETENV=yes) if test "x$HAVE_INT_UNSETENV" = "xyes"; then AC_DEFINE(UNSETENV_RETVAL,[],[Defined if unsetenv returns an integer]) fi AC_MSG_RESULT([$HAVE_INT_UNSETENV]) dnl Checks for library functions. AC_FUNC_MEMCMP AC_CHECK_FUNCS([gettimeofday mkdir strerror strtod strtol sched_yield ceill setlocale fseeko ftello lrint lrintf dup2 memchr memmove memset pow putenv select sqrt strchr strrchr strstr strtoul]) AC_FUNC_CLOSEDIR_VOID AC_FUNC_FORK AC_FUNC_SELECT_ARGTYPES AC_FUNC_STAT AC_FUNC_STRTOD dnl Write output AC_CONFIG_FILES([Makefile src/Makefile po/Makefile.in m4/Makefile share/Makefile ]) AC_OUTPUT dnl Display configuration echo echo echo "------------------------" echo "mhWaveEdit configuration" echo "------------------------" echo echo "Version: $MHW_VERSION" echo echo "Libraries: " echo -n " GTK+ version: " if test "x$USES_GTK2" = "xyes"; then echo "2.x" else echo "1.2" fi echo " Libsndfile: $HAVE_SNDFILE" echo " Libsamplerate: $HAVE_LIBSAMPLERATE" echo echo "Sound drivers:" INCLUDED_DRIVERS="" EXCLUDED_DRIVERS="" AC_DEFUN([CHECKDRV], [ if test "x$1" = "xyes"; then INCLUDED_DRIVERS="$INCLUDED_DRIVERS $2"; else EXCLUDED_DRIVERS="$EXCLUDED_DRIVERS $2"; fi; ]) CHECKDRV([$HAVE_OSS],[OSS]) CHECKDRV([$HAVE_ALSALIB],[ALSA]) CHECKDRV([$MHW_HAVE_JACK],[JACK]) CHECKDRV([$MHW_HAVE_SUNAUDIO],[Sun]) CHECKDRV([$MHW_HAVE_PORTAUDIO],[PortAudio]) CHECKDRV([$MHW_HAVE_SDL],[SDL]) CHECKDRV([$MHW_HAVE_ESOUND],[EsounD]) CHECKDRV([$MHW_HAVE_ARTSC],[aRts]) CHECKDRV([$MHW_HAVE_PULSE],[PulseAudio]) echo " Included drivers: $INCLUDED_DRIVERS" echo " Drivers not included: $EXCLUDED_DRIVERS" echo -n " Default sound driver: $DEFAULT_DRIVER " if test "x$DEFAULT_DRIVER" = "xauto"; then echo -n "(detect at startup)" fi echo echo echo "Other settings:" echo " LADSPA Support: $HAVE_LADSPA" if test "x$HAVE_LADSPA" = "xyes"; then echo -n " ladspa.h header file: " if test "x$HAVE_LADSPA_GLOBAL" = "xyes"; then echo "system" else echo "local" fi echo " Default plugin path: $DEFAULT_LADSPA_PATH" fi echo -n " Floating-point samples: " if test "x$MHW_DOUBLE" = "xyes"; then echo "double precision" else echo "normal precision" fi echo " Default mixer app: $DEFAULT_MIXERAPP" echo echo "Build settings:" echo -n " Compiler options: " echo $CFLAGS echo " Build date string: ${FIXED_DATE_STR}" echo " Build time string: ${FIXED_TIME_STR}" echo if test "x$USES_GTK2$MHW_HAVE_ARTSC" = "xnoyes"; then echo "---------------------------------------------------------------" echo "WARNING: There are known issues when building with GTK+ 1.2 " echo "and newer versions of aRts. If you are experiencing problems," echo "try running configure with the --without-arts option to disable " echo "aRts support" echo "---------------------------------------------------------------" echo fi echo "Type make (or gmake) to compile mhWaveEdit!" mhwaveedit-1.4.24/copynotice000066400000000000000000000014571334022513400160420ustar00rootroot00000000000000/* * Copyright (C) 2002-2012, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ mhwaveedit-1.4.24/depcomp000066400000000000000000000330521334022513400153110ustar00rootroot00000000000000#! /bin/sh # depcomp - compile a program generating dependencies as side-effects # Copyright 1999, 2000, 2003 Free Software Foundation, Inc. # 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, 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. # Originally written by Alexandre Oliva . if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # `libtool' can also be set to `yes' or `no'. if test -z "$depfile"; then base=`echo "$object" | sed -e 's,^.*/,,' -e 's,\.\([^.]*\)$,.P\1,'` dir=`echo "$object" | sed 's,/.*$,/,'` if test "$dir" = "$object"; then dir= fi # FIXME: should be _deps on DOS. depfile="$dir.deps/$base" fi tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ## The second -e expression handles DOS-style file names with drive letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the `deleted header file' problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. tr ' ' ' ' < "$tmpdepfile" | ## Some versions of gcc put a space before the `:'. On the theory ## that the space means something, we add a space to the output as ## well. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like `#:fec' to the end of the # dependency line. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ tr ' ' ' ' >> $depfile echo >> $depfile # The second pass generates a dummy entry for each header file. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> $depfile else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts `$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. stripped=`echo "$object" | sed 's/\(.*\)\..*$/\1/'` tmpdepfile="$stripped.u" if test "$libtool" = yes; then "$@" -Wc,-M else "$@" -M fi stat=$? if test -f "$tmpdepfile"; then : else stripped=`echo "$stripped" | sed 's,^.*/,,'` tmpdepfile="$stripped.u" fi if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi if test -f "$tmpdepfile"; then outname="$stripped.o" # Each line is of the form `foo.o: dependent.h'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile" sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; icc) # Intel's C compiler understands `-MD -MF file'. However on # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c # ICC 7.0 will fill foo.d with something like # foo.o: sub/foo.c # foo.o: sub/foo.h # which is wrong. We want: # sub/foo.o: sub/foo.c # sub/foo.o: sub/foo.h # sub/foo.c: # sub/foo.h: # ICC 7.1 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using \ : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in `foo.d' instead, so we check for that too. # Subdirectories are respected. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then tmpdepfile1="$dir.libs/$base.lo.d" tmpdepfile2="$dir.libs/$base.d" "$@" -Wc,-MD else tmpdepfile1="$dir$base.o.d" tmpdepfile2="$dir$base.d" "$@" -MD fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi if test -f "$tmpdepfile1"; then tmpdepfile="$tmpdepfile1" else tmpdepfile="$tmpdepfile2" fi if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" # That's a tab and a space in the []. sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for `:' # in the target name. This is to cope with DOS-style filenames: # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. "$@" $dashmflag | sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" tr ' ' ' ' < "$tmpdepfile" | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # X makedepend shift cleared=no for arg in "$@"; do case $cleared in no) set ""; shift cleared=yes ;; esac case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix="`echo $object | sed 's/^.*\././'`" touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" sed '1,2d' "$tmpdepfile" | tr ' ' ' ' | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E | sed -n '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o, # because we must use -o when running libtool. "$@" || exit $? IFS=" " for arg do case "$arg" in "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" echo " " >> "$depfile" . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 mhwaveedit-1.4.24/docgen/000077500000000000000000000000001334022513400151735ustar00rootroot00000000000000mhwaveedit-1.4.24/docgen/D01_view.doc000066400000000000000000000016041334022513400172410ustar00rootroot00000000000000Sample view The area where you 'see' the contents of the file you are editing, is called the 'sample view'. In the sample view there is a grey vertical bar called the 'cursor'. The cursor follows the sound wave when you play the sound. You can position the cursor by clicking with the right (2:nd) mouse button. If you do this while you're playing a file, the playing will continue from the new cursor position. You can also position the cursor more exact by using the 'Position Cursor...' command on the Edit menu. You can place marks in your file by holding down Ctrl and pressing a number from 0 to 9. This will place a mark (green vertical bar) with the same number at the current cursor position. You can later make the cursor go to that position again by just pressing the number. Setting and jumping to marks can be done while playing. To remove a mark, jump to the mark and set it again. mhwaveedit-1.4.24/docgen/D02_playing.doc000066400000000000000000000006511334022513400177340ustar00rootroot00000000000000Playing Playing a file is simple, just load the file and press the play button. The green play button plays from the current position. The yellow play button plays the current selection, or the entire file if nothing is selected. Stop the playback with the stop button (with the red square). The playback speed can be varied by adjusting the slider to the far right. You can do normal editing while the file is playing. mhwaveedit-1.4.24/docgen/D03_recording.doc000066400000000000000000000012021334022513400202370ustar00rootroot00000000000000Recording Recording is done with 'Record...' on the Play menu, or the Record button (the red circle). A dialog box will pop up where you can select what format you want to record in. After selecting the format, meters and numbers will appear showing info about the volume level of the sound input. When you want to start recording, press the "Start recording" button. When you've recorded everything you wanted to, press the Finish button and the record dialog will disappear and newly recorded sound will show up in a new window. Currently it is impossible to play and record at the same time, so the playback will stop when you record. mhwaveedit-1.4.24/docgen/D04_editing.doc000066400000000000000000000025011334022513400177120ustar00rootroot00000000000000Editing You make selections by dragging the mouse over the sample view. You can hear what you've currently selected by clicking on the "play selection" button (the button with the yellow arrow) or by selecting 'Play selection' from the Play menu. You can use the cursor to refine the selection. Use the 'Selection start at cursor' and 'Selection end at cursor' buttons to move the selection starting point or the selection end point to the current cursor position. You can also drag the selection endpoints using the mouse. The 'Cut' and 'Copy' functions work like in any other software. The 'Paste' function insert the clipboard contents at the cursor position. The 'Paste over' function works like 'Paste', except that it overwrites the data after the insert position. The 'Paste mix' function combines the clipboard data with the data at the cursor position. The 'Paste as new' function opens a new window and puts the clipboard contents into it. The 'Crop' function deletes all parts of the file that are not selected. The 'Silence selection' function replaces the selected part with silence. To avoid clicks, the silent part is a line that meets the wave at the endpoints. All editing functions work non-destructively, that is, the file you're editing isn't actually changed until you save it (the effects also work this way). mhwaveedit-1.4.24/docgen/D05_effects.doc000066400000000000000000000057661334022513400177270ustar00rootroot00000000000000Effects mhWaveEdit has a few simple effects, which are available from the 'Effects' menu. * Fade in/out This creates a linear fade in or fade out effect. * Normalize, Normalize to... This amplifies the sound as much as possible without getting clipping distortion. The "Normalize to..." item lets you specify which level to normalize to. * Volume adjust/fade... This effect lets you select a starting volume and a ending volume and amplifies the selection fading from the starting volume to the ending volume. Note that volumes above 100% may cause sound distortion. Use the 'Find top volume' to find out the maximum amplification possible without distortion. (You can use this for normalizing samples.) By setting starting volume and ending volume to the same value you get a simple amplification of the sound. * Convert samplerate... This converts the samplerate of the entire file to one you specify. There are different methods for doing this, usually the one in the top has the best quality but can take longer than the other methode. * Convert sample format... This converts the sample format of the entire file. The 'Don't actually change the data' option can be used if the program was wrong about the file's format. * Byte swap This "byte swaps" the selected part. It can be used to repair damaged files where the byte order is wrong. Note that if the sound looks alright but plays wrong, you should not use this option, instead you should use the "byte-swap output" option in the Preferences dialog. * Mix to mono This mixes all channels of the file together to a mono sound. * Add channel This copies the first channel to a new channel in the sound, converting mono to stereo etc. * Map channels... With this effect, you can change the number of channels in the file. You can also rearrange and add (i.e. mix) channels. * Combine channels... This effect lets you create a new sound by a linear combination of the old channels. This means you can do channel mixing / swapping / balance / panning / amplification etc. by entering different values. For example, to swap the left and right channel, you select that the new Channel 1 should be 0% of the old Channel 1 and 100% of the old Channel 2, and the new Channel 2 should be 100% of the old Channel 1 and 0% of the old Channel 2 * Speed adjustment... This effect changes the speed of the selection. The tone will change as well. * Pipe through program... This effect is for advanced users wanting to pipe raw audio data through an external program. The output of the program is read back and replaces the processed part. mhWaveEdit supports LADSPA effects and can also make use of most of the SoX utility's effects. To find the LADSPA plugins the environment variable LADSPA_PATH must be properly set up. All supported effects can be found by choosing the 'Effects...' menu item. The effects are listed with names beginning with [B] for builtin effects, [L] for LADSPA effects, and [S] for SoX effects. mhwaveedit-1.4.24/docgen/D06_quality.doc000066400000000000000000000023771334022513400177740ustar00rootroot00000000000000Quality Some notes on sound quality. The general rule when doing audio editing/processing is to not manipulate the data more than necessary and keep an original copy whenever you're processing your important files. Cut, copy and paste operations move the data around without modifying it, so these don't degrade the sound quality. Because of level differences, you may get a "step" at the start and end of the inserted part, which can cause a small clicking sound. The mix paste function doesn't decrease quality, unless the peaks become too high and you get clipping. In that case you will get a warning message. Sound data is normally stored as integer values. Therefore, whenever you normalize, adjust volume, decrease sample size or filter a sound, the result must be rounded. If you use 24 or 32 bit sample sizes, this is not really a problem, but if you use 8 or 16 bits sample size, this rounding causes a decrease in quality. The quality decrease that the rounding causes can be masked by adding a small amount of noise before rounding. This is called "dithering". mhWaveEdit supports basic dithering and it's enabled by default. By default, mhWaveEdit uses floating-point temporary files for storing processed results to avoid rounding until the file is saved.mhwaveedit-1.4.24/docgen/D07_formats.doc000066400000000000000000000016151334022513400177520ustar00rootroot00000000000000File formats Even if mhWaveEdit was originally built for editing wav files, it's also possible to load and save in a few other formats. mhWaveEdit always supports wav and raw files, but if it's compiled with the libsndfile library, mhWaveEdit supports a couple of other formats as well. To save a file with a different file format, use "Save as..." and choose a format in the file type selection box. mhWaveEdit has basic support for mp3 and ogg formats. For this to work you need to have LAME installed for mp3 support, and OggDec/OggEnc for Ogg support. If you have these programs, you can open and save mp3/ogg files just like any other file format. If mplayer is installed, mhwaveedit can open all formats that it supports, for example the soundtrack of a video file. Since mplayer is only a player, these files can not be saved back after editing, you have to save the file into a supported format.mhwaveedit-1.4.24/docgen/D08_files.doc000066400000000000000000000020531334022513400173770ustar00rootroot00000000000000Files mhWaveEdit creates a directory ~/.mhwaveedit where it stores configuration information. The configuration file is called config. It can be hand edited, but the easiest way is through 'Preferences' on the Edit menu. Each mhwaveedit process creates a session file in the .mhwaveedit directory called mhwaveedit-session---, where is the session ID number and is a character code showing the state of the session ('r' for running sessions). Temporary files are by default also stored in the ~/.mhwaveedit directory. Which directories to use can be set through the preferences dialog. To get the best performance, you should have one temporary directory for each local filesystem. The temporary files have names of the form "mhwaveedit-temp--nnnn-". Do NOT open or remove temporary files with the same pid number as a currently running mhWaveEdit. mhWaveEdit checks on startup for leftover temporary files and lets the user open them. After opening a crashed session, the files can be saved or thrown away.mhwaveedit-1.4.24/docgen/D09_keyboard.doc000066400000000000000000000026661334022513400201100ustar00rootroot00000000000000Keyboard shortcuts F1 Help F12 Record Ctrl+(number) Set mark (number) Goto mark Ctrl+P Preferences Ctrl+E Effects Ctrl+O Open file Ctrl+S Save file Ctrl+U Save selection as Ctrl+C Copy Ctrl+X Cut Ctrl+D Delete Delete Delete Ctrl+V Paste Ctrl+Z Undo Ctrl+A Select all Ctrl+G Position cursor (Go to) Ctrl+H Position cursor at file start Ctrl+J Position cursor at file end Ctrl+K Position cursor at selection start Ctrl+L Position cursor at selection end Y,U Move cursor to nearest all-channel zero-crossing I,O Move cursor to nearest any-channel zero-crossing Ctrl+Q Selection start at cursor Ctrl+W Selection end at cursor +,= Zoom in - Zoom out > Zoom to selection < Zoom all Arrow keys Scroll left/right Home Move view to file start End Move view to file end Tab Move view to cursor Ctrl+Tab Move cursor to center of view Space Play/Stop Shift+Space Play all , Play from cursor pos . Stop / Play selection H,J Move cursor (and playback) 1/8 of view K,L Move cursor one sample Ctrl+arrow Move cursor (and playback) half second ( Play first 3 seconds of selection ) Play last 3 seconds of selectionmhwaveedit-1.4.24/docgen/D10_bugreport.doc000066400000000000000000000015251334022513400203020ustar00rootroot00000000000000Bug reporting If you find a bug or flaw in the program that's not mentioned in the BUGS file, report the bug in the bug tracker (see contact info) or mail a bug report describing the bug to: magnus.hjorth@home.se In case of a crash, please do not send me any core dumps. They are huge and completely useless to me. Instead, create a backtrace. Backtraces tell you exactly where the program crashed. How to create a backtrace: 1. Enable core dumps: ulimit -c unlimited 2. Run the program: mhwaveedit 3. Make the program crash. You should now get a file named core or core.1234 in the directory you're in. 4. Run gdb with the program and core file: gdb /usr/local/bin/mhwaveedit core | tee backtrace.txt 5. After gdb has loaded, use the command: bt 6. Quit gdb with the command: quit 7. Now you should have a back trace in the file backtrace.txt mhwaveedit-1.4.24/docgen/D11_helpout.doc000066400000000000000000000033501334022513400177500ustar00rootroot00000000000000Helping out There are plenty of things you can do if you want to help the development of mhWaveEdit. First of all, look for bugs and report all bugs you find into the bug tracker or through e-mail. Sometimes a bug can get overlooked for a long time because nobody reports it, so don't be afraid to report bugs that have been there for a few releases. You don't have to provide fixes or very detailed information, although it helps of course. Feature requests are also welcome, report them to the mailing list or to the bug tracker. If you speak a language other than English and mhWaveEdit isn't translated to your language, you can contribute a translation. To do that, copy the template mhwaveedit.pot in the po directory into a new file ll.po, where ll is your language code (see http://www.gnu.org/software/gettext/manual/html_node/gettext_221.html for a list of language codes). It's possible to edit po-files by hand, but I recommend a program such as poEdit (http://www.poedit.org) for editing translations. Note that for those translatable strings that look like "RecordStatus|Paused", you should ignore what's to the left and only translate the string to the right ("Paused" in this example). This convention is there to make it possible to translate the same string to different things depending on context. After you've filled in all the translations you want (you don't have to translate all the strings), mail in the po file to me (see contact info) and I'll add it to the next release. If a translation is incomplete, you're very welcome to translate the remaining untranslated messages and mail them in. Corrections to translations are also appreciated, but they may need to be checked with the previous translator before including them. mhwaveedit-1.4.24/docgen/D12_contact.doc000066400000000000000000000004421334022513400177230ustar00rootroot00000000000000Contact For bug reports, translation updates, patches and PayPal donations: magnus.hjorth@home.se Project page with bug tracker, mailing list membership: http://gna.org/projects/mhwaveedit Mailing list (you must be a subscriber before you can post messages): mhwaveedit-discuss@gna.org mhwaveedit-1.4.24/docgen/O00_general.doc000066400000000000000000000002701334022513400177140ustar00rootroot00000000000000General mhWaveEdit is a graphical program for editing sound files. It is completely free (GPL). You can find the latest release of mhWaveEdit at: http://gna.org/projects/mhwaveedit/ mhwaveedit-1.4.24/docgen/R00_intro.doc000066400000000000000000000004331334022513400174360ustar00rootroot00000000000000mhWaveEdit README file mhWaveEdit is a graphical program for editing sound files. It is completely free (GPL). You can find the latest release of mhWaveEdit at: http://gna.org/projects/mhwaveedit/ The contents of this file is also available inside mhWaveEdit from the help menu. mhwaveedit-1.4.24/docgen/R01_install.doc000066400000000000000000000004501334022513400177510ustar00rootroot00000000000000Installation * Unpack the source: tar xjf mhwaveedit-1.4.24.tar.gz * Go into the source directory: cd mhwaveedit-1.4.24 * Run the configure script: ./configure * Compile the sources: make * Install the program: su -c "make install" mhwaveedit-1.4.24/docgen/R02_config.doc000066400000000000000000000021131334022513400175470ustar00rootroot00000000000000Configure options For most people, just using ./configure without any arguments should work fine, but here are some options that the configure-script supports: --disable-gtk2 If you have both GTK+ 1.2 and GTK+ 2.0 installed and want to use GTK+ 1.2, specify this option. --without-portaudio --without-sdl --without-alsalib --without-oss --without-jack Specifying this option will leave out a sound driver, even if it's libs and headers are found. --without-libsndfile --without-libsamplerate Specifying this option will leave out libsndfile/libsamplerate support, even if the library is found. --with-libsndfile=prefix --with-libsamplerate=prefix This lets you specify the prefix where libsndfile/libsamplerate is installed if it wasn't auto-detected. --with-double-samples Use double precision floating point numbers for sample processing. If you intend to edit 32-bit files, you should enable this. --without-check-casts This option disables the run-time type cast checking. It makes some parts of the program faster, but makes it harder to debug. mhwaveedit-1.4.24/docgen/R03_start.doc000066400000000000000000000002361334022513400174440ustar00rootroot00000000000000Starting To start the program, simply type mhwaveedit. If you want to, you can specify files to open on the command line, for example 'mhwaveedit file.wav'. mhwaveedit-1.4.24/docgen/README.docgen000066400000000000000000000010521334022513400173070ustar00rootroot00000000000000 This directory contains the templates for both the README file and the on-line help and scripts to generate README and help.c. The generated files in the releases are always kept up to date so regular users and package makers need not to use the files in this directory. The first line of the doc files are the header. The rest is just plain text. R*.doc + D*.doc -> ../README O*.doc + D*.doc -> ../src/help.c The doc files should not contain backslashes, and they should only contain newlines where you really want them (section breaks etc). mhwaveedit-1.4.24/docgen/gendocs.sh000066400000000000000000000036271334022513400171610ustar00rootroot00000000000000#! /bin/bash # Script to generate ../README and ../src/help.c # THIS IS A HACK - Run it at your own risk... # Must be run under bash in order to work. # Generate README rm -f ../README for A in R*.doc D*.doc do csplit --silent $A 2 mv xx00 header.tmp mv xx01 contents.tmp tr "A-za-z " - line.tmp cat line.tmp header.tmp line.tmp contents.tmp | fold -s >> ../README echo >> ../README rm -f *.tmp done # Generate help.c tag="N_" rm -f ../src/help.c cp ../copynotice ../src/help.c echo "/* Automatically generated by gendocs.sh */" >> ../src/help.c echo "#include " >> ../src/help.c echo "#include \"gettext.h\"" >> ../src/help.c echo "#include \"help.h\"" >> ../src/help.c echo >> ../src/help.c echo -n "int help_page_count = " >> ../src/help.c ls -l O*.doc D*.doc | wc --lines >> ../src/help.c echo ";" >> ../src/help.c echo "const char *help_page_titles[] = {" >> ../src/help.c for A in O*.doc D*.doc do echo -n " $tag(\"" >> ../src/help.c echo -n `head --lines=1 $A` >> ../src/help.c echo "\")," >> ../src/help.c done echo " NULL };" >> ../src/help.c echo >> ../src/help.c for A in O*.doc D*.doc do N=`expr substr $A 1 3` echo "static const char * ${N}_contents[] = {" >> ../src/help.c split -l 1 $A rm -f xaa for B in x* do L=`cat $B` if test "x$L" = "x" then echo " \"\\n\"," >> ../src/help.c else echo -n " /* xgettext:no-c-format */ $tag(\"" >> ../src/help.c cat $B | sed -e "s/\\\"/\\\\\"/g" > temp.tmp echo -n "`cat temp.tmp`" >> ../src/help.c rm -f temp.tmp echo "\\n\")," >> ../src/help.c fi done rm -f x* echo " NULL };" >> ../src/help.c echo >> ../src/help.c done echo "const char ** help_page_contents[] = {" >> ../src/help.c for A in O*.doc D*.doc do N=`expr substr $A 1 3` echo " ${N}_contents ," >> ../src/help.c done echo " NULL };" >> ../src/help.c echo "----" ls -l ../README ../src/help.c mhwaveedit-1.4.24/ext/000077500000000000000000000000001334022513400145345ustar00rootroot00000000000000mhwaveedit-1.4.24/ext/ladspa.h000066400000000000000000000657111334022513400161630ustar00rootroot00000000000000/* 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 */ mhwaveedit-1.4.24/gitcompile.sh000066400000000000000000000007671334022513400164360ustar00rootroot00000000000000#! /bin/sh # Script to compile mhWaveEdit from a Git master branch commit # Configure options can be given on command line # Requires autoconf, automake and some other stuff # # Users building from a release tarball do not need to use this script # The standard ./configure followed by make flow can be used there instead. # cd docgen; bash gendocs.sh; cd .. aclocal --force -I m4 autoheader --force automake --add-missing --copy autoconf --force ./configure $* make -C po mhwaveedit.pot-update make mhwaveedit-1.4.24/install-sh000066400000000000000000000126711334022513400157440ustar00rootroot00000000000000#!/bin/sh # # install - install a program, script, or datafile # This comes from X11R5 (mit/util/scripts/install.sh). # # Copyright 1991 by the Massachusetts Institute of Technology # # Permission to use, copy, modify, distribute, and sell this software and its # documentation for any purpose is hereby granted without fee, provided that # the above copyright notice appear in all copies and that both that # copyright notice and this permission notice appear in supporting # documentation, and that the name of M.I.T. not be used in advertising or # publicity pertaining to distribution of the software without specific, # written prior permission. M.I.T. makes no representations about the # suitability of this software for any purpose. It is provided "as is" # without express or implied warranty. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. It can only install one file at a time, a restriction # shared with many OS's install programs. # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit="${DOITPROG-}" # put in absolute paths if you don't have them in your path; or use env. vars. mvprog="${MVPROG-mv}" cpprog="${CPPROG-cp}" chmodprog="${CHMODPROG-chmod}" chownprog="${CHOWNPROG-chown}" chgrpprog="${CHGRPPROG-chgrp}" stripprog="${STRIPPROG-strip}" rmprog="${RMPROG-rm}" mkdirprog="${MKDIRPROG-mkdir}" transformbasename="" transform_arg="" instcmd="$mvprog" chmodcmd="$chmodprog 0755" chowncmd="" chgrpcmd="" stripcmd="" rmcmd="$rmprog -f" mvcmd="$mvprog" src="" dst="" dir_arg="" while [ x"$1" != x ]; do case $1 in -c) instcmd="$cpprog" shift continue;; -d) dir_arg=true shift continue;; -m) chmodcmd="$chmodprog $2" shift shift continue;; -o) chowncmd="$chownprog $2" shift shift continue;; -g) chgrpcmd="$chgrpprog $2" shift shift continue;; -s) stripcmd="$stripprog" shift continue;; -t=*) transformarg=`echo $1 | sed 's/-t=//'` shift continue;; -b=*) transformbasename=`echo $1 | sed 's/-b=//'` shift continue;; *) if [ x"$src" = x ] then src=$1 else # this colon is to work around a 386BSD /bin/sh bug : dst=$1 fi shift continue;; esac done if [ x"$src" = x ] then echo "install: no input file specified" exit 1 else : fi if [ x"$dir_arg" != x ]; then dst=$src src="" if [ -d $dst ]; then instcmd=: chmodcmd="" else instcmd=$mkdirprog fi else # Waiting for this to be detected by the "$instcmd $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if [ -f $src -o -d $src ] then : else echo "install: $src does not exist" exit 1 fi if [ x"$dst" = x ] then echo "install: no destination specified" exit 1 else : fi # If destination is a directory, append the input filename; if your system # does not like double slashes in filenames, you may need to add some logic if [ -d $dst ] then dst="$dst"/`basename $src` else : fi fi ## this sed command emulates the dirname command dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` # Make sure that the destination directory exists. # this part is taken from Noah Friedman's mkinstalldirs script # Skip lots of stat calls in the usual case. if [ ! -d "$dstdir" ]; then defaultIFS=' ' IFS="${IFS-${defaultIFS}}" oIFS="${IFS}" # Some sh's can't handle IFS=/ for some reason. IFS='%' set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` IFS="${oIFS}" pathcomp='' while [ $# -ne 0 ] ; do pathcomp="${pathcomp}${1}" shift if [ ! -d "${pathcomp}" ] ; then $mkdirprog "${pathcomp}" else : fi pathcomp="${pathcomp}/" done fi if [ x"$dir_arg" != x ] then $doit $instcmd $dst && if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else : ; fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else : ; fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else : ; fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else : ; fi else # If we're going to rename the final executable, determine the name now. if [ x"$transformarg" = x ] then dstfile=`basename $dst` else dstfile=`basename $dst $transformbasename | sed $transformarg`$transformbasename fi # don't allow the sed command to completely eliminate the filename if [ x"$dstfile" = x ] then dstfile=`basename $dst` else : fi # Make a temp file name in the proper directory. dsttmp=$dstdir/#inst.$$# # Move or copy the file name to the temp name $doit $instcmd $src $dsttmp && trap "rm -f ${dsttmp}" 0 && # and set any options; do chmod last to preserve setuid bits # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $instcmd $src $dsttmp" command. if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else :;fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else :;fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else :;fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else :;fi && # Now rename the file to the real destination. $doit $rmcmd -f $dstdir/$dstfile && $doit $mvcmd $dsttmp $dstdir/$dstfile fi && exit 0 mhwaveedit-1.4.24/m4/000077500000000000000000000000001334022513400142545ustar00rootroot00000000000000mhwaveedit-1.4.24/m4/Makefile.am000066400000000000000000000003341334022513400163100ustar00rootroot00000000000000EXTRA_DIST = codeset.m4 gettext.m4 glibc21.m4 iconv.m4 intdiv0.m4 inttypes.m4 inttypes_h.m4 inttypes-pri.m4 isc-posix.m4 lcmessage.m4 lib-ld.m4 lib-link.m4 lib-prefix.m4 progtest.m4 stdint_h.m4 uintmax_t.m4 ulonglong.m4 mhwaveedit-1.4.24/m4/Makefile.in000066400000000000000000000312311334022513400163210ustar00rootroot00000000000000# Makefile.in generated by automake 1.15.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2017 Free Software Foundation, Inc. # This Makefile.in 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. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = m4 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gtk.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/m4/sdl.m4 $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALSALIB_LIBS = @ALSALIB_LIBS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ARTSC_CFLAGS = @ARTSC_CFLAGS@ ARTSC_CONFIG = @ARTSC_CONFIG@ ARTSC_LIBS = @ARTSC_LIBS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ESOUND_CFLAGS = @ESOUND_CFLAGS@ ESOUND_LIBS = @ESOUND_LIBS@ EXEEXT = @EXEEXT@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GTHREAD_CFLAGS = @GTHREAD_CFLAGS@ GTHREAD_LIBS = @GTHREAD_LIBS@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSAMPLERATE_CFLAGS = @LIBSAMPLERATE_CFLAGS@ LIBSAMPLERATE_LIBS = @LIBSAMPLERATE_LIBS@ LN_S = @LN_S@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PORTAUDIO_LIBS = @PORTAUDIO_LIBS@ POSUB = @POSUB@ POW_LIB = @POW_LIB@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ SNDFILE_LIBS = @SNDFILE_LIBS@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = codeset.m4 gettext.m4 glibc21.m4 iconv.m4 intdiv0.m4 inttypes.m4 inttypes_h.m4 inttypes-pri.m4 isc-posix.m4 lcmessage.m4 lib-ld.m4 lib-link.m4 lib-prefix.m4 progtest.m4 stdint_h.m4 uintmax_t.m4 ulonglong.m4 all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu m4/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu m4/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic cscopelist-am \ ctags-am distclean distclean-generic distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags-am uninstall uninstall-am .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: mhwaveedit-1.4.24/m4/codeset.m4000066400000000000000000000015761334022513400161550ustar00rootroot00000000000000# codeset.m4 serial AM1 (gettext-0.10.40) dnl Copyright (C) 2000-2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl From Bruno Haible. AC_DEFUN([AM_LANGINFO_CODESET], [ AC_CACHE_CHECK([for nl_langinfo and CODESET], am_cv_langinfo_codeset, [AC_TRY_LINK([#include ], [char* cs = nl_langinfo(CODESET);], am_cv_langinfo_codeset=yes, am_cv_langinfo_codeset=no) ]) if test $am_cv_langinfo_codeset = yes; then AC_DEFINE(HAVE_LANGINFO_CODESET, 1, [Define if you have and nl_langinfo(CODESET).]) fi ]) mhwaveedit-1.4.24/m4/gettext.m4000066400000000000000000000573011334022513400162100ustar00rootroot00000000000000# gettext.m4 serial 17 (gettext-0.11.5) dnl Copyright (C) 1995-2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. 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-2002. 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], [no], [yes])) define(gt_libtool_suffix_prefix, ifelse([$1], [use-libtool], [l], [])) 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 test "$gt_cv_func_gnugettext_libc" != "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]) ]) 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) ifelse(gt_included_intl, yes, [ BUILD_INCLUDED_LIBINTL=no USE_INCLUDED_LIBINTL=no ]) LIBINTL= LTLIBINTL= POSUB= 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. dnl Add a version number to the cache macros. define([gt_api_version], ifelse([$2], [need-formatstring-macros], 3, ifelse([$2], [need-ngettext], 2, 1))) define([gt_cv_func_gnugettext_libc], [gt_cv_func_gnugettext]gt_api_version[_libc]) define([gt_cv_func_gnugettext_libintl], [gt_cv_func_gnugettext]gt_api_version[_libintl]) AC_CACHE_CHECK([for GNU gettext in libc], gt_cv_func_gnugettext_libc, [AC_TRY_LINK([#include ]ifelse([$2], [need-formatstring-macros], [#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 ], [])[extern int _nl_msg_cat_cntr; extern int *_nl_domain_bindings;], [bindtextdomain ("", ""); return (int) gettext ("")]ifelse([$2], [need-ngettext], [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_domain_bindings], gt_cv_func_gnugettext_libc=yes, gt_cv_func_gnugettext_libc=no)]) if test "$gt_cv_func_gnugettext_libc" != "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_cv_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 ]ifelse([$2], [need-formatstring-macros], [#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 ], [])[extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias ();], [bindtextdomain ("", ""); return (int) gettext ("")]ifelse([$2], [need-ngettext], [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_expand_alias (0)], gt_cv_func_gnugettext_libintl=yes, gt_cv_func_gnugettext_libintl=no) dnl Now see whether libintl exists and depends on libiconv. if test "$gt_cv_func_gnugettext_libintl" != yes && test -n "$LIBICONV"; then LIBS="$LIBS $LIBICONV" AC_TRY_LINK([#include ]ifelse([$2], [need-formatstring-macros], [#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 ], [])[extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias ();], [bindtextdomain ("", ""); return (int) gettext ("")]ifelse([$2], [need-ngettext], [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_expand_alias (0)], [LIBINTL="$LIBINTL $LIBICONV" LTLIBINTL="$LTLIBINTL $LTLIBICONV" gt_cv_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 test "$gt_cv_func_gnugettext_libc" = "yes" \ || { test "$gt_cv_func_gnugettext_libintl" = "yes" \ && test "$PACKAGE" != gettext; }; 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. INTLOBJS="\$(GETTOBJS)" BUILD_INCLUDED_LIBINTL=yes USE_INCLUDED_LIBINTL=yes LIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LIBICONV" LTLIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LTLIBICONV" LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'` fi 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 "$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 if test "$USE_NLS" = "yes"; then if test "$gt_use_preinstalled_gnugettext" = "yes"; then if test "$gt_cv_func_gnugettext_libintl" = "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; 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) AC_SUBST(INTLOBJS) 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 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 Checks for all prerequisites of the po subdirectory, dnl except for USE_NLS. AC_DEFUN([AM_PO_SUBDIRS], [ AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl AC_REQUIRE([AM_MKINSTALLDIRS])dnl 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 >/dev/null 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 Search for GNU xgettext 0.11 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= /dev/null >/dev/null 2>&1 && (if $ac_dir/$ac_word --omit-header --copyright-holder= /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 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 >/dev/null 2>&1], :) dnl This could go away some day; the PATH_PROG_WITH_TEST already does it. dnl Test whether we really found GNU msgfmt. if test "$GMSGFMT" != ":"; then dnl If it is no GNU msgfmt we define it as : so that the dnl Makefiles still can work. if $GMSGFMT --statistics /dev/null >/dev/null 2>&1 && (if $GMSGFMT --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then : ; else GMSGFMT=`echo "$GMSGFMT" | sed -e 's,^.*/,,'` AC_MSG_RESULT( [found $GMSGFMT program is not GNU msgfmt; ignore it]) GMSGFMT=":" fi fi dnl This could go away some day; the PATH_PROG_WITH_TEST already does it. dnl Test whether we really found GNU xgettext. if test "$XGETTEXT" != ":"; then dnl If it is no GNU xgettext we define it as : so that the dnl Makefiles still can work. if $XGETTEXT --omit-header --copyright-holder= /dev/null >/dev/null 2>&1 && (if $XGETTEXT --omit-header --copyright-holder= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then : ; else AC_MSG_RESULT( [found xgettext program is not GNU xgettext; ignore it]) XGETTEXT=":" fi dnl Remove leftover from FreeBSD xgettext call. rm -f messages.po fi AC_OUTPUT_COMMANDS([ 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 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" # ALL_LINGUAS, POFILES, GMOFILES, UPDATEPOFILES, DUMMYPOFILES 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 "$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" "$ac_given_srcdir/$ac_dir/LINGUAS"` # Hide the ALL_LINGUAS assigment from automake. eval 'ALL_LINGUAS''=$ALL_LINGUAS_' fi case "$ac_given_srcdir" in .) srcdirpre= ;; *) srcdirpre='$(srcdir)/' ;; esac POFILES= GMOFILES= UPDATEPOFILES= DUMMYPOFILES= for lang in $ALL_LINGUAS; do POFILES="$POFILES $srcdirpre$lang.po" GMOFILES="$GMOFILES $srcdirpre$lang.gmo" UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" DUMMYPOFILES="$DUMMYPOFILES $lang.nop" 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|@GMOFILES@|$GMOFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@CATALOGS@|$CATALOGS|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, GMOFILES, UPDATEPOFILES, DUMMYPOFILES, CATALOGS. But hide it # from automake. eval 'ALL_LINGUAS''="$ALL_LINGUAS"' # Capture the value of LINGUAS because we need it to compute CATALOGS. LINGUAS="${LINGUAS-%UNSET%}" ]) ]) dnl Checks for all prerequisites of the intl subdirectory, dnl except for INTL_LIBTOOL_SUFFIX_PREFIX (and possibly LIBTOOL), INTLOBJS, dnl USE_INCLUDED_LIBINTL, BUILD_INCLUDED_LIBINTL. AC_DEFUN([AM_INTL_SUBDIR], [ AC_REQUIRE([AC_PROG_INSTALL])dnl AC_REQUIRE([AM_MKINSTALLDIRS])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_PROG_RANLIB])dnl AC_REQUIRE([AC_ISC_POSIX])dnl AC_REQUIRE([AC_HEADER_STDC])dnl AC_REQUIRE([AC_C_CONST])dnl AC_REQUIRE([AC_C_INLINE])dnl AC_REQUIRE([AC_TYPE_OFF_T])dnl AC_REQUIRE([AC_TYPE_SIZE_T])dnl AC_REQUIRE([AC_FUNC_ALLOCA])dnl AC_REQUIRE([AC_FUNC_MMAP])dnl AC_REQUIRE([jm_GLIBC21])dnl AC_REQUIRE([gt_INTDIV0])dnl AC_REQUIRE([jm_AC_TYPE_UINTMAX_T])dnl AC_REQUIRE([gt_HEADER_INTTYPES_H])dnl AC_REQUIRE([gt_INTTYPES_PRI])dnl AC_CHECK_HEADERS([argz.h limits.h locale.h nl_types.h malloc.h stddef.h \ stdlib.h string.h unistd.h sys/param.h]) AC_CHECK_FUNCS([feof_unlocked fgets_unlocked getc_unlocked getcwd getegid \ geteuid getgid getuid mempcpy munmap putenv setenv setlocale stpcpy \ strcasecmp strdup strtoul tsearch __argz_count __argz_stringify __argz_next]) AM_ICONV AM_LANGINFO_CODESET if test $ac_cv_header_locale_h = yes; then AM_LC_MESSAGES fi dnl intl/plural.c is generated from intl/plural.y. It requires bison, dnl because plural.y uses bison specific features. It requires at least dnl bison-1.26 because earlier versions generate a plural.c that doesn't dnl compile. dnl bison is only needed for the maintainer (who touches plural.y). But in dnl order to avoid separate Makefiles or --enable-maintainer-mode, we put dnl the rule in general Makefile. Now, some people carelessly touch the dnl files or have a broken "make" program, hence the plural.c rule will dnl sometimes fire. To avoid an error, defines BISON to ":" if it is not dnl present or too old. AC_CHECK_PROGS([INTLBISON], [bison]) if test -z "$INTLBISON"; then ac_verc_fail=yes else dnl Found it, now check the version. AC_MSG_CHECKING([version of bison]) changequote(<<,>>)dnl ac_prog_version=`$INTLBISON --version 2>&1 | sed -n 's/^.*GNU Bison.* \([0-9]*\.[0-9.]*\).*$/\1/p'` case $ac_prog_version in '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;; 1.2[6-9]* | 1.[3-9][0-9]* | [2-9].*) changequote([,])dnl ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;; *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;; esac AC_MSG_RESULT([$ac_prog_version]) fi if test $ac_verc_fail = yes; then INTLBISON=: fi ]) AC_DEFUN([AM_MKINSTALLDIRS], [ dnl If the AC_CONFIG_AUX_DIR macro for autoconf is used we possibly dnl find the mkinstalldirs script in another subdir but $(top_srcdir). dnl Try to locate is. MKINSTALLDIRS= if test -n "$ac_aux_dir"; then MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" fi if test -z "$MKINSTALLDIRS"; then MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs" fi AC_SUBST(MKINSTALLDIRS) ]) dnl Usage: AM_GNU_GETTEXT_VERSION([gettext-version]) AC_DEFUN([AM_GNU_GETTEXT_VERSION], []) mhwaveedit-1.4.24/m4/glibc21.m4000066400000000000000000000017271334022513400157500ustar00rootroot00000000000000# glibc21.m4 serial 2 (fileutils-4.1.3, gettext-0.10.40) dnl Copyright (C) 2000-2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. # Test for the GNU C Library, version 2.1 or newer. # From Bruno Haible. AC_DEFUN([jm_GLIBC21], [ AC_CACHE_CHECK(whether we are using the GNU C Library 2.1 or newer, ac_cv_gnu_library_2_1, [AC_EGREP_CPP([Lucky GNU user], [ #include #ifdef __GNU_LIBRARY__ #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) || (__GLIBC__ > 2) Lucky GNU user #endif #endif ], ac_cv_gnu_library_2_1=yes, ac_cv_gnu_library_2_1=no) ] ) AC_SUBST(GLIBC21) GLIBC21="$ac_cv_gnu_library_2_1" ] ) mhwaveedit-1.4.24/m4/gtk.m4000066400000000000000000000201351334022513400153040ustar00rootroot00000000000000# Configure paths for GTK+ # Owen Taylor 97-11-3 dnl AM_PATH_GTK([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND [, MODULES]]]]) dnl Test for GTK, and define GTK_CFLAGS and GTK_LIBS dnl AC_DEFUN(AM_PATH_GTK, [dnl dnl Get the cflags and libraries from the gtk-config script dnl AC_ARG_WITH(gtk-prefix,[ --with-gtk-prefix=PFX Prefix where GTK is installed (optional)], gtk_config_prefix="$withval", gtk_config_prefix="") AC_ARG_WITH(gtk-exec-prefix,[ --with-gtk-exec-prefix=PFX Exec prefix where GTK is installed (optional)], gtk_config_exec_prefix="$withval", gtk_config_exec_prefix="") AC_ARG_ENABLE(gtktest, [ --disable-gtktest Do not try to compile and run a test GTK program], , enable_gtktest=yes) for module in . $4 do case "$module" in gthread) gtk_config_args="$gtk_config_args gthread" ;; esac done if test x$gtk_config_exec_prefix != x ; then gtk_config_args="$gtk_config_args --exec-prefix=$gtk_config_exec_prefix" if test x${GTK_CONFIG+set} != xset ; then GTK_CONFIG=$gtk_config_exec_prefix/bin/gtk-config fi fi if test x$gtk_config_prefix != x ; then gtk_config_args="$gtk_config_args --prefix=$gtk_config_prefix" if test x${GTK_CONFIG+set} != xset ; then GTK_CONFIG=$gtk_config_prefix/bin/gtk-config fi fi AC_PATH_PROG(GTK_CONFIG, gtk-config, no) min_gtk_version=ifelse([$1], ,0.99.7,$1) AC_MSG_CHECKING(for GTK - version >= $min_gtk_version) no_gtk="" if test "$GTK_CONFIG" = "no" ; then no_gtk=yes else GTK_CFLAGS=`$GTK_CONFIG $gtk_config_args --cflags` GTK_LIBS=`$GTK_CONFIG $gtk_config_args --libs` gtk_config_major_version=`$GTK_CONFIG $gtk_config_args --version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` gtk_config_minor_version=`$GTK_CONFIG $gtk_config_args --version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` gtk_config_micro_version=`$GTK_CONFIG $gtk_config_args --version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` if test "x$enable_gtktest" = "xyes" ; then ac_save_CFLAGS="$CFLAGS" ac_save_LIBS="$LIBS" CFLAGS="$CFLAGS $GTK_CFLAGS" LIBS="$GTK_LIBS $LIBS" dnl dnl Now check if the installed GTK is sufficiently new. (Also sanity dnl checks the results of gtk-config to some extent dnl rm -f conf.gtktest AC_TRY_RUN([ #include #include #include int main () { int major, minor, micro; char *tmp_version; system ("touch conf.gtktest"); /* HP/UX 9 (%@#!) writes to sscanf strings */ tmp_version = g_strdup("$min_gtk_version"); if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { printf("%s, bad version string\n", "$min_gtk_version"); exit(1); } if ((gtk_major_version != $gtk_config_major_version) || (gtk_minor_version != $gtk_config_minor_version) || (gtk_micro_version != $gtk_config_micro_version)) { printf("\n*** 'gtk-config --version' returned %d.%d.%d, but GTK+ (%d.%d.%d)\n", $gtk_config_major_version, $gtk_config_minor_version, $gtk_config_micro_version, gtk_major_version, gtk_minor_version, gtk_micro_version); printf ("*** was found! If gtk-config was correct, then it is best\n"); printf ("*** to remove the old version of GTK+. You may also be able to fix the error\n"); printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n"); printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n"); printf("*** required on your system.\n"); printf("*** If gtk-config was wrong, set the environment variable GTK_CONFIG\n"); printf("*** to point to the correct copy of gtk-config, and remove the file config.cache\n"); printf("*** before re-running configure\n"); } #if defined (GTK_MAJOR_VERSION) && defined (GTK_MINOR_VERSION) && defined (GTK_MICRO_VERSION) else if ((gtk_major_version != GTK_MAJOR_VERSION) || (gtk_minor_version != GTK_MINOR_VERSION) || (gtk_micro_version != GTK_MICRO_VERSION)) { printf("*** GTK+ header files (version %d.%d.%d) do not match\n", GTK_MAJOR_VERSION, GTK_MINOR_VERSION, GTK_MICRO_VERSION); printf("*** library (version %d.%d.%d)\n", gtk_major_version, gtk_minor_version, gtk_micro_version); } #endif /* defined (GTK_MAJOR_VERSION) ... */ else { if ((gtk_major_version > major) || ((gtk_major_version == major) && (gtk_minor_version > minor)) || ((gtk_major_version == major) && (gtk_minor_version == minor) && (gtk_micro_version >= micro))) { return 0; } else { printf("\n*** An old version of GTK+ (%d.%d.%d) was found.\n", gtk_major_version, gtk_minor_version, gtk_micro_version); printf("*** You need a version of GTK+ newer than %d.%d.%d. The latest version of\n", major, minor, micro); printf("*** GTK+ is always available from ftp://ftp.gtk.org.\n"); printf("***\n"); printf("*** If you have already installed a sufficiently new version, this error\n"); printf("*** probably means that the wrong copy of the gtk-config shell script is\n"); printf("*** being found. The easiest way to fix this is to remove the old version\n"); printf("*** of GTK+, but you can also set the GTK_CONFIG environment to point to the\n"); printf("*** correct copy of gtk-config. (In this case, you will have to\n"); printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n"); printf("*** so that the correct libraries are found at run-time))\n"); } } return 1; } ],, no_gtk=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi fi if test "x$no_gtk" = x ; then AC_MSG_RESULT(yes) ifelse([$2], , :, [$2]) else AC_MSG_RESULT(no) if test "$GTK_CONFIG" = "no" ; then echo "*** The gtk-config script installed by GTK could not be found" echo "*** If GTK was installed in PREFIX, make sure PREFIX/bin is in" echo "*** your path, or set the GTK_CONFIG environment variable to the" echo "*** full path to gtk-config." else if test -f conf.gtktest ; then : else echo "*** Could not run GTK test program, checking why..." CFLAGS="$CFLAGS $GTK_CFLAGS" LIBS="$LIBS $GTK_LIBS" AC_TRY_LINK([ #include #include ], [ return ((gtk_major_version) || (gtk_minor_version) || (gtk_micro_version)); ], [ echo "*** The test program compiled, but did not run. This usually means" echo "*** that the run-time linker is not finding GTK or finding the wrong" echo "*** version of GTK. If it is not finding GTK, you'll need to set your" echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" echo "*** to the installed location Also, make sure you have run ldconfig if that" echo "*** is required on your system" echo "***" echo "*** If you have an old version installed, it is best to remove it, although" echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH" echo "***" echo "*** If you have a RedHat 5.0 system, you should remove the GTK package that" echo "*** came with the system with the command" echo "***" echo "*** rpm --erase --nodeps gtk gtk-devel" ], [ echo "*** The test program failed to compile or link. See the file config.log for the" echo "*** exact error that occured. This usually means GTK was incorrectly installed" echo "*** or that you have moved GTK since it was installed. In the latter case, you" echo "*** may want to edit the gtk-config script: $GTK_CONFIG" ]) CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi fi GTK_CFLAGS="" GTK_LIBS="" ifelse([$3], , :, [$3]) fi AC_SUBST(GTK_CFLAGS) AC_SUBST(GTK_LIBS) rm -f conf.gtktest ]) mhwaveedit-1.4.24/m4/iconv.m4000066400000000000000000000066531334022513400156460ustar00rootroot00000000000000# iconv.m4 serial AM4 (gettext-0.11.3) dnl Copyright (C) 2000-2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. 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). 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_DEFINE(HAVE_ICONV, 1, [Define if you have the iconv() function.]) 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 ]) mhwaveedit-1.4.24/m4/intdiv0.m4000066400000000000000000000035651334022513400161040ustar00rootroot00000000000000# intdiv0.m4 serial 1 (gettext-0.11.3) dnl Copyright (C) 2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl From Bruno Haible. AC_DEFUN([gt_INTDIV0], [ AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_CACHE_CHECK([whether integer division by zero raises SIGFPE], gt_cv_int_divbyzero_sigfpe, [ AC_TRY_RUN([ #include #include static void #ifdef __cplusplus sigfpe_handler (int sig) #else sigfpe_handler (sig) int sig; #endif { /* Exit with code 0 if SIGFPE, with code 1 if any other signal. */ exit (sig != SIGFPE); } int x = 1; int y = 0; int z; int nan; int main () { signal (SIGFPE, sigfpe_handler); /* IRIX and AIX (when "xlc -qcheck" is used) yield signal SIGTRAP. */ #if (defined (__sgi) || defined (_AIX)) && defined (SIGTRAP) signal (SIGTRAP, sigfpe_handler); #endif /* Linux/SPARC yields signal SIGILL. */ #if defined (__sparc__) && defined (__linux__) signal (SIGILL, sigfpe_handler); #endif z = x / y; nan = y / y; exit (1); } ], gt_cv_int_divbyzero_sigfpe=yes, gt_cv_int_divbyzero_sigfpe=no, [ # Guess based on the CPU. case "$host_cpu" in alpha* | i[34567]86 | m68k | s390*) gt_cv_int_divbyzero_sigfpe="guessing yes";; *) gt_cv_int_divbyzero_sigfpe="guessing no";; esac ]) ]) case "$gt_cv_int_divbyzero_sigfpe" in *yes) value=1;; *) value=0;; esac AC_DEFINE_UNQUOTED(INTDIV0_RAISES_SIGFPE, $value, [Define if integer division by zero raises signal SIGFPE.]) ]) mhwaveedit-1.4.24/m4/inttypes-pri.m4000066400000000000000000000022271334022513400171700ustar00rootroot00000000000000# inttypes-pri.m4 serial 1 (gettext-0.11.4) dnl Copyright (C) 1997-2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl From Bruno Haible. # Define PRI_MACROS_BROKEN if exists and defines the PRI* # macros to non-string values. This is the case on AIX 4.3.3. AC_DEFUN([gt_INTTYPES_PRI], [ AC_REQUIRE([gt_HEADER_INTTYPES_H]) if test $gt_cv_header_inttypes_h = yes; then AC_CACHE_CHECK([whether the inttypes.h PRIxNN macros are broken], gt_cv_inttypes_pri_broken, [ AC_TRY_COMPILE([#include #ifdef PRId32 char *p = PRId32; #endif ], [], gt_cv_inttypes_pri_broken=no, gt_cv_inttypes_pri_broken=yes) ]) fi if test "$gt_cv_inttypes_pri_broken" = yes; then AC_DEFINE_UNQUOTED(PRI_MACROS_BROKEN, 1, [Define if exists and defines unusable PRI* macros.]) fi ]) mhwaveedit-1.4.24/m4/inttypes.m4000066400000000000000000000017171334022513400164030ustar00rootroot00000000000000# inttypes.m4 serial 1 (gettext-0.11.4) dnl Copyright (C) 1997-2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl From Paul Eggert. # Define HAVE_INTTYPES_H if exists and doesn't clash with # . AC_DEFUN([gt_HEADER_INTTYPES_H], [ AC_CACHE_CHECK([for inttypes.h], gt_cv_header_inttypes_h, [ AC_TRY_COMPILE( [#include #include ], [], gt_cv_header_inttypes_h=yes, gt_cv_header_inttypes_h=no) ]) if test $gt_cv_header_inttypes_h = yes; then AC_DEFINE_UNQUOTED(HAVE_INTTYPES_H, 1, [Define if exists and doesn't clash with .]) fi ]) mhwaveedit-1.4.24/m4/inttypes_h.m4000066400000000000000000000020731334022513400167060ustar00rootroot00000000000000# inttypes_h.m4 serial 4 (gettext-0.11.4) dnl Copyright (C) 1997-2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl From Paul Eggert. # Define HAVE_INTTYPES_H_WITH_UINTMAX if exists, # doesn't clash with , and declares uintmax_t. AC_DEFUN([jm_AC_HEADER_INTTYPES_H], [ AC_CACHE_CHECK([for inttypes.h], jm_ac_cv_header_inttypes_h, [AC_TRY_COMPILE( [#include #include ], [uintmax_t i = (uintmax_t) -1;], jm_ac_cv_header_inttypes_h=yes, jm_ac_cv_header_inttypes_h=no)]) if test $jm_ac_cv_header_inttypes_h = yes; then AC_DEFINE_UNQUOTED(HAVE_INTTYPES_H_WITH_UINTMAX, 1, [Define if exists, doesn't clash with , and declares uintmax_t. ]) fi ]) mhwaveedit-1.4.24/m4/isc-posix.m4000066400000000000000000000021331334022513400164330ustar00rootroot00000000000000# isc-posix.m4 serial 2 (gettext-0.11.2) dnl Copyright (C) 1995-2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. # This file is not needed with autoconf-2.53 and newer. Remove it in 2005. # This test replaces the one in autoconf. # Currently this macro should have the same name as the autoconf macro # because gettext's gettext.m4 (distributed in the automake package) # still uses it. Otherwise, the use in gettext.m4 makes autoheader # give these diagnostics: # configure.in:556: AC_TRY_COMPILE was called before AC_ISC_POSIX # configure.in:556: AC_TRY_RUN was called before AC_ISC_POSIX undefine([AC_ISC_POSIX]) AC_DEFUN([AC_ISC_POSIX], [ dnl This test replaces the obsolescent AC_ISC_POSIX kludge. AC_CHECK_LIB(cposix, strerror, [LIBS="$LIBS -lcposix"]) ] ) mhwaveedit-1.4.24/m4/lcmessage.m4000066400000000000000000000026161334022513400164660ustar00rootroot00000000000000# lcmessage.m4 serial 3 (gettext-0.11.3) dnl Copyright (C) 1995-2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. 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. # Check whether LC_MESSAGES is available in . AC_DEFUN([AM_LC_MESSAGES], [ AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES, [AC_TRY_LINK([#include ], [return LC_MESSAGES], am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)]) if test $am_cv_val_LC_MESSAGES = yes; then AC_DEFINE(HAVE_LC_MESSAGES, 1, [Define if your file defines LC_MESSAGES.]) fi ]) mhwaveedit-1.4.24/m4/lib-ld.m4000066400000000000000000000062601334022513400156650ustar00rootroot00000000000000# lib-ld.m4 serial 1 (gettext-0.11) dnl Copyright (C) 1996-2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. 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. if $LD -v 2>&1 &5; then acl_cv_prog_gnu_ld=yes else acl_cv_prog_gnu_ld=no fi]) with_gnu_ld=$acl_cv_prog_gnu_ld ]) dnl From libtool-1.4. Sets the variable LD. AC_DEFUN([AC_LIB_PROG_LD], [AC_ARG_WITH(gnu-ld, [ --with-gnu-ld assume the C compiler uses GNU ld [default=no]], test "$withval" = no || with_gnu_ld=yes, with_gnu_ld=no) AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl 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. if "$acl_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then test "$with_gnu_ld" != no && break else test "$with_gnu_ld" != yes && break fi 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 ]) mhwaveedit-1.4.24/m4/lib-link.m4000066400000000000000000000556331334022513400162330ustar00rootroot00000000000000# lib-link.m4 serial 3 (gettext-0.11.3) dnl Copyright (C) 2001-2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl From Bruno Haible. 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. 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" ]) LIB[]NAME="$ac_cv_lib[]Name[]_libs" LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs" INC[]NAME="$ac_cv_lib[]Name[]_cppflags" AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) AC_SUBST([LIB]NAME) AC_SUBST([LTLIB]NAME) 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. 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= fi AC_SUBST([HAVE_LIB]NAME) AC_SUBST([LIB]NAME) AC_SUBST([LTLIB]NAME) undefine([Name]) undefine([NAME]) ]) dnl Determine the platform dependent parameters needed to use rpath: dnl libext, shlibext, hardcode_libdir_flag_spec, hardcode_libdir_separator, dnl hardcode_direct, hardcode_minus_L, dnl sys_lib_search_path_spec, sys_lib_dlsearch_path_spec. AC_DEFUN([AC_LIB_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" libext="$acl_cv_libext" shlibext="$acl_cv_shlibext" hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" hardcode_direct="$acl_cv_hardcode_direct" hardcode_minus_L="$acl_cv_hardcode_minus_L" sys_lib_search_path_spec="$acl_cv_sys_lib_search_path_spec" sys_lib_dlsearch_path_spec="$acl_cv_sys_lib_dlsearch_path_spec" 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. AC_DEFUN([AC_LIB_LINKFLAGS_BODY], [ define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) 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_ARG_WITH([lib$1-prefix], [ --with-lib$1-prefix[=DIR] search for lib$1 in DIR/include and DIR/lib --without-lib$1-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/lib" 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= 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= if test $use_additional = yes; then if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then found_dir="$additional_libdir" found_so="$additional_libdir/lib$name.$shlibext" if test -f "$additional_libdir/lib$name.la"; then found_la="$additional_libdir/lib$name.la" fi else if test -f "$additional_libdir/lib$name.$libext"; then found_dir="$additional_libdir" found_a="$additional_libdir/lib$name.$libext" if test -f "$additional_libdir/lib$name.la"; then found_la="$additional_libdir/lib$name.la" fi 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//'` if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then found_dir="$dir" found_so="$dir/lib$name.$shlibext" if test -f "$dir/lib$name.la"; then found_la="$dir/lib$name.la" fi else if test -f "$dir/lib$name.$libext"; then found_dir="$dir" found_a="$dir/lib$name.$libext" if test -f "$dir/lib$name.la"; then found_la="$dir/lib$name.la" fi 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/lib"; 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 "$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 "$hardcode_libdir_flag_spec" && test "$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 "$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 $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 */lib | */lib/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'` 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*) 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/lib"; then haveit= if test "X$additional_libdir" = "X/usr/local/lib"; then if test -n "$GCC"; then case $host_os in linux*) 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 "$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:+$hardcode_libdir_separator}$found_dir" done dnl Note: hardcode_libdir_flag_spec uses $libdir and $wl. acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$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=\"$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 ]) mhwaveedit-1.4.24/m4/lib-prefix.m4000066400000000000000000000117551334022513400165700ustar00rootroot00000000000000# lib-prefix.m4 serial 1 (gettext-0.11) dnl Copyright (C) 2001-2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl From Bruno Haible. 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_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_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/lib" 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*) 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/lib"; 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/lib"; 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" ]) mhwaveedit-1.4.24/m4/progtest.m4000066400000000000000000000040741334022513400163720ustar00rootroot00000000000000# progtest.m4 serial 2 (gettext-0.10.40) dnl Copyright (C) 1996-2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. 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 , 1996. # 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], [# 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. ;; *) IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" for ac_dir in ifelse([$5], , $PATH, [$5]); do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then if [$3]; then ac_cv_path_$1="$ac_dir/$ac_word" break fi fi 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 ]) mhwaveedit-1.4.24/m4/sdl.m4000066400000000000000000000145421334022513400153060ustar00rootroot00000000000000# Configure paths for SDL # Sam Lantinga 9/21/99 # stolen from Manish Singh # stolen back from Frank Belew # stolen from Manish Singh # Shamelessly stolen from Owen Taylor dnl AM_PATH_SDL([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]]) dnl Test for SDL, and define SDL_CFLAGS and SDL_LIBS dnl AC_DEFUN([AM_PATH_SDL], [dnl dnl Get the cflags and libraries from the sdl-config script dnl AC_ARG_WITH(sdl-prefix,[ --with-sdl-prefix=PFX Prefix where SDL is installed (optional)], sdl_prefix="$withval", sdl_prefix="") AC_ARG_WITH(sdl-exec-prefix,[ --with-sdl-exec-prefix=PFX Exec prefix where SDL is installed (optional)], sdl_exec_prefix="$withval", sdl_exec_prefix="") AC_ARG_ENABLE(sdltest, [ --disable-sdltest Do not try to compile and run a test SDL program], , enable_sdltest=yes) if test x$sdl_exec_prefix != x ; then sdl_config_args="$sdl_config_args --exec-prefix=$sdl_exec_prefix" if test x${SDL_CONFIG+set} != xset ; then SDL_CONFIG=$sdl_exec_prefix/bin/sdl-config fi fi if test x$sdl_prefix != x ; then sdl_config_args="$sdl_config_args --prefix=$sdl_prefix" if test x${SDL_CONFIG+set} != xset ; then SDL_CONFIG=$sdl_prefix/bin/sdl-config fi fi as_save_PATH="$PATH" if test "x$prefix" != xNONE; then PATH="$prefix/bin:$prefix/usr/bin:$PATH" fi AC_PATH_PROG(SDL_CONFIG, sdl-config, no, [$PATH]) PATH="$as_save_PATH" min_sdl_version=ifelse([$1], ,0.11.0,$1) AC_MSG_CHECKING(for SDL - version >= $min_sdl_version) no_sdl="" if test "$SDL_CONFIG" = "no" ; then no_sdl=yes else SDL_CFLAGS=`$SDL_CONFIG $sdl_config_args --cflags` SDL_LIBS=`$SDL_CONFIG $sdl_config_args --libs` sdl_major_version=`$SDL_CONFIG $sdl_config_args --version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` sdl_minor_version=`$SDL_CONFIG $sdl_config_args --version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` sdl_micro_version=`$SDL_CONFIG $sdl_config_args --version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` if test "x$enable_sdltest" = "xyes" ; then ac_save_CFLAGS="$CFLAGS" ac_save_CXXFLAGS="$CXXFLAGS" ac_save_LIBS="$LIBS" CFLAGS="$CFLAGS $SDL_CFLAGS" CXXFLAGS="$CXXFLAGS $SDL_CFLAGS" LIBS="$LIBS $SDL_LIBS" dnl dnl Now check if the installed SDL is sufficiently new. (Also sanity dnl checks the results of sdl-config to some extent dnl rm -f conf.sdltest AC_TRY_RUN([ #include #include #include #include "SDL.h" char* my_strdup (char *str) { char *new_str; if (str) { new_str = (char *)malloc ((strlen (str) + 1) * sizeof(char)); strcpy (new_str, str); } else new_str = NULL; return new_str; } int main (int argc, char *argv[]) { int major, minor, micro; char *tmp_version; /* This hangs on some systems (?) system ("touch conf.sdltest"); */ { FILE *fp = fopen("conf.sdltest", "a"); if ( fp ) fclose(fp); } /* HP/UX 9 (%@#!) writes to sscanf strings */ tmp_version = my_strdup("$min_sdl_version"); if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { printf("%s, bad version string\n", "$min_sdl_version"); exit(1); } if (($sdl_major_version > major) || (($sdl_major_version == major) && ($sdl_minor_version > minor)) || (($sdl_major_version == major) && ($sdl_minor_version == minor) && ($sdl_micro_version >= micro))) { return 0; } else { printf("\n*** 'sdl-config --version' returned %d.%d.%d, but the minimum version\n", $sdl_major_version, $sdl_minor_version, $sdl_micro_version); printf("*** of SDL required is %d.%d.%d. If sdl-config is correct, then it is\n", major, minor, micro); printf("*** best to upgrade to the required version.\n"); printf("*** If sdl-config was wrong, set the environment variable SDL_CONFIG\n"); printf("*** to point to the correct copy of sdl-config, and remove the file\n"); printf("*** config.cache before re-running configure\n"); return 1; } } ],, no_sdl=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) CFLAGS="$ac_save_CFLAGS" CXXFLAGS="$ac_save_CXXFLAGS" LIBS="$ac_save_LIBS" fi fi if test "x$no_sdl" = x ; then AC_MSG_RESULT(yes) ifelse([$2], , :, [$2]) else AC_MSG_RESULT(no) if test "$SDL_CONFIG" = "no" ; then echo "*** The sdl-config script installed by SDL could not be found" echo "*** If SDL was installed in PREFIX, make sure PREFIX/bin is in" echo "*** your path, or set the SDL_CONFIG environment variable to the" echo "*** full path to sdl-config." else if test -f conf.sdltest ; then : else echo "*** Could not run SDL test program, checking why..." CFLAGS="$CFLAGS $SDL_CFLAGS" CXXFLAGS="$CXXFLAGS $SDL_CFLAGS" LIBS="$LIBS $SDL_LIBS" AC_TRY_LINK([ #include #include "SDL.h" int main(int argc, char *argv[]) { return 0; } #undef main #define main K_and_R_C_main ], [ return 0; ], [ echo "*** The test program compiled, but did not run. This usually means" echo "*** that the run-time linker is not finding SDL or finding the wrong" echo "*** version of SDL. If it is not finding SDL, you'll need to set your" echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" echo "*** to the installed location Also, make sure you have run ldconfig if that" echo "*** is required on your system" echo "***" echo "*** If you have an old version installed, it is best to remove it, although" echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"], [ echo "*** The test program failed to compile or link. See the file config.log for the" echo "*** exact error that occured. This usually means SDL was incorrectly installed" echo "*** or that you have moved SDL since it was installed. In the latter case, you" echo "*** may want to edit the sdl-config script: $SDL_CONFIG" ]) CFLAGS="$ac_save_CFLAGS" CXXFLAGS="$ac_save_CXXFLAGS" LIBS="$ac_save_LIBS" fi fi SDL_CFLAGS="" SDL_LIBS="" ifelse([$3], , :, [$3]) fi AC_SUBST(SDL_CFLAGS) AC_SUBST(SDL_LIBS) rm -f conf.sdltest ]) mhwaveedit-1.4.24/m4/stdint_h.m4000066400000000000000000000020431334022513400163310ustar00rootroot00000000000000# stdint_h.m4 serial 2 (gettext-0.11.4) dnl Copyright (C) 1997-2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl From Paul Eggert. # Define HAVE_STDINT_H_WITH_UINTMAX if exists, # doesn't clash with , and declares uintmax_t. AC_DEFUN([jm_AC_HEADER_STDINT_H], [ AC_CACHE_CHECK([for stdint.h], jm_ac_cv_header_stdint_h, [AC_TRY_COMPILE( [#include #include ], [uintmax_t i = (uintmax_t) -1;], jm_ac_cv_header_stdint_h=yes, jm_ac_cv_header_stdint_h=no)]) if test $jm_ac_cv_header_stdint_h = yes; then AC_DEFINE_UNQUOTED(HAVE_STDINT_H_WITH_UINTMAX, 1, [Define if exists, doesn't clash with , and declares uintmax_t. ]) fi ]) mhwaveedit-1.4.24/m4/uintmax_t.m4000066400000000000000000000021141334022513400165240ustar00rootroot00000000000000# uintmax_t.m4 serial 6 (gettext-0.11) dnl Copyright (C) 1997-2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl From Paul Eggert. AC_PREREQ(2.13) # Define uintmax_t to `unsigned long' or `unsigned long long' # if does not exist. AC_DEFUN([jm_AC_TYPE_UINTMAX_T], [ AC_REQUIRE([jm_AC_HEADER_INTTYPES_H]) AC_REQUIRE([jm_AC_HEADER_STDINT_H]) if test $jm_ac_cv_header_inttypes_h = no && test $jm_ac_cv_header_stdint_h = no; then AC_REQUIRE([jm_AC_TYPE_UNSIGNED_LONG_LONG]) test $ac_cv_type_unsigned_long_long = yes \ && ac_type='unsigned long long' \ || ac_type='unsigned long' AC_DEFINE_UNQUOTED(uintmax_t, $ac_type, [Define to unsigned long or unsigned long long if and don't define.]) fi ]) mhwaveedit-1.4.24/m4/ulonglong.m4000066400000000000000000000020001334022513400165120ustar00rootroot00000000000000# ulonglong.m4 serial 2 (fileutils-4.0.32, gettext-0.10.40) dnl Copyright (C) 1999-2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl From Paul Eggert. AC_DEFUN([jm_AC_TYPE_UNSIGNED_LONG_LONG], [ AC_CACHE_CHECK([for unsigned long long], ac_cv_type_unsigned_long_long, [AC_TRY_LINK([unsigned long long ull = 1; int i = 63;], [unsigned long long ullmax = (unsigned long long) -1; return ull << i | ull >> i | ullmax / ull | ullmax % ull;], ac_cv_type_unsigned_long_long=yes, ac_cv_type_unsigned_long_long=no)]) if test $ac_cv_type_unsigned_long_long = yes; then AC_DEFINE(HAVE_UNSIGNED_LONG_LONG, 1, [Define if you have the unsigned long long type.]) fi ]) mhwaveedit-1.4.24/mhwaveedit.1000066400000000000000000000023631334022513400161570ustar00rootroot00000000000000.TH "mhwaveedit" "1" "2010\-07\-29" .SH "NAME" mhwaveedit \- A simple and fast GTK2 sound editor .SH "SYNOPSIS" .PP .B mhwaveedit .RI "[ " options " ]" .RI "[ " "audio_file ..." " ]" .SH "DESCRIPTION" .PP This manual page documents briefly the \fBmhwaveedit\fR command. .PP .B mhwaveedit is a graphical program for editing sound files, intended to be user\-friendly and robust. .SH "OPTIONS" .\" main.c, ~ line 130\-150 .TP .BR \-\-no\-ladspa Disable LADSPA plugins .TP .BR \-\-driver " \fIalsa\fR | \fIoss\fR | \fIjack\fR | \fIpulse\fR | \fIdummy\fR" Use a specific sound driver for playback .TP .BR \-\-test Perform a test of conversion functions .TP .BR \-\-perftest Perform a conversion performance test .TP .BR \-\-help Show a short help message .TP .BR \-\-version Display the version of \fBmhwaveedit\fR .SH "AUTHOR" .PP \fBmhwaveedit\fR is Copyright (C) 2002-2010, Magnus Hjorth mhWaveEdit 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. .PP This manual page was written by Francois Wendling for the Debian GNU/Linux system (but may be used by others). mhwaveedit-1.4.24/missing000077500000000000000000000153301334022513400153350ustar00rootroot00000000000000#!/bin/sh # Common wrapper for a few potentially missing GNU programs. scriptversion=2016-01-11.22; # UTC # Copyright (C) 1996-2017 Free Software Foundation, Inc. # Originally written by Fran,cois Pinard , 1996. # 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, 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, see . # 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. if test $# -eq 0; then echo 1>&2 "Try '$0 --help' for more information" exit 1 fi case $1 in --is-lightweight) # Used by our autoconf macros to check whether the available missing # script is modern enough. exit 0 ;; --run) # Back-compat with the calling convention used by older automake. shift ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due to PROGRAM being missing or too old. Options: -h, --help display this help and exit -v, --version output version information and exit Supported PROGRAM values: aclocal autoconf autoheader autom4te automake makeinfo bison yacc flex lex help2man Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and 'g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: unknown '$1' option" echo 1>&2 "Try '$0 --help' for more information" exit 1 ;; esac # Run the given program, remember its exit status. "$@"; st=$? # If it succeeded, we are done. test $st -eq 0 && exit 0 # Also exit now if we it failed (or wasn't found), and '--version' was # passed; such an option is passed most likely to detect whether the # program is present and works. case $2 in --version|--help) exit $st;; esac # Exit code 63 means version mismatch. This often happens when the user # tries to use an ancient version of a tool on a file that requires a # minimum version. if test $st -eq 63; then msg="probably too old" elif test $st -eq 127; then # Program was missing. msg="missing on your system" else # Program was found and executed, but failed. Give up. exit $st fi perl_URL=http://www.perl.org/ flex_URL=http://flex.sourceforge.net/ gnu_software_URL=http://www.gnu.org/software program_details () { case $1 in aclocal|automake) echo "The '$1' program is part of the GNU Automake package:" echo "<$gnu_software_URL/automake>" echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/autoconf>" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; autoconf|autom4te|autoheader) echo "The '$1' program is part of the GNU Autoconf package:" echo "<$gnu_software_URL/autoconf/>" echo "It also requires GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; esac } give_advice () { # Normalize program name to check for. normalized_program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` printf '%s\n' "'$1' is $msg." configure_deps="'configure.ac' or m4 files included by 'configure.ac'" case $normalized_program in autoconf*) echo "You should only need it if you modified 'configure.ac'," echo "or m4 files included by it." program_details 'autoconf' ;; autoheader*) echo "You should only need it if you modified 'acconfig.h' or" echo "$configure_deps." program_details 'autoheader' ;; automake*) echo "You should only need it if you modified 'Makefile.am' or" echo "$configure_deps." program_details 'automake' ;; aclocal*) echo "You should only need it if you modified 'acinclude.m4' or" echo "$configure_deps." program_details 'aclocal' ;; autom4te*) echo "You might have modified some maintainer files that require" echo "the 'autom4te' program to be rebuilt." program_details 'autom4te' ;; bison*|yacc*) echo "You should only need it if you modified a '.y' file." echo "You may want to install the GNU Bison package:" echo "<$gnu_software_URL/bison/>" ;; lex*|flex*) echo "You should only need it if you modified a '.l' file." echo "You may want to install the Fast Lexical Analyzer package:" echo "<$flex_URL>" ;; help2man*) echo "You should only need it if you modified a dependency" \ "of a man page." echo "You may want to install the GNU Help2man package:" echo "<$gnu_software_URL/help2man/>" ;; makeinfo*) echo "You should only need it if you modified a '.texi' file, or" echo "any other file indirectly affecting the aspect of the manual." echo "You might want to install the Texinfo package:" echo "<$gnu_software_URL/texinfo/>" echo "The spurious makeinfo call might also be the consequence of" echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" echo "want to install GNU make:" echo "<$gnu_software_URL/make/>" ;; *) echo "You might have modified some files without having the proper" echo "tools for further handling them. Check the 'README' file, it" echo "often tells you about the needed prerequisites for installing" echo "this package. You may also peek at any GNU archive site, in" echo "case some other package contains this missing '$1' program." ;; esac } give_advice "$1" | sed -e '1s/^/WARNING: /' \ -e '2,$s/^/ /' >&2 # Propagate the correct exit status (expected to be 127 for a program # not found, 63 for a program that failed due to version mismatch). exit $st # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: mhwaveedit-1.4.24/mkinstalldirs000066400000000000000000000013251334022513400165400ustar00rootroot00000000000000#! /bin/sh # mkinstalldirs --- make directory hierarchy # Author: Noah Friedman # Created: 1993-05-16 # Public domain # $Id: mkinstalldirs,v 1.1 2005-07-12 22:49:52 magnush Exp $ errstatus=0 for file do set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` shift pathcomp= for d do pathcomp="$pathcomp$d" case "$pathcomp" in -* ) pathcomp=./$pathcomp ;; esac if test ! -d "$pathcomp"; then echo "mkdir $pathcomp" mkdir "$pathcomp" || lasterr=$? if test ! -d "$pathcomp"; then errstatus=$lasterr fi fi pathcomp="$pathcomp/" done done exit $errstatus # mkinstalldirs ends here mhwaveedit-1.4.24/po/000077500000000000000000000000001334022513400143525ustar00rootroot00000000000000mhwaveedit-1.4.24/po/LINGUAS000066400000000000000000000000331334022513400153730ustar00rootroot00000000000000ru sv fr es de zh_CN it pl mhwaveedit-1.4.24/po/Makefile.in.in000066400000000000000000000243551334022513400170350ustar00rootroot00000000000000# Makefile for PO directory in any package using GNU gettext. # Copyright (C) 1995-1997, 2000-2002 by Ulrich Drepper # # This file can be copied and used freely without restrictions. It can # be used in projects which are not available under the GNU General Public # License but which still want to provide support for the GNU gettext # functionality. # Please note that the actual code of GNU gettext is covered by the GNU # General Public License and is *not* in the public domain. PACKAGE = @PACKAGE@ VERSION = @VERSION@ SHELL = /bin/sh @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ datadir = @datadir@ localedir = $(datadir)/locale gettextsrcdir = $(datadir)/gettext/po INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ MKINSTALLDIRS = @MKINSTALLDIRS@ #mkinstalldirs = $(SHELL) `case "$(MKINSTALLDIRS)" in /*) echo "$(MKINSTALLDIRS)" ;; *) echo "$(top_builddir)/$(MKINSTALLDIRS)" ;; esac` mkinstalldirs = @MKINSTALLDIRS@ GMSGFMT = @GMSGFMT@ MSGFMT = @MSGFMT@ XGETTEXT = @XGETTEXT@ MSGMERGE = msgmerge MSGMERGE_UPDATE = @MSGMERGE@ --update MSGINIT = msginit MSGCONV = msgconv MSGFILTER = msgfilter POFILES = @POFILES@ GMOFILES = @GMOFILES@ UPDATEPOFILES = @UPDATEPOFILES@ DUMMYPOFILES = @DUMMYPOFILES@ DISTFILES.common = Makefile.in.in Makevars remove-potcdate.sin \ $(DISTFILES.common.extra1) $(DISTFILES.common.extra2) $(DISTFILES.common.extra3) DISTFILES = $(DISTFILES.common) POTFILES.in $(DOMAIN).pot \ $(POFILES) $(GMOFILES) \ $(DISTFILES.extra1) $(DISTFILES.extra2) $(DISTFILES.extra3) POTFILES = \ CATALOGS = @CATALOGS@ # Makevars gets inserted here. (Don't remove this line!) .SUFFIXES: .SUFFIXES: .po .gmo .mo .sed .sin .nop .po-update .po.mo: @echo "$(MSGFMT) -c -o $@ $<"; \ $(MSGFMT) -c -o t-$@ $< && mv t-$@ $@ .po.gmo: @lang=`echo $* | sed -e 's,.*/,,'`; \ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ echo "$${cdcmd}rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics -o $${lang}.gmo $${lang}.po"; \ cd $(srcdir) && rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics -o t-$${lang}.gmo $${lang}.po && mv t-$${lang}.gmo $${lang}.gmo .sin.sed: sed -e '/^#/d' $< > t-$@ mv t-$@ $@ all: all-@USE_NLS@ all-yes: $(CATALOGS) all-no: # Note: Target 'all' must not depend on target '$(DOMAIN).pot-update', # otherwise packages like GCC can not be built if only parts of the source # have been downloaded. $(DOMAIN).pot-update: $(POTFILES) $(srcdir)/POTFILES.in remove-potcdate.sed $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \ --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) \ --files-from=$(srcdir)/POTFILES.in \ --copyright-holder='$(COPYRIGHT_HOLDER)' test ! -f $(DOMAIN).po || { \ if test -f $(srcdir)/$(DOMAIN).pot; then \ sed -f remove-potcdate.sed < $(srcdir)/$(DOMAIN).pot > $(DOMAIN).1po && \ sed -f remove-potcdate.sed < $(DOMAIN).po > $(DOMAIN).2po && \ if cmp $(DOMAIN).1po $(DOMAIN).2po >/dev/null 2>&1; then \ rm -f $(DOMAIN).1po $(DOMAIN).2po $(DOMAIN).po; \ else \ rm -f $(DOMAIN).1po $(DOMAIN).2po $(srcdir)/$(DOMAIN).pot && \ mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ fi; \ else \ mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ fi; \ } $(srcdir)/$(DOMAIN).pot: $(MAKE) $(DOMAIN).pot-update $(POFILES): $(srcdir)/$(DOMAIN).pot @lang=`echo $@ | sed -e 's,.*/,,' -e 's/\.po$$//'`; \ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ echo "$${cdcmd}$(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot"; \ cd $(srcdir) && $(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot install: install-exec install-data install-exec: install-data: install-data-@USE_NLS@ if test "$(PACKAGE)" = "gettext"; then \ $(mkinstalldirs) $(DESTDIR)$(gettextsrcdir); \ for file in $(DISTFILES.common); do \ $(INSTALL_DATA) $(srcdir)/$$file \ $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ else \ : ; \ fi install-data-no: all install-data-yes: all $(mkinstalldirs) $(DESTDIR)$(datadir) @catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ dir=$(localedir)/$$lang/LC_MESSAGES; \ $(mkinstalldirs) $(DESTDIR)$$dir; \ if test -r $$cat; then realcat=$$cat; else realcat=$(srcdir)/$$cat; fi; \ $(INSTALL_DATA) $$realcat $(DESTDIR)$$dir/$(DOMAIN).mo; \ echo "installing $$realcat as $(DESTDIR)$$dir/$(DOMAIN).mo"; \ for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ if test -n "$$lc"; then \ if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ for file in *; do \ if test -f $$file; then \ ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ fi; \ done); \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ else \ if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ :; \ else \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ fi; \ fi; \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ ln -s ../LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ ln $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ cp -p $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ echo "installing $$realcat link as $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo"; \ fi; \ done; \ done install-strip: install installdirs: installdirs-exec installdirs-data installdirs-exec: installdirs-data: installdirs-data-@USE_NLS@ if test "$(PACKAGE)" = "gettext"; then \ $(mkinstalldirs) $(DESTDIR)$(gettextsrcdir); \ else \ : ; \ fi installdirs-data-no: installdirs-data-yes: $(mkinstalldirs) $(DESTDIR)$(datadir) @catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ dir=$(localedir)/$$lang/LC_MESSAGES; \ $(mkinstalldirs) $(DESTDIR)$$dir; \ for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ if test -n "$$lc"; then \ if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ for file in *; do \ if test -f $$file; then \ ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ fi; \ done); \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ else \ if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ :; \ else \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ fi; \ fi; \ fi; \ done; \ done # Define this as empty until I found a useful application. installcheck: uninstall: uninstall-exec uninstall-data uninstall-exec: uninstall-data: uninstall-data-@USE_NLS@ if test "$(PACKAGE)" = "gettext"; then \ for file in $(DISTFILES.common); do \ rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ else \ : ; \ fi uninstall-data-no: uninstall-data-yes: catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ for lc in LC_MESSAGES $(EXTRA_LOCALE_CATEGORIES); do \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ done; \ done check: all dvi info tags TAGS ID: mostlyclean: rm -f remove-potcdate.sed rm -f core core.* $(DOMAIN).po $(DOMAIN).1po $(DOMAIN).2po *.new.po rm -fr *.o clean: mostlyclean distclean: clean rm -f Makefile Makefile.in POTFILES *.mo 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 $(GMOFILES) distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) dist distdir: $(MAKE) update-po @$(MAKE) dist2 # This is a separate target because 'update-po' must be executed before. dist2: $(DISTFILES) dists="$(DISTFILES)"; \ if test -f $(srcdir)/ChangeLog; then dists="$$dists ChangeLog"; fi; \ if test -f $(srcdir)/LINGUAS; then dists="$$dists LINGUAS"; fi; \ for file in $$dists; do \ if test -f $$file; then \ cp -p $$file $(distdir); \ else \ cp -p $(srcdir)/$$file $(distdir); \ fi; \ done update-po: Makefile $(MAKE) $(DOMAIN).pot-update $(MAKE) $(UPDATEPOFILES) $(MAKE) update-gmo # General rule for updating PO files. .nop.po-update: @lang=`echo $@ | sed -e 's/\.po-update$$//'`; \ if test "$(PACKAGE)" = "gettext"; then PATH=`pwd`/../src:$$PATH; fi; \ tmpdir=`pwd`; \ echo "$$lang:"; \ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ echo "$${cdcmd}$(MSGMERGE) $$lang.po $(DOMAIN).pot -o $$lang.new.po"; \ cd $(srcdir); \ if $(MSGMERGE) $$lang.po $(DOMAIN).pot -o $$tmpdir/$$lang.new.po; then \ if cmp $$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; \ exit 1; \ fi; \ fi; \ else \ echo "msgmerge for $$lang.po failed!" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ fi $(DUMMYPOFILES): update-gmo: Makefile $(GMOFILES) @: Makefile: Makefile.in.in $(top_builddir)/config.status POTFILES.in cd $(top_builddir) \ && CONFIG_FILES=$(subdir)/$@.in CONFIG_HEADERS= \ $(SHELL) ./config.status force: # 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: mhwaveedit-1.4.24/po/Makevars000066400000000000000000000034231334022513400160500ustar00rootroot00000000000000# Makefile variables for PO directory in any package using GNU gettext. # Usually the message domain is the same as the package name. DOMAIN = mhwaveedit # These two variables depend on the location of this directory. subdir = po top_builddir = .. # These options get passed to xgettext. XGETTEXT_OPTIONS = --keyword=_ --keyword=N_ # This is the copyright holder that gets inserted into the header of the # $(DOMAIN).pot file. Set this to the copyright holder of the surrounding # package. (Note that the msgstr strings, extracted from the package's # sources, belong to the copyright holder of the package.) Translators are # expected to transfer the copyright for their translations to this person # or entity, or to disclaim their copyright. The empty string stands for # the public domain; in this case the translators are expected to disclaim # their copyright. COPYRIGHT_HOLDER = Magnus Hjorth # This is the email address or URL to which the translators shall report # bugs in the untranslated strings: # - Strings which are not entire sentences, see the maintainer guidelines # in the GNU gettext documentation, section 'Preparing Strings'. # - Strings which use unclear terms or require additional context to be # understood. # - Strings which make invalid assumptions about notation of date, time or # money. # - Pluralisation problems. # - Incorrect English spelling. # - Incorrect formatting. # It can be your email address, or a mailing list address where translators # can write to without being subscribed, or the URL of a web page through # which the translators can contact you. MSGID_BUGS_ADDRESS = magnus.hjorth@home.se # This is the list of locale categories, beyond LC_MESSAGES, for which the # message catalogs shall be used. It is usually empty. EXTRA_LOCALE_CATEGORIES = mhwaveedit-1.4.24/po/POTFILES.in000066400000000000000000000017111334022513400161270ustar00rootroot00000000000000src/chunk.c src/chunkview.c src/combinechannelsdialog.c src/combo.c src/configdialog.c src/convert_inc.c src/dataformat.c src/datasource.c src/effectbrowser.c src/effectdialog.c src/filetypes.c src/float_box.c src/float_box_marsh.c src/formatselector.c src/gotodialog.c src/gtkfiles.c src/help.c src/historybox.c src/inifile.c src/int_box.c src/int_box_marsh.c src/ladspacore.c src/ladspadialog.c src/listobject.c src/main.c src/mainwindow.c src/documentlist.c src/pipedialog.c src/player.c src/rateconv.c src/rateest.c src/rawdialog.c src/recorddialog.c src/ringbuf.c src/sampleratedialog.c src/samplesizedialog.c src/sound-alsalib.c src/sound.c src/sound-dummy.c src/sound-esound.c src/sound-jack.c src/sound-oss.c src/sound-portaudio.c src/sound-sdl.c src/sound-sun.c src/soxdialog.c src/speeddialog.c src/statusbar.c src/tempfile.c src/um.c src/viewcache.c src/volumedialog.c src/vu_meter.c src/document.c src/session.c src/mapchannelsdialog.c src/sandwichdialog.c mhwaveedit-1.4.24/po/Rules-quot000066400000000000000000000032311334022513400163540ustar00rootroot00000000000000# Special Makefile rules for English message catalogs with quotation marks. DISTFILES.common.extra1 = quot.sed boldquot.sed en@quot.header en@boldquot.header insert-header.sin Rules-quot .SUFFIXES: .insert-header .po-update-en en@quot.po-update: en@quot.po-update-en en@boldquot.po-update: en@boldquot.po-update-en .insert-header.po-update-en: @lang=`echo $@ | sed -e 's/\.po-update-en$$//'`; \ if test "$(PACKAGE)" = "gettext"; then PATH=`pwd`/../src:$$PATH; GETTEXTLIBDIR=`cd $(top_srcdir)/src && pwd`; export GETTEXTLIBDIR; fi; \ tmpdir=`pwd`; \ echo "$$lang:"; \ ll=`echo $$lang | sed -e 's/@.*//'`; \ LC_ALL=C; export LC_ALL; \ cd $(srcdir); \ if $(MSGINIT) -i $(DOMAIN).pot --no-translator -l $$ll -o - 2>/dev/null | sed -f $$tmpdir/$$lang.insert-header | $(MSGCONV) -t UTF-8 | $(MSGFILTER) sed -f `echo $$lang | sed -e 's/.*@//'`.sed 2>/dev/null > $$tmpdir/$$lang.new.po; then \ if cmp $$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 "creation of $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ exit 1; \ fi; \ fi; \ else \ echo "creation of $$lang.po failed!" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ fi en@quot.insert-header: insert-header.sin sed -e '/^#/d' -e 's/HEADER/en@quot.header/g' $(srcdir)/insert-header.sin > en@quot.insert-header en@boldquot.insert-header: insert-header.sin sed -e '/^#/d' -e 's/HEADER/en@boldquot.header/g' $(srcdir)/insert-header.sin > en@boldquot.insert-header mostlyclean: mostlyclean-quot mostlyclean-quot: rm -f *.insert-header mhwaveedit-1.4.24/po/boldquot.sed000066400000000000000000000003311334022513400166750ustar00rootroot00000000000000s/"\([^"]*\)"/“\1”/g s/`\([^`']*\)'/‘\1’/g s/ '\([^`']*\)' / ‘\1’ /g s/ '\([^`']*\)'$/ ‘\1’/g s/^'\([^`']*\)' /‘\1’ /g s/“”/""/g s/“/“/g s/”/”/g s/‘/‘/g s/’/’/g mhwaveedit-1.4.24/po/de.gmo000066400000000000000000001336471334022513400154640ustar00rootroot00000000000000~ U'P5.Q5 55 555 5555 6 66 06 >6L6[6m6|6666 6667777!7 *767 Q7[7y777777 7%8.8!L8Jn8I8 99 9V+99.9-9/9.*: Y:f:v:::::: ; ;:;U;o; ; ;;;;;; < <<1<C<W<i<{<< < << < < < < = = = !=+=A="U=x====== >->K>a>u>!> > > > >>> ? '?3? B? N? Y? d?q? ??? ????? @ @@2@A@Q@ c@ q@@@@@@@@A A $A/A8A?AFAMATA [A fA qA |AAAAAAA BB B(B .B9BNB hB$sBBBBB,B-CMC3]C CCC CC C CCCCC DD!D=DwDDDDDD DDDD E "E-E"3EVE]E)nEEEE#EEE!F%F;FNFdF F%FFFIF%5G[GxGGGGG"G H%H6H^ D^Q^`^g^o^^^^^ ^^)^' _ 1_;_&O_v_G__]_"V`y`QaunaaYb1b&c7c;c"c=d Wdxd1d dd ddee&eee* f4f&Kfrffffffffg1g1Pg#g#gg ggghh+hIhOhWh ghuhYhhh2ili-(j Vjaj)fj j8jjjj2jk6%k6\kkk kk kk(k#l$lGWl ,+*-,/Z/QԂ &2; KX ] ju}ƒɃ;Pf , Ԅ 99@4X,-3Lcz /؆"Z/s!Ň߇41P҈و$%5[ dn  Љ݉ +!e3Lq &ы(ً.'1YmsB{!,3 A)Z435;#!_<;&!:&W!~+̏) .C\/u-$Ӑ34OWhlt { ,đ  19krz ȒҒ  )],/Փݓ &;Siy:#Ô#H LT6ɕ?@ P] } ǖ Ԗ  2/AJ]d u ʘ ט )GW]r- ΙVٙ0DKhy ! >1p ϛ -8 LV_s ќ - :I^ gr +ŝ7 <HQXm(Y 4 S_n~ ڟP R]o ~06 #*(9S0$7"+(@PiǢ(9Jd~,ϣ4 1>*TPp%ezZ7@4ӨH'N+*z/7ժ  .:B+ "L"o4Ǭ) %<Xaf%*"ҭ88.0g3#̮ +@ Wx~P <w09 B<PE 9LB=, ųԳ1ٳ7 C$_ ޴$ >Rbc Ƶӵ % @K Sa+j-+Ķ)1.L{sQ!.@h N %.LZZ9zRWZ; V"=n1q6" B%A~Rb{|>l(5$ j~TULF iEG- 5faIdT[) ,+] xk=?m0YJ(xsr7FG/9tn+:HKwDB uDUF&TN@ K ?4o.gc\]^_bX1094oB`~Sm,=*0kC&k<\/<OS-geO; YJafPmC7'||r_&U@^OpCG4jlbH#Xx7yc/5h28z8vfw8pjVEpqrL, aN"W6YKDP`eg l(RIS*z{MHM#uh}: XsVvo`ytd}'dE^i+32w[ynI-%_>c)t \{'AM2e$W<A}i!>*[]Q!$?);Jvq# 633:Q1Pu Test results (1 time unit = %f usec/sample) Window '%s' Current chunk: History: and: Advanced settings Dithering Driver options External applications Fallback format Hz Input audio Input controls Input ports Main window Output audio Output controls Output ports Playback settings Rate conversions Temporary file directories Temporary file settings Time format Variable speed View Window contents cents dB ms seconds%d channels%s is not a valid wav file%s kbit/s%s on %s(%d files, %ld bytes)%s... (Press ESC to cancel)%s: Expected '=': %s %s: Expected value: %s %s: Wrong file type'%s' is not a number!(H')MM:SS.mmmm(H')MM:SS.t(Lines with delay=0 will be ignored.)(SoX) Polyphase interpolation(SoX) Simulated analog filtration(This changes the sample rate of the entire file, not just the selection)(This changes the sample type of the entire file, not just the selection)(expected) (no file loaded)(no limit)(use a negative number to place the cursor before instead of after the selected point)/Cursor/Find zero-crossing/Cursor/Find zero-crossing/Left (all channels)/Cursor/Find zero-crossing/Left (any channel)/Cursor/Find zero-crossing/Right (all channels)/Cursor/Find zero-crossing/Right (any channel)/Cursor/Move/Cursor/Move to/Cursor/Move to/Beginning/Cursor/Move to/End/Cursor/Move to/Selection end/Cursor/Move to/Selection start/Cursor/Move/Left/Cursor/Move/Left sample/Cursor/Move/Right/Cursor/Move/Right sample/Cursor/Position cursor.../Cursor/Set selection end/Cursor/Set selection start/Cursor/sep1/Cursor/sep2/Debug/Debug/Check opencount/Debug/Dummy effect/Debug/Dump chunk info/Edit/Clear clipboard/Edit/Cr_op/Edit/Cu_t/Edit/Insert _silence/Edit/Paste _over/Edit/Paste to _new/Edit/Preferences/Edit/Select _all/Edit/Select none/Edit/Silence selection/Edit/_Copy/Edit/_Delete/Edit/_Mix paste/Edit/_Paste/Edit/_Redo/Edit/_Undo/Edit/sep1/Edit/sep2/Edit/sep3/Edit/sep4/Effec_ts/Effects/Add channe_l/Effects/B_yte swap/Effects/Convert sample _format.../Effects/Convert sample_rate.../Effects/Effects dialog.../Effects/Fade _in/Effects/Fade o_ut/Effects/Ma_p channels.../Effects/Normali_ze to.../Effects/Pipe through program.../Effects/_Combine channels.../Effects/_Mix to mono/Effects/_Normalize/Effects/_Speed adjustment.../Effects/_Volume adjust (fade).../Effects/sep1/Effects/sep2/Effects/sep3/Effects/sep4/File/Save _as.../File/Save selection as.../File/_Close/File/_Exit/File/_Open.../File/_Save/File/sep1/File/sep2/Help/_About/Help/_Documentation/Move Down/Move Up/Move to Bottom/Move to Top/Play/Play _all/Play/Play se_lection/Play/_Play from cursor/Play/_Record.../Play/_Stop/Play/sep1/Rebuild Effect List/Restore Order/Sort by Author/Sort by Location/Sort by Name/Sort by Type/View/Sp_eed slider/View/Zoom _all/View/Zoom _in/View/Zoom _out/View/Zoom to _selection/View/_Horizontal zoom/View/_Time scale/View/_Vertical zoom/View/sep1/View/sep2/_Cursor/_Edit/_File/_Help/_Play/_View16 bit PCM24 bit PCM32 bit PCM8 bit PCMALSA PreferencesAbout mhWaveEditActivation failed!Adjusting speedAdvancedAmount: AmplifyingApplyApply to: Applying effect '%s'Attack integration time: Author: %sAuto dete_ct driver on each start-upAuto return to playback startAuto stop in: Auto-_reset speedAuto-detect from extensionAutomatically connect input ports on startupAutomatically connect output ports on startupAverage bitrateAvoid select calls (try this if recording locks up)BackgroundBandpassBandpass filterBandwidth: BetaBig endianBig-endianBlackBottomBrowse directoryBuffer overrun!Bug reportingBuilt-inButterworth bandpass filterButterworth bandreject filterButterworth highpass filterButterworth lowpass filterBytes written: Calculating peak levelCalculating peak volume...CancelCh%dChannels: ChoiceChorusChunk %p has opencount=%d Client name: Clipping: CloseClose dialog after applying effectColorsCombine channelsCommand failed without returning any dataCommand line: Compiled %s %sCompress/ExpandConnection from %s to %s failed: %sConstant bitrateContactConversion test failed, between: Convert sample formatConvert samplerateConverting samplerateCopy the current selectionCopyright: %sCould not connect to the JACK server.Could not create pipe: %sCould not create session fileCould not find home directory. Using current directory as home directory.Could not get file position in %s: %sCould not initialize SDL: %sCould not open %s: %sCould not open '%s': %sCould not read from %s: %sCould not remove '%s': %sCould not seek in %s: %sCouldn't connect to ESD daemon: %sCouldn't forkCouldn't open %sCrashCurrent sound driver: %sCursorCursor: Cursor: runningCustom argumentCustom argument: Custom formatCustomize co_lors...Cut out the current selectionDC ShiftDecay Decay integration time: DecodingDelay (ms) Delay time: Delete the selectionDepth (ms) Depth: DestinationDisableDisk editing _threshold: Display t_imes as: Distributed under GNU General Public License. For information, see the file COPYINGDon't actually change the data (for repairing bad files etc)DownDummy (no sound)ESD preferencesEarlier sessions were found. Choose one to resume or start a new session.EarwaxEchoEcho sequenceEditingEffect %s contains invalid port %sEffectsEnable _dithering for editingEnable _variable speed playbackEnable dithering for _playbackEncoding type: End:Endianness: Error changing samplerate conversion ratio: %s Error closing %s: %sError converting samplerate: %s Error creating link to '%s': %sError creating pipeError in sound driver: ioctl failed: %sError in sound driver: read failed: %sError in sound driver: select failed: %sError in sound driver: write failed: %sError initialising sample rate conversion: %sError launching mixer: fork: %sError opening ALSA device '%s' for playback: %sError opening ALSA device '%s' for recording: %sError opening session directoryError reading %s: %sError reading from %s: %sError reading from sub process: %sError reading sox outputError running 'sox -h': %s Error seeking in %s: %sError writing to subprocess: %sError: %sError: fork: %sEsounD driver: readEsounD driver: selectEsounD driver: writeEsounD: Unable to open playback streamEsounD: Unable to open recording streamEsound connection closed by serverExitExpected driver name after --driver optionExtreme (higher quality)Factor: Fade: Fade|CosFade|HammingFade|LinearFade|TrapezoidFailed to open '%s'!Failed to write to '%s'!File already exists. Overwrite?File formatsFile type: FilesFilter type: Find top volumeFinding zero-crossingFinishFlangerFloating-point, doubleFloating-point, singleFormat not selectedFrequency: GeneralHeader bytes: HeavyHelping outHigh 6db corner: HighpassHighpass filter (single-pole)HzIf the cursor starts running too early when jumping, this delay should be increased.Ignoring extreme old window size/position values Initial volume: InputInput gain: Input level (dB)Input levelsInsane (highest possible quality)Insert SilenceInterfaceInterpolation: Interpolation|CubicInterpolation|LinearInvalid driver name: %s Using '%s' driver insteadInvalid number of input ports.Invalid number of output ports.Invalid sample format or number of channels for this file formatInvalid time value. Time must be specified in the form (HH')MM:SS(.mmmm)Jack PreferencesJump delay:Keep data in unmapped output channelsKeep main _window in front after applying effectKeyboard shortcutsL WaveformLadspa: Error scanning %sLaunch mixerLeftLeft filesLevel: Limiter gain: Little endianLittle-endianLoad FileLoad a file from diskLoadingLoading and then saving files with 'lossy' formats (like mp3 and ogg) leads to a quality loss, also for the unmodified parts of the file.Loop mode (play over and over)Low 6dB corner: LowpassLowpass filter (single-pole)MP3 PreferencesMapMap channelsMarksMasking noiseMessageMethod: Mi_xer utility: Microsoft WAV formatMildMixingMixing channelsModulation Modulation|SinusoidalModulation|TriangularMonoN/AName :New samplerate: NoNo errors detected!No file with that name!Noise modeNoneNormalize to...Number of ports (0-8): Number of recent files in File menu: OKOSS preferencesOgg VorbisOn this system, libsndfile is required to save floating-point wav files.Open with MPlayerOtherOutput _buffer size:Output channels: Output from command '%s': Output gain: Output level (dB)Over/underrun in JACK driverOverruns: Pa_OpenStream failed: %s Paste at cursor positionPaste, overwriting the data after the cursor positionPause recordingPeak limiterPeak max: Peak: PhaserPipe through programPitch adjustPlace cursor Play from cursor positionPlay selected areaPlaybackPlayback device: PlayingPort #%dPosition cursorPost-processing gain: PreferencesPreparing tests..Process outputProcessing dataProgress barQualityQuality: R WaveformRMS: Range test failed for format: Raw PCM dataReady for recordingRecordRecordStatus|PausedRecordStatus|RecordingRecordingRecording device: Recording settingsRecording status: Redo the last undo operationReset max peaksResume recordingResume selectedReverbReverb time: ReverseRightRunning tests..SDL (output only)SDL: Couldn't open audio: %sSample format to try when the sound file's format isn't supported.Sample format: Sample rate: Sample repeat/skip (low quality)Sample type: Sample viewSave FileSave changes to %s?Save selection as ...Save the current file to diskSavingSeconds of silence: Selecting the ESD host to connect to is done through the ESPEAKER environment variable.SelectionSelection: %s+%sSend wav headerSessionsSetSet selection end to cursor positionSet selection start to cursor positionShift amount: Should not reach this pointShould not reach this point!Show _horizontal zoom slider by defaultShow _speed slider by defaultShow _time scale by defaultShow _vertical zoom slider by defaultSignedSignedness: Sinc-windowed filterSoX closed connection too early!Some of the settings you have changed will not be activated until you restart the programSoundSourceSox support couldn't be initializedSpeedSpeed (Hz) Speed effect: Speed:Speed: Standard (high quality)Start new sessionStart recordingStart:StereoStop playingSunAudio: Couldn't open %sSunAudio: Error reading from sound deviceSunAudio: Error writing to sound deviceSuspendedSyntax: %s [files] Testing conversion functions finished.Testing conversion functions:The client name change won't take effect until you restart the program.The file %s does not exist!The file %s is a compressed wav file. This program can only work with uncompressed wav files.The file %s is not a regular file!The file %s may be destroyed since the saving failed. Try to free up some disk space and save again. If you exit now the file's contents could be in a bad state. The file has not changed since last save. Press OK if you want to save it anyway?The file name '%s' has an extension unknown to the program. Please specify in which format this file should be saved.The files that belonged to the crashed session have been recovered. Any files that are not saved will be removed permanently. (This notice is only shown once)The format of file '%s' could not be recognized. Please specify the sample format below.The input was clipped %d times during processing.The mixed result was clipped %d times.The sign and endian-ness can usually be left at their defaults, but should be changed if you're unable to record or get bad sound.The sound format of this file is not supported for playing.There already is only one channel!This effect applies to the whole file, not just the selectionThis effect could not be loaded.This effect has no options.This format is not supported by the input driver!Time limit: Time recorded: Time stretchTimeDisplay|SamplesTo avoid rounding errors when applying more than one effect on the same data, floating-point temporary files can be used. However, this will increase disk and CPU usage.TopUnable to detect supported SoX effectsUnable to write data to %sUndo the last changeUnexpected EOF in connection to subprocessUnexpected end of fileUnexpected end of file reading from %sUnknown file formatUnknown file typeUnknown option '%s'UnsignedUpUse default settingsUse fast and noisy methodUse this setting by defaultUses double-precision mathValue for %s must be a number between %ld and %ldValue for '%s' must be a number between %f and %fValue for '%s' must not be above %fValue for '%s' must not be below %fVariable bitrate (default)Varispeed: VibroView _quality:View: [ %s - %s ]Volume adjust/fadeWarning: Unexpected error: %sWhiteWidth: Window length: Window size: Window width: With JACK, the only supported recording format is Floating-point, single precision, %d HzYesYou are saving a wav file larger than 2048MB. Such large files are non-standard and may not be readable by all programs. (this warning will not be displayed again)You can find the latest release of mhWaveEdit at: You have mapped more than one output port to channel '%s'. You can only map one output port to each channel.You have no open file to apply the effect to!Zero-level_Add_Auto-start playback when jumping to mark_Browse..._Byte-swap output (try this if playback sounds horrible)_Cancel_Close_Down_Draw waveform a second time with improved quality_Driver:_Keep cursor in center of view when following playback_Keep sound driver opened (to avoid start/stop clicks)_OK_Preview_Remember window sizes/positions_Remove_Settings_Up_Update cursor information while playing_Use floating-point temporary filesafter beginning of fileafter current cursor positionafter end of fileafter selection endafter selection startbytesheader sizehttp://gna.org/projects/mhwaveedit/ jack_get_ports returned NULLjump delaymhWaveEdit HelpmhWaveEdit is a graphical program for editing sound files. It is completely free (GPL). mhWaveEdit: mhWaveEdit: %s (%s): %d Hz, %smhWaveEdit: %s: %s msnumber of recent filesputenv failed!sample ratesamplessamples/pixelsecondssnd_pcm_hw_params_set_access failedsnd_pcm_hw_params_set_channels failedsnd_pcm_hw_params_set_format failedsnd_pcm_hw_params_set_rate failedsound-portaudio: No input devices available!sound-portaudio: No output devices available!unsetenv failed!untitled #%dProject-Id-Version: mhWaveEdit 1.4.8 Report-Msgid-Bugs-To: POT-Creation-Date: 2018-08-25 11:56+0200 PO-Revision-Date: 2007-09-05 10:41+0100 Last-Translator: Georg Funke Language-Team: German Language: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); Test Ergebnisse (1 Zeiteinheit = %f msec/sample) Fenster '%s' Momentaner Bereich: Geschichte: und: Erweiterte Einstellungen Dithering Treiber Einstellungen Externe Anwendungen Rückfall Format Hz Eingang Musik Eingangskontrollen Eingangsport Hauptfenster Ausgang Musik Ausgangskontrollen Ausgangsports Wiedergabe Einstellungen Konvertiere Samplerate Verzeichnis für temporäre Dateien Einstellungen für temporäre Dateien Zeit Format Veränderbare Geschwindigkeit Ansicht Fenster Inhalt cents dB ms sekunden%d Kanäle%s ist keine gültige WAV Datei%s kbit/s%s von %s(%d Dateien, %ld bytes)%s... (Drücke ESC zum Abbrechen)%s: Erwarted '=': %s %s: Erwarteter Wert: %s %s: Falscher Dateityp'%s' ist keine Zahl!(H')MM:SS.mmmm(H')MM:SS.t(Zeilen mit einer Verzögerung von 0 werden ignoriert.)(SoX) Polyphase interpolieren(SoX) Simulierte analog Filterung(Dies ändert die Samplerate der gesamten Datei, nicht nur der Markierung)(Es wird der Sampletyp der gesamten Datei geändert, nicht nur der der Markierung)(angenommen)(keine Datei geladen)(kein Limit)(benutzen Sie eine negative Zahl um den Cursor vor anstatt hinter dem markierten Punkt zu platzieren)/Cursor/Finde eine Stelle wo die Null Linie gekreuzt wird/Cursor/Finde eine Stelle wo die Null Linie gekreuzt wird/Links (alle Kanäle)/Cursor/Finde eine Stelle wo die Null Linie gekreuzt wird/Links (irgendein Kanal)/Cursor/Finde eine Stelle wo die Null Linie gekreuzt wird/Rechts (alle Kanäle)/Cursor/Finde eine Stelle wo die Null Linie gekreuzt wird/Rechts (irgendein Kanal)/Cursor/Bewegen/Cursor/Bewegen zum/Cursor/Bewegen zum/Anfang/Cursor/Bewegen zum/Ende/Cursor/Bewegen zum/Ende der Markierung/Cursor/Bewegen zum/Anfang der Markierung/Cursor/Bewegen/Nach Links/Cursor/Bewegen/Ein Sample nach Links/Cursor/Bewegen/ Nach Rechts/Cursor/Bewegen/Ein Sample nach Rechts/Cursor/Positioniere Cursor.../Cursor/Setze Markierungsende/Cursor/Setze Markierungsbeginn/Cursor/sep1Cursor/sep2/Debug/Debug/Check opencount/Debug/Dummy effect/Debug/Dump chunk info/Bearbeiten/Lösche Zwischenablage/Bearbeiten/Unmarkierte Bereiche löschen/Bearbeite/Ausschneiden/Bearbeiten/Füge Lautlosigkeit ein/Bearbeiten/Einfügen (überschreiben)/Bearbeiten/Einfügen (Neue Datei)/Bearbeiten/Einstellungen/Bearbeiten/Markiere _alles/Auswahl/Nichts auswählen/Bearbeiten/Mit Lautlosigkeit ersetzen/Bearbeiten/Kopieren/Bearbeiten/Löschen/Bearbeiten/Einfügen (_Mischen)/Bearbeiten/Einfügen/Bearbeiten/Wiede_rholen/Bearbeiten/Rückgängig/Bearbeiten/sep1/Bearbeiten/sep2/Bearbeiten/sep3/Bearbeiten/sep4/Effek_te/Effekte/Füge Kana_l hinzu/Effekte/B_yte tauschen/Effekte/Ändere Sampleformat.../Effekte/Ändere Samplerate.../Effekte/Effekte Dialog.../Effekte/E_inblenden/Effekte/Ausblenden/Effekte/Kombiniere Kanäle.../Effekte/Normalisiere nach.../Effekte/Pipe zu einer anderen Anwendung.../Effekte/Führe Kanäle zusammen.../Effekte/Auf _Mono runtermischen/Effekte/_Normalisieren/Effekte/Ge_schwindigkeit verändern.../Efffekte/_Lautstärke verändern.../Effekte/sep1/Effekte/sep2/Effekte/sep3/Effekte/sep4/Datei/Speichern als.../Datei/Speichere Markierung als.../Datei/S_chließen/Datei/B_eenden/Datei/Öffnen.../Datei/_Speichern/Datei/sep1/Datei/sep2/Hilfe/Info/Hilfe/_Dokumentation/Nach unten Bewegen/Nach oben Bewegen/Zum Ende bewegen/Zum Anfang bewegen/Wiedergabe/Alles wiedergeben/Wiedergabe/Gebe Markierung wieder/Wiedergabe/An der Cursor Position beginnen/Wiedergabe/Aufnehmen.../Wiedergabe/_Stoppen/Wiedergabe/sep1/Aktualisiere Effekt Liste/Stelle alte Reihenfolge wieder her/Nach Author sortieren/Nach Ort sortieren/Nach Namen sortieren/Nach Typ sortieren/Ansicht/G_eschwindigkeitsregler/Ansicht/_Alles/Ansicht/Vergrößern/Ansicht/Verkleinern/Ansicht/Markierung anzeigen/Ansicht/Horinzontal vergrößern/Ansicht/Zei_tskala/Ansicht/_Vertikal vergrößern/Ansicht/sep1/Ansicht/sep2/_Cursor/B_earbeiten/Datei/_HilfeWiedergabe/Ansicht16 bit PCM24 bit PCM32 bit PCM8 bit PCMALSA EinstellungenÜber mhWaveEditAktivierung fehlgeschlagen!Passe Geschwindigkeit anErweitertMenge: AnwendenAnwendenAnwenden nach: Wende Effekt '%s' anAttack integration time: Autor: %sErkenne den Treiber automatisch beim StartenAutomatische Rückkehr zum WiedergabebeginnAutomatischer Stop in: Setze Geschwindigkeit automatisch zu_rückAutomatisches Erkennen anhand der DateiendungVerbinde automatische Eingangsports bei StartenVerbinde automatisch Ausgangsports beim StartenDurchschnittliche BitrateVermeide Select Aufrufe (Probiere dies wenn das Aufnehmen das Programm blockiert)HintergrundBandpassBandpass FilterBandbreite: BetaGroß EndianBig-endianSchwarzUntenDurchsuche VerzeichnisPuffer Überlauf!Programmfehler meldenInternButterworth Bandpass FilterButterworth bandreject filterButterworth Hochpass FilterButterworth Tiefpass Filtergeschriebene Bytes: Errechne MaximumlevelErrechne höchste LautstärkeAbbruchCh%dKanäle: WahlChorusBereich %p hat einen offenen Zähler von=%d Klient Name: Unterbrechungen: SchließenSchließe das Dialogfenster nach dem Anwenden der EffekteFarbenFühre Kanäle zusammenKommando ohne die Rückgabe von Daten fehlgeschlagenKommandozeile: Kompiliert %s %sCompress/ExpandVerbindung von %s nach %s fehlgeschlagen: %sKonstante BitrateKontaktKonvertierungstest fehlgeschlagen, zwischen: Konvertiere SampleformatKonvertiere SamplerateKonvertiere SamplerateKopiere die aktuelle MarkierungCopyright: %sKann keine Verbindung zum JACK Server aufbauen.Kann Pipe nicht erzeugen: %sKann Sitzungsdatei nicht erstellenKann Home Verzeichnis nicht finden. Benutze das aktuelle Verzeichnis als Home Verzeichnis.Kann die Dateiposition in %s nicht bekommen: %sKann SDL nicht initialisieren: %sKann %s nicht öffnen: %sKann '%s' nicht öffnen: %sKann von %s nicht lesen: %sKann '%s' nicht löschen: %sKann in %s nicht suchen: %sKann keine Verbindung zum ESD Dämon aufbauen: %sKann nicht verzweigenKann %s nicht öffnenAbsturzAktueller Musik Treiber: %sCursorCursor: Cursor: laufendEigene OptionenEigenes Argument: Eigenes FormatEigene Farben...Schneide die aktuelle Markierung rausDC ShiftVerfall Decay integration time: DekodiereVerzögerung (ms) Verzögerungszeit: Lösche die MarkierungTiefe (ms) Tiefe: ZielAbschaltenSchwelle für die Festplattenbearbei_tung: Zeige Ze_it als: Veröffentlicht unter der GNU General Public License. Für mehr Informationen siehe die Datei COPYINGAktuell die Daten nicht ändern ( um fehlerhafte Dateien zu reparieren usw.)RunterDummy (keine Musik)ESD EinstellungenÄltere Sitzungen sind gefunden worden. Wählen Sie eine zum Wiederherstellen oder starten Sie eine neue Sitzung.EarwaxEchoEcho SequenceBearbeitenEffekt %s enthält ungültigen Port %sEffekteAktiviere _dithering für das BearbeitenAkti_viere regelbare WiedergabegeschwindigkeitAktiviere dithering für die WiedergabeArt der Kodierung: Ende:Endian:Fehler beim wechseln der Samplerate Konvertierungsverhältnis: %s Fehler beim Schließen von %s: %sFehler beim Konvertieren der Samplerate: %s Fehler beim Erzeugen der Verknüpfung nach '%s': %sKann Pipe nicht erzeugenFehler im Musik Treiber: IOCTL Fehler: %sFehler im Musiktreiber: Lesen ist fehlgeschlagen: %sFehler im Musik Treiber: Auswahl fehlgeschlagen: %sFehler im Musik Treiber: schreiben fehlgeschlagen: %sFehler beim Initialisieren der Samplerate Konvertierung: %sFehler beim Starten des Mixer: %sFehler beim öffnen des ALSA Geräts '%s' zur Wiedergabe: %sFehler beim öffnen des ALSA Geräts '%s' zum Aufnehmen: %sKann Sitzungsverzeichnis nicht öffnenFehler beim Lesen %s: %sFehler beim Lesen von %s: %sFehler beim Lesen vom Unterprozeß: %sFehler beim Lesen der SoX AusgabeFehler beim laufen lassen von 'sox -h': %s Fehler beim suchen in %s: %sKann nicht zum Unterprozeß schreiben: %sFehler: %sError: Fork: %sEsounD Treiber: leseEsounD Treiber: gewähltEsounD Treiber: schreibeEsounD: Kann den Wiedergabestream nicht öffnenEsounD: Kann den Aufnahmestream nicht öffnenEsounD Verbindung vom Server beendetBeendenErwarte den Treibernamen nach der --driver ArgumentExtrem (höhere Qualität)Faktor:Ein/Ausblenden: CosHammingLinearTrapezoidFehler beim Öffnen von '%s'!Fehler beim Schreiben nach '%s'!Die Datei existiert bereits. Überschreiben?Datei FormateDateityp: DateienFiltertyp: Finde höchste LautstärkeFinde eine Stelle wo die Null Linie gekreuzt wirdFertigFlangerFließpunkt, doppeltFließpunkt, einfachFormat nicht ausgewähltFrequenz: AllgemeinHeader Bytes: SchwerMithelfenHohe 6dB Ecke: HochpassHochpass Filter (single-pole)HzWenn der Cursor sich zu früh bewegt beim springen, sollte diese Verzögerung erhöht werden.Ignoriere extrem alte Fenster-größe/position Ursprüngliche LautstärkeEIngabeEingang verstärken: Eingangslevel (dB)EingangslevelUnsicher (höchst mögliche Qualität)Füge Lautlosigkeit einBenutzerschnittstelleInterpolieren: KubischLinearFalscher Treiber Name: %s Benutze '%s' Treiber stattdessenUngültige Anzahl von EingangsportsUngültige Anzahl von AusgangsportsFalsches Sampleformat oder falsche Anzahl der Kanäle für dieses FormatFalscher Zeit Wert. Zeit muß in der Form (HH')MM:SS(.mmmm) angegeben werdenJack EinstellungenSprung Verzögerung:Behalte die Daten in nicht zugewiesen AusgangskanälenLasse Hauptfenster im Vordergrund nach dem Anwenden der EffekteTastaturkürzelL WellenformLadspa: Fehler beim Abtasten %sStarte MixerLinksZurückgebliebene DateienNiveau:Verstärkungslimit: Klein EndianLittle-endianLade DateiLade Datei vom SpeichermediumLadeDas Laden und Speicher von Dateien mit 'verlustbehafteten' Formaten (wie MP3 und Ogg) bringt einen Qualitätsverlust mit sich, auch für die nicht veränderten Teile der Datei.Schleifen Modus (Immer wieder von neuem abspielen)Niedrige 6dB Ecke: TiefpassTiefpass Filter (single-pole)MP3 EinstellungenAbbildenKombiniere KanäleMarkenErzeuge RauschenNachrichtMethode:Mi_xer Programm: Microsoft WAV FormatLeichtMischeMixe KanäleModulation SinusodalTriangularMonoN/VName :Neue Samplerate: NeinKeine Fehler gefundenKeine Datei mit diesem Namen!Geräusch ModusKeineNormalisiere nach...Anzahl der Ports (0-8): Anzahl der aktuellen Dateien im Datei Menü: OKOSS EinstellungenOgg VorbisAuf diesem Rechner wird libsndfile benötigt um Fließpunkt Wave Dateien zu speichern.Mit MPlayer öffnenAndereGröße des Ausga_bepuffers:Ausgabe-Kanäle:Ausgabe vom Kommando '%s': Ausgang verstärken: Ausgangslevel (dB)Puffer leer/voll im JACK TreiberPuffer voll: Pa_OpenStream fehlgeschlagen: %s Füge an der Cursor Position einEinfügen, überschreiben der Daten hinter der Cursor PositionAufnahme anhaltenMaximumbegrenzerMaximum: Momentan: PhaserPipe zu einem externen ProgrammTonhöhe verändernPlatziere Cursor Spiele ab der Cursor PositionSpiele markierten BereichWiedergabeWiedergabe Gerät: AbspielenPort #%dPositioniere CursorPost-Prozessing VerstärkungEinstellungenBereite Tests vor..ProzeßausgabeBearbeite DatenForschrittsbalkenQualitätQualität: R WellenformRMS: Bereichstest für das Format fehlgeschlagen: Rohe PCM DatenBereit zum AufnehmenAufnahmeAngehaltenAufnahme läuftAufnehmenAufnahme Gerät: Aufnahme EinstellungenAufnahme StatusWiederhole die letzte 'Rückgängig' AktionStelle Maximum zurückWeiter AufnehmenWiederherstellung ausgewähltHallHall Zeit: UmkehrenRechtsLasse Tests laufen..SDL (nur Ausgabe)SDL: Kann Musik Gerät nicht öffnen: %sAuszuprobierendes Sampleformat wenn das Format des Musik Stücks nicht unterstützt wird.Sampleformat: Samplerate: Sample wiederholen/überspringen (geringe Qualität)Sampletyp: Sample AnsichtSpeichere DateiSpeichere Änderungen nach %s?Speichere Markierung als ...Speichere die aktuelle Datei abSpeichereSekunden der Lautlosigkeit: Das Auswählen des ESD Host wird über die Umgebungsvariable ESPEAKER getätigt.MarkierungMarkierung: %s+%sSende WAV KopfSitzungenSetzeSetze das Markierungsende an die Cursor PositionSetze den Beginn der Markierung an die Cursor PositionVerschiebung:Sollte diesen Punkt nicht erreichenDieser Punkt sollte nicht erreicht werden!Zeige standardmäßig _Horizontalen VergrößerungsreglerZeige standardmäßig den GeschwindigkeitsreglerZeige standardmäßig die Zei_tskalaZeige standardmäßig _Vertikalen VergrößerungsreglerSignedSigned: Sinc-windowed filterSoX hat die Verbindung zu früh beendet!Einige der Einstellungen werden erst nach einem Neustart des Programms aktiviertMusikQuelleSox kann nicht gestartet werdenGeschwindigkeitGeschwindigkeit (Hz) Geschwindigkeitseffekte: Geschwindigkeit:Geschwindigkeit:Standard (hohe Qualität)Eine neue Sitzung startenBeginne AufnahmeStart:StereoWiedergabe stoppenSunAudio: Kann %s nicht öffenSunAudio: Fehler beim Lesen vom Musik GerätSunAudio: Fehler beim schreiben auf dem Musik GerätUnterbrochenSyntax: %s [Dateien] Test der Konvertierungsfunktionen beendet.Teste Konvertierungsfunktionen:Die Änderung des Klientnames wird erst nach dem Neustarten des Programms aktiv.Die Datei %s existiert nicht!Die Datei %s ist eine komprimierte WAV-Datei. Dieses Programm kann nur mit unkomprimierten WAV-Dateien arbeiten.Die Datei %s ist keine normale Datei!Die Datei %s ist evtl. zerstört, da das Speicher fehlgeschlagen ist. Versuchen Sie Speicherplatz auf dem Medium freizugeben und Speichern Sie erneut. Wenn Sie jetzt das Programm beenden, kann der Inhalt der Datei in einem fehlerhaften Zustand sein. Die Datei wurde dem letzten Speichern nicht verändert. Drücken Sie OK um Sie trotzdem zu speichern.Der Dateiname '%s' hat eine unbekannte Endung. Bitte geben Sie das Format an in welchem die Datei gespeichert werden soll.Die Dateien die zu der abgestürzten Sitzung gehören sind wiederhergestellt. Jede Datei die nicht gespeichert ist wird dauerhaft gelöscht. (Diese Notiz wird nur einmal angezeigt)Das Format der Datei '%s' kann nicht erkannt werden. Bitte geben Sie das Sampleformat an.Die Eingabe wurde %d mal während der Verarbeitung unterbrochen.Das vermischte Resultat wurde %d mal untergebrochen.Signed und Endian können normalerweise auf ihren Grundeinstellungen bleiben, aber sollten geändert werden, wenn Sie keine Musik aufnehmen können oder seltsame Töne bekommen.Zum Abspielen wird das Musikformat dieser Datei wird nicht unterstützt.Es ist bereits nur ein Kanal vorhanden! Dieser Effekt wirkt auf das gesamte Musikstück, nicht nur auf die MarkierungDieser Effekt konnte nicht geladen werden.Dieser Effekt hat keine Einstellmöglichkeiten.Dieses Format wird vom Musiktreiber nicht unterstützt!Zeit Limit: Aufgenommene Zeit: Zeit dehnenSamplesUm Rundungsfehler beim Hinzufügen von einem oder mehreren Effekten an das Musikstück, können Temporäre Dateien im Fließpunktformat benutzt werden. Allerdings steigert das die Festplattegebrauch und die CPU Zeit.ObenKann SoX unterstützte Effekte nicht findenKann Daten nicht nach %s schreibenNehme die letzte Änderung zurückUnerwartetes EOF bei der Verbindung zum UnterprozeßUnerwartetes Ende der DateiUnerwartetes Ende der Datei beim Lesen %sUnbekanntes DateiformatUnbekannter Datei TypeUnbekannte Einstellung '%s'UnsignedRaufBenutze GrundeinstellungenBenutze schnelle und ungenaue MethodeBenutzte standardmäßig diese EinstellungBenutzt doppelt genau BerechnungenEintrag für %s muß eine Zahl zwischen %ld und %ld seinEingabe für '%s' muß eine Zahl zwischen %f und %f seinDer Wert für '%s' darf nicht höher als %f seinDer Wert für '%s' darf nicht niedriger als %f seinVariable Bitrate (Grundeinstellung)Variable Geschwindigkeit: VibrationenAnzeige _Qualität:Ansicht: [ %s - %s ]Lautstärke verändernWarnung: Unerwarteter Fehler: %sWeißBreite: Fensterlänge: Fenstergröße: Fensterbreite: Jack unterstützt nur das Aufnahmeformat Fließpunkt, einfache Präzision, %d HzJaSie sind dabei eine WAV Datei zu speichern die größer als 2048MB ist. Solche großen Dateien sind kein Standard und können möglicherweise nicht von allen Programmen gelesen werden. (diese Warnung wird nicht erneut angezeigt)Die neuste Version können von mhWaveEdit bekommen Sie auf: Sie haben dem Kanal '%s' mehr als einen Ausgabe Port zugewiesen. Sie können pro Kanal nur einen Ausgabe Port zuweisen.Sie haben keine Datei geöffnet um dem Effekt anzuwenden!Null-levelHinzufügen_Automatischer Wiedergabestart wenn zu einer Marke gesprungen wirdSuche..._Byte-getauschte Wiedergabe (versuche es wenn die Wiedergabe scheußlich klingt)Abbru_chS_chließenAbZeichne Wave ein zweites Mal um die Anzeige zu verbessernTreiberHalte den Cursor in der Mitte der Ansicht wenn er der Wiedergabe folgen sollHalte den Musik Treiber offen (um start/stop _Klicks zu vermeiden)_OKVorschauAn die Fensterg_röße und Position erinnernEntfe_rnenEin_stellungenA_ufAkt_ualisiere Cursor Informationen beim AbspielenBen_utze temporäre Dateien mit Fließpunkt genauigkeithinter dem Anfang der Dateihinter der aktuellen Cursor Positionhinter dem Ende der Dateihinter dem Ende der MarkierungHinter dem Beginn der MarkierungbytesGröße des Headershttp://gna.org/projects/mhwaveedit/ jack_get_ports gibt NULL zurückSprung VerzögerungmhWaveEdit HilfemhWaveEdit ist ein grafisches Programm zu Editieren von Musikdateien. Es ist komplett frei (GPL). mhWaveEdit: mhWaveEdit: %s (%s): %d Hz, %smhWaveEdit: %s: %s msAnzahl der aktuelle Dateienputenv ist fehlgeschlagen!Sampleratesamplessamples/pixelsekundensnd_pcm_hw_params_set_access fehlgeschlagensnd_pcm_hw_params_set_channels fehlgeschlagensnd_pcm_hw_params_set_format fehlgeschlagensnd_pcm_hw_params_set_rate fehlgeschlagensound-portaudio: Keine Eingabegeräte verfügbar!sound-portaudio: Kein Ausgabegerät vorhanden!unsetenv ist fehlgeschlagen!ohne Namen #%dmhwaveedit-1.4.24/po/de.po000066400000000000000000002636121334022513400153140ustar00rootroot00000000000000# German translation of mhWaveEdit. # Copyright (C) 2006 Magnus Hjorth # This file is distributed under the same license as the mhWaveEdit package. # Georg Funke , 2006. # , fuzzy # # msgid "" msgstr "" "Project-Id-Version: mhWaveEdit 1.4.8\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-08-25 11:56+0200\n" "PO-Revision-Date: 2007-09-05 10:41+0100\n" "Last-Translator: Georg Funke \n" "Language-Team: German \n" "Language: \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/chunk.c:199 msgid "Converting samplerate" msgstr "Konvertiere Samplerate" #: src/chunk.c:226 msgid "Adjusting speed" msgstr "Passe Geschwindigkeit an" #: src/chunk.c:703 msgid "Mixing" msgstr "Mische" #: src/chunk.c:758 #, c-format msgid "The mixed result was clipped %d times." msgstr "Das vermischte Resultat wurde %d mal untergebrochen." #: src/chunk.c:822 #, fuzzy msgid "Combining channels" msgstr "Führe Kanäle zusammen" #: src/chunk.c:1083 msgid "Mixing channels" msgstr "Mixe Kanäle" #: src/chunk.c:1471 msgid "Calculating peak level" msgstr "Errechne Maximumlevel" #: src/chunk.c:1542 src/chunk.c:1552 src/chunk.c:1590 src/chunk.c:1600 msgid "Finding zero-crossing" msgstr "Finde eine Stelle wo die Null Linie gekreuzt wird" #: src/chunk.c:1628 #, c-format msgid "Amplifying (by %3.1f%% / %+.1fdB)" msgstr "" #: src/chunk.c:1669 msgid "Amplifying" msgstr "Anwenden" #: src/chunk.c:1867 #, c-format msgid "The input was clipped %d times during processing." msgstr "Die Eingabe wurde %d mal während der Verarbeitung unterbrochen." #: src/configdialog.c:65 msgid "number of recent files" msgstr "Anzahl der aktuelle Dateien" #: src/configdialog.c:66 #, fuzzy msgid "maximum vertical zoom" msgstr "/Ansicht/_Vertikal vergrößern" #: src/configdialog.c:80 msgid "" "Some of the settings you have changed will not be activated until you " "restart the program" msgstr "" "Einige der Einstellungen werden erst nach einem Neustart des Programms " "aktiviert" #: src/configdialog.c:292 msgid "Colors" msgstr "Farben" #: src/configdialog.c:329 msgid "_Preview" msgstr "Vorschau" #: src/configdialog.c:336 src/configdialog.c:1204 msgid "_OK" msgstr "_OK" #: src/configdialog.c:353 msgid "_Cancel" msgstr "Abbru_ch" #: src/configdialog.c:430 msgid "Browse directory" msgstr "Durchsuche Verzeichnis" #: src/configdialog.c:480 msgid "Preferences" msgstr "Einstellungen" #: src/configdialog.c:539 msgid "Show _time scale by default" msgstr "Zeige standardmäßig die Zei_tskala" #: src/configdialog.c:549 msgid "Show _horizontal zoom slider by default" msgstr "Zeige standardmäßig _Horizontalen Vergrößerungsregler" #: src/configdialog.c:559 msgid "Show _vertical zoom slider by default" msgstr "Zeige standardmäßig _Vertikalen Vergrößerungsregler" #: src/configdialog.c:569 msgid "Show _speed slider by default" msgstr "Zeige standardmäßig den Geschwindigkeitsregler" #: src/configdialog.c:579 #, fuzzy msgid "Show slider l_abels by default" msgstr "Zeige standardmäßig den Geschwindigkeitsregler" #: src/configdialog.c:589 #, fuzzy msgid "Show playback buffer positio_n by default" msgstr "" #: src/configdialog.c:598 msgid "_Settings" msgstr "Ein_stellungen" #: src/configdialog.c:608 msgid "_Keep sound driver opened (to avoid start/stop clicks)" msgstr "Halte den Musik Treiber offen (um start/stop _Klicks zu vermeiden)" #: src/configdialog.c:617 msgid "_Byte-swap output (try this if playback sounds horrible)" msgstr "" "_Byte-getauschte Wiedergabe (versuche es wenn die Wiedergabe scheußlich " "klingt)" #: src/configdialog.c:626 msgid "Play _mono files as stereo" msgstr "" #: src/configdialog.c:634 msgid "_Update cursor information while playing" msgstr "Akt_ualisiere Cursor Informationen beim Abspielen" #: src/configdialog.c:642 msgid "_Keep cursor in center of view when following playback" msgstr "" "Halte den Cursor in der Mitte der Ansicht wenn er der Wiedergabe folgen soll" #: src/configdialog.c:652 msgid "_Auto-start playback when jumping to mark" msgstr "_Automatischer Wiedergabestart wenn zu einer Marke gesprungen wird" #: src/configdialog.c:660 msgid "Enable _variable speed playback" msgstr "Akti_viere regelbare Wiedergabegeschwindigkeit" #: src/configdialog.c:669 msgid "Auto-_reset speed" msgstr "Setze Geschwindigkeit automatisch zu_rück" #: src/configdialog.c:676 msgid "Use fast and noisy method" msgstr "Benutze schnelle und ungenaue Methode" #: src/configdialog.c:684 msgid "(H')MM:SS.t" msgstr "(H')MM:SS.t" #: src/configdialog.c:685 msgid "(H')MM:SS.mmmm" msgstr "(H')MM:SS.mmmm" #: src/configdialog.c:686 msgid "TimeDisplay|Samples" msgstr "Samples" #: src/configdialog.c:687 #, fuzzy msgid "Time Code 24fps" msgstr "Aufgenommene Zeit: " #: src/configdialog.c:688 msgid "Time Code 25fps (PAL)" msgstr "" #: src/configdialog.c:689 msgid "Time Code 29.97fps (NTSC)" msgstr "" #: src/configdialog.c:690 #, fuzzy msgid "Time Code 30fps" msgstr "Aufgenommene Zeit: " #: src/configdialog.c:703 msgid "_Remember window sizes/positions" msgstr "An die Fensterg_röße und Position erinnern" #: src/configdialog.c:712 msgid "_Draw waveform a second time with improved quality" msgstr "Zeichne Wave ein zweites Mal um die Anzeige zu verbessern" #: src/configdialog.c:742 msgid "_Remove" msgstr "Entfe_rnen" #: src/configdialog.c:750 msgid "_Add" msgstr "Hinzufügen" #: src/configdialog.c:757 msgid "_Browse..." msgstr "Suche..." #: src/configdialog.c:764 msgid "_Up" msgstr "A_uf" #: src/configdialog.c:772 msgid "_Down" msgstr "Ab" #: src/configdialog.c:788 msgid "Keep main _window in front after applying effect" msgstr "Lasse Hauptfenster im Vordergrund nach dem Anwenden der Effekte" #: src/configdialog.c:804 msgid "_Use floating-point temporary files" msgstr "Ben_utze temporäre Dateien mit Fließpunkt genauigkeit" #: src/configdialog.c:813 msgid "Enable _dithering for editing" msgstr "Aktiviere _dithering für das Bearbeiten" #: src/configdialog.c:821 msgid "Enable dithering for _playback" msgstr "Aktiviere dithering für die Wiedergabe" #: src/configdialog.c:829 msgid "Auto dete_ct driver on each start-up" msgstr "Erkenne den Treiber automatisch beim Starten" #: src/configdialog.c:842 msgid "Direct access" msgstr "" #: src/configdialog.c:843 msgid "Decompress" msgstr "" #: src/configdialog.c:844 #, fuzzy msgid "Bypass" msgstr "Bandpass" #: src/configdialog.c:855 msgid "Biased" msgstr "" #: src/configdialog.c:856 msgid "Pure-Scaled" msgstr "" #: src/configdialog.c:873 msgid "Interface" msgstr "Benutzerschnittstelle" #: src/configdialog.c:874 msgid " Main window " msgstr " Hauptfenster " #: src/configdialog.c:885 msgid "Number of recent files in File menu: " msgstr "Anzahl der aktuellen Dateien im Datei Menü: " #: src/configdialog.c:890 msgid " View " msgstr " Ansicht" #: src/configdialog.c:901 msgid "Customize co_lors..." msgstr "Eigene Farben..." #: src/configdialog.c:908 msgid " Window contents " msgstr " Fenster Inhalt " #: src/configdialog.c:925 #, fuzzy msgid "Vertical zoom limit: " msgstr "/Ansicht/_Vertikal vergrößern" #: src/configdialog.c:929 msgid "x" msgstr "" #: src/configdialog.c:935 msgid "Sound" msgstr "Musik" #: src/configdialog.c:936 msgid " Driver options " msgstr " Treiber Einstellungen" #: src/configdialog.c:944 msgid "_Driver:" msgstr "Treiber" #: src/configdialog.c:961 msgid " Fallback format " msgstr " Rückfall Format " #: src/configdialog.c:966 msgid "Sample format to try when the sound file's format isn't supported." msgstr "" "Auszuprobierendes Sampleformat wenn das Format des Musik Stücks nicht " "unterstützt wird." #: src/configdialog.c:978 msgid "Playback" msgstr "Wiedergabe" #: src/configdialog.c:980 msgid " Playback settings " msgstr " Wiedergabe Einstellungen " #: src/configdialog.c:992 msgid " Variable speed " msgstr " Veränderbare Geschwindigkeit " #: src/configdialog.c:1007 src/help.c:38 msgid "Files" msgstr "Dateien" #: src/configdialog.c:1009 msgid " Temporary file directories " msgstr " Verzeichnis für temporäre Dateien " #: src/configdialog.c:1035 msgid " Temporary file settings " msgstr " Einstellungen für temporäre Dateien " #: src/configdialog.c:1040 msgid "" "To avoid rounding errors when applying more than one effect on the same " "data, floating-point temporary files can be used. However, this will " "increase disk and CPU usage." msgstr "" "Um Rundungsfehler beim Hinzufügen von einem oder mehreren Effekten an das " "Musikstück, können Temporäre Dateien im Fließpunktformat benutzt werden. " "Allerdings steigert das die Festplattegebrauch und die CPU Zeit." #: src/configdialog.c:1048 msgid "" "Some versions of libsndfile supports accessing Ogg files without " "decompressing to a temporary file." msgstr "" #: src/configdialog.c:1062 src/help.c:36 msgid "Quality" msgstr "Qualität" #: src/configdialog.c:1064 msgid " Rate conversions " msgstr " Konvertiere Samplerate " #: src/configdialog.c:1071 msgid "Varispeed: " msgstr "Variable Geschwindigkeit: " #: src/configdialog.c:1072 msgid "Speed effect: " msgstr "Geschwindigkeitseffekte: " #: src/configdialog.c:1079 msgid " Dithering " msgstr " Dithering " #: src/configdialog.c:1090 #, fuzzy msgid " Sample conversion " msgstr " Konvertiere Samplerate " #: src/configdialog.c:1097 msgid "Normalization mode: " msgstr "" #: src/configdialog.c:1104 msgid "Other" msgstr "Andere" #: src/configdialog.c:1106 msgid " Time format " msgstr " Zeit Format " #: src/configdialog.c:1115 msgid "Display t_imes as: " msgstr "Zeige Ze_it als: " #: src/configdialog.c:1126 #, fuzzy msgid "Times_cale format: " msgstr " Zeit Format " #: src/configdialog.c:1137 msgid " External applications " msgstr " Externe Anwendungen " #: src/configdialog.c:1145 msgid "Mi_xer utility: " msgstr "Mi_xer Programm: " #: src/configdialog.c:1155 msgid "Advanced" msgstr "Erweitert" #: src/configdialog.c:1156 msgid " Advanced settings " msgstr "Erweiterte Einstellungen " #: src/configdialog.c:1164 msgid "Disk editing _threshold: " msgstr "Schwelle für die Festplattenbearbei_tung: " #: src/configdialog.c:1175 msgid "View _quality:" msgstr "Anzeige _Qualität:" #: src/configdialog.c:1181 msgid "samples/pixel" msgstr "samples/pixel" #: src/configdialog.c:1187 msgid "Output _buffer size:" msgstr "Größe des Ausga_bepuffers:" #: src/configdialog.c:1193 msgid "bytes" msgstr "bytes" #: src/configdialog.c:1218 msgid "_Close" msgstr "S_chließen" #: src/dataformat.c:886 #, fuzzy, c-format msgid "Floating-point (single %s)\n" msgstr "Fließpunkt (einfach)" #: src/dataformat.c:886 src/dataformat.c:888 src/dataformat.c:892 msgid "Big-endian" msgstr "Big-endian" #: src/dataformat.c:886 src/dataformat.c:888 src/dataformat.c:892 msgid "Little-endian" msgstr "Little-endian" #: src/dataformat.c:888 #, fuzzy, c-format msgid "Floating-point (double %s)\n" msgstr "Fließpunkt (doppelt)" #: src/dataformat.c:890 #, fuzzy, c-format msgid "PCM, %d(%d) bit, %s %s\n" msgstr "PCM, %d bit, %s %s\n" #: src/dataformat.c:891 src/formatselector.c:77 msgid "Signed" msgstr "Signed" #: src/dataformat.c:891 src/formatselector.c:76 msgid "Unsigned" msgstr "Unsigned" #: src/dataformat.c:952 #, fuzzy msgid " Testing ranges..." msgstr "Teste Bereich..." #: src/dataformat.c:976 msgid "Range test failed for format: " msgstr "Bereichstest für das Format fehlgeschlagen: " #: src/dataformat.c:990 #, fuzzy msgid " Testing all conversions.." msgstr "Teste alle Konvertierungen.." #: src/dataformat.c:1032 msgid "(expected) " msgstr "(angenommen)" #: src/dataformat.c:1033 msgid "Conversion test failed, between: " msgstr "Konvertierungstest fehlgeschlagen, zwischen: " #: src/dataformat.c:1035 msgid " and: " msgstr " und: " #: src/dataformat.c:1112 msgid "No errors detected!" msgstr "Keine Fehler gefunden" #: src/dataformat.c:1146 msgid "Preparing tests.." msgstr "Bereite Tests vor.." #: src/dataformat.c:1154 msgid "Running tests.." msgstr "Lasse Tests laufen.." #: src/dataformat.c:1196 #, c-format msgid "" "\n" "\n" "Test results (1 time unit = %f usec/sample)\n" msgstr "" "\n" "\n" "Test Ergebnisse (1 Zeiteinheit = %f msec/sample)\n" #: src/datasource.c:366 #, c-format msgid "Couldn't open %s" msgstr "Kann %s nicht öffnen" #: src/datasource.c:497 msgid "Unexpected end of file" msgstr "Unerwartetes Ende der Datei" #: src/datasource.c:498 #, c-format msgid "Error reading %s: %s" msgstr "Fehler beim Lesen %s: %s" #: src/datasource.c:515 #, c-format msgid "Error seeking in %s: %s" msgstr "Fehler beim suchen in %s: %s" #: src/effectbrowser.c:99 msgid "Built-in" msgstr "Intern" #: src/effectbrowser.c:102 msgid "Volume adjust/fade" msgstr "Lautstärke verändern" #: src/effectbrowser.c:104 msgid "Convert samplerate" msgstr "Konvertiere Samplerate" #: src/effectbrowser.c:106 msgid "Convert sample format" msgstr "Konvertiere Sampleformat" #: src/effectbrowser.c:108 msgid "Map channels" msgstr "Kombiniere Kanäle" #: src/effectbrowser.c:110 msgid "Combine channels" msgstr "Führe Kanäle zusammen" #: src/effectbrowser.c:113 msgid "Add channels from other file" msgstr "" #: src/effectbrowser.c:114 msgid "Speed" msgstr "Geschwindigkeit" #: src/effectbrowser.c:115 msgid "Pipe through program" msgstr "Pipe zu einem externen Programm" #: src/effectbrowser.c:250 msgid "You have no open file to apply the effect to!" msgstr "Sie haben keine Datei geöffnet um dem Effekt anzuwenden!" #: src/effectbrowser.c:275 msgid "This effect could not be loaded." msgstr "Dieser Effekt konnte nicht geladen werden." #: src/effectbrowser.c:582 msgid "/Move Up" msgstr "/Nach oben Bewegen" #: src/effectbrowser.c:583 msgid "/Move Down" msgstr "/Nach unten Bewegen" #: src/effectbrowser.c:584 msgid "/Move to Top" msgstr "/Zum Anfang bewegen" #: src/effectbrowser.c:585 msgid "/Move to Bottom" msgstr "/Zum Ende bewegen" #: src/effectbrowser.c:587 msgid "/Sort by Name" msgstr "/Nach Namen sortieren" #: src/effectbrowser.c:588 msgid "/Sort by Type" msgstr "/Nach Typ sortieren" #: src/effectbrowser.c:589 msgid "/Sort by Location" msgstr "/Nach Ort sortieren" #: src/effectbrowser.c:590 msgid "/Sort by Author" msgstr "/Nach Author sortieren" #: src/effectbrowser.c:592 msgid "/Restore Order" msgstr "/Stelle alte Reihenfolge wieder her" #: src/effectbrowser.c:593 msgid "/Rebuild Effect List" msgstr "/Aktualisiere Effekt Liste" #: src/effectbrowser.c:744 msgid "Top" msgstr "Oben" #: src/effectbrowser.c:751 msgid "Up" msgstr "Rauf" #: src/effectbrowser.c:758 msgid "Down" msgstr "Runter" #: src/effectbrowser.c:765 msgid "Bottom" msgstr "Unten" #: src/effectbrowser.c:793 msgid "Close dialog after applying effect" msgstr "Schließe das Dialogfenster nach dem Anwenden der Effekte" #: src/effectbrowser.c:800 src/gotodialog.c:154 msgid "Apply" msgstr "Anwenden" #: src/effectbrowser.c:808 src/gotodialog.c:159 src/mainwindow.c:1438 #: src/pipedialog.c:165 src/recorddialog.c:610 src/recorddialog.c:987 #: src/sound-esound.c:290 src/sound-jack.c:264 src/sound-oss.c:479 msgid "Close" msgstr "Schließen" #: src/effectbrowser.c:830 src/help.c:35 msgid "Effects" msgstr "Effekte" #: src/effectbrowser.c:892 msgid "Apply to: " msgstr "Anwenden nach: " #: src/filetypes.c:103 msgid "putenv failed!" msgstr "putenv ist fehlgeschlagen!" #: src/filetypes.c:113 msgid "unsetenv failed!" msgstr "unsetenv ist fehlgeschlagen!" #: src/filetypes.c:155 msgid "Microsoft WAV format" msgstr "Microsoft WAV Format" #: src/filetypes.c:181 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: src/filetypes.c:188 msgid "Raw PCM data" msgstr "Rohe PCM Daten" #: src/filetypes.c:190 msgid "Open with MPlayer" msgstr "Mit MPlayer öffnen" #: src/filetypes.c:275 #, c-format msgid "The file %s does not exist!" msgstr "Die Datei %s existiert nicht!" #: src/filetypes.c:282 #, c-format msgid "The file %s is not a regular file!" msgstr "Die Datei %s ist keine normale Datei!" #: src/filetypes.c:294 msgid "Loading" msgstr "Lade" #: src/filetypes.c:333 #, c-format msgid "" "The file name '%s' has an extension unknown to the program. Please specify " "in which format this file should be saved." msgstr "" "Der Dateiname '%s' hat eine unbekannte Endung. Bitte geben Sie das Format an " "in welchem die Datei gespeichert werden soll." #: src/filetypes.c:338 msgid "Unknown file type" msgstr "Unbekannter Datei Type" #: src/filetypes.c:389 msgid "Saving" msgstr "Speichere" #: src/filetypes.c:393 #, c-format msgid "" "The file %s may be destroyed since the saving failed. Try to free up some " "disk space and save again. If you exit now the file's contents could be in a " "bad state. " msgstr "" "Die Datei %s ist evtl. zerstört, da das Speicher fehlgeschlagen ist. " "Versuchen Sie Speicherplatz auf dem Medium freizugeben und Speichern Sie " "erneut. Wenn Sie jetzt das Programm beenden, kann der Inhalt der Datei in " "einem fehlerhaften Zustand sein. " #: src/filetypes.c:457 #, c-format msgid "%s is not a valid wav file" msgstr "%s ist keine gültige WAV Datei" #: src/filetypes.c:472 #, c-format msgid "" "The file %s is a compressed wav file. This program can only work with " "uncompressed wav files." msgstr "" "Die Datei %s ist eine komprimierte WAV-Datei. Dieses Programm kann nur mit " "unkomprimierten WAV-Dateien arbeiten." #: src/filetypes.c:593 msgid "" "On this system, libsndfile is required to save floating-point wav files." msgstr "" "Auf diesem Rechner wird libsndfile benötigt um Fließpunkt Wave Dateien zu " "speichern." #: src/filetypes.c:616 msgid "" "You are saving a wav file larger than 2048MB. Such large files are non-" "standard and may not be readable by all programs.\n" "\n" " (this warning will not be displayed again)" msgstr "" "Sie sind dabei eine WAV Datei zu speichern die größer als 2048MB ist. Solche " "großen Dateien sind kein Standard und können möglicherweise nicht von allen " "Programmen gelesen werden.\n" "\n" " (diese Warnung wird nicht erneut angezeigt)" #: src/filetypes.c:732 src/filetypes.c:877 #, c-format msgid "Failed to open '%s'!" msgstr "Fehler beim Öffnen von '%s'!" #: src/filetypes.c:849 msgid "Invalid sample format or number of channels for this file format" msgstr "Falsches Sampleformat oder falsche Anzahl der Kanäle für dieses Format" #: src/filetypes.c:943 #, c-format msgid "Failed to write to '%s'!" msgstr "Fehler beim Schreiben nach '%s'!" #: src/filetypes.c:1028 msgid "Decoding" msgstr "Dekodiere" #: src/filetypes.c:1149 msgid "Variable bitrate (default)" msgstr "Variable Bitrate (Grundeinstellung)" #: src/filetypes.c:1150 msgid "Average bitrate" msgstr "Durchschnittliche Bitrate" #: src/filetypes.c:1151 msgid "Constant bitrate" msgstr "Konstante Bitrate" #: src/filetypes.c:1152 msgid "Custom argument" msgstr "Eigene Optionen" #: src/filetypes.c:1156 msgid "Standard (high quality)" msgstr "Standard (hohe Qualität)" #: src/filetypes.c:1157 msgid "Extreme (higher quality)" msgstr "Extrem (höhere Qualität)" #: src/filetypes.c:1158 msgid "Insane (highest possible quality)" msgstr "Unsicher (höchst mögliche Qualität)" #: src/filetypes.c:1176 #, c-format msgid "%s kbit/s" msgstr "%s kbit/s" #: src/filetypes.c:1205 msgid "MP3 Preferences" msgstr "MP3 Einstellungen" #: src/filetypes.c:1216 msgid "Encoding type: " msgstr "Art der Kodierung: " #: src/filetypes.c:1229 msgid "Quality: " msgstr "Qualität: " #: src/filetypes.c:1238 msgid "Custom argument: " msgstr "Eigenes Argument: " #: src/filetypes.c:1244 msgid "Use this setting by default" msgstr "Benutzte standardmäßig diese Einstellung" #: src/filetypes.c:1249 src/gotodialog.c:146 src/mainwindow.c:1509 #: src/rawdialog.c:101 src/sound-alsalib.c:98 src/sound-esound.c:286 #: src/sound-jack.c:260 src/sound-oss.c:475 src/um.c:109 src/um.c:142 #: src/um.c:341 src/um.c:449 msgid "OK" msgstr "OK" #: src/filetypes.c:1257 src/rawdialog.c:107 src/sound-alsalib.c:102 #: src/um.c:133 src/um.c:150 src/um.c:347 src/um.c:458 msgid "Cancel" msgstr "Abbruch" #: src/float_box.c:184 src/int_box.c:184 #, c-format msgid "'%s' is not a number!" msgstr "'%s' ist keine Zahl!" #: src/float_box.c:202 #, c-format msgid "Value for '%s' must be a number between %f and %f" msgstr "Eingabe für '%s' muß eine Zahl zwischen %f und %f sein" #: src/formatselector.c:60 msgid "Sample type: " msgstr "Sampletyp: " #: src/formatselector.c:62 msgid "8 bit PCM" msgstr "8 bit PCM" #: src/formatselector.c:63 msgid "16 bit PCM" msgstr "16 bit PCM" #: src/formatselector.c:64 msgid "24 bit PCM" msgstr "24 bit PCM" #: src/formatselector.c:65 msgid "32 bit PCM" msgstr "32 bit PCM" #: src/formatselector.c:66 msgid "Floating-point, single" msgstr "Fließpunkt, einfach" #: src/formatselector.c:67 msgid "Floating-point, double" msgstr "Fließpunkt, doppelt" #: src/formatselector.c:74 msgid "Signedness: " msgstr "Signed: " #: src/formatselector.c:82 msgid "Endianness: " msgstr "Endian:" #: src/formatselector.c:84 msgid "Little endian" msgstr "Klein Endian" #: src/formatselector.c:85 msgid "Big endian" msgstr "Groß Endian" #: src/formatselector.c:90 msgid "Alignment:" msgstr "" #: src/formatselector.c:92 msgid "Packed" msgstr "" #: src/formatselector.c:93 #, fuzzy msgid "Top bytes" msgstr "bytes" #: src/formatselector.c:94 #, fuzzy msgid "Bottom bytes" msgstr "Unten" #: src/formatselector.c:130 msgid "Channels: " msgstr "Kanäle: " #: src/formatselector.c:139 msgid "Sample rate: " msgstr "Samplerate: " #: src/formatselector.c:226 msgid "sample rate" msgstr "Samplerate" #: src/gotodialog.c:102 msgid "Place cursor " msgstr "Platziere Cursor " #: src/gotodialog.c:107 src/sound-esound.c:274 msgid "seconds" msgstr "sekunden" #: src/gotodialog.c:111 src/soxdialog.c:487 msgid "samples" msgstr "samples" #: src/gotodialog.c:115 msgid "after beginning of file" msgstr "hinter dem Anfang der Datei" #: src/gotodialog.c:120 msgid "after end of file" msgstr "hinter dem Ende der Datei" #: src/gotodialog.c:125 msgid "after current cursor position" msgstr "hinter der aktuellen Cursor Position" #: src/gotodialog.c:130 msgid "after selection start" msgstr "Hinter dem Beginn der Markierung" #: src/gotodialog.c:135 msgid "after selection end" msgstr "hinter dem Ende der Markierung" #: src/gotodialog.c:139 msgid "" "(use a negative number to place the cursor before instead of after the " "selected point)" msgstr "" "(benutzen Sie eine negative Zahl um den Cursor vor anstatt hinter dem " "markierten Punkt zu platzieren)" #: src/gotodialog.c:178 msgid "Position cursor" msgstr "Positioniere Cursor" #: src/gtkfiles.c:48 #, c-format msgid "Could not open %s: %s" msgstr "Kann %s nicht öffnen: %s" #: src/gtkfiles.c:53 #, c-format msgid "Warning: Unexpected error: %s" msgstr "Warnung: Unerwarteter Fehler: %s" #: src/gtkfiles.c:110 src/gtkfiles.c:125 #, c-format msgid "Error closing %s: %s" msgstr "Fehler beim Schließen von %s: %s" #: src/gtkfiles.c:140 #, c-format msgid "Could not seek in %s: %s" msgstr "Kann in %s nicht suchen: %s" #: src/gtkfiles.c:159 src/gtkfiles.c:204 #, c-format msgid "Could not read from %s: %s" msgstr "Kann von %s nicht lesen: %s" #: src/gtkfiles.c:178 #, c-format msgid "Unexpected end of file reading from %s" msgstr "Unerwartetes Ende der Datei beim Lesen %s" #: src/gtkfiles.c:196 #, c-format msgid "Unable to write data to %s" msgstr "Kann Daten nicht nach %s schreiben" #: src/gtkfiles.c:262 #, c-format msgid "Could not get file position in %s: %s" msgstr "Kann die Dateiposition in %s nicht bekommen: %s" #: src/gtkfiles.c:313 src/gtkfiles.c:473 msgid "File already exists. Overwrite?" msgstr "Die Datei existiert bereits. Überschreiben?" #: src/gtkfiles.c:321 msgid "No file with that name!" msgstr "Keine Datei mit diesem Namen!" #: src/gtkfiles.c:705 #, c-format msgid "Error reading from %s: %s" msgstr "Fehler beim Lesen von %s: %s" #: src/gtkfiles.c:737 #, c-format msgid "Could not remove '%s': %s" msgstr "Kann '%s' nicht löschen: %s" #: src/gtkfiles.c:757 #, c-format msgid "Error creating link to '%s': %s" msgstr "Fehler beim Erzeugen der Verknüpfung nach '%s': %s" #: src/help.c:30 msgid "General" msgstr "Allgemein" #: src/help.c:31 msgid "Sample view" msgstr "Sample Ansicht" #: src/help.c:32 msgid "Playing" msgstr "Abspielen" #: src/help.c:33 msgid "Recording" msgstr "Aufnehmen" #: src/help.c:34 msgid "Editing" msgstr "Bearbeiten" #: src/help.c:37 msgid "File formats" msgstr "Datei Formate" #: src/help.c:39 msgid "Keyboard shortcuts" msgstr "Tastaturkürzel" #: src/help.c:40 msgid "Bug reporting" msgstr "Programmfehler melden" #: src/help.c:41 msgid "Helping out" msgstr "Mithelfen" #: src/help.c:42 msgid "Contact" msgstr "Kontakt" #: src/help.c:47 #, no-c-format msgid "" "mhWaveEdit is a graphical program for editing sound files. It is completely " "free (GPL).\n" msgstr "" "mhWaveEdit ist ein grafisches Programm zu Editieren von Musikdateien. Es ist " "komplett frei (GPL).\n" #: src/help.c:49 #, no-c-format msgid "You can find the latest release of mhWaveEdit at:\n" msgstr "Die neuste Version können von mhWaveEdit bekommen Sie auf:\n" #: src/help.c:50 #, no-c-format msgid "http://gna.org/projects/mhwaveedit/\n" msgstr "http://gna.org/projects/mhwaveedit/\n" #: src/help.c:55 #, no-c-format msgid "" "The area where you 'see' the contents of the file you are editing, is called " "the 'sample view'. \n" msgstr "" #: src/help.c:57 #, no-c-format msgid "" "In the sample view there is a grey vertical bar called the 'cursor'. The " "cursor follows the sound wave when you play the sound. You can position the " "cursor by clicking with the right (2:nd) mouse button. If you do this while " "you're playing a file, the playing will continue from the new cursor " "position. You can also position the cursor more exact by using the 'Position " "Cursor...' command on the Edit menu.\n" msgstr "" #: src/help.c:59 #, no-c-format msgid "" "You can place marks in your file by holding down Ctrl and pressing a number " "from 0 to 9. This will place a mark (green vertical bar) with the same " "number at the current cursor position. You can later make the cursor go to " "that position again by just pressing the number. Setting and jumping to " "marks can be done while playing. To remove a mark, jump to the mark and set " "it again.\n" msgstr "" #: src/help.c:64 #, no-c-format msgid "" "Playing a file is simple, just load the file and press the play button. The " "green play button plays from the current position. The yellow play button " "plays the current selection, or the entire file if nothing is selected. Stop " "the playback with the stop button (with the red square). \n" msgstr "" #: src/help.c:66 #, no-c-format msgid "" "The playback speed can be varied by adjusting the slider to the far right. \n" msgstr "" #: src/help.c:68 #, no-c-format msgid "You can do normal editing while the file is playing.\n" msgstr "" #: src/help.c:73 #, no-c-format msgid "" "Recording is done with 'Record...' on the Play menu, or the Record button " "(the red circle). A dialog box will pop up where you can select what format " "you want to record in. After selecting the format, meters and numbers will " "appear showing info about the volume level of the sound input. \n" msgstr "" #: src/help.c:75 #, no-c-format msgid "" "When you want to start recording, press the \"Start recording\" button. When " "you've recorded everything you wanted to, press the Finish button and the " "record dialog will disappear and newly recorded sound will show up in a new " "window.\n" msgstr "" #: src/help.c:77 #, no-c-format msgid "" "Currently it is impossible to play and record at the same time, so the " "playback will stop when you record.\n" msgstr "" #: src/help.c:82 #, no-c-format msgid "" "You make selections by dragging the mouse over the sample view. You can hear " "what you've currently selected by clicking on the \"play selection\" button " "(the button with the yellow arrow) or by selecting 'Play selection' from the " "Play menu.\n" msgstr "" #: src/help.c:84 #, no-c-format msgid "" "You can use the cursor to refine the selection. Use the 'Selection start at " "cursor' and 'Selection end at cursor' buttons to move the selection starting " "point or the selection end point to the current cursor position. You can " "also drag the selection endpoints using the mouse.\n" msgstr "" #: src/help.c:86 #, no-c-format msgid "The 'Cut' and 'Copy' functions work like in any other software. \n" msgstr "" #: src/help.c:88 #, no-c-format msgid "" "The 'Paste' function insert the clipboard contents at the cursor position. " "The 'Paste over' function works like 'Paste', except that it overwrites the " "data after the insert position. \n" msgstr "" #: src/help.c:90 #, fuzzy, no-c-format msgid "" "The 'Paste mix' function combines the clipboard data with the data at the " "cursor position.\n" msgstr "Einfügen, überschreiben der Daten hinter der Cursor Position" #: src/help.c:92 #, no-c-format msgid "" "The 'Paste as new' function opens a new window and puts the clipboard " "contents into it. \n" msgstr "" #: src/help.c:94 #, no-c-format msgid "" "The 'Crop' function deletes all parts of the file that are not selected.\n" msgstr "" #: src/help.c:96 #, no-c-format msgid "" "The 'Silence selection' function replaces the selected part with silence. To " "avoid clicks, the silent part is a line that meets the wave at the " "endpoints.\n" msgstr "" #: src/help.c:98 #, no-c-format msgid "" "All editing functions work non-destructively, that is, the file you're " "editing isn't actually changed until you save it (the effects also work this " "way).\n" msgstr "" #: src/help.c:104 #, no-c-format msgid "" "mhWaveEdit has a few simple effects, which are available from the 'Effects' " "menu. \n" msgstr "" #: src/help.c:106 #, no-c-format msgid " * Fade in/out\n" msgstr "" #: src/help.c:108 #, no-c-format msgid " This creates a linear fade in or fade out effect.\n" msgstr "" #: src/help.c:110 #, fuzzy, no-c-format msgid " * Normalize, Normalize to...\n" msgstr "Normalisiere nach..." #: src/help.c:112 #, no-c-format msgid "" " This amplifies the sound as much as possible without getting clipping " "distortion. The \"Normalize to...\" item lets you specify which level to " "normalize to.\n" msgstr "" #: src/help.c:114 #, fuzzy, no-c-format msgid " * Volume adjust/fade...\n" msgstr "Lautstärke verändern" #: src/help.c:116 #, no-c-format msgid "" " This effect lets you select a starting volume and a ending volume and " "amplifies the selection fading from the starting volume to the ending " "volume.\n" msgstr "" #: src/help.c:118 #, no-c-format msgid "" " Note that volumes above 100% may cause sound distortion. Use the 'Find " "top volume' to find out the maximum amplification possible without " "distortion. (You can use this for normalizing samples.) \n" msgstr "" #: src/help.c:120 #, no-c-format msgid "" " By setting starting volume and ending volume to the same value you get a " "simple amplification of the sound. \n" msgstr "" #: src/help.c:122 #, fuzzy, no-c-format msgid " * Convert samplerate...\n" msgstr "Konvertiere Samplerate" #: src/help.c:124 #, no-c-format msgid "" " This converts the samplerate of the entire file to one you specify. There " "are different methods for doing this, usually the one in the top has the " "best quality but can take longer than the other methode.\n" msgstr "" #: src/help.c:126 #, fuzzy, no-c-format msgid " * Convert sample format...\n" msgstr "Konvertiere Sampleformat" #: src/help.c:128 #, fuzzy, no-c-format msgid " This converts the sample format of the entire file.\n" msgstr "" "(Dies ändert die Samplerate der \n" "gesamten Datei, nicht nur der Markierung)" #: src/help.c:130 #, no-c-format msgid "" " The 'Don't actually change the data' option can be used if the program " "was wrong about the file's format.\n" msgstr "" #: src/help.c:132 #, no-c-format msgid " * Byte swap\n" msgstr "" #: src/help.c:134 #, no-c-format msgid "" " This \"byte swaps\" the selected part. It can be used to repair damaged " "files where the byte order is wrong. Note that if the sound looks alright " "but plays wrong, you should not use this option, instead you should use the " "\"byte-swap output\" option in the Preferences dialog.\n" msgstr "" #: src/help.c:136 #, fuzzy, no-c-format msgid " * Mix to mono\n" msgstr "/Effekte/Auf _Mono runtermischen" #: src/help.c:138 #, no-c-format msgid " This mixes all channels of the file together to a mono sound.\n" msgstr "" #: src/help.c:140 #, fuzzy, no-c-format msgid " * Add channel\n" msgstr "%d Kanäle" #: src/help.c:142 #, no-c-format msgid "" " This copies the first channel to a new channel in the sound, converting " "mono to stereo etc.\n" msgstr "" #: src/help.c:144 #, fuzzy, no-c-format msgid " * Map channels...\n" msgstr "Kombiniere Kanäle" #: src/help.c:145 #, no-c-format msgid " \n" msgstr "" #: src/help.c:146 #, no-c-format msgid "" " With this effect, you can change the number of channels in the file. You " "can also rearrange and add (i.e. mix) channels.\n" msgstr "" #: src/help.c:148 #, fuzzy, no-c-format msgid " * Combine channels...\n" msgstr "Führe Kanäle zusammen" #: src/help.c:150 #, no-c-format msgid "" " This effect lets you create a new sound by a linear combination of the " "old channels. This means you can do channel mixing / swapping / balance / " "panning / amplification etc. by entering different values. For example, to " "swap the left and right channel, you select that the new Channel 1 should be " "0% of the old Channel 1 and 100% of the old Channel 2, and the new Channel 2 " "should be 100% of the old Channel 1 and 0% of the old Channel 2 \n" msgstr "" #: src/help.c:152 #, fuzzy, no-c-format msgid " * Speed adjustment...\n" msgstr "/Effekte/Ge_schwindigkeit verändern..." #: src/help.c:154 #, no-c-format msgid "" " This effect changes the speed of the selection. The tone will change as " "well.\n" msgstr "" #: src/help.c:155 #, fuzzy, no-c-format msgid " * Pipe through program...\n" msgstr "Pipe zu einem externen Programm" #: src/help.c:156 #, no-c-format msgid " \n" msgstr "" #: src/help.c:157 #, no-c-format msgid "" " This effect is for advanced users wanting to pipe raw audio data through " "an external program. The output of the program is read back and replaces the " "processed part. \n" msgstr "" #: src/help.c:159 #, no-c-format msgid "" "mhWaveEdit supports LADSPA effects and can also make use of most of the SoX " "utility's effects. To find the LADSPA plugins the environment variable " "LADSPA_PATH must be properly set up. \n" msgstr "" #: src/help.c:161 #, no-c-format msgid "" "All supported effects can be found by choosing the 'Effects...' menu item. " "The effects are listed with names beginning with [B] for builtin effects, " "[L] for LADSPA effects, and [S] for SoX effects.\n" msgstr "" #: src/help.c:167 #, no-c-format msgid "Some notes on sound quality.\n" msgstr "" #: src/help.c:169 #, no-c-format msgid "" "The general rule when doing audio editing/processing is to not manipulate " "the data more than necessary and keep an original copy whenever you're " "processing your important files. \n" msgstr "" #: src/help.c:171 #, no-c-format msgid "" "Cut, copy and paste operations move the data around without modifying it, so " "these don't degrade the sound quality. Because of level differences, you may " "get a \"step\" at the start and end of the inserted part, which can cause a " "small clicking sound. \n" msgstr "" #: src/help.c:173 #, no-c-format msgid "" "The mix paste function doesn't decrease quality, unless the peaks become too " "high and you get clipping. In that case you will get a warning message.\n" msgstr "" #: src/help.c:175 #, no-c-format msgid "" "Sound data is normally stored as integer values. Therefore, whenever you " "normalize, adjust volume, decrease sample size or filter a sound, the result " "must be rounded. If you use 24 or 32 bit sample sizes, this is not really a " "problem, but if you use 8 or 16 bits sample size, this rounding causes a " "decrease in quality. \n" msgstr "" #: src/help.c:177 #, no-c-format msgid "" "The quality decrease that the rounding causes can be masked by adding a " "small amount of noise before rounding. This is called \"dithering\". " "mhWaveEdit supports basic dithering and it's enabled by default.\n" msgstr "" #: src/help.c:179 #, no-c-format msgid "" "By default, mhWaveEdit uses floating-point temporary files for storing " "processed results to avoid rounding until the file is saved.\n" msgstr "" #: src/help.c:184 #, no-c-format msgid "" "Even if mhWaveEdit was originally built for editing wav files, it's also " "possible to load and save in a few other formats. mhWaveEdit always supports " "wav and raw files, but if it's compiled with the libsndfile library, " "mhWaveEdit supports a couple of other formats as well. \n" msgstr "" #: src/help.c:186 #, no-c-format msgid "" "To save a file with a different file format, use \"Save as...\" and choose a " "format in the file type selection box. \n" msgstr "" #: src/help.c:188 #, no-c-format msgid "" "mhWaveEdit has basic support for mp3 and ogg formats. For this to work you " "need to have LAME installed for mp3 support, and OggDec/OggEnc for Ogg " "support. If you have these programs, you can open and save mp3/ogg files " "just like any other file format.\n" msgstr "" #: src/help.c:190 #, no-c-format msgid "" "If mplayer is installed, mhwaveedit can open all formats that it supports, " "for example the soundtrack of a video file. Since mplayer is only a player, " "these files can not be saved back after editing, you have to save the file " "into a supported format.\n" msgstr "" #: src/help.c:195 #, no-c-format msgid "" "mhWaveEdit creates a directory ~/.mhwaveedit where it stores configuration " "information. \n" msgstr "" #: src/help.c:197 #, no-c-format msgid "" "The configuration file is called config. It can be hand edited, but the " "easiest way is through 'Preferences' on the Edit menu.\n" msgstr "" #: src/help.c:199 #, no-c-format msgid "" "Each mhwaveedit process creates a session file in the .mhwaveedit directory " "called mhwaveedit-session---, where is the " "session ID number and is a character code showing the state of the " "session ('r' for running sessions). \n" msgstr "" #: src/help.c:201 #, no-c-format msgid "" "Temporary files are by default also stored in the ~/.mhwaveedit directory. " "Which directories to use can be set through the preferences dialog. To get " "the best performance, you should have one temporary directory for each local " "filesystem. The temporary files have names of the form \"mhwaveedit-temp-" "-nnnn-\". Do NOT open or remove temporary files with the same " "pid number as a currently running mhWaveEdit.\n" msgstr "" #: src/help.c:203 #, no-c-format msgid "" "mhWaveEdit checks on startup for leftover temporary files and lets the user " "open them. After opening a crashed session, the files can be saved or thrown " "away.\n" msgstr "" #: src/help.c:208 #, no-c-format msgid "F1 Help\n" msgstr "" #: src/help.c:209 #, no-c-format msgid "F12 Record\n" msgstr "" #: src/help.c:211 #, no-c-format msgid "Ctrl+(number) Set mark\n" msgstr "" #: src/help.c:212 #, no-c-format msgid "(number) Goto mark\n" msgstr "" #: src/help.c:214 #, fuzzy, no-c-format msgid "Ctrl+P Preferences\n" msgstr "MP3 Einstellungen" #: src/help.c:215 #, no-c-format msgid "Ctrl+E Effects\n" msgstr "" #: src/help.c:217 #, no-c-format msgid "Ctrl+O Open file\n" msgstr "" #: src/help.c:218 #, no-c-format msgid "Ctrl+S Save file\n" msgstr "" #: src/help.c:219 #, fuzzy, no-c-format msgid "Ctrl+U Save selection as\n" msgstr "Speichere Markierung als ..." #: src/help.c:221 #, no-c-format msgid "Ctrl+C Copy\n" msgstr "" #: src/help.c:222 #, no-c-format msgid "Ctrl+X Cut\n" msgstr "" #: src/help.c:223 #, no-c-format msgid "Ctrl+D Delete\n" msgstr "" #: src/help.c:224 #, fuzzy, no-c-format msgid "Delete Delete\n" msgstr "Lösche die Markierung" #: src/help.c:225 #, no-c-format msgid "Ctrl+V Paste\n" msgstr "" #: src/help.c:226 #, no-c-format msgid "Ctrl+Z Undo\n" msgstr "" #: src/help.c:227 #, no-c-format msgid "Ctrl+A Select all\n" msgstr "" #: src/help.c:229 #, no-c-format msgid "Ctrl+G Position cursor (Go to)\n" msgstr "" #: src/help.c:230 #, no-c-format msgid "Ctrl+H Position cursor at file start\n" msgstr "" #: src/help.c:231 #, no-c-format msgid "Ctrl+J Position cursor at file end\n" msgstr "" #: src/help.c:232 #, fuzzy, no-c-format msgid "Ctrl+K Position cursor at selection start\n" msgstr "/Cursor/Setze Markierungsbeginn" #: src/help.c:233 #, no-c-format msgid "Ctrl+L Position cursor at selection end\n" msgstr "" #: src/help.c:234 #, no-c-format msgid "Y,U Move cursor to nearest all-channel zero-crossing\n" msgstr "" #: src/help.c:235 #, no-c-format msgid "I,O Move cursor to nearest any-channel zero-crossing\n" msgstr "" #: src/help.c:237 #, fuzzy, no-c-format msgid "Ctrl+Q Selection start at cursor\n" msgstr "Setze den Beginn der Markierung an die Cursor Position" #: src/help.c:238 #, fuzzy, no-c-format msgid "Ctrl+W Selection end at cursor\n" msgstr "Setze das Markierungsende an die Cursor Position" #: src/help.c:240 #, no-c-format msgid "+,= Zoom in\n" msgstr "" #: src/help.c:241 #, no-c-format msgid "- Zoom out\n" msgstr "" #: src/help.c:242 #, fuzzy, no-c-format msgid "> Zoom to selection\n" msgstr "/Ansicht/Markierung anzeigen" #: src/help.c:243 #, no-c-format msgid "< Zoom all\n" msgstr "" #: src/help.c:244 #, no-c-format msgid "Arrow keys Scroll left/right\n" msgstr "" #: src/help.c:246 #, no-c-format msgid "Home Move view to file start\n" msgstr "" #: src/help.c:247 #, no-c-format msgid "End Move view to file end\n" msgstr "" #: src/help.c:248 #, fuzzy, no-c-format msgid "Tab Move view to cursor\n" msgstr "Spiele ab der Cursor Position" #: src/help.c:249 #, no-c-format msgid "Ctrl+Tab Move cursor to center of view\n" msgstr "" #: src/help.c:251 #, fuzzy, no-c-format msgid "Space Play/Stop\n" msgstr "/Wiedergabe/Gebe Markierung wieder" #: src/help.c:252 #, no-c-format msgid "Shift+Space Play all\n" msgstr "" #: src/help.c:253 #, fuzzy, no-c-format msgid ", Play from cursor pos\n" msgstr "Spiele ab der Cursor Position" #: src/help.c:254 #, no-c-format msgid ". Stop\n" msgstr "" #: src/help.c:255 #, fuzzy, no-c-format msgid "/ Play selection\n" msgstr "/Wiedergabe/Gebe Markierung wieder" #: src/help.c:256 #, no-c-format msgid "H,J Move cursor (and playback) 1/8 of view\n" msgstr "" #: src/help.c:257 #, no-c-format msgid "K,L Move cursor one sample\n" msgstr "" #: src/help.c:258 #, no-c-format msgid "Ctrl+arrow Move cursor (and playback) half second\n" msgstr "" #: src/help.c:259 #, no-c-format msgid "( Play first 3 seconds of selection\n" msgstr "" #: src/help.c:260 #, no-c-format msgid ") Play last 3 seconds of selection\n" msgstr "" #: src/help.c:265 #, no-c-format msgid "" "If you find a bug or flaw in the program that's not mentioned in the BUGS " "file, report the bug in the bug tracker (see contact info) or mail a bug " "report describing the bug to: magnus.hjorth@home.se\n" msgstr "" #: src/help.c:267 #, no-c-format msgid "" "In case of a crash, please do not send me any core dumps. They are huge and " "completely useless to me. Instead, create a backtrace. Backtraces tell you " "exactly where the program crashed.\n" msgstr "" #: src/help.c:269 #, no-c-format msgid "How to create a backtrace:\n" msgstr "" #: src/help.c:270 #, no-c-format msgid "1. Enable core dumps: ulimit -c unlimited\n" msgstr "" #: src/help.c:271 #, no-c-format msgid "2. Run the program: mhwaveedit\n" msgstr "" #: src/help.c:272 #, no-c-format msgid "" "3. Make the program crash. You should now get a file named core or core.1234 " "in the directory you're in.\n" msgstr "" #: src/help.c:273 #, no-c-format msgid "4. Run gdb with the program and core file: \n" msgstr "" #: src/help.c:274 #, no-c-format msgid " gdb /usr/local/bin/mhwaveedit core | tee backtrace.txt\n" msgstr "" #: src/help.c:275 #, no-c-format msgid "5. After gdb has loaded, use the command: bt\n" msgstr "" #: src/help.c:276 #, no-c-format msgid "6. Quit gdb with the command: quit\n" msgstr "" #: src/help.c:277 #, no-c-format msgid "7. Now you should have a back trace in the file backtrace.txt\n" msgstr "" #: src/help.c:282 #, no-c-format msgid "" "There are plenty of things you can do if you want to help the development of " "mhWaveEdit. \n" msgstr "" #: src/help.c:284 #, no-c-format msgid "" "First of all, look for bugs and report all bugs you find into the bug " "tracker or through e-mail. Sometimes a bug can get overlooked for a long " "time because nobody reports it, so don't be afraid to report bugs that have " "been there for a few releases. You don't have to provide fixes or very " "detailed information, although it helps of course.\n" msgstr "" #: src/help.c:286 #, no-c-format msgid "" "Feature requests are also welcome, report them to the mailing list or to the " "bug tracker.\n" msgstr "" #: src/help.c:288 #, no-c-format msgid "" "If you speak a language other than English and mhWaveEdit isn't translated " "to your language, you can contribute a translation. To do that, copy the " "template mhwaveedit.pot in the po directory into a new file ll.po, where ll " "is your language code (see http://www.gnu.org/software/gettext/manual/" "html_node/gettext_221.html for a list of language codes). \n" msgstr "" #: src/help.c:290 #, no-c-format msgid "" "It's possible to edit po-files by hand, but I recommend a program such as " "poEdit (http://www.poedit.org) for editing translations. \n" msgstr "" #: src/help.c:292 #, no-c-format msgid "" "Note that for those translatable strings that look like \"RecordStatus|Paused" "\", you should ignore what's to the left and only translate the string to " "the right (\"Paused\" in this example). This convention is there to make it " "possible to translate the same string to different things depending on " "context. \n" msgstr "" #: src/help.c:294 #, no-c-format msgid "" "After you've filled in all the translations you want (you don't have to " "translate all the strings), mail in the po file to me (see contact info) and " "I'll add it to the next release. \n" msgstr "" #: src/help.c:296 #, no-c-format msgid "" "If a translation is incomplete, you're very welcome to translate the " "remaining untranslated messages and mail them in. Corrections to " "translations are also appreciated, but they may need to be checked with the " "previous translator before including them. \n" msgstr "" #: src/help.c:302 #, no-c-format msgid "For bug reports, translation updates, patches and PayPal donations:\n" msgstr "" #: src/help.c:303 #, no-c-format msgid "magnus.hjorth@home.se\n" msgstr "" #: src/help.c:305 #, no-c-format msgid "Project page with bug tracker, mailing list membership:\n" msgstr "" #: src/help.c:306 #, fuzzy, no-c-format msgid "http://gna.org/projects/mhwaveedit\n" msgstr "http://gna.org/projects/mhwaveedit/\n" #: src/help.c:308 #, no-c-format msgid "Mailing list (you must be a subscriber before you can post messages):\n" msgstr "" #: src/help.c:309 #, no-c-format msgid "mhwaveedit-discuss@gna.org\n" msgstr "" #: src/inifile.c:84 src/inifile.c:91 #, c-format msgid "%s: Expected '=': %s\n" msgstr "%s: Erwarted '=': %s\n" #: src/inifile.c:97 #, c-format msgid "%s: Expected value: %s\n" msgstr "%s: Erwarteter Wert: %s\n" #: src/int_box.c:202 #, c-format msgid "Value for %s must be a number between %ld and %ld" msgstr "Eintrag für %s muß eine Zahl zwischen %ld und %ld sein" #: src/ladspacore.c:94 #, c-format msgid "Effect %s contains invalid port %s" msgstr "Effekt %s enthält ungültigen Port %s" #: src/ladspacore.c:140 #, c-format msgid "Ladspa: Error scanning %s" msgstr "Ladspa: Fehler beim Abtasten %s" #: src/ladspacore.c:409 #, c-format msgid "Applying effect '%s'" msgstr "Wende Effekt '%s' an" #: src/ladspadialog.c:87 #, c-format msgid "Value for '%s' must not be below %f" msgstr "Der Wert für '%s' darf nicht niedriger als %f sein" #: src/ladspadialog.c:94 #, c-format msgid "Value for '%s' must not be above %f" msgstr "Der Wert für '%s' darf nicht höher als %f sein" #: src/ladspadialog.c:127 #, c-format msgid "" "You have mapped more than one output port to channel '%s'. You can only map " "one output port to each channel." msgstr "" "Sie haben dem Kanal '%s' mehr als einen Ausgabe Port zugewiesen. Sie können " "pro Kanal nur einen Ausgabe Port zuweisen." #: src/ladspadialog.c:191 #, c-format msgid "Author: %s" msgstr "Autor: %s" #: src/ladspadialog.c:196 #, c-format msgid "Copyright: %s" msgstr "Copyright: %s" #: src/ladspadialog.c:203 msgid " Input controls " msgstr " Eingangskontrollen " #: src/ladspadialog.c:292 msgid " Output controls " msgstr "Ausgangskontrollen" #: src/ladspadialog.c:311 src/recorddialog.c:311 src/recorddialog.c:739 msgid "None" msgstr "Keine" #: src/ladspadialog.c:319 msgid " Input audio " msgstr " Eingang Musik " #: src/ladspadialog.c:319 msgid " Output audio " msgstr " Ausgang Musik " #: src/ladspadialog.c:350 msgid "Keep data in unmapped output channels" msgstr "Behalte die Daten in nicht zugewiesen Ausgangskanälen" #: src/main.c:166 #, c-format msgid "Syntax: %s [files]\n" msgstr "Syntax: %s [Dateien]\n" #: src/main.c:169 msgid "Testing conversion functions:" msgstr "Teste Konvertierungsfunktionen:" #: src/main.c:171 msgid "Testing conversion functions finished." msgstr "Test der Konvertierungsfunktionen beendet." #: src/main.c:190 msgid "Expected driver name after --driver option" msgstr "Erwarte den Treibernamen nach der --driver Argument" #: src/main.c:196 #, c-format msgid "Unknown option '%s'" msgstr "Unbekannte Einstellung '%s'" #: src/main.c:340 msgid "" "Could not find home directory. Using current directory as home directory." msgstr "" "Kann Home Verzeichnis nicht finden. Benutze das aktuelle Verzeichnis als " "Home Verzeichnis." #: src/main.c:368 msgid "Black" msgstr "Schwarz" #: src/main.c:369 msgid "White" msgstr "Weiß" #: src/main.c:370 msgid "Background" msgstr "Hintergrund" #: src/main.c:371 msgid "L Waveform" msgstr "L Wellenform" #: src/main.c:372 msgid "R Waveform" msgstr "R Wellenform" #: src/main.c:373 msgid "Cursor" msgstr "Cursor" #: src/main.c:374 msgid "Marks" msgstr "Marken" #: src/main.c:375 msgid "Selection" msgstr "Markierung" #: src/main.c:376 msgid "Progress bar" msgstr "Forschrittsbalken" #: src/main.c:377 msgid "Zero-level" msgstr "Null-level" #: src/main.c:378 #, fuzzy msgid "Buffer position" msgstr "Puffer Überlauf!" #: src/main.c:501 #, c-format msgid "Error launching mixer: fork: %s" msgstr "Fehler beim Starten des Mixer: %s" #: src/main.c:552 src/main.c:571 msgid "Mono" msgstr "Mono" #: src/main.c:553 msgid "Left" msgstr "Links" #: src/main.c:554 msgid "Right" msgstr "Rechts" #: src/main.c:556 #, c-format msgid "Ch%d" msgstr "Ch%d" #: src/main.c:572 msgid "Stereo" msgstr "Stereo" #: src/main.c:574 #, c-format msgid "%d channels" msgstr "%d Kanäle" #: src/main.c:1149 msgid "Ignoring extreme old window size/position values\n" msgstr "Ignoriere extrem alte Fenster-größe/position\n" #: src/mainwindow.c:217 #, c-format msgid "mhWaveEdit: %s (%s): %d Hz, %s" msgstr "mhWaveEdit: %s (%s): %d Hz, %s" #: src/mainwindow.c:300 msgid "Use default settings" msgstr "Benutze Grundeinstellungen" #: src/mainwindow.c:304 msgid "Auto-detect from extension" msgstr "Automatisches Erkennen anhand der Dateiendung" #: src/mainwindow.c:319 msgid "File type: " msgstr "Dateityp: " #: src/mainwindow.c:365 msgid "" "The file has not changed since last save. Press OK if you want to save it " "anyway?" msgstr "" "Die Datei wurde dem letzten Speichern nicht verändert. Drücken Sie OK um Sie " "trotzdem zu speichern." #: src/mainwindow.c:374 msgid "Save File" msgstr "Speichere Datei" #: src/mainwindow.c:399 #, c-format msgid "Save changes to %s?" msgstr "Speichere Änderungen nach %s?" #: src/mainwindow.c:792 src/mainwindow.c:796 msgid "Load File" msgstr "Lade Datei" #: src/mainwindow.c:821 msgid "Save selection as ..." msgstr "Speichere Markierung als ..." #: src/mainwindow.c:1116 #, c-format msgid "Chunk %p has opencount=%d\n" msgstr "Bereich %p hat einen offenen Zähler von=%d\n" #: src/mainwindow.c:1199 #, c-format msgid "" "\n" "Window '%s'\n" msgstr "" "\n" "Fenster '%s'\n" #: src/mainwindow.c:1200 msgid " Current chunk:" msgstr " Momentaner Bereich:" #: src/mainwindow.c:1202 msgid " History:" msgstr " Geschichte:" #: src/mainwindow.c:1257 msgid "There already is only one channel!" msgstr "Es ist bereits nur ein Kanal vorhanden!" #: src/mainwindow.c:1366 msgid "mhWaveEdit Help" msgstr "mhWaveEdit Hilfe" #: src/mainwindow.c:1465 msgid "About mhWaveEdit" msgstr "Über mhWaveEdit" #: src/mainwindow.c:1477 #, fuzzy msgid "" "Created by Magnus Hjorth (magnus.hjorth@home.se)\n" "Copyright 2002-2018, Magnus Hjorth" msgstr "" "Programmiert von Magnus Hjorth (magnus.hjorth@home.se)\n" "Copyright 2002-2007, Magnus Hjorth" #: src/mainwindow.c:1484 #, c-format msgid "Current sound driver: %s" msgstr "Aktueller Musik Treiber: %s" #: src/mainwindow.c:1492 #, c-format msgid "Compiled %s %s" msgstr "Kompiliert %s %s" #: src/mainwindow.c:1498 msgid "Uses double-precision math" msgstr "Benutzt doppelt genau Berechnungen" #: src/mainwindow.c:1505 msgid "" "Distributed under GNU General Public License.\n" "For information, see the file COPYING" msgstr "" "Veröffentlicht unter der GNU General Public License.\n" "Für mehr Informationen siehe die Datei COPYING" #: src/mainwindow.c:1669 msgid "Seconds of silence: " msgstr "Sekunden der Lautlosigkeit: " #: src/mainwindow.c:1669 msgid "Insert Silence" msgstr "Füge Lautlosigkeit ein" #: src/mainwindow.c:1718 msgid "Level: " msgstr "Niveau:" #: src/mainwindow.c:1718 msgid "Normalize to..." msgstr "Normalisiere nach..." #: src/mainwindow.c:1928 msgid "/_File" msgstr "/Datei" #: src/mainwindow.c:1929 msgid "/File/_Open..." msgstr "/Datei/Öffnen..." #: src/mainwindow.c:1930 msgid "/File/_Save" msgstr "/Datei/_Speichern" #: src/mainwindow.c:1931 msgid "/File/Save _as..." msgstr "/Datei/Speichern als..." #: src/mainwindow.c:1932 msgid "/File/Save selection as..." msgstr "/Datei/Speichere Markierung als..." #: src/mainwindow.c:1933 msgid "/_Edit" msgstr "/B_earbeiten" #: src/mainwindow.c:1934 msgid "/Edit/_Undo" msgstr "/Bearbeiten/Rückgängig" #: src/mainwindow.c:1935 msgid "/Edit/_Redo" msgstr "/Bearbeiten/Wiede_rholen" #: src/mainwindow.c:1936 msgid "/Edit/sep1" msgstr "/Bearbeiten/sep1" #: src/mainwindow.c:1937 msgid "/Edit/Cu_t" msgstr "/Bearbeite/Ausschneiden" #: src/mainwindow.c:1938 msgid "/Edit/_Copy" msgstr "/Bearbeiten/Kopieren" #: src/mainwindow.c:1939 msgid "/Edit/_Paste" msgstr "/Bearbeiten/Einfügen" #: src/mainwindow.c:1940 msgid "/Edit/Paste _over" msgstr "/Bearbeiten/Einfügen (überschreiben)" #: src/mainwindow.c:1941 msgid "/Edit/_Mix paste" msgstr "/Bearbeiten/Einfügen (_Mischen)" #: src/mainwindow.c:1942 msgid "/Edit/Insert _silence" msgstr "/Bearbeiten/Füge Lautlosigkeit ein" #: src/mainwindow.c:1943 msgid "/Edit/Paste to _new" msgstr "/Bearbeiten/Einfügen (Neue Datei)" #: src/mainwindow.c:1944 msgid "/Edit/Cr_op" msgstr "/Bearbeiten/Unmarkierte Bereiche löschen" #: src/mainwindow.c:1945 msgid "/Edit/_Delete" msgstr "/Bearbeiten/Löschen" #: src/mainwindow.c:1946 msgid "/Edit/Silence selection" msgstr "/Bearbeiten/Mit Lautlosigkeit ersetzen" #: src/mainwindow.c:1947 msgid "/Edit/sep2" msgstr "/Bearbeiten/sep2" #: src/mainwindow.c:1948 msgid "/Edit/Select _all" msgstr "/Bearbeiten/Markiere _alles" #: src/mainwindow.c:1949 msgid "/Edit/Select none" msgstr "/Auswahl/Nichts auswählen" #: src/mainwindow.c:1950 msgid "/Edit/sep3" msgstr "/Bearbeiten/sep3" #: src/mainwindow.c:1951 msgid "/Edit/Clear clipboard" msgstr "/Bearbeiten/Lösche Zwischenablage" #: src/mainwindow.c:1952 msgid "/Edit/sep4" msgstr "/Bearbeiten/sep4" #: src/mainwindow.c:1953 msgid "/Edit/Preferences" msgstr "/Bearbeiten/Einstellungen" #: src/mainwindow.c:1954 msgid "/_View" msgstr "/Ansicht" #: src/mainwindow.c:1955 msgid "/View/Zoom _in" msgstr "/Ansicht/Vergrößern" #: src/mainwindow.c:1956 msgid "/View/Zoom _out" msgstr "/Ansicht/Verkleinern" #: src/mainwindow.c:1957 msgid "/View/Zoom to _selection" msgstr "/Ansicht/Markierung anzeigen" #: src/mainwindow.c:1958 msgid "/View/sep1" msgstr "/Ansicht/sep1" #: src/mainwindow.c:1959 msgid "/View/Zoom _all" msgstr "/Ansicht/_Alles" #: src/mainwindow.c:1960 msgid "/View/sep2" msgstr "/Ansicht/sep2" #: src/mainwindow.c:1961 msgid "/View/_Time scale" msgstr "/Ansicht/Zei_tskala" #: src/mainwindow.c:1962 msgid "/View/_Horizontal zoom" msgstr "/Ansicht/Horinzontal vergrößern" #: src/mainwindow.c:1963 msgid "/View/_Vertical zoom" msgstr "/Ansicht/_Vertikal vergrößern" #: src/mainwindow.c:1964 msgid "/View/Sp_eed slider" msgstr "/Ansicht/G_eschwindigkeitsregler" #: src/mainwindow.c:1965 #, fuzzy msgid "/View/Slider labels" msgstr "/Ansicht/G_eschwindigkeitsregler" #: src/mainwindow.c:1966 msgid "/View/Buffer position" msgstr "" #: src/mainwindow.c:1967 msgid "/_Cursor" msgstr "/_Cursor" #: src/mainwindow.c:1968 msgid "/Cursor/Set selection start" msgstr "/Cursor/Setze Markierungsbeginn" #: src/mainwindow.c:1970 msgid "/Cursor/Set selection end" msgstr "/Cursor/Setze Markierungsende" #: src/mainwindow.c:1971 msgid "/Cursor/sep1" msgstr "/Cursor/sep1" #: src/mainwindow.c:1972 msgid "/Cursor/Move to" msgstr "/Cursor/Bewegen zum" #: src/mainwindow.c:1973 msgid "/Cursor/Move to/Beginning" msgstr "/Cursor/Bewegen zum/Anfang" #: src/mainwindow.c:1975 msgid "/Cursor/Move to/End" msgstr "/Cursor/Bewegen zum/Ende" #: src/mainwindow.c:1976 msgid "/Cursor/Move to/Selection start" msgstr "/Cursor/Bewegen zum/Anfang der Markierung" #: src/mainwindow.c:1978 msgid "/Cursor/Move to/Selection end" msgstr "/Cursor/Bewegen zum/Ende der Markierung" #: src/mainwindow.c:1980 msgid "/Cursor/Move" msgstr "/Cursor/Bewegen" #: src/mainwindow.c:1981 msgid "/Cursor/Move/Left" msgstr "/Cursor/Bewegen/Nach Links" #: src/mainwindow.c:1982 msgid "/Cursor/Move/Right" msgstr "/Cursor/Bewegen/ Nach Rechts" #: src/mainwindow.c:1983 msgid "/Cursor/Move/Left sample" msgstr "/Cursor/Bewegen/Ein Sample nach Links" #: src/mainwindow.c:1984 msgid "/Cursor/Move/Right sample" msgstr "/Cursor/Bewegen/Ein Sample nach Rechts" #: src/mainwindow.c:1985 msgid "/Cursor/Find zero-crossing" msgstr "/Cursor/Finde eine Stelle wo die Null Linie gekreuzt wird" #: src/mainwindow.c:1986 msgid "/Cursor/Find zero-crossing/Left (all channels)" msgstr "" "/Cursor/Finde eine Stelle wo die Null Linie gekreuzt wird/Links (alle Kanäle)" #: src/mainwindow.c:1988 msgid "/Cursor/Find zero-crossing/Right (all channels)" msgstr "" "/Cursor/Finde eine Stelle wo die Null Linie gekreuzt wird/Rechts (alle " "Kanäle)" #: src/mainwindow.c:1990 msgid "/Cursor/Find zero-crossing/Left (any channel)" msgstr "" "/Cursor/Finde eine Stelle wo die Null Linie gekreuzt wird/Links (irgendein " "Kanal)" #: src/mainwindow.c:1992 msgid "/Cursor/Find zero-crossing/Right (any channel)" msgstr "" "/Cursor/Finde eine Stelle wo die Null Linie gekreuzt wird/Rechts (irgendein " "Kanal)" #: src/mainwindow.c:1994 msgid "/Cursor/sep2" msgstr "Cursor/sep2" #: src/mainwindow.c:1995 msgid "/Cursor/Position cursor..." msgstr "/Cursor/Positioniere Cursor..." #: src/mainwindow.c:1997 msgid "/_Play" msgstr "Wiedergabe" #: src/mainwindow.c:1998 msgid "/Play/_Play from cursor" msgstr "/Wiedergabe/An der Cursor Position beginnen" #: src/mainwindow.c:1999 msgid "/Play/Play _all" msgstr "/Wiedergabe/Alles wiedergeben" #: src/mainwindow.c:2000 msgid "/Play/Play se_lection" msgstr "/Wiedergabe/Gebe Markierung wieder" #: src/mainwindow.c:2001 msgid "/Play/_Stop" msgstr "/Wiedergabe/_Stoppen" #: src/mainwindow.c:2002 msgid "/Play/sep1" msgstr "/Wiedergabe/sep1" #: src/mainwindow.c:2003 msgid "/Play/_Record..." msgstr "/Wiedergabe/Aufnehmen..." #: src/mainwindow.c:2004 msgid "/Effec_ts" msgstr "/Effek_te" #: src/mainwindow.c:2005 msgid "/Effects/Fade _in" msgstr "/Effekte/E_inblenden" #: src/mainwindow.c:2006 msgid "/Effects/Fade o_ut" msgstr "/Effekte/Ausblenden" #: src/mainwindow.c:2007 msgid "/Effects/_Normalize" msgstr "/Effekte/_Normalisieren" #: src/mainwindow.c:2008 msgid "/Effects/Normali_ze to..." msgstr "/Effekte/Normalisiere nach..." #: src/mainwindow.c:2009 msgid "/Effects/_Volume adjust (fade)..." msgstr "/Efffekte/_Lautstärke verändern..." #: src/mainwindow.c:2010 msgid "/Effects/sep1" msgstr "/Effekte/sep1" #: src/mainwindow.c:2011 msgid "/Effects/Convert sample_rate..." msgstr "/Effekte/Ändere Samplerate..." #: src/mainwindow.c:2012 msgid "/Effects/Convert sample _format..." msgstr "/Effekte/Ändere Sampleformat..." #: src/mainwindow.c:2014 msgid "/Effects/B_yte swap" msgstr "/Effekte/B_yte tauschen" #: src/mainwindow.c:2015 msgid "/Effects/sep2" msgstr "/Effekte/sep2" #: src/mainwindow.c:2016 msgid "/Effects/_Mix to mono" msgstr "/Effekte/Auf _Mono runtermischen" #: src/mainwindow.c:2017 msgid "/Effects/Add channe_l" msgstr "/Effekte/Füge Kana_l hinzu" #: src/mainwindow.c:2018 msgid "/Effects/Ma_p channels..." msgstr "/Effekte/Kombiniere Kanäle..." #: src/mainwindow.c:2019 msgid "/Effects/_Combine channels..." msgstr "/Effekte/Führe Kanäle zusammen..." #: src/mainwindow.c:2020 #, fuzzy msgid "/Effects/Add channels from other file..." msgstr "/Effekte/Füge Kana_l hinzu" #: src/mainwindow.c:2021 msgid "/Effects/sep3" msgstr "/Effekte/sep3" #: src/mainwindow.c:2022 msgid "/Effects/_Speed adjustment..." msgstr "/Effekte/Ge_schwindigkeit verändern..." #: src/mainwindow.c:2023 msgid "/Effects/Pipe through program..." msgstr "/Effekte/Pipe zu einer anderen Anwendung..." #: src/mainwindow.c:2024 msgid "/Effects/sep4" msgstr "/Effekte/sep4" #: src/mainwindow.c:2025 msgid "/Effects/Effects dialog..." msgstr "/Effekte/Effekte Dialog..." #: src/mainwindow.c:2027 msgid "/Debug" msgstr "/Debug" #: src/mainwindow.c:2029 msgid "/Debug/Dummy effect" msgstr "/Debug/Dummy effect" #: src/mainwindow.c:2030 #, fuzzy msgid "/Debug/Dummy effect FP" msgstr "/Debug/Dummy effect" #: src/mainwindow.c:2031 msgid "/Debug/Check opencount" msgstr "/Debug/Check opencount" #: src/mainwindow.c:2032 msgid "/Debug/Dump chunk info" msgstr "/Debug/Dump chunk info" #: src/mainwindow.c:2034 msgid "/_Help" msgstr "/_Hilfe" #: src/mainwindow.c:2035 msgid "/Help/_Documentation" msgstr "/Hilfe/_Dokumentation" #: src/mainwindow.c:2036 msgid "/Help/_About" msgstr "/Hilfe/Info" #: src/mainwindow.c:2040 msgid "/File/sep1" msgstr "/Datei/sep1" #: src/mainwindow.c:2041 msgid "/File/_Close" msgstr "/Datei/S_chließen" #: src/mainwindow.c:2042 msgid "/File/sep2" msgstr "/Datei/sep2" #: src/mainwindow.c:2043 msgid "/File/_Exit" msgstr "/Datei/B_eenden" #: src/mainwindow.c:2215 msgid "Load a file from disk" msgstr "Lade Datei vom Speichermedium" #: src/mainwindow.c:2222 msgid "Save the current file to disk" msgstr "Speichere die aktuelle Datei ab" #: src/mainwindow.c:2231 msgid "Undo the last change" msgstr "Nehme die letzte Änderung zurück" #: src/mainwindow.c:2239 msgid "Redo the last undo operation" msgstr "Wiederhole die letzte 'Rückgängig' Aktion" #: src/mainwindow.c:2249 msgid "Cut out the current selection" msgstr "Schneide die aktuelle Markierung raus" #: src/mainwindow.c:2257 msgid "Copy the current selection" msgstr "Kopiere die aktuelle Markierung" #: src/mainwindow.c:2265 msgid "Paste at cursor position" msgstr "Füge an der Cursor Position ein" #: src/mainwindow.c:2273 msgid "Paste, overwriting the data after the cursor position" msgstr "Einfügen, überschreiben der Daten hinter der Cursor Position" #: src/mainwindow.c:2283 msgid "Delete the selection" msgstr "Lösche die Markierung" #: src/mainwindow.c:2292 msgid "Set selection start to cursor position" msgstr "Setze den Beginn der Markierung an die Cursor Position" #: src/mainwindow.c:2301 msgid "Set selection end to cursor position" msgstr "Setze das Markierungsende an die Cursor Position" #: src/mainwindow.c:2311 msgid "Play from cursor position" msgstr "Spiele ab der Cursor Position" #: src/mainwindow.c:2320 msgid "Play selected area" msgstr "Spiele markierten Bereich" #: src/mainwindow.c:2329 msgid "Stop playing" msgstr "Wiedergabe stoppen" #: src/mainwindow.c:2339 msgid "Loop mode (play over and over)" msgstr "Schleifen Modus (Immer wieder von neuem abspielen)" #: src/mainwindow.c:2349 msgid "Keep view and playback together" msgstr "" #: src/mainwindow.c:2362 msgid "Auto return to playback start" msgstr "Automatische Rückkehr zum Wiedergabebeginn" #: src/mainwindow.c:2376 src/recorddialog.c:874 msgid "Record" msgstr "Aufnahme" #: src/mainwindow.c:2385 src/recorddialog.c:983 msgid "Launch mixer" msgstr "Starte Mixer" #: src/pipedialog.c:92 msgid "Command line: " msgstr "Kommandozeile: " #: src/pipedialog.c:99 msgid "Send wav header" msgstr "Sende WAV Kopf" #: src/pipedialog.c:153 msgid "Process output" msgstr "Prozeßausgabe" #: src/pipedialog.c:178 #, c-format msgid "" "Output from command '%s':\n" "\n" msgstr "" "Ausgabe vom Kommando '%s':\n" "\n" #: src/pipedialog.c:201 #, c-format msgid "Could not create pipe: %s" msgstr "Kann Pipe nicht erzeugen: %s" #: src/pipedialog.c:216 #, c-format msgid "Error: fork: %s" msgstr "Error: Fork: %s" #: src/pipedialog.c:268 msgid "Should not reach this point!" msgstr "Dieser Punkt sollte nicht erreicht werden!" #: src/pipedialog.c:482 msgid "Command failed without returning any data" msgstr "Kommando ohne die Rückgabe von Daten fehlgeschlagen" #: src/pipedialog.c:492 #, c-format msgid "Error: %s" msgstr "Fehler: %s" #: src/player.c:294 msgid "The sound format of this file is not supported for playing." msgstr "" "Zum Abspielen wird das Musikformat dieser Datei wird nicht unterstützt." #: src/rateconv.c:97 #, c-format msgid "Error initialising sample rate conversion: %s" msgstr "Fehler beim Initialisieren der Samplerate Konvertierung: %s" #: src/rateconv.c:162 #, c-format msgid "Error converting samplerate: %s\n" msgstr "Fehler beim Konvertieren der Samplerate: %s\n" #: src/rateconv.c:201 #, c-format msgid "Error changing samplerate conversion ratio: %s\n" msgstr "Fehler beim wechseln der Samplerate Konvertierungsverhältnis: %s\n" #: src/rateconv.c:323 msgid "Unexpected EOF in connection to subprocess" msgstr "Unerwartetes EOF bei der Verbindung zum Unterprozeß" #: src/rateconv.c:327 #, c-format msgid "Error writing to subprocess: %s" msgstr "Kann nicht zum Unterprozeß schreiben: %s" #: src/rateconv.c:383 src/rateconv.c:405 #, c-format msgid "Error reading from sub process: %s" msgstr "Fehler beim Lesen vom Unterprozeß: %s" #: src/rateconv.c:413 msgid "SoX closed connection too early!" msgstr "SoX hat die Verbindung zu früh beendet!" #: src/rateconv.c:599 msgid "(SoX) Simulated analog filtration" msgstr "(SoX) Simulierte analog Filterung" #: src/rateconv.c:605 msgid "(SoX) Polyphase interpolation" msgstr "(SoX) Polyphase interpolieren" #: src/rateconv.c:612 msgid "Sample repeat/skip (low quality)" msgstr "Sample wiederholen/überspringen (geringe Qualität)" #: src/rawdialog.c:42 msgid "header size" msgstr "Größe des Headers" #: src/rawdialog.c:73 msgid "Unknown file format" msgstr "Unbekanntes Dateiformat" #: src/rawdialog.c:80 #, c-format msgid "" "The format of file '%s' could not be recognized.\n" "\n" "Please specify the sample format below." msgstr "" "Das Format der Datei '%s' kann nicht erkannt werden.\n" "\n" "Bitte geben Sie das Sampleformat an." #: src/rawdialog.c:92 msgid "Header bytes: " msgstr "Header Bytes: " #: src/recorddialog.c:207 src/recorddialog.c:671 src/recorddialog.c:918 msgid "(no limit)" msgstr "(kein Limit)" #: src/recorddialog.c:314 msgid "Mild" msgstr "Leicht" #: src/recorddialog.c:316 msgid "Heavy" msgstr "Schwer" #: src/recorddialog.c:430 msgid "Update preset" msgstr "" #: src/recorddialog.c:435 msgid "Add preset" msgstr "" #: src/recorddialog.c:514 msgid "Custom format" msgstr "Eigenes Format" #: src/recorddialog.c:552 msgid "" "The sign and endian-ness can usually be left at their defaults, but should " "be changed if you're unable to record or get bad sound." msgstr "" "Signed und Endian können normalerweise auf ihren Grundeinstellungen bleiben, " "aber sollten geändert werden, wenn Sie keine Musik aufnehmen können oder " "seltsame Töne bekommen." #: src/recorddialog.c:566 msgid "Name :" msgstr "Name :" #: src/recorddialog.c:578 msgid "Presets:" msgstr "" #: src/recorddialog.c:593 #, fuzzy msgid "Set format" msgstr "Datei Formate" #: src/recorddialog.c:601 msgid "Add/Update preset" msgstr "" #: src/recorddialog.c:654 msgid "" "Invalid time value. Time must be specified in the form (HH')MM:SS(.mmmm)" msgstr "" "Falscher Zeit Wert. Zeit muß in der Form (HH')MM:SS(.mmmm) angegeben werden" #: src/recorddialog.c:698 src/recorddialog.c:948 msgid "Format not selected" msgstr "Format nicht ausgewählt" #: src/recorddialog.c:705 msgid "This format is not supported by the input driver!" msgstr "Dieses Format wird vom Musiktreiber nicht unterstützt!" #: src/recorddialog.c:710 msgid "Ready for recording" msgstr "Bereit zum Aufnehmen" #: src/recorddialog.c:723 msgid "Peak: " msgstr "Momentan: " #: src/recorddialog.c:724 msgid "Peak max: " msgstr "Maximum: " #: src/recorddialog.c:725 msgid "RMS: " msgstr "RMS: " #: src/recorddialog.c:726 msgid "Clipping: " msgstr "Unterbrechungen: " #: src/recorddialog.c:795 msgid "Resume recording" msgstr "Weiter Aufnehmen" #: src/recorddialog.c:795 src/recorddialog.c:815 msgid "Pause recording" msgstr "Aufnahme anhalten" #: src/recorddialog.c:797 msgid "RecordStatus|Paused" msgstr "Angehalten" #: src/recorddialog.c:798 src/recorddialog.c:823 msgid "RecordStatus|Recording" msgstr "Aufnahme läuft" #: src/recorddialog.c:818 msgid "Finish" msgstr "Fertig" #: src/recorddialog.c:826 msgid "Overruns: " msgstr "Puffer voll: " #: src/recorddialog.c:829 msgid "Bytes written: " msgstr "geschriebene Bytes: " #: src/recorddialog.c:830 msgid "Auto stop in: " msgstr "Automatischer Stop in: " #: src/recorddialog.c:894 msgid "Recording settings" msgstr "Aufnahme Einstellungen" #: src/recorddialog.c:901 msgid "Sample format: " msgstr "Sampleformat: " #: src/recorddialog.c:916 msgid "Time limit: " msgstr "Zeit Limit: " #: src/recorddialog.c:924 msgid "Disable" msgstr "Abschalten" #: src/recorddialog.c:930 msgid "Set" msgstr "Setze" #: src/recorddialog.c:942 msgid "Input levels" msgstr "Eingangslevel" #: src/recorddialog.c:947 msgid "Recording status: " msgstr "Aufnahme Status" #: src/recorddialog.c:952 msgid "Time recorded: " msgstr "Aufgenommene Zeit: " #: src/recorddialog.c:953 msgid "N/A" msgstr "N/V" #: src/recorddialog.c:966 msgid "Start recording" msgstr "Beginne Aufnahme" #: src/recorddialog.c:977 msgid "Reset max peaks" msgstr "Stelle Maximum zurück" #: src/sampleratedialog.c:87 msgid "" "(This changes the sample rate of \n" "the entire file, not just the selection)" msgstr "" "(Dies ändert die Samplerate der \n" "gesamten Datei, nicht nur der Markierung)" #: src/sampleratedialog.c:92 msgid "New samplerate: " msgstr "Neue Samplerate: " #: src/sampleratedialog.c:99 msgid "Method: " msgstr "Methode:" #: src/samplesizedialog.c:38 msgid "File already has the selected sample format" msgstr "" #: src/samplesizedialog.c:87 msgid "" "(This changes the sample type of the entire file, not just the selection)" msgstr "" "(Es wird der Sampletyp der gesamten Datei geändert, nicht nur der der " "Markierung)" #: src/samplesizedialog.c:99 msgid "Don't actually change the data (for repairing bad files etc)" msgstr "" "Aktuell die Daten nicht ändern ( um fehlerhafte Dateien zu reparieren usw.)" #: src/sound-alsalib.c:73 msgid "ALSA Preferences" msgstr "ALSA Einstellungen" #: src/sound-alsalib.c:81 msgid "Playback device: " msgstr "Wiedergabe Gerät: " #: src/sound-alsalib.c:85 msgid "Recording device: " msgstr "Aufnahme Gerät: " #: src/sound-alsalib.c:91 msgid "Event driven I/O" msgstr "" #: src/sound-alsalib.c:123 #, c-format msgid "Error opening ALSA device '%s' for recording: %s" msgstr "Fehler beim öffnen des ALSA Geräts '%s' zum Aufnehmen: %s" #: src/sound-alsalib.c:125 #, c-format msgid "Error opening ALSA device '%s' for playback: %s" msgstr "Fehler beim öffnen des ALSA Geräts '%s' zur Wiedergabe: %s" #: src/sound-alsalib.c:273 msgid "snd_pcm_hw_params_set_access failed" msgstr "snd_pcm_hw_params_set_access fehlgeschlagen" #: src/sound-alsalib.c:278 msgid "snd_pcm_hw_params_set_format failed" msgstr "snd_pcm_hw_params_set_format fehlgeschlagen" #: src/sound-alsalib.c:283 msgid "snd_pcm_hw_params_set_channels failed" msgstr "snd_pcm_hw_params_set_channels fehlgeschlagen" #: src/sound-alsalib.c:288 msgid "snd_pcm_hw_params_set_rate failed" msgstr "snd_pcm_hw_params_set_rate fehlgeschlagen" #: src/sound-alsalib.c:293 #, fuzzy msgid "snd_pcm_hw_params_set_buffer_size_last failed" msgstr "snd_pcm_hw_params_set_format fehlgeschlagen" #: src/sound-alsalib.c:436 src/sound-alsalib.c:492 msgid "" msgstr "" #: src/sound-alsalib.c:536 msgid "" msgstr "" #: src/sound.c:167 msgid "SDL (output only)" msgstr "SDL (nur Ausgabe)" #: src/sound.c:209 msgid "Dummy (no sound)" msgstr "Dummy (keine Musik)" #: src/sound.c:334 #, c-format msgid "" "Invalid driver name: %s\n" "Using '%s' driver instead" msgstr "" "Falscher Treiber Name: %s\n" "Benutze '%s' Treiber stattdessen" #: src/sound-esound.c:59 #, c-format msgid "Couldn't connect to ESD daemon: %s" msgstr "Kann keine Verbindung zum ESD Dämon aufbauen: %s" #: src/sound-esound.c:114 msgid "EsounD: Unable to open playback stream" msgstr "EsounD: Kann den Wiedergabestream nicht öffnen" #: src/sound-esound.c:130 msgid "EsounD: Unable to open recording stream" msgstr "EsounD: Kann den Aufnahmestream nicht öffnen" #: src/sound-esound.c:145 src/sound-esound.c:217 msgid "EsounD driver: select" msgstr "EsounD Treiber: gewählt" #: src/sound-esound.c:157 msgid "EsounD driver: write" msgstr "EsounD Treiber: schreibe" #: src/sound-esound.c:221 msgid "Esound connection closed by server" msgstr "EsounD Verbindung vom Server beendet" #: src/sound-esound.c:227 msgid "EsounD driver: read" msgstr "EsounD Treiber: lese" #: src/sound-esound.c:241 msgid "jump delay" msgstr "Sprung Verzögerung" #: src/sound-esound.c:255 msgid "ESD preferences" msgstr "ESD Einstellungen" #: src/sound-esound.c:263 msgid "" "If the cursor starts running too early when jumping, this delay should be " "increased." msgstr "" "Wenn der Cursor sich zu früh bewegt beim springen, sollte diese Verzögerung " "erhöht werden." #: src/sound-esound.c:269 msgid "Jump delay:" msgstr "Sprung Verzögerung:" #: src/sound-esound.c:278 msgid "" "Selecting the ESD host to connect to is done through the ESPEAKER " "environment variable." msgstr "" "Das Auswählen des ESD Host wird über die Umgebungsvariable ESPEAKER getätigt." #: src/sound-jack.c:117 msgid "Invalid number of input ports." msgstr "Ungültige Anzahl von Eingangsports" #: src/sound-jack.c:121 msgid "Invalid number of output ports." msgstr "Ungültige Anzahl von Ausgangsports" #: src/sound-jack.c:130 msgid "The client name change won't take effect until you restart the program." msgstr "" "Die Änderung des Klientnames wird erst nach dem Neustarten des Programms " "aktiv." #: src/sound-jack.c:187 msgid " Input ports " msgstr " Eingangsport " #: src/sound-jack.c:188 msgid " Output ports " msgstr " Ausgangsports " #: src/sound-jack.c:197 msgid "Jack Preferences" msgstr "Jack Einstellungen" #: src/sound-jack.c:206 msgid "Client name: " msgstr "Klient Name: " #: src/sound-jack.c:223 msgid "Number of ports (0-8): " msgstr "Anzahl der Ports (0-8): " #: src/sound-jack.c:231 #, c-format msgid "Port #%d" msgstr "Port #%d" #: src/sound-jack.c:244 msgid "Automatically connect input ports on startup" msgstr "Verbinde automatische Eingangsports bei Starten" #: src/sound-jack.c:250 msgid "Automatically connect output ports on startup" msgstr "Verbinde automatisch Ausgangsports beim Starten" #: src/sound-jack.c:402 msgid "Over/underrun in JACK driver" msgstr "Puffer leer/voll im JACK Treiber" #: src/sound-jack.c:417 msgid "jack_get_ports returned NULL" msgstr "jack_get_ports gibt NULL zurück" #: src/sound-jack.c:433 #, c-format msgid "Connection from %s to %s failed: %s" msgstr "Verbindung von %s nach %s fehlgeschlagen: %s" #: src/sound-jack.c:480 msgid "Could not connect to the JACK server." msgstr "Kann keine Verbindung zum JACK Server aufbauen." #: src/sound-jack.c:494 msgid "Activation failed!" msgstr "Aktivierung fehlgeschlagen!" #: src/sound-jack.c:825 #, c-format msgid "" "With JACK, the only supported recording format is Floating-point, single " "precision, %d Hz" msgstr "" "Jack unterstützt nur das Aufnahmeformat Fließpunkt, einfache Präzision, %d Hz" #: src/sound-oss.c:96 #, c-format msgid "Could not open '%s': %s" msgstr "Kann '%s' nicht öffnen: %s" #: src/sound-oss.c:109 #, c-format msgid "Error in sound driver: ioctl failed: %s" msgstr "Fehler im Musik Treiber: IOCTL Fehler: %s" #: src/sound-oss.c:216 #, c-format msgid "Error in sound driver: write failed: %s" msgstr "Fehler im Musik Treiber: schreiben fehlgeschlagen: %s" #: src/sound-oss.c:229 #, c-format msgid "Error in sound driver: read failed: %s" msgstr "Fehler im Musiktreiber: Lesen ist fehlgeschlagen: %s" #: src/sound-oss.c:253 src/sound-oss.c:385 #, c-format msgid "Error in sound driver: select failed: %s" msgstr "Fehler im Musik Treiber: Auswahl fehlgeschlagen: %s" #: src/sound-oss.c:440 msgid "OSS preferences" msgstr "OSS Einstellungen" #: src/sound-oss.c:450 #, fuzzy msgid "Playback device file:" msgstr "Wiedergabe Gerät: " #: src/sound-oss.c:459 #, fuzzy msgid "Recording device file:" msgstr "Aufnahme Gerät: " #: src/sound-oss.c:465 msgid "Avoid select calls (try this if recording locks up)" msgstr "" "Vermeide Select Aufrufe (Probiere dies wenn das Aufnehmen das Programm " "blockiert)" #: src/sound-portaudio.c:61 msgid "sound-portaudio: No output devices available!" msgstr "sound-portaudio: Kein Ausgabegerät vorhanden!" #: src/sound-portaudio.c:63 msgid "sound-portaudio: No input devices available!" msgstr "sound-portaudio: Keine Eingabegeräte verfügbar!" #: src/sound-portaudio.c:191 src/sound-portaudio.c:278 #, c-format msgid "Pa_OpenStream failed: %s\n" msgstr "Pa_OpenStream fehlgeschlagen: %s\n" #: src/sound-portaudio.c:252 msgid "Buffer overrun!" msgstr "Puffer Überlauf!" #: src/sound-sdl.c:38 #, c-format msgid "Could not initialize SDL: %s" msgstr "Kann SDL nicht initialisieren: %s" #: src/sound-sdl.c:89 #, c-format msgid "SDL: Couldn't open audio: %s" msgstr "SDL: Kann Musik Gerät nicht öffnen: %s" #: src/sound-sun.c:72 #, c-format msgid "SunAudio: Couldn't open %s" msgstr "SunAudio: Kann %s nicht öffen" #: src/sound-sun.c:159 msgid "SunAudio: Error writing to sound device" msgstr "SunAudio: Fehler beim schreiben auf dem Musik Gerät" #: src/sound-sun.c:241 msgid "SunAudio: Error reading from sound device" msgstr "SunAudio: Fehler beim Lesen vom Musik Gerät" #: src/soxdialog.c:54 msgid "Echo" msgstr "Echo" #: src/soxdialog.c:55 msgid "Echo sequence" msgstr "Echo Sequence" #: src/soxdialog.c:56 msgid "Reverb" msgstr "Hall" #: src/soxdialog.c:57 msgid "Chorus" msgstr "Chorus" #: src/soxdialog.c:58 msgid "Flanger" msgstr "Flanger" #: src/soxdialog.c:59 msgid "Phaser" msgstr "Phaser" #: src/soxdialog.c:60 msgid "Compress/Expand" msgstr "Compress/Expand" #: src/soxdialog.c:61 msgid "Pitch adjust" msgstr "Tonhöhe verändern" #: src/soxdialog.c:62 msgid "Time stretch" msgstr "Zeit dehnen" #: src/soxdialog.c:63 msgid "DC Shift" msgstr "DC Shift" #: src/soxdialog.c:64 msgid "Masking noise" msgstr "Erzeuge Rauschen" #: src/soxdialog.c:65 msgid "Reverse" msgstr "Umkehren" #: src/soxdialog.c:66 msgid "Earwax" msgstr "Earwax" #: src/soxdialog.c:67 msgid "Vibro" msgstr "Vibrationen" #: src/soxdialog.c:68 msgid "Lowpass filter (single-pole)" msgstr "Tiefpass Filter (single-pole)" #: src/soxdialog.c:69 msgid "Highpass filter (single-pole)" msgstr "Hochpass Filter (single-pole)" #: src/soxdialog.c:70 msgid "Bandpass filter" msgstr "Bandpass Filter" #: src/soxdialog.c:71 msgid "Butterworth lowpass filter" msgstr "Butterworth Tiefpass Filter" #: src/soxdialog.c:72 msgid "Butterworth highpass filter" msgstr "Butterworth Hochpass Filter" #: src/soxdialog.c:73 msgid "Butterworth bandpass filter" msgstr "Butterworth Bandpass Filter" #: src/soxdialog.c:74 msgid "Butterworth bandreject filter" msgstr "Butterworth bandreject filter" #: src/soxdialog.c:75 msgid "Sinc-windowed filter" msgstr "Sinc-windowed filter" #: src/soxdialog.c:312 msgid "Frequency: " msgstr "Frequenz: " #: src/soxdialog.c:317 src/soxdialog.c:324 src/soxdialog.c:483 #: src/soxdialog.c:485 msgid "Hz" msgstr "Hz" #: src/soxdialog.c:327 msgid "Noise mode" msgstr "Geräusch Modus" #: src/soxdialog.c:387 msgid "Reverb time: " msgstr "Hall Zeit: " #: src/soxdialog.c:392 msgid "ms" msgstr "ms" #: src/soxdialog.c:397 msgid "Delay (ms) " msgstr "Verzögerung (ms) " #: src/soxdialog.c:400 msgid "Decay " msgstr "Verfall " #: src/soxdialog.c:404 msgid "Speed (Hz) " msgstr "Geschwindigkeit (Hz) " #: src/soxdialog.c:408 msgid "Depth (ms) " msgstr "Tiefe (ms) " #: src/soxdialog.c:412 msgid "Modulation " msgstr "Modulation " #: src/soxdialog.c:415 msgid "Modulation|Sinusoidal" msgstr "Sinusodal" #: src/soxdialog.c:416 msgid "Modulation|Triangular" msgstr "Triangular" #: src/soxdialog.c:429 msgid "(Lines with delay=0 will be ignored.)" msgstr "(Zeilen mit einer Verzögerung von 0 werden ignoriert.)" #: src/soxdialog.c:448 src/soxdialog.c:450 src/soxdialog.c:454 #: src/soxdialog.c:456 src/soxdialog.c:458 msgid "Input gain: " msgstr "Eingang verstärken: " #: src/soxdialog.c:452 msgid "Output gain: " msgstr "Ausgang verstärken: " #: src/soxdialog.c:464 msgid "Width: " msgstr "Breite: " #: src/soxdialog.c:470 src/soxdialog.c:472 msgid "Bandwidth: " msgstr "Bandbreite: " #: src/soxdialog.c:481 msgid "Filter type: " msgstr "Filtertyp: " #: src/soxdialog.c:482 msgid "Low 6dB corner: " msgstr "Niedrige 6dB Ecke: " #: src/soxdialog.c:484 msgid "High 6db corner: " msgstr "Hohe 6dB Ecke: " #: src/soxdialog.c:486 msgid "Window length: " msgstr "Fensterlänge: " #: src/soxdialog.c:488 msgid "Beta" msgstr "Beta" #: src/soxdialog.c:491 msgid "Lowpass" msgstr "Tiefpass" #: src/soxdialog.c:492 msgid "Highpass" msgstr "Hochpass" #: src/soxdialog.c:493 msgid "Bandpass" msgstr "Bandpass" #: src/soxdialog.c:526 msgid "Attack integration time: " msgstr "Attack integration time: " #: src/soxdialog.c:530 src/soxdialog.c:535 src/soxdialog.c:565 msgid " seconds" msgstr " sekunden" #: src/soxdialog.c:531 msgid "Decay integration time: " msgstr "Decay integration time: " #: src/soxdialog.c:538 msgid "Input level (dB)" msgstr "Eingangslevel (dB)" #: src/soxdialog.c:539 msgid "Output level (dB)" msgstr "Ausgangslevel (dB)" #: src/soxdialog.c:552 msgid "Post-processing gain: " msgstr "Post-Prozessing Verstärkung" #: src/soxdialog.c:556 msgid " dB" msgstr " dB" #: src/soxdialog.c:557 msgid "Initial volume: " msgstr "Ursprüngliche Lautstärke" #: src/soxdialog.c:561 msgid "Delay time: " msgstr "Verzögerungszeit: " #: src/soxdialog.c:570 msgid "Shift amount: " msgstr "Verschiebung:" #: src/soxdialog.c:574 msgid "Peak limiter" msgstr "Maximumbegrenzer" #: src/soxdialog.c:578 msgid "Limiter gain: " msgstr "Verstärkungslimit: " #: src/soxdialog.c:591 msgid "Amount: " msgstr "Menge: " #: src/soxdialog.c:592 msgid " cents" msgstr " cents" #: src/soxdialog.c:593 msgid "Window width: " msgstr "Fensterbreite: " #: src/soxdialog.c:594 src/soxdialog.c:625 msgid " ms" msgstr " ms" #: src/soxdialog.c:595 msgid "Interpolation: " msgstr "Interpolieren: " #: src/soxdialog.c:596 msgid "Fade: " msgstr "Ein/Ausblenden: " #: src/soxdialog.c:605 msgid "Interpolation|Cubic" msgstr "Kubisch" #: src/soxdialog.c:606 msgid "Interpolation|Linear" msgstr "Linear" #: src/soxdialog.c:612 msgid "Fade|Cos" msgstr "Cos" #: src/soxdialog.c:613 msgid "Fade|Hamming" msgstr "Hamming" #: src/soxdialog.c:614 msgid "Fade|Linear" msgstr "Linear" #: src/soxdialog.c:615 msgid "Fade|Trapezoid" msgstr "Trapezoid" #: src/soxdialog.c:623 msgid "Factor: " msgstr "Faktor:" #: src/soxdialog.c:624 msgid "Window size: " msgstr "Fenstergröße: " #: src/soxdialog.c:636 msgid "Speed: " msgstr "Geschwindigkeit:" #: src/soxdialog.c:637 msgid " Hz" msgstr " Hz" #: src/soxdialog.c:638 msgid "Depth: " msgstr "Tiefe: " #: src/soxdialog.c:649 msgid "This effect has no options." msgstr "Dieser Effekt hat keine Einstellmöglichkeiten." #: src/soxdialog.c:723 msgid "Error creating pipe" msgstr "Kann Pipe nicht erzeugen" #: src/soxdialog.c:730 msgid "Couldn't fork" msgstr "Kann nicht verzweigen" #: src/soxdialog.c:745 #, c-format msgid "Error running 'sox -h': %s\n" msgstr "Fehler beim laufen lassen von 'sox -h': %s\n" #: src/soxdialog.c:747 msgid "Should not reach this point" msgstr "Sollte diesen Punkt nicht erreichen" #: src/soxdialog.c:762 msgid "Error reading sox output" msgstr "Fehler beim Lesen der SoX Ausgabe" #: src/soxdialog.c:794 msgid "Unable to detect supported SoX effects" msgstr "Kann SoX unterstützte Effekte nicht finden" #: src/soxdialog.c:832 msgid "Sox support couldn't be initialized" msgstr "Sox kann nicht gestartet werden" #: src/speeddialog.c:58 msgid "Speed:" msgstr "Geschwindigkeit:" #: src/statusbar.c:72 msgid "(no file loaded)" msgstr "(keine Datei geladen)" #: src/statusbar.c:235 msgid "Cursor: running" msgstr "Cursor: laufend" #: src/statusbar.c:237 msgid "Cursor: " msgstr "Cursor: " #: src/statusbar.c:260 #, c-format msgid "View: [ %s - %s ]" msgstr "Ansicht: [ %s - %s ]" #: src/statusbar.c:281 #, c-format msgid "Selection: %s+%s" msgstr "Markierung: %s+%s" #: src/statusbar.c:304 msgid "Processing data" msgstr "Bearbeite Daten" #: src/statusbar.c:306 #, c-format msgid "%s... (Press ESC to cancel)" msgstr "%s... (Drücke ESC zum Abbrechen)" #: src/um.c:51 msgid "mhWaveEdit: " msgstr "mhWaveEdit: " #: src/um.c:64 #, c-format msgid "mhWaveEdit: %s: %s\n" msgstr "mhWaveEdit: %s: %s\n" #: src/um.c:97 msgid "Message" msgstr "Nachricht" #: src/um.c:117 msgid "Yes" msgstr "Ja" #: src/um.c:125 msgid "No" msgstr "Nein" #: src/um.c:318 msgid "Input" msgstr "EIngabe" #: src/um.c:407 msgid "Choice" msgstr "Wahl" #: src/volumedialog.c:71 msgid "Calculating peak volume..." msgstr "Errechne höchste Lautstärke" #: src/volumedialog.c:87 msgid "Start:" msgstr "Start:" #: src/volumedialog.c:90 msgid "End:" msgstr "Ende:" #: src/volumedialog.c:109 msgid "Find top volume" msgstr "Finde höchste Lautstärke" #: src/document.c:230 #, c-format msgid "untitled #%d" msgstr "ohne Namen #%d" #: src/document.c:282 msgid "" "Loading and then saving files with 'lossy' formats (like mp3 and ogg) leads " "to a quality loss, also for the unmodified parts of the file." msgstr "" "Das Laden und Speicher von Dateien mit 'verlustbehafteten' Formaten (wie MP3 " "und Ogg) bringt einen Qualitätsverlust mit sich, auch für die nicht " "veränderten Teile der Datei." #: src/session.c:87 msgid "Error opening session directory" msgstr "Kann Sitzungsverzeichnis nicht öffnen" #: src/session.c:104 src/session.c:164 #, c-format msgid "%s: Wrong file type" msgstr "%s: Falscher Dateityp" #: src/session.c:238 msgid "Could not create session file" msgstr "Kann Sitzungsdatei nicht erstellen" #: src/session.c:280 msgid "" "The files that belonged to the crashed session have been recovered. Any " "files that are not saved will be removed permanently.\n" "\n" "(This notice is only shown once)" msgstr "" "Die Dateien die zu der abgestürzten Sitzung gehören sind wiederhergestellt. " "Jede Datei die nicht gespeichert ist wird dauerhaft gelöscht.\n" "\n" "(Diese Notiz wird nur einmal angezeigt)" #: src/session.c:380 msgid "Suspended" msgstr "Unterbrochen" #: src/session.c:380 src/session.c:381 msgid "Crash" msgstr "Absturz" #: src/session.c:381 msgid "Left files" msgstr "Zurückgebliebene Dateien" #: src/session.c:391 #, c-format msgid "%s on %s(%d files, %ld bytes)" msgstr "%s von %s(%d Dateien, %ld bytes)" #: src/session.c:409 msgid "Sessions" msgstr "Sitzungen" #: src/session.c:419 msgid "" "Earlier sessions were found. Choose one to resume or start a new session." msgstr "" "Ältere Sitzungen sind gefunden worden. Wählen Sie eine zum Wiederherstellen " "oder starten Sie eine neue Sitzung." #: src/session.c:439 msgid "Resume selected" msgstr "Wiederherstellung ausgewählt" #: src/session.c:449 #, fuzzy msgid "Delete selected" msgstr "Lösche die Markierung" #: src/session.c:456 msgid "Start new session" msgstr "Eine neue Sitzung starten" #: src/session.c:462 msgid "Exit" msgstr "Beenden" #: src/mapchannelsdialog.c:116 msgid "This effect applies to the whole file, not just the selection" msgstr "" " Dieser Effekt wirkt auf das gesamte Musikstück, nicht nur auf die Markierung" #: src/mapchannelsdialog.c:123 msgid "Output channels: " msgstr "Ausgabe-Kanäle:" #: src/mapchannelsdialog.c:130 msgid "Map" msgstr "Abbilden" #: src/mapchannelsdialog.c:137 msgid "Source" msgstr "Quelle" #: src/mapchannelsdialog.c:139 msgid "Destination" msgstr "Ziel" #: src/sandwichdialog.c:107 #, fuzzy msgid "Align beginning of files" msgstr "hinter dem Anfang der Datei" #: src/sandwichdialog.c:110 #, fuzzy msgid "Align end of files" msgstr "hinter dem Ende der Datei" #: src/sandwichdialog.c:113 #, fuzzy msgid "Align at marker: " msgstr "Klient Name: " #: src/sandwichdialog.c:126 #, fuzzy msgid "Add channels from: " msgstr "Kanal hinzufügen" #: src/sandwichdialog.c:130 msgid "Alignment" msgstr "" #~ msgid "double" #~ msgstr "doppelt" #~ msgid "float" #~ msgstr "einfach" #~ msgid "mhWaveEdit: %s (%s): %d Hz, %d bit" #~ msgstr "mhWaveEdit: %s (%s): %d Hz, %d bit" #~ msgid "Follow cursor while playing" #~ msgstr "Folge dem Cursor bei der Wiedergabe" #~ msgid "Removing channel" #~ msgstr "Lösche Kanal" #~ msgid "Mapping channels" #~ msgstr "Kombiniere Kanäle" #~ msgid "Removing channels" #~ msgstr "Entferne Kanäle" #~ msgid "Choose a sample format" #~ msgstr "Wähle ein Sampleformat" #~ msgid "%d-bit" #~ msgstr "%d-bit" #~ msgid "%s (%s %s %d Hz)" #~ msgstr "%s (%s %s %d Hz)" #~ msgid "%s %s %d Hz" #~ msgstr "%s %s %d Hz" #~ msgid "Other format..." #~ msgstr "Anderes Format..." #~ msgid "" #~ "To add this format to the presets, enter a name below. Otherwise, leave " #~ "it blank." #~ msgstr "" #~ "Um dieses Format zu den Voreinstellungen zu speichern geben Sie einen " #~ "Namen ein. Anderfalls lassen Sie das Feld frei." #~ msgid "Sound device file:" #~ msgstr "Musik Gerätedatei: " #~ msgid "" #~ "Environment variable LADSPA_PATH not set.\n" #~ "LADSPA support is disabled." #~ msgstr "" #~ "Die Umgebungsvariable LADSPA_PATH ist nicht gesetzt.\n" #~ "Die LADSPA Unterstütztung wird deaktiviert." mhwaveedit-1.4.24/po/es.gmo000066400000000000000000001404501334022513400154710ustar00rootroot00000000000000;#/./ /:/ )040<0 P0\0m000 00 0 000011-1J1 d1r1111111 11 1122/2E2 T2%`22!2J2I3 [3g3 x3V3334 +4 84E4L4 b4 n4y444444 4 4 5 5 )5 55 A5 L5 W5 b5 m5w5"55555 6/6M6a6!6 6 6 6 666 7 77 .7 :7 E7 P7]7r7777 7 7777 8848K8]8 r8 }8888888*8 8!8 9i9 9,9-9#9> : J:T:e:v::::=; F;Q; W;b; w;$;;;;;,<-.<\<3l< << << < <<< <===== == = ===)>0>?>#N>r>>!>>> >%>?I,?%v?????@@"5@ X@f@w@k@@A AA,A >ALAaAA{B B BB BBBBBSB<RCCCC"CCCD!D@DPD UD/bDD DDD'D&$E(KE'tE-EE/E0FKF`F"zFFFFF GG$G8GNG&cG'G"G*GHH"H)H 2H ?HKHZHoHH H HH HHHHIDI_I sIII IIIIITI(JJKDMUM [MhM yM!MM MMMM1M,NKN@kNHNN O%O08OiO |OO OOO O O OOOPPPPPFPQ%Q-Q6QGQ\QaQ hQuQQQQQQQQQ QQR%R?RBR RRH]RRRR RRR5SLS \S iStS {SSSSSSSTUU 'U3UEUTU dU8qUU U UUU UU VV(V ?VIV!\V~WWWWW WWWXXB5XxX X X X X XXXY#Y*YW?Y YYYY$Y&YZ!Z=Z'ZZZZ%ZZ Z Z[Y5[[A[#\ \]]]&]>]N]U] \]i])]']]&]^I/^Ay^Y^[_q_*`a`G(apa]a"a bQbucYxccd&eLCee;f"Ofrf1f ffff&ggg*gh&4h[hohhhhhhh1i16i#hi#ii iiiijkkk k,kY;kkk5?l2ul|l%nl;o-oo pp)p q8 qDqLqSq2Yqq6q6qrr r1r 9rCr(Gr#prrrrrrs# s$0sUs rs}ssXs s t)t=tYt\tst tt tt#t%t#t!u,Ui ǀ݀  % .8 @MS Va do r} с Ȃ Ђۂ #+K]v76̓Fa gu ˄ׅ  & GP"`(̆ % 3TQ3ڇ.Li( Ո2Kaz NJڊ 9\U7&<D.c#͌Ҍ9(3$\+-ō0/$8T;84"Or#ȏ ;.Y+(Aݐ:CTX` gs,Б %/EO\ ĒВؒ ߒ   `aqӓ֓bs{"ޖ <(U'~OC:L/^AИ ( ; IWfu~! 8B<S ʚ Ӛ ݚ (+E dow/ě ՛R38Xs#D  %39(Kt  Jɝ 4 N[q(͞՞ ޞ*/AHPY`{RnΠN:&١ #> NXcn Ңݢ ))8b!"ģ ݣ /9*@*kPh"Wz Φ 1'4Y3"ۧWIVfnvBRb'eKJyVg1YBK/E>dŲβ)˳7$5Zy ʹ%#)7)a**&0!CQeŷ׷^\`>SVl<&к 7 1 6@H"Or-{"̼ м޼ 9+V#ƽ#$ .#4$X}þi׾ ANl̿ݿ#%"#H!l<;X8QS>'k_ t"6jYP(E)|_,xY,f;-=kG9y;c?/W572NGHIJ:!@ju< V0eh.c$SWXZf$%E ygM@~x4&TH]Co<?\B'1dvg  MquO"} 3 e- UtR+/l6pab ` ]VBR|(Dr&(F037Uwb-9KN!m+2[4F%. J$:7\0/z*P{l1!& `sia}256+ =OhiQAm^[:;4D~,  5pr o.^nTndLZs#8Iw1z{C)A'K*>#"q#3vL )9*%8  Test results (1 time unit = %f usec/sample) Window '%s' gdb /usr/local/bin/mhwaveedit core | tee backtrace.txt History: and: Advanced settings Dithering Driver options External applications Fallback format Hz Input audio Input controls Input ports Main window Output audio Output controls Output ports Playback settings Rate conversions Temporary file directories Temporary file settings Time format Variable speed View Window contents cents dB ms seconds%d channels%s is not a valid wav file%s kbit/s%s... (Press ESC to cancel)%s: Expected '=': %s %s: Expected value: %s '%s' is not a number!(H')MM:SS.mmmm(H')MM:SS.t(Lines with delay=0 will be ignored.)(SoX) Polyphase interpolation(SoX) Simulated analog filtration(This changes the sample rate of the entire file, not just the selection)(This changes the sample type of the entire file, not just the selection)(expected) (no file loaded)(no limit)(use a negative number to place the cursor before instead of after the selected point)/Cursor/Position cursor.../Cursor/Set selection end/Cursor/Set selection start/Cursor/sep1/Cursor/sep2/Debug/Edit/Clear clipboard/Edit/Cr_op/Edit/Cu_t/Edit/Insert _silence/Edit/Paste _over/Edit/Paste to _new/Edit/Preferences/Edit/Select _all/Edit/Silence selection/Edit/_Copy/Edit/_Delete/Edit/_Mix paste/Edit/_Paste/Edit/_Redo/Edit/_Undo/Edit/sep1/Edit/sep2/Edit/sep3/Edit/sep4/Effec_ts/Effects/B_yte swap/Effects/Convert sample _format.../Effects/Convert sample_rate.../Effects/Effects dialog.../Effects/Fade _in/Effects/Fade o_ut/Effects/Pipe through program.../Effects/_Combine channels.../Effects/_Normalize/Effects/_Speed adjustment.../Effects/_Volume adjust (fade).../Effects/sep1/Effects/sep2/Effects/sep3/Effects/sep4/File/Save _as.../File/Save selection as.../File/_Close/File/_Exit/File/_Open.../File/_Save/File/sep1/File/sep2/Help/_About/Help/_Documentation/Play/Play _all/Play/Play se_lection/Play/_Play from cursor/Play/_Record.../Play/_Stop/Play/sep1/View/Sp_eed slider/View/Zoom _all/View/Zoom _in/View/Zoom _out/View/Zoom to _selection/View/_Horizontal zoom/View/_Time scale/View/_Vertical zoom/View/sep1/View/sep2/_Cursor/_Edit/_File/_Help/_Play/_View1. Enable core dumps: ulimit -c unlimited 16 bit PCM2. Run the program: mhwaveedit 24 bit PCM3. Make the program crash. You should now get a file named core or core.1234 in the directory you're in. 32 bit PCM4. Run gdb with the program and core file: 5. After gdb has loaded, use the command: bt 6. Quit gdb with the command: quit 7. Now you should have a back trace in the file backtrace.txt 8 bit PCMALSA PreferencesAbout mhWaveEditActivation failed!Adjusting speedAdvancedAll editing functions work non-destructively, that is, the file you're editing isn't actually changed until you save it (the effects also work this way). Amount: AmplifyingApplyApply to: Applying effect '%s'Author: %sAuto dete_ct driver on each start-upAuto return to playback startAuto stop in: Auto-_reset speedAuto-detect from extensionAutomatically connect input ports on startupAutomatically connect output ports on startupAverage bitrateAvoid select calls (try this if recording locks up)BackgroundBandpassBandwidth: BetaBig endianBig-endianBlackBrowse directoryBug reportingBy default, mhWaveEdit uses floating-point temporary files for storing processed results to avoid rounding until the file is saved. Bytes written: Calculating peak levelCalculating peak volume...CancelChannels: ChoiceClient name: Clipping: CloseColorsCommand failed without returning any dataCommand line: Compiled %s %sConnection from %s to %s failed: %sConstant bitrateContactConversion test failed, between: Converting samplerateCopy the current selectionCopyright: %sCould not connect to the JACK server.Could not create pipe: %sCould not find home directory. Using current directory as home directory.Could not get file position in %s: %sCould not initialize SDL: %sCould not open %s: %sCould not open '%s': %sCould not read from %s: %sCould not remove '%s': %sCould not seek in %s: %sCouldn't connect to ESD daemon: %sCouldn't forkCouldn't open %sCurrent sound driver: %sCurrently it is impossible to play and record at the same time, so the playback will stop when you record. CursorCursor: Cursor: runningCustom argumentCustom argument: Custom formatCustomize co_lors...Cut out the current selectionCut, copy and paste operations move the data around without modifying it, so these don't degrade the sound quality. Because of level differences, you may get a "step" at the start and end of the inserted part, which can cause a small clicking sound. DecodingDelay (ms) Delay time: Delete the selectionDepth (ms) Depth: DisableDisk editing _threshold: Display t_imes as: Distributed under GNU General Public License. For information, see the file COPYINGDon't actually change the data (for repairing bad files etc)Dummy (no sound)ESD preferencesEditingEffect %s contains invalid port %sEffectsEnable _dithering for editingEnable _variable speed playbackEnable dithering for _playbackEncoding type: End:Endianness: Error changing samplerate conversion ratio: %s Error closing %s: %sError converting samplerate: %s Error creating link to '%s': %sError creating pipeError in sound driver: ioctl failed: %sError in sound driver: read failed: %sError in sound driver: select failed: %sError in sound driver: write failed: %sError initialising sample rate conversion: %sError launching mixer: fork: %sError opening ALSA device '%s' for playback: %sError opening ALSA device '%s' for recording: %sError reading %s: %sError reading from %s: %sError reading from sub process: %sError reading sox outputError running 'sox -h': %s Error seeking in %s: %sError writing to subprocess: %sError: %sError: fork: %sEsounD driver: readEsounD driver: selectEsounD driver: writeEsounD: Unable to open playback streamEsounD: Unable to open recording streamEsound connection closed by serverExpected driver name after --driver optionExtreme (higher quality)Factor: Fade: Fade|CosFade|HammingFade|LinearFade|TrapezoidFailed to open '%s'!Failed to write to '%s'!File already exists. Overwrite?File formatsFile type: FilesFilter type: Find top volumeFinishFloating-point, doubleFloating-point, singleFor bug reports, translation updates, patches and PayPal donations: Format not selectedFrequency: GeneralHeavyHelping outHigh 6db corner: HighpassHow to create a backtrace: HzIf the cursor starts running too early when jumping, this delay should be increased.If you find a bug or flaw in the program that's not mentioned in the BUGS file, report the bug in the bug tracker (see contact info) or mail a bug report describing the bug to: magnus.hjorth@home.se In case of a crash, please do not send me any core dumps. They are huge and completely useless to me. Instead, create a backtrace. Backtraces tell you exactly where the program crashed. In the sample view there is a grey vertical bar called the 'cursor'. The cursor follows the sound wave when you play the sound. You can position the cursor by clicking with the right (2:nd) mouse button. If you do this while you're playing a file, the playing will continue from the new cursor position. You can also position the cursor more exact by using the 'Position Cursor...' command on the Edit menu. Initial volume: InputInput gain: Input level (dB)Input levelsInsane (highest possible quality)Insert SilenceInterfaceInterpolation: Interpolation|CubicInterpolation|LinearInvalid driver name: %s Using '%s' driver insteadInvalid number of input ports.Invalid number of output ports.Invalid sample format or number of channels for this file formatInvalid time value. Time must be specified in the form (HH')MM:SS(.mmmm)Jack PreferencesJump delay:Keep data in unmapped output channelsKeep main _window in front after applying effectKeyboard shortcutsL WaveformLadspa: Error scanning %sLaunch mixerLeftLimiter gain: Little endianLittle-endianLoad FileLoad a file from diskLoadingLoading and then saving files with 'lossy' formats (like mp3 and ogg) leads to a quality loss, also for the unmodified parts of the file.Loop mode (play over and over)Low 6dB corner: LowpassMP3 PreferencesMailing list (you must be a subscriber before you can post messages): MarksMessageMethod: Mi_xer utility: Microsoft WAV formatMildMixingModulation Modulation|SinusoidalModulation|TriangularMonoN/AName :New samplerate: NoNo errors detected!No file with that name!Noise modeNoneNumber of ports (0-8): Number of recent files in File menu: OKOSS preferencesOgg VorbisOn this system, libsndfile is required to save floating-point wav files.OtherOutput _buffer size:Output from command '%s': Output gain: Output level (dB)Paste at cursor positionPaste, overwriting the data after the cursor positionPause recordingPeak limiterPeak max: Peak: Place cursor Play from cursor positionPlay selected areaPlaybackPlayback device: PlayingPlaying a file is simple, just load the file and press the play button. The green play button plays from the current position. The yellow play button plays the current selection, or the entire file if nothing is selected. Stop the playback with the stop button (with the red square). Port #%dPosition cursorPost-processing gain: PreferencesPreparing tests..Process outputProcessing dataProgress barProject page with bug tracker, mailing list membership: QualityQuality: R WaveformRMS: Range test failed for format: Raw PCM dataReady for recordingRecordRecordStatus|PausedRecordStatus|RecordingRecordingRecording device: Recording is done with 'Record...' on the Play menu, or the Record button (the red circle). A dialog box will pop up where you can select what format you want to record in. After selecting the format, meters and numbers will appear showing info about the volume level of the sound input. Recording settingsRecording status: Redo the last undo operationReset max peaksResume recordingReverb time: RightRunning tests..SDL (output only)SDL: Couldn't open audio: %sSample format to try when the sound file's format isn't supported.Sample format: Sample rate: Sample repeat/skip (low quality)Sample type: Sample viewSave FileSave changes to %s?Save selection as ...Save the current file to diskSavingSeconds of silence: Selecting the ESD host to connect to is done through the ESPEAKER environment variable.SelectionSelection: %s+%sSend wav headerSetSet selection end to cursor positionSet selection start to cursor positionShift amount: Should not reach this pointShould not reach this point!Show _horizontal zoom slider by defaultShow _speed slider by defaultShow _time scale by defaultShow _vertical zoom slider by defaultSignedSignedness: SoX closed connection too early!Some notes on sound quality. Some of the settings you have changed will not be activated until you restart the programSoundSound data is normally stored as integer values. Therefore, whenever you normalize, adjust volume, decrease sample size or filter a sound, the result must be rounded. If you use 24 or 32 bit sample sizes, this is not really a problem, but if you use 8 or 16 bits sample size, this rounding causes a decrease in quality. Sox support couldn't be initializedSpeed (Hz) Speed effect: Speed:Speed: Standard (high quality)Start recordingStart:StereoStop playingSunAudio: Couldn't open %sSunAudio: Error reading from sound deviceSunAudio: Error writing to sound deviceSyntax: %s [files] Testing conversion functions finished.Testing conversion functions:The 'Crop' function deletes all parts of the file that are not selected. The 'Cut' and 'Copy' functions work like in any other software. The 'Paste as new' function opens a new window and puts the clipboard contents into it. The 'Paste mix' function combines the clipboard data with the data at the cursor position. The 'Paste' function insert the clipboard contents at the cursor position. The 'Paste over' function works like 'Paste', except that it overwrites the data after the insert position. The 'Silence selection' function replaces the selected part with silence. To avoid clicks, the silent part is a line that meets the wave at the endpoints. The area where you 'see' the contents of the file you are editing, is called the 'sample view'. The client name change won't take effect until you restart the program.The file %s does not exist!The file %s is a compressed wav file. This program can only work with uncompressed wav files.The file %s is not a regular file!The file %s may be destroyed since the saving failed. Try to free up some disk space and save again. If you exit now the file's contents could be in a bad state. The file has not changed since last save. Press OK if you want to save it anyway?The file name '%s' has an extension unknown to the program. Please specify in which format this file should be saved.The format of file '%s' could not be recognized. Please specify the sample format below.The general rule when doing audio editing/processing is to not manipulate the data more than necessary and keep an original copy whenever you're processing your important files. The mix paste function doesn't decrease quality, unless the peaks become too high and you get clipping. In that case you will get a warning message. The mixed result was clipped %d times.The playback speed can be varied by adjusting the slider to the far right. The sign and endian-ness can usually be left at their defaults, but should be changed if you're unable to record or get bad sound.The sound format of this file is not supported for playing.There already is only one channel!This effect has no options.This format is not supported by the input driver!Time limit: Time recorded: TimeDisplay|SamplesTo avoid rounding errors when applying more than one effect on the same data, floating-point temporary files can be used. However, this will increase disk and CPU usage.Unable to detect supported SoX effectsUnable to write data to %sUndo the last changeUnexpected EOF in connection to subprocessUnexpected end of fileUnexpected end of file reading from %sUnknown file formatUnknown file typeUnknown option '%s'UnsignedUse default settingsUse fast and noisy methodUse this setting by defaultUses double-precision mathValue for %s must be a number between %ld and %ldValue for '%s' must be a number between %f and %fValue for '%s' must not be above %fValue for '%s' must not be below %fVariable bitrate (default)Varispeed: View _quality:View: [ %s - %s ]Warning: Unexpected error: %sWhen you want to start recording, press the "Start recording" button. When you've recorded everything you wanted to, press the Finish button and the record dialog will disappear and newly recorded sound will show up in a new window. WhiteWidth: Window length: Window size: Window width: With JACK, the only supported recording format is Floating-point, single precision, %d HzYesYou are saving a wav file larger than 2048MB. Such large files are non-standard and may not be readable by all programs. (this warning will not be displayed again)You can do normal editing while the file is playing. You can find the latest release of mhWaveEdit at: You can place marks in your file by holding down Ctrl and pressing a number from 0 to 9. This will place a mark (green vertical bar) with the same number at the current cursor position. You can later make the cursor go to that position again by just pressing the number. Setting and jumping to marks can be done while playing. To remove a mark, jump to the mark and set it again. You can use the cursor to refine the selection. Use the 'Selection start at cursor' and 'Selection end at cursor' buttons to move the selection starting point or the selection end point to the current cursor position. You can also drag the selection endpoints using the mouse. You have mapped more than one output port to channel '%s'. You can only map one output port to each channel.You have no open file to apply the effect to!You make selections by dragging the mouse over the sample view. You can hear what you've currently selected by clicking on the "play selection" button (the button with the yellow arrow) or by selecting 'Play selection' from the Play menu. Zero-level_Add_Auto-start playback when jumping to mark_Browse..._Byte-swap output (try this if playback sounds horrible)_Cancel_Close_Down_Draw waveform a second time with improved quality_Driver:_Keep cursor in center of view when following playback_Keep sound driver opened (to avoid start/stop clicks)_OK_Preview_Remember window sizes/positions_Remove_Settings_Up_Update cursor information while playing_Use floating-point temporary filesafter beginning of fileafter current cursor positionafter end of fileafter selection endafter selection startbyteshttp://gna.org/projects/mhwaveedit http://gna.org/projects/mhwaveedit/ jack_get_ports returned NULLjump delaymagnus.hjorth@home.se mhWaveEdit HelpmhWaveEdit is a graphical program for editing sound files. It is completely free (GPL). mhWaveEdit: mhWaveEdit: %s (%s): %d Hz, %smhWaveEdit: %s: %s mhwaveedit-discuss@gna.org msnumber of recent filesputenv failed!sample ratesamplessamples/pixelsecondssnd_pcm_hw_params_set_access failedsnd_pcm_hw_params_set_channels failedsnd_pcm_hw_params_set_format failedsnd_pcm_hw_params_set_rate failedsound-portaudio: No input devices available!sound-portaudio: No output devices available!unsetenv failed!untitled #%dProject-Id-Version: mhWaveEdit Report-Msgid-Bugs-To: POT-Creation-Date: 2018-08-25 11:56+0200 PO-Revision-Date: 2006-02-26 16:00-0300 Last-Translator: Sergio Rivadero Language-Team: Language: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Resultado de las pruebas (1 unidad de tiempo = %f ms/muestra) Ventana '%s' Historial: y: Propiedades avanzadas Siseo Opciones del dispositivo Aplicaciones externas Formato de prueba HzAudio de entrada Controles de entrada Puertos de entrada Ventana principal Audio de salida Controles de salida Puertos de salida Preferencias de reproducción Conversión de tasa Directorios de archivos temporales Preferencias de archivos temporales Formato de cronómetro Velocidad variable Ver Contenidos de la ventana centécimos dB ms segundos%d canales%s no es un archivo wav válido%s kbits/seg%s... (Presione ESC para cancelar)%s: Esperado '=': %s %s: Valor esperado: %s '%s' no es un número!(H')MM:SS.mmmm(H')MM:SS.t(Lineas con retardo=0 serán ignoradas)(SoX) Interpolación polifase(SoX) Filtrado analógico simulado(Esto cambia la tasa de bits de todo el archivo, no solo de la selección)(Esto cambia el tipo de muestreo de todo el archivo, no solo de la selección)(esperado)(no hay archivo cargado)(sin límite)(use un número negativo para ubicar el cursor antes del punto seleccionado)/Cursor/Posicionar cursor.../Cursor/Establecer final de selección/Cursor/Establecer inicio de selección/Cursor/sep1/Cursor/sep2/Depurar/Editar/Vaciar portapapeles/Editar/Rec_ortar/Editar/Cor_tar/Editar/Insertar _silencio/Editar/Pegar encima/Editar/Pegar como _nuevo/Editar/Preferencias/Editar/Seleccion_ar todo/Editar/Seleccionar silencios/Editar/_Copiar/Editar/_Eliminar/Editar/Pegar mezclando/Editar/_Pegar/Editar/_Rehacer/Editar/_Deshacer/Editar/sep1/Editar/sep2/Editar/sep3/Editar/sep4/Efec_tos/Efectos/Intercambiar b_ytes/Efectos/Convertir _formato de la muestra/Efectos/Convertir _tasa de muestreo.../Efectos/Diálogo de efectos.../Efectos/Fade _in/Efectos/Fade _out/Efectos/Enviar al programa.../Efectos/_Combinar canales.../Efectos/_Normalizar/Efectos/Aju_star velocidad.../Efectos/Ajustar _volumen.../Efectos/sep1/Efectos/sep2/Efectos/sep3/Efectos/sep4/Archivo/Guardar c_omo.../Archivo/Guardar selección como.../Archivo/_Cerrar/Archivo/_Salir/Archivo/_Abrir.../Archivo/_Guardar/Archivo/sep1/Archivo/sep2/Ayuda/_Acerca de/Ayuda/_Documentación/Reproduccion/_Todo/Reproduccion/Se_lección/Reproduccion/Desde el _cursor/Reproduccion/_Grabar.../Reproduccion/_Detener/Reproducción/sep1/Ver/Deslizador de v_elocidad/Ver/Todo/Ver/Acercar/Ver/Alejar/Ver/Ajustar a la selección/Ver/Zoom _horizontal/Ver/Escala de _Tiempo/Ver/Zoom _vertical/Ver/sep1/Ver/sep2/_Cursor/_Editar/_Archivo/A_yuda/_Reproducir/_Ver 16 bit PCM 24 bit PCM 32 bit PCM 8 bit PCMPreferencias ALSAAcerca de mhwaveeditFalló la activación!Ajustando velocidadAvanzadoTodas las funciones de edición (al igual que los efectos aplicados) trabajan de manera no destructiva, esto es, el archivo que está editando no es realmente modificado hasta que sea guardado. Cantidad:AmplificandoAplicarAplicar a:Aplicando efecto '%s'Autor: %sAutodete_ctar driver en cada inicioAuto retornar al inicio de la reproducciónAuto detener en: Auto re_setear velocidadAutodetectar según extensiónAutomáticamente conectar puertos de entrada al iniciarAutomáticamente conectar puertos de salida al iniciarTasa de bits promedioEvitar llamadas de selección (Intente esto si la grabación se traba)FondoPaso de bandaAncho de banda:BetaBig endianBig-endianNegroExplorar directorioReportar erroresTambién de modo predeterminado mhWaveEdit usa archivos temporales con valores de punto flotante para almacenar los valores procesados y evitar de este modo el redondeo hasta que el archivo se guarda. Bytes escritos:Calculando nivel de picoCalculando volumen pico:CancelarCanales:ElecciónNombre del cliente:Recorte: CerrarColoresFalló el comando al no devolver datosComando:Compilado %s %sConexión desde %s a %s falló: %sTasa de bits constanteContactoFalló la prueba de conversión, entre: Convirtiendo tasa de muestreoCopiar la selecciónCopyright: %sNo se pudo conectar al servidor JACK.No se pudo crear tubería: %sNo se pudo encontrar directorio home. Usando directorio actual como directorio home.No se puede obtener la posición del archivo %s: %sNo se puede inicializar SDL: %sNo se puede abrir %s: %sNo se puede abrir '%s': %sNo se puede leer desde %s: %sNo se puede remover '%s': %sNo se puede buscar en %s: %sNo se puede conectar con demonio ESD: %sNo se pudo lanzarNo se pudo abrir %sDispositivo de sonido activo: %s CursorCursor:Cursor: corriendoArgumento personalizadoArgumento personalizado:Formato personalizado_Personalizar colores...Cortar la selecciónLas operaciones de cortar, copiar y pegar mueven los datos pero sin modificarlos, así que no degradan la calidad del sonido. Debido a la diferencia de niveles, puede haber un "salto" al inicio o al final de la parte insertada que puede causar un sonido similar a un pequeño "clic". DecodificandoRetardo (ms)Tiempo de retardo:Borrar la selecciónProfundidad (ms)Profundidad:Deshabilitar_Umbral de edición de disco: Mostrar _cronómetro como: Distribuido bajo la Licencia Pública General GNU. Para información, vea el archivo COPYINGNo cambiar datos (para reparar archivos corruptos, etc)Dummy (sin sonido)Preferencias ESDEditarEfecto %s contiene puerto inválido %sEfectosHabilitar siseo para _ediciónHabilitar _velocidad variable de reproducciónHabilitar siseo para _reproducciónTipo de codificación:Fin:Orden de bits: Error al cambiar razón de conversión de la muestra: %s Error al cerrar %s: %sError al convertir tasa de muestreo: %s Error al crear enlace hacia '%s': %sError al crear tuberíaError en driver de sonido: Falló ioctl: %sError en driver de sonido: Falló lectura: %sError en driver de sonido: Falló selección: %sError en driver de sonido: Falló escritura: %sError al inicializar conversión de tasa de muestreo: %sError lanzando mezclador: %sError al abrir dispositivo ALSA '%s' para reproducción: %sError al abrir dispositivo ALSA '%s' para grabación: %sError al leer %s: %sError al leer desde %s: %sError al leer desde subproceso: %sError al leer salida de SoXError al ejecutar 'sox -h': %s Error al buscar en %s: %sError al escribir al subproceso: %sError: %sError: %sDispositivo EsounD: lecturaDispositivo EsounD: selecciónDispositivo EsounD: escrituraEsounD: Imposible abrir flujo de reproducciónEsounD: Imposible abrir flujo de grabaciónConexión ESound cerrada por el servidorSe esperaba nombre de dispositivo después de la opción --driverExtremo (calidad superior)Factor: Desvanecimiento:CosHammingLinealTrapezoidalFallo al abrir '%s'!Fallo al escribir en '%s'!El archivo ya existe. Desea sobreescribirlo?Formatos de archivoTipo de archivo:ArchivosTipo de filtro:Buscar volumen máximoFinalizarPunto flotante, doblePunto flotante, simplePara reporte de errores, actualización de traducciones, parches y donaciones: Formato no seleccionadoFrecuencia:GeneralPesadoColaborarEsquina de 6 dB Alta: Paso alto HzSi el cursor comienza a moverse muy pronto cuando salta, este retardo debería ser incrementado.Para reporte de errores (no descriptos en el archivo BUGS) contactese con: magnus.hjorth@home.se Si hace esto mientras se está reproduciendo el archivo, la reproducción continuará desde la nueva posición del cursor. También puede ubicar el cursor de manera más exacta usando la opción 'Posición del cursor...' desde el menú Edición. Puede ubicar marcas en el archivo presionando la tecla Ctrl y un número del 0 al 9. Se establecerá una marca (línea vertical) con el mismo número en la posición del cursor. Luego puede hacer ir el cursor a esa posición nuevamente solo presionando el número correspondiente. Mientras se reproduce puede establecer y saltar marcas. Para remover una marca, vaya a esa marca y establezcala nuevamente. Volumen inicial:EntradaGanancia de entrada: Nivel de entrada (dB) Niveles de entradaInsano (calidad más alta posible)Insertar silencioInterfazInterpolación:CúbicaLinealNombre de dispositivo no válido: %s En su lugar se usa '%s'Número de puertos de entrada inválido.Número de puertos de salida inválido.Formato de muestra o número de canales no válido para este formato de archivoTiempo no válido. Debe especificarse en la forma (HH')MM:SS(.mmmm)Preferencias JACKRetardo de salto:Mantener datos en canales de salida no mapeados_Mantener ventana principal al frente después de aplicar efectosAtajos de tecladoOnda izquierdaLadspa: Error escaneando %sLanzar mezcladorIzquierdoGanancia límite: Little endianLittle-endianCargar archivoCargar archivoCargandoCargar y luego guardar archivos en formatos con pérdida (como mp3 y ogg) conduce a una pérdida de calidad, incluso a las partes no modificadas.Modo repeticiónEsquina de 6 dB Baja: Paso bajoPreferencias MP3Lista de correo (debe suscribirse antes de enviar mensajes) MarcasMensajeMétodo:_Mezclador:Formato Microsoft WAVModeradoMezclandoModulaciónSinusoidalTriangularMonoN/DNombre:Nueva tasa de muestreo:NoNo se detectaron errores!No hay archivo con ese nombre!Modo ruidoNingunoNúmero de puertos (0-8):Número de archivos recientes en menú Archivo:OKPreferencias OSSOgg VorbisEn este sistema se requiere libsndfile para guardar archivos WAV en coma flotante.OtroTamaño del _búffer de salida:Salida del comando '%s': Ganancia de salida: Nivel de salida (dB)Insertar en la posición del cursorPegar sobreescribiendo los datos después de la posición del cursorPausar grabaciónPico límiteMáximo pico:Pico:Posicionar cursorReproducir desde la posición del cursorReproducir área seleccionadaReproducciónDispositivo de reproducción:ReproducirEl botón de reproducción verde reproduce desde la posición del cursor. Puerto #%dPosición del cursorGanancia post-procesado: PreferenciasPreparando pruebas...Procesar salidaProcesando datosBarra de progresoPágina del proyecto, listas de correo: CalidadCalidad:Onda derechaRMS: Falló la prueba de rango para el formato:Datos PCM en crudoListo para grabarGrabarPausadoGrabandoGrabarDispositivo de grabación:Aparecerá una ventana donde podrá elegir el formato en que desea grabar. Después de elegir el formato, métricas y números aparecerán indicando información sobre el nivel del volumen de la entrada de sonido. Preferencias de grabaciónEstado de la grabación:Rehacer último cambioRestablecer picos máximosContinuar grabaciónTiempo de reverberación: DerechoEjecutando pruebas...SDL (sólo salida)SDL: No se pudo abrir audio: %sFormato de muestreo a intentar cuando el formato de sonido no está soportado.Formato de la muestra:Tasa de muestreo:Repetir/saltar muestras (baja calidad)Tipo de muestra:Vista de muestreoGuardar archivoGuardar cambios en %s?Guardar selección como...Guardar archivoGuardandoSegundos de silencio:La selección para conectarse al host ESD se realizó a través de la variable de entorno ESPEAKER.SelecciónSelección: %s+%sEnviar cabecera WAVEstablecerSeleccionar hasta la posición del cursorSeleccionar desde la posición del cursorCantidad de desplazamiento: No se debería alcanzar ese puntoNo se debería alcanzar ese punto!Mostrar zoom _horizontalMostrar deslizador de v_elocidadMostrar escala de _tiempoMostrar zoom _verticalCon signoSigno:SoX cerró la conexión demasiado rápido!Algunas notas sobre la calidad de sonido. Algunas preferencias modificadas no se activarán hasta que reinicie el programaSonidoLos datos del sonido se almacenan normalmente como valores enteros. Por ello al normalizar, ajustar volumen, decrementar tamaño de la muestra o al filtrar un sonido el resultado debe ser redondeado. Si usa tamaños de muestras de 24 o 32 bits esto no es un problema, pero si usa tamaños de muestras de 8 o 16 bits el redondeo causa un decremento de calidad. Soporte Sox no se pudo inicializarVelocidad (Hz)Efecto de velocidad: Velocidad:Velocidad:Estándar (alta calidad)Comenzar grabaciónInicio:EstéreoDetener reproducciónSunAudio: No se pudo abrir %sSunAudio: Error al leer del dispositivo de sonidoSunAudio: Error al escribir en dispositivo de sonidoSintaxis: %s [archivos] Finalizada las pruebas de funciones de conversión.Probando funciones de conversión:La función 'Recortar' borra todas las partes del archivo que no están seleccionadas. Las funciones 'Cortar' y 'Pegar' trabajan como cualquier otro software. La función 'Pegar como nuevo' abre una nueva ventana y coloca el contenido del portapapeles en ella. La función 'Pegar mezclando' combina el contenido del portapapeles con los datos en la posición del cursor. La función 'Pegar' inserta el contenido del portapapeles en la posición del cursor. La función 'Pegar encima' funciona como Pegar, excepto que sobreescribe los datos después del punto de inserción. La función 'Seleccionar silencios' reemplaza el área seleccionada con silencio. Para evitar saltos, el silencio es una línea que une las áreas no seleccionadas. Allí hay una línea vertical llamada 'cursor' que sigue la onda de sonido mientras reproduce. Puede posicionar el cursor haciendo clic con el botón secundario del ratón. El cambio del nombre del cliente no tendrá efecto hasta que reinicie el programa.El archivo %s no existe!%s es un archivo WAV comprimido. Este programa solo puede trabajarcon archivos WAV descomprimidos.El archivo %s no es un archivo regular!El archivo %s se puede haber destruido ya que falló la escritura. Intente liberar espacio en disco y guarde nuevamente. Si sale ahora el contenido del archivo podría estar en mal estado.El archivo no se ha modificado. Pulse OK si desea guardarlo de todos modos.El nombre de archivo '%s' tiene una extensión desconocida. Por favorespecifique el formato en que debería ser guardado.No se puede reconocer el formato de archivo de '%s' Por favor especifique el formato.Cuando se edita o procesa audio, la regla general es no manipular los datos más de lo necesario y mantener una copia de respaldo de sus archivos importantes. La función 'pegar mezclando' no degrada el sonido a menos que los picos terminen siendo muy altos resultando en un recorte. En ese caso obtendrá un mensaje de advertencia. El resultado de la mezcla fue recortado %d veces.El botón de reproducción amarillo reproduce la selección o el archivo entero si no hay nada seleccionado. Para detener la reproducción pulse el botón Detener (con el cuadrado rojo). La velocidad de reproducción se puede variar ajustando la barra de desplazamiento de la derecha. Puede hacer ediciones simples mientras está reproduciendo. El signo y el orden de bytes usualmente pueden ser dejados en sus valores predeterminados, pero se deberían cambiar si no puede grabar o se obtiene mal sonido.El formato de sonido de este archivo no está soportado para reproducción.Ya hay solo un canal!Este efecto no tiene opciones.Este formato no está soportado por el dispositivo de entrada!Limite de tiempo:Tiempo grabado:MuestrasPara evitar errores de redondeo cuando se aplica más de un efecto sobre los mismos datos, pueden usarse archivos temporales. Sin embargo, esto incrementará el uso de disco y CPU.Imposible detectar efectos SoX soportadosImposible escribir datos a %sDeshacer último cambioFin de archivo inesperado en la conexión al subprocesoFin de archivo inesperadoFin de archivo inesperado leyendo %sFormato de archivo desconocidoTipo de archivo desconocidoOpción desconocida '%s'Sin signoUsar predeterminadosUsar método _rápido y ruidosoUsar esta opción predeterminadamenteUsa matemática de doble precisiónEl valor de %s debe estar entre %ld y %ldEl valor de '%s' debe estar entre %f y %fEl valor de '%s' no debe ser superior a %fEl valor de '%s' no debe ser inferior a %fTasa de bits variable (predeterminado)Velocidad variable: _Calidad de vista:Vista: [ %s - %s ]Advertencia: Error inesperado: %sCuando desee comenzar a grabar, pulse el botón 'Comenzar grabación'. Cuando haya grabado lo necesario pulse el botón 'Finalizar' y se cerrará la ventana apareciendo el sonido guardado en una nueva ventana. Actualmente es imposible reproducir y grabar simultáneamente, por eso la reproducción se detendrá cuando comience a grabar. BlancoAncho:Largo de ventana:Tamaño de ventana:Ancho de ventana:Con JACK el único formato de grabación soportado es Punto flotante, precisión simple, %d HzSíIntenta guardar un archivo WAV mayor a 2048 MB. Archivos tan grandes no son estándar y pueden no ser leídos por otros programas. (Este mensaje no será mostrado nuevamente) Puede encontrar la última versión lanzada de mhWaveEdit en: Puede usar el cursor para refinar la selección usando los botones 'Establecer inicio de selección' y 'Establecer final de selección' desde el menú Cursor. También puede arrastrar con el ratón los límites de la selección. Ha mapeado más de un puerto de salida al canal '%s'. Solo puede mapear un puerto de salida para cada canal.No hay archivo para aplicar el efecto!Para seleccionar arrastre el ratón sobre la vista de muestreo. Puede oír lo que ha seleccionado haciendo clic en el botón 'Reproducir selección' o seleccionado la opción 'Selección' desde el menú Reproducir. Nivel de cero_Agregar_Auto comenzar reproducción cuando se salta a la marca_Explorar...Intercambiar _bytes (si la reproducción es mala)_Cancelar_CerrarA_bajo_Dibujar onda con calidad mejorada_Driver:_Mantener cursor centrado cuando se reproduce_Mantener driver de sonido abierto_OKVista _Previa_Recordar posición de ventanas_Quitar_Preferencias_ArribaActualizar información del c_ursor mientras se reproduce_Usar archivos temporales de punto flotantedespués del inicio del archivodespués de la posición del cursordespués del final del archivodespués del final de la seleccióndespués del inicio de la selecciónbyteshttp://gna.org/projects/mhwaveedit http://gna.org/projects/mhwaveedit/ jack_get_ports devolvió NULLretardo de saltomagnus.hjorth@home.se Ayuda de mhWaveEditmhWaveEdit en un programa para la edición gráfica de archivos de sonido. Es completamente libre (GPL). mhWaveEdit: mhWaveEdit: %s (%s) %d Hz, %smhWaveEdit: %s: %s mhwaveedit-discuss@gna.org msnúmero de archivos recientesFalló putenv!tasa de muestreomuestrasmuestras/pixelsegundosFalló snd_pcm_hw_params_set_accessFalló snd_pcm_hw_params_set_channelsFalló snd_pcm_hw_params_set_formatFalló snd_pcm_hw_params_set_ratesound-portaudio: No hay dispositivos de entrada disponibles!sound-portaudio: No hay dispositivos de salida disponibles!Falló unsetenv!Sin título #%dmhwaveedit-1.4.24/po/es.po000066400000000000000000003064541334022513400153350ustar00rootroot00000000000000# translation of mhwaveedit. # Copyright (C) 2006 Magnus Hjorth # This file is distributed under the same license as the mhwaveedit package. # <>, 2006. # , fuzzy # <>, 2006. # # msgid "" msgstr "" "Project-Id-Version: mhWaveEdit\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-08-25 11:56+0200\n" "PO-Revision-Date: 2006-02-26 16:00-0300\n" "Last-Translator: Sergio Rivadero \n" "Language-Team: \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: src/chunk.c:199 msgid "Converting samplerate" msgstr "Convirtiendo tasa de muestreo" #: src/chunk.c:226 msgid "Adjusting speed" msgstr "Ajustando velocidad" #: src/chunk.c:703 msgid "Mixing" msgstr "Mezclando" #: src/chunk.c:758 #, c-format msgid "The mixed result was clipped %d times." msgstr "El resultado de la mezcla fue recortado %d veces." #: src/chunk.c:822 #, fuzzy msgid "Combining channels" msgstr "[B] Combinar canales" #: src/chunk.c:1083 #, fuzzy msgid "Mixing channels" msgstr "Agregando canales" #: src/chunk.c:1471 msgid "Calculating peak level" msgstr "Calculando nivel de pico" #: src/chunk.c:1542 src/chunk.c:1552 src/chunk.c:1590 src/chunk.c:1600 msgid "Finding zero-crossing" msgstr "" #: src/chunk.c:1628 #, c-format msgid "Amplifying (by %3.1f%% / %+.1fdB)" msgstr "" #: src/chunk.c:1669 msgid "Amplifying" msgstr "Amplificando" #: src/chunk.c:1867 #, fuzzy, c-format msgid "The input was clipped %d times during processing." msgstr "El resultado de la mezcla fue recortado %d veces." #: src/configdialog.c:65 msgid "number of recent files" msgstr "número de archivos recientes" #: src/configdialog.c:66 #, fuzzy msgid "maximum vertical zoom" msgstr "/Ver/Zoom _vertical" #: src/configdialog.c:80 msgid "" "Some of the settings you have changed will not be activated until you " "restart the program" msgstr "" "Algunas preferencias modificadas no se activarán hasta que reinicie el " "programa" #: src/configdialog.c:292 msgid "Colors" msgstr "Colores" #: src/configdialog.c:329 msgid "_Preview" msgstr "Vista _Previa" #: src/configdialog.c:336 src/configdialog.c:1204 msgid "_OK" msgstr "_OK" #: src/configdialog.c:353 msgid "_Cancel" msgstr "_Cancelar" #: src/configdialog.c:430 msgid "Browse directory" msgstr "Explorar directorio" #: src/configdialog.c:480 msgid "Preferences" msgstr "Preferencias" #: src/configdialog.c:539 msgid "Show _time scale by default" msgstr "Mostrar escala de _tiempo" #: src/configdialog.c:549 msgid "Show _horizontal zoom slider by default" msgstr "Mostrar zoom _horizontal" #: src/configdialog.c:559 msgid "Show _vertical zoom slider by default" msgstr "Mostrar zoom _vertical" #: src/configdialog.c:569 msgid "Show _speed slider by default" msgstr "Mostrar deslizador de v_elocidad" #: src/configdialog.c:579 #, fuzzy msgid "Show slider l_abels by default" msgstr "Mostrar deslizador de v_elocidad" #: src/configdialog.c:589 #, fuzzy msgid "Show playback buffer positio_n by default" msgstr "Mostrar deslizador de v_elocidad" #: src/configdialog.c:598 msgid "_Settings" msgstr "_Preferencias" #: src/configdialog.c:608 msgid "_Keep sound driver opened (to avoid start/stop clicks)" msgstr "_Mantener driver de sonido abierto" #: src/configdialog.c:617 msgid "_Byte-swap output (try this if playback sounds horrible)" msgstr "Intercambiar _bytes (si la reproducción es mala)" #: src/configdialog.c:626 msgid "Play _mono files as stereo" msgstr "" #: src/configdialog.c:634 msgid "_Update cursor information while playing" msgstr "Actualizar información del c_ursor mientras se reproduce" #: src/configdialog.c:642 msgid "_Keep cursor in center of view when following playback" msgstr "_Mantener cursor centrado cuando se reproduce" #: src/configdialog.c:652 msgid "_Auto-start playback when jumping to mark" msgstr "_Auto comenzar reproducción cuando se salta a la marca" #: src/configdialog.c:660 msgid "Enable _variable speed playback" msgstr "Habilitar _velocidad variable de reproducción" #: src/configdialog.c:669 msgid "Auto-_reset speed" msgstr "Auto re_setear velocidad" #: src/configdialog.c:676 msgid "Use fast and noisy method" msgstr "Usar método _rápido y ruidoso" #: src/configdialog.c:684 msgid "(H')MM:SS.t" msgstr "(H')MM:SS.t" #: src/configdialog.c:685 msgid "(H')MM:SS.mmmm" msgstr "(H')MM:SS.mmmm" #: src/configdialog.c:686 msgid "TimeDisplay|Samples" msgstr "Muestras" #: src/configdialog.c:687 #, fuzzy msgid "Time Code 24fps" msgstr "Tiempo grabado:" #: src/configdialog.c:688 msgid "Time Code 25fps (PAL)" msgstr "" #: src/configdialog.c:689 msgid "Time Code 29.97fps (NTSC)" msgstr "" #: src/configdialog.c:690 #, fuzzy msgid "Time Code 30fps" msgstr "Tiempo grabado:" #: src/configdialog.c:703 msgid "_Remember window sizes/positions" msgstr "_Recordar posición de ventanas" #: src/configdialog.c:712 msgid "_Draw waveform a second time with improved quality" msgstr "_Dibujar onda con calidad mejorada" #: src/configdialog.c:742 msgid "_Remove" msgstr "_Quitar" #: src/configdialog.c:750 msgid "_Add" msgstr "_Agregar" #: src/configdialog.c:757 msgid "_Browse..." msgstr "_Explorar..." #: src/configdialog.c:764 msgid "_Up" msgstr "_Arriba" #: src/configdialog.c:772 msgid "_Down" msgstr "A_bajo" #: src/configdialog.c:788 msgid "Keep main _window in front after applying effect" msgstr "_Mantener ventana principal al frente después de aplicar efectos" #: src/configdialog.c:804 msgid "_Use floating-point temporary files" msgstr "_Usar archivos temporales de punto flotante" #: src/configdialog.c:813 msgid "Enable _dithering for editing" msgstr "Habilitar siseo para _edición" #: src/configdialog.c:821 msgid "Enable dithering for _playback" msgstr "Habilitar siseo para _reproducción" #: src/configdialog.c:829 msgid "Auto dete_ct driver on each start-up" msgstr "Autodete_ctar driver en cada inicio" #: src/configdialog.c:842 msgid "Direct access" msgstr "" #: src/configdialog.c:843 msgid "Decompress" msgstr "" #: src/configdialog.c:844 #, fuzzy msgid "Bypass" msgstr "Paso de banda" #: src/configdialog.c:855 msgid "Biased" msgstr "" #: src/configdialog.c:856 msgid "Pure-Scaled" msgstr "" #: src/configdialog.c:873 msgid "Interface" msgstr "Interfaz" #: src/configdialog.c:874 msgid " Main window " msgstr " Ventana principal" #: src/configdialog.c:885 msgid "Number of recent files in File menu: " msgstr "Número de archivos recientes en menú Archivo:" #: src/configdialog.c:890 msgid " View " msgstr " Ver" #: src/configdialog.c:901 msgid "Customize co_lors..." msgstr "_Personalizar colores..." #: src/configdialog.c:908 msgid " Window contents " msgstr " Contenidos de la ventana" #: src/configdialog.c:925 #, fuzzy msgid "Vertical zoom limit: " msgstr "/Ver/Zoom _vertical" #: src/configdialog.c:929 msgid "x" msgstr "" #: src/configdialog.c:935 msgid "Sound" msgstr "Sonido" #: src/configdialog.c:936 msgid " Driver options " msgstr " Opciones del dispositivo" #: src/configdialog.c:944 msgid "_Driver:" msgstr "_Driver:" #: src/configdialog.c:961 msgid " Fallback format " msgstr " Formato de prueba " #: src/configdialog.c:966 msgid "Sample format to try when the sound file's format isn't supported." msgstr "" "Formato de muestreo a intentar cuando el formato de sonido no está soportado." #: src/configdialog.c:978 msgid "Playback" msgstr "Reproducción" #: src/configdialog.c:980 msgid " Playback settings " msgstr " Preferencias de reproducción " #: src/configdialog.c:992 msgid " Variable speed " msgstr " Velocidad variable " #: src/configdialog.c:1007 src/help.c:38 msgid "Files" msgstr "Archivos" #: src/configdialog.c:1009 msgid " Temporary file directories " msgstr " Directorios de archivos temporales" #: src/configdialog.c:1035 msgid " Temporary file settings " msgstr " Preferencias de archivos temporales" #: src/configdialog.c:1040 msgid "" "To avoid rounding errors when applying more than one effect on the same " "data, floating-point temporary files can be used. However, this will " "increase disk and CPU usage." msgstr "" "Para evitar errores de redondeo cuando se aplica más de un efecto sobre los " "mismos datos, pueden usarse archivos temporales. Sin embargo, esto " "incrementará el uso de disco y CPU." #: src/configdialog.c:1048 msgid "" "Some versions of libsndfile supports accessing Ogg files without " "decompressing to a temporary file." msgstr "" #: src/configdialog.c:1062 src/help.c:36 msgid "Quality" msgstr "Calidad" #: src/configdialog.c:1064 msgid " Rate conversions " msgstr " Conversión de tasa " #: src/configdialog.c:1071 msgid "Varispeed: " msgstr "Velocidad variable: " #: src/configdialog.c:1072 msgid "Speed effect: " msgstr "Efecto de velocidad: " #: src/configdialog.c:1079 msgid " Dithering " msgstr " Siseo " #: src/configdialog.c:1090 #, fuzzy msgid " Sample conversion " msgstr " Conversión de tasa " #: src/configdialog.c:1097 msgid "Normalization mode: " msgstr "" #: src/configdialog.c:1104 msgid "Other" msgstr "Otro" #: src/configdialog.c:1106 msgid " Time format " msgstr " Formato de cronómetro " #: src/configdialog.c:1115 msgid "Display t_imes as: " msgstr "Mostrar _cronómetro como: " #: src/configdialog.c:1126 #, fuzzy msgid "Times_cale format: " msgstr " Formato de cronómetro " #: src/configdialog.c:1137 msgid " External applications " msgstr " Aplicaciones externas" #: src/configdialog.c:1145 msgid "Mi_xer utility: " msgstr "_Mezclador:" #: src/configdialog.c:1155 msgid "Advanced" msgstr "Avanzado" #: src/configdialog.c:1156 msgid " Advanced settings " msgstr "Propiedades avanzadas" #: src/configdialog.c:1164 msgid "Disk editing _threshold: " msgstr "_Umbral de edición de disco: " #: src/configdialog.c:1175 msgid "View _quality:" msgstr "_Calidad de vista:" #: src/configdialog.c:1181 msgid "samples/pixel" msgstr "muestras/pixel" #: src/configdialog.c:1187 msgid "Output _buffer size:" msgstr "Tamaño del _búffer de salida:" #: src/configdialog.c:1193 msgid "bytes" msgstr "bytes" #: src/configdialog.c:1218 msgid "_Close" msgstr "_Cerrar" #: src/dataformat.c:886 #, fuzzy, c-format msgid "Floating-point (single %s)\n" msgstr "Punto flotante (simple)" #: src/dataformat.c:886 src/dataformat.c:888 src/dataformat.c:892 msgid "Big-endian" msgstr "Big-endian" #: src/dataformat.c:886 src/dataformat.c:888 src/dataformat.c:892 msgid "Little-endian" msgstr "Little-endian" #: src/dataformat.c:888 #, fuzzy, c-format msgid "Floating-point (double %s)\n" msgstr "Punto flotante (doble)" #: src/dataformat.c:890 #, fuzzy, c-format msgid "PCM, %d(%d) bit, %s %s\n" msgstr "PCM, %d bits, %s %s\n" #: src/dataformat.c:891 src/formatselector.c:77 msgid "Signed" msgstr "Con signo" #: src/dataformat.c:891 src/formatselector.c:76 msgid "Unsigned" msgstr "Sin signo" #: src/dataformat.c:952 #, fuzzy msgid " Testing ranges..." msgstr "Probando rangos..." #: src/dataformat.c:976 msgid "Range test failed for format: " msgstr "Falló la prueba de rango para el formato:" #: src/dataformat.c:990 #, fuzzy msgid " Testing all conversions.." msgstr "Probando todas las conversiones..." #: src/dataformat.c:1032 msgid "(expected) " msgstr "(esperado)" #: src/dataformat.c:1033 msgid "Conversion test failed, between: " msgstr "Falló la prueba de conversión, entre: " #: src/dataformat.c:1035 msgid " and: " msgstr " y: " #: src/dataformat.c:1112 msgid "No errors detected!" msgstr "No se detectaron errores!" #: src/dataformat.c:1146 msgid "Preparing tests.." msgstr "Preparando pruebas..." #: src/dataformat.c:1154 msgid "Running tests.." msgstr "Ejecutando pruebas..." #: src/dataformat.c:1196 #, c-format msgid "" "\n" "\n" "Test results (1 time unit = %f usec/sample)\n" msgstr "" "\n" "\n" "Resultado de las pruebas (1 unidad de tiempo = %f ms/muestra)\n" #: src/datasource.c:366 #, c-format msgid "Couldn't open %s" msgstr "No se pudo abrir %s" #: src/datasource.c:497 msgid "Unexpected end of file" msgstr "Fin de archivo inesperado" #: src/datasource.c:498 #, c-format msgid "Error reading %s: %s" msgstr "Error al leer %s: %s" #: src/datasource.c:515 #, c-format msgid "Error seeking in %s: %s" msgstr "Error al buscar en %s: %s" #: src/effectbrowser.c:99 msgid "Built-in" msgstr "" #: src/effectbrowser.c:102 #, fuzzy msgid "Volume adjust/fade" msgstr "[B] Ajustar volumen/Desvanecer" #: src/effectbrowser.c:104 #, fuzzy msgid "Convert samplerate" msgstr "Convirtiendo tasa de muestreo" #: src/effectbrowser.c:106 #, fuzzy msgid "Convert sample format" msgstr "[B] Convertir formato de muestreo" #: src/effectbrowser.c:108 #, fuzzy msgid "Map channels" msgstr "%d canales" #: src/effectbrowser.c:110 #, fuzzy msgid "Combine channels" msgstr "[B] Combinar canales" #: src/effectbrowser.c:113 msgid "Add channels from other file" msgstr "" #: src/effectbrowser.c:114 #, fuzzy msgid "Speed" msgstr "Velocidad:" #: src/effectbrowser.c:115 #, fuzzy msgid "Pipe through program" msgstr "[B] Procesar con otro programa" #: src/effectbrowser.c:250 msgid "You have no open file to apply the effect to!" msgstr "No hay archivo para aplicar el efecto!" #: src/effectbrowser.c:275 #, fuzzy msgid "This effect could not be loaded." msgstr "Este efecto no tiene opciones." #: src/effectbrowser.c:582 msgid "/Move Up" msgstr "" #: src/effectbrowser.c:583 msgid "/Move Down" msgstr "" #: src/effectbrowser.c:584 msgid "/Move to Top" msgstr "" #: src/effectbrowser.c:585 msgid "/Move to Bottom" msgstr "" #: src/effectbrowser.c:587 msgid "/Sort by Name" msgstr "" #: src/effectbrowser.c:588 msgid "/Sort by Type" msgstr "" #: src/effectbrowser.c:589 msgid "/Sort by Location" msgstr "" #: src/effectbrowser.c:590 msgid "/Sort by Author" msgstr "" #: src/effectbrowser.c:592 msgid "/Restore Order" msgstr "" #: src/effectbrowser.c:593 msgid "/Rebuild Effect List" msgstr "" #: src/effectbrowser.c:744 msgid "Top" msgstr "" #: src/effectbrowser.c:751 #, fuzzy msgid "Up" msgstr "_Arriba" #: src/effectbrowser.c:758 #, fuzzy msgid "Down" msgstr "A_bajo" #: src/effectbrowser.c:765 msgid "Bottom" msgstr "" #: src/effectbrowser.c:793 #, fuzzy msgid "Close dialog after applying effect" msgstr "_Mantener ventana principal al frente después de aplicar efectos" #: src/effectbrowser.c:800 src/gotodialog.c:154 msgid "Apply" msgstr "Aplicar" #: src/effectbrowser.c:808 src/gotodialog.c:159 src/mainwindow.c:1438 #: src/pipedialog.c:165 src/recorddialog.c:610 src/recorddialog.c:987 #: src/sound-esound.c:290 src/sound-jack.c:264 src/sound-oss.c:479 msgid "Close" msgstr "Cerrar" #: src/effectbrowser.c:830 src/help.c:35 msgid "Effects" msgstr "Efectos" #: src/effectbrowser.c:892 msgid "Apply to: " msgstr "Aplicar a:" #: src/filetypes.c:103 msgid "putenv failed!" msgstr "Falló putenv!" #: src/filetypes.c:113 msgid "unsetenv failed!" msgstr "Falló unsetenv!" #: src/filetypes.c:155 msgid "Microsoft WAV format" msgstr "Formato Microsoft WAV" #: src/filetypes.c:181 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: src/filetypes.c:188 msgid "Raw PCM data" msgstr "Datos PCM en crudo" #: src/filetypes.c:190 msgid "Open with MPlayer" msgstr "" #: src/filetypes.c:275 #, c-format msgid "The file %s does not exist!" msgstr "El archivo %s no existe!" #: src/filetypes.c:282 #, c-format msgid "The file %s is not a regular file!" msgstr "El archivo %s no es un archivo regular!" #: src/filetypes.c:294 msgid "Loading" msgstr "Cargando" #: src/filetypes.c:333 #, c-format msgid "" "The file name '%s' has an extension unknown to the program. Please specify " "in which format this file should be saved." msgstr "" "El nombre de archivo '%s' tiene una extensión desconocida. Por " "favorespecifique el formato en que debería ser guardado." #: src/filetypes.c:338 msgid "Unknown file type" msgstr "Tipo de archivo desconocido" #: src/filetypes.c:389 msgid "Saving" msgstr "Guardando" #: src/filetypes.c:393 #, c-format msgid "" "The file %s may be destroyed since the saving failed. Try to free up some " "disk space and save again. If you exit now the file's contents could be in a " "bad state. " msgstr "" "El archivo %s se puede haber destruido ya que falló la escritura. Intente " "liberar espacio en disco y guarde nuevamente. Si sale ahora el contenido del " "archivo podría estar en mal estado." #: src/filetypes.c:457 #, c-format msgid "%s is not a valid wav file" msgstr "%s no es un archivo wav válido" #: src/filetypes.c:472 #, c-format msgid "" "The file %s is a compressed wav file. This program can only work with " "uncompressed wav files." msgstr "" "%s es un archivo WAV comprimido. Este programa solo puede trabajarcon " "archivos WAV descomprimidos." #: src/filetypes.c:593 msgid "" "On this system, libsndfile is required to save floating-point wav files." msgstr "" "En este sistema se requiere libsndfile para guardar archivos WAV en coma " "flotante." #: src/filetypes.c:616 msgid "" "You are saving a wav file larger than 2048MB. Such large files are non-" "standard and may not be readable by all programs.\n" "\n" " (this warning will not be displayed again)" msgstr "" "Intenta guardar un archivo WAV mayor a 2048 MB. Archivos tan grandes no son " "estándar y pueden no ser leídos por otros programas.\n" "\n" " (Este mensaje no será mostrado nuevamente)" #: src/filetypes.c:732 src/filetypes.c:877 #, c-format msgid "Failed to open '%s'!" msgstr "Fallo al abrir '%s'!" #: src/filetypes.c:849 msgid "Invalid sample format or number of channels for this file format" msgstr "" "Formato de muestra o número de canales no válido para este formato de archivo" #: src/filetypes.c:943 #, c-format msgid "Failed to write to '%s'!" msgstr "Fallo al escribir en '%s'!" #: src/filetypes.c:1028 msgid "Decoding" msgstr "Decodificando" #: src/filetypes.c:1149 msgid "Variable bitrate (default)" msgstr "Tasa de bits variable (predeterminado)" #: src/filetypes.c:1150 msgid "Average bitrate" msgstr "Tasa de bits promedio" #: src/filetypes.c:1151 msgid "Constant bitrate" msgstr "Tasa de bits constante" #: src/filetypes.c:1152 msgid "Custom argument" msgstr "Argumento personalizado" #: src/filetypes.c:1156 msgid "Standard (high quality)" msgstr "Estándar (alta calidad)" #: src/filetypes.c:1157 msgid "Extreme (higher quality)" msgstr "Extremo (calidad superior)" #: src/filetypes.c:1158 msgid "Insane (highest possible quality)" msgstr "Insano (calidad más alta posible)" #: src/filetypes.c:1176 #, c-format msgid "%s kbit/s" msgstr "%s kbits/seg" #: src/filetypes.c:1205 msgid "MP3 Preferences" msgstr "Preferencias MP3" #: src/filetypes.c:1216 msgid "Encoding type: " msgstr "Tipo de codificación:" #: src/filetypes.c:1229 msgid "Quality: " msgstr "Calidad:" #: src/filetypes.c:1238 msgid "Custom argument: " msgstr "Argumento personalizado:" #: src/filetypes.c:1244 msgid "Use this setting by default" msgstr "Usar esta opción predeterminadamente" #: src/filetypes.c:1249 src/gotodialog.c:146 src/mainwindow.c:1509 #: src/rawdialog.c:101 src/sound-alsalib.c:98 src/sound-esound.c:286 #: src/sound-jack.c:260 src/sound-oss.c:475 src/um.c:109 src/um.c:142 #: src/um.c:341 src/um.c:449 msgid "OK" msgstr "OK" #: src/filetypes.c:1257 src/rawdialog.c:107 src/sound-alsalib.c:102 #: src/um.c:133 src/um.c:150 src/um.c:347 src/um.c:458 msgid "Cancel" msgstr "Cancelar" #: src/float_box.c:184 src/int_box.c:184 #, c-format msgid "'%s' is not a number!" msgstr "'%s' no es un número!" #: src/float_box.c:202 #, c-format msgid "Value for '%s' must be a number between %f and %f" msgstr "El valor de '%s' debe estar entre %f y %f" #: src/formatselector.c:60 msgid "Sample type: " msgstr "Tipo de muestra:" #: src/formatselector.c:62 msgid "8 bit PCM" msgstr "8 bit PCM" #: src/formatselector.c:63 msgid "16 bit PCM" msgstr "16 bit PCM" #: src/formatselector.c:64 msgid "24 bit PCM" msgstr "24 bit PCM" #: src/formatselector.c:65 msgid "32 bit PCM" msgstr "32 bit PCM" #: src/formatselector.c:66 msgid "Floating-point, single" msgstr "Punto flotante, simple" #: src/formatselector.c:67 msgid "Floating-point, double" msgstr "Punto flotante, doble" #: src/formatselector.c:74 msgid "Signedness: " msgstr "Signo:" #: src/formatselector.c:82 msgid "Endianness: " msgstr "Orden de bits: " #: src/formatselector.c:84 msgid "Little endian" msgstr "Little endian" #: src/formatselector.c:85 msgid "Big endian" msgstr "Big endian" #: src/formatselector.c:90 msgid "Alignment:" msgstr "" #: src/formatselector.c:92 msgid "Packed" msgstr "" #: src/formatselector.c:93 #, fuzzy msgid "Top bytes" msgstr "bytes" #: src/formatselector.c:94 msgid "Bottom bytes" msgstr "" #: src/formatselector.c:130 msgid "Channels: " msgstr "Canales:" #: src/formatselector.c:139 msgid "Sample rate: " msgstr "Tasa de muestreo:" #: src/formatselector.c:226 msgid "sample rate" msgstr "tasa de muestreo" #: src/gotodialog.c:102 msgid "Place cursor " msgstr "Posicionar cursor" #: src/gotodialog.c:107 src/sound-esound.c:274 msgid "seconds" msgstr "segundos" #: src/gotodialog.c:111 src/soxdialog.c:487 msgid "samples" msgstr "muestras" #: src/gotodialog.c:115 msgid "after beginning of file" msgstr "después del inicio del archivo" #: src/gotodialog.c:120 msgid "after end of file" msgstr "después del final del archivo" #: src/gotodialog.c:125 msgid "after current cursor position" msgstr "después de la posición del cursor" #: src/gotodialog.c:130 msgid "after selection start" msgstr "después del inicio de la selección" #: src/gotodialog.c:135 msgid "after selection end" msgstr "después del final de la selección" #: src/gotodialog.c:139 msgid "" "(use a negative number to place the cursor before instead of after the " "selected point)" msgstr "" "(use un número negativo para ubicar el cursor antes del punto seleccionado)" #: src/gotodialog.c:178 msgid "Position cursor" msgstr "Posición del cursor" #: src/gtkfiles.c:48 #, c-format msgid "Could not open %s: %s" msgstr "No se puede abrir %s: %s" #: src/gtkfiles.c:53 #, c-format msgid "Warning: Unexpected error: %s" msgstr "Advertencia: Error inesperado: %s" #: src/gtkfiles.c:110 src/gtkfiles.c:125 #, c-format msgid "Error closing %s: %s" msgstr "Error al cerrar %s: %s" #: src/gtkfiles.c:140 #, c-format msgid "Could not seek in %s: %s" msgstr "No se puede buscar en %s: %s" #: src/gtkfiles.c:159 src/gtkfiles.c:204 #, c-format msgid "Could not read from %s: %s" msgstr "No se puede leer desde %s: %s" #: src/gtkfiles.c:178 #, c-format msgid "Unexpected end of file reading from %s" msgstr "Fin de archivo inesperado leyendo %s" #: src/gtkfiles.c:196 #, c-format msgid "Unable to write data to %s" msgstr "Imposible escribir datos a %s" #: src/gtkfiles.c:262 #, c-format msgid "Could not get file position in %s: %s" msgstr "No se puede obtener la posición del archivo %s: %s" #: src/gtkfiles.c:313 src/gtkfiles.c:473 msgid "File already exists. Overwrite?" msgstr "El archivo ya existe. Desea sobreescribirlo?" #: src/gtkfiles.c:321 msgid "No file with that name!" msgstr "No hay archivo con ese nombre!" #: src/gtkfiles.c:705 #, c-format msgid "Error reading from %s: %s" msgstr "Error al leer desde %s: %s" #: src/gtkfiles.c:737 #, c-format msgid "Could not remove '%s': %s" msgstr "No se puede remover '%s': %s" #: src/gtkfiles.c:757 #, c-format msgid "Error creating link to '%s': %s" msgstr "Error al crear enlace hacia '%s': %s" #: src/help.c:30 msgid "General" msgstr "General" #: src/help.c:31 msgid "Sample view" msgstr "Vista de muestreo" #: src/help.c:32 msgid "Playing" msgstr "Reproducir" #: src/help.c:33 msgid "Recording" msgstr "Grabar" #: src/help.c:34 msgid "Editing" msgstr "Editar" #: src/help.c:37 msgid "File formats" msgstr "Formatos de archivo" #: src/help.c:39 msgid "Keyboard shortcuts" msgstr "Atajos de teclado" #: src/help.c:40 msgid "Bug reporting" msgstr "Reportar errores" #: src/help.c:41 msgid "Helping out" msgstr "Colaborar" #: src/help.c:42 msgid "Contact" msgstr "Contacto" #: src/help.c:47 #, no-c-format msgid "" "mhWaveEdit is a graphical program for editing sound files. It is completely " "free (GPL).\n" msgstr "" "mhWaveEdit en un programa para la edición gráfica de archivos de sonido. Es " "completamente libre (GPL).\n" #: src/help.c:49 #, no-c-format msgid "You can find the latest release of mhWaveEdit at:\n" msgstr "Puede encontrar la última versión lanzada de mhWaveEdit en:\n" #: src/help.c:50 #, no-c-format msgid "http://gna.org/projects/mhwaveedit/\n" msgstr "http://gna.org/projects/mhwaveedit/\n" #: src/help.c:55 #, no-c-format msgid "" "The area where you 'see' the contents of the file you are editing, is called " "the 'sample view'. \n" msgstr "" "Allí hay una línea vertical llamada 'cursor' que sigue la onda de sonido " "mientras reproduce. Puede posicionar el cursor haciendo clic con el botón " "secundario del ratón.\n" #: src/help.c:57 #, no-c-format msgid "" "In the sample view there is a grey vertical bar called the 'cursor'. The " "cursor follows the sound wave when you play the sound. You can position the " "cursor by clicking with the right (2:nd) mouse button. If you do this while " "you're playing a file, the playing will continue from the new cursor " "position. You can also position the cursor more exact by using the 'Position " "Cursor...' command on the Edit menu.\n" msgstr "" "Si hace esto mientras se está reproduciendo el archivo, la reproducción " "continuará desde la nueva posición del cursor.\n" "También puede ubicar el cursor de manera más exacta usando la opción " "'Posición del cursor...' desde el menú Edición.\n" "Puede ubicar marcas en el archivo presionando la tecla Ctrl y un número del " "0 al 9. Se establecerá una marca (línea vertical) con el mismo número en la " "posición del cursor. Luego puede hacer ir el cursor a esa posición " "nuevamente solo presionando el número correspondiente.\n" "Mientras se reproduce puede establecer y saltar marcas. Para remover una " "marca, vaya a esa marca y establezcala nuevamente.\n" #: src/help.c:59 #, no-c-format msgid "" "You can place marks in your file by holding down Ctrl and pressing a number " "from 0 to 9. This will place a mark (green vertical bar) with the same " "number at the current cursor position. You can later make the cursor go to " "that position again by just pressing the number. Setting and jumping to " "marks can be done while playing. To remove a mark, jump to the mark and set " "it again.\n" msgstr " \n" #: src/help.c:64 #, no-c-format msgid "" "Playing a file is simple, just load the file and press the play button. The " "green play button plays from the current position. The yellow play button " "plays the current selection, or the entire file if nothing is selected. Stop " "the playback with the stop button (with the red square). \n" msgstr "" "El botón de reproducción verde reproduce desde la posición del cursor.\n" #: src/help.c:66 #, no-c-format msgid "" "The playback speed can be varied by adjusting the slider to the far right. \n" msgstr "" "El botón de reproducción amarillo reproduce la selección o el archivo entero " "si no hay nada seleccionado.\n" "Para detener la reproducción pulse el botón Detener (con el cuadrado rojo).\n" "La velocidad de reproducción se puede variar ajustando la barra de " "desplazamiento de la derecha.\n" "Puede hacer ediciones simples mientras está reproduciendo.\n" #: src/help.c:68 #, no-c-format msgid "You can do normal editing while the file is playing.\n" msgstr " \n" #: src/help.c:73 #, no-c-format msgid "" "Recording is done with 'Record...' on the Play menu, or the Record button " "(the red circle). A dialog box will pop up where you can select what format " "you want to record in. After selecting the format, meters and numbers will " "appear showing info about the volume level of the sound input. \n" msgstr "" "Aparecerá una ventana donde podrá elegir el formato en que desea grabar. " "Después de elegir el formato, métricas y números aparecerán indicando " "información sobre el nivel del volumen de la entrada de sonido.\n" #: src/help.c:75 #, no-c-format msgid "" "When you want to start recording, press the \"Start recording\" button. When " "you've recorded everything you wanted to, press the Finish button and the " "record dialog will disappear and newly recorded sound will show up in a new " "window.\n" msgstr "" "Cuando desee comenzar a grabar, pulse el botón 'Comenzar grabación'. Cuando " "haya grabado lo necesario pulse el botón 'Finalizar' y se cerrará la ventana " "apareciendo el sonido guardado en una nueva ventana.\n" "Actualmente es imposible reproducir y grabar simultáneamente, por eso la " "reproducción se detendrá cuando comience a grabar.\n" #: src/help.c:77 #, no-c-format msgid "" "Currently it is impossible to play and record at the same time, so the " "playback will stop when you record.\n" msgstr " \n" #: src/help.c:82 #, no-c-format msgid "" "You make selections by dragging the mouse over the sample view. You can hear " "what you've currently selected by clicking on the \"play selection\" button " "(the button with the yellow arrow) or by selecting 'Play selection' from the " "Play menu.\n" msgstr "" "Para seleccionar arrastre el ratón sobre la vista de muestreo. Puede oír lo " "que ha seleccionado haciendo clic en el botón 'Reproducir selección' o " "seleccionado la opción 'Selección' desde el menú Reproducir.\n" #: src/help.c:84 #, no-c-format msgid "" "You can use the cursor to refine the selection. Use the 'Selection start at " "cursor' and 'Selection end at cursor' buttons to move the selection starting " "point or the selection end point to the current cursor position. You can " "also drag the selection endpoints using the mouse.\n" msgstr "" "Puede usar el cursor para refinar la selección usando los botones " "'Establecer inicio de selección' y 'Establecer final de selección' desde el " "menú Cursor. También puede arrastrar con el ratón los límites de la " "selección.\n" #: src/help.c:86 #, no-c-format msgid "The 'Cut' and 'Copy' functions work like in any other software. \n" msgstr "" "Las funciones 'Cortar' y 'Pegar' trabajan como cualquier otro software. \n" #: src/help.c:88 #, no-c-format msgid "" "The 'Paste' function insert the clipboard contents at the cursor position. " "The 'Paste over' function works like 'Paste', except that it overwrites the " "data after the insert position. \n" msgstr "" "La función 'Pegar' inserta el contenido del portapapeles en la posición del " "cursor. La función 'Pegar encima' funciona como Pegar, excepto que " "sobreescribe los datos después del punto de inserción.\n" #: src/help.c:90 #, no-c-format msgid "" "The 'Paste mix' function combines the clipboard data with the data at the " "cursor position.\n" msgstr "" "La función 'Pegar mezclando' combina el contenido del portapapeles con los " "datos en la posición del cursor.\n" #: src/help.c:92 #, no-c-format msgid "" "The 'Paste as new' function opens a new window and puts the clipboard " "contents into it. \n" msgstr "" "La función 'Pegar como nuevo' abre una nueva ventana y coloca el contenido " "del portapapeles en ella.\n" #: src/help.c:94 #, no-c-format msgid "" "The 'Crop' function deletes all parts of the file that are not selected.\n" msgstr "" "La función 'Recortar' borra todas las partes del archivo que no están " "seleccionadas.\n" #: src/help.c:96 #, no-c-format msgid "" "The 'Silence selection' function replaces the selected part with silence. To " "avoid clicks, the silent part is a line that meets the wave at the " "endpoints.\n" msgstr "" "La función 'Seleccionar silencios' reemplaza el área seleccionada con " "silencio. Para evitar saltos, el silencio es una línea que une las áreas no " "seleccionadas.\n" #: src/help.c:98 #, no-c-format msgid "" "All editing functions work non-destructively, that is, the file you're " "editing isn't actually changed until you save it (the effects also work this " "way).\n" msgstr "" "Todas las funciones de edición (al igual que los efectos aplicados) trabajan " "de manera no destructiva, esto es, el archivo que está editando no es " "realmente modificado hasta que sea guardado.\n" #: src/help.c:104 #, fuzzy, no-c-format msgid "" "mhWaveEdit has a few simple effects, which are available from the 'Effects' " "menu. \n" msgstr "" "mhWaveEdit posee unos pocos efectos que están disponibles a travésdel menú " "'Efectos'.\n" #: src/help.c:106 #, fuzzy, no-c-format msgid " * Fade in/out\n" msgstr " * Fade in/out\n" #: src/help.c:108 #, fuzzy, no-c-format msgid " This creates a linear fade in or fade out effect.\n" msgstr "" " Esto crea un efecto de desvanecimiento lineal (creciente o decreciente).\n" #: src/help.c:110 #, fuzzy, no-c-format msgid " * Normalize, Normalize to...\n" msgstr " * Normalizar\n" #: src/help.c:112 #, fuzzy, no-c-format msgid "" " This amplifies the sound as much as possible without getting clipping " "distortion. The \"Normalize to...\" item lets you specify which level to " "normalize to.\n" msgstr "" " Esto amplifica el volumen tanto como sea posible sin obtener distorsiones " "por recortado.\n" #: src/help.c:114 #, fuzzy, no-c-format msgid " * Volume adjust/fade...\n" msgstr " * Ajustar volumen...\n" #: src/help.c:116 #, fuzzy, no-c-format msgid "" " This effect lets you select a starting volume and a ending volume and " "amplifies the selection fading from the starting volume to the ending " "volume.\n" msgstr "" " Este efecto permite seleccionar el volumen inicial y final amplificando " "la selección desde el volumen inicial hasta el volumen final.\n" #: src/help.c:118 #, fuzzy, no-c-format msgid "" " Note that volumes above 100% may cause sound distortion. Use the 'Find " "top volume' to find out the maximum amplification possible without " "distortion. (You can use this for normalizing samples.) \n" msgstr "" " Note que volúmenes superiores a 100% pueden causar distorsión de sonido. " "Use la opción 'Buscar volumen máximo' para encontrar la máxima amplificación " "posible sin distorsión. (Puede usar esto para normalizar muestras).\n" #: src/help.c:120 #, fuzzy, no-c-format msgid "" " By setting starting volume and ending volume to the same value you get a " "simple amplification of the sound. \n" msgstr "" " Estableciendo el mismo valor para volumen inicial y volumen final " "obtiene una amplificación simple del sonido.\n" #: src/help.c:122 #, fuzzy, no-c-format msgid " * Convert samplerate...\n" msgstr " * Convertir tasa de muestreo...\n" #: src/help.c:124 #, fuzzy, no-c-format msgid "" " This converts the samplerate of the entire file to one you specify. There " "are different methods for doing this, usually the one in the top has the " "best quality but can take longer than the other methode.\n" msgstr "" " Esto convierte la tasa de muestreo de todo el archivo a la que " "especifique. Hay diferentes métodos para hacer esto, usualmente las que " "están arriba tienen la mejor calidad pero pueden tomar más tiempo que otros " "métodos.\n" #: src/help.c:126 #, fuzzy, no-c-format msgid " * Convert sample format...\n" msgstr " * Convertir formato de la muestra...\n" #: src/help.c:128 #, fuzzy, no-c-format msgid " This converts the sample format of the entire file.\n" msgstr " Esto convierte el formato del archivo entero.\n" #: src/help.c:130 #, fuzzy, no-c-format msgid "" " The 'Don't actually change the data' option can be used if the program " "was wrong about the file's format.\n" msgstr "" " La opción 'No cambiar datos' se puede usar si el programa se equivocó " "acerca del formato de archivo.\n" #: src/help.c:132 #, fuzzy, no-c-format msgid " * Byte swap\n" msgstr " * Intercambiar bytes\n" #: src/help.c:134 #, fuzzy, no-c-format msgid "" " This \"byte swaps\" the selected part. It can be used to repair damaged " "files where the byte order is wrong. Note that if the sound looks alright " "but plays wrong, you should not use this option, instead you should use the " "\"byte-swap output\" option in the Preferences dialog.\n" msgstr "" " Esto \"intercambia bytes\" de la parte seleccionada y puede usarse para " "reparar archivos dañados donde el orden de los bytes es incorrecto. Note que " "si el sonido luce bien pero reproduce mal no debería usar esta opción, sino " "usar la opción \"Intercambiar bytes\" en Preferencias/Sonido.\n" #: src/help.c:136 #, fuzzy, no-c-format msgid " * Mix to mono\n" msgstr " * Mezclar canales...\n" #: src/help.c:138 #, fuzzy, no-c-format msgid " This mixes all channels of the file together to a mono sound.\n" msgstr "" " Esto mezcla todos los canales del archivo para crear un sonido mono.\n" #: src/help.c:140 #, fuzzy, no-c-format msgid " * Add channel\n" msgstr " * Dividir canal...\n" #: src/help.c:142 #, fuzzy, no-c-format msgid "" " This copies the first channel to a new channel in the sound, converting " "mono to stereo etc.\n" msgstr "" " Esto copia el primer canal a un nuevo canal para convertir un sonido mono " "a estéreo.\n" #: src/help.c:144 #, fuzzy, no-c-format msgid " * Map channels...\n" msgstr " * Combinar canales...\n" #: src/help.c:145 #, fuzzy, no-c-format msgid " \n" msgstr "" " Este efecto permite crear un nuevo sonido mediante una combinación lineal " "de los canales anteriores. Esto significa que puede hacer mezclado de " "canales, intercambio, balance, amplificación, etc ingresando distintos " "valores.\n" #: src/help.c:146 #, fuzzy, no-c-format msgid "" " With this effect, you can change the number of channels in the file. You " "can also rearrange and add (i.e. mix) channels.\n" msgstr " * Ajustar velocidad...\n" #: src/help.c:148 #, fuzzy, no-c-format msgid " * Combine channels...\n" msgstr "" " Este efecto modifica la velocidad de la selección. El tono también " "cambiará.\n" #: src/help.c:150 #, fuzzy, no-c-format msgid "" " This effect lets you create a new sound by a linear combination of the " "old channels. This means you can do channel mixing / swapping / balance / " "panning / amplification etc. by entering different values. For example, to " "swap the left and right channel, you select that the new Channel 1 should be " "0% of the old Channel 1 and 100% of the old Channel 2, and the new Channel 2 " "should be 100% of the old Channel 1 and 0% of the old Channel 2 \n" msgstr "" "mhWaveEdit soporta los efectos LADSPA y puede también hacer uso de la " "mayoría de los efectos SoX. Todos los efectos soportados se pueden encontrar " "en la opción 'Diálogo de efectos' del menú Efectos.\n" #: src/help.c:152 #, fuzzy, no-c-format msgid " * Speed adjustment...\n" msgstr " \n" #: src/help.c:154 #, fuzzy, no-c-format msgid "" " This effect changes the speed of the selection. The tone will change as " "well.\n" msgstr " \n" #: src/help.c:155 #, fuzzy, no-c-format msgid " * Pipe through program...\n" msgstr " \n" #: src/help.c:156 #, fuzzy, no-c-format msgid " \n" msgstr " \n" #: src/help.c:157 #, fuzzy, no-c-format msgid "" " This effect is for advanced users wanting to pipe raw audio data through " "an external program. The output of the program is read back and replaces the " "processed part. \n" msgstr " \n" #: src/help.c:159 #, fuzzy, no-c-format msgid "" "mhWaveEdit supports LADSPA effects and can also make use of most of the SoX " "utility's effects. To find the LADSPA plugins the environment variable " "LADSPA_PATH must be properly set up. \n" msgstr " \n" #: src/help.c:161 #, fuzzy, no-c-format msgid "" "All supported effects can be found by choosing the 'Effects...' menu item. " "The effects are listed with names beginning with [B] for builtin effects, " "[L] for LADSPA effects, and [S] for SoX effects.\n" msgstr " \n" #: src/help.c:167 #, no-c-format msgid "Some notes on sound quality.\n" msgstr "Algunas notas sobre la calidad de sonido.\n" #: src/help.c:169 #, no-c-format msgid "" "The general rule when doing audio editing/processing is to not manipulate " "the data more than necessary and keep an original copy whenever you're " "processing your important files. \n" msgstr "" "Cuando se edita o procesa audio, la regla general es no manipular los datos " "más de lo necesario y mantener una copia de respaldo de sus archivos " "importantes.\n" #: src/help.c:171 #, no-c-format msgid "" "Cut, copy and paste operations move the data around without modifying it, so " "these don't degrade the sound quality. Because of level differences, you may " "get a \"step\" at the start and end of the inserted part, which can cause a " "small clicking sound. \n" msgstr "" "Las operaciones de cortar, copiar y pegar mueven los datos pero sin " "modificarlos, así que no degradan la calidad del sonido. Debido a la " "diferencia de niveles, puede haber un \"salto\" al inicio o al final de la " "parte insertada que puede causar un sonido similar a un pequeño \"clic\".\n" #: src/help.c:173 #, no-c-format msgid "" "The mix paste function doesn't decrease quality, unless the peaks become too " "high and you get clipping. In that case you will get a warning message.\n" msgstr "" "La función 'pegar mezclando' no degrada el sonido a menos que los picos " "terminen siendo muy altos resultando en un recorte. En ese caso obtendrá un " "mensaje de advertencia.\n" #: src/help.c:175 #, no-c-format msgid "" "Sound data is normally stored as integer values. Therefore, whenever you " "normalize, adjust volume, decrease sample size or filter a sound, the result " "must be rounded. If you use 24 or 32 bit sample sizes, this is not really a " "problem, but if you use 8 or 16 bits sample size, this rounding causes a " "decrease in quality. \n" msgstr "" "Los datos del sonido se almacenan normalmente como valores enteros. Por ello " "al normalizar, ajustar volumen, decrementar tamaño de la muestra o al " "filtrar un sonido el resultado debe ser redondeado. Si usa tamaños de " "muestras de 24 o 32 bits esto no es un problema, pero si usa tamaños de " "muestras de 8 o 16 bits el redondeo causa un decremento de calidad.\n" #: src/help.c:177 #, fuzzy, no-c-format msgid "" "The quality decrease that the rounding causes can be masked by adding a " "small amount of noise before rounding. This is called \"dithering\". " "mhWaveEdit supports basic dithering and it's enabled by default.\n" msgstr "" "El decremento de calidad que causa el redondeo puede ser enmascarado " "agregando una pequeña cantidad de ruido antes de redondear, llamada \"siseo" "\". mhWaveEdit soporta siseo triangular básico y está habilitado de modo " "predeterminado.\n" #: src/help.c:179 #, no-c-format msgid "" "By default, mhWaveEdit uses floating-point temporary files for storing " "processed results to avoid rounding until the file is saved.\n" msgstr "" "También de modo predeterminado mhWaveEdit usa archivos temporales con " "valores de punto flotante para almacenar los valores procesados y evitar de " "este modo el redondeo hasta que el archivo se guarda.\n" #: src/help.c:184 #, fuzzy, no-c-format msgid "" "Even if mhWaveEdit was originally built for editing wav files, it's also " "possible to load and save in a few other formats. mhWaveEdit always supports " "wav and raw files, but if it's compiled with the libsndfile library, " "mhWaveEdit supports a couple of other formats as well. \n" msgstr "" "Aún cuando mhWaveEdit fue hecho para editar archivos WAV, es posible cargar " "y guardar en otros pocos formatos. mhWaveEdit siempre soporta archivos WAV y " "RAW, pero si compila con la biblioteca libsndfile mhWaveEdit soporta un par " "de formatos más.\n" #: src/help.c:186 #, fuzzy, no-c-format msgid "" "To save a file with a different file format, use \"Save as...\" and choose a " "format in the file type selection box. \n" msgstr "" "Para guardar un archivo en un formato diferente, guardelo con un nombre que " "no termine en '.wav'. Algunos sufijos son reconocidos directamente, pero si " "el sufijo no es reconocido se le pedirá el formato en que desea guardarlo.\n" #: src/help.c:188 #, fuzzy, no-c-format msgid "" "mhWaveEdit has basic support for mp3 and ogg formats. For this to work you " "need to have LAME installed for mp3 support, and OggDec/OggEnc for Ogg " "support. If you have these programs, you can open and save mp3/ogg files " "just like any other file format.\n" msgstr "" "mhWaveEdit tiene soporte básico para formatos OGG y MP3. Para que esto " "funcione necesita tener instalado LAME, OggDec y OggEnc.\n" #: src/help.c:190 #, fuzzy, no-c-format msgid "" "If mplayer is installed, mhwaveedit can open all formats that it supports, " "for example the soundtrack of a video file. Since mplayer is only a player, " "these files can not be saved back after editing, you have to save the file " "into a supported format.\n" msgstr " \n" #: src/help.c:195 #, fuzzy, no-c-format msgid "" "mhWaveEdit creates a directory ~/.mhwaveedit where it stores configuration " "information. \n" msgstr "" "mhWaveEdit crea el directorio .mhwaveedit en su carpeta personal donde " "almacena la información sobre la configuración.\n" #: src/help.c:197 #, fuzzy, no-c-format msgid "" "The configuration file is called config. It can be hand edited, but the " "easiest way is through 'Preferences' on the Edit menu.\n" msgstr "" "El archivo de configuración se llama config y puede ser editado a mano, " "siendo más fácil modificarlo mediante la opción 'Preferencias' del menú " "Edición.\n" #: src/help.c:199 #, fuzzy, no-c-format msgid "" "Each mhwaveedit process creates a session file in the .mhwaveedit directory " "called mhwaveedit-session---, where is the " "session ID number and is a character code showing the state of the " "session ('r' for running sessions). \n" msgstr "" "Los archivos temporales se almacenan de modo predeterminado en el " "directorio .mhwaveedit pudiendo también definirlo desde las 'Preferencias'. " "Para un mejor rendimiento se recomienda un directorio temporal por cada " "sistema de archivos local.\n" #: src/help.c:201 #, fuzzy, no-c-format msgid "" "Temporary files are by default also stored in the ~/.mhwaveedit directory. " "Which directories to use can be set through the preferences dialog. To get " "the best performance, you should have one temporary directory for each local " "filesystem. The temporary files have names of the form \"mhwaveedit-temp-" "-nnnn-\". Do NOT open or remove temporary files with the same " "pid number as a currently running mhWaveEdit.\n" msgstr " \n" #: src/help.c:203 #, fuzzy, no-c-format msgid "" "mhWaveEdit checks on startup for leftover temporary files and lets the user " "open them. After opening a crashed session, the files can be saved or thrown " "away.\n" msgstr " \n" #: src/help.c:208 #, fuzzy, no-c-format msgid "F1 Help\n" msgstr "F1 Ayuda\n" #: src/help.c:209 #, fuzzy, no-c-format msgid "F12 Record\n" msgstr "F12 Grabar\n" #: src/help.c:211 #, fuzzy, no-c-format msgid "Ctrl+(number) Set mark\n" msgstr "Ctrl+(número) Establecer marca\n" #: src/help.c:212 #, fuzzy, no-c-format msgid "(number) Goto mark\n" msgstr "(número) Ir a la marca\n" #: src/help.c:214 #, fuzzy, no-c-format msgid "Ctrl+P Preferences\n" msgstr "Ctrl+P Preferencias\n" #: src/help.c:215 #, fuzzy, no-c-format msgid "Ctrl+E Effects\n" msgstr "Ctrl+E Efectos\n" #: src/help.c:217 #, fuzzy, no-c-format msgid "Ctrl+O Open file\n" msgstr "Ctrl+O Abrir archivo\n" #: src/help.c:218 #, fuzzy, no-c-format msgid "Ctrl+S Save file\n" msgstr "Ctrl+S Guardar archivo\n" #: src/help.c:219 #, fuzzy, no-c-format msgid "Ctrl+U Save selection as\n" msgstr "Ctrl+U Guardar selección como\n" #: src/help.c:221 #, fuzzy, no-c-format msgid "Ctrl+C Copy\n" msgstr "Ctrl+C Copiar\n" #: src/help.c:222 #, fuzzy, no-c-format msgid "Ctrl+X Cut\n" msgstr "Ctrl+X Cortar\n" #: src/help.c:223 #, fuzzy, no-c-format msgid "Ctrl+D Delete\n" msgstr "Ctrl+D Borrar\n" #: src/help.c:224 #, fuzzy, no-c-format msgid "Delete Delete\n" msgstr "Ctrl+D Borrar\n" #: src/help.c:225 #, fuzzy, no-c-format msgid "Ctrl+V Paste\n" msgstr "Ctrl+V Pegar\n" #: src/help.c:226 #, fuzzy, no-c-format msgid "Ctrl+Z Undo\n" msgstr "Ctrl+Z Deshacer\n" #: src/help.c:227 #, fuzzy, no-c-format msgid "Ctrl+A Select all\n" msgstr "Ctrl+A Seleccionar todo\n" #: src/help.c:229 #, fuzzy, no-c-format msgid "Ctrl+G Position cursor (Go to)\n" msgstr "Ctrl+G Posicionar cursor (Ir a)\n" #: src/help.c:230 #, fuzzy, no-c-format msgid "Ctrl+H Position cursor at file start\n" msgstr "Ctrl+H Posicionar cursor al inicio\n" #: src/help.c:231 #, fuzzy, no-c-format msgid "Ctrl+J Position cursor at file end\n" msgstr "Ctrl+J Posicionar cursor al final\n" #: src/help.c:232 #, fuzzy, no-c-format msgid "Ctrl+K Position cursor at selection start\n" msgstr "Ctrl+K Posicionar cursor al inicio de la selección\n" #: src/help.c:233 #, fuzzy, no-c-format msgid "Ctrl+L Position cursor at selection end\n" msgstr "Ctrl+L Posicionar cursor al final de la selección\n" #: src/help.c:234 #, fuzzy, no-c-format msgid "Y,U Move cursor to nearest all-channel zero-crossing\n" msgstr "Ctrl+Q Inicio de selección en el cursor\n" #: src/help.c:235 #, fuzzy, no-c-format msgid "I,O Move cursor to nearest any-channel zero-crossing\n" msgstr "Ctrl+W Final de selección en el cursor\n" #: src/help.c:237 #, fuzzy, no-c-format msgid "Ctrl+Q Selection start at cursor\n" msgstr "+,= Acercar\n" #: src/help.c:238 #, fuzzy, no-c-format msgid "Ctrl+W Selection end at cursor\n" msgstr "- Alejar\n" #: src/help.c:240 #, fuzzy, no-c-format msgid "+,= Zoom in\n" msgstr "> Ajustar a la selección\n" #: src/help.c:241 #, fuzzy, no-c-format msgid "- Zoom out\n" msgstr "< Ver todo\n" #: src/help.c:242 #, fuzzy, no-c-format msgid "> Zoom to selection\n" msgstr "Flechas Desplazamiento izq/der\n" #: src/help.c:243 #, fuzzy, no-c-format msgid "< Zoom all\n" msgstr " Reproducir/Detener\n" #: src/help.c:244 #, fuzzy, no-c-format msgid "Arrow keys Scroll left/right\n" msgstr ", Reproducir desde la posición del cursor\n" #: src/help.c:246 #, fuzzy, no-c-format msgid "Home Move view to file start\n" msgstr "Ctrl+H Posicionar cursor al inicio\n" #: src/help.c:247 #, fuzzy, no-c-format msgid "End Move view to file end\n" msgstr " \n" #: src/help.c:248 #, fuzzy, no-c-format msgid "Tab Move view to cursor\n" msgstr " \n" #: src/help.c:249 #, fuzzy, no-c-format msgid "Ctrl+Tab Move cursor to center of view\n" msgstr "Ctrl+L Posicionar cursor al final de la selección\n" #: src/help.c:251 #, fuzzy, no-c-format msgid "Space Play/Stop\n" msgstr ". Detener\n" #: src/help.c:252 #, no-c-format msgid "Shift+Space Play all\n" msgstr "" #: src/help.c:253 #, fuzzy, no-c-format msgid ", Play from cursor pos\n" msgstr "/ Reproducir selección\n" #: src/help.c:254 #, fuzzy, no-c-format msgid ". Stop\n" msgstr "Ctrl+flecha Reproducir más atrás/más adelante\n" #: src/help.c:255 #, fuzzy, no-c-format msgid "/ Play selection\n" msgstr "( Reproducir primeros 3 segundos de la selección\n" #: src/help.c:256 #, fuzzy, no-c-format msgid "H,J Move cursor (and playback) 1/8 of view\n" msgstr ") Reproducir últimos 3 segundos de la selección\n" #: src/help.c:257 #, fuzzy, no-c-format msgid "K,L Move cursor one sample\n" msgstr " \n" #: src/help.c:258 #, fuzzy, no-c-format msgid "Ctrl+arrow Move cursor (and playback) half second\n" msgstr " \n" #: src/help.c:259 #, fuzzy, no-c-format msgid "( Play first 3 seconds of selection\n" msgstr " \n" #: src/help.c:260 #, fuzzy, no-c-format msgid ") Play last 3 seconds of selection\n" msgstr " \n" #: src/help.c:265 #, no-c-format msgid "" "If you find a bug or flaw in the program that's not mentioned in the BUGS " "file, report the bug in the bug tracker (see contact info) or mail a bug " "report describing the bug to: magnus.hjorth@home.se\n" msgstr "" "Para reporte de errores (no descriptos en el archivo BUGS) contactese con: " "magnus.hjorth@home.se\n" #: src/help.c:267 #, no-c-format msgid "" "In case of a crash, please do not send me any core dumps. They are huge and " "completely useless to me. Instead, create a backtrace. Backtraces tell you " "exactly where the program crashed.\n" msgstr " \n" #: src/help.c:269 #, no-c-format msgid "How to create a backtrace:\n" msgstr " \n" #: src/help.c:270 #, no-c-format msgid "1. Enable core dumps: ulimit -c unlimited\n" msgstr " \n" #: src/help.c:271 #, no-c-format msgid "2. Run the program: mhwaveedit\n" msgstr " \n" #: src/help.c:272 #, no-c-format msgid "" "3. Make the program crash. You should now get a file named core or core.1234 " "in the directory you're in.\n" msgstr " \n" #: src/help.c:273 #, no-c-format msgid "4. Run gdb with the program and core file: \n" msgstr " \n" #: src/help.c:274 #, no-c-format msgid " gdb /usr/local/bin/mhwaveedit core | tee backtrace.txt\n" msgstr " \n" #: src/help.c:275 #, no-c-format msgid "5. After gdb has loaded, use the command: bt\n" msgstr " \n" #: src/help.c:276 #, no-c-format msgid "6. Quit gdb with the command: quit\n" msgstr " \n" #: src/help.c:277 #, no-c-format msgid "7. Now you should have a back trace in the file backtrace.txt\n" msgstr " \n" #: src/help.c:282 #, fuzzy, no-c-format msgid "" "There are plenty of things you can do if you want to help the development of " "mhWaveEdit. \n" msgstr "" "Hay una variedad de cosas que puede hacer si desea ayudar al desarrollo de " "mhWaveEdit. \n" #: src/help.c:284 #, fuzzy, no-c-format msgid "" "First of all, look for bugs and report all bugs you find into the bug " "tracker or through e-mail. Sometimes a bug can get overlooked for a long " "time because nobody reports it, so don't be afraid to report bugs that have " "been there for a few releases. You don't have to provide fixes or very " "detailed information, although it helps of course.\n" msgstr "" "Antes que nada, busque errores y reporte todos los errores que encuentre a " "través del bug-tracker o vía e-mail. Algunas veces un error puede persistir " "por mucho tiempo porque nadie lo reporta, así que no tema reportar errores " "que han persistido en varias versiones. No tiene que proveer soluciones o " "información muy detallada, aunque ayuda de todos modos.\n" #: src/help.c:286 #, fuzzy, no-c-format msgid "" "Feature requests are also welcome, report them to the mailing list or to the " "bug tracker.\n" msgstr "" "Pedidos de nuevas características también son bienvenidas, solicítelas por " "medio de las listas de correo o del bug-tracker.\n" #: src/help.c:288 #, fuzzy, no-c-format msgid "" "If you speak a language other than English and mhWaveEdit isn't translated " "to your language, you can contribute a translation. To do that, copy the " "template mhwaveedit.pot in the po directory into a new file ll.po, where ll " "is your language code (see http://www.gnu.org/software/gettext/manual/" "html_node/gettext_221.html for a list of language codes). \n" msgstr "" "Si habla un idioma distinto al inglés y mhWaveEdit no está traducido a su " "lengua, puede contribuir a su traducción.\n" #: src/help.c:290 #, fuzzy, no-c-format msgid "" "It's possible to edit po-files by hand, but I recommend a program such as " "poEdit (http://www.poedit.org) for editing translations. \n" msgstr "" "Donaciones de dinero a través de PayPal serán aceptadas. Donaciones de U$S10 " "o mayores serán acreditadas con el nombre del donante (U$S25 para " "compañías), e-mail y página web como espónsor en el archivo AUTHORS de " "futuros lanzamientos. Note que las donaciones son otorgadas a mi persona " "(Magnus Hjorth), y no por pagos de servicios de ninguna clase.\n" #: src/help.c:292 #, fuzzy, no-c-format msgid "" "Note that for those translatable strings that look like \"RecordStatus|Paused" "\", you should ignore what's to the left and only translate the string to " "the right (\"Paused\" in this example). This convention is there to make it " "possible to translate the same string to different things depending on " "context. \n" msgstr "Cualquier otra consulta envieme un e-mail.\n" #: src/help.c:294 #, fuzzy, no-c-format msgid "" "After you've filled in all the translations you want (you don't have to " "translate all the strings), mail in the po file to me (see contact info) and " "I'll add it to the next release. \n" msgstr " \n" #: src/help.c:296 #, fuzzy, no-c-format msgid "" "If a translation is incomplete, you're very welcome to translate the " "remaining untranslated messages and mail them in. Corrections to " "translations are also appreciated, but they may need to be checked with the " "previous translator before including them. \n" msgstr " \n" #: src/help.c:302 #, no-c-format msgid "For bug reports, translation updates, patches and PayPal donations:\n" msgstr "" "Para reporte de errores, actualización de traducciones, parches y " "donaciones:\n" #: src/help.c:303 #, no-c-format msgid "magnus.hjorth@home.se\n" msgstr "magnus.hjorth@home.se\n" #: src/help.c:305 #, no-c-format msgid "Project page with bug tracker, mailing list membership:\n" msgstr "Página del proyecto, listas de correo:\n" #: src/help.c:306 #, no-c-format msgid "http://gna.org/projects/mhwaveedit\n" msgstr "http://gna.org/projects/mhwaveedit\n" #: src/help.c:308 #, no-c-format msgid "Mailing list (you must be a subscriber before you can post messages):\n" msgstr "Lista de correo (debe suscribirse antes de enviar mensajes)\n" #: src/help.c:309 #, no-c-format msgid "mhwaveedit-discuss@gna.org\n" msgstr "mhwaveedit-discuss@gna.org\n" #: src/inifile.c:84 src/inifile.c:91 #, c-format msgid "%s: Expected '=': %s\n" msgstr "%s: Esperado '=': %s\n" #: src/inifile.c:97 #, c-format msgid "%s: Expected value: %s\n" msgstr "%s: Valor esperado: %s\n" #: src/int_box.c:202 #, c-format msgid "Value for %s must be a number between %ld and %ld" msgstr "El valor de %s debe estar entre %ld y %ld" #: src/ladspacore.c:94 #, c-format msgid "Effect %s contains invalid port %s" msgstr "Efecto %s contiene puerto inválido %s" #: src/ladspacore.c:140 #, c-format msgid "Ladspa: Error scanning %s" msgstr "Ladspa: Error escaneando %s" #: src/ladspacore.c:409 #, c-format msgid "Applying effect '%s'" msgstr "Aplicando efecto '%s'" #: src/ladspadialog.c:87 #, c-format msgid "Value for '%s' must not be below %f" msgstr "El valor de '%s' no debe ser inferior a %f" #: src/ladspadialog.c:94 #, c-format msgid "Value for '%s' must not be above %f" msgstr "El valor de '%s' no debe ser superior a %f" #: src/ladspadialog.c:127 #, c-format msgid "" "You have mapped more than one output port to channel '%s'. You can only map " "one output port to each channel." msgstr "" "Ha mapeado más de un puerto de salida al canal '%s'. Solo puede mapear un " "puerto de salida para cada canal." #: src/ladspadialog.c:191 #, c-format msgid "Author: %s" msgstr "Autor: %s" #: src/ladspadialog.c:196 #, c-format msgid "Copyright: %s" msgstr "Copyright: %s" #: src/ladspadialog.c:203 msgid " Input controls " msgstr " Controles de entrada " #: src/ladspadialog.c:292 msgid " Output controls " msgstr " Controles de salida" #: src/ladspadialog.c:311 src/recorddialog.c:311 src/recorddialog.c:739 msgid "None" msgstr "Ninguno" #: src/ladspadialog.c:319 msgid " Input audio " msgstr "Audio de entrada" #: src/ladspadialog.c:319 msgid " Output audio " msgstr " Audio de salida" #: src/ladspadialog.c:350 msgid "Keep data in unmapped output channels" msgstr "Mantener datos en canales de salida no mapeados" #: src/main.c:166 #, c-format msgid "Syntax: %s [files]\n" msgstr "Sintaxis: %s [archivos]\n" #: src/main.c:169 msgid "Testing conversion functions:" msgstr "Probando funciones de conversión:" #: src/main.c:171 msgid "Testing conversion functions finished." msgstr "Finalizada las pruebas de funciones de conversión." #: src/main.c:190 msgid "Expected driver name after --driver option" msgstr "Se esperaba nombre de dispositivo después de la opción --driver" #: src/main.c:196 #, c-format msgid "Unknown option '%s'" msgstr "Opción desconocida '%s'" #: src/main.c:340 msgid "" "Could not find home directory. Using current directory as home directory." msgstr "" "No se pudo encontrar directorio home. Usando directorio actual como " "directorio home." #: src/main.c:368 msgid "Black" msgstr "Negro" #: src/main.c:369 msgid "White" msgstr "Blanco" #: src/main.c:370 msgid "Background" msgstr "Fondo" #: src/main.c:371 msgid "L Waveform" msgstr "Onda izquierda" #: src/main.c:372 msgid "R Waveform" msgstr "Onda derecha" #: src/main.c:373 msgid "Cursor" msgstr "Cursor" #: src/main.c:374 msgid "Marks" msgstr "Marcas" #: src/main.c:375 msgid "Selection" msgstr "Selección" #: src/main.c:376 msgid "Progress bar" msgstr "Barra de progreso" #: src/main.c:377 msgid "Zero-level" msgstr "Nivel de cero" #: src/main.c:378 msgid "Buffer position" msgstr "" #: src/main.c:501 #, c-format msgid "Error launching mixer: fork: %s" msgstr "Error lanzando mezclador: %s" #: src/main.c:552 src/main.c:571 msgid "Mono" msgstr "Mono" #: src/main.c:553 msgid "Left" msgstr "Izquierdo" #: src/main.c:554 msgid "Right" msgstr "Derecho" #: src/main.c:556 #, c-format msgid "Ch%d" msgstr "" #: src/main.c:572 msgid "Stereo" msgstr "Estéreo" #: src/main.c:574 #, c-format msgid "%d channels" msgstr "%d canales" #: src/main.c:1149 msgid "Ignoring extreme old window size/position values\n" msgstr "" #: src/mainwindow.c:217 #, c-format msgid "mhWaveEdit: %s (%s): %d Hz, %s" msgstr "mhWaveEdit: %s (%s) %d Hz, %s" #: src/mainwindow.c:300 msgid "Use default settings" msgstr "Usar predeterminados" #: src/mainwindow.c:304 msgid "Auto-detect from extension" msgstr "Autodetectar según extensión" #: src/mainwindow.c:319 msgid "File type: " msgstr "Tipo de archivo:" #: src/mainwindow.c:365 msgid "" "The file has not changed since last save. Press OK if you want to save it " "anyway?" msgstr "" "El archivo no se ha modificado. Pulse OK si desea guardarlo de todos modos." #: src/mainwindow.c:374 msgid "Save File" msgstr "Guardar archivo" #: src/mainwindow.c:399 #, c-format msgid "Save changes to %s?" msgstr "Guardar cambios en %s?" #: src/mainwindow.c:792 src/mainwindow.c:796 msgid "Load File" msgstr "Cargar archivo" #: src/mainwindow.c:821 msgid "Save selection as ..." msgstr "Guardar selección como..." #: src/mainwindow.c:1116 #, c-format msgid "Chunk %p has opencount=%d\n" msgstr "" #: src/mainwindow.c:1199 #, c-format msgid "" "\n" "Window '%s'\n" msgstr "" "\n" "Ventana '%s'\n" #: src/mainwindow.c:1200 msgid " Current chunk:" msgstr "" #: src/mainwindow.c:1202 msgid " History:" msgstr " Historial:" #: src/mainwindow.c:1257 msgid "There already is only one channel!" msgstr "Ya hay solo un canal!" #: src/mainwindow.c:1366 msgid "mhWaveEdit Help" msgstr "Ayuda de mhWaveEdit" #: src/mainwindow.c:1465 msgid "About mhWaveEdit" msgstr "Acerca de mhwaveedit" #: src/mainwindow.c:1477 #, fuzzy msgid "" "Created by Magnus Hjorth (magnus.hjorth@home.se)\n" "Copyright 2002-2018, Magnus Hjorth" msgstr "" "Creado por Magnus Hjorth (magnus.hjorth@home.se)\n" "Copyright 2002-2006, Magnus Hjorth" #: src/mainwindow.c:1484 #, c-format msgid "Current sound driver: %s" msgstr "Dispositivo de sonido activo: %s" #: src/mainwindow.c:1492 #, c-format msgid "Compiled %s %s" msgstr "Compilado %s %s" #: src/mainwindow.c:1498 msgid "Uses double-precision math" msgstr "Usa matemática de doble precisión" #: src/mainwindow.c:1505 msgid "" "Distributed under GNU General Public License.\n" "For information, see the file COPYING" msgstr "" "Distribuido bajo la Licencia Pública General GNU.\n" "Para información, vea el archivo COPYING" #: src/mainwindow.c:1669 msgid "Seconds of silence: " msgstr "Segundos de silencio:" #: src/mainwindow.c:1669 msgid "Insert Silence" msgstr "Insertar silencio" #: src/mainwindow.c:1718 msgid "Level: " msgstr "" #: src/mainwindow.c:1718 msgid "Normalize to..." msgstr "" #: src/mainwindow.c:1928 msgid "/_File" msgstr "/_Archivo" #: src/mainwindow.c:1929 msgid "/File/_Open..." msgstr "/Archivo/_Abrir..." #: src/mainwindow.c:1930 msgid "/File/_Save" msgstr "/Archivo/_Guardar" #: src/mainwindow.c:1931 msgid "/File/Save _as..." msgstr "/Archivo/Guardar c_omo..." #: src/mainwindow.c:1932 msgid "/File/Save selection as..." msgstr "/Archivo/Guardar selección como..." #: src/mainwindow.c:1933 msgid "/_Edit" msgstr "/_Editar" #: src/mainwindow.c:1934 msgid "/Edit/_Undo" msgstr "/Editar/_Deshacer" #: src/mainwindow.c:1935 msgid "/Edit/_Redo" msgstr "/Editar/_Rehacer" #: src/mainwindow.c:1936 msgid "/Edit/sep1" msgstr "/Editar/sep1" #: src/mainwindow.c:1937 msgid "/Edit/Cu_t" msgstr "/Editar/Cor_tar" #: src/mainwindow.c:1938 msgid "/Edit/_Copy" msgstr "/Editar/_Copiar" #: src/mainwindow.c:1939 msgid "/Edit/_Paste" msgstr "/Editar/_Pegar" #: src/mainwindow.c:1940 msgid "/Edit/Paste _over" msgstr "/Editar/Pegar encima" #: src/mainwindow.c:1941 msgid "/Edit/_Mix paste" msgstr "/Editar/Pegar mezclando" #: src/mainwindow.c:1942 msgid "/Edit/Insert _silence" msgstr "/Editar/Insertar _silencio" #: src/mainwindow.c:1943 msgid "/Edit/Paste to _new" msgstr "/Editar/Pegar como _nuevo" #: src/mainwindow.c:1944 msgid "/Edit/Cr_op" msgstr "/Editar/Rec_ortar" #: src/mainwindow.c:1945 msgid "/Edit/_Delete" msgstr "/Editar/_Eliminar" #: src/mainwindow.c:1946 msgid "/Edit/Silence selection" msgstr "/Editar/Seleccionar silencios" #: src/mainwindow.c:1947 msgid "/Edit/sep2" msgstr "/Editar/sep2" #: src/mainwindow.c:1948 msgid "/Edit/Select _all" msgstr "/Editar/Seleccion_ar todo" #: src/mainwindow.c:1949 #, fuzzy msgid "/Edit/Select none" msgstr "/Editar/Seleccion_ar todo" #: src/mainwindow.c:1950 msgid "/Edit/sep3" msgstr "/Editar/sep3" #: src/mainwindow.c:1951 msgid "/Edit/Clear clipboard" msgstr "/Editar/Vaciar portapapeles" #: src/mainwindow.c:1952 msgid "/Edit/sep4" msgstr "/Editar/sep4" #: src/mainwindow.c:1953 msgid "/Edit/Preferences" msgstr "/Editar/Preferencias" #: src/mainwindow.c:1954 msgid "/_View" msgstr "/_Ver" #: src/mainwindow.c:1955 msgid "/View/Zoom _in" msgstr "/Ver/Acercar" #: src/mainwindow.c:1956 msgid "/View/Zoom _out" msgstr "/Ver/Alejar" #: src/mainwindow.c:1957 msgid "/View/Zoom to _selection" msgstr "/Ver/Ajustar a la selección" #: src/mainwindow.c:1958 msgid "/View/sep1" msgstr "/Ver/sep1" #: src/mainwindow.c:1959 msgid "/View/Zoom _all" msgstr "/Ver/Todo" #: src/mainwindow.c:1960 msgid "/View/sep2" msgstr "/Ver/sep2" #: src/mainwindow.c:1961 msgid "/View/_Time scale" msgstr "/Ver/Escala de _Tiempo" #: src/mainwindow.c:1962 msgid "/View/_Horizontal zoom" msgstr "/Ver/Zoom _horizontal" #: src/mainwindow.c:1963 msgid "/View/_Vertical zoom" msgstr "/Ver/Zoom _vertical" #: src/mainwindow.c:1964 msgid "/View/Sp_eed slider" msgstr "/Ver/Deslizador de v_elocidad" #: src/mainwindow.c:1965 #, fuzzy msgid "/View/Slider labels" msgstr "/Ver/Deslizador de v_elocidad" #: src/mainwindow.c:1966 msgid "/View/Buffer position" msgstr "" #: src/mainwindow.c:1967 msgid "/_Cursor" msgstr "/_Cursor" #: src/mainwindow.c:1968 msgid "/Cursor/Set selection start" msgstr "/Cursor/Establecer inicio de selección" #: src/mainwindow.c:1970 msgid "/Cursor/Set selection end" msgstr "/Cursor/Establecer final de selección" #: src/mainwindow.c:1971 msgid "/Cursor/sep1" msgstr "/Cursor/sep1" #: src/mainwindow.c:1972 #, fuzzy msgid "/Cursor/Move to" msgstr "/Cursor/Mover al final" #: src/mainwindow.c:1973 #, fuzzy msgid "/Cursor/Move to/Beginning" msgstr "/Cursor/Mover al inicio" #: src/mainwindow.c:1975 #, fuzzy msgid "/Cursor/Move to/End" msgstr "/Cursor/Mover al final" #: src/mainwindow.c:1976 #, fuzzy msgid "/Cursor/Move to/Selection start" msgstr "/Cursor/Mover al inicio de la selección" #: src/mainwindow.c:1978 #, fuzzy msgid "/Cursor/Move to/Selection end" msgstr "/Cursor/Mover al final de la selección" #: src/mainwindow.c:1980 #, fuzzy msgid "/Cursor/Move" msgstr "/Cursor/Mover al final" #: src/mainwindow.c:1981 #, fuzzy msgid "/Cursor/Move/Left" msgstr "/Cursor/Mover al final" #: src/mainwindow.c:1982 #, fuzzy msgid "/Cursor/Move/Right" msgstr "/Cursor/Mover al final" #: src/mainwindow.c:1983 #, fuzzy msgid "/Cursor/Move/Left sample" msgstr "/Cursor/Mover al final" #: src/mainwindow.c:1984 #, fuzzy msgid "/Cursor/Move/Right sample" msgstr "/Cursor/Mover al final" #: src/mainwindow.c:1985 msgid "/Cursor/Find zero-crossing" msgstr "" #: src/mainwindow.c:1986 msgid "/Cursor/Find zero-crossing/Left (all channels)" msgstr "" #: src/mainwindow.c:1988 msgid "/Cursor/Find zero-crossing/Right (all channels)" msgstr "" #: src/mainwindow.c:1990 msgid "/Cursor/Find zero-crossing/Left (any channel)" msgstr "" #: src/mainwindow.c:1992 msgid "/Cursor/Find zero-crossing/Right (any channel)" msgstr "" #: src/mainwindow.c:1994 msgid "/Cursor/sep2" msgstr "/Cursor/sep2" #: src/mainwindow.c:1995 msgid "/Cursor/Position cursor..." msgstr "/Cursor/Posicionar cursor..." #: src/mainwindow.c:1997 msgid "/_Play" msgstr "/_Reproducir" #: src/mainwindow.c:1998 msgid "/Play/_Play from cursor" msgstr "/Reproduccion/Desde el _cursor" #: src/mainwindow.c:1999 msgid "/Play/Play _all" msgstr "/Reproduccion/_Todo" #: src/mainwindow.c:2000 msgid "/Play/Play se_lection" msgstr "/Reproduccion/Se_lección" #: src/mainwindow.c:2001 msgid "/Play/_Stop" msgstr "/Reproduccion/_Detener" #: src/mainwindow.c:2002 msgid "/Play/sep1" msgstr "/Reproducción/sep1" #: src/mainwindow.c:2003 msgid "/Play/_Record..." msgstr "/Reproduccion/_Grabar..." #: src/mainwindow.c:2004 msgid "/Effec_ts" msgstr "/Efec_tos" #: src/mainwindow.c:2005 msgid "/Effects/Fade _in" msgstr "/Efectos/Fade _in" #: src/mainwindow.c:2006 msgid "/Effects/Fade o_ut" msgstr "/Efectos/Fade _out" #: src/mainwindow.c:2007 msgid "/Effects/_Normalize" msgstr "/Efectos/_Normalizar" #: src/mainwindow.c:2008 #, fuzzy msgid "/Effects/Normali_ze to..." msgstr "/Efectos/_Normalizar" #: src/mainwindow.c:2009 msgid "/Effects/_Volume adjust (fade)..." msgstr "/Efectos/Ajustar _volumen..." #: src/mainwindow.c:2010 msgid "/Effects/sep1" msgstr "/Efectos/sep1" #: src/mainwindow.c:2011 msgid "/Effects/Convert sample_rate..." msgstr "/Efectos/Convertir _tasa de muestreo..." #: src/mainwindow.c:2012 msgid "/Effects/Convert sample _format..." msgstr "/Efectos/Convertir _formato de la muestra" #: src/mainwindow.c:2014 msgid "/Effects/B_yte swap" msgstr "/Efectos/Intercambiar b_ytes" #: src/mainwindow.c:2015 msgid "/Effects/sep2" msgstr "/Efectos/sep2" #: src/mainwindow.c:2016 #, fuzzy msgid "/Effects/_Mix to mono" msgstr "/Efectos/_Mezclar canales..." #: src/mainwindow.c:2017 #, fuzzy msgid "/Effects/Add channe_l" msgstr "/Efectos/_Mezclar canales..." #: src/mainwindow.c:2018 #, fuzzy msgid "/Effects/Ma_p channels..." msgstr "/Efectos/_Mezclar canales..." #: src/mainwindow.c:2019 msgid "/Effects/_Combine channels..." msgstr "/Efectos/_Combinar canales..." #: src/mainwindow.c:2020 #, fuzzy msgid "/Effects/Add channels from other file..." msgstr "/Efectos/_Mezclar canales..." #: src/mainwindow.c:2021 msgid "/Effects/sep3" msgstr "/Efectos/sep3" #: src/mainwindow.c:2022 msgid "/Effects/_Speed adjustment..." msgstr "/Efectos/Aju_star velocidad..." #: src/mainwindow.c:2023 msgid "/Effects/Pipe through program..." msgstr "/Efectos/Enviar al programa..." #: src/mainwindow.c:2024 msgid "/Effects/sep4" msgstr "/Efectos/sep4" #: src/mainwindow.c:2025 msgid "/Effects/Effects dialog..." msgstr "/Efectos/Diálogo de efectos..." #: src/mainwindow.c:2027 msgid "/Debug" msgstr "/Depurar" #: src/mainwindow.c:2029 msgid "/Debug/Dummy effect" msgstr "" #: src/mainwindow.c:2030 msgid "/Debug/Dummy effect FP" msgstr "" #: src/mainwindow.c:2031 msgid "/Debug/Check opencount" msgstr "" #: src/mainwindow.c:2032 msgid "/Debug/Dump chunk info" msgstr "" #: src/mainwindow.c:2034 msgid "/_Help" msgstr "/A_yuda" #: src/mainwindow.c:2035 msgid "/Help/_Documentation" msgstr "/Ayuda/_Documentación" #: src/mainwindow.c:2036 msgid "/Help/_About" msgstr "/Ayuda/_Acerca de" #: src/mainwindow.c:2040 msgid "/File/sep1" msgstr "/Archivo/sep1" #: src/mainwindow.c:2041 msgid "/File/_Close" msgstr "/Archivo/_Cerrar" #: src/mainwindow.c:2042 msgid "/File/sep2" msgstr "/Archivo/sep2" #: src/mainwindow.c:2043 msgid "/File/_Exit" msgstr "/Archivo/_Salir" #: src/mainwindow.c:2215 msgid "Load a file from disk" msgstr "Cargar archivo" #: src/mainwindow.c:2222 msgid "Save the current file to disk" msgstr "Guardar archivo" #: src/mainwindow.c:2231 msgid "Undo the last change" msgstr "Deshacer último cambio" #: src/mainwindow.c:2239 msgid "Redo the last undo operation" msgstr "Rehacer último cambio" #: src/mainwindow.c:2249 msgid "Cut out the current selection" msgstr "Cortar la selección" #: src/mainwindow.c:2257 msgid "Copy the current selection" msgstr "Copiar la selección" #: src/mainwindow.c:2265 msgid "Paste at cursor position" msgstr "Insertar en la posición del cursor" #: src/mainwindow.c:2273 msgid "Paste, overwriting the data after the cursor position" msgstr "Pegar sobreescribiendo los datos después de la posición del cursor" #: src/mainwindow.c:2283 msgid "Delete the selection" msgstr "Borrar la selección" #: src/mainwindow.c:2292 msgid "Set selection start to cursor position" msgstr "Seleccionar desde la posición del cursor" #: src/mainwindow.c:2301 msgid "Set selection end to cursor position" msgstr "Seleccionar hasta la posición del cursor" #: src/mainwindow.c:2311 msgid "Play from cursor position" msgstr "Reproducir desde la posición del cursor" #: src/mainwindow.c:2320 msgid "Play selected area" msgstr "Reproducir área seleccionada" #: src/mainwindow.c:2329 msgid "Stop playing" msgstr "Detener reproducción" #: src/mainwindow.c:2339 msgid "Loop mode (play over and over)" msgstr "Modo repetición" #: src/mainwindow.c:2349 msgid "Keep view and playback together" msgstr "" #: src/mainwindow.c:2362 msgid "Auto return to playback start" msgstr "Auto retornar al inicio de la reproducción" #: src/mainwindow.c:2376 src/recorddialog.c:874 msgid "Record" msgstr "Grabar" #: src/mainwindow.c:2385 src/recorddialog.c:983 msgid "Launch mixer" msgstr "Lanzar mezclador" #: src/pipedialog.c:92 msgid "Command line: " msgstr "Comando:" #: src/pipedialog.c:99 msgid "Send wav header" msgstr "Enviar cabecera WAV" #: src/pipedialog.c:153 msgid "Process output" msgstr "Procesar salida" #: src/pipedialog.c:178 #, c-format msgid "" "Output from command '%s':\n" "\n" msgstr "" "Salida del comando '%s':\n" "\n" #: src/pipedialog.c:201 #, c-format msgid "Could not create pipe: %s" msgstr "No se pudo crear tubería: %s" #: src/pipedialog.c:216 #, c-format msgid "Error: fork: %s" msgstr "Error: %s" #: src/pipedialog.c:268 msgid "Should not reach this point!" msgstr "No se debería alcanzar ese punto!" #: src/pipedialog.c:482 msgid "Command failed without returning any data" msgstr "Falló el comando al no devolver datos" #: src/pipedialog.c:492 #, c-format msgid "Error: %s" msgstr "Error: %s" #: src/player.c:294 msgid "The sound format of this file is not supported for playing." msgstr "" "El formato de sonido de este archivo no está soportado para reproducción." #: src/rateconv.c:97 #, c-format msgid "Error initialising sample rate conversion: %s" msgstr "Error al inicializar conversión de tasa de muestreo: %s" #: src/rateconv.c:162 #, c-format msgid "Error converting samplerate: %s\n" msgstr "Error al convertir tasa de muestreo: %s\n" #: src/rateconv.c:201 #, c-format msgid "Error changing samplerate conversion ratio: %s\n" msgstr "Error al cambiar razón de conversión de la muestra: %s\n" #: src/rateconv.c:323 msgid "Unexpected EOF in connection to subprocess" msgstr "Fin de archivo inesperado en la conexión al subproceso" #: src/rateconv.c:327 #, c-format msgid "Error writing to subprocess: %s" msgstr "Error al escribir al subproceso: %s" #: src/rateconv.c:383 src/rateconv.c:405 #, c-format msgid "Error reading from sub process: %s" msgstr "Error al leer desde subproceso: %s" #: src/rateconv.c:413 msgid "SoX closed connection too early!" msgstr "SoX cerró la conexión demasiado rápido!" #: src/rateconv.c:599 msgid "(SoX) Simulated analog filtration" msgstr "(SoX) Filtrado analógico simulado" #: src/rateconv.c:605 msgid "(SoX) Polyphase interpolation" msgstr "(SoX) Interpolación polifase" #: src/rateconv.c:612 msgid "Sample repeat/skip (low quality)" msgstr "Repetir/saltar muestras (baja calidad)" #: src/rawdialog.c:42 msgid "header size" msgstr "" #: src/rawdialog.c:73 msgid "Unknown file format" msgstr "Formato de archivo desconocido" #: src/rawdialog.c:80 #, c-format msgid "" "The format of file '%s' could not be recognized.\n" "\n" "Please specify the sample format below." msgstr "" "No se puede reconocer el formato de archivo de '%s'\n" "\n" "Por favor especifique el formato." #: src/rawdialog.c:92 msgid "Header bytes: " msgstr "" #: src/recorddialog.c:207 src/recorddialog.c:671 src/recorddialog.c:918 msgid "(no limit)" msgstr "(sin límite)" #: src/recorddialog.c:314 msgid "Mild" msgstr "Moderado" #: src/recorddialog.c:316 msgid "Heavy" msgstr "Pesado" #: src/recorddialog.c:430 msgid "Update preset" msgstr "" #: src/recorddialog.c:435 msgid "Add preset" msgstr "" #: src/recorddialog.c:514 msgid "Custom format" msgstr "Formato personalizado" #: src/recorddialog.c:552 msgid "" "The sign and endian-ness can usually be left at their defaults, but should " "be changed if you're unable to record or get bad sound." msgstr "" "El signo y el orden de bytes usualmente pueden ser dejados en sus valores " "predeterminados, pero se deberían cambiar si no puede grabar o se obtiene " "mal sonido." #: src/recorddialog.c:566 msgid "Name :" msgstr "Nombre:" #: src/recorddialog.c:578 msgid "Presets:" msgstr "" #: src/recorddialog.c:593 #, fuzzy msgid "Set format" msgstr "Formatos de archivo" #: src/recorddialog.c:601 msgid "Add/Update preset" msgstr "" #: src/recorddialog.c:654 msgid "" "Invalid time value. Time must be specified in the form (HH')MM:SS(.mmmm)" msgstr "Tiempo no válido. Debe especificarse en la forma (HH')MM:SS(.mmmm)" #: src/recorddialog.c:698 src/recorddialog.c:948 msgid "Format not selected" msgstr "Formato no seleccionado" #: src/recorddialog.c:705 msgid "This format is not supported by the input driver!" msgstr "Este formato no está soportado por el dispositivo de entrada!" #: src/recorddialog.c:710 msgid "Ready for recording" msgstr "Listo para grabar" #: src/recorddialog.c:723 msgid "Peak: " msgstr "Pico:" #: src/recorddialog.c:724 msgid "Peak max: " msgstr "Máximo pico:" #: src/recorddialog.c:725 msgid "RMS: " msgstr "RMS: " #: src/recorddialog.c:726 msgid "Clipping: " msgstr "Recorte: " #: src/recorddialog.c:795 msgid "Resume recording" msgstr "Continuar grabación" #: src/recorddialog.c:795 src/recorddialog.c:815 msgid "Pause recording" msgstr "Pausar grabación" #: src/recorddialog.c:797 msgid "RecordStatus|Paused" msgstr "Pausado" #: src/recorddialog.c:798 src/recorddialog.c:823 msgid "RecordStatus|Recording" msgstr "Grabando" #: src/recorddialog.c:818 msgid "Finish" msgstr "Finalizar" #: src/recorddialog.c:826 msgid "Overruns: " msgstr "" #: src/recorddialog.c:829 msgid "Bytes written: " msgstr "Bytes escritos:" #: src/recorddialog.c:830 msgid "Auto stop in: " msgstr "Auto detener en: " #: src/recorddialog.c:894 msgid "Recording settings" msgstr " Preferencias de grabación" #: src/recorddialog.c:901 msgid "Sample format: " msgstr "Formato de la muestra:" #: src/recorddialog.c:916 msgid "Time limit: " msgstr "Limite de tiempo:" #: src/recorddialog.c:924 msgid "Disable" msgstr "Deshabilitar" #: src/recorddialog.c:930 msgid "Set" msgstr "Establecer" #: src/recorddialog.c:942 msgid "Input levels" msgstr " Niveles de entrada" #: src/recorddialog.c:947 msgid "Recording status: " msgstr "Estado de la grabación:" #: src/recorddialog.c:952 msgid "Time recorded: " msgstr "Tiempo grabado:" #: src/recorddialog.c:953 msgid "N/A" msgstr "N/D" #: src/recorddialog.c:966 msgid "Start recording" msgstr "Comenzar grabación" #: src/recorddialog.c:977 msgid "Reset max peaks" msgstr "Restablecer picos máximos" #: src/sampleratedialog.c:87 msgid "" "(This changes the sample rate of \n" "the entire file, not just the selection)" msgstr "" "(Esto cambia la tasa de bits de todo \n" "el archivo, no solo de la selección)" #: src/sampleratedialog.c:92 msgid "New samplerate: " msgstr "Nueva tasa de muestreo:" #: src/sampleratedialog.c:99 msgid "Method: " msgstr "Método:" #: src/samplesizedialog.c:38 msgid "File already has the selected sample format" msgstr "" #: src/samplesizedialog.c:87 msgid "" "(This changes the sample type of the entire file, not just the selection)" msgstr "" "(Esto cambia el tipo de muestreo de todo el archivo, no solo de la selección)" #: src/samplesizedialog.c:99 msgid "Don't actually change the data (for repairing bad files etc)" msgstr "No cambiar datos (para reparar archivos corruptos, etc)" #: src/sound-alsalib.c:73 msgid "ALSA Preferences" msgstr "Preferencias ALSA" #: src/sound-alsalib.c:81 msgid "Playback device: " msgstr "Dispositivo de reproducción:" #: src/sound-alsalib.c:85 msgid "Recording device: " msgstr "Dispositivo de grabación:" #: src/sound-alsalib.c:91 msgid "Event driven I/O" msgstr "" #: src/sound-alsalib.c:123 #, c-format msgid "Error opening ALSA device '%s' for recording: %s" msgstr "Error al abrir dispositivo ALSA '%s' para grabación: %s" #: src/sound-alsalib.c:125 #, c-format msgid "Error opening ALSA device '%s' for playback: %s" msgstr "Error al abrir dispositivo ALSA '%s' para reproducción: %s" #: src/sound-alsalib.c:273 msgid "snd_pcm_hw_params_set_access failed" msgstr "Falló snd_pcm_hw_params_set_access" #: src/sound-alsalib.c:278 msgid "snd_pcm_hw_params_set_format failed" msgstr "Falló snd_pcm_hw_params_set_format" #: src/sound-alsalib.c:283 msgid "snd_pcm_hw_params_set_channels failed" msgstr "Falló snd_pcm_hw_params_set_channels" #: src/sound-alsalib.c:288 msgid "snd_pcm_hw_params_set_rate failed" msgstr "Falló snd_pcm_hw_params_set_rate" #: src/sound-alsalib.c:293 #, fuzzy msgid "snd_pcm_hw_params_set_buffer_size_last failed" msgstr "Falló snd_pcm_hw_params_set_format" #: src/sound-alsalib.c:436 src/sound-alsalib.c:492 msgid "" msgstr "" #: src/sound-alsalib.c:536 msgid "" msgstr "" #: src/sound.c:167 msgid "SDL (output only)" msgstr "SDL (sólo salida)" #: src/sound.c:209 msgid "Dummy (no sound)" msgstr "Dummy (sin sonido)" #: src/sound.c:334 #, c-format msgid "" "Invalid driver name: %s\n" "Using '%s' driver instead" msgstr "" "Nombre de dispositivo no válido: %s\n" "En su lugar se usa '%s'" #: src/sound-esound.c:59 #, c-format msgid "Couldn't connect to ESD daemon: %s" msgstr "No se puede conectar con demonio ESD: %s" #: src/sound-esound.c:114 msgid "EsounD: Unable to open playback stream" msgstr "EsounD: Imposible abrir flujo de reproducción" #: src/sound-esound.c:130 msgid "EsounD: Unable to open recording stream" msgstr "EsounD: Imposible abrir flujo de grabación" #: src/sound-esound.c:145 src/sound-esound.c:217 msgid "EsounD driver: select" msgstr "Dispositivo EsounD: selección" #: src/sound-esound.c:157 msgid "EsounD driver: write" msgstr "Dispositivo EsounD: escritura" #: src/sound-esound.c:221 msgid "Esound connection closed by server" msgstr "Conexión ESound cerrada por el servidor" #: src/sound-esound.c:227 msgid "EsounD driver: read" msgstr "Dispositivo EsounD: lectura" #: src/sound-esound.c:241 msgid "jump delay" msgstr "retardo de salto" #: src/sound-esound.c:255 msgid "ESD preferences" msgstr "Preferencias ESD" #: src/sound-esound.c:263 msgid "" "If the cursor starts running too early when jumping, this delay should be " "increased." msgstr "" "Si el cursor comienza a moverse muy pronto cuando salta, este retardo " "debería ser incrementado." #: src/sound-esound.c:269 msgid "Jump delay:" msgstr "Retardo de salto:" #: src/sound-esound.c:278 msgid "" "Selecting the ESD host to connect to is done through the ESPEAKER " "environment variable." msgstr "" "La selección para conectarse al host ESD se realizó a través de la variable " "de entorno ESPEAKER." #: src/sound-jack.c:117 msgid "Invalid number of input ports." msgstr "Número de puertos de entrada inválido." #: src/sound-jack.c:121 msgid "Invalid number of output ports." msgstr "Número de puertos de salida inválido." #: src/sound-jack.c:130 msgid "The client name change won't take effect until you restart the program." msgstr "" "El cambio del nombre del cliente no tendrá efecto hasta que reinicie el " "programa." #: src/sound-jack.c:187 msgid " Input ports " msgstr " Puertos de entrada" #: src/sound-jack.c:188 msgid " Output ports " msgstr " Puertos de salida" #: src/sound-jack.c:197 msgid "Jack Preferences" msgstr "Preferencias JACK" #: src/sound-jack.c:206 msgid "Client name: " msgstr "Nombre del cliente:" #: src/sound-jack.c:223 msgid "Number of ports (0-8): " msgstr "Número de puertos (0-8):" #: src/sound-jack.c:231 #, c-format msgid "Port #%d" msgstr "Puerto #%d" #: src/sound-jack.c:244 msgid "Automatically connect input ports on startup" msgstr "Automáticamente conectar puertos de entrada al iniciar" #: src/sound-jack.c:250 msgid "Automatically connect output ports on startup" msgstr "Automáticamente conectar puertos de salida al iniciar" #: src/sound-jack.c:402 msgid "Over/underrun in JACK driver" msgstr "" #: src/sound-jack.c:417 msgid "jack_get_ports returned NULL" msgstr "jack_get_ports devolvió NULL" #: src/sound-jack.c:433 #, c-format msgid "Connection from %s to %s failed: %s" msgstr "Conexión desde %s a %s falló: %s" #: src/sound-jack.c:480 msgid "Could not connect to the JACK server." msgstr "No se pudo conectar al servidor JACK." #: src/sound-jack.c:494 msgid "Activation failed!" msgstr "Falló la activación!" #: src/sound-jack.c:825 #, c-format msgid "" "With JACK, the only supported recording format is Floating-point, single " "precision, %d Hz" msgstr "" "Con JACK el único formato de grabación soportado es Punto flotante, " "precisión simple, %d Hz" #: src/sound-oss.c:96 #, c-format msgid "Could not open '%s': %s" msgstr "No se puede abrir '%s': %s" #: src/sound-oss.c:109 #, c-format msgid "Error in sound driver: ioctl failed: %s" msgstr "Error en driver de sonido: Falló ioctl: %s" #: src/sound-oss.c:216 #, c-format msgid "Error in sound driver: write failed: %s" msgstr "Error en driver de sonido: Falló escritura: %s" #: src/sound-oss.c:229 #, c-format msgid "Error in sound driver: read failed: %s" msgstr "Error en driver de sonido: Falló lectura: %s" #: src/sound-oss.c:253 src/sound-oss.c:385 #, c-format msgid "Error in sound driver: select failed: %s" msgstr "Error en driver de sonido: Falló selección: %s" #: src/sound-oss.c:440 msgid "OSS preferences" msgstr "Preferencias OSS" #: src/sound-oss.c:450 #, fuzzy msgid "Playback device file:" msgstr "Dispositivo de reproducción:" #: src/sound-oss.c:459 #, fuzzy msgid "Recording device file:" msgstr "Dispositivo de grabación:" #: src/sound-oss.c:465 msgid "Avoid select calls (try this if recording locks up)" msgstr "Evitar llamadas de selección (Intente esto si la grabación se traba)" #: src/sound-portaudio.c:61 msgid "sound-portaudio: No output devices available!" msgstr "sound-portaudio: No hay dispositivos de salida disponibles!" #: src/sound-portaudio.c:63 msgid "sound-portaudio: No input devices available!" msgstr "sound-portaudio: No hay dispositivos de entrada disponibles!" #: src/sound-portaudio.c:191 src/sound-portaudio.c:278 #, c-format msgid "Pa_OpenStream failed: %s\n" msgstr "" #: src/sound-portaudio.c:252 msgid "Buffer overrun!" msgstr "" #: src/sound-sdl.c:38 #, c-format msgid "Could not initialize SDL: %s" msgstr "No se puede inicializar SDL: %s" #: src/sound-sdl.c:89 #, c-format msgid "SDL: Couldn't open audio: %s" msgstr "SDL: No se pudo abrir audio: %s" #: src/sound-sun.c:72 #, c-format msgid "SunAudio: Couldn't open %s" msgstr "SunAudio: No se pudo abrir %s" #: src/sound-sun.c:159 msgid "SunAudio: Error writing to sound device" msgstr "SunAudio: Error al escribir en dispositivo de sonido" #: src/sound-sun.c:241 msgid "SunAudio: Error reading from sound device" msgstr "SunAudio: Error al leer del dispositivo de sonido" #: src/soxdialog.c:54 #, fuzzy msgid "Echo" msgstr "[S] Eco" #: src/soxdialog.c:55 #, fuzzy msgid "Echo sequence" msgstr "[S] Secuencia de ecos" #: src/soxdialog.c:56 #, fuzzy msgid "Reverb" msgstr "[S] Reverberación" #: src/soxdialog.c:57 #, fuzzy msgid "Chorus" msgstr "[S] Coro" #: src/soxdialog.c:58 msgid "Flanger" msgstr "" #: src/soxdialog.c:59 msgid "Phaser" msgstr "" #: src/soxdialog.c:60 #, fuzzy msgid "Compress/Expand" msgstr "[S] Comprimir/Expandir" #: src/soxdialog.c:61 #, fuzzy msgid "Pitch adjust" msgstr "[S] Ajuste fino" #: src/soxdialog.c:62 #, fuzzy msgid "Time stretch" msgstr "[S] Estirar tiempo" #: src/soxdialog.c:63 #, fuzzy msgid "DC Shift" msgstr "[S] Desplazamiento DC" #: src/soxdialog.c:64 #, fuzzy msgid "Masking noise" msgstr "[S] Enmascarar ruido" #: src/soxdialog.c:65 #, fuzzy msgid "Reverse" msgstr "[S] Invertir" #: src/soxdialog.c:66 msgid "Earwax" msgstr "" #: src/soxdialog.c:67 #, fuzzy msgid "Vibro" msgstr "[S] Vibración" #: src/soxdialog.c:68 #, fuzzy msgid "Lowpass filter (single-pole)" msgstr "[S] Filtro paso bajo (polo simple)" #: src/soxdialog.c:69 #, fuzzy msgid "Highpass filter (single-pole)" msgstr "[S] Filtro paso alto (polo simple)" #: src/soxdialog.c:70 #, fuzzy msgid "Bandpass filter" msgstr "[S] Filtro de paso de banda" #: src/soxdialog.c:71 #, fuzzy msgid "Butterworth lowpass filter" msgstr "[S] Filtro de paso bajo Butterworth" #: src/soxdialog.c:72 #, fuzzy msgid "Butterworth highpass filter" msgstr "[S] Filtro de paso alto Butterworth" #: src/soxdialog.c:73 #, fuzzy msgid "Butterworth bandpass filter" msgstr "[S] Filtro de paso de banda Butterworth" #: src/soxdialog.c:74 #, fuzzy msgid "Butterworth bandreject filter" msgstr "[S] Filtro de devolución de banda Butterworth" #: src/soxdialog.c:75 msgid "Sinc-windowed filter" msgstr "" #: src/soxdialog.c:312 msgid "Frequency: " msgstr "Frecuencia:" #: src/soxdialog.c:317 src/soxdialog.c:324 src/soxdialog.c:483 #: src/soxdialog.c:485 msgid "Hz" msgstr "Hz" #: src/soxdialog.c:327 msgid "Noise mode" msgstr "Modo ruido" #: src/soxdialog.c:387 msgid "Reverb time: " msgstr "Tiempo de reverberación: " #: src/soxdialog.c:392 msgid "ms" msgstr "ms" #: src/soxdialog.c:397 msgid "Delay (ms) " msgstr "Retardo (ms)" #: src/soxdialog.c:400 msgid "Decay " msgstr "" #: src/soxdialog.c:404 msgid "Speed (Hz) " msgstr "Velocidad (Hz)" #: src/soxdialog.c:408 msgid "Depth (ms) " msgstr "Profundidad (ms)" #: src/soxdialog.c:412 msgid "Modulation " msgstr "Modulación" #: src/soxdialog.c:415 msgid "Modulation|Sinusoidal" msgstr "Sinusoidal" #: src/soxdialog.c:416 msgid "Modulation|Triangular" msgstr "Triangular" #: src/soxdialog.c:429 msgid "(Lines with delay=0 will be ignored.)" msgstr "(Lineas con retardo=0 serán ignoradas)" #: src/soxdialog.c:448 src/soxdialog.c:450 src/soxdialog.c:454 #: src/soxdialog.c:456 src/soxdialog.c:458 msgid "Input gain: " msgstr "Ganancia de entrada: " #: src/soxdialog.c:452 msgid "Output gain: " msgstr "Ganancia de salida: " #: src/soxdialog.c:464 msgid "Width: " msgstr "Ancho:" #: src/soxdialog.c:470 src/soxdialog.c:472 msgid "Bandwidth: " msgstr "Ancho de banda:" #: src/soxdialog.c:481 msgid "Filter type: " msgstr "Tipo de filtro:" #: src/soxdialog.c:482 msgid "Low 6dB corner: " msgstr "Esquina de 6 dB Baja: " #: src/soxdialog.c:484 msgid "High 6db corner: " msgstr "Esquina de 6 dB Alta: " #: src/soxdialog.c:486 msgid "Window length: " msgstr "Largo de ventana:" #: src/soxdialog.c:488 msgid "Beta" msgstr "Beta" #: src/soxdialog.c:491 msgid "Lowpass" msgstr "Paso bajo" #: src/soxdialog.c:492 msgid "Highpass" msgstr "Paso alto" #: src/soxdialog.c:493 msgid "Bandpass" msgstr "Paso de banda" #: src/soxdialog.c:526 msgid "Attack integration time: " msgstr "" #: src/soxdialog.c:530 src/soxdialog.c:535 src/soxdialog.c:565 msgid " seconds" msgstr " segundos" #: src/soxdialog.c:531 msgid "Decay integration time: " msgstr "" #: src/soxdialog.c:538 msgid "Input level (dB)" msgstr "Nivel de entrada (dB)" #: src/soxdialog.c:539 msgid "Output level (dB)" msgstr "Nivel de salida (dB)" #: src/soxdialog.c:552 msgid "Post-processing gain: " msgstr "Ganancia post-procesado: " #: src/soxdialog.c:556 msgid " dB" msgstr " dB" #: src/soxdialog.c:557 msgid "Initial volume: " msgstr "Volumen inicial:" #: src/soxdialog.c:561 msgid "Delay time: " msgstr "Tiempo de retardo:" #: src/soxdialog.c:570 msgid "Shift amount: " msgstr "Cantidad de desplazamiento: " #: src/soxdialog.c:574 msgid "Peak limiter" msgstr "Pico límite" #: src/soxdialog.c:578 msgid "Limiter gain: " msgstr "Ganancia límite: " #: src/soxdialog.c:591 msgid "Amount: " msgstr "Cantidad:" #: src/soxdialog.c:592 msgid " cents" msgstr " centécimos" #: src/soxdialog.c:593 msgid "Window width: " msgstr "Ancho de ventana:" #: src/soxdialog.c:594 src/soxdialog.c:625 msgid " ms" msgstr " ms" #: src/soxdialog.c:595 msgid "Interpolation: " msgstr "Interpolación:" #: src/soxdialog.c:596 msgid "Fade: " msgstr "Desvanecimiento:" #: src/soxdialog.c:605 msgid "Interpolation|Cubic" msgstr "Cúbica" #: src/soxdialog.c:606 msgid "Interpolation|Linear" msgstr "Lineal" #: src/soxdialog.c:612 msgid "Fade|Cos" msgstr "Cos" #: src/soxdialog.c:613 msgid "Fade|Hamming" msgstr "Hamming" #: src/soxdialog.c:614 msgid "Fade|Linear" msgstr "Lineal" #: src/soxdialog.c:615 msgid "Fade|Trapezoid" msgstr "Trapezoidal" #: src/soxdialog.c:623 msgid "Factor: " msgstr "Factor: " #: src/soxdialog.c:624 msgid "Window size: " msgstr "Tamaño de ventana:" #: src/soxdialog.c:636 msgid "Speed: " msgstr "Velocidad:" #: src/soxdialog.c:637 msgid " Hz" msgstr " Hz" #: src/soxdialog.c:638 msgid "Depth: " msgstr "Profundidad:" #: src/soxdialog.c:649 msgid "This effect has no options." msgstr "Este efecto no tiene opciones." #: src/soxdialog.c:723 msgid "Error creating pipe" msgstr "Error al crear tubería" #: src/soxdialog.c:730 msgid "Couldn't fork" msgstr "No se pudo lanzar" #: src/soxdialog.c:745 #, c-format msgid "Error running 'sox -h': %s\n" msgstr "Error al ejecutar 'sox -h': %s\n" #: src/soxdialog.c:747 msgid "Should not reach this point" msgstr "No se debería alcanzar ese punto" #: src/soxdialog.c:762 msgid "Error reading sox output" msgstr "Error al leer salida de SoX" #: src/soxdialog.c:794 msgid "Unable to detect supported SoX effects" msgstr "Imposible detectar efectos SoX soportados" #: src/soxdialog.c:832 msgid "Sox support couldn't be initialized" msgstr "Soporte Sox no se pudo inicializar" #: src/speeddialog.c:58 msgid "Speed:" msgstr "Velocidad:" #: src/statusbar.c:72 msgid "(no file loaded)" msgstr "(no hay archivo cargado)" #: src/statusbar.c:235 msgid "Cursor: running" msgstr "Cursor: corriendo" #: src/statusbar.c:237 msgid "Cursor: " msgstr "Cursor:" #: src/statusbar.c:260 #, c-format msgid "View: [ %s - %s ]" msgstr "Vista: [ %s - %s ]" #: src/statusbar.c:281 #, c-format msgid "Selection: %s+%s" msgstr "Selección: %s+%s" #: src/statusbar.c:304 msgid "Processing data" msgstr "Procesando datos" #: src/statusbar.c:306 #, c-format msgid "%s... (Press ESC to cancel)" msgstr "%s... (Presione ESC para cancelar)" #: src/um.c:51 msgid "mhWaveEdit: " msgstr "mhWaveEdit: " #: src/um.c:64 #, c-format msgid "mhWaveEdit: %s: %s\n" msgstr "mhWaveEdit: %s: %s\n" #: src/um.c:97 msgid "Message" msgstr "Mensaje" #: src/um.c:117 msgid "Yes" msgstr "Sí" #: src/um.c:125 msgid "No" msgstr "No" #: src/um.c:318 msgid "Input" msgstr "Entrada" #: src/um.c:407 msgid "Choice" msgstr "Elección" #: src/volumedialog.c:71 msgid "Calculating peak volume..." msgstr "Calculando volumen pico:" #: src/volumedialog.c:87 msgid "Start:" msgstr "Inicio:" #: src/volumedialog.c:90 msgid "End:" msgstr "Fin:" #: src/volumedialog.c:109 msgid "Find top volume" msgstr "Buscar volumen máximo" #: src/document.c:230 #, c-format msgid "untitled #%d" msgstr "Sin título #%d" #: src/document.c:282 msgid "" "Loading and then saving files with 'lossy' formats (like mp3 and ogg) leads " "to a quality loss, also for the unmodified parts of the file." msgstr "" "Cargar y luego guardar archivos en formatos con pérdida (como mp3 y ogg) " "conduce a una pérdida de calidad, incluso a las partes no modificadas." #: src/session.c:87 msgid "Error opening session directory" msgstr "" #: src/session.c:104 src/session.c:164 #, fuzzy, c-format msgid "%s: Wrong file type" msgstr "Tipo de archivo desconocido" #: src/session.c:238 #, fuzzy msgid "Could not create session file" msgstr "No se pudo crear tubería: %s" #: src/session.c:280 msgid "" "The files that belonged to the crashed session have been recovered. Any " "files that are not saved will be removed permanently.\n" "\n" "(This notice is only shown once)" msgstr "" #: src/session.c:380 #, fuzzy msgid "Suspended" msgstr "Velocidad:" #: src/session.c:380 src/session.c:381 msgid "Crash" msgstr "" #: src/session.c:381 msgid "Left files" msgstr "" #: src/session.c:391 #, c-format msgid "%s on %s(%d files, %ld bytes)" msgstr "" #: src/session.c:409 msgid "Sessions" msgstr "" #: src/session.c:419 msgid "" "Earlier sessions were found. Choose one to resume or start a new session." msgstr "" #: src/session.c:439 #, fuzzy msgid "Resume selected" msgstr "Continuar grabación" #: src/session.c:449 #, fuzzy msgid "Delete selected" msgstr "Borrar la selección" #: src/session.c:456 msgid "Start new session" msgstr "" #: src/session.c:462 #, fuzzy msgid "Exit" msgstr "/_Editar" #: src/mapchannelsdialog.c:116 #, fuzzy msgid "This effect applies to the whole file, not just the selection" msgstr "" "(Esto cambia el tipo de muestreo de todo el archivo, no solo de la selección)" #: src/mapchannelsdialog.c:123 #, fuzzy msgid "Output channels: " msgstr "Ganancia de salida: " #: src/mapchannelsdialog.c:130 msgid "Map" msgstr "" #: src/mapchannelsdialog.c:137 msgid "Source" msgstr "" #: src/mapchannelsdialog.c:139 msgid "Destination" msgstr "" #: src/sandwichdialog.c:107 #, fuzzy msgid "Align beginning of files" msgstr "después del inicio del archivo" #: src/sandwichdialog.c:110 #, fuzzy msgid "Align end of files" msgstr "después del final del archivo" #: src/sandwichdialog.c:113 #, fuzzy msgid "Align at marker: " msgstr "Nombre del cliente:" #: src/sandwichdialog.c:126 #, fuzzy msgid "Add channels from: " msgstr "Agregando canales" #: src/sandwichdialog.c:130 msgid "Alignment" msgstr "" #~ msgid "double" #~ msgstr "doble" #~ msgid "float" #~ msgstr "flotante" #~ msgid "mhWaveEdit: %s (%s): %d Hz, %d bit" #~ msgstr "mhWaveEdit: %s (%s) %d Hz, %d bits" #~ msgid "Follow cursor while playing" #~ msgstr "Seguir cursor mientras reproduce" #~ msgid "Removing channel" #~ msgstr "Removiendo canal" #, fuzzy #~ msgid "Mapping channels" #~ msgstr "Agregando canales" #~ msgid "Removing channels" #~ msgstr "Quitando canales" #~ msgid "Choose a sample format" #~ msgstr "Escoja un formato de muestreo" #~ msgid "%d-bit" #~ msgstr "%d-bit" #~ msgid "%s (%s %s %d Hz)" #~ msgstr "%s (%s %s %d Hz)" #~ msgid "%s %s %d Hz" #~ msgstr "%s %s %d Hz" #~ msgid "Other format..." #~ msgstr "Otro formato..." #~ msgid "" #~ "To add this format to the presets, enter a name below. Otherwise, leave " #~ "it blank." #~ msgstr "" #~ "Ingrese un nombre debajo para agregar este formato a los predefinidos.De " #~ "otra manera, déjelo en blanco." #~ msgid "Sound device file:" #~ msgstr "Archivo de dispositivo de sonido:" #~ msgid "" #~ "Environment variable LADSPA_PATH not set.\n" #~ "LADSPA support is disabled." #~ msgstr "" #~ "No se estableció variable LADSPA_PATH.\n" #~ "Soporte LADSPA está deshabilitado." #~ msgid "8-bit wav-files must be in unsigned format!" #~ msgstr "Archivos WAV de 8-bits deben estar en formato sin signo!" #~ msgid "16/24/32-bit wav-files must be in signed format!" #~ msgstr "Archivos WAV de 16/24/32 bits deben estar en formato con signo!" #~ msgid "wav files must be in little endian format!" #~ msgstr "Archivos WAV deben estar en formato little endian!" #~ msgid "/Debug/Mark as modified" #~ msgstr "/Depurar/Marcar como modificado" #~ msgid "[B] Convert samplerate" #~ msgstr "[B] Convertir tasa de bits" #~ msgid "[B] Speed" #~ msgstr "[B] Velocidad" #~ msgid "Channel %d" #~ msgstr "Canal %d" #~ msgid "/Effects/Sp_lit channel..." #~ msgstr "/Efectos/Dividir cana_l" #~ msgid "SoX only supports 8, 16 and 32-bit sample sizes" #~ msgstr "SoX solo soporta tamaños de muestras de 8, 16 y 32 bits" mhwaveedit-1.4.24/po/fr.gmo000066400000000000000000002446031334022513400154760ustar00rootroot00000000000000",-<2B.B C.C1Cp6CCmnDDE7FF_G5GQ.HH+IJA~K|K:=LxL LLL LLLL MM-M=M\MxMMM MMMMN NN (N 6NDNSNeNtNNNNN NNO OO%O)O-O 6OBO]O{OOOOO0O P /P%;PaP!PJPIP 6QBQ SQ^QVwQ/QQ#R9RQReRR.R-R/R.+S ZSgSwSSSSSST!T;TVTpT T TTTTTTU U (U3UIU[UoUUUU U UU U U V V V #V .V 9VCV(YVV"VVVVWW3W MWnWWWW!W W X X X.X@X [X hXtX X X X XX XXX XXYY6Y GY SY^YsYYY Y YYYYYZZ-ZFZ]ZoZ Z ZZZZZZZ*Z!Zi[,}[-[#[>[;\S\s\ \\\\\] ]%]7]G]P]^^3^ F^ P^[^^_ _!__ _` `:` T`$_`````,`- a9a3Ia }aaa aaa a aa aaab b!b*bFbdbbb c'c7cNcic pc{ccc c cc"cccc)d;dJdYd#iddd!dddde "e%0eVepeIe%eef1fIfdf~f"f fffffg%g;g&Rg,yg*g1g/h3hLh(ghh,h hh& i3iFi5Ziikijj%j5jEj Wjejzjjkkkk k k kkll 'l4l mIEnnn nn"nnnno9o$Iono so/oo oop'p&Bp(ip'p-pp/q08qiqqq"qqqr(r HrRrbrvrr&r'r"rs't8t*=thtttttt t tttuZuuu+u u uu uuuvUvqwywwwwDw$x 8xDx5Lxxx xxxx&xyy?"ybyazT]{{az|1}~~bs y !ƀ Հ߀1Ji@Hʁ %%ۂ02R ep   ̃ ڃĄF8 <I O]en Ӆ  ! 9DI^0n%݇ HDV\q  ܈5!W g t ؉$6>\eu ‹ ҋ8ߋ $ , 6AG fs Ìڌ!"5Rbs ȎB( 8 F g u ӏڏW GQbr{ $&֐'6^|%)  0QYocɒ-A3u#| ”ɔє  &)A'k "ԕ&yIAYJ[aUG]"QuY'5&˟L?; "Z!=| ۡ1 )6 FSg{s% &ʣ*%&<cw ɤ11L#~#ƥ  *=[EKS cqY?ڧ5Ĩ2|-l--[ KV)[ 8ɭѭح2ޭ66Q  Ȯ(̮#1Oau  ůۯYS9X6 IVu  ƳԳ#ܳ-%.#T!x,-Ǵ >AT~-'>>5r>?TF G:x ,%*R}&&!0Ri "8Jcy$# '.2 6 @"J"m$>^ m+y!WU? #b>Q1!&3?ZD>Dcv,/&)Ak)"47 ? M [!g &B_,!9K^q010P*1Qj!( *IZl ,=Wu  !4V(u$.HX h r } ?$5'wM+4/N(~%*'Ck%"  % -7G.c! /#$# H<i<HA FRew}  .MkGWi  209M0a+%%A%g%+$!uF8!3!Q!s%/#"!Fh~0::@R@ =%P7v-:-CUZI Q\n5 +,; h r !    *6UunR7LI^v&,<'Em#t'#4+ 1Q==+$18/j76H 0R=D7> W/x-- )% O[u/5,&dS,.:N it} $g> *HQ9S\m @<PV\ p {4k#`<a#@;,&.>T'f  F##:O^X59 K; $        $ 6 E T g   A a  t ~  U     ( 9  A M f {              - 8 > W Hh 2 p9Ji q- ,A8T'H U^u W\p y(   -"Hk%4 Z{% &WB.*#A!ef 4?Rhqy+.!#@2d*(05+R~%'U{M*    ; V _ h !z C 7 !!!*:!e!*W#"#H#P#e?$h$%%l&]J''Z(sw(#()z)yc**p+,,*-P-+.7."!/eD/I/#/0740l000 0 001q212)22M2H3-b3333 33#4.$4$S4+x4@444354N5!555555 6 %6/F6v7 |7777g7f8888A9F9:w<i=?=99> s??I? ?E?'@0@8@F=@ @C@P@#A'A70A hAsA|A>A7AA&BIVIoI~If=?NGhsa}O~1rS3X;C7dF 0t_cdViy6-mnMn )J2X;e))!zAS }+x{P@<8Co  Tqp9#!Vb R(+Yx'&JI>N^$Dq"]4n5{$wQeIsH5/Wfsp DQ?=t] IkvuR/%:=@:[<h"kybgZ M(Q7eO"#P am18!9#&u.~`j\Pb]_TElL;5^ i\^Wa|3jE2Xw| t+ 6TBB> g[.[Gj&ZroyLZ E*-Jpi~M 3 GW g`"_?0}DH8,2Bw4 6V4` Lzck*R 1FhN >uKd:(c0KA%Y9*AlmYovz@U,\CU/-S!'K$.%,{qxr7O' f|HU<lFv  Test results (1 time unit = %f usec/sample) Window '%s' By setting starting volume and ending volume to the same value you get a simple amplification of the sound. Note that volumes above 100% may cause sound distortion. Use the 'Find top volume' to find out the maximum amplification possible without distortion. (You can use this for normalizing samples.) The 'Don't actually change the data' option can be used if the program was wrong about the file's format. This "byte swaps" the selected part. It can be used to repair damaged files where the byte order is wrong. Note that if the sound looks alright but plays wrong, you should not use this option, instead you should use the "byte-swap output" option in the Preferences dialog. This amplifies the sound as much as possible without getting clipping distortion. The "Normalize to..." item lets you specify which level to normalize to. This converts the sample format of the entire file. This converts the samplerate of the entire file to one you specify. There are different methods for doing this, usually the one in the top has the best quality but can take longer than the other methode. This copies the first channel to a new channel in the sound, converting mono to stereo etc. This creates a linear fade in or fade out effect. This effect changes the speed of the selection. The tone will change as well. This effect is for advanced users wanting to pipe raw audio data through an external program. The output of the program is read back and replaces the processed part. This effect lets you create a new sound by a linear combination of the old channels. This means you can do channel mixing / swapping / balance / panning / amplification etc. by entering different values. For example, to swap the left and right channel, you select that the new Channel 1 should be 0% of the old Channel 1 and 100% of the old Channel 2, and the new Channel 2 should be 100% of the old Channel 1 and 0% of the old Channel 2 This effect lets you select a starting volume and a ending volume and amplifies the selection fading from the starting volume to the ending volume. This mixes all channels of the file together to a mono sound. With this effect, you can change the number of channels in the file. You can also rearrange and add (i.e. mix) channels. gdb /usr/local/bin/mhwaveedit core | tee backtrace.txt Current chunk: History: and: * Add channel * Byte swap * Combine channels... * Convert sample format... * Convert samplerate... * Fade in/out * Map channels... * Mix to mono * Normalize, Normalize to... * Pipe through program... * Speed adjustment... * Volume adjust/fade... Advanced settings Dithering Driver options External applications Fallback format Hz Input audio Input controls Input ports Main window Output audio Output controls Output ports Playback settings Rate conversions Sample conversion Temporary file directories Temporary file settings Time format Variable speed View Window contents cents dB ms seconds%d channels%s is not a valid wav file%s on %s(%d files, %ld bytes)%s... (Press ESC to cancel)%s: Expected '=': %s %s: Expected value: %s %s: Wrong file type'%s' is not a number!( Play first 3 seconds of selection (H')MM:SS.mmmm(H')MM:SS.t(Lines with delay=0 will be ignored.)(SoX) Polyphase interpolation(SoX) Simulated analog filtration(This changes the sample rate of the entire file, not just the selection)(This changes the sample type of the entire file, not just the selection)(expected) (no file loaded)(no limit)(number) Goto mark (use a negative number to place the cursor before instead of after the selected point)) Play last 3 seconds of selection +,= Zoom in , Play from cursor pos - Zoom out . Stop / Play selection /Cursor/Find zero-crossing/Cursor/Find zero-crossing/Left (all channels)/Cursor/Find zero-crossing/Left (any channel)/Cursor/Find zero-crossing/Right (all channels)/Cursor/Find zero-crossing/Right (any channel)/Cursor/Move/Cursor/Move to/Cursor/Move to/Beginning/Cursor/Move to/End/Cursor/Move to/Selection end/Cursor/Move to/Selection start/Cursor/Move/Left/Cursor/Move/Left sample/Cursor/Move/Right/Cursor/Move/Right sample/Cursor/Position cursor.../Cursor/Set selection end/Cursor/Set selection start/Cursor/sep1/Cursor/sep2/Debug/Debug/Check opencount/Debug/Dummy effect/Debug/Dummy effect FP/Debug/Dump chunk info/Edit/Clear clipboard/Edit/Cr_op/Edit/Cu_t/Edit/Insert _silence/Edit/Paste _over/Edit/Paste to _new/Edit/Preferences/Edit/Select _all/Edit/Select none/Edit/Silence selection/Edit/_Copy/Edit/_Delete/Edit/_Mix paste/Edit/_Paste/Edit/_Redo/Edit/_Undo/Edit/sep1/Edit/sep2/Edit/sep3/Edit/sep4/Effec_ts/Effects/Add channe_l/Effects/Add channels from other file.../Effects/B_yte swap/Effects/Convert sample _format.../Effects/Convert sample_rate.../Effects/Effects dialog.../Effects/Fade _in/Effects/Fade o_ut/Effects/Ma_p channels.../Effects/Normali_ze to.../Effects/Pipe through program.../Effects/_Combine channels.../Effects/_Mix to mono/Effects/_Normalize/Effects/_Speed adjustment.../Effects/_Volume adjust (fade).../Effects/sep1/Effects/sep2/Effects/sep3/Effects/sep4/File/Save _as.../File/Save selection as.../File/_Close/File/_Exit/File/_Open.../File/_Save/File/sep1/File/sep2/Help/_About/Help/_Documentation/Move Down/Move Up/Move to Bottom/Move to Top/Play/Play _all/Play/Play se_lection/Play/_Play from cursor/Play/_Record.../Play/_Stop/Play/sep1/Rebuild Effect List/Restore Order/Sort by Author/Sort by Location/Sort by Name/Sort by Type/View/Buffer position/View/Slider labels/View/Sp_eed slider/View/Zoom _all/View/Zoom _in/View/Zoom _out/View/Zoom to _selection/View/_Horizontal zoom/View/_Time scale/View/_Vertical zoom/View/sep1/View/sep2/_Cursor/_Edit/_File/_Help/_Play/_View1. Enable core dumps: ulimit -c unlimited 2. Run the program: mhwaveedit 3. Make the program crash. You should now get a file named core or core.1234 in the directory you're in. 4. Run gdb with the program and core file: 5. After gdb has loaded, use the command: bt 6. Quit gdb with the command: quit 7. Now you should have a back trace in the file backtrace.txt < Zoom all > Zoom to selection ALSA PreferencesAbout mhWaveEditActivation failed!Add channels from other fileAdd channels from: Add presetAdd/Update presetAdjusting speedAdvancedAfter you've filled in all the translations you want (you don't have to translate all the strings), mail in the po file to me (see contact info) and I'll add it to the next release. Align at marker: Align beginning of filesAlign end of filesAlignmentAlignment:All editing functions work non-destructively, that is, the file you're editing isn't actually changed until you save it (the effects also work this way). All supported effects can be found by choosing the 'Effects...' menu item. The effects are listed with names beginning with [B] for builtin effects, [L] for LADSPA effects, and [S] for SoX effects. Amount: AmplifyingAmplifying (by %3.1f%% / %+.1fdB)ApplyApply to: Applying effect '%s'Arrow keys Scroll left/right Attack integration time: Author: %sAuto dete_ct driver on each start-upAuto return to playback startAuto stop in: Auto-_reset speedAuto-detect from extensionAutomatically connect input ports on startupAutomatically connect output ports on startupAverage bitrateAvoid select calls (try this if recording locks up)BackgroundBandpassBandpass filterBandwidth: BetaBiasedBig endianBig-endianBlackBottom bytesBrowse directoryBuffer overrun!Buffer positionBug reportingBuilt-inButterworth bandpass filterButterworth bandreject filterButterworth highpass filterButterworth lowpass filterBy default, mhWaveEdit uses floating-point temporary files for storing processed results to avoid rounding until the file is saved. BypassBytes written: Calculating peak levelCalculating peak volume...CancelChannels: ChoiceChorusChunk %p has opencount=%d Client name: Clipping: CloseClose dialog after applying effectColorsCombine channelsCombining channelsCommand failed without returning any dataCommand line: Compiled %s %sCompress/ExpandConnection from %s to %s failed: %sConstant bitrateContactConversion test failed, between: Convert sample formatConvert samplerateConverting samplerateCopy the current selectionCopyright: %sCould not connect to the JACK server.Could not create pipe: %sCould not create session fileCould not find home directory. Using current directory as home directory.Could not get file position in %s: %sCould not initialize SDL: %sCould not open %s: %sCould not open '%s': %sCould not read from %s: %sCould not remove '%s': %sCould not seek in %s: %sCouldn't connect to ESD daemon: %sCouldn't forkCouldn't open %sCrashCtrl+(number) Set mark Ctrl+A Select all Ctrl+C Copy Ctrl+D Delete Ctrl+E Effects Ctrl+G Position cursor (Go to) Ctrl+H Position cursor at file start Ctrl+J Position cursor at file end Ctrl+K Position cursor at selection start Ctrl+L Position cursor at selection end Ctrl+O Open file Ctrl+P Preferences Ctrl+Q Selection start at cursor Ctrl+S Save file Ctrl+Tab Move cursor to center of view Ctrl+U Save selection as Ctrl+V Paste Ctrl+W Selection end at cursor Ctrl+X Cut Ctrl+Z Undo Ctrl+arrow Move cursor (and playback) half second Current sound driver: %sCurrently it is impossible to play and record at the same time, so the playback will stop when you record. CursorCursor: Cursor: runningCustom argumentCustom argument: Custom formatCustomize co_lors...Cut out the current selectionCut, copy and paste operations move the data around without modifying it, so these don't degrade the sound quality. Because of level differences, you may get a "step" at the start and end of the inserted part, which can cause a small clicking sound. DC ShiftDecay Decay integration time: DecodingDecompressDelay (ms) Delay time: Delete Delete Delete selectedDelete the selectionDepth (ms) Depth: DestinationDirect accessDisableDisk editing _threshold: Display t_imes as: Distributed under GNU General Public License. For information, see the file COPYINGDon't actually change the data (for repairing bad files etc)Dummy (no sound)ESD preferencesEach mhwaveedit process creates a session file in the .mhwaveedit directory called mhwaveedit-session---, where is the session ID number and is a character code showing the state of the session ('r' for running sessions). Earlier sessions were found. Choose one to resume or start a new session.EarwaxEchoEcho sequenceEditingEffect %s contains invalid port %sEffectsEnable _dithering for editingEnable _variable speed playbackEnable dithering for _playbackEncoding type: End Move view to file end End:Endianness: Error changing samplerate conversion ratio: %s Error closing %s: %sError converting samplerate: %s Error creating link to '%s': %sError creating pipeError in sound driver: ioctl failed: %sError in sound driver: read failed: %sError in sound driver: select failed: %sError in sound driver: write failed: %sError initialising sample rate conversion: %sError launching mixer: fork: %sError opening ALSA device '%s' for playback: %sError opening ALSA device '%s' for recording: %sError opening session directoryError reading %s: %sError reading from %s: %sError reading from sub process: %sError reading sox outputError running 'sox -h': %s Error seeking in %s: %sError writing to subprocess: %sError: %sError: fork: %sEsounD driver: readEsounD driver: selectEsounD driver: writeEsounD: Unable to open playback streamEsounD: Unable to open recording streamEsound connection closed by serverEven if mhWaveEdit was originally built for editing wav files, it's also possible to load and save in a few other formats. mhWaveEdit always supports wav and raw files, but if it's compiled with the libsndfile library, mhWaveEdit supports a couple of other formats as well. Event driven I/OExitExpected driver name after --driver optionExtreme (higher quality)F1 Help F12 Record Factor: Fade: Fade|CosFade|HammingFade|LinearFade|TrapezoidFailed to open '%s'!Failed to write to '%s'!Feature requests are also welcome, report them to the mailing list or to the bug tracker. File already exists. Overwrite?File already has the selected sample formatFile formatsFile type: FilesFilter type: Find top volumeFinding zero-crossingFinishFirst of all, look for bugs and report all bugs you find into the bug tracker or through e-mail. Sometimes a bug can get overlooked for a long time because nobody reports it, so don't be afraid to report bugs that have been there for a few releases. You don't have to provide fixes or very detailed information, although it helps of course. FlangerFloating-point (double %s) Floating-point (single %s) Floating-point, doubleFloating-point, singleFor bug reports, translation updates, patches and PayPal donations: Format not selectedFrequency: GeneralH,J Move cursor (and playback) 1/8 of view Header bytes: HeavyHelping outHigh 6db corner: HighpassHighpass filter (single-pole)Home Move view to file start How to create a backtrace: HzI,O Move cursor to nearest any-channel zero-crossing If a translation is incomplete, you're very welcome to translate the remaining untranslated messages and mail them in. Corrections to translations are also appreciated, but they may need to be checked with the previous translator before including them. If mplayer is installed, mhwaveedit can open all formats that it supports, for example the soundtrack of a video file. Since mplayer is only a player, these files can not be saved back after editing, you have to save the file into a supported format. If the cursor starts running too early when jumping, this delay should be increased.If you find a bug or flaw in the program that's not mentioned in the BUGS file, report the bug in the bug tracker (see contact info) or mail a bug report describing the bug to: magnus.hjorth@home.se If you speak a language other than English and mhWaveEdit isn't translated to your language, you can contribute a translation. To do that, copy the template mhwaveedit.pot in the po directory into a new file ll.po, where ll is your language code (see http://www.gnu.org/software/gettext/manual/html_node/gettext_221.html for a list of language codes). Ignoring extreme old window size/position values In case of a crash, please do not send me any core dumps. They are huge and completely useless to me. Instead, create a backtrace. Backtraces tell you exactly where the program crashed. In the sample view there is a grey vertical bar called the 'cursor'. The cursor follows the sound wave when you play the sound. You can position the cursor by clicking with the right (2:nd) mouse button. If you do this while you're playing a file, the playing will continue from the new cursor position. You can also position the cursor more exact by using the 'Position Cursor...' command on the Edit menu. Initial volume: InputInput gain: Input level (dB)Input levelsInsane (highest possible quality)Insert SilenceInterfaceInterpolation: Interpolation|CubicInterpolation|LinearInvalid driver name: %s Using '%s' driver insteadInvalid number of input ports.Invalid number of output ports.Invalid sample format or number of channels for this file formatInvalid time value. Time must be specified in the form (HH')MM:SS(.mmmm)It's possible to edit po-files by hand, but I recommend a program such as poEdit (http://www.poedit.org) for editing translations. Jack PreferencesJump delay:K,L Move cursor one sample Keep data in unmapped output channelsKeep main _window in front after applying effectKeep view and playback togetherKeyboard shortcutsL WaveformLadspa: Error scanning %sLaunch mixerLeftLeft filesLevel: Limiter gain: Little endianLittle-endianLoad FileLoad a file from diskLoadingLoading and then saving files with 'lossy' formats (like mp3 and ogg) leads to a quality loss, also for the unmodified parts of the file.Loop mode (play over and over)Low 6dB corner: LowpassLowpass filter (single-pole)MP3 PreferencesMailing list (you must be a subscriber before you can post messages): MapMap channelsMarksMasking noiseMessageMethod: Mi_xer utility: Microsoft WAV formatMildMixingMixing channelsModulation Modulation|SinusoidalModulation|TriangularMonoN/AName :New samplerate: NoNo errors detected!No file with that name!Noise modeNoneNormalization mode: Normalize to...Note that for those translatable strings that look like "RecordStatus|Paused", you should ignore what's to the left and only translate the string to the right ("Paused" in this example). This convention is there to make it possible to translate the same string to different things depending on context. Number of ports (0-8): Number of recent files in File menu: OKOSS preferencesOgg VorbisOn this system, libsndfile is required to save floating-point wav files.Open with MPlayerOtherOutput _buffer size:Output channels: Output from command '%s': Output gain: Output level (dB)Over/underrun in JACK driverOverruns: Pa_OpenStream failed: %s PackedPaste at cursor positionPaste, overwriting the data after the cursor positionPause recordingPeak limiterPeak max: Peak: PhaserPipe through programPitch adjustPlace cursor Play _mono files as stereoPlay from cursor positionPlay selected areaPlaybackPlayback device file:Playback device: PlayingPlaying a file is simple, just load the file and press the play button. The green play button plays from the current position. The yellow play button plays the current selection, or the entire file if nothing is selected. Stop the playback with the stop button (with the red square). Port #%dPosition cursorPost-processing gain: PreferencesPreparing tests..Presets:Process outputProcessing dataProgress barProject page with bug tracker, mailing list membership: Pure-ScaledQualityQuality: R WaveformRMS: Range test failed for format: Raw PCM dataReady for recordingRecordRecordStatus|PausedRecordStatus|RecordingRecordingRecording device file:Recording device: Recording is done with 'Record...' on the Play menu, or the Record button (the red circle). A dialog box will pop up where you can select what format you want to record in. After selecting the format, meters and numbers will appear showing info about the volume level of the sound input. Recording settingsRecording status: Redo the last undo operationReset max peaksResume recordingResume selectedReverbReverb time: ReverseRightRunning tests..SDL (output only)SDL: Couldn't open audio: %sSample format to try when the sound file's format isn't supported.Sample format: Sample rate: Sample repeat/skip (low quality)Sample type: Sample viewSave FileSave changes to %s?Save selection as ...Save the current file to diskSavingSeconds of silence: Selecting the ESD host to connect to is done through the ESPEAKER environment variable.SelectionSelection: %s+%sSend wav headerSessionsSetSet formatSet selection end to cursor positionSet selection start to cursor positionShift amount: Shift+Space Play all Should not reach this pointShould not reach this point!Show _horizontal zoom slider by defaultShow _speed slider by defaultShow _time scale by defaultShow _vertical zoom slider by defaultShow playback buffer positio_n by defaultShow slider l_abels by defaultSignedSignedness: Sinc-windowed filterSoX closed connection too early!Some notes on sound quality. Some of the settings you have changed will not be activated until you restart the programSome versions of libsndfile supports accessing Ogg files without decompressing to a temporary file.SoundSound data is normally stored as integer values. Therefore, whenever you normalize, adjust volume, decrease sample size or filter a sound, the result must be rounded. If you use 24 or 32 bit sample sizes, this is not really a problem, but if you use 8 or 16 bits sample size, this rounding causes a decrease in quality. SourceSox support couldn't be initializedSpeedSpeed (Hz) Speed effect: Speed:Speed: Standard (high quality)Start new sessionStart recordingStart:StereoStop playingSunAudio: Couldn't open %sSunAudio: Error reading from sound deviceSunAudio: Error writing to sound deviceSuspendedSyntax: %s [files] Tab Move view to cursor Temporary files are by default also stored in the ~/.mhwaveedit directory. Which directories to use can be set through the preferences dialog. To get the best performance, you should have one temporary directory for each local filesystem. The temporary files have names of the form "mhwaveedit-temp--nnnn-". Do NOT open or remove temporary files with the same pid number as a currently running mhWaveEdit. Testing conversion functions finished.Testing conversion functions:The 'Crop' function deletes all parts of the file that are not selected. The 'Cut' and 'Copy' functions work like in any other software. The 'Paste as new' function opens a new window and puts the clipboard contents into it. The 'Paste mix' function combines the clipboard data with the data at the cursor position. The 'Paste' function insert the clipboard contents at the cursor position. The 'Paste over' function works like 'Paste', except that it overwrites the data after the insert position. The 'Silence selection' function replaces the selected part with silence. To avoid clicks, the silent part is a line that meets the wave at the endpoints. The area where you 'see' the contents of the file you are editing, is called the 'sample view'. The client name change won't take effect until you restart the program.The configuration file is called config. It can be hand edited, but the easiest way is through 'Preferences' on the Edit menu. The file %s does not exist!The file %s is a compressed wav file. This program can only work with uncompressed wav files.The file %s is not a regular file!The file %s may be destroyed since the saving failed. Try to free up some disk space and save again. If you exit now the file's contents could be in a bad state. The file has not changed since last save. Press OK if you want to save it anyway?The file name '%s' has an extension unknown to the program. Please specify in which format this file should be saved.The files that belonged to the crashed session have been recovered. Any files that are not saved will be removed permanently. (This notice is only shown once)The format of file '%s' could not be recognized. Please specify the sample format below.The general rule when doing audio editing/processing is to not manipulate the data more than necessary and keep an original copy whenever you're processing your important files. The mix paste function doesn't decrease quality, unless the peaks become too high and you get clipping. In that case you will get a warning message. The mixed result was clipped %d times.The playback speed can be varied by adjusting the slider to the far right. The sign and endian-ness can usually be left at their defaults, but should be changed if you're unable to record or get bad sound.The sound format of this file is not supported for playing.There already is only one channel!There are plenty of things you can do if you want to help the development of mhWaveEdit. This effect applies to the whole file, not just the selectionThis effect could not be loaded.This effect has no options.This format is not supported by the input driver!Time limit: Time recorded: Time stretchTimeDisplay|SamplesTimes_cale format: To avoid rounding errors when applying more than one effect on the same data, floating-point temporary files can be used. However, this will increase disk and CPU usage.To save a file with a different file format, use "Save as..." and choose a format in the file type selection box. Top bytesUnable to detect supported SoX effectsUnable to write data to %sUndo the last changeUnexpected EOF in connection to subprocessUnexpected end of fileUnexpected end of file reading from %sUnknown file formatUnknown file typeUnknown option '%s'UnsignedUpdate presetUse default settingsUse fast and noisy methodUse this setting by defaultUses double-precision mathValue for %s must be a number between %ld and %ldValue for '%s' must be a number between %f and %fValue for '%s' must not be above %fValue for '%s' must not be below %fVariable bitrate (default)Varispeed: Vertical zoom limit: VibroView _quality:View: [ %s - %s ]Volume adjust/fadeWarning: Unexpected error: %sWhen you want to start recording, press the "Start recording" button. When you've recorded everything you wanted to, press the Finish button and the record dialog will disappear and newly recorded sound will show up in a new window. WhiteWidth: Window length: Window size: Window width: With JACK, the only supported recording format is Floating-point, single precision, %d HzY,U Move cursor to nearest all-channel zero-crossing YesYou are saving a wav file larger than 2048MB. Such large files are non-standard and may not be readable by all programs. (this warning will not be displayed again)You can do normal editing while the file is playing. You can find the latest release of mhWaveEdit at: You can place marks in your file by holding down Ctrl and pressing a number from 0 to 9. This will place a mark (green vertical bar) with the same number at the current cursor position. You can later make the cursor go to that position again by just pressing the number. Setting and jumping to marks can be done while playing. To remove a mark, jump to the mark and set it again. You can use the cursor to refine the selection. Use the 'Selection start at cursor' and 'Selection end at cursor' buttons to move the selection starting point or the selection end point to the current cursor position. You can also drag the selection endpoints using the mouse. You have mapped more than one output port to channel '%s'. You can only map one output port to each channel.You have no open file to apply the effect to!You make selections by dragging the mouse over the sample view. You can hear what you've currently selected by clicking on the "play selection" button (the button with the yellow arrow) or by selecting 'Play selection' from the Play menu. Zero-level_Add_Auto-start playback when jumping to mark_Browse..._Byte-swap output (try this if playback sounds horrible)_Cancel_Close_Down_Draw waveform a second time with improved quality_Driver:_Keep cursor in center of view when following playback_Keep sound driver opened (to avoid start/stop clicks)_OK_Preview_Remember window sizes/positions_Remove_Settings_Up_Update cursor information while playing_Use floating-point temporary filesafter beginning of fileafter current cursor positionafter end of fileafter selection endafter selection startbytesheader sizejack_get_ports returned NULLjump delaymaximum vertical zoommhWaveEdit HelpmhWaveEdit checks on startup for leftover temporary files and lets the user open them. After opening a crashed session, the files can be saved or thrown away. mhWaveEdit creates a directory ~/.mhwaveedit where it stores configuration information. mhWaveEdit has a few simple effects, which are available from the 'Effects' menu. mhWaveEdit has basic support for mp3 and ogg formats. For this to work you need to have LAME installed for mp3 support, and OggDec/OggEnc for Ogg support. If you have these programs, you can open and save mp3/ogg files just like any other file format. mhWaveEdit is a graphical program for editing sound files. It is completely free (GPL). mhWaveEdit supports LADSPA effects and can also make use of most of the SoX utility's effects. To find the LADSPA plugins the environment variable LADSPA_PATH must be properly set up. mhWaveEdit: mhWaveEdit: %s (%s): %d Hz, %smhWaveEdit: %s: %s msnumber of recent filesputenv failed!sample ratesamplessamples/pixelsecondssnd_pcm_hw_params_set_access failedsnd_pcm_hw_params_set_buffer_size_last failedsnd_pcm_hw_params_set_channels failedsnd_pcm_hw_params_set_format failedsnd_pcm_hw_params_set_rate failedsound-portaudio: No input devices available!sound-portaudio: No output devices available!unsetenv failed!untitled #%dxProject-Id-Version: mhwaveedit_fr Report-Msgid-Bugs-To: POT-Creation-Date: 2018-08-25 11:56+0200 PO-Revision-Date: 2015-12-04 23:23+0100 Last-Translator: Olivier Humbert Language-Team: none Language: fr MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Résultats du test (1 unité de temps = %f µsec/échantillon) Fenêtre '%s' En paramétrant un volume de départ et un volume de fin à la même valeur, vous obtenez une simple amplification du son. Notez qu'un volume supérieur à 100% pourrait causer des distorsions du son. Utilisez le 'Trouver le volume haut' pour déterminer l'amplification maximale possible sans distorsion. (Vous pouvez utiliser ceci pour normaliser des échantillons.) L'option 'Ne pas réellement changer les données' peut être utilisée si le programme s'est trompé à propos du format de fichier. Ceci "permute les octets" de la partie sélectionnée. Il peut-être utilisé pour réparer des fichiers endommagés où l'ordre des octets est mauvais. Notez que si le son paraît correct mais se joue bizarrement, vous ne devriez pas utiliser cette option, et devriez choisir à la place l'option "Permuter les octets en sortie" dans la boîte de dialogue des 'Préférences'-> onglet 'Son'. Ceci amplifie le son autant que possible sans avoir d'artefact de distorsions. L'élément "Normalisation à..." vous permet de spécifier à quel niveau vous désirez normaliser. Ceci convertit le format d'échantillon du fichier entier. Ceci convertit le taux d'échantillonnage du fichier entier au taux que vous spécifiez. Il existe différentes méthodes pour faire cela, habituellement la première du haut possède la meilleure qualité mais peut prendre plus longtemps que l'autre méthode. Ceci copie le premier canal vers un nouveau canal dans l'audio, convertissant ainsi de mono vers stéréo etc. Ceci crée un effet de fondu linéaire entrant ou sortant. Cet effet modifie la vitesse de la sélection. La tonalité changera également. Cet effet est pour les utilisateurs avancés qui veulent envoyer les données audio brute (raw) vers un programme externe. La sortie du program est relue et remplacée par la partie traitée. Cet effet vous permet de créer un nouveau son par une combinaision linéaire des anciens canaux. Ceci signifie que vous pouvez mixer / permuter / amplifier / balancer / étendre / amplifier etc. en entrant différentes valeurs. Par exemple, pour permuter le canal de droite et celui de gauche, vous définissez que le nouveau Canal 1 devrait être à 0% du vieux Canal 1, et 100% du vieux Canal 2, et le nouveau Canal 2 devrait être à 100% du vieux canal 1 et 0% du vieux canal 2. Cet effet vous laisse sélectionner un volume de départ et un volume de fin, et amplifie le fondu de la sélection, du volume de départ au volume de fin. Ceci mixe ensemble tous les canaux du fichier vers de l'audio mono. Avec cet effet, vous pouvez changer le nombre de canaux dans le fichier Vous pouvez également ré-arranger et ajouter (c'est à dire mixer) les canaux. gdb /usr/local/bin/mhwaveedit core | tee backtrace.txt Morceau actuel : Historique : et : * Ajouter un canal * Permuter les octets * Combiner les canaux... * Convertit le format de l'échantillon... * Convertir le taux d'échantillonnage.. * Fondus entrant/sortant * Router les canaux... * Mixer vers mono * Normalisation, Normalisation à... * Envoyer à travers le programme... * Ajustement de vitesse... * Ajustement/fondu du volume... Paramètres avancés Tramage (dithering) Options du pilote audio Programmes externes Format par défaut Hz Entrée audio Contrôles d'entrée Ports d'entrée Fenêtre principale Sortie audio Contrôles de sortie Ports de sortie Paramètres de lecture Taux de conversions Conversion d'échantillon Répertoires de fichier temporaire Paramètres de fichier temporaire Format du temps Vitesse variable Affichage Contenu de la fenêtre cents dB ms secondes%d canaux%s n'est pas un fichier wav valide%s sur %s(%d fichiers, %ld octets)%s... (Appuyez sur ESC pour annuler)%s : Attendu '=' : %s %s : Valeur attendue : %s %s : mauvais type de fichier'%s' n'est pas un nombre !( Lire les 3 premières secondes de la sélection (H')MM:SS.mmmm(H')MM:SS.t(Les lignes avec délai=0 seront ignorées)(SoX) Interpolation polyphasée(SoX) Filtrage analogique simulé(Ceci modifie le taux d'échantillon de tout le fichier, pas seulement la sélection)(Ceci modifie le type d'échantillon de tout le fichier, pas seulement la sélection)(excepté) (pas de fichier chargé)(pas de limite)(nombre) Aller à un marqueur (utilisez un nombre négatif pour placer le curseur avant au lieu d'après le point sélectionné)) Lire les 3 dernières secondes de la sélection +,= Zoomer avant , Lire depuis la position du curseur - Zoomer arrière . Stop / Lire la sélection /Curseur/Trouver les passages à zéro/Curseur/Trouver les passages à zéro/Gauche (tous les canaux)/Curseur/Trouver les passages à zéro/Gauche (n'importe quel canal)/Curseur/Trouver les passages à zéro/Droit (tous les canaux)/Curseur/Trouver les passages à zéro/Droite (n'importe quel canal)/Curseur/Déplacer/Curseur/Déplacer vers/Curseur/Déplacer vers/Début/Curseur/Déplacer vers/Fin/Curseur/Déplacer vers/Fin de la sélection/Curseur/Déplacer vers/Début de la sélection/_Curseur/Déplacer/Gauche/Curseur/Déplacer/Échantillon de gauche/Curseur/Déplacer/Droite/Curseur/Déplacer/Échantillon de droite/Curseur/Positionner le curseur.../Curseur/Définir la fin de la sélection au curseur/Curseur/Définir le début de la sélection au curseur/Curseur/sep1/Curseur/sep2/Déboguage/Déboguage/Vérifier les comptes/Déboguage/Effet factice/Déboguage/Effet FP factice/Déboguage/Décharger les infos/Édition/Vider le presse-papier/Édition/R_ogner/Édition/Cou_per/Édition/Insérer _silence/Édition/C_oller par dessus/Édition/Coller comme _nouveau/Édition/Préférences/Édition/Sélectionner tout/Édition/Désélectionner/Édition/Remplacer la sélection en silence/Édition/_Copier/Édition/_Effacer/Édition/Coller _mixte/Édition/Co_ller/Édition/_Refaire/Édition/Ann_uler/Édition/sep1/Édition/sep2/Édition/sep3/Édition/sep4/Effe_ts/Effets/Ajouter un cana_l/Effets/Ajouter les canaux d'un autre fichier.../Effets/Permutter les octets/Effets/Convertir le _format de l'échantillon.../Effets/Converti_r le taux d'échantillonnage.../Effets/Boîte des effets.../Effets/Fondu _entrant/Effets/Fondu _sortant/Effets/Router les canaux.../Effets/_Normalisation à.../Effets/Envoyer à travers le programme.../Effets/_Combiner les canaux.../Effets/_Mixer vers mono/Effets/_Normalisation/Effets/Ajustement de vite_sse.../Effets/Ajustement du _volume (fondu).../Effets/sep1/Effets/sep2/Effets/sep3/Effets/sep4/Fichier/S_auvegarder sous.../Fichier/Sauvegarder la sélection sous.../Fichier/_Fermer/Fichier/Quitt_er/Fichier/_Ouvrir.../Fichier/_Sauvegarder/Fichier/sep1/Fichier/sep2/Aide/_À propos/Aide/_DocumentationDescendre d'un cranMonter d'un cranDescendre tout en bas cranMonter tout en haut/Lire/Lire _tout/Lire/Lire la sé_lection/Lire/Lire depuis le _curseur/Lire/En_registrer.../Lire/_Stop/Lire/sep1Reconstruire la liste d'effetsRestorer l'ordreTrier par auteurTrier par emplacementTrier par nomTrier par type/Affichage/Position du tampon/Affichage/Étiquettes de chariot/Affichage/Chariot de vit_esse/Affichage/Zoomer sur l_a piste entière/Affichage/Zoo_m avant/Affichage/Zo_om arrière/Affichage/Zoomer sur la _sélection/Affichage/Zoom _horizontal/Affichage/Échelle de _Temps/Affichage/Zoom _vertical/Affichage/sep1/Affichage/sep2/_Curseur/_Édition/_Fichier/A_ide/_Lire/_Affichage1. Activez la création de fichiers core : ulimit -c unlimited 2: Lancer le programme : mhwaveedit 3. Faites planter le programme. Vous devriez maintenant avoir un fichier nommé core ou core.1234 dans le répertoire d'où vous avez lancé le programme. 4. Lancez gdb avec le programme et le fichier core : (Remplacez /usr/local/bin/mhwaveedit par le chemin où se trouve l'exécutable de mhWaveEdit) 5. Après que gdb se soit chargé, utilisez la commande : bt 6. Quittez gdb avec la commande : quit 7. Maintenant vous devriez avec un 'backtrace' dans le fichier backtrace.txt < Zoomer sur la piste entière > Zoomer sur la _sélection Préférences ALSAÀ propos de mhWaveEditActivation échouée !Ajouter des canaux d'un autre fichierAjout des canaux depuis : Ajout d'un pré-réglageAjouter/mettre-à-jour le pré-réglageAjustement de la vitesseAvancéAprès avoir rempli les traductions que vous voulez (vous n'êtes pas obligé de traduire toutes les chaînes de caractère), envoyez-moi le fichier po par courriel (voir les informations de contact) et je l'ajouterai à la prochaine version. Alignement au marqueur : Alignement sur le début des fichiersAlignement sur la fin des fichiersAlignementAlignement :Toutes les fonctions d'édition sont non-destructives, ce qui veut dire que le fichier original que vous éditez n'est pas altéré tant que vous ne le sauvegardez pas (les effets fonctionnent également de la sorte). Tous les effets supportés peuvent être trouvés en choisissant l'élément de menu 'Effets...'. Les effets sont listés avec des noms commencant par [B] pour les effets intégrés à mhWaveEdit (NdT : B pour Builtin), [L] pour les effets LADSPA, et [S] pour les effets SoX. Quantité : AmplificationAmplification (par %3.1f%% / %+.1fdB)AppliquerAppliquer à : Application de l'effet '%s'Touches fléchées Défiler gauche/droite Temps d'intégration d'attaque : Auteur : %sAuto-déte_ction du pilote à chaque démarrageRetourner automatiquement au débutArrêt auto : _Remettre automatiquement la vitesseAuto-détecte depuis l'extensionAutomatiquement se connecter au port d'entrée au démarrageAutomatiquement se connecter au port de sortie au démarrageDébit binaire moyenÉviter les appels de sélection (à essayer si l'enregistrement bloque)FondPasse-bandeFiltre passe-bandeBande passante : BêtaPartialGrand boutisteGrand-boutisteNoirOctets du basParcourir le dossierDépassement tampon !Position du tamponRapport de bogueIntégréFiltre passe-bande ButterworthFiltre coupe-bande ButterworthFiltre passe-haut ButterworthFiltre passe-bas ButterworthPar défaut, mhWaveEdit utilise des fichiers temporaires à virgules flottantes pour stocker les résultats des traitements pour éviter les arrondis jusqu'à ce que le fichier soit sauvé. Court-circuiterOctets écrits : Calcul du niveau maximalCalcul du volume de pic...AnnulerCanaux : ChoixChorusLe morceau %p a opencount=%d Nom du client : Coupure : FermerFermer le dialogue après l'application de l'effetCouleursCombiner les canauxCombiner les canauxLa commande a échoué sans retourner de donnéeLigne de commande : Compilé le : %s %sCompresser/étendreConnection depuis %s vers %s échouée : %sDébit binaire constantContactTest de conversion échoué, entre : Convertir le format de l'échantillonConversion du taux d'échantillonnageConversion du taux d'échantillonnageCopier la sélectionCopyright : %sImpossible de se connecter au serveur JACK.Ne peut créer le tunnel : %sÉchec de la création d'une fichierImpossible de trouver le répertoire personnel. Utilisation du répertoire courant en tant que répertoire personnel.Impossible d'obtenir la position du fichier dans %s : %sImpossible d'initialiser SDL : %sImpossible d'ouvrir %s : %sImpossible d'ouvrir '%s' : %sImpossible de lire depuis %s : %sImpossible de supprimer '%s' : %sImpossible de rechercher dans %s : %sImpossible de se connecter au démon d'ESD : %sImpossible de séparerImpossible d'ouvrir %sPlantageCtrl+(nombre) Définir un marqueur Ctrl+A Tout sélectionner Ctrl+C Copier Ctrl+D Effacer Ctrl+E Effets Ctrl+G Positionner le curseur (Aller à) Ctrl+H Positionner le curseur au début du fichier Ctrl+J Positionner le curseur à la fin du fichier Ctrl+K Positionner le curseur au début de la sélection Ctrl+L Positionner le curseur à la fin de la sélection Ctrl+O Ouvrir un fichier Ctrl+P Préférences Ctrl+Q Définir le début de la sélection au curseur Ctrl+S Sauvegarder un fichier Ctrl+Tab Déplacer le curseur au centre de la vue Ctrl+U Sauvegarder la sélection sous Ctrl+V Coller Ctrl+W Définir la fin de la sélection au curseur Ctrl+X Couper Ctrl+Z Refaire Ctrl+flèche Déplacer le curseur (et la lecture) d'une demi-seconde Pilote audio actuel : %sActuellement, il est impossible de lire et d'enregistrer en même temps, et donc la lecture s'interrompra si vous enregistrez. CurseurCurseur : Curseur : lectureArgument personnaliséArgument personnalisé : Format personnaliséPersonnaliser les cou_leurs...Couper la sélectionLes opérations couper, copier et coller déplacent les données sans les modifier, donc ces opérations ne dégradent pas la qualité audio. En raison des différences de niveau, il est possible que vous entendiez un "pas" au début et à la fin de la partie insérée, ce qui peut causer un son qui clique. Décalage DCAffaiblissementTemps d'intégration de l'affaiblissement : DécodageDécompresserDélai (ms) Temps du délai : Suppr Effacer Effacer la session sélectionnéeEffacer la sélectionProfondeur (ms) Profondeur : DestinationAccès directDésactiver_Seuil d'édition du disque : Aff_icher le temps en : Distribué conformément à la licence GNU General Public License. Pour plus d'informations, voir le fichier COPYING.Ne pas changer les données pour de vrai (pour réparer les mauvais fichiers, etc)Factice (pas de son)Préférences ESDChaque traitement de mhwaveedit crée un fichier de session dans le répertoire .mhwaveedit appelé mhwaveedit-session---, où est le numéro d'identification de la session et est un code de caractère montrant l'état de la session ('r' pour session en cours - NdT : Running en anglais). Des sessions précédentes ont été trouvées. Choisissez en une pour la reprendre ou commencez une nouvelle session.EarwaxÉchoSéquence échoÉditionL'effet %s contient un port invalide %sEffetsActiver le tramage pour l'é_ditionActiver la lecture à _vitesse variableActiver le tramage _pour la lectureType d'encodage :End Déplacer la vue à la fin du fichier Fin :Boutisme : Erreur lors du changement du ratio de conversion du taux d'échantillonnage : %s Erreur en fermant %s : %sErreur lors de la conversion du taux d'échantillonnage : %s Impossible de créer de lien vers '%s' : %sErreur lors du passage d'informationErreur dans le pilote audio : ioctl échoué : %sErreur dans le pilote son: lecture échoué: %sErreur dans le pilote audio : sélection échouée : %sErreur dans le pilote audio : écriture échouée : %sErreur d'initialisation de la conversion du taux d'échantillonnage : %sErreur au lancement du mixeur : séparation : %sErreur d'ouverture du périphérique ALSA '%s' pour lire : %sErreur d'ouverture du périphérique ALSA '%s' pour enregistrer : %sErreur lors de l'ouverture du répertoire de la sessionErreur de lecture %s: %sErreur de lecture depuis %s : %sErreur de lecture depuis le sous-processus : %sErreur lors de la lecture de la sortie de SoXErreur lors du déroulement de 'sox -h' : %s Erreur de recherche dans %s : %sErreur d'écriture vers le processus : %sErreur : %sErreur : séparation : %sPilote EsounD : lirePilote EsounD : sélectionnerPilote EsounD : écrireEsounD : Impossible d'ouvrir le flux de lectureEsounD : Impossible d'ouvrir le flux d'enregistrementConnexion à EsounD terminée par le serveurMême si mhWaveEdit ait été pensé originellement pour éditer des fichiers wav, il est également possible de charger et sauver dans quelques autres formats. mhWaveEdit supporte toujours les wav et les fichiers au format brut (raw) mais s'il est construit avec la bibliothèque libsndfile, mhWaveEdit supporte un bon nombre d'autres formats également. Entrée/Sortie pilotée par les événementsQuitterNom du pilote attendu après l'option --driverExtrême (meilleure qualité)F1 Aide F12 Enregistrer Facteur : Fondu : CosMarteléLinéaireTrapèzoïdeImpossible d'ouvrir '%s' !Impossible d'écrire '%s' !Les demandes de fonctionnalité sont bien entendu bienvenues, rapporter les sur la liste de discussion ou sur le système de suivi de bogues. Le fichier existe déjà. Écraser ?Le fichier a déjà le format d'échantillonnage sélectionnéFormats de fichierType de filtre : FichiersType de filtre : Trouver le volume le plus hautTrouver les passages à zéroTerminerPremièrement, soyez attentifs aux bogues et rapportez tous les bogues que vous trouvez dans le syst-mede suivi des bogues ou par courriel. Parfois, un peut être pendant longtemps parce que personne ne le rapporte, ne soyez donc pas timide pour rapporter des bogues qui ont été là depuis longtemps. Vous n'avez pas à fournir des correctifs ou d'informations vraiment détaillées, bien que ça aide évidemment. FlangerVirgule flottante (double %s) Virgule flottante (simple %s) Virgule flottante, doubleVirgule flottante, simplePour les rapports de bogues, les mises-à-jour de traduction, les et les donations PayPal : format non sélectionnéFréquence : GénéralH,J Déplacer le curseur (et la lecture) d'1/8 de vue Octets d'entête : LourdAiderCoin 6db élevé : Passe-hautFiltre passe-haut (pôle simple)Home Déplacer la vue au début du fichier Comment créer un 'backtrace': HzI,O Déplacer le curseur au passage-à-zéro le plus proche (n'importe quel canal) Si une traduction est incomplète, vous êtes encouragés à traduire les messages non-traduits et à me les envoyer. Les corrections aux traductions sont également appréciées, mais elles pourraient avoir besoin d'être vérifiées avec les traducteur précédents avant de les inclure. Si mplayer est installé, mhwaveedit peut ouvrir tout les formats qu'il supporte, par exemple les pistes audio d'un fichier vidéo. Puisque mplayer est seulement un lecteur, ces fichiers ne peuvent pas être re-sauvegardés directement après l'édition, vous devrez sauvegarder le fichier dans un format supporté. Si le curseur commence à avancer trop tôt lors d'un saut, ce délai devrait être incrémenté.Si vous trouvez des erreurs ou bogues dans le programme n'étant pas mentionnés dans le fichier BUGS, rapportez le bogue dans le système de suivi de bogues (voir les informations de Contact) ou envoyez un rapport de bogue par courriel décrivant le bogue à : magnus.hjorth@home.se Si vous parlez une autre langue que le français (NdT : anglais dans la version originale) et que mhWaveEdit n'est pas traduit dans votre langue, vous pouvez contribuer une traduction. Pour ce faire, copiez le patron mhwaveedit.pot dans le fichier po dans un nouveau fichier ll.po, où ll est le code de votre langue (voir http://www.gnu.org/software/gettext/manual/html_node/gettext_221.html pour une liste des codes de langue). Anciennes valeurs de position/taille de fenêtre ignorées Dans le cas d'un plantage, veuillez ne pas envoyer de fichier core. Ils sont très volumineux et complètement inutile pour moi. À la place, créez un 'backtrace'. Cette technique définit précisément là où le programme s'est crashé. Dans cette vue de l'échantillon, se trouve une barre verticale grise appelée le 'curseur'. Ce curseur suit l'onde sonore du son lorsque vous la jouez. Vous pouvez positionner le curseur en cliquant avec le bouton droit (deuxième bouton) de la souris. Si vous faites ceci pendant la lecture d'un fichier, la lecture continuera à partir de la nouvelle position du curseur. Vous pouvez également positionner le curseur plus précisement grâce à 'Positionner le curseur...' dans le menu du Curseur. Volume initial : EntréeGain entrée : Niveau d'entrée (dB)Niveaux d'entréeDément (plus grande qualité possible)Insérer du silenceInterfaceInterpolation : CubiqueLinéaireNom de pilote invalide : %s Utilisation du pilote '%s' en remplacementNombre de ports d'entrée invalide.Nombre de ports de sortie invalide.Format d'échantillonage ou nombre de canaux invalide pour ce format de fichierValeur de temps invalide. Le temps doit être spécifié sous la forme (HH')MM:SS(.mmmm)Vous pouvez éditer les fichiers po à la main, mais je recommande d'utiliser un programme comme poEdit (http://www.poedit.org) pour éditer les traductions. Préférences JackDélai de saut :K,L Déplacer le curseur d'un échantillon Garder les données dans des canaux de sortie non-routésGarder la _fenêtre principale en premier-plan après l'application d'effetSuivre le curseur pendant la lectureRaccourcis clavierForme d'onde GaucheLadspa : erreur d'analyse %sLancer le mixeurGaucheRestes de fichiersNiveau :Limite du gain : Petit boutistePetit-boutisteCharger un fichierCharger un fichier du disqueChargementCharger puis sauvegarder des fichiers avec des formats 'à perte' (comme le mp3 et le ogg) conduit à une perte de qualité, y compris pour les parties non-modifiée du fichier.Mode boucle (jouer à l'infini)Coin 6dB faible : Passe-basFiltre passe-bas (pôle simple)Préférences MP3Liste de diffusion (vous devez être inscrit avant de pouvoir poster des messages) : RouteRouter les canauxMarqueursMasquer le bruitMessageMéthode : Utilitaire de mi_xage : Microsoft WAV formatDouxMixageMixer les canauxModulation SinusoïdaleTriangulaireMonoindéfiniNom :Nouveau taux d'échantillon : NonPas d'erreur détecté !Pas de fichier avec ce nom !Mode bruitAucunMode de normalisation : Normaliser à...Notez que pour les chaînes de caractères du type "RecordStatus|Paused", vous devriez ignorer ce qui est sur à gauche et uniquement traduire la chaîne sur la droite ("Paused" dans cet exemple). Cette convention est là pour rendre possible la traduction de la même chaîne pour différentes choses en fonction du contexte. Nombre de ports (0-8) : Nombre de fichiers récents dans le menu Fichier :OKPréférences OSSOgg VorbisSur ce système, la bibliothèque libsndfile est requise pour sauvegarder des fichiers wav à virgule flottante.Ouvrir avec MPlayerAutreTaille du ta_mpon de sortie :Canaux de sortie : Sortie de la commande '%s' : Gain sortie : Niveau de sortie (dB)Décrochage du pilote JACKDépassements : Pa_OpenStream a échoué : %s CompactColler à la position du curseurColler en écrasant à la position du curseurMettre l'enregistrement en pauseLimiteur de picPic maximum : Pic : PhaserFaire passer par le programmeAjuster la tonalitéPlacer le curseur Lecture des fichiers _mono comme s'ils étaient stéréoLire depuis le curseurLire la sélectionLectureFichier du périphérique de lecture : Périphérique de lecture : LectureLire un fichier est simple, chargez le fichier et pressez sur le bouton de lecture. Le bouton de lecture vert sert à lire depuis la position du curseur. Le bouton de lecture jaune lit la sélection courante, ou le fichier entier si rien n'est sélectionné. Pour arrêter la lecture, utilisez le bouton Stop (le carré rouge). Port #%dPositionner le curseurGain post-traitement : PréférencesPréparation des tests..Pré-réglages :Traiter la sortieTraitement des donnéesBarre de progressionPage du projet avec le système de suivi de bogue, l'accés à la liste de diffusion : Purement normaliséQualitéQualité : Forme d'onde DroiteRMS : Test de plage échoué pour le format : Raw PCM dataprêt pour enregistrerEnregistrerEn pauseEn coursEnregistrementFichier du périphérique d'enregistrement : Périphérique d'enregistrement : L'enregistrement se fait grâce à 'Enregistrer...' dans le menu 'Lire', ou le bouton d'enregistrement (le rond rouge). Une boîte de dialogue s'ouvre alors où vous pouvez sélectionner dans quel format vous voulez enregistrer. Après avoir sélectionné le format, des informations chiffrées et VU-mètres apparaîtront affichant des informations à propos du niveau de volume de l'entrée audio. Paramètres d'enregistrementStatut d'enregistrement : Refaire le dernier changement annuléRéinitialiser les pics maximumsReprendre l'enregistrementRécupérer la session sélectionnéeReverbTemps de réverbération : RenversementDroiteTests en cours..SDL (sortie seulement)SDL : impossible d'ouvrir l'audio : %sFormat d'échantillon à utiliser quand le format du fichier audio n'est pas supporté.Format d'échantillon : Taux d'échantillonnage : Répète/saute l'échantillon (basse qualité)Type d'échantillon : Vue de l'échantillonSauvegarder le fichierSauvegarder les changements de %s ?Sauvegarder la sélection sous...Sauver le fichier sur le disqueEnregistrementSecondes de silence : Sélectionner l'hôte ESD auquel se connecter est fait grâce à la variable d'environnement ESPEAKER.SélectionSélection : %s+%sEnvoyer l'entête wavSessionsValiderParamétrer le formatDéfinir la fin de la sélection au curseurDéfinir le début de la sélection au curseurQuantité de décalage : Maj+Espace Jouer tout Ne devrait pas atteindre ce pointNe devrait pas atteindre ce point !Montrer le chariot de zoom _horizontal par défautMontrer le chariot de vite_sse par défautMontrer l'échelle de _temps par défautMontrer le chariot de zoom _vertical par défautMontrer la positio_n du tampon de lecture par défautMontrer le chariot d'étiquette par défautSignéMode Signé : Filtre Sinc-windowedSox a fermé la connexion trop tôt !Quelques notes sur la qualité du son. Certains changements ne seront pas effectifs avant que vous ne relanciez le programmeCertaines versions de libsoundfile permettent d'accéder à des fichiers Ogg sans décompresser vers un fichier temporaire.SonLes données audio sont normalement enregistrées en valeur entière. De ce fait, lorsque vous normalisez, ajustez le volume, diminuez la taille de l'échantillon ou filtrez un son, il est normal que le résultat soit arrondi. Si vous utilisez des tailles d'échantillonage de 24 ou 32 bit, ça ne causera pas vraiment de problème, mais si vous utilisez des tailles d'échantillon de 8 ou 16 bits, cet arrondi provoque une diminution de la qualité. SourceLe support de Sox n'a pu être initialiséVitesseVitesse (Hz) Effet de vitesse : Vitesse :Vitesse : Standard (haut qualité)Démarrer une nouvelle sessionDémarrer l'enregistrementDébut :StéréoArrêter de jouerSunAudio : impossible d'ouvrir %sSunAudio : erreur lors de la lecture depuis le périphérique audioSunAudio: Erreur d'écriture dans le périphérique sonSuspenduSyntaxe : %s [fichiers] Tab Déplacer la vue au curseur Les fichiers temporaires sont stockés par défaut dans le dossier ~/.mhwaveedit. Les dossiers à utiliser peuvent être modifiés dans le dialogue des Préférences. Pour obtenir la meilleure performance, vous devriez configurer un répertoire temporaire pour chaque système de fichier local. Les fichiers temporaires ont des noms de la forme "mhwaveedit-temp--nnnn-". NE PAS ouvrir ou supprimer les fichiers temporaires qui ont le même pid que l'application mhWaveEdit en cours. Test des fonctions de conversion terminé.Test des fonctions de conversion :La fonction 'Rogner' efface les parties non-sélectionnées du fichier. Les fonctions 'Couper' et 'Copier' fonctionnent comme dans tout autre logiciel. La fonction 'Coller comme nouveau' ouvre une nouvelle fenêtre et y met le contenu du presse-papier. La fonction 'Coller mixte' combine les données du presse-papier avec celles à la position du curseur. La fonction 'Coller' insère le contenu du presse-papier à la position du curseur. La fonction 'Coller par dessus' fonctionne comme 'Coller', excepté qu'elle écrit par dessus les données après le point d'insertion. La fonction 'Remplacer la sélection en silence' remplace la partie sélectionnée en silence. Pour éviter les clics audio, la partie silencieuse est une ligne correspondant à la position des ondes sonores aux points de début et de fin. La partie où vous 'voyez' le contenu du fichier que vous édité, est appelée 'la vue de l'échantillon'. Le changement de nom du client ne sera prit en compte qu'après le redémarrage du programme.Le fichier de configuration est appelé config. Il peut édité avec un éditeur de texte, mais la manière la plus simple est de passer par 'Préférences' du menu 'Édition'. Le fichier %s n'existe pas !Le fichier %s est un fichier wav compressé. Ce programme ne peut fonctionner qu'avec des fichiers non-compressés.Le fichier %s n'est pas régulier !Le fichier %s a pu être détruit car l'enregistrement a échoué. Essayez de libérer de l'espace disque et retenter l'opération. Si vous quittez le programme maintenant le fichier risque d'être en mauvais état. Le fichier n'a pas changé depuis la dernière sauvegarde. Cliquez sur Valider si vous voulez le sauvegarder malgré tout.Le fichier %s a une extension inconnue du programme. Essayer de spécifier dans quel format le fichier doit être sauvé.Les fichiers qui appartiennent à la session plantée ont été récupérés. Tout fichier n'étant pas sauvé sera détruit irrémédiablement. (Cette notice n'est affichée qu'une seule fois)Le format du fichier '%s' n'a pas pu être reconnu. Veuillez spécifier le format de l'échantillon ci-dessous.La règle générale lorsque l'on édite/traite une piste audio est de ne pas manipuler les données plus que de nécessaire, et de garder toujours une copie de l'original lorsque vous travaillez sur vos fichiers importants. La fonction coller mixte ne diminue pas la qualité, sauf si les pics deviennent trop haut et que vous obteniez donc des coupures. Dans ce cas, vous serez averti par un message d'alerte. Le résultat mixé a été coupé %d fois.La vitesse de lecture peut être variée en ajustant le chariot tout à droite. Le signe et le boutisme peuvent être habituellement laissés à leurs valeurs par défaut, mais devraient être changés si vous ne parvenez pas à enregistrer ou si le son est un mauvais.Le format de ce fichier n'est pas supporté en lecture.Il n'y a déjà qu'un seul canal !Il y a des tas de chose que vous pouvez faire si vous voulez aider au développement de mhWaveEdit. Cet effet s'applique sur tout le fichier, pas seulement sur la sélectionCet effet n'a pas pu être chargé.Cet effet n'a pas d'option.Ce format n'est pas supporté par le pilote d'entrée !Limite de temps : Temps enregistré : Étirement du tempsÉchantillonsFormat de l'échelle de temps : Pour éviter les erreurs d'approximation lors de l'application de plusieurs effets à un seul morceau, des fichiers temporaires à virgule flottante peuvent être utilisés. Cependant, ceci augmentera l'utilisation du disque et du processeur.Pour sauvegarder un fichier sous un autre format de fichier, utilisez "Sauvegarder sous..." et choisissez un format dans la boîte de sélection de type de fichier. Octets du hautImpossible de détecter les effets SoX supportésImpossible d'écrire des données dans %sAnnuler le dernier changementErreur inattendue de fin de fichier (EOF) dans la connexion au sous-processusFin de fichier inattendueFin du fichier inattendue en lisant depuis %sFormat de fichier inconnuType de fichier inconnuOption inconnue '%s'Non-signéMise à jour du pré-réglageUtilise les paramètres par défautUtilisation de la méthode rapide et _bruyanteUtiliser ces paramètres par défautUtilise une double-précision mathématiqueLa valeur pour %s doit être un chiffre compris entre %ld et %ldLa valeur de '%s' doit être comprise entre %f et %fLa valeur de '%s' ne doit pas être au dessus de %fLa valeur de '%s' ne doit pas être au dessous de %fDébit binaire variable (défaut)Vitesse variable : Limite du zoom vertical : Vibro_Qualité d'affichage :Affichage : [ %s - %s ]Ajustement/fondu du volumeAttention : Erreur inconnue : %sLorsque vous voulez commencer l'enregistrement, pressez le bouton "Démarrer l'enregistrement". Lorsque vous avez enregistré tout ce que vous vouliez, pressez le bouton 'Terminer' et la boîte de dialogue disparaîtra, puis le son nouvellement enregistré apparaîtra alors dans une nouvelle fenêtre. BlancLargeur : Taille de fenêtre : Taille de la fenêtre : Largeur de la fenêtre : Avec JACK, le seul format d'enregistrement supporté est à virgule flottante, simple précision, %d HzY,U Déplacer le curseur au passage-à-zéro le plus proche (tous les canaux) OuiVous être en train de sauvegarder un fichier wav plus grand que 2048 Mo. Des fichiers aussi volumineux ne sont standard, et pouraient ne pas être lisibles par d'autres programmes. (cet avertissement ne sera plus jamais affiché)Vous pouvez continuer à éditer normalement pendant la lecture. Vous pouvez trouver la dernière version de mhWaveEdit à l'adresse : Vous pouvez placer des marqueurs dans votre fichier en maintenant la touche 'Control' et en pressant un chiffre de 0 à 9. Ceci placera un marqueur (barre verticale de couleur verte) avec le chiffre utilisé, à la position actuelle du curseur. Vous pourrez ultérieurement déplacer le curseur vers cette position en appuyant simplment sur le chiffre s'y attachant. Tout ceci peut être fait pendant la lecture. Pour enlever un marqueur, positionnez vous à ce marqueur, et faites pareil que pour en ajouter un. Vous pouvez utiliser le curseur pour définir précisément la sélection. Utilisez les boutons 'Définir le début de la sélection au curseur' et 'Définir la fin de la sélection au curseur' pour déplacer les positions de début ou de fin à la position actuelle du curseur. Vous pouvez également faire glisser les points extrêmes de la sélection grâce à la souris. Vous avez routé plus d'un port de sortie vers le canal '%s'. Vous ne pouvez en définir qu'un par canal.Vous n'avez aucun fichier ouvert sur lequel appliqué l'effet !Les sélections se font en cliquant-droit/glissant/relâchant la souris dans la vue de l'échantillon. Vous pouvez entendre ce que vous avez actuellement sélectionné en cliquant sur le bouton "Lire la sélection" (le bouton avec une flèche jaune) ou en sélectionnant 'Lire la sélection' depuis le menu Lire. Niveau Zéro_AjouterDémarrer _automatiquement la lecture lorsque l'on saute vers un marqueur_Parcourir...Permuter les octets en sortie (à essayer si l'écoute est horri_ble)_Annuler_Fermer_BasTracer la forme _d'onde une deuxième fois avec une meilleure qualité_Pilote :_Garder le curseur au centre de la vue lorsque l'on suit la lecture_Garder le pilote audio ouvert (pour empêcher les clics de démarrage/d'arrêt)_OKA_perçuSe souveni_r de la position et la taille de la fenêtreSupp_rimerOption_sHa_utMettre à jour les informations du c_urseur lors de la lecture_Utiliser des fichiers temporaires à virgule flottanteaprès le début du fichieraprès la position actuelle du curseuraprès la fin du fichieraprès la fin de la sélectionaprès le début de la sélectionoctetstaille de l'entêtejack_get_ports a retourné NULLdélai de sautzoom vertical maximumAide de mhWaveEditmhWaveEdit vérifie au démarrage s'il y a des restes de fichiers et permet à l'utilisateur de les ouvrir. Après l'ouverture d'une session plantée, les fichiers peuvent être sauvegardés ou jetés à la poubelle. mhWaveEdit crée un répertoire ~/.mhwaveedit où il enregistre les informations de configuration. mhWaveEdit possède quelques effets de base, qui sont disponibles à partir du menu 'Effets'. mhWaveEdit possède un support basique pour les formats mp3 et ogg. Pour que cela fonctionne, vous avez besoin que le programme LAME soit installé pour les mp3, et OggDec/OggEnc pour le support des Ogg. Si vous avez ces programmes, vous pouvez ouvrir et sauvegarder des fichiers mp3/ogg de la même façon que n'importe quel autre format de fichier. mhWaveEdit est un programme graphique d'édition de fichiers audio. Il est complètement libre (GPL). mhWaveEdit supporte les effets LADSPA et peut aussi utiliser la plupart des effets de l'utilitaire SoX. Pour trouver les greffons LADSPA, la variable d'environnement LADSPA_PATH doit être correctement paramétrée. mhWaveEdit : mhWaveEdit : %s (%s) : %d Hz, %smhWaveEdit : %s : %s msnombre de fichiers récentsle putenv a échoué !taux d'échantillonnageéchantillonséchantillons/pixelsecondessnd_pcm_hw_params_set_access a échouésnd_pcm_hw_params_set_buffer_size_last a échouésnd_pcm_hw_params_set_channels a échouésnd_pcm_hw_params_set_format a échouésnd_pcm_hw_params_set_rate a échouésound-portaudio : pas de périphériques d'entrée disponible !sound-portaudio : pas de périphérique de sortie disponible !le unsetenv a échoué !sans titre #%dfoismhwaveedit-1.4.24/po/fr.po000066400000000000000000003334131334022513400153300ustar00rootroot00000000000000# translation of mhwaveedit_fr.po to # translation of mhwaveedit.po to # This file is distributed under the same license as the PACKAGE package. # Copyright (C) YEAR Magnus Hjorth. # Bobby Joe , 2005. # Olivier Humbert , 2015. # msgid "" msgstr "" "Project-Id-Version: mhwaveedit_fr\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-08-25 11:56+0200\n" "PO-Revision-Date: 2015-12-04 23:23+0100\n" "Last-Translator: Olivier Humbert \n" "Language-Team: none\n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: src/chunk.c:199 msgid "Converting samplerate" msgstr "Conversion du taux d'échantillonnage" #: src/chunk.c:226 msgid "Adjusting speed" msgstr "Ajustement de la vitesse" #: src/chunk.c:703 msgid "Mixing" msgstr "Mixage" #: src/chunk.c:758 #, c-format msgid "The mixed result was clipped %d times." msgstr "Le résultat mixé a été coupé %d fois." #: src/chunk.c:822 msgid "Combining channels" msgstr "Combiner les canaux" #: src/chunk.c:1083 msgid "Mixing channels" msgstr "Mixer les canaux" #: src/chunk.c:1471 msgid "Calculating peak level" msgstr "Calcul du niveau maximal" #: src/chunk.c:1542 src/chunk.c:1552 src/chunk.c:1590 src/chunk.c:1600 msgid "Finding zero-crossing" msgstr "Trouver les passages à zéro" #: src/chunk.c:1628 #, c-format msgid "Amplifying (by %3.1f%% / %+.1fdB)" msgstr "Amplification (par %3.1f%% / %+.1fdB)" #: src/chunk.c:1669 msgid "Amplifying" msgstr "Amplification" #: src/chunk.c:1867 #, fuzzy, c-format msgid "The input was clipped %d times during processing." msgstr "L'entrée a été coupée %d fois pour le processus." #: src/configdialog.c:65 msgid "number of recent files" msgstr "nombre de fichiers récents" #: src/configdialog.c:66 msgid "maximum vertical zoom" msgstr "zoom vertical maximum" #: src/configdialog.c:80 msgid "" "Some of the settings you have changed will not be activated until you " "restart the program" msgstr "" "Certains changements ne seront pas effectifs avant que vous ne relanciez le " "programme" #: src/configdialog.c:292 msgid "Colors" msgstr "Couleurs" #: src/configdialog.c:329 msgid "_Preview" msgstr "A_perçu" #: src/configdialog.c:336 src/configdialog.c:1204 msgid "_OK" msgstr "_OK" #: src/configdialog.c:353 msgid "_Cancel" msgstr "_Annuler" #: src/configdialog.c:430 msgid "Browse directory" msgstr "Parcourir le dossier" #: src/configdialog.c:480 msgid "Preferences" msgstr "Préférences" #: src/configdialog.c:539 msgid "Show _time scale by default" msgstr "Montrer l'échelle de _temps par défaut" #: src/configdialog.c:549 msgid "Show _horizontal zoom slider by default" msgstr "Montrer le chariot de zoom _horizontal par défaut" #: src/configdialog.c:559 msgid "Show _vertical zoom slider by default" msgstr "Montrer le chariot de zoom _vertical par défaut" #: src/configdialog.c:569 msgid "Show _speed slider by default" msgstr "Montrer le chariot de vite_sse par défaut" #: src/configdialog.c:579 msgid "Show slider l_abels by default" msgstr "Montrer le chariot d'étiquette par défaut" #: src/configdialog.c:589 msgid "Show playback buffer positio_n by default" msgstr "Montrer la positio_n du tampon de lecture par défaut" #: src/configdialog.c:598 msgid "_Settings" msgstr "Option_s" #: src/configdialog.c:608 msgid "_Keep sound driver opened (to avoid start/stop clicks)" msgstr "" "_Garder le pilote audio ouvert (pour empêcher les clics de démarrage/d'arrêt)" #: src/configdialog.c:617 msgid "_Byte-swap output (try this if playback sounds horrible)" msgstr "Permuter les octets en sortie (à essayer si l'écoute est horri_ble)" #: src/configdialog.c:626 msgid "Play _mono files as stereo" msgstr "Lecture des fichiers _mono comme s'ils étaient stéréo" #: src/configdialog.c:634 msgid "_Update cursor information while playing" msgstr "Mettre à jour les informations du c_urseur lors de la lecture" #: src/configdialog.c:642 msgid "_Keep cursor in center of view when following playback" msgstr "_Garder le curseur au centre de la vue lorsque l'on suit la lecture" #: src/configdialog.c:652 msgid "_Auto-start playback when jumping to mark" msgstr "" "Démarrer _automatiquement la lecture lorsque l'on saute vers un marqueur" #: src/configdialog.c:660 msgid "Enable _variable speed playback" msgstr "Activer la lecture à _vitesse variable" #: src/configdialog.c:669 msgid "Auto-_reset speed" msgstr "_Remettre automatiquement la vitesse" #: src/configdialog.c:676 msgid "Use fast and noisy method" msgstr "Utilisation de la méthode rapide et _bruyante" #: src/configdialog.c:684 msgid "(H')MM:SS.t" msgstr "(H')MM:SS.t" #: src/configdialog.c:685 msgid "(H')MM:SS.mmmm" msgstr "(H')MM:SS.mmmm" #: src/configdialog.c:686 msgid "TimeDisplay|Samples" msgstr "Échantillons" #: src/configdialog.c:687 msgid "Time Code 24fps" msgstr "" #: src/configdialog.c:688 msgid "Time Code 25fps (PAL)" msgstr "" #: src/configdialog.c:689 msgid "Time Code 29.97fps (NTSC)" msgstr "" #: src/configdialog.c:690 msgid "Time Code 30fps" msgstr "" #: src/configdialog.c:703 msgid "_Remember window sizes/positions" msgstr "Se souveni_r de la position et la taille de la fenêtre" #: src/configdialog.c:712 msgid "_Draw waveform a second time with improved quality" msgstr "Tracer la forme _d'onde une deuxième fois avec une meilleure qualité" #: src/configdialog.c:742 msgid "_Remove" msgstr "Supp_rimer" #: src/configdialog.c:750 msgid "_Add" msgstr "_Ajouter" #: src/configdialog.c:757 msgid "_Browse..." msgstr "_Parcourir..." #: src/configdialog.c:764 msgid "_Up" msgstr "Ha_ut" #: src/configdialog.c:772 msgid "_Down" msgstr "_Bas" #: src/configdialog.c:788 msgid "Keep main _window in front after applying effect" msgstr "" "Garder la _fenêtre principale en premier-plan après l'application d'effet" #: src/configdialog.c:804 msgid "_Use floating-point temporary files" msgstr "_Utiliser des fichiers temporaires à virgule flottante" #: src/configdialog.c:813 msgid "Enable _dithering for editing" msgstr "Activer le tramage pour l'é_dition" #: src/configdialog.c:821 msgid "Enable dithering for _playback" msgstr "Activer le tramage _pour la lecture" #: src/configdialog.c:829 msgid "Auto dete_ct driver on each start-up" msgstr "Auto-déte_ction du pilote à chaque démarrage" #: src/configdialog.c:842 msgid "Direct access" msgstr "Accès direct" #: src/configdialog.c:843 msgid "Decompress" msgstr "Décompresser" #: src/configdialog.c:844 msgid "Bypass" msgstr "Court-circuiter" #: src/configdialog.c:855 msgid "Biased" msgstr "Partial" #: src/configdialog.c:856 msgid "Pure-Scaled" msgstr "Purement normalisé" #: src/configdialog.c:873 msgid "Interface" msgstr "Interface" #: src/configdialog.c:874 msgid " Main window " msgstr " Fenêtre principale" #: src/configdialog.c:885 msgid "Number of recent files in File menu: " msgstr "Nombre de fichiers récents dans le menu Fichier :" #: src/configdialog.c:890 msgid " View " msgstr " Affichage" #: src/configdialog.c:901 msgid "Customize co_lors..." msgstr "Personnaliser les cou_leurs..." #: src/configdialog.c:908 msgid " Window contents " msgstr " Contenu de la fenêtre " #: src/configdialog.c:925 msgid "Vertical zoom limit: " msgstr "Limite du zoom vertical : " #: src/configdialog.c:929 msgid "x" msgstr "fois" #: src/configdialog.c:935 msgid "Sound" msgstr "Son" #: src/configdialog.c:936 msgid " Driver options " msgstr " Options du pilote audio " #: src/configdialog.c:944 msgid "_Driver:" msgstr "_Pilote :" #: src/configdialog.c:961 msgid " Fallback format " msgstr " Format par défaut " #: src/configdialog.c:966 msgid "Sample format to try when the sound file's format isn't supported." msgstr "" "Format d'échantillon à utiliser quand le format du fichier audio n'est pas " "supporté." #: src/configdialog.c:978 msgid "Playback" msgstr "Lecture" #: src/configdialog.c:980 msgid " Playback settings " msgstr " Paramètres de lecture " #: src/configdialog.c:992 msgid " Variable speed " msgstr " Vitesse variable " #: src/configdialog.c:1007 src/help.c:38 msgid "Files" msgstr "Fichiers" #: src/configdialog.c:1009 msgid " Temporary file directories " msgstr " Répertoires de fichier temporaire " #: src/configdialog.c:1035 msgid " Temporary file settings " msgstr " Paramètres de fichier temporaire " #: src/configdialog.c:1040 msgid "" "To avoid rounding errors when applying more than one effect on the same " "data, floating-point temporary files can be used. However, this will " "increase disk and CPU usage." msgstr "" "Pour éviter les erreurs d'approximation lors de l'application de plusieurs " "effets à un seul morceau, des fichiers temporaires à virgule flottante " "peuvent être utilisés. Cependant, ceci augmentera l'utilisation du disque et " "du processeur." #: src/configdialog.c:1048 msgid "" "Some versions of libsndfile supports accessing Ogg files without " "decompressing to a temporary file." msgstr "" "Certaines versions de libsoundfile permettent d'accéder à des fichiers Ogg " "sans décompresser vers un fichier temporaire." #: src/configdialog.c:1062 src/help.c:36 msgid "Quality" msgstr "Qualité" #: src/configdialog.c:1064 msgid " Rate conversions " msgstr " Taux de conversions " #: src/configdialog.c:1071 msgid "Varispeed: " msgstr "Vitesse variable : " #: src/configdialog.c:1072 msgid "Speed effect: " msgstr "Effet de vitesse : " #: src/configdialog.c:1079 msgid " Dithering " msgstr " Tramage (dithering) " #: src/configdialog.c:1090 msgid " Sample conversion " msgstr " Conversion d'échantillon " #: src/configdialog.c:1097 msgid "Normalization mode: " msgstr "Mode de normalisation : " #: src/configdialog.c:1104 msgid "Other" msgstr "Autre" #: src/configdialog.c:1106 msgid " Time format " msgstr " Format du temps " #: src/configdialog.c:1115 msgid "Display t_imes as: " msgstr "Aff_icher le temps en : " #: src/configdialog.c:1126 msgid "Times_cale format: " msgstr "Format de l'échelle de temps : " #: src/configdialog.c:1137 msgid " External applications " msgstr " Programmes externes " #: src/configdialog.c:1145 msgid "Mi_xer utility: " msgstr "Utilitaire de mi_xage : " #: src/configdialog.c:1155 msgid "Advanced" msgstr "Avancé" #: src/configdialog.c:1156 msgid " Advanced settings " msgstr " Paramètres avancés " #: src/configdialog.c:1164 msgid "Disk editing _threshold: " msgstr "_Seuil d'édition du disque : " #: src/configdialog.c:1175 msgid "View _quality:" msgstr "_Qualité d'affichage :" #: src/configdialog.c:1181 msgid "samples/pixel" msgstr "échantillons/pixel" #: src/configdialog.c:1187 msgid "Output _buffer size:" msgstr "Taille du ta_mpon de sortie :" #: src/configdialog.c:1193 msgid "bytes" msgstr "octets" #: src/configdialog.c:1218 msgid "_Close" msgstr "_Fermer" #: src/dataformat.c:886 #, c-format msgid "Floating-point (single %s)\n" msgstr "Virgule flottante (simple %s)\n" #: src/dataformat.c:886 src/dataformat.c:888 src/dataformat.c:892 msgid "Big-endian" msgstr "Grand-boutiste" #: src/dataformat.c:886 src/dataformat.c:888 src/dataformat.c:892 msgid "Little-endian" msgstr "Petit-boutiste" #: src/dataformat.c:888 #, c-format msgid "Floating-point (double %s)\n" msgstr "Virgule flottante (double %s)\n" #: src/dataformat.c:890 #, c-format msgid "PCM, %d(%d) bit, %s %s\n" msgstr "" #: src/dataformat.c:891 src/formatselector.c:77 msgid "Signed" msgstr "Signé" #: src/dataformat.c:891 src/formatselector.c:76 msgid "Unsigned" msgstr "Non-signé" #: src/dataformat.c:952 #, fuzzy msgid " Testing ranges..." msgstr " Test les plages..." #: src/dataformat.c:976 msgid "Range test failed for format: " msgstr "Test de plage échoué pour le format : " #: src/dataformat.c:990 #, fuzzy msgid " Testing all conversions.." msgstr " Test toutes les conversions.." #: src/dataformat.c:1032 msgid "(expected) " msgstr "(excepté) " #: src/dataformat.c:1033 msgid "Conversion test failed, between: " msgstr "Test de conversion échoué, entre : " #: src/dataformat.c:1035 msgid " and: " msgstr " et : " #: src/dataformat.c:1112 msgid "No errors detected!" msgstr "Pas d'erreur détecté !" #: src/dataformat.c:1146 msgid "Preparing tests.." msgstr "Préparation des tests.." #: src/dataformat.c:1154 msgid "Running tests.." msgstr "Tests en cours.." #: src/dataformat.c:1196 #, c-format msgid "" "\n" "\n" "Test results (1 time unit = %f usec/sample)\n" msgstr "" "\n" "\n" "Résultats du test (1 unité de temps = %f µsec/échantillon)\n" #: src/datasource.c:366 #, c-format msgid "Couldn't open %s" msgstr "Impossible d'ouvrir %s" #: src/datasource.c:497 msgid "Unexpected end of file" msgstr "Fin de fichier inattendue" #: src/datasource.c:498 #, c-format msgid "Error reading %s: %s" msgstr "Erreur de lecture %s: %s" #: src/datasource.c:515 #, c-format msgid "Error seeking in %s: %s" msgstr "Erreur de recherche dans %s : %s" #: src/effectbrowser.c:99 msgid "Built-in" msgstr "Intégré" #: src/effectbrowser.c:102 msgid "Volume adjust/fade" msgstr "Ajustement/fondu du volume" #: src/effectbrowser.c:104 msgid "Convert samplerate" msgstr "Conversion du taux d'échantillonnage" #: src/effectbrowser.c:106 msgid "Convert sample format" msgstr "Convertir le format de l'échantillon" #: src/effectbrowser.c:108 msgid "Map channels" msgstr "Router les canaux" #: src/effectbrowser.c:110 msgid "Combine channels" msgstr "Combiner les canaux" #: src/effectbrowser.c:113 msgid "Add channels from other file" msgstr "Ajouter des canaux d'un autre fichier" #: src/effectbrowser.c:114 msgid "Speed" msgstr "Vitesse" #: src/effectbrowser.c:115 msgid "Pipe through program" msgstr "Faire passer par le programme" #: src/effectbrowser.c:250 msgid "You have no open file to apply the effect to!" msgstr "Vous n'avez aucun fichier ouvert sur lequel appliqué l'effet !" #: src/effectbrowser.c:275 msgid "This effect could not be loaded." msgstr "Cet effet n'a pas pu être chargé." #: src/effectbrowser.c:582 msgid "/Move Up" msgstr "Monter d'un cran" #: src/effectbrowser.c:583 msgid "/Move Down" msgstr "Descendre d'un cran" #: src/effectbrowser.c:584 msgid "/Move to Top" msgstr "Monter tout en haut" #: src/effectbrowser.c:585 msgid "/Move to Bottom" msgstr "Descendre tout en bas cran" #: src/effectbrowser.c:587 msgid "/Sort by Name" msgstr "Trier par nom" #: src/effectbrowser.c:588 msgid "/Sort by Type" msgstr "Trier par type" #: src/effectbrowser.c:589 msgid "/Sort by Location" msgstr "Trier par emplacement" #: src/effectbrowser.c:590 msgid "/Sort by Author" msgstr "Trier par auteur" #: src/effectbrowser.c:592 msgid "/Restore Order" msgstr "Restorer l'ordre" #: src/effectbrowser.c:593 msgid "/Rebuild Effect List" msgstr "Reconstruire la liste d'effets" # Note de traduction - Olivier 05 décembre 2015 : pas besoin de traduire, c'est traduit automagiquement :) #: src/effectbrowser.c:744 msgid "Top" msgstr "" # Note de traduction - Olivier 05 décembre 2015 : pas besoin de traduire, c'est traduit automagiquement :) #: src/effectbrowser.c:751 msgid "Up" msgstr "" # Note de traduction - Olivier 05 décembre 2015 : pas besoin de traduire, c'est traduit automagiquement :) #: src/effectbrowser.c:758 msgid "Down" msgstr "" # Note de traduction - Olivier 05 décembre 2015 : pas besoin de traduire, c'est traduit automagiquement :) #: src/effectbrowser.c:765 msgid "Bottom" msgstr "" #: src/effectbrowser.c:793 msgid "Close dialog after applying effect" msgstr "Fermer le dialogue après l'application de l'effet" #: src/effectbrowser.c:800 src/gotodialog.c:154 msgid "Apply" msgstr "Appliquer" #: src/effectbrowser.c:808 src/gotodialog.c:159 src/mainwindow.c:1438 #: src/pipedialog.c:165 src/recorddialog.c:610 src/recorddialog.c:987 #: src/sound-esound.c:290 src/sound-jack.c:264 src/sound-oss.c:479 msgid "Close" msgstr "Fermer" #: src/effectbrowser.c:830 src/help.c:35 msgid "Effects" msgstr "Effets" #: src/effectbrowser.c:892 msgid "Apply to: " msgstr "Appliquer à : " #: src/filetypes.c:103 msgid "putenv failed!" msgstr "le putenv a échoué !" #: src/filetypes.c:113 msgid "unsetenv failed!" msgstr "le unsetenv a échoué !" #: src/filetypes.c:155 msgid "Microsoft WAV format" msgstr "Microsoft WAV format" #: src/filetypes.c:181 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: src/filetypes.c:188 msgid "Raw PCM data" msgstr "Raw PCM data" #: src/filetypes.c:190 msgid "Open with MPlayer" msgstr "Ouvrir avec MPlayer" #: src/filetypes.c:275 #, c-format msgid "The file %s does not exist!" msgstr "Le fichier %s n'existe pas !" #: src/filetypes.c:282 #, c-format msgid "The file %s is not a regular file!" msgstr "Le fichier %s n'est pas régulier !" #: src/filetypes.c:294 msgid "Loading" msgstr "Chargement" #: src/filetypes.c:333 #, c-format msgid "" "The file name '%s' has an extension unknown to the program. Please specify " "in which format this file should be saved." msgstr "" "Le fichier %s a une extension inconnue du programme. Essayer de spécifier " "dans quel format le fichier doit être sauvé." #: src/filetypes.c:338 msgid "Unknown file type" msgstr "Type de fichier inconnu" #: src/filetypes.c:389 msgid "Saving" msgstr "Enregistrement" #: src/filetypes.c:393 #, c-format msgid "" "The file %s may be destroyed since the saving failed. Try to free up some " "disk space and save again. If you exit now the file's contents could be in a " "bad state. " msgstr "" "Le fichier %s a pu être détruit car l'enregistrement a échoué. Essayez de " "libérer de l'espace disque et retenter l'opération. Si vous quittez le " "programme maintenant le fichier risque d'être en mauvais état. " #: src/filetypes.c:457 #, c-format msgid "%s is not a valid wav file" msgstr "%s n'est pas un fichier wav valide" #: src/filetypes.c:472 #, c-format msgid "" "The file %s is a compressed wav file. This program can only work with " "uncompressed wav files." msgstr "" "Le fichier %s est un fichier wav compressé. Ce programme ne peut fonctionner " "qu'avec des fichiers non-compressés." #: src/filetypes.c:593 msgid "" "On this system, libsndfile is required to save floating-point wav files." msgstr "" "Sur ce système, la bibliothèque libsndfile est requise pour sauvegarder des " "fichiers wav à virgule flottante." #: src/filetypes.c:616 msgid "" "You are saving a wav file larger than 2048MB. Such large files are non-" "standard and may not be readable by all programs.\n" "\n" " (this warning will not be displayed again)" msgstr "" "Vous être en train de sauvegarder un fichier wav plus grand que 2048 Mo. Des " "fichiers aussi volumineux ne sont standard, et pouraient ne pas être " "lisibles par d'autres programmes.\n" "\n" " (cet avertissement ne sera plus jamais affiché)" #: src/filetypes.c:732 src/filetypes.c:877 #, c-format msgid "Failed to open '%s'!" msgstr "Impossible d'ouvrir '%s' !" #: src/filetypes.c:849 msgid "Invalid sample format or number of channels for this file format" msgstr "" "Format d'échantillonage ou nombre de canaux invalide pour ce format de " "fichier" #: src/filetypes.c:943 #, c-format msgid "Failed to write to '%s'!" msgstr "Impossible d'écrire '%s' !" #: src/filetypes.c:1028 msgid "Decoding" msgstr "Décodage" #: src/filetypes.c:1149 msgid "Variable bitrate (default)" msgstr "Débit binaire variable (défaut)" #: src/filetypes.c:1150 msgid "Average bitrate" msgstr "Débit binaire moyen" #: src/filetypes.c:1151 msgid "Constant bitrate" msgstr "Débit binaire constant" #: src/filetypes.c:1152 msgid "Custom argument" msgstr "Argument personnalisé" #: src/filetypes.c:1156 msgid "Standard (high quality)" msgstr "Standard (haut qualité)" #: src/filetypes.c:1157 msgid "Extreme (higher quality)" msgstr "Extrême (meilleure qualité)" #: src/filetypes.c:1158 msgid "Insane (highest possible quality)" msgstr "Dément (plus grande qualité possible)" #: src/filetypes.c:1176 #, c-format msgid "%s kbit/s" msgstr "" #: src/filetypes.c:1205 msgid "MP3 Preferences" msgstr "Préférences MP3" #: src/filetypes.c:1216 msgid "Encoding type: " msgstr "Type d'encodage :" #: src/filetypes.c:1229 msgid "Quality: " msgstr "Qualité : " #: src/filetypes.c:1238 msgid "Custom argument: " msgstr "Argument personnalisé : " #: src/filetypes.c:1244 msgid "Use this setting by default" msgstr "Utiliser ces paramètres par défaut" #: src/filetypes.c:1249 src/gotodialog.c:146 src/mainwindow.c:1509 #: src/rawdialog.c:101 src/sound-alsalib.c:98 src/sound-esound.c:286 #: src/sound-jack.c:260 src/sound-oss.c:475 src/um.c:109 src/um.c:142 #: src/um.c:341 src/um.c:449 msgid "OK" msgstr "OK" #: src/filetypes.c:1257 src/rawdialog.c:107 src/sound-alsalib.c:102 #: src/um.c:133 src/um.c:150 src/um.c:347 src/um.c:458 msgid "Cancel" msgstr "Annuler" #: src/float_box.c:184 src/int_box.c:184 #, c-format msgid "'%s' is not a number!" msgstr "'%s' n'est pas un nombre !" #: src/float_box.c:202 #, c-format msgid "Value for '%s' must be a number between %f and %f" msgstr "La valeur de '%s' doit être comprise entre %f et %f" #: src/formatselector.c:60 msgid "Sample type: " msgstr "Type d'échantillon : " #: src/formatselector.c:62 msgid "8 bit PCM" msgstr "" #: src/formatselector.c:63 msgid "16 bit PCM" msgstr "" #: src/formatselector.c:64 msgid "24 bit PCM" msgstr "" #: src/formatselector.c:65 msgid "32 bit PCM" msgstr "" #: src/formatselector.c:66 msgid "Floating-point, single" msgstr "Virgule flottante, simple" #: src/formatselector.c:67 msgid "Floating-point, double" msgstr "Virgule flottante, double" #: src/formatselector.c:74 msgid "Signedness: " msgstr "Mode Signé : " #: src/formatselector.c:82 msgid "Endianness: " msgstr "Boutisme : " #: src/formatselector.c:84 msgid "Little endian" msgstr "Petit boutiste" #: src/formatselector.c:85 msgid "Big endian" msgstr "Grand boutiste" #: src/formatselector.c:90 msgid "Alignment:" msgstr "Alignement :" #: src/formatselector.c:92 msgid "Packed" msgstr "Compact" #: src/formatselector.c:93 msgid "Top bytes" msgstr "Octets du haut" #: src/formatselector.c:94 msgid "Bottom bytes" msgstr "Octets du bas" #: src/formatselector.c:130 msgid "Channels: " msgstr "Canaux : " #: src/formatselector.c:139 msgid "Sample rate: " msgstr "Taux d'échantillonnage : " #: src/formatselector.c:226 msgid "sample rate" msgstr "taux d'échantillonnage" #: src/gotodialog.c:102 msgid "Place cursor " msgstr "Placer le curseur " #: src/gotodialog.c:107 src/sound-esound.c:274 msgid "seconds" msgstr "secondes" #: src/gotodialog.c:111 src/soxdialog.c:487 msgid "samples" msgstr "échantillons" #: src/gotodialog.c:115 msgid "after beginning of file" msgstr "après le début du fichier" #: src/gotodialog.c:120 msgid "after end of file" msgstr "après la fin du fichier" #: src/gotodialog.c:125 msgid "after current cursor position" msgstr "après la position actuelle du curseur" #: src/gotodialog.c:130 msgid "after selection start" msgstr "après le début de la sélection" #: src/gotodialog.c:135 msgid "after selection end" msgstr "après la fin de la sélection" #: src/gotodialog.c:139 msgid "" "(use a negative number to place the cursor before instead of after the " "selected point)" msgstr "" "(utilisez un nombre négatif pour placer le curseur avant au lieu d'après le " "point sélectionné)" #: src/gotodialog.c:178 msgid "Position cursor" msgstr "Positionner le curseur" #: src/gtkfiles.c:48 #, c-format msgid "Could not open %s: %s" msgstr "Impossible d'ouvrir %s : %s" #: src/gtkfiles.c:53 #, c-format msgid "Warning: Unexpected error: %s" msgstr "Attention : Erreur inconnue : %s" #: src/gtkfiles.c:110 src/gtkfiles.c:125 #, c-format msgid "Error closing %s: %s" msgstr "Erreur en fermant %s : %s" #: src/gtkfiles.c:140 #, c-format msgid "Could not seek in %s: %s" msgstr "Impossible de rechercher dans %s : %s" #: src/gtkfiles.c:159 src/gtkfiles.c:204 #, c-format msgid "Could not read from %s: %s" msgstr "Impossible de lire depuis %s : %s" #: src/gtkfiles.c:178 #, c-format msgid "Unexpected end of file reading from %s" msgstr "Fin du fichier inattendue en lisant depuis %s" #: src/gtkfiles.c:196 #, c-format msgid "Unable to write data to %s" msgstr "Impossible d'écrire des données dans %s" #: src/gtkfiles.c:262 #, c-format msgid "Could not get file position in %s: %s" msgstr "Impossible d'obtenir la position du fichier dans %s : %s" #: src/gtkfiles.c:313 src/gtkfiles.c:473 msgid "File already exists. Overwrite?" msgstr "Le fichier existe déjà. Écraser ?" #: src/gtkfiles.c:321 msgid "No file with that name!" msgstr "Pas de fichier avec ce nom !" #: src/gtkfiles.c:705 #, c-format msgid "Error reading from %s: %s" msgstr "Erreur de lecture depuis %s : %s" #: src/gtkfiles.c:737 #, c-format msgid "Could not remove '%s': %s" msgstr "Impossible de supprimer '%s' : %s" #: src/gtkfiles.c:757 #, c-format msgid "Error creating link to '%s': %s" msgstr "Impossible de créer de lien vers '%s' : %s" #: src/help.c:30 msgid "General" msgstr "Général" #: src/help.c:31 msgid "Sample view" msgstr "Vue de l'échantillon" #: src/help.c:32 msgid "Playing" msgstr "Lecture" #: src/help.c:33 msgid "Recording" msgstr "Enregistrement" #: src/help.c:34 msgid "Editing" msgstr "Édition" #: src/help.c:37 msgid "File formats" msgstr "Formats de fichier" #: src/help.c:39 msgid "Keyboard shortcuts" msgstr "Raccourcis clavier" #: src/help.c:40 msgid "Bug reporting" msgstr "Rapport de bogue" #: src/help.c:41 msgid "Helping out" msgstr "Aider" #: src/help.c:42 msgid "Contact" msgstr "Contact" #: src/help.c:47 #, no-c-format msgid "" "mhWaveEdit is a graphical program for editing sound files. It is completely " "free (GPL).\n" msgstr "" "mhWaveEdit est un programme graphique d'édition de fichiers audio. Il est " "complètement libre (GPL).\n" #: src/help.c:49 #, no-c-format msgid "You can find the latest release of mhWaveEdit at:\n" msgstr "Vous pouvez trouver la dernière version de mhWaveEdit à l'adresse :\n" #: src/help.c:50 #, no-c-format msgid "http://gna.org/projects/mhwaveedit/\n" msgstr "" #: src/help.c:55 #, no-c-format msgid "" "The area where you 'see' the contents of the file you are editing, is called " "the 'sample view'. \n" msgstr "" "La partie où vous 'voyez' le contenu du fichier que vous édité, est appelée " "'la vue de l'échantillon'.\n" #: src/help.c:57 #, no-c-format msgid "" "In the sample view there is a grey vertical bar called the 'cursor'. The " "cursor follows the sound wave when you play the sound. You can position the " "cursor by clicking with the right (2:nd) mouse button. If you do this while " "you're playing a file, the playing will continue from the new cursor " "position. You can also position the cursor more exact by using the 'Position " "Cursor...' command on the Edit menu.\n" msgstr "" "Dans cette vue de l'échantillon, se trouve une barre verticale grise appelée " "le 'curseur'. Ce curseur suit l'onde sonore du son lorsque vous la jouez. " "Vous pouvez positionner le curseur en cliquant avec le bouton droit " "(deuxième bouton) de la souris. Si vous faites ceci pendant la lecture d'un " "fichier, la lecture continuera à partir de la nouvelle position du curseur. " "Vous pouvez également positionner le curseur plus précisement grâce à " "'Positionner le curseur...' dans le menu du Curseur.\n" #: src/help.c:59 #, no-c-format msgid "" "You can place marks in your file by holding down Ctrl and pressing a number " "from 0 to 9. This will place a mark (green vertical bar) with the same " "number at the current cursor position. You can later make the cursor go to " "that position again by just pressing the number. Setting and jumping to " "marks can be done while playing. To remove a mark, jump to the mark and set " "it again.\n" msgstr "" "Vous pouvez placer des marqueurs dans votre fichier en maintenant la touche " "'Control' et en pressant un chiffre de 0 à 9. Ceci placera un marqueur " "(barre verticale de couleur verte) avec le chiffre utilisé, à la position " "actuelle du curseur. Vous pourrez ultérieurement déplacer le curseur vers " "cette position en appuyant simplment sur le chiffre s'y attachant. Tout ceci " "peut être fait pendant la lecture. Pour enlever un marqueur, positionnez " "vous à ce marqueur, et faites pareil que pour en ajouter un.\n" #: src/help.c:64 #, no-c-format msgid "" "Playing a file is simple, just load the file and press the play button. The " "green play button plays from the current position. The yellow play button " "plays the current selection, or the entire file if nothing is selected. Stop " "the playback with the stop button (with the red square). \n" msgstr "" "Lire un fichier est simple, chargez le fichier et pressez sur le bouton de " "lecture. Le bouton de lecture vert sert à lire depuis la position du " "curseur. Le bouton de lecture jaune lit la sélection courante, ou le fichier " "entier si rien n'est sélectionné. Pour arrêter la lecture, utilisez le " "bouton Stop (le carré rouge).\n" #: src/help.c:66 #, no-c-format msgid "" "The playback speed can be varied by adjusting the slider to the far right. \n" msgstr "" "La vitesse de lecture peut être variée en ajustant le chariot tout à " "droite.\n" #: src/help.c:68 #, no-c-format msgid "You can do normal editing while the file is playing.\n" msgstr "Vous pouvez continuer à éditer normalement pendant la lecture.\n" #: src/help.c:73 #, no-c-format msgid "" "Recording is done with 'Record...' on the Play menu, or the Record button " "(the red circle). A dialog box will pop up where you can select what format " "you want to record in. After selecting the format, meters and numbers will " "appear showing info about the volume level of the sound input. \n" msgstr "" "L'enregistrement se fait grâce à 'Enregistrer...' dans le menu 'Lire', ou le " "bouton d'enregistrement (le rond rouge). Une boîte de dialogue s'ouvre alors " "où vous pouvez sélectionner dans quel format vous voulez enregistrer. Après " "avoir sélectionné le format, des informations chiffrées et VU-mètres " "apparaîtront affichant des informations à propos du niveau de volume de " "l'entrée audio.\n" #: src/help.c:75 #, no-c-format msgid "" "When you want to start recording, press the \"Start recording\" button. When " "you've recorded everything you wanted to, press the Finish button and the " "record dialog will disappear and newly recorded sound will show up in a new " "window.\n" msgstr "" "Lorsque vous voulez commencer l'enregistrement, pressez le bouton \"Démarrer " "l'enregistrement\". Lorsque vous avez enregistré tout ce que vous vouliez, " "pressez le bouton 'Terminer' et la boîte de dialogue disparaîtra, puis le " "son nouvellement enregistré apparaîtra alors dans une nouvelle fenêtre.\n" #: src/help.c:77 #, no-c-format msgid "" "Currently it is impossible to play and record at the same time, so the " "playback will stop when you record.\n" msgstr "" "Actuellement, il est impossible de lire et d'enregistrer en même temps, et " "donc la lecture s'interrompra si vous enregistrez.\n" #: src/help.c:82 #, no-c-format msgid "" "You make selections by dragging the mouse over the sample view. You can hear " "what you've currently selected by clicking on the \"play selection\" button " "(the button with the yellow arrow) or by selecting 'Play selection' from the " "Play menu.\n" msgstr "" "Les sélections se font en cliquant-droit/glissant/relâchant la souris dans " "la vue de l'échantillon. Vous pouvez entendre ce que vous avez actuellement " "sélectionné en cliquant sur le bouton \"Lire la sélection\" (le bouton avec " "une flèche jaune) ou en sélectionnant 'Lire la sélection' depuis le menu " "Lire.\n" #: src/help.c:84 #, no-c-format msgid "" "You can use the cursor to refine the selection. Use the 'Selection start at " "cursor' and 'Selection end at cursor' buttons to move the selection starting " "point or the selection end point to the current cursor position. You can " "also drag the selection endpoints using the mouse.\n" msgstr "" "Vous pouvez utiliser le curseur pour définir précisément la sélection. " "Utilisez les boutons 'Définir le début de la sélection au curseur' et " "'Définir la fin de la sélection au curseur' pour déplacer les positions de " "début ou de fin à la position actuelle du curseur. Vous pouvez également " "faire glisser les points extrêmes de la sélection grâce à la souris.\n" #: src/help.c:86 #, no-c-format msgid "The 'Cut' and 'Copy' functions work like in any other software. \n" msgstr "" "Les fonctions 'Couper' et 'Copier' fonctionnent comme dans tout autre " "logiciel.\n" #: src/help.c:88 #, no-c-format msgid "" "The 'Paste' function insert the clipboard contents at the cursor position. " "The 'Paste over' function works like 'Paste', except that it overwrites the " "data after the insert position. \n" msgstr "" "La fonction 'Coller' insère le contenu du presse-papier à la position du " "curseur. La fonction 'Coller par dessus' fonctionne comme 'Coller', excepté " "qu'elle écrit par dessus les données après le point d'insertion.\n" #: src/help.c:90 #, no-c-format msgid "" "The 'Paste mix' function combines the clipboard data with the data at the " "cursor position.\n" msgstr "" "La fonction 'Coller mixte' combine les données du presse-papier avec celles " "à la position du curseur.\n" #: src/help.c:92 #, no-c-format msgid "" "The 'Paste as new' function opens a new window and puts the clipboard " "contents into it. \n" msgstr "" "La fonction 'Coller comme nouveau' ouvre une nouvelle fenêtre et y met le " "contenu du presse-papier.\n" #: src/help.c:94 #, no-c-format msgid "" "The 'Crop' function deletes all parts of the file that are not selected.\n" msgstr "" "La fonction 'Rogner' efface les parties non-sélectionnées du fichier.\n" #: src/help.c:96 #, no-c-format msgid "" "The 'Silence selection' function replaces the selected part with silence. To " "avoid clicks, the silent part is a line that meets the wave at the " "endpoints.\n" msgstr "" "La fonction 'Remplacer la sélection en silence' remplace la partie " "sélectionnée en silence. Pour éviter les clics audio, la partie silencieuse " "est une ligne correspondant à la position des ondes sonores aux points de " "début et de fin. \n" #: src/help.c:98 #, no-c-format msgid "" "All editing functions work non-destructively, that is, the file you're " "editing isn't actually changed until you save it (the effects also work this " "way).\n" msgstr "" "Toutes les fonctions d'édition sont non-destructives, ce qui veut dire que " "le fichier original que vous éditez n'est pas altéré tant que vous ne le " "sauvegardez pas (les effets fonctionnent également de la sorte).\n" #: src/help.c:104 #, no-c-format msgid "" "mhWaveEdit has a few simple effects, which are available from the 'Effects' " "menu. \n" msgstr "" "mhWaveEdit possède quelques effets de base, qui sont disponibles à partir du " "menu 'Effets'.\n" #: src/help.c:106 #, no-c-format msgid " * Fade in/out\n" msgstr " * Fondus entrant/sortant\n" #: src/help.c:108 #, no-c-format msgid " This creates a linear fade in or fade out effect.\n" msgstr " Ceci crée un effet de fondu linéaire entrant ou sortant. \n" #: src/help.c:110 #, no-c-format msgid " * Normalize, Normalize to...\n" msgstr " * Normalisation, Normalisation à...\n" #: src/help.c:112 #, no-c-format msgid "" " This amplifies the sound as much as possible without getting clipping " "distortion. The \"Normalize to...\" item lets you specify which level to " "normalize to.\n" msgstr "" " Ceci amplifie le son autant que possible sans avoir d'artefact de " "distorsions. L'élément \"Normalisation à...\" vous permet de spécifier à " "quel niveau vous désirez normaliser.\n" #: src/help.c:114 #, no-c-format msgid " * Volume adjust/fade...\n" msgstr " * Ajustement/fondu du volume...\n" #: src/help.c:116 #, no-c-format msgid "" " This effect lets you select a starting volume and a ending volume and " "amplifies the selection fading from the starting volume to the ending " "volume.\n" msgstr "" " Cet effet vous laisse sélectionner un volume de départ et un volume de " "fin, et amplifie le fondu de la sélection, du volume de départ au volume de " "fin.\n" #: src/help.c:118 #, no-c-format msgid "" " Note that volumes above 100% may cause sound distortion. Use the 'Find " "top volume' to find out the maximum amplification possible without " "distortion. (You can use this for normalizing samples.) \n" msgstr "" " Notez qu'un volume supérieur à 100% pourrait causer des distorsions du " "son. Utilisez le 'Trouver le volume haut' pour déterminer l'amplification " "maximale possible sans distorsion. (Vous pouvez utiliser ceci pour " "normaliser des échantillons.)\n" #: src/help.c:120 #, no-c-format msgid "" " By setting starting volume and ending volume to the same value you get a " "simple amplification of the sound. \n" msgstr "" " En paramétrant un volume de départ et un volume de fin à la même valeur, " "vous obtenez une simple amplification du son.\n" #: src/help.c:122 #, no-c-format msgid " * Convert samplerate...\n" msgstr " * Convertir le taux d'échantillonnage..\n" #: src/help.c:124 #, no-c-format msgid "" " This converts the samplerate of the entire file to one you specify. There " "are different methods for doing this, usually the one in the top has the " "best quality but can take longer than the other methode.\n" msgstr "" " Ceci convertit le taux d'échantillonnage du fichier entier au taux que " "vous spécifiez. Il existe différentes méthodes pour faire cela, " "habituellement la première du haut possède la meilleure qualité mais peut " "prendre plus longtemps que l'autre méthode.\n" #: src/help.c:126 #, no-c-format msgid " * Convert sample format...\n" msgstr " * Convertit le format de l'échantillon...\n" #: src/help.c:128 #, no-c-format msgid " This converts the sample format of the entire file.\n" msgstr " Ceci convertit le format d'échantillon du fichier entier.\n" #: src/help.c:130 #, no-c-format msgid "" " The 'Don't actually change the data' option can be used if the program " "was wrong about the file's format.\n" msgstr "" " L'option 'Ne pas réellement changer les données' peut être utilisée si le " "programme s'est trompé à propos du format de fichier.\n" #: src/help.c:132 #, no-c-format msgid " * Byte swap\n" msgstr " * Permuter les octets\n" #: src/help.c:134 #, no-c-format msgid "" " This \"byte swaps\" the selected part. It can be used to repair damaged " "files where the byte order is wrong. Note that if the sound looks alright " "but plays wrong, you should not use this option, instead you should use the " "\"byte-swap output\" option in the Preferences dialog.\n" msgstr "" " Ceci \"permute les octets\" de la partie sélectionnée. Il peut-être " "utilisé pour réparer des fichiers endommagés où l'ordre des octets est " "mauvais. Notez que si le son paraît correct mais se joue bizarrement, vous " "ne devriez pas utiliser cette option, et devriez choisir à la place l'option " "\"Permuter les octets en sortie\" dans la boîte de dialogue des " "'Préférences'-> onglet 'Son'.\n" #: src/help.c:136 #, no-c-format msgid " * Mix to mono\n" msgstr " * Mixer vers mono\n" #: src/help.c:138 #, no-c-format msgid " This mixes all channels of the file together to a mono sound.\n" msgstr "" " Ceci mixe ensemble tous les canaux du fichier vers de l'audio mono.\n" #: src/help.c:140 #, no-c-format msgid " * Add channel\n" msgstr " * Ajouter un canal\n" #: src/help.c:142 #, no-c-format msgid "" " This copies the first channel to a new channel in the sound, converting " "mono to stereo etc.\n" msgstr "" " Ceci copie le premier canal vers un nouveau canal dans l'audio, " "convertissant ainsi de mono vers stéréo etc.\n" #: src/help.c:144 #, no-c-format msgid " * Map channels...\n" msgstr " * Router les canaux...\n" #: src/help.c:145 #, no-c-format msgid " \n" msgstr " \n" #: src/help.c:146 #, no-c-format msgid "" " With this effect, you can change the number of channels in the file. You " "can also rearrange and add (i.e. mix) channels.\n" msgstr "" " Avec cet effet, vous pouvez changer le nombre de canaux dans le fichier " "Vous pouvez également ré-arranger et ajouter (c'est à dire mixer) les " "canaux.\n" #: src/help.c:148 #, no-c-format msgid " * Combine channels...\n" msgstr " * Combiner les canaux...\n" #: src/help.c:150 #, no-c-format msgid "" " This effect lets you create a new sound by a linear combination of the " "old channels. This means you can do channel mixing / swapping / balance / " "panning / amplification etc. by entering different values. For example, to " "swap the left and right channel, you select that the new Channel 1 should be " "0% of the old Channel 1 and 100% of the old Channel 2, and the new Channel 2 " "should be 100% of the old Channel 1 and 0% of the old Channel 2 \n" msgstr "" " Cet effet vous permet de créer un nouveau son par une combinaision " "linéaire des anciens canaux. Ceci signifie que vous pouvez mixer / " "permuter / amplifier / balancer / étendre / amplifier etc. en entrant " "différentes valeurs. Par exemple, pour permuter le canal de droite et celui " "de gauche, vous définissez que le nouveau Canal 1 devrait être à 0% du vieux " "Canal 1, et 100% du vieux Canal 2, et le nouveau Canal 2 devrait être à 100% " "du vieux canal 1 et 0% du vieux canal 2.\n" #: src/help.c:152 #, no-c-format msgid " * Speed adjustment...\n" msgstr " * Ajustement de vitesse...\n" #: src/help.c:154 #, no-c-format msgid "" " This effect changes the speed of the selection. The tone will change as " "well.\n" msgstr "" " Cet effet modifie la vitesse de la sélection. La tonalité changera " "également.\n" #: src/help.c:155 #, no-c-format msgid " * Pipe through program...\n" msgstr " * Envoyer à travers le programme...\n" #: src/help.c:156 #, no-c-format msgid " \n" msgstr " \n" #: src/help.c:157 #, no-c-format msgid "" " This effect is for advanced users wanting to pipe raw audio data through " "an external program. The output of the program is read back and replaces the " "processed part. \n" msgstr "" " Cet effet est pour les utilisateurs avancés qui veulent envoyer les " "données audio brute (raw) vers un programme externe. La sortie du program " "est relue et remplacée par la partie traitée. \n" #: src/help.c:159 #, no-c-format msgid "" "mhWaveEdit supports LADSPA effects and can also make use of most of the SoX " "utility's effects. To find the LADSPA plugins the environment variable " "LADSPA_PATH must be properly set up. \n" msgstr "" "mhWaveEdit supporte les effets LADSPA et peut aussi utiliser la plupart des " "effets de l'utilitaire SoX. Pour trouver les greffons LADSPA, la variable " "d'environnement LADSPA_PATH doit être correctement paramétrée.\n" #: src/help.c:161 #, no-c-format msgid "" "All supported effects can be found by choosing the 'Effects...' menu item. " "The effects are listed with names beginning with [B] for builtin effects, " "[L] for LADSPA effects, and [S] for SoX effects.\n" msgstr "" "Tous les effets supportés peuvent être trouvés en choisissant l'élément de " "menu 'Effets...'. Les effets sont listés avec des noms commencant par [B] " "pour les effets intégrés à mhWaveEdit (NdT : B pour Builtin), [L] pour les " "effets LADSPA, et [S] pour les effets SoX.\n" #: src/help.c:167 #, no-c-format msgid "Some notes on sound quality.\n" msgstr "Quelques notes sur la qualité du son.\n" #: src/help.c:169 #, no-c-format msgid "" "The general rule when doing audio editing/processing is to not manipulate " "the data more than necessary and keep an original copy whenever you're " "processing your important files. \n" msgstr "" "La règle générale lorsque l'on édite/traite une piste audio est de ne pas " "manipuler les données plus que de nécessaire, et de garder toujours une " "copie de l'original lorsque vous travaillez sur vos fichiers importants.\n" #: src/help.c:171 #, no-c-format msgid "" "Cut, copy and paste operations move the data around without modifying it, so " "these don't degrade the sound quality. Because of level differences, you may " "get a \"step\" at the start and end of the inserted part, which can cause a " "small clicking sound. \n" msgstr "" "Les opérations couper, copier et coller déplacent les données sans les " "modifier, donc ces opérations ne dégradent pas la qualité audio. En raison " "des différences de niveau, il est possible que vous entendiez un \"pas\" au " "début et à la fin de la partie insérée, ce qui peut causer un son qui " "clique.\n" #: src/help.c:173 #, no-c-format msgid "" "The mix paste function doesn't decrease quality, unless the peaks become too " "high and you get clipping. In that case you will get a warning message.\n" msgstr "" "La fonction coller mixte ne diminue pas la qualité, sauf si les pics " "deviennent trop haut et que vous obteniez donc des coupures. Dans ce cas, " "vous serez averti par un message d'alerte.\n" #: src/help.c:175 #, no-c-format msgid "" "Sound data is normally stored as integer values. Therefore, whenever you " "normalize, adjust volume, decrease sample size or filter a sound, the result " "must be rounded. If you use 24 or 32 bit sample sizes, this is not really a " "problem, but if you use 8 or 16 bits sample size, this rounding causes a " "decrease in quality. \n" msgstr "" "Les données audio sont normalement enregistrées en valeur entière. De ce " "fait, lorsque vous normalisez, ajustez le volume, diminuez la taille de " "l'échantillon ou filtrez un son, il est normal que le résultat soit arrondi. " "Si vous utilisez des tailles d'échantillonage de 24 ou 32 bit, ça ne causera " "pas vraiment de problème, mais si vous utilisez des tailles d'échantillon de " "8 ou 16 bits, cet arrondi provoque une diminution de la qualité.\n" #: src/help.c:177 #, fuzzy, no-c-format msgid "" "The quality decrease that the rounding causes can be masked by adding a " "small amount of noise before rounding. This is called \"dithering\". " "mhWaveEdit supports basic dithering and it's enabled by default.\n" msgstr "" "Cette diminution de qualité peut être masquée en ajoutant une petite " "quantité de bruit avant d'opérer l'arrondi. Ceci est appelé \"le tramage" "\" (NdT : \"dithering\"). mhWaveEdit supporte le tramage basique et il est " "activé par défaut.\n" #: src/help.c:179 #, no-c-format msgid "" "By default, mhWaveEdit uses floating-point temporary files for storing " "processed results to avoid rounding until the file is saved.\n" msgstr "" "Par défaut, mhWaveEdit utilise des fichiers temporaires à virgules " "flottantes pour stocker les résultats des traitements pour éviter les " "arrondis jusqu'à ce que le fichier soit sauvé.\n" #: src/help.c:184 #, no-c-format msgid "" "Even if mhWaveEdit was originally built for editing wav files, it's also " "possible to load and save in a few other formats. mhWaveEdit always supports " "wav and raw files, but if it's compiled with the libsndfile library, " "mhWaveEdit supports a couple of other formats as well. \n" msgstr "" "Même si mhWaveEdit ait été pensé originellement pour éditer des fichiers " "wav, il est également possible de charger et sauver dans quelques autres " "formats. mhWaveEdit supporte toujours les wav et les fichiers au format brut " "(raw) mais s'il est construit avec la bibliothèque libsndfile, mhWaveEdit " "supporte un bon nombre d'autres formats également.\n" #: src/help.c:186 #, no-c-format msgid "" "To save a file with a different file format, use \"Save as...\" and choose a " "format in the file type selection box. \n" msgstr "" "Pour sauvegarder un fichier sous un autre format de fichier, utilisez " "\"Sauvegarder sous...\" et choisissez un format dans la boîte de sélection " "de type de fichier. \n" #: src/help.c:188 #, no-c-format msgid "" "mhWaveEdit has basic support for mp3 and ogg formats. For this to work you " "need to have LAME installed for mp3 support, and OggDec/OggEnc for Ogg " "support. If you have these programs, you can open and save mp3/ogg files " "just like any other file format.\n" msgstr "" "mhWaveEdit possède un support basique pour les formats mp3 et ogg. Pour que " "cela fonctionne, vous avez besoin que le programme LAME soit installé pour " "les mp3, et OggDec/OggEnc pour le support des Ogg. Si vous avez ces " "programmes, vous pouvez ouvrir et sauvegarder des fichiers mp3/ogg de la " "même façon que n'importe quel autre format de fichier.\n" #: src/help.c:190 #, no-c-format msgid "" "If mplayer is installed, mhwaveedit can open all formats that it supports, " "for example the soundtrack of a video file. Since mplayer is only a player, " "these files can not be saved back after editing, you have to save the file " "into a supported format.\n" msgstr "" "Si mplayer est installé, mhwaveedit peut ouvrir tout les formats qu'il " "supporte, par exemple les pistes audio d'un fichier vidéo. Puisque mplayer " "est seulement un lecteur, ces fichiers ne peuvent pas être re-sauvegardés " "directement après l'édition, vous devrez sauvegarder le fichier dans un " "format supporté.\n" #: src/help.c:195 #, no-c-format msgid "" "mhWaveEdit creates a directory ~/.mhwaveedit where it stores configuration " "information. \n" msgstr "" "mhWaveEdit crée un répertoire ~/.mhwaveedit où il enregistre les " "informations de configuration. \n" #: src/help.c:197 #, no-c-format msgid "" "The configuration file is called config. It can be hand edited, but the " "easiest way is through 'Preferences' on the Edit menu.\n" msgstr "" "Le fichier de configuration est appelé config. Il peut édité avec un éditeur " "de texte, mais la manière la plus simple est de passer par 'Préférences' du " "menu 'Édition'.\n" #: src/help.c:199 #, no-c-format msgid "" "Each mhwaveedit process creates a session file in the .mhwaveedit directory " "called mhwaveedit-session---, where is the " "session ID number and is a character code showing the state of the " "session ('r' for running sessions). \n" msgstr "" "Chaque traitement de mhwaveedit crée un fichier de session dans le " "répertoire .mhwaveedit appelé mhwaveedit-session---, où " " est le numéro d'identification de la session et est un " "code de caractère montrant l'état de la session ('r' pour session en cours - " "NdT : Running en anglais). \n" #: src/help.c:201 #, no-c-format msgid "" "Temporary files are by default also stored in the ~/.mhwaveedit directory. " "Which directories to use can be set through the preferences dialog. To get " "the best performance, you should have one temporary directory for each local " "filesystem. The temporary files have names of the form \"mhwaveedit-temp-" "-nnnn-\". Do NOT open or remove temporary files with the same " "pid number as a currently running mhWaveEdit.\n" msgstr "" "Les fichiers temporaires sont stockés par défaut dans le dossier ~/." "mhwaveedit. Les dossiers à utiliser peuvent être modifiés dans le dialogue " "des Préférences. Pour obtenir la meilleure performance, vous devriez " "configurer un répertoire temporaire pour chaque système de fichier local. " "Les fichiers temporaires ont des noms de la forme \"mhwaveedit-temp--" "nnnn-\". NE PAS ouvrir ou supprimer les fichiers temporaires qui " "ont le même pid que l'application mhWaveEdit en cours.\n" #: src/help.c:203 #, no-c-format msgid "" "mhWaveEdit checks on startup for leftover temporary files and lets the user " "open them. After opening a crashed session, the files can be saved or thrown " "away.\n" msgstr "" "mhWaveEdit vérifie au démarrage s'il y a des restes de fichiers et permet à " "l'utilisateur de les ouvrir. Après l'ouverture d'une session plantée, les " "fichiers peuvent être sauvegardés ou jetés à la poubelle.\n" #: src/help.c:208 #, no-c-format msgid "F1 Help\n" msgstr "F1 Aide\n" #: src/help.c:209 #, no-c-format msgid "F12 Record\n" msgstr "F12 Enregistrer\n" #: src/help.c:211 #, no-c-format msgid "Ctrl+(number) Set mark\n" msgstr "Ctrl+(nombre) Définir un marqueur\n" #: src/help.c:212 #, no-c-format msgid "(number) Goto mark\n" msgstr "(nombre) Aller à un marqueur\n" #: src/help.c:214 #, no-c-format msgid "Ctrl+P Preferences\n" msgstr "Ctrl+P Préférences\n" #: src/help.c:215 #, no-c-format msgid "Ctrl+E Effects\n" msgstr "Ctrl+E Effets\n" #: src/help.c:217 #, no-c-format msgid "Ctrl+O Open file\n" msgstr "Ctrl+O Ouvrir un fichier\n" #: src/help.c:218 #, no-c-format msgid "Ctrl+S Save file\n" msgstr "Ctrl+S Sauvegarder un fichier\n" #: src/help.c:219 #, no-c-format msgid "Ctrl+U Save selection as\n" msgstr "Ctrl+U Sauvegarder la sélection sous\n" #: src/help.c:221 #, no-c-format msgid "Ctrl+C Copy\n" msgstr "Ctrl+C Copier\n" #: src/help.c:222 #, no-c-format msgid "Ctrl+X Cut\n" msgstr "Ctrl+X Couper\n" #: src/help.c:223 #, no-c-format msgid "Ctrl+D Delete\n" msgstr "Ctrl+D Effacer\n" #: src/help.c:224 #, no-c-format msgid "Delete Delete\n" msgstr "Suppr Effacer\n" #: src/help.c:225 #, no-c-format msgid "Ctrl+V Paste\n" msgstr "Ctrl+V Coller\n" #: src/help.c:226 #, no-c-format msgid "Ctrl+Z Undo\n" msgstr "Ctrl+Z Refaire\n" #: src/help.c:227 #, no-c-format msgid "Ctrl+A Select all\n" msgstr "Ctrl+A Tout sélectionner\n" #: src/help.c:229 #, no-c-format msgid "Ctrl+G Position cursor (Go to)\n" msgstr "Ctrl+G Positionner le curseur (Aller à)\n" #: src/help.c:230 #, no-c-format msgid "Ctrl+H Position cursor at file start\n" msgstr "Ctrl+H Positionner le curseur au début du fichier\n" #: src/help.c:231 #, no-c-format msgid "Ctrl+J Position cursor at file end\n" msgstr "Ctrl+J Positionner le curseur à la fin du fichier\n" #: src/help.c:232 #, no-c-format msgid "Ctrl+K Position cursor at selection start\n" msgstr "Ctrl+K Positionner le curseur au début de la sélection\n" #: src/help.c:233 #, no-c-format msgid "Ctrl+L Position cursor at selection end\n" msgstr "Ctrl+L Positionner le curseur à la fin de la sélection\n" #: src/help.c:234 #, no-c-format msgid "Y,U Move cursor to nearest all-channel zero-crossing\n" msgstr "" "Y,U Déplacer le curseur au passage-à-zéro\n" " le plus proche (tous les canaux)\n" #: src/help.c:235 #, no-c-format msgid "I,O Move cursor to nearest any-channel zero-crossing\n" msgstr "" "I,O Déplacer le curseur au passage-à-zéro\n" " le plus proche (n'importe quel canal)\n" #: src/help.c:237 #, no-c-format msgid "Ctrl+Q Selection start at cursor\n" msgstr "Ctrl+Q Définir le début de la sélection au curseur\n" #: src/help.c:238 #, no-c-format msgid "Ctrl+W Selection end at cursor\n" msgstr "Ctrl+W Définir la fin de la sélection au curseur\n" #: src/help.c:240 #, no-c-format msgid "+,= Zoom in\n" msgstr "+,= Zoomer avant\n" #: src/help.c:241 #, no-c-format msgid "- Zoom out\n" msgstr "- Zoomer arrière\n" #: src/help.c:242 #, no-c-format msgid "> Zoom to selection\n" msgstr "> Zoomer sur la _sélection\n" #: src/help.c:243 #, no-c-format msgid "< Zoom all\n" msgstr "< Zoomer sur la piste entière\n" #: src/help.c:244 #, no-c-format msgid "Arrow keys Scroll left/right\n" msgstr "Touches fléchées Défiler gauche/droite\n" #: src/help.c:246 #, no-c-format msgid "Home Move view to file start\n" msgstr "Home Déplacer la vue au début du fichier\n" #: src/help.c:247 #, no-c-format msgid "End Move view to file end\n" msgstr "End Déplacer la vue à la fin du fichier\n" #: src/help.c:248 #, no-c-format msgid "Tab Move view to cursor\n" msgstr "Tab Déplacer la vue au curseur\n" #: src/help.c:249 #, no-c-format msgid "Ctrl+Tab Move cursor to center of view\n" msgstr "Ctrl+Tab Déplacer le curseur au centre de la vue\n" #: src/help.c:251 #, fuzzy, no-c-format msgid "Space Play/Stop\n" msgstr "Espace Lecture/Stop\n" #: src/help.c:252 #, no-c-format msgid "Shift+Space Play all\n" msgstr "Maj+Espace Jouer tout\n" #: src/help.c:253 #, no-c-format msgid ", Play from cursor pos\n" msgstr ", Lire depuis la position du curseur\n" #: src/help.c:254 #, no-c-format msgid ". Stop\n" msgstr ". Stop\n" #: src/help.c:255 #, no-c-format msgid "/ Play selection\n" msgstr "/ Lire la sélection\n" #: src/help.c:256 #, no-c-format msgid "H,J Move cursor (and playback) 1/8 of view\n" msgstr "H,J Déplacer le curseur (et la lecture) d'1/8 de vue\n" #: src/help.c:257 #, no-c-format msgid "K,L Move cursor one sample\n" msgstr "K,L Déplacer le curseur d'un échantillon\n" #: src/help.c:258 #, no-c-format msgid "Ctrl+arrow Move cursor (and playback) half second\n" msgstr "" "Ctrl+flèche Déplacer le curseur (et la lecture)\n" " d'une demi-seconde\n" #: src/help.c:259 #, no-c-format msgid "( Play first 3 seconds of selection\n" msgstr "( Lire les 3 premières secondes de la sélection\n" #: src/help.c:260 #, no-c-format msgid ") Play last 3 seconds of selection\n" msgstr ") Lire les 3 dernières secondes de la sélection\n" #: src/help.c:265 #, no-c-format msgid "" "If you find a bug or flaw in the program that's not mentioned in the BUGS " "file, report the bug in the bug tracker (see contact info) or mail a bug " "report describing the bug to: magnus.hjorth@home.se\n" msgstr "" "Si vous trouvez des erreurs ou bogues dans le programme n'étant pas " "mentionnés dans le fichier BUGS, rapportez le bogue dans le système de suivi " "de bogues (voir les informations de Contact) ou envoyez un rapport de bogue " "par courriel décrivant le bogue à : magnus.hjorth@home.se\n" #: src/help.c:267 #, no-c-format msgid "" "In case of a crash, please do not send me any core dumps. They are huge and " "completely useless to me. Instead, create a backtrace. Backtraces tell you " "exactly where the program crashed.\n" msgstr "" "Dans le cas d'un plantage, veuillez ne pas envoyer de fichier core. Ils sont " "très volumineux et complètement inutile pour moi. À la place, créez un " "'backtrace'. Cette technique définit précisément là où le programme s'est " "crashé.\n" #: src/help.c:269 #, no-c-format msgid "How to create a backtrace:\n" msgstr "Comment créer un 'backtrace':\n" #: src/help.c:270 #, no-c-format msgid "1. Enable core dumps: ulimit -c unlimited\n" msgstr "1. Activez la création de fichiers core : ulimit -c unlimited\n" #: src/help.c:271 #, no-c-format msgid "2. Run the program: mhwaveedit\n" msgstr "2: Lancer le programme : mhwaveedit\n" #: src/help.c:272 #, no-c-format msgid "" "3. Make the program crash. You should now get a file named core or core.1234 " "in the directory you're in.\n" msgstr "" "3. Faites planter le programme. Vous devriez maintenant avoir un fichier " "nommé core ou core.1234 dans le répertoire d'où vous avez lancé le " "programme.\n" #: src/help.c:273 #, no-c-format msgid "4. Run gdb with the program and core file: \n" msgstr "4. Lancez gdb avec le programme et le fichier core :\n" #: src/help.c:274 #, no-c-format msgid " gdb /usr/local/bin/mhwaveedit core | tee backtrace.txt\n" msgstr " gdb /usr/local/bin/mhwaveedit core | tee backtrace.txt\n" #: src/help.c:275 #, no-c-format msgid "5. After gdb has loaded, use the command: bt\n" msgstr "" " (Remplacez /usr/local/bin/mhwaveedit par le chemin où se trouve " "l'exécutable de mhWaveEdit)\n" "5. Après que gdb se soit chargé, utilisez la commande : bt\n" #: src/help.c:276 #, no-c-format msgid "6. Quit gdb with the command: quit\n" msgstr "6. Quittez gdb avec la commande : quit\n" #: src/help.c:277 #, no-c-format msgid "7. Now you should have a back trace in the file backtrace.txt\n" msgstr "" "7. Maintenant vous devriez avec un 'backtrace' dans le fichier backtrace." "txt\n" #: src/help.c:282 #, no-c-format msgid "" "There are plenty of things you can do if you want to help the development of " "mhWaveEdit. \n" msgstr "" "Il y a des tas de chose que vous pouvez faire si vous voulez aider au " "développement de mhWaveEdit. \n" #: src/help.c:284 #, no-c-format msgid "" "First of all, look for bugs and report all bugs you find into the bug " "tracker or through e-mail. Sometimes a bug can get overlooked for a long " "time because nobody reports it, so don't be afraid to report bugs that have " "been there for a few releases. You don't have to provide fixes or very " "detailed information, although it helps of course.\n" msgstr "" "Premièrement, soyez attentifs aux bogues et rapportez tous les bogues que " "vous trouvez dans le syst-mede suivi des bogues ou par courriel. Parfois, un " "peut être pendant longtemps parce que personne ne le rapporte, ne soyez donc " "pas timide pour rapporter des bogues qui ont été là depuis longtemps. Vous " "n'avez pas à fournir des correctifs ou d'informations vraiment détaillées, " "bien que ça aide évidemment.\n" #: src/help.c:286 #, no-c-format msgid "" "Feature requests are also welcome, report them to the mailing list or to the " "bug tracker.\n" msgstr "" "Les demandes de fonctionnalité sont bien entendu bienvenues, rapporter les " "sur la liste de discussion ou sur le système de suivi de bogues.\n" #: src/help.c:288 #, no-c-format msgid "" "If you speak a language other than English and mhWaveEdit isn't translated " "to your language, you can contribute a translation. To do that, copy the " "template mhwaveedit.pot in the po directory into a new file ll.po, where ll " "is your language code (see http://www.gnu.org/software/gettext/manual/" "html_node/gettext_221.html for a list of language codes). \n" msgstr "" "Si vous parlez une autre langue que le français (NdT : anglais dans la " "version originale) et que mhWaveEdit n'est pas traduit dans votre langue, " "vous pouvez contribuer une traduction. Pour ce faire, copiez le patron " "mhwaveedit.pot dans le fichier po dans un nouveau fichier ll.po, où ll est " "le code de votre langue (voir http://www.gnu.org/software/gettext/manual/" "html_node/gettext_221.html pour une liste des codes de langue). \n" #: src/help.c:290 #, no-c-format msgid "" "It's possible to edit po-files by hand, but I recommend a program such as " "poEdit (http://www.poedit.org) for editing translations. \n" msgstr "" "Vous pouvez éditer les fichiers po à la main, mais je recommande d'utiliser " "un programme comme poEdit (http://www.poedit.org) pour éditer les " "traductions. \n" #: src/help.c:292 #, no-c-format msgid "" "Note that for those translatable strings that look like \"RecordStatus|Paused" "\", you should ignore what's to the left and only translate the string to " "the right (\"Paused\" in this example). This convention is there to make it " "possible to translate the same string to different things depending on " "context. \n" msgstr "" "Notez que pour les chaînes de caractères du type \"RecordStatus|Paused\", " "vous devriez ignorer ce qui est sur à gauche et uniquement traduire la " "chaîne sur la droite (\"Paused\" dans cet exemple). Cette convention est là " "pour rendre possible la traduction de la même chaîne pour différentes choses " "en fonction du contexte. \n" #: src/help.c:294 #, no-c-format msgid "" "After you've filled in all the translations you want (you don't have to " "translate all the strings), mail in the po file to me (see contact info) and " "I'll add it to the next release. \n" msgstr "" "Après avoir rempli les traductions que vous voulez (vous n'êtes pas obligé " "de traduire toutes les chaînes de caractère), envoyez-moi le fichier po par " "courriel (voir les informations de contact) et je l'ajouterai à la prochaine " "version. \n" #: src/help.c:296 #, no-c-format msgid "" "If a translation is incomplete, you're very welcome to translate the " "remaining untranslated messages and mail them in. Corrections to " "translations are also appreciated, but they may need to be checked with the " "previous translator before including them. \n" msgstr "" "Si une traduction est incomplète, vous êtes encouragés à traduire les " "messages non-traduits et à me les envoyer. Les corrections aux traductions " "sont également appréciées, mais elles pourraient avoir besoin d'être " "vérifiées avec les traducteur précédents avant de les inclure. \n" #: src/help.c:302 #, no-c-format msgid "For bug reports, translation updates, patches and PayPal donations:\n" msgstr "" "Pour les rapports de bogues, les mises-à-jour de traduction, les et les " "donations PayPal :\n" #: src/help.c:303 #, no-c-format msgid "magnus.hjorth@home.se\n" msgstr "" #: src/help.c:305 #, no-c-format msgid "Project page with bug tracker, mailing list membership:\n" msgstr "" "Page du projet avec le système de suivi de bogue, l'accés à la liste de " "diffusion :\n" #: src/help.c:306 #, no-c-format msgid "http://gna.org/projects/mhwaveedit\n" msgstr "" #: src/help.c:308 #, no-c-format msgid "Mailing list (you must be a subscriber before you can post messages):\n" msgstr "" "Liste de diffusion (vous devez être inscrit avant de pouvoir poster des " "messages) :\n" #: src/help.c:309 #, no-c-format msgid "mhwaveedit-discuss@gna.org\n" msgstr "" #: src/inifile.c:84 src/inifile.c:91 #, c-format msgid "%s: Expected '=': %s\n" msgstr "%s : Attendu '=' : %s\n" #: src/inifile.c:97 #, c-format msgid "%s: Expected value: %s\n" msgstr "%s : Valeur attendue : %s\n" #: src/int_box.c:202 #, c-format msgid "Value for %s must be a number between %ld and %ld" msgstr "La valeur pour %s doit être un chiffre compris entre %ld et %ld" #: src/ladspacore.c:94 #, c-format msgid "Effect %s contains invalid port %s" msgstr "L'effet %s contient un port invalide %s" #: src/ladspacore.c:140 #, c-format msgid "Ladspa: Error scanning %s" msgstr "Ladspa : erreur d'analyse %s" #: src/ladspacore.c:409 #, c-format msgid "Applying effect '%s'" msgstr "Application de l'effet '%s'" #: src/ladspadialog.c:87 #, c-format msgid "Value for '%s' must not be below %f" msgstr "La valeur de '%s' ne doit pas être au dessous de %f" #: src/ladspadialog.c:94 #, c-format msgid "Value for '%s' must not be above %f" msgstr "La valeur de '%s' ne doit pas être au dessus de %f" #: src/ladspadialog.c:127 #, c-format msgid "" "You have mapped more than one output port to channel '%s'. You can only map " "one output port to each channel." msgstr "" "Vous avez routé plus d'un port de sortie vers le canal '%s'. Vous ne pouvez " "en définir qu'un par canal." #: src/ladspadialog.c:191 #, c-format msgid "Author: %s" msgstr "Auteur : %s" #: src/ladspadialog.c:196 #, c-format msgid "Copyright: %s" msgstr "Copyright : %s" #: src/ladspadialog.c:203 msgid " Input controls " msgstr " Contrôles d'entrée" #: src/ladspadialog.c:292 msgid " Output controls " msgstr " Contrôles de sortie" #: src/ladspadialog.c:311 src/recorddialog.c:311 src/recorddialog.c:739 msgid "None" msgstr "Aucun" #: src/ladspadialog.c:319 msgid " Input audio " msgstr " Entrée audio" #: src/ladspadialog.c:319 msgid " Output audio " msgstr " Sortie audio" #: src/ladspadialog.c:350 msgid "Keep data in unmapped output channels" msgstr "Garder les données dans des canaux de sortie non-routés" #: src/main.c:166 #, c-format msgid "Syntax: %s [files]\n" msgstr "Syntaxe : %s [fichiers]\n" #: src/main.c:169 msgid "Testing conversion functions:" msgstr "Test des fonctions de conversion :" #: src/main.c:171 msgid "Testing conversion functions finished." msgstr "Test des fonctions de conversion terminé." #: src/main.c:190 msgid "Expected driver name after --driver option" msgstr "Nom du pilote attendu après l'option --driver" #: src/main.c:196 #, c-format msgid "Unknown option '%s'" msgstr "Option inconnue '%s'" #: src/main.c:340 msgid "" "Could not find home directory. Using current directory as home directory." msgstr "" "Impossible de trouver le répertoire personnel. Utilisation du répertoire " "courant en tant que répertoire personnel." #: src/main.c:368 msgid "Black" msgstr "Noir" #: src/main.c:369 msgid "White" msgstr "Blanc" #: src/main.c:370 msgid "Background" msgstr "Fond" #: src/main.c:371 msgid "L Waveform" msgstr "Forme d'onde Gauche" #: src/main.c:372 msgid "R Waveform" msgstr "Forme d'onde Droite" #: src/main.c:373 msgid "Cursor" msgstr "Curseur" #: src/main.c:374 msgid "Marks" msgstr "Marqueurs" #: src/main.c:375 msgid "Selection" msgstr "Sélection" #: src/main.c:376 msgid "Progress bar" msgstr "Barre de progression" #: src/main.c:377 msgid "Zero-level" msgstr "Niveau Zéro" #: src/main.c:378 msgid "Buffer position" msgstr "Position du tampon" #: src/main.c:501 #, c-format msgid "Error launching mixer: fork: %s" msgstr "Erreur au lancement du mixeur : séparation : %s" #: src/main.c:552 src/main.c:571 msgid "Mono" msgstr "Mono" #: src/main.c:553 msgid "Left" msgstr "Gauche" #: src/main.c:554 msgid "Right" msgstr "Droite" #: src/main.c:556 #, c-format msgid "Ch%d" msgstr "" #: src/main.c:572 msgid "Stereo" msgstr "Stéréo" #: src/main.c:574 #, c-format msgid "%d channels" msgstr "%d canaux" #: src/main.c:1149 msgid "Ignoring extreme old window size/position values\n" msgstr "Anciennes valeurs de position/taille de fenêtre ignorées\n" #: src/mainwindow.c:217 #, c-format msgid "mhWaveEdit: %s (%s): %d Hz, %s" msgstr "mhWaveEdit : %s (%s) : %d Hz, %s" #: src/mainwindow.c:300 msgid "Use default settings" msgstr "Utilise les paramètres par défaut" #: src/mainwindow.c:304 msgid "Auto-detect from extension" msgstr "Auto-détecte depuis l'extension" #: src/mainwindow.c:319 msgid "File type: " msgstr "Type de filtre : " #: src/mainwindow.c:365 msgid "" "The file has not changed since last save. Press OK if you want to save it " "anyway?" msgstr "" "Le fichier n'a pas changé depuis la dernière sauvegarde. Cliquez sur Valider " "si vous voulez le sauvegarder malgré tout." #: src/mainwindow.c:374 msgid "Save File" msgstr "Sauvegarder le fichier" #: src/mainwindow.c:399 #, c-format msgid "Save changes to %s?" msgstr "Sauvegarder les changements de %s ?" #: src/mainwindow.c:792 src/mainwindow.c:796 msgid "Load File" msgstr "Charger un fichier" #: src/mainwindow.c:821 msgid "Save selection as ..." msgstr "Sauvegarder la sélection sous..." # Note de traduction - Olivier 05 décembre 2015 : aucune idée de ce qu'est opencount... une variable peut être ? #: src/mainwindow.c:1116 #, c-format msgid "Chunk %p has opencount=%d\n" msgstr "Le morceau %p a opencount=%d\n" #: src/mainwindow.c:1199 #, c-format msgid "" "\n" "Window '%s'\n" msgstr "" "\n" "Fenêtre '%s'\n" #: src/mainwindow.c:1200 msgid " Current chunk:" msgstr " Morceau actuel :" #: src/mainwindow.c:1202 msgid " History:" msgstr " Historique :" #: src/mainwindow.c:1257 msgid "There already is only one channel!" msgstr "Il n'y a déjà qu'un seul canal !" #: src/mainwindow.c:1366 msgid "mhWaveEdit Help" msgstr "Aide de mhWaveEdit" #: src/mainwindow.c:1465 msgid "About mhWaveEdit" msgstr "À propos de mhWaveEdit" #: src/mainwindow.c:1477 #, fuzzy msgid "" "Created by Magnus Hjorth (magnus.hjorth@home.se)\n" "Copyright 2002-2018, Magnus Hjorth" msgstr "" "Créé par Magnus Hjorth (magnus.hjorth@home.se)\n" "Copyright 2002-2012, Magnus Hjorth\n" "Traduction française : Olivier Humbert 2015." #: src/mainwindow.c:1484 #, c-format msgid "Current sound driver: %s" msgstr "Pilote audio actuel : %s" #: src/mainwindow.c:1492 #, c-format msgid "Compiled %s %s" msgstr "Compilé le : %s %s" #: src/mainwindow.c:1498 msgid "Uses double-precision math" msgstr "Utilise une double-précision mathématique" #: src/mainwindow.c:1505 msgid "" "Distributed under GNU General Public License.\n" "For information, see the file COPYING" msgstr "" "Distribué conformément à la licence GNU General Public License.\n" "Pour plus d'informations, voir le fichier COPYING." #: src/mainwindow.c:1669 msgid "Seconds of silence: " msgstr "Secondes de silence : " #: src/mainwindow.c:1669 msgid "Insert Silence" msgstr "Insérer du silence" #: src/mainwindow.c:1718 msgid "Level: " msgstr "Niveau :" #: src/mainwindow.c:1718 msgid "Normalize to..." msgstr "Normaliser à..." #: src/mainwindow.c:1928 msgid "/_File" msgstr "/_Fichier" #: src/mainwindow.c:1929 msgid "/File/_Open..." msgstr "/Fichier/_Ouvrir..." #: src/mainwindow.c:1930 msgid "/File/_Save" msgstr "/Fichier/_Sauvegarder" #: src/mainwindow.c:1931 msgid "/File/Save _as..." msgstr "/Fichier/S_auvegarder sous..." #: src/mainwindow.c:1932 msgid "/File/Save selection as..." msgstr "/Fichier/Sauvegarder la sélection sous..." #: src/mainwindow.c:1933 msgid "/_Edit" msgstr "/_Édition" #: src/mainwindow.c:1934 msgid "/Edit/_Undo" msgstr "/Édition/Ann_uler" #: src/mainwindow.c:1935 msgid "/Edit/_Redo" msgstr "/Édition/_Refaire" #: src/mainwindow.c:1936 msgid "/Edit/sep1" msgstr "/Édition/sep1" #: src/mainwindow.c:1937 msgid "/Edit/Cu_t" msgstr "/Édition/Cou_per" #: src/mainwindow.c:1938 msgid "/Edit/_Copy" msgstr "/Édition/_Copier" #: src/mainwindow.c:1939 msgid "/Edit/_Paste" msgstr "/Édition/Co_ller" #: src/mainwindow.c:1940 msgid "/Edit/Paste _over" msgstr "/Édition/C_oller par dessus" #: src/mainwindow.c:1941 msgid "/Edit/_Mix paste" msgstr "/Édition/Coller _mixte" #: src/mainwindow.c:1942 msgid "/Edit/Insert _silence" msgstr "/Édition/Insérer _silence" #: src/mainwindow.c:1943 msgid "/Edit/Paste to _new" msgstr "/Édition/Coller comme _nouveau" #: src/mainwindow.c:1944 msgid "/Edit/Cr_op" msgstr "/Édition/R_ogner" #: src/mainwindow.c:1945 msgid "/Edit/_Delete" msgstr "/Édition/_Effacer" #: src/mainwindow.c:1946 msgid "/Edit/Silence selection" msgstr "/Édition/Remplacer la sélection en silence" #: src/mainwindow.c:1947 msgid "/Edit/sep2" msgstr "/Édition/sep2" #: src/mainwindow.c:1948 msgid "/Edit/Select _all" msgstr "/Édition/Sélectionner tout" #: src/mainwindow.c:1949 msgid "/Edit/Select none" msgstr "/Édition/Désélectionner" #: src/mainwindow.c:1950 msgid "/Edit/sep3" msgstr "/Édition/sep3" #: src/mainwindow.c:1951 msgid "/Edit/Clear clipboard" msgstr "/Édition/Vider le presse-papier" #: src/mainwindow.c:1952 msgid "/Edit/sep4" msgstr "/Édition/sep4" #: src/mainwindow.c:1953 msgid "/Edit/Preferences" msgstr "/Édition/Préférences" #: src/mainwindow.c:1954 msgid "/_View" msgstr "/_Affichage" #: src/mainwindow.c:1955 msgid "/View/Zoom _in" msgstr "/Affichage/Zoo_m avant" #: src/mainwindow.c:1956 msgid "/View/Zoom _out" msgstr "/Affichage/Zo_om arrière" #: src/mainwindow.c:1957 msgid "/View/Zoom to _selection" msgstr "/Affichage/Zoomer sur la _sélection" #: src/mainwindow.c:1958 msgid "/View/sep1" msgstr "/Affichage/sep1" #: src/mainwindow.c:1959 msgid "/View/Zoom _all" msgstr "/Affichage/Zoomer sur l_a piste entière" #: src/mainwindow.c:1960 msgid "/View/sep2" msgstr "/Affichage/sep2" #: src/mainwindow.c:1961 msgid "/View/_Time scale" msgstr "/Affichage/Échelle de _Temps" #: src/mainwindow.c:1962 msgid "/View/_Horizontal zoom" msgstr "/Affichage/Zoom _horizontal" #: src/mainwindow.c:1963 msgid "/View/_Vertical zoom" msgstr "/Affichage/Zoom _vertical" #: src/mainwindow.c:1964 msgid "/View/Sp_eed slider" msgstr "/Affichage/Chariot de vit_esse" #: src/mainwindow.c:1965 msgid "/View/Slider labels" msgstr "/Affichage/Étiquettes de chariot" #: src/mainwindow.c:1966 msgid "/View/Buffer position" msgstr "/Affichage/Position du tampon" #: src/mainwindow.c:1967 msgid "/_Cursor" msgstr "/_Curseur" #: src/mainwindow.c:1968 msgid "/Cursor/Set selection start" msgstr "/Curseur/Définir le début de la sélection au curseur" #: src/mainwindow.c:1970 msgid "/Cursor/Set selection end" msgstr "/Curseur/Définir la fin de la sélection au curseur" #: src/mainwindow.c:1971 msgid "/Cursor/sep1" msgstr "/Curseur/sep1" #: src/mainwindow.c:1972 msgid "/Cursor/Move to" msgstr "/Curseur/Déplacer vers" #: src/mainwindow.c:1973 msgid "/Cursor/Move to/Beginning" msgstr "/Curseur/Déplacer vers/Début" #: src/mainwindow.c:1975 msgid "/Cursor/Move to/End" msgstr "/Curseur/Déplacer vers/Fin" #: src/mainwindow.c:1976 msgid "/Cursor/Move to/Selection start" msgstr "/Curseur/Déplacer vers/Début de la sélection" #: src/mainwindow.c:1978 msgid "/Cursor/Move to/Selection end" msgstr "/Curseur/Déplacer vers/Fin de la sélection" #: src/mainwindow.c:1980 msgid "/Cursor/Move" msgstr "/Curseur/Déplacer" #: src/mainwindow.c:1981 msgid "/Cursor/Move/Left" msgstr "/_Curseur/Déplacer/Gauche" #: src/mainwindow.c:1982 msgid "/Cursor/Move/Right" msgstr "/Curseur/Déplacer/Droite" #: src/mainwindow.c:1983 msgid "/Cursor/Move/Left sample" msgstr "/Curseur/Déplacer/Échantillon de gauche" #: src/mainwindow.c:1984 msgid "/Cursor/Move/Right sample" msgstr "/Curseur/Déplacer/Échantillon de droite" #: src/mainwindow.c:1985 msgid "/Cursor/Find zero-crossing" msgstr "/Curseur/Trouver les passages à zéro" #: src/mainwindow.c:1986 msgid "/Cursor/Find zero-crossing/Left (all channels)" msgstr "/Curseur/Trouver les passages à zéro/Gauche (tous les canaux)" #: src/mainwindow.c:1988 msgid "/Cursor/Find zero-crossing/Right (all channels)" msgstr "/Curseur/Trouver les passages à zéro/Droit (tous les canaux)" #: src/mainwindow.c:1990 msgid "/Cursor/Find zero-crossing/Left (any channel)" msgstr "/Curseur/Trouver les passages à zéro/Gauche (n'importe quel canal)" #: src/mainwindow.c:1992 msgid "/Cursor/Find zero-crossing/Right (any channel)" msgstr "/Curseur/Trouver les passages à zéro/Droite (n'importe quel canal)" #: src/mainwindow.c:1994 msgid "/Cursor/sep2" msgstr "/Curseur/sep2" #: src/mainwindow.c:1995 msgid "/Cursor/Position cursor..." msgstr "/Curseur/Positionner le curseur..." #: src/mainwindow.c:1997 msgid "/_Play" msgstr "/_Lire" #: src/mainwindow.c:1998 msgid "/Play/_Play from cursor" msgstr "/Lire/Lire depuis le _curseur" #: src/mainwindow.c:1999 msgid "/Play/Play _all" msgstr "/Lire/Lire _tout" #: src/mainwindow.c:2000 msgid "/Play/Play se_lection" msgstr "/Lire/Lire la sé_lection" #: src/mainwindow.c:2001 msgid "/Play/_Stop" msgstr "/Lire/_Stop" #: src/mainwindow.c:2002 msgid "/Play/sep1" msgstr "/Lire/sep1" #: src/mainwindow.c:2003 msgid "/Play/_Record..." msgstr "/Lire/En_registrer..." #: src/mainwindow.c:2004 msgid "/Effec_ts" msgstr "/Effe_ts" #: src/mainwindow.c:2005 msgid "/Effects/Fade _in" msgstr "/Effets/Fondu _entrant" #: src/mainwindow.c:2006 msgid "/Effects/Fade o_ut" msgstr "/Effets/Fondu _sortant" #: src/mainwindow.c:2007 msgid "/Effects/_Normalize" msgstr "/Effets/_Normalisation" #: src/mainwindow.c:2008 msgid "/Effects/Normali_ze to..." msgstr "/Effets/_Normalisation à..." #: src/mainwindow.c:2009 msgid "/Effects/_Volume adjust (fade)..." msgstr "/Effets/Ajustement du _volume (fondu)..." #: src/mainwindow.c:2010 msgid "/Effects/sep1" msgstr "/Effets/sep1" #: src/mainwindow.c:2011 msgid "/Effects/Convert sample_rate..." msgstr "/Effets/Converti_r le taux d'échantillonnage..." #: src/mainwindow.c:2012 msgid "/Effects/Convert sample _format..." msgstr "/Effets/Convertir le _format de l'échantillon..." #: src/mainwindow.c:2014 msgid "/Effects/B_yte swap" msgstr "/Effets/Permutter les octets" #: src/mainwindow.c:2015 msgid "/Effects/sep2" msgstr "/Effets/sep2" #: src/mainwindow.c:2016 msgid "/Effects/_Mix to mono" msgstr "/Effets/_Mixer vers mono" #: src/mainwindow.c:2017 msgid "/Effects/Add channe_l" msgstr "/Effets/Ajouter un cana_l" #: src/mainwindow.c:2018 msgid "/Effects/Ma_p channels..." msgstr "/Effets/Router les canaux..." #: src/mainwindow.c:2019 msgid "/Effects/_Combine channels..." msgstr "/Effets/_Combiner les canaux..." #: src/mainwindow.c:2020 msgid "/Effects/Add channels from other file..." msgstr "/Effets/Ajouter les canaux d'un autre fichier..." #: src/mainwindow.c:2021 msgid "/Effects/sep3" msgstr "/Effets/sep3" #: src/mainwindow.c:2022 msgid "/Effects/_Speed adjustment..." msgstr "/Effets/Ajustement de vite_sse..." #: src/mainwindow.c:2023 msgid "/Effects/Pipe through program..." msgstr "/Effets/Envoyer à travers le programme..." #: src/mainwindow.c:2024 msgid "/Effects/sep4" msgstr "/Effets/sep4" #: src/mainwindow.c:2025 msgid "/Effects/Effects dialog..." msgstr "/Effets/Boîte des effets..." #: src/mainwindow.c:2027 msgid "/Debug" msgstr "/Déboguage" #: src/mainwindow.c:2029 msgid "/Debug/Dummy effect" msgstr "/Déboguage/Effet factice" #: src/mainwindow.c:2030 msgid "/Debug/Dummy effect FP" msgstr "/Déboguage/Effet FP factice" #: src/mainwindow.c:2031 msgid "/Debug/Check opencount" msgstr "/Déboguage/Vérifier les comptes" #: src/mainwindow.c:2032 msgid "/Debug/Dump chunk info" msgstr "/Déboguage/Décharger les infos" #: src/mainwindow.c:2034 msgid "/_Help" msgstr "/A_ide" #: src/mainwindow.c:2035 msgid "/Help/_Documentation" msgstr "/Aide/_Documentation" #: src/mainwindow.c:2036 msgid "/Help/_About" msgstr "/Aide/_À propos" #: src/mainwindow.c:2040 msgid "/File/sep1" msgstr "/Fichier/sep1" #: src/mainwindow.c:2041 msgid "/File/_Close" msgstr "/Fichier/_Fermer" #: src/mainwindow.c:2042 msgid "/File/sep2" msgstr "/Fichier/sep2" #: src/mainwindow.c:2043 msgid "/File/_Exit" msgstr "/Fichier/Quitt_er" #: src/mainwindow.c:2215 msgid "Load a file from disk" msgstr "Charger un fichier du disque" #: src/mainwindow.c:2222 msgid "Save the current file to disk" msgstr "Sauver le fichier sur le disque" #: src/mainwindow.c:2231 msgid "Undo the last change" msgstr "Annuler le dernier changement" #: src/mainwindow.c:2239 msgid "Redo the last undo operation" msgstr "Refaire le dernier changement annulé" #: src/mainwindow.c:2249 msgid "Cut out the current selection" msgstr "Couper la sélection" #: src/mainwindow.c:2257 msgid "Copy the current selection" msgstr "Copier la sélection" #: src/mainwindow.c:2265 msgid "Paste at cursor position" msgstr "Coller à la position du curseur" #: src/mainwindow.c:2273 msgid "Paste, overwriting the data after the cursor position" msgstr "Coller en écrasant à la position du curseur" #: src/mainwindow.c:2283 msgid "Delete the selection" msgstr "Effacer la sélection" #: src/mainwindow.c:2292 msgid "Set selection start to cursor position" msgstr "Définir le début de la sélection au curseur" #: src/mainwindow.c:2301 msgid "Set selection end to cursor position" msgstr "Définir la fin de la sélection au curseur" #: src/mainwindow.c:2311 msgid "Play from cursor position" msgstr "Lire depuis le curseur" #: src/mainwindow.c:2320 msgid "Play selected area" msgstr "Lire la sélection" #: src/mainwindow.c:2329 msgid "Stop playing" msgstr "Arrêter de jouer" #: src/mainwindow.c:2339 msgid "Loop mode (play over and over)" msgstr "Mode boucle (jouer à l'infini)" #: src/mainwindow.c:2349 msgid "Keep view and playback together" msgstr "Suivre le curseur pendant la lecture" #: src/mainwindow.c:2362 msgid "Auto return to playback start" msgstr "Retourner automatiquement au début" #: src/mainwindow.c:2376 src/recorddialog.c:874 msgid "Record" msgstr "Enregistrer" #: src/mainwindow.c:2385 src/recorddialog.c:983 msgid "Launch mixer" msgstr "Lancer le mixeur" #: src/pipedialog.c:92 msgid "Command line: " msgstr "Ligne de commande : " #: src/pipedialog.c:99 msgid "Send wav header" msgstr "Envoyer l'entête wav" #: src/pipedialog.c:153 msgid "Process output" msgstr "Traiter la sortie" #: src/pipedialog.c:178 #, c-format msgid "" "Output from command '%s':\n" "\n" msgstr "" "Sortie de la commande '%s' :\n" "\n" #: src/pipedialog.c:201 #, c-format msgid "Could not create pipe: %s" msgstr "Ne peut créer le tunnel : %s" #: src/pipedialog.c:216 #, c-format msgid "Error: fork: %s" msgstr "Erreur : séparation : %s" #: src/pipedialog.c:268 msgid "Should not reach this point!" msgstr "Ne devrait pas atteindre ce point !" #: src/pipedialog.c:482 msgid "Command failed without returning any data" msgstr "La commande a échoué sans retourner de donnée" #: src/pipedialog.c:492 #, c-format msgid "Error: %s" msgstr "Erreur : %s" #: src/player.c:294 msgid "The sound format of this file is not supported for playing." msgstr "Le format de ce fichier n'est pas supporté en lecture." #: src/rateconv.c:97 #, c-format msgid "Error initialising sample rate conversion: %s" msgstr "" "Erreur d'initialisation de la conversion du taux d'échantillonnage : %s" #: src/rateconv.c:162 #, c-format msgid "Error converting samplerate: %s\n" msgstr "Erreur lors de la conversion du taux d'échantillonnage : %s\n" #: src/rateconv.c:201 #, c-format msgid "Error changing samplerate conversion ratio: %s\n" msgstr "" "Erreur lors du changement du ratio de conversion du taux d'échantillonnage : " "%s\n" #: src/rateconv.c:323 msgid "Unexpected EOF in connection to subprocess" msgstr "" "Erreur inattendue de fin de fichier (EOF) dans la connexion au sous-processus" #: src/rateconv.c:327 #, c-format msgid "Error writing to subprocess: %s" msgstr "Erreur d'écriture vers le processus : %s" #: src/rateconv.c:383 src/rateconv.c:405 #, c-format msgid "Error reading from sub process: %s" msgstr "Erreur de lecture depuis le sous-processus : %s" #: src/rateconv.c:413 msgid "SoX closed connection too early!" msgstr "Sox a fermé la connexion trop tôt !" #: src/rateconv.c:599 msgid "(SoX) Simulated analog filtration" msgstr "(SoX) Filtrage analogique simulé" #: src/rateconv.c:605 msgid "(SoX) Polyphase interpolation" msgstr "(SoX) Interpolation polyphasée" #: src/rateconv.c:612 msgid "Sample repeat/skip (low quality)" msgstr "Répète/saute l'échantillon (basse qualité)" #: src/rawdialog.c:42 msgid "header size" msgstr "taille de l'entête" #: src/rawdialog.c:73 msgid "Unknown file format" msgstr "Format de fichier inconnu" #: src/rawdialog.c:80 #, c-format msgid "" "The format of file '%s' could not be recognized.\n" "\n" "Please specify the sample format below." msgstr "" "Le format du fichier '%s' n'a pas pu être reconnu.\n" "\n" "Veuillez spécifier le format de l'échantillon ci-dessous." #: src/rawdialog.c:92 msgid "Header bytes: " msgstr "Octets d'entête : " #: src/recorddialog.c:207 src/recorddialog.c:671 src/recorddialog.c:918 msgid "(no limit)" msgstr "(pas de limite)" #: src/recorddialog.c:314 msgid "Mild" msgstr "Doux" #: src/recorddialog.c:316 msgid "Heavy" msgstr "Lourd" #: src/recorddialog.c:430 msgid "Update preset" msgstr "Mise à jour du pré-réglage" #: src/recorddialog.c:435 msgid "Add preset" msgstr "Ajout d'un pré-réglage" #: src/recorddialog.c:514 msgid "Custom format" msgstr "Format personnalisé" #: src/recorddialog.c:552 msgid "" "The sign and endian-ness can usually be left at their defaults, but should " "be changed if you're unable to record or get bad sound." msgstr "" "Le signe et le boutisme peuvent être habituellement laissés à leurs valeurs " "par défaut, mais devraient être changés si vous ne parvenez pas à " "enregistrer ou si le son est un mauvais." #: src/recorddialog.c:566 msgid "Name :" msgstr "Nom :" #: src/recorddialog.c:578 msgid "Presets:" msgstr "Pré-réglages :" #: src/recorddialog.c:593 msgid "Set format" msgstr "Paramétrer le format" #: src/recorddialog.c:601 msgid "Add/Update preset" msgstr "Ajouter/mettre-à-jour le pré-réglage" #: src/recorddialog.c:654 msgid "" "Invalid time value. Time must be specified in the form (HH')MM:SS(.mmmm)" msgstr "" "Valeur de temps invalide. Le temps doit être spécifié sous la forme (HH')MM:" "SS(.mmmm)" #: src/recorddialog.c:698 src/recorddialog.c:948 msgid "Format not selected" msgstr "format non sélectionné" #: src/recorddialog.c:705 msgid "This format is not supported by the input driver!" msgstr "Ce format n'est pas supporté par le pilote d'entrée !" #: src/recorddialog.c:710 msgid "Ready for recording" msgstr "prêt pour enregistrer" #: src/recorddialog.c:723 msgid "Peak: " msgstr "Pic : " #: src/recorddialog.c:724 msgid "Peak max: " msgstr "Pic maximum : " #: src/recorddialog.c:725 msgid "RMS: " msgstr "RMS : " #: src/recorddialog.c:726 msgid "Clipping: " msgstr "Coupure : " #: src/recorddialog.c:795 msgid "Resume recording" msgstr "Reprendre l'enregistrement" #: src/recorddialog.c:795 src/recorddialog.c:815 msgid "Pause recording" msgstr "Mettre l'enregistrement en pause" #: src/recorddialog.c:797 msgid "RecordStatus|Paused" msgstr "En pause" #: src/recorddialog.c:798 src/recorddialog.c:823 msgid "RecordStatus|Recording" msgstr "En cours" #: src/recorddialog.c:818 msgid "Finish" msgstr "Terminer" #: src/recorddialog.c:826 msgid "Overruns: " msgstr "Dépassements : " #: src/recorddialog.c:829 msgid "Bytes written: " msgstr "Octets écrits : " #: src/recorddialog.c:830 msgid "Auto stop in: " msgstr "Arrêt auto : " #: src/recorddialog.c:894 msgid "Recording settings" msgstr "Paramètres d'enregistrement" #: src/recorddialog.c:901 msgid "Sample format: " msgstr "Format d'échantillon : " #: src/recorddialog.c:916 msgid "Time limit: " msgstr "Limite de temps : " #: src/recorddialog.c:924 msgid "Disable" msgstr "Désactiver" #: src/recorddialog.c:930 msgid "Set" msgstr "Valider" #: src/recorddialog.c:942 msgid "Input levels" msgstr "Niveaux d'entrée" #: src/recorddialog.c:947 msgid "Recording status: " msgstr "Statut d'enregistrement : " #: src/recorddialog.c:952 msgid "Time recorded: " msgstr "Temps enregistré : " #: src/recorddialog.c:953 msgid "N/A" msgstr "indéfini" #: src/recorddialog.c:966 msgid "Start recording" msgstr "Démarrer l'enregistrement" #: src/recorddialog.c:977 msgid "Reset max peaks" msgstr "Réinitialiser les pics maximums" #: src/sampleratedialog.c:87 msgid "" "(This changes the sample rate of \n" "the entire file, not just the selection)" msgstr "" "(Ceci modifie le taux d'échantillon \n" "de tout le fichier, pas seulement la \n" "sélection)" #: src/sampleratedialog.c:92 msgid "New samplerate: " msgstr "Nouveau taux d'échantillon : " #: src/sampleratedialog.c:99 msgid "Method: " msgstr "Méthode : " #: src/samplesizedialog.c:38 msgid "File already has the selected sample format" msgstr "Le fichier a déjà le format d'échantillonnage sélectionné" #: src/samplesizedialog.c:87 msgid "" "(This changes the sample type of the entire file, not just the selection)" msgstr "" "(Ceci modifie le type d'échantillon de tout le fichier, pas seulement la " "sélection)" #: src/samplesizedialog.c:99 msgid "Don't actually change the data (for repairing bad files etc)" msgstr "" "Ne pas changer les données pour de vrai (pour réparer les mauvais fichiers, " "etc)" #: src/sound-alsalib.c:73 msgid "ALSA Preferences" msgstr "Préférences ALSA" #: src/sound-alsalib.c:81 msgid "Playback device: " msgstr "Périphérique de lecture : " #: src/sound-alsalib.c:85 msgid "Recording device: " msgstr "Périphérique d'enregistrement : " #: src/sound-alsalib.c:91 msgid "Event driven I/O" msgstr "Entrée/Sortie pilotée par les événements" #: src/sound-alsalib.c:123 #, c-format msgid "Error opening ALSA device '%s' for recording: %s" msgstr "Erreur d'ouverture du périphérique ALSA '%s' pour enregistrer : %s" #: src/sound-alsalib.c:125 #, c-format msgid "Error opening ALSA device '%s' for playback: %s" msgstr "Erreur d'ouverture du périphérique ALSA '%s' pour lire : %s" #: src/sound-alsalib.c:273 msgid "snd_pcm_hw_params_set_access failed" msgstr "snd_pcm_hw_params_set_access a échoué" #: src/sound-alsalib.c:278 msgid "snd_pcm_hw_params_set_format failed" msgstr "snd_pcm_hw_params_set_format a échoué" #: src/sound-alsalib.c:283 msgid "snd_pcm_hw_params_set_channels failed" msgstr "snd_pcm_hw_params_set_channels a échoué" #: src/sound-alsalib.c:288 msgid "snd_pcm_hw_params_set_rate failed" msgstr "snd_pcm_hw_params_set_rate a échoué" #: src/sound-alsalib.c:293 msgid "snd_pcm_hw_params_set_buffer_size_last failed" msgstr "snd_pcm_hw_params_set_buffer_size_last a échoué" #: src/sound-alsalib.c:436 src/sound-alsalib.c:492 msgid "" msgstr "" #: src/sound-alsalib.c:536 msgid "" msgstr "" #: src/sound.c:167 msgid "SDL (output only)" msgstr "SDL (sortie seulement)" #: src/sound.c:209 msgid "Dummy (no sound)" msgstr "Factice (pas de son)" #: src/sound.c:334 #, c-format msgid "" "Invalid driver name: %s\n" "Using '%s' driver instead" msgstr "" "Nom de pilote invalide : %s\n" "Utilisation du pilote '%s' en remplacement" #: src/sound-esound.c:59 #, c-format msgid "Couldn't connect to ESD daemon: %s" msgstr "Impossible de se connecter au démon d'ESD : %s" #: src/sound-esound.c:114 msgid "EsounD: Unable to open playback stream" msgstr "EsounD : Impossible d'ouvrir le flux de lecture" #: src/sound-esound.c:130 msgid "EsounD: Unable to open recording stream" msgstr "EsounD : Impossible d'ouvrir le flux d'enregistrement" #: src/sound-esound.c:145 src/sound-esound.c:217 msgid "EsounD driver: select" msgstr "Pilote EsounD : sélectionner" #: src/sound-esound.c:157 msgid "EsounD driver: write" msgstr "Pilote EsounD : écrire" #: src/sound-esound.c:221 msgid "Esound connection closed by server" msgstr "Connexion à EsounD terminée par le serveur" #: src/sound-esound.c:227 msgid "EsounD driver: read" msgstr "Pilote EsounD : lire" #: src/sound-esound.c:241 msgid "jump delay" msgstr "délai de saut" #: src/sound-esound.c:255 msgid "ESD preferences" msgstr "Préférences ESD" #: src/sound-esound.c:263 msgid "" "If the cursor starts running too early when jumping, this delay should be " "increased." msgstr "" "Si le curseur commence à avancer trop tôt lors d'un saut, ce délai devrait " "être incrémenté." #: src/sound-esound.c:269 msgid "Jump delay:" msgstr "Délai de saut :" #: src/sound-esound.c:278 msgid "" "Selecting the ESD host to connect to is done through the ESPEAKER " "environment variable." msgstr "" "Sélectionner l'hôte ESD auquel se connecter est fait grâce à la variable " "d'environnement ESPEAKER." #: src/sound-jack.c:117 msgid "Invalid number of input ports." msgstr "Nombre de ports d'entrée invalide." #: src/sound-jack.c:121 msgid "Invalid number of output ports." msgstr "Nombre de ports de sortie invalide." #: src/sound-jack.c:130 msgid "The client name change won't take effect until you restart the program." msgstr "" "Le changement de nom du client ne sera prit en compte qu'après le " "redémarrage du programme." #: src/sound-jack.c:187 msgid " Input ports " msgstr " Ports d'entrée " #: src/sound-jack.c:188 msgid " Output ports " msgstr " Ports de sortie " #: src/sound-jack.c:197 msgid "Jack Preferences" msgstr "Préférences Jack" #: src/sound-jack.c:206 msgid "Client name: " msgstr "Nom du client : " #: src/sound-jack.c:223 msgid "Number of ports (0-8): " msgstr "Nombre de ports (0-8) : " #: src/sound-jack.c:231 #, c-format msgid "Port #%d" msgstr "Port #%d" #: src/sound-jack.c:244 msgid "Automatically connect input ports on startup" msgstr "Automatiquement se connecter au port d'entrée au démarrage" #: src/sound-jack.c:250 msgid "Automatically connect output ports on startup" msgstr "Automatiquement se connecter au port de sortie au démarrage" #: src/sound-jack.c:402 msgid "Over/underrun in JACK driver" msgstr "Décrochage du pilote JACK" #: src/sound-jack.c:417 msgid "jack_get_ports returned NULL" msgstr "jack_get_ports a retourné NULL" #: src/sound-jack.c:433 #, c-format msgid "Connection from %s to %s failed: %s" msgstr "Connection depuis %s vers %s échouée : %s" #: src/sound-jack.c:480 msgid "Could not connect to the JACK server." msgstr "Impossible de se connecter au serveur JACK." #: src/sound-jack.c:494 msgid "Activation failed!" msgstr "Activation échouée !" #: src/sound-jack.c:825 #, c-format msgid "" "With JACK, the only supported recording format is Floating-point, single " "precision, %d Hz" msgstr "" "Avec JACK, le seul format d'enregistrement supporté est à virgule flottante, " "simple précision, %d Hz" #: src/sound-oss.c:96 #, c-format msgid "Could not open '%s': %s" msgstr "Impossible d'ouvrir '%s' : %s" #: src/sound-oss.c:109 #, c-format msgid "Error in sound driver: ioctl failed: %s" msgstr "Erreur dans le pilote audio : ioctl échoué : %s" #: src/sound-oss.c:216 #, c-format msgid "Error in sound driver: write failed: %s" msgstr "Erreur dans le pilote audio : écriture échouée : %s" #: src/sound-oss.c:229 #, c-format msgid "Error in sound driver: read failed: %s" msgstr "Erreur dans le pilote son: lecture échoué: %s" #: src/sound-oss.c:253 src/sound-oss.c:385 #, c-format msgid "Error in sound driver: select failed: %s" msgstr "Erreur dans le pilote audio : sélection échouée : %s" #: src/sound-oss.c:440 msgid "OSS preferences" msgstr "Préférences OSS" #: src/sound-oss.c:450 msgid "Playback device file:" msgstr "Fichier du périphérique de lecture : " #: src/sound-oss.c:459 msgid "Recording device file:" msgstr "Fichier du périphérique d'enregistrement : " #: src/sound-oss.c:465 msgid "Avoid select calls (try this if recording locks up)" msgstr "Éviter les appels de sélection (à essayer si l'enregistrement bloque)" #: src/sound-portaudio.c:61 msgid "sound-portaudio: No output devices available!" msgstr "sound-portaudio : pas de périphérique de sortie disponible !" #: src/sound-portaudio.c:63 msgid "sound-portaudio: No input devices available!" msgstr "sound-portaudio : pas de périphériques d'entrée disponible !" #: src/sound-portaudio.c:191 src/sound-portaudio.c:278 #, c-format msgid "Pa_OpenStream failed: %s\n" msgstr "Pa_OpenStream a échoué : %s\n" #: src/sound-portaudio.c:252 msgid "Buffer overrun!" msgstr "Dépassement tampon !" #: src/sound-sdl.c:38 #, c-format msgid "Could not initialize SDL: %s" msgstr "Impossible d'initialiser SDL : %s" #: src/sound-sdl.c:89 #, c-format msgid "SDL: Couldn't open audio: %s" msgstr "SDL : impossible d'ouvrir l'audio : %s" #: src/sound-sun.c:72 #, c-format msgid "SunAudio: Couldn't open %s" msgstr "SunAudio : impossible d'ouvrir %s" #: src/sound-sun.c:159 msgid "SunAudio: Error writing to sound device" msgstr "SunAudio: Erreur d'écriture dans le périphérique son" #: src/sound-sun.c:241 msgid "SunAudio: Error reading from sound device" msgstr "SunAudio : erreur lors de la lecture depuis le périphérique audio" #: src/soxdialog.c:54 msgid "Echo" msgstr "Écho" #: src/soxdialog.c:55 msgid "Echo sequence" msgstr "Séquence écho" #: src/soxdialog.c:56 msgid "Reverb" msgstr "Reverb" #: src/soxdialog.c:57 msgid "Chorus" msgstr "Chorus" #: src/soxdialog.c:58 msgid "Flanger" msgstr "Flanger" #: src/soxdialog.c:59 msgid "Phaser" msgstr "Phaser" #: src/soxdialog.c:60 msgid "Compress/Expand" msgstr "Compresser/étendre" #: src/soxdialog.c:61 msgid "Pitch adjust" msgstr "Ajuster la tonalité" #: src/soxdialog.c:62 msgid "Time stretch" msgstr "Étirement du temps" #: src/soxdialog.c:63 msgid "DC Shift" msgstr "Décalage DC" #: src/soxdialog.c:64 msgid "Masking noise" msgstr "Masquer le bruit" #: src/soxdialog.c:65 msgid "Reverse" msgstr "Renversement" #: src/soxdialog.c:66 msgid "Earwax" msgstr "Earwax" #: src/soxdialog.c:67 msgid "Vibro" msgstr "Vibro" #: src/soxdialog.c:68 msgid "Lowpass filter (single-pole)" msgstr "Filtre passe-bas (pôle simple)" #: src/soxdialog.c:69 msgid "Highpass filter (single-pole)" msgstr "Filtre passe-haut (pôle simple)" #: src/soxdialog.c:70 msgid "Bandpass filter" msgstr "Filtre passe-bande" #: src/soxdialog.c:71 msgid "Butterworth lowpass filter" msgstr "Filtre passe-bas Butterworth" #: src/soxdialog.c:72 msgid "Butterworth highpass filter" msgstr "Filtre passe-haut Butterworth" #: src/soxdialog.c:73 msgid "Butterworth bandpass filter" msgstr "Filtre passe-bande Butterworth" #: src/soxdialog.c:74 msgid "Butterworth bandreject filter" msgstr "Filtre coupe-bande Butterworth" #: src/soxdialog.c:75 msgid "Sinc-windowed filter" msgstr "Filtre Sinc-windowed" #: src/soxdialog.c:312 msgid "Frequency: " msgstr "Fréquence : " #: src/soxdialog.c:317 src/soxdialog.c:324 src/soxdialog.c:483 #: src/soxdialog.c:485 msgid "Hz" msgstr "Hz" #: src/soxdialog.c:327 msgid "Noise mode" msgstr "Mode bruit" #: src/soxdialog.c:387 msgid "Reverb time: " msgstr "Temps de réverbération : " #: src/soxdialog.c:392 msgid "ms" msgstr "ms" #: src/soxdialog.c:397 msgid "Delay (ms) " msgstr "Délai (ms) " #: src/soxdialog.c:400 msgid "Decay " msgstr "Affaiblissement" #: src/soxdialog.c:404 msgid "Speed (Hz) " msgstr "Vitesse (Hz) " #: src/soxdialog.c:408 msgid "Depth (ms) " msgstr "Profondeur (ms) " #: src/soxdialog.c:412 msgid "Modulation " msgstr "Modulation " #: src/soxdialog.c:415 msgid "Modulation|Sinusoidal" msgstr "Sinusoïdale" #: src/soxdialog.c:416 msgid "Modulation|Triangular" msgstr "Triangulaire" #: src/soxdialog.c:429 msgid "(Lines with delay=0 will be ignored.)" msgstr "(Les lignes avec délai=0 seront ignorées)" #: src/soxdialog.c:448 src/soxdialog.c:450 src/soxdialog.c:454 #: src/soxdialog.c:456 src/soxdialog.c:458 msgid "Input gain: " msgstr "Gain entrée : " #: src/soxdialog.c:452 msgid "Output gain: " msgstr "Gain sortie : " #: src/soxdialog.c:464 msgid "Width: " msgstr "Largeur : " #: src/soxdialog.c:470 src/soxdialog.c:472 msgid "Bandwidth: " msgstr "Bande passante : " #: src/soxdialog.c:481 msgid "Filter type: " msgstr "Type de filtre : " #: src/soxdialog.c:482 msgid "Low 6dB corner: " msgstr "Coin 6dB faible : " #: src/soxdialog.c:484 msgid "High 6db corner: " msgstr "Coin 6db élevé : " #: src/soxdialog.c:486 msgid "Window length: " msgstr "Taille de fenêtre : " #: src/soxdialog.c:488 msgid "Beta" msgstr "Bêta" #: src/soxdialog.c:491 msgid "Lowpass" msgstr "Passe-bas" #: src/soxdialog.c:492 msgid "Highpass" msgstr "Passe-haut" #: src/soxdialog.c:493 msgid "Bandpass" msgstr "Passe-bande" #: src/soxdialog.c:526 msgid "Attack integration time: " msgstr "Temps d'intégration d'attaque : " #: src/soxdialog.c:530 src/soxdialog.c:535 src/soxdialog.c:565 msgid " seconds" msgstr " secondes" #: src/soxdialog.c:531 msgid "Decay integration time: " msgstr "Temps d'intégration de l'affaiblissement : " #: src/soxdialog.c:538 msgid "Input level (dB)" msgstr "Niveau d'entrée (dB)" #: src/soxdialog.c:539 msgid "Output level (dB)" msgstr "Niveau de sortie (dB)" #: src/soxdialog.c:552 msgid "Post-processing gain: " msgstr "Gain post-traitement : " #: src/soxdialog.c:556 msgid " dB" msgstr " dB" #: src/soxdialog.c:557 msgid "Initial volume: " msgstr "Volume initial : " #: src/soxdialog.c:561 msgid "Delay time: " msgstr "Temps du délai : " #: src/soxdialog.c:570 msgid "Shift amount: " msgstr "Quantité de décalage : " #: src/soxdialog.c:574 msgid "Peak limiter" msgstr "Limiteur de pic" #: src/soxdialog.c:578 msgid "Limiter gain: " msgstr "Limite du gain : " #: src/soxdialog.c:591 msgid "Amount: " msgstr "Quantité : " #: src/soxdialog.c:592 msgid " cents" msgstr " cents" #: src/soxdialog.c:593 msgid "Window width: " msgstr "Largeur de la fenêtre : " #: src/soxdialog.c:594 src/soxdialog.c:625 msgid " ms" msgstr " ms" #: src/soxdialog.c:595 msgid "Interpolation: " msgstr "Interpolation : " #: src/soxdialog.c:596 msgid "Fade: " msgstr "Fondu : " #: src/soxdialog.c:605 msgid "Interpolation|Cubic" msgstr "Cubique" #: src/soxdialog.c:606 msgid "Interpolation|Linear" msgstr "Linéaire" #: src/soxdialog.c:612 msgid "Fade|Cos" msgstr "Cos" #: src/soxdialog.c:613 msgid "Fade|Hamming" msgstr "Martelé" #: src/soxdialog.c:614 msgid "Fade|Linear" msgstr "Linéaire" #: src/soxdialog.c:615 msgid "Fade|Trapezoid" msgstr "Trapèzoïde" #: src/soxdialog.c:623 msgid "Factor: " msgstr "Facteur : " #: src/soxdialog.c:624 msgid "Window size: " msgstr "Taille de la fenêtre : " #: src/soxdialog.c:636 msgid "Speed: " msgstr "Vitesse : " #: src/soxdialog.c:637 msgid " Hz" msgstr " Hz" #: src/soxdialog.c:638 msgid "Depth: " msgstr "Profondeur : " #: src/soxdialog.c:649 msgid "This effect has no options." msgstr "Cet effet n'a pas d'option." #: src/soxdialog.c:723 msgid "Error creating pipe" msgstr "Erreur lors du passage d'information" #: src/soxdialog.c:730 msgid "Couldn't fork" msgstr "Impossible de séparer" #: src/soxdialog.c:745 #, c-format msgid "Error running 'sox -h': %s\n" msgstr "Erreur lors du déroulement de 'sox -h' : %s\n" #: src/soxdialog.c:747 msgid "Should not reach this point" msgstr "Ne devrait pas atteindre ce point" #: src/soxdialog.c:762 msgid "Error reading sox output" msgstr "Erreur lors de la lecture de la sortie de SoX" #: src/soxdialog.c:794 msgid "Unable to detect supported SoX effects" msgstr "Impossible de détecter les effets SoX supportés" #: src/soxdialog.c:832 msgid "Sox support couldn't be initialized" msgstr "Le support de Sox n'a pu être initialisé" #: src/speeddialog.c:58 msgid "Speed:" msgstr "Vitesse :" #: src/statusbar.c:72 msgid "(no file loaded)" msgstr "(pas de fichier chargé)" #: src/statusbar.c:235 msgid "Cursor: running" msgstr "Curseur : lecture" #: src/statusbar.c:237 msgid "Cursor: " msgstr "Curseur : " #: src/statusbar.c:260 #, c-format msgid "View: [ %s - %s ]" msgstr "Affichage : [ %s - %s ]" #: src/statusbar.c:281 #, c-format msgid "Selection: %s+%s" msgstr "Sélection : %s+%s" #: src/statusbar.c:304 msgid "Processing data" msgstr "Traitement des données" #: src/statusbar.c:306 #, c-format msgid "%s... (Press ESC to cancel)" msgstr "%s... (Appuyez sur ESC pour annuler)" #: src/um.c:51 msgid "mhWaveEdit: " msgstr "mhWaveEdit : " #: src/um.c:64 #, c-format msgid "mhWaveEdit: %s: %s\n" msgstr "mhWaveEdit : %s : %s\n" #: src/um.c:97 msgid "Message" msgstr "Message" #: src/um.c:117 msgid "Yes" msgstr "Oui" #: src/um.c:125 msgid "No" msgstr "Non" #: src/um.c:318 msgid "Input" msgstr "Entrée" #: src/um.c:407 msgid "Choice" msgstr "Choix" #: src/volumedialog.c:71 msgid "Calculating peak volume..." msgstr "Calcul du volume de pic..." #: src/volumedialog.c:87 msgid "Start:" msgstr "Début :" #: src/volumedialog.c:90 msgid "End:" msgstr "Fin :" #: src/volumedialog.c:109 msgid "Find top volume" msgstr "Trouver le volume le plus haut" #: src/document.c:230 #, c-format msgid "untitled #%d" msgstr "sans titre #%d" #: src/document.c:282 msgid "" "Loading and then saving files with 'lossy' formats (like mp3 and ogg) leads " "to a quality loss, also for the unmodified parts of the file." msgstr "" "Charger puis sauvegarder des fichiers avec des formats 'à perte' (comme le " "mp3 et le ogg) conduit à une perte de qualité, y compris pour les parties " "non-modifiée du fichier." #: src/session.c:87 msgid "Error opening session directory" msgstr "Erreur lors de l'ouverture du répertoire de la session" #: src/session.c:104 src/session.c:164 #, c-format msgid "%s: Wrong file type" msgstr "%s : mauvais type de fichier" #: src/session.c:238 msgid "Could not create session file" msgstr "Échec de la création d'une fichier" #: src/session.c:280 msgid "" "The files that belonged to the crashed session have been recovered. Any " "files that are not saved will be removed permanently.\n" "\n" "(This notice is only shown once)" msgstr "" "Les fichiers qui appartiennent à la session plantée ont été récupérés. Tout " "fichier n'étant pas sauvé sera détruit irrémédiablement.\n" "\n" "(Cette notice n'est affichée qu'une seule fois)" #: src/session.c:380 msgid "Suspended" msgstr "Suspendu" #: src/session.c:380 src/session.c:381 msgid "Crash" msgstr "Plantage" #: src/session.c:381 msgid "Left files" msgstr "Restes de fichiers" #: src/session.c:391 #, c-format msgid "%s on %s(%d files, %ld bytes)" msgstr "%s sur %s(%d fichiers, %ld octets)" #: src/session.c:409 msgid "Sessions" msgstr "Sessions" #: src/session.c:419 msgid "" "Earlier sessions were found. Choose one to resume or start a new session." msgstr "" "Des sessions précédentes ont été trouvées. Choisissez en une pour la " "reprendre ou commencez une nouvelle session." #: src/session.c:439 msgid "Resume selected" msgstr "Récupérer la session sélectionnée" #: src/session.c:449 msgid "Delete selected" msgstr "Effacer la session sélectionnée" #: src/session.c:456 msgid "Start new session" msgstr "Démarrer une nouvelle session" #: src/session.c:462 msgid "Exit" msgstr "Quitter" #: src/mapchannelsdialog.c:116 msgid "This effect applies to the whole file, not just the selection" msgstr "" "Cet effet s'applique sur tout le fichier, pas seulement sur la sélection" #: src/mapchannelsdialog.c:123 msgid "Output channels: " msgstr "Canaux de sortie : " #: src/mapchannelsdialog.c:130 msgid "Map" msgstr "Route" #: src/mapchannelsdialog.c:137 msgid "Source" msgstr "Source" #: src/mapchannelsdialog.c:139 msgid "Destination" msgstr "Destination" #: src/sandwichdialog.c:107 msgid "Align beginning of files" msgstr "Alignement sur le début des fichiers" #: src/sandwichdialog.c:110 msgid "Align end of files" msgstr "Alignement sur la fin des fichiers" #: src/sandwichdialog.c:113 msgid "Align at marker: " msgstr "Alignement au marqueur : " #: src/sandwichdialog.c:126 msgid "Add channels from: " msgstr "Ajout des canaux depuis : " #: src/sandwichdialog.c:130 msgid "Alignment" msgstr "Alignement" #, fuzzy #~ msgid "Floating-point (single)" #~ msgstr "Virgule flottante, simple" #, fuzzy #~ msgid "Floating-point (double)" #~ msgstr "Virgule flottante, double" #~ msgid "double" #~ msgstr "double" #~ msgid "float" #~ msgstr "flottante" #~ msgid "mhWaveEdit: %s (%s): %d Hz, %d bit" #~ msgstr "mhWaveEdit : %s (%s) : %d Hz, %d bit" #~ msgid "Follow cursor while playing" #~ msgstr "Suivre le curseur pendant la lecture" #~ msgid "Removing channel" #~ msgstr "Suppression du canal" #~ msgid "Mapping channels" #~ msgstr "Router des canaux" #~ msgid "Removing channels" #~ msgstr "Suppression des canaux" #~ msgid "Choose a sample format" #~ msgstr "Choix du format de l'échantillon" #~ msgid "%d-bit" #~ msgstr "%d-bit" #~ msgid "%s (%s %s %d Hz)" #~ msgstr "%s (%s %s %d Hz)" #~ msgid "%s %s %d Hz" #~ msgstr "%s %s %d Hz" #~ msgid "Other format..." #~ msgstr "Autre format..." #~ msgid "" #~ "To add this format to the presets, enter a name below. Otherwise, leave " #~ "it blank." #~ msgstr "" #~ "Pour ajouter ce format aux pré-réglages, entrez un nom ci dessous. Sinon, " #~ "laissez-le vide." #~ msgid "Sound device file:" #~ msgstr "Fichier de périphérique audio :" #~ msgid "" #~ "Environment variable LADSPA_PATH not set.\n" #~ "LADSPA support is disabled." #~ msgstr "" #~ "La variable d'environnement LADSPA_PATH n'est pas définie.\n" #~ "Le support LADSPA est donc désactivé." #~ msgid "8-bit wav-files must be in unsigned format!" #~ msgstr "Les fichiers wav 8-bit doivent être au format non-signé !" #~ msgid "16/24/32-bit wav-files must be in signed format!" #~ msgstr "Les fichiers wav 16/24/32-bit doivent être au format signé !" #~ msgid "wav files must be in little endian format!" #~ msgstr "Les fichiers wav doivent être au format Petit-Boutiste!" #~ msgid "/Debug/Mark as modified" #~ msgstr "/Déboguage/Marqué comme modifié" #~ msgid "[B] Convert samplerate" #~ msgstr "[B] Convertir le taux d'échantillonnage" #~ msgid "[B] Speed" #~ msgstr "[B] Vitesse" #~ msgid "Channel %d" #~ msgstr "Canal %d" #~ msgid "/Effects/Sp_lit channel..." #~ msgstr "/Effets/Séparer _les canaux..." #~ msgid "SoX only supports 8, 16 and 32-bit sample sizes" #~ msgstr "SoX supporte uniquement les échantillons de 8, 16, et 32-bit " mhwaveedit-1.4.24/po/insert-header.sin000066400000000000000000000012401334022513400176140ustar00rootroot00000000000000# Sed script that inserts the file called HEADER before the header entry. # # At each occurrence of a line starting with "msgid ", we execute the following # commands. At the first occurrence, insert the file. At the following # occurrences, do nothing. The distinction between the first and the following # occurrences is achieved by looking at the hold space. /^msgid /{ x # Test if the hold space is empty. s/m/m/ ta # Yes it was empty. First occurrence. Read the file. r HEADER # Output the file's contents by reading the next line. But don't lose the # current line while doing this. g N bb :a # The hold space was nonempty. Following occurrences. Do nothing. x :b } mhwaveedit-1.4.24/po/it.gmo000066400000000000000000002332401334022513400154760ustar00rootroot00000000000000:O3D.D (E6E9Ep>EEmvFFG7HH_I5JQ6JJ3KLAM|M:ENN NNNNN NN O'OAOQOeOuOOOOO OPP+P=P APOP `P nP|PPPPPPPQ Q,Q=QDQVQ]QaQeQ nQzQ QQQQQRR01RbR qR%}RR!RJRI.S xSS SSVS/T@T#WT{TTTT.T-U/=U.mU UUUUUV%V7VPVcV}VVV V VVVWW1WHW ^W jWuWWWWWWW W XX *X 7X CX OX ZX eX pX {XX(XX"XXY6YHY[YuY YYYYY!Z 8Z FZ TZ bZpZZ Z ZZ Z Z Z ZZ [[[ -[:[J[`[x[ [ [[[[[ [ [\\,\@\P\_\o\\\\ \ \\\\\\]*] 3]!>] `]ik] ],]- ^#;^>_^ ^^^^ _!_2_C_V_s_ _____u``` ` ``ca*b 3b!>b`b fbqb bb b$bbcc0c,Kc-xcc3c ccc ddd &d 1dey Ψ11Q##˩ /B`JPX hvY?߫#5ɬ2|2lů-2` P[)` 8αֱݱ266V  òͲ(Ѳ#6Tfz #$Ƴ *@PYSJX ڷ  $ 3? GU#]-%#ո!,-Hv <8Ӻ o$e7\4^$2e7"Z k v"#=Map (= A KYh ~ "2BX`u|  '<4S )M GY J59o 3 5@1v3% Cd!} - ;IPg{ 9Nh!0? NX)r&$.A[u!  & 4 BPe   $ 4BTh |  #<#Vz  $ 0 :ELT\/d $ p @1K4}%< 9Yy !@V_!9 P ]k0 &9 AL!f % 6!4X 3   ). 4@Qar    " 0;7Bz,"#4"=`z &# ?1'q ('Fn&*D(o/-*)T0n#+63j~ (< Tbv 1G Z hu W;SXp P ''"/)R#|+:. H i'&(':@{5;* 5N'j"( $5Lb+{-$7 A^s  af2 YqyI; S_8h '+FDI wUhAU|  ( .C7Y>Ow_,+#1O&    6 D R^v#B S!_=   ) /< P^u   $%<be tb  =L] z "2, @LT[v% ? KY r}  @   ! , < (B k {         + A [ s         6 F Y &n        # [9       $ +3B_{)'*B \fm+&Ow%i %< V`q  )'Bjr)b$RMlHIfs<T0Wi?bQ9X2-[`DP ! B = #8!\!7{!!!!!"" ("6"K"f"n-## #2###2$O$+f$$$$ $$$$% 9%"Z%3}%<%0%.&N&n&~&&&&&"&&' '' ((]0(B(((@),)M);+gQ,.,, - -'- .6.T.].e.5k..1.E."/ &/&1/X/ a/o/#s/!////0!0?0E0#W0${00 00011Z1N+2z2]e33 444444 55(515@5#H5-l5%5#5!5<6:C6~666s?.Ve @ p j(R -# "z/]b{('*6N~LK :C"?ml`!9|F3@X,AlPCG-J2VhI` M&f6( !<N+r%V$O/.]0L8'LICwgR tKSkcEe$^:qS_0"AcHw$ Y9}[og+ 411E:GY7UU ! -a1R(?THF@23uZif8|K T|8X q)4:*O~y>n*7t#p_0x&UQd/5%icdo=TZ0<h,i5<`]3,J#ISEs8D.bW=\m1B!dNhXx&5^Q)}kM.j [6J9jrb}eg[M#+= mD%Bopu '~Wlr&>wDakf,vx5\Q7q^GtZ P2HPA / nW\ O4)'+*BuF9{4"Y)2s{>z y;n-v;;yva3%6_z 7$ Test results (1 time unit = %f usec/sample) Window '%s' By setting starting volume and ending volume to the same value you get a simple amplification of the sound. Note that volumes above 100% may cause sound distortion. Use the 'Find top volume' to find out the maximum amplification possible without distortion. (You can use this for normalizing samples.) The 'Don't actually change the data' option can be used if the program was wrong about the file's format. This "byte swaps" the selected part. It can be used to repair damaged files where the byte order is wrong. Note that if the sound looks alright but plays wrong, you should not use this option, instead you should use the "byte-swap output" option in the Preferences dialog. This amplifies the sound as much as possible without getting clipping distortion. The "Normalize to..." item lets you specify which level to normalize to. This converts the sample format of the entire file. This converts the samplerate of the entire file to one you specify. There are different methods for doing this, usually the one in the top has the best quality but can take longer than the other methode. This copies the first channel to a new channel in the sound, converting mono to stereo etc. This creates a linear fade in or fade out effect. This effect changes the speed of the selection. The tone will change as well. This effect is for advanced users wanting to pipe raw audio data through an external program. The output of the program is read back and replaces the processed part. This effect lets you create a new sound by a linear combination of the old channels. This means you can do channel mixing / swapping / balance / panning / amplification etc. by entering different values. For example, to swap the left and right channel, you select that the new Channel 1 should be 0% of the old Channel 1 and 100% of the old Channel 2, and the new Channel 2 should be 100% of the old Channel 1 and 0% of the old Channel 2 This effect lets you select a starting volume and a ending volume and amplifies the selection fading from the starting volume to the ending volume. This mixes all channels of the file together to a mono sound. With this effect, you can change the number of channels in the file. You can also rearrange and add (i.e. mix) channels. gdb /usr/local/bin/mhwaveedit core | tee backtrace.txt Current chunk: History: Testing all conversions.. Testing ranges... and: * Add channel * Byte swap * Combine channels... * Convert sample format... * Convert samplerate... * Fade in/out * Map channels... * Mix to mono * Normalize, Normalize to... * Pipe through program... * Speed adjustment... * Volume adjust/fade... Advanced settings Dithering Driver options External applications Fallback format Hz Input audio Input controls Input ports Main window Output audio Output controls Output ports Playback settings Rate conversions Sample conversion Temporary file directories Temporary file settings Time format Variable speed View Window contents cents dB ms seconds%d channels%s is not a valid wav file%s kbit/s%s on %s(%d files, %ld bytes)%s... (Press ESC to cancel)%s: Expected '=': %s %s: Expected value: %s %s: Wrong file type'%s' is not a number!( Play first 3 seconds of selection (H')MM:SS.mmmm(H')MM:SS.t(Lines with delay=0 will be ignored.)(SoX) Polyphase interpolation(SoX) Simulated analog filtration(This changes the sample rate of the entire file, not just the selection)(This changes the sample type of the entire file, not just the selection)(expected) (no file loaded)(no limit)(number) Goto mark (use a negative number to place the cursor before instead of after the selected point)) Play last 3 seconds of selection +,= Zoom in , Play from cursor pos - Zoom out . Stop / Play selection /Cursor/Find zero-crossing/Cursor/Find zero-crossing/Left (all channels)/Cursor/Find zero-crossing/Left (any channel)/Cursor/Find zero-crossing/Right (all channels)/Cursor/Find zero-crossing/Right (any channel)/Cursor/Move/Cursor/Move to/Cursor/Move to/Beginning/Cursor/Move to/End/Cursor/Move to/Selection end/Cursor/Move to/Selection start/Cursor/Move/Left/Cursor/Move/Left sample/Cursor/Move/Right/Cursor/Move/Right sample/Cursor/Position cursor.../Cursor/Set selection end/Cursor/Set selection start/Cursor/sep1/Cursor/sep2/Debug/Debug/Check opencount/Debug/Dummy effect/Debug/Dummy effect FP/Debug/Dump chunk info/Edit/Clear clipboard/Edit/Cr_op/Edit/Cu_t/Edit/Insert _silence/Edit/Paste _over/Edit/Paste to _new/Edit/Preferences/Edit/Select _all/Edit/Select none/Edit/Silence selection/Edit/_Copy/Edit/_Delete/Edit/_Mix paste/Edit/_Paste/Edit/_Redo/Edit/_Undo/Edit/sep1/Edit/sep2/Edit/sep3/Edit/sep4/Effec_ts/Effects/Add channe_l/Effects/Add channels from other file.../Effects/B_yte swap/Effects/Convert sample _format.../Effects/Convert sample_rate.../Effects/Effects dialog.../Effects/Fade _in/Effects/Fade o_ut/Effects/Ma_p channels.../Effects/Normali_ze to.../Effects/Pipe through program.../Effects/_Combine channels.../Effects/_Mix to mono/Effects/_Normalize/Effects/_Speed adjustment.../Effects/_Volume adjust (fade).../Effects/sep1/Effects/sep2/Effects/sep3/Effects/sep4/File/Save _as.../File/Save selection as.../File/_Close/File/_Exit/File/_Open.../File/_Save/File/sep1/File/sep2/Help/_About/Help/_Documentation/Move Down/Move Up/Move to Bottom/Move to Top/Play/Play _all/Play/Play se_lection/Play/_Play from cursor/Play/_Record.../Play/_Stop/Play/sep1/Rebuild Effect List/Restore Order/Sort by Author/Sort by Location/Sort by Name/Sort by Type/View/Buffer position/View/Slider labels/View/Sp_eed slider/View/Zoom _all/View/Zoom _in/View/Zoom _out/View/Zoom to _selection/View/_Horizontal zoom/View/_Time scale/View/_Vertical zoom/View/sep1/View/sep2/_Cursor/_Edit/_File/_Help/_Play/_View1. Enable core dumps: ulimit -c unlimited 16 bit PCM2. Run the program: mhwaveedit 24 bit PCM3. Make the program crash. You should now get a file named core or core.1234 in the directory you're in. 32 bit PCM4. Run gdb with the program and core file: 5. After gdb has loaded, use the command: bt 6. Quit gdb with the command: quit 7. Now you should have a back trace in the file backtrace.txt 8 bit PCM< Zoom all > Zoom to selection ALSA PreferencesAbout mhWaveEditActivation failed!Add channels from other fileAdd channels from: Add presetAdd/Update presetAdjusting speedAdvancedAfter you've filled in all the translations you want (you don't have to translate all the strings), mail in the po file to me (see contact info) and I'll add it to the next release. Align at marker: Align beginning of filesAlign end of filesAlignmentAlignment:All editing functions work non-destructively, that is, the file you're editing isn't actually changed until you save it (the effects also work this way). All supported effects can be found by choosing the 'Effects...' menu item. The effects are listed with names beginning with [B] for builtin effects, [L] for LADSPA effects, and [S] for SoX effects. Amount: AmplifyingAmplifying (by %3.1f%% / %+.1fdB)ApplyApply to: Applying effect '%s'Arrow keys Scroll left/right Attack integration time: Author: %sAuto dete_ct driver on each start-upAuto return to playback startAuto stop in: Auto-_reset speedAuto-detect from extensionAutomatically connect input ports on startupAutomatically connect output ports on startupAverage bitrateAvoid select calls (try this if recording locks up)BackgroundBandpassBandpass filterBandwidth: BetaBiasedBig endianBig-endianBlackBottomBottom bytesBrowse directoryBuffer overrun!Buffer positionBug reportingBuilt-inButterworth bandpass filterButterworth bandreject filterButterworth highpass filterButterworth lowpass filterBy default, mhWaveEdit uses floating-point temporary files for storing processed results to avoid rounding until the file is saved. BypassBytes written: Calculating peak levelCalculating peak volume...CancelCh%dChannels: ChoiceChorusChunk %p has opencount=%d Client name: Clipping: CloseClose dialog after applying effectColorsCombine channelsCombining channelsCommand failed without returning any dataCommand line: Compiled %s %sCompress/ExpandConnection from %s to %s failed: %sConstant bitrateContactConversion test failed, between: Convert sample formatConvert samplerateConverting samplerateCopy the current selectionCopyright: %sCould not connect to the JACK server.Could not create pipe: %sCould not create session fileCould not find home directory. Using current directory as home directory.Could not get file position in %s: %sCould not initialize SDL: %sCould not open %s: %sCould not open '%s': %sCould not read from %s: %sCould not remove '%s': %sCould not seek in %s: %sCouldn't connect to ESD daemon: %sCouldn't forkCouldn't open %sCrashCtrl+(number) Set mark Ctrl+A Select all Ctrl+C Copy Ctrl+D Delete Ctrl+E Effects Ctrl+G Position cursor (Go to) Ctrl+H Position cursor at file start Ctrl+J Position cursor at file end Ctrl+K Position cursor at selection start Ctrl+L Position cursor at selection end Ctrl+O Open file Ctrl+P Preferences Ctrl+Q Selection start at cursor Ctrl+S Save file Ctrl+Tab Move cursor to center of view Ctrl+U Save selection as Ctrl+V Paste Ctrl+W Selection end at cursor Ctrl+X Cut Ctrl+Z Undo Ctrl+arrow Move cursor (and playback) half second Current sound driver: %sCurrently it is impossible to play and record at the same time, so the playback will stop when you record. CursorCursor: Cursor: runningCustom argumentCustom argument: Custom formatCustomize co_lors...Cut out the current selectionCut, copy and paste operations move the data around without modifying it, so these don't degrade the sound quality. Because of level differences, you may get a "step" at the start and end of the inserted part, which can cause a small clicking sound. DC ShiftDecay Decay integration time: DecodingDecompressDelay (ms) Delay time: Delete Delete Delete selectedDelete the selectionDepth (ms) Depth: DestinationDirect accessDisableDisk editing _threshold: Display t_imes as: Distributed under GNU General Public License. For information, see the file COPYINGDon't actually change the data (for repairing bad files etc)DownDummy (no sound)ESD preferencesEach mhwaveedit process creates a session file in the .mhwaveedit directory called mhwaveedit-session---, where is the session ID number and is a character code showing the state of the session ('r' for running sessions). Earlier sessions were found. Choose one to resume or start a new session.EarwaxEchoEcho sequenceEditingEffect %s contains invalid port %sEffectsEnable _dithering for editingEnable _variable speed playbackEnable dithering for _playbackEncoding type: End Move view to file end End:Endianness: Error changing samplerate conversion ratio: %s Error closing %s: %sError converting samplerate: %s Error creating link to '%s': %sError creating pipeError in sound driver: ioctl failed: %sError in sound driver: read failed: %sError in sound driver: select failed: %sError in sound driver: write failed: %sError initialising sample rate conversion: %sError launching mixer: fork: %sError opening ALSA device '%s' for playback: %sError opening ALSA device '%s' for recording: %sError opening session directoryError reading %s: %sError reading from %s: %sError reading from sub process: %sError reading sox outputError running 'sox -h': %s Error seeking in %s: %sError writing to subprocess: %sError: %sError: fork: %sEsounD driver: readEsounD driver: selectEsounD driver: writeEsounD: Unable to open playback streamEsounD: Unable to open recording streamEsound connection closed by serverEven if mhWaveEdit was originally built for editing wav files, it's also possible to load and save in a few other formats. mhWaveEdit always supports wav and raw files, but if it's compiled with the libsndfile library, mhWaveEdit supports a couple of other formats as well. Event driven I/OExitExpected driver name after --driver optionExtreme (higher quality)F1 Help F12 Record Factor: Fade: Fade|CosFade|HammingFade|LinearFade|TrapezoidFailed to open '%s'!Failed to write to '%s'!Feature requests are also welcome, report them to the mailing list or to the bug tracker. File already exists. Overwrite?File already has the selected sample formatFile formatsFile type: FilesFilter type: Find top volumeFinding zero-crossingFinishFirst of all, look for bugs and report all bugs you find into the bug tracker or through e-mail. Sometimes a bug can get overlooked for a long time because nobody reports it, so don't be afraid to report bugs that have been there for a few releases. You don't have to provide fixes or very detailed information, although it helps of course. FlangerFloating-point (double %s) Floating-point (single %s) Floating-point, doubleFloating-point, singleFor bug reports, translation updates, patches and PayPal donations: Format not selectedFrequency: GeneralH,J Move cursor (and playback) 1/8 of view Header bytes: HeavyHelping outHigh 6db corner: HighpassHighpass filter (single-pole)Home Move view to file start How to create a backtrace: HzI,O Move cursor to nearest any-channel zero-crossing If a translation is incomplete, you're very welcome to translate the remaining untranslated messages and mail them in. Corrections to translations are also appreciated, but they may need to be checked with the previous translator before including them. If mplayer is installed, mhwaveedit can open all formats that it supports, for example the soundtrack of a video file. Since mplayer is only a player, these files can not be saved back after editing, you have to save the file into a supported format. If the cursor starts running too early when jumping, this delay should be increased.If you find a bug or flaw in the program that's not mentioned in the BUGS file, report the bug in the bug tracker (see contact info) or mail a bug report describing the bug to: magnus.hjorth@home.se If you speak a language other than English and mhWaveEdit isn't translated to your language, you can contribute a translation. To do that, copy the template mhwaveedit.pot in the po directory into a new file ll.po, where ll is your language code (see http://www.gnu.org/software/gettext/manual/html_node/gettext_221.html for a list of language codes). Ignoring extreme old window size/position values In case of a crash, please do not send me any core dumps. They are huge and completely useless to me. Instead, create a backtrace. Backtraces tell you exactly where the program crashed. In the sample view there is a grey vertical bar called the 'cursor'. The cursor follows the sound wave when you play the sound. You can position the cursor by clicking with the right (2:nd) mouse button. If you do this while you're playing a file, the playing will continue from the new cursor position. You can also position the cursor more exact by using the 'Position Cursor...' command on the Edit menu. Initial volume: InputInput gain: Input level (dB)Input levelsInsane (highest possible quality)Insert SilenceInterfaceInterpolation: Interpolation|CubicInterpolation|LinearInvalid driver name: %s Using '%s' driver insteadInvalid number of input ports.Invalid number of output ports.Invalid sample format or number of channels for this file formatInvalid time value. Time must be specified in the form (HH')MM:SS(.mmmm)It's possible to edit po-files by hand, but I recommend a program such as poEdit (http://www.poedit.org) for editing translations. Jack PreferencesJump delay:K,L Move cursor one sample Keep data in unmapped output channelsKeep main _window in front after applying effectKeep view and playback togetherKeyboard shortcutsL WaveformLadspa: Error scanning %sLaunch mixerLeftLeft filesLevel: Limiter gain: Little endianLittle-endianLoad FileLoad a file from diskLoadingLoading and then saving files with 'lossy' formats (like mp3 and ogg) leads to a quality loss, also for the unmodified parts of the file.Loop mode (play over and over)Low 6dB corner: LowpassLowpass filter (single-pole)MP3 PreferencesMailing list (you must be a subscriber before you can post messages): MapMap channelsMarksMasking noiseMessageMethod: Mi_xer utility: Microsoft WAV formatMildMixingMixing channelsModulation Modulation|SinusoidalModulation|TriangularMonoN/AName :New samplerate: NoNo errors detected!No file with that name!Noise modeNoneNormalization mode: Normalize to...Note that for those translatable strings that look like "RecordStatus|Paused", you should ignore what's to the left and only translate the string to the right ("Paused" in this example). This convention is there to make it possible to translate the same string to different things depending on context. Number of ports (0-8): Number of recent files in File menu: OKOSS preferencesOgg VorbisOn this system, libsndfile is required to save floating-point wav files.Open with MPlayerOtherOutput _buffer size:Output channels: Output from command '%s': Output gain: Output level (dB)Over/underrun in JACK driverOverruns: PCM, %d(%d) bit, %s %s Pa_OpenStream failed: %s PackedPaste at cursor positionPaste, overwriting the data after the cursor positionPause recordingPeak limiterPeak max: Peak: PhaserPipe through programPitch adjustPlace cursor Play _mono files as stereoPlay from cursor positionPlay selected areaPlaybackPlayback device file:Playback device: PlayingPlaying a file is simple, just load the file and press the play button. The green play button plays from the current position. The yellow play button plays the current selection, or the entire file if nothing is selected. Stop the playback with the stop button (with the red square). Port #%dPosition cursorPost-processing gain: PreferencesPreparing tests..Presets:Process outputProcessing dataProgress barProject page with bug tracker, mailing list membership: Pure-ScaledQualityQuality: R WaveformRMS: Range test failed for format: Raw PCM dataReady for recordingRecordRecordStatus|PausedRecordStatus|RecordingRecordingRecording device file:Recording device: Recording is done with 'Record...' on the Play menu, or the Record button (the red circle). A dialog box will pop up where you can select what format you want to record in. After selecting the format, meters and numbers will appear showing info about the volume level of the sound input. Recording settingsRecording status: Redo the last undo operationReset max peaksResume recordingResume selectedReverbReverb time: ReverseRightRunning tests..SDL (output only)SDL: Couldn't open audio: %sSample format to try when the sound file's format isn't supported.Sample format: Sample rate: Sample repeat/skip (low quality)Sample type: Sample viewSave FileSave changes to %s?Save selection as ...Save the current file to diskSavingSeconds of silence: Selecting the ESD host to connect to is done through the ESPEAKER environment variable.SelectionSelection: %s+%sSend wav headerSessionsSetSet formatSet selection end to cursor positionSet selection start to cursor positionShift amount: Shift+Space Play all Should not reach this pointShould not reach this point!Show _horizontal zoom slider by defaultShow _speed slider by defaultShow _time scale by defaultShow _vertical zoom slider by defaultShow playback buffer positio_n by defaultShow slider l_abels by defaultSignedSignedness: Sinc-windowed filterSoX closed connection too early!Some notes on sound quality. Some of the settings you have changed will not be activated until you restart the programSome versions of libsndfile supports accessing Ogg files without decompressing to a temporary file.SoundSound data is normally stored as integer values. Therefore, whenever you normalize, adjust volume, decrease sample size or filter a sound, the result must be rounded. If you use 24 or 32 bit sample sizes, this is not really a problem, but if you use 8 or 16 bits sample size, this rounding causes a decrease in quality. SourceSox support couldn't be initializedSpace Play/Stop SpeedSpeed (Hz) Speed effect: Speed:Speed: Standard (high quality)Start new sessionStart recordingStart:StereoStop playingSunAudio: Couldn't open %sSunAudio: Error reading from sound deviceSunAudio: Error writing to sound deviceSuspendedSyntax: %s [files] Tab Move view to cursor Temporary files are by default also stored in the ~/.mhwaveedit directory. Which directories to use can be set through the preferences dialog. To get the best performance, you should have one temporary directory for each local filesystem. The temporary files have names of the form "mhwaveedit-temp--nnnn-". Do NOT open or remove temporary files with the same pid number as a currently running mhWaveEdit. Testing conversion functions finished.Testing conversion functions:The 'Crop' function deletes all parts of the file that are not selected. The 'Cut' and 'Copy' functions work like in any other software. The 'Paste as new' function opens a new window and puts the clipboard contents into it. The 'Paste mix' function combines the clipboard data with the data at the cursor position. The 'Paste' function insert the clipboard contents at the cursor position. The 'Paste over' function works like 'Paste', except that it overwrites the data after the insert position. The 'Silence selection' function replaces the selected part with silence. To avoid clicks, the silent part is a line that meets the wave at the endpoints. The area where you 'see' the contents of the file you are editing, is called the 'sample view'. The client name change won't take effect until you restart the program.The configuration file is called config. It can be hand edited, but the easiest way is through 'Preferences' on the Edit menu. The file %s does not exist!The file %s is a compressed wav file. This program can only work with uncompressed wav files.The file %s is not a regular file!The file %s may be destroyed since the saving failed. Try to free up some disk space and save again. If you exit now the file's contents could be in a bad state. The file has not changed since last save. Press OK if you want to save it anyway?The file name '%s' has an extension unknown to the program. Please specify in which format this file should be saved.The files that belonged to the crashed session have been recovered. Any files that are not saved will be removed permanently. (This notice is only shown once)The format of file '%s' could not be recognized. Please specify the sample format below.The general rule when doing audio editing/processing is to not manipulate the data more than necessary and keep an original copy whenever you're processing your important files. The input was clipped %d times during processing.The mix paste function doesn't decrease quality, unless the peaks become too high and you get clipping. In that case you will get a warning message. The mixed result was clipped %d times.The playback speed can be varied by adjusting the slider to the far right. The quality decrease that the rounding causes can be masked by adding a small amount of noise before rounding. This is called "dithering". mhWaveEdit supports basic dithering and it's enabled by default. The sign and endian-ness can usually be left at their defaults, but should be changed if you're unable to record or get bad sound.The sound format of this file is not supported for playing.There already is only one channel!There are plenty of things you can do if you want to help the development of mhWaveEdit. This effect applies to the whole file, not just the selectionThis effect could not be loaded.This effect has no options.This format is not supported by the input driver!Time Code 24fpsTime Code 25fps (PAL)Time Code 29.97fps (NTSC)Time Code 30fpsTime limit: Time recorded: Time stretchTimeDisplay|SamplesTimes_cale format: To avoid rounding errors when applying more than one effect on the same data, floating-point temporary files can be used. However, this will increase disk and CPU usage.To save a file with a different file format, use "Save as..." and choose a format in the file type selection box. TopTop bytesUnable to detect supported SoX effectsUnable to write data to %sUndo the last changeUnexpected EOF in connection to subprocessUnexpected end of fileUnexpected end of file reading from %sUnknown file formatUnknown file typeUnknown option '%s'UnsignedUpUpdate presetUse default settingsUse fast and noisy methodUse this setting by defaultUses double-precision mathValue for %s must be a number between %ld and %ldValue for '%s' must be a number between %f and %fValue for '%s' must not be above %fValue for '%s' must not be below %fVariable bitrate (default)Varispeed: Vertical zoom limit: VibroView _quality:View: [ %s - %s ]Volume adjust/fadeWarning: Unexpected error: %sWhen you want to start recording, press the "Start recording" button. When you've recorded everything you wanted to, press the Finish button and the record dialog will disappear and newly recorded sound will show up in a new window. WhiteWidth: Window length: Window size: Window width: With JACK, the only supported recording format is Floating-point, single precision, %d HzY,U Move cursor to nearest all-channel zero-crossing YesYou are saving a wav file larger than 2048MB. Such large files are non-standard and may not be readable by all programs. (this warning will not be displayed again)You can do normal editing while the file is playing. You can find the latest release of mhWaveEdit at: You can place marks in your file by holding down Ctrl and pressing a number from 0 to 9. This will place a mark (green vertical bar) with the same number at the current cursor position. You can later make the cursor go to that position again by just pressing the number. Setting and jumping to marks can be done while playing. To remove a mark, jump to the mark and set it again. You can use the cursor to refine the selection. Use the 'Selection start at cursor' and 'Selection end at cursor' buttons to move the selection starting point or the selection end point to the current cursor position. You can also drag the selection endpoints using the mouse. You have mapped more than one output port to channel '%s'. You can only map one output port to each channel.You have no open file to apply the effect to!You make selections by dragging the mouse over the sample view. You can hear what you've currently selected by clicking on the "play selection" button (the button with the yellow arrow) or by selecting 'Play selection' from the Play menu. Zero-level_Add_Auto-start playback when jumping to mark_Browse..._Byte-swap output (try this if playback sounds horrible)_Cancel_Close_Down_Draw waveform a second time with improved quality_Driver:_Keep cursor in center of view when following playback_Keep sound driver opened (to avoid start/stop clicks)_OK_Preview_Remember window sizes/positions_Remove_Settings_Up_Update cursor information while playing_Use floating-point temporary filesafter beginning of fileafter current cursor positionafter end of fileafter selection endafter selection startbytesheader sizehttp://gna.org/projects/mhwaveedit http://gna.org/projects/mhwaveedit/ jack_get_ports returned NULLjump delaymagnus.hjorth@home.se maximum vertical zoommhWaveEdit HelpmhWaveEdit checks on startup for leftover temporary files and lets the user open them. After opening a crashed session, the files can be saved or thrown away. mhWaveEdit creates a directory ~/.mhwaveedit where it stores configuration information. mhWaveEdit has a few simple effects, which are available from the 'Effects' menu. mhWaveEdit has basic support for mp3 and ogg formats. For this to work you need to have LAME installed for mp3 support, and OggDec/OggEnc for Ogg support. If you have these programs, you can open and save mp3/ogg files just like any other file format. mhWaveEdit is a graphical program for editing sound files. It is completely free (GPL). mhWaveEdit supports LADSPA effects and can also make use of most of the SoX utility's effects. To find the LADSPA plugins the environment variable LADSPA_PATH must be properly set up. mhWaveEdit: mhWaveEdit: %s (%s): %d Hz, %smhWaveEdit: %s: %s mhwaveedit-discuss@gna.org msnumber of recent filesputenv failed!sample ratesamplessamples/pixelsecondssnd_pcm_hw_params_set_access failedsnd_pcm_hw_params_set_buffer_size_last failedsnd_pcm_hw_params_set_channels failedsnd_pcm_hw_params_set_format failedsnd_pcm_hw_params_set_rate failedsound-portaudio: No input devices available!sound-portaudio: No output devices available!unsetenv failed!untitled #%dxProject-Id-Version: 1 Report-Msgid-Bugs-To: POT-Creation-Date: 2018-08-25 11:56+0200 PO-Revision-Date: 2014-04-14 18:08+0100 Last-Translator: Andrea Primiani Language-Team: Italian Language: it MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Risultati test (1 unità di tempo = %f usec/campione) Finestra '%s' Impostando il volume iniziale e finale allo stesso livello, si ottiene l'amplificazione semplice del suono. Notare che volumi oltre il 100% possono causare distorsione. Usare il bottone 'Trova volume massimo' per cercare la massima amplificazione senza distorsione (si può usare per normalizzare dei frammenti). L'opzione 'Non cambiare i dati' può essere usata se il programma ha sbagliato ad identificare il formato del file quando lo ha aperto. Scambia i byte nella selezione. Può essere usato per riparare file danneggiati, quando l'ordine dei byte è errato. Notare che se il suono sembra a posto ma si sente male, non si deve usare questa opzione ma 'Scambia ordine byte' nel pannello Modifica/Preferenze/Audio. Amplifica il suono quanto più possibile senza tagliare i picchi o distorcere. La voce 'Normalizza a...' permette di indicare a che livello si vuole normalizzare. Converte il formato del campione per l'intero file. Converte il tasso di campionamento dell'intero file. Ci sono diversi metodi per farlo, normalmente il primo ha la migliore qualità ma può essere più lento degli altri. Copia il primo canale ad un nuovo canale, convertendo ad esempio mono a stereo eccetera. Crea una sfumatura lineare in ingresso o uscita. Questo effetto cambia la velocità della selezione. Anche la tonalità cambia, ovviamente. Questo effetto è per utenti esperti che vogliono inviare dati grezzi ad un programma esterno. Il risultato viene riletto e sostituisce la selezione. Con questo effetto si può creare un nuovo suono con una combinazione lineare dei vecchi canali. Si possono fare miscelazioni/ scambio/ bilanciamento/ posizionamento/ amplificazione ecc. inserendo diversi valori. Per esempio per scambiare destro e sinistro si imposta Nuovo Canale 1 con 0% del Vecchio Canale 1 e 100% del Vecchio Canale 2, e Nuovo Canale 2 con 100% di Vecchio Canale 1 e 0% di Vecchio Canale 2. Questo effetto permette di scegliere un volume iniziale e uno finale ed aumenta la selezione in base ai livelli scelti, partendo dal primo per arrivare al secondo. Miscela tutti i canali in un suono monofonico. Con questo effetto si può cambiare il numero di canali nel file. Si possono anche riorganizzare ed aggiungere (es. miscelare) canali. gdb /usr/local/bin/mhwaveedit core | tee backtrace.txt Chunk attuale: Storico: Test di tutte le conversioni... Test degli intervalli in corso... e: * Aggiungi canale * Scambia byte * Combina canali... * Converti formato campione * Converti tasso campionamento... * Fade in/out * Mappa canali... * Mix a mono * Normalizza, Normalizza a... * Invia a programma... * Cambia velocità... * Regola volume/sfuma... Impostazioni avanzate Dithering Opzioni driver Applicazioni esterne Formato di riserva Hz audio IN controlli INPorte ingresso Finestra principale audio OUT controlli OUTPorte uscita Impostazioni di esecuzione Conversioni di tasso Conversioni di tasso Cartelle dei file temporanei Impostazioni dei file temporanei Formato tempo Velocità variabile Vista Contenuto finestra cents dB ms secondi%d canali%s non è un file WAV valido%s kbit/s%s su %s(%d files, %ld bytes)%s... (Premi ESC per annullare)%s: Atteso '=': %s %s: valore atteso: %s %s: tipo file errato'%s' non è un numero!( Suona primi 3 secondi della selezione (O')MM:SS.mmmm(O')MM:SS.t(Le righe con ritardo=0 saranno ignorate)(SoX) interpolazione polifase(SoX) filtro analogico simulato(Cambia il tasso di campionamento di tutto il file, non solo della selezione)(Cambia il tipo di campione di tutto il file, non solo della selezione)(atteso) (nessun file caricato)(nessun limite)(numero) Vai al segno (usare numeri negativi per portare il cursore prima del punto selezionato)) Suona ultimi 3 secondi della selezione +,= Zoom in , Suona dal cursore - Zoom out . Stop / Suona selezione /Cursore/Trova punto zero/Cursore/Trova punto zero/Sinistra (tutti i canali)/Cursore/Trova punto zero/Sinistra (qualsiasi canale)/Cursore/Trova punto zero/Destra (tutti i canali)/Cursore/Trova punto zero/Destra (qualsiasi canale)/Cursore/Sposta/Cursore/Vai a/Cursore/Vai a/Inizio/Cursore/Vai a/Fine/Cursore/Vai a/Fine selezione/Cursore/Vai a /Inizio selezione/Cursore/Sposta/Sinistra/Cursore/Sposta/Campione sinistro/Cursore/Sposta/DestraCursore/Sposta/Campione destro/Cursore/Posiziona cursore.../Cursore/Fine selezione qui/Cursore/Inizio selezione qui/Cursore/sep1/Cursore/sep2/Debug/Debug/Check opencount/Debug/Dummy effect/Debug/Dummy effect FP/Debug/Dump chunk info/Modifica/Svuota clipboard/Modifica/Ritaglia/Modifica/_Taglia/Modifica/Inserisci _silenzio/Modifica/Incolla _sopra/Modifica/Incolla _nuovo/Modifica/Preferenze/Modifica/Seleziona tutto/Modifica/Seleziona niente/Modifica/Seleziona silenzio/Modifica/_Copia/Modifica/Cancella/Modifica/Incolla _mix/Modifica/_Incolla/Modifica/_Rifai/Modifica/_Annulla/Modifica/sep1/Modifica/sep2/Modifica/sep3/Modifica/sep4/_Effetti/Effetti/Aggiungi cana_le/Effetti/Aggiungi canale da altro file.../Effetti/Scambia b_yte/Effetti/Converti _formato campione.../Effetti/Conve_rti tasso campione.../Effetti/Finestra effetti.../Effetti/Fade _in/Effetti/Fade o_ut/Effetti/Ma_ppa canali.../Effetti/Normali_zza a.../Effetti/Invia a programma.../Effetti/_Combina canali.../Effetti/_Mix a mono/Effetti/_Normalizza/Effetti/Regola velocità.../Effetti/Regola _volume (fade).../Effetti/sep1/Effetti/sep2/Effetti/sep3/Effetti/sep4/File/Sal_va come.../File/Salva selezione come.../File/_Chiudi/File/_Esci/File/_Apri.../File/_Salva/File/sep1/File/sep2/Aiuto/_Informazioni/Aiuto/_Documentazione/Sposta giù/Sposta su/Sposta in fondo/Sposta in cima/Suona/_Tutto/Suona/Se_lezione/Suona/_Dal cursore/Suona/_Registra.../Suona/_Ferma/Suona/sep1/Rileggi lista effetti/Ripristina ordine/Ordina per autore/Ordina per posizione/Ordina per nome/Ordina per tipo/Vista/Posizione buffer/Vista/Etichette cursore/Vista/_Cursore velocità/Vista/Ingrandisci a _tutto il file/Vista/_Ingrandisci/Vista/_Rimpicci_olisci/Vista/Ingrandisci a _selezione/Vista/Ingrandisci ori_zzontale/Vista/Scala _tempo/Vista/Ingrandisci _verticale/Vista/sep1/Vista/sep2/_Cursore/_Modifica/_File/_Aiuto/_Suona/_Vista1) abilitare i core dumps: ulimit -c unlimited PCM 16 bit2) avviare il programma: mhwaveedit PCM 24 bit3) far bloccare il programma. Dovrebbe apparire un file chiamato core oppure core.1234 nella cartella corrente. PCM 32 bit4) eseguire gdb con il programma e il file core: 5) dopo che gdb si è avviato, usare il comando: bt 6) uscire da gdb con il comando quit 7) ora il backtrace è stato scritto nel file backtrace.txt PCM 8 bit< Zoom tutto > Zoom a selezione Preferenze ALSAInformazioni su mhWaveEditAttivazione fallita!Aggiungi canali da altro fileAggiungi canali da:Aggiungi impostazioneAggiungi/aggiorna impostazioneRegolazione velocitàAvanzatoQuando la traduzione è completa (ma non è necessario tradurre tutte le frasi) si può spedire il file po a me (vedi info contatto) e verrà aggiunta alla prossima versione. Allinea al segno:Allinea file all'inizioAllinea file alla fineAllineamentoAllineamento:Tutte le funzioni di modifica lavorano in modo non distruttivo, cioè le modifiche apportate non vengono applicate fin quando non si salva il file (anche gli effetti funzionano allo stesso modo). Tutti gli effetti supportati possono essere trovati aprendo 'Effetti/Finestra effetti...'. Gli effetti sono elencati per nome, preceduti da [B] per quelli interni, [L] per i LADSPA e [S] per i SoX. Quantità: AmplificazioneAmplificazione (di %3.1f%% / %+.1f dB)ApplicaApplica a:Applicazione effetto '%s'Frecce Scorri sinistra/destra Attack integration time: Autore: %sAuto-rilevamento driver ad ogni avvioTorna all'inizioAuto stop tra: Auto-_reset velocitàDeduci dall'estensioneCollega automaticamente le porte in ingresso all'avvioCollega automaticamente le porte in uscita all'avvioBitrate medioAvoid select calls (try this if recording locks up)SfondoPassa bandaFiltro passa bandaLarghezza banda: BetaBiasedBig endianBig-endianNeroFondoUltimi byteSfoglia cartellaBuffer overrun!Posizione bufferRiportare erroriInterni (B)Filtro passa banda ButterworthFiltro escludi banda ButterworthFiltro passa alto ButterworthFiltro passa basso ButterworthDi solito mhWaveEdit usa file temporanei con virgola per memorizzare i risultati, evitando di arrotondare fino al momento di salvare il file. BypassByte scritti: Calcolo livello di piccoCalcolo volume di picco:AnnullaCan.%dCanali: SceltaCoroChunk %p has opencount=%d Nome client: Tosatura: ChiudiChiudi questa finestra dopo l'applicazione dell'effettoColoriCombina canaliCombina canaliIl comando ha fallito senza restituire nullaLinea di comando: Compilato %s %sComprimi/EspandiConnessione da %s a %s fallita: %sBitrate costanteContattiTest di conversione fallito, tra: Converti formato campioneConverti tassoConversione tasso campionamentoCopia la selezioneCopyright: %sImpossibile connettersi al server JACKImpossibile creare pipe: %sImpossibile creare file di sessioneNon trovo la cartella home. Uso la cartella corrente come home.Impossibile trovare posizione in %s: %sCould not initialize SDL: %sImpossible aprire %s: %sImpossibile aprire '%s': %sImpossibile leggere da %s: %sImpossibile eliminare '%s': %sImpossibile cercare in %s: %sCollegamento con demone ESD fallito: %sFork impossibileNon si riesce ad aprire %sBloccatoCtrl+(numero) Metti segno Ctrl+A Selez tutto Ctrl+C Copia Ctrl+D Cancella Ctrl+E Effetti Ctrl+G Porta cursore a (vai a) Ctrl+H Porta cursore a inizio file Ctrl+J Porta cursore a fine file Ctrl+K Porta cursore a inizio selezione Ctrl+L Porta cursore a fine selezione Ctrl+O Apri file Ctrl+P Preferenze Ctrl+Q Inizia selezione al cursore Ctrl+S Salva file Ctrl+Tab Sposta il cursore a centro vista Ctrl+U Salva selezione come Ctrl+V Incolla Ctrl+W Termina selezione al cursore Ctrl+X Taglia Ctrl+Z Annulla Ctrl+frecce Sposta cursore (e suona) mezzo secondo Driver audio attuale: %sE' attualmente impossibile registrare mentre si sta suonando, quindi l'esecuzione si ferma quando si avvia una registrazione. CursoreCursore: Cursore: scorrevoleArgomento opzionaleArgomento facoltativo: Altro formatoModifica co_lori...Taglia la selezioneTaglia, copia e incolla spostano i dati senza modificarli, dunque non degradano la qualità del suono. A causa delle differenze di volume, si possono provocare degli 'scalini' ad inizio e fine delle parti inserite, che possono causare un piccolo clic sonoro. DC ShiftCaduta..Decay integration time: Decodifica in corso...DecomprimiRitardo (ms) Tempo di ritardo: Canc Cancella Cancella sessione selezionataCancella la selezioneProfondità (ms) Profondità: DestinazioneAccesso direttoDisabilitaSoglia editing su disco: Mostra temp_i come: Distribuito sotto la GNU General Public License. Per informazioni, vedi il file COPYINGNon cambia davvero i dati (per riparare file corrotti ecc.)GiùFittizio (nessun suono)Preferenze ESDOgni processo mhWaveEdit crea un file sessione nella cartella .mhwaveedit, chiamato mhwaveedit-session---, dove è il numero ID della sessione e è un carattere che mostra lo stato della sessione ('r' per le sessioni in corso). Trovate sessioni precedenti. Sceglierne una da proseguire o iniziarne una nuova.EarwaxEcoSequenza ecoModificareL'effetto %s usa la porta non valida %sEffettiAbilita _dithering per la modificaAbilita esecuzione a _velocità variabileAbilita dithering per l'es_ecuzioneTipo codifica: Fine Sposta la vista a fine file Fine:Ordine dei bit: Errore di cambiamento del rapporto di cambio di tasso: %s Errore di chiusura %s: %sErrore di conversione tasso: %s Errore creazione link a '%s': %sErrore creazione pipeError in sound driver: ioctl failed: %sError in sound driver: read failed: %sError in sound driver: select failed: %sError in sound driver: write failed: %sErrore di avvio della conversione di tasso di campione: %sErrore lancio mixer: fork %sErrore apertura dispositivo ALSA '%s' per suonare: %sErrore di apertura dispositivo ALSA '%s' per registrare: %sErrore di apertura della cartella sessioneErrore di lettura %s: %sErrore di lettura da %s: %sErrore di lettura dal sottoprocesso: %sErrorr di lettura dei dati soxErrore di esecuzione 'sox -h': %s Errore di ricerca in %s: %sErrore di scrittura al sottoprocesso: %sErrore: %sErrore: fork: %sEsound driver: letturaEsounD driver: sceltaEsound driver: scritturaEsounD: errore di apertura flusso in uscitaEsounD: errore di apertura flusso in ingressoConnessione EsounD chiusa dal serverAnche se mhWaveEdit è stato creato per modificare file WAV, è anche possibile caricare e salvare in alcuni altri formati. mhWaveEdit legge i file WAV e RAW, ma se viene compilato con libsndfile può lavorare anche con qualche altro formato. I/O guidato da eventiEsciE' necessario un nome di driver dopo l'opzione --driverEstremo (qualità altissima)F1 Aiuto F12 Registra Fattore: Fade: Fade|CosFade|HammingFade|LineareFade|TrapezoideCaricamento fallito '%s'!Scrittura fallita in '%s'!Anche le richieste di nuove funzioni sono gradite, inviatele alla mailing list o al bug tracker. Il file esiste. Sovrascrivere?Il file ha già il formato di campionamento sceltoFormati fileTipo file: FileTipo di filtro: Trova volume massimoRicerca punto zeroFinisciPer prima cosa, cercare errori e riportarli nel bugtracker o per posta elettronica. A volte un errore può rimanere trascurato per molto tempo perché nessuno lo segnala, dunque non esitate a riportare errori che sono lì da qualche tempo. Non è necessario suggerire correzioni o informazioni molto dettagliate, anche se ovviamente ciò aiuta. FlangerVirgola mobile (doppia %s) Virgola mobile (singola %s) Con virgola, doppia precisioneCon virgola, singola precisionePer segnalazione di errori, traduzioni, aggiornamenti e donazioni PayPal Formato non selezionatoFrequenza: GeneraleH,J Sposta cursore (e suona) 1/8 del visibile Byte intestazione: PesanteAiutareHigh 6db corner: Passa altoFiltro passa alto (polo singolo)Home Sposta vista a inizio file Come creare un backtrace: HzI,O Sposta cursore al più vicino zero (qualsiasi canale) Se la traduzione è incompleta, potete tradurre le frasi restanti e spedirle. Anche le correzioni alla traduzione sono ammesse, ma è possibile che si debba procedere ad un confronto con il precedente traduttore prima di inserirle. Se viene installato Mplayer, mhWaveEdit apre tutti i formati supportati da esso, ad esempio la colonna sonora di un file video. Siccome Mplayer è solo un lettore, però, questi file non possono essere risalvati dopo la modifica. Si possono solo salvare in uno dei formati di mhWaveEdit. Se il cursore inizia a scorrere troppo presto dopo un salto, aumentare questo ritardoSe si trova un difetto o un problema non menzionato nel file BUGS, segnalarlo nel bug tracker (Vedi info contatti) o spedire un messaggio che descriva il difetto a: magnus.hjorth@home.se Se parlate una lingua diversa dall'inglese e mhWaveEdit non è tradotto nella vostra lingua, potete contribuire con una traduzione. Per farlo, copiate il modello nella cartella po con il nome ll.po, dove ll è il codice della vostra lingua (vedi http://www.gnu.org/software/gettext/manual/html_node/gettext_221.html per una lista dei codici). Ignoro vecchissime impostazioni di posizione/dimensione finestra In caso di blocco, non spedire nessun core dump. Sono enormi e del tutto inutili per me. Creare invece un backtrace: i backtrace dicono esattamente dove il programma si è bloccato. Nella vista c'è una barra grigia chiamata 'cursore'. Il cursore segue l'onda sonora quando si suona il file. Si può spostare il cursore con un clic destro del mouse. Se si clicca mentre il file sta suonando, l'esecuzione continua dalla nuova posizione del cursore. La voce 'Posizione cursore' del menu Cursore contiene alcuni comandi per posizionare più precisamente la barra. Volume iniziale: IngressoGuadagno IN: Livello IN (dB)Livelli d'ingressoSenza senso (qualità massima possibile)Inserisci silenzioInterfacciaInterpolazione: Interpolation|CubicaInterpolation|LineareNome driver non valido: %s Uso il driver '%s' al posto.Numero non valido di porte IN.Numero non valido di porte OUT.Formato campioni o numero canali non valido per questo formatoValore di tempo non valido. Il tempo deve essere scritto come (OO')MM:SS( mmmm)E' possibile modificare il file po a mano, ma raccomandiamo di usare un programma come poEdit (http://www.poedit.org). Preferenze JACKRitardo salto:K,L Sposta cursore di un campione Mantenere i dati nei canali OUT non mappatiTieni _finestra davanti dopo applicazione effettoMantieni vista ed esecuzione allineateAbbreviazioni da tastieraForma d'onda SxLADSPA: errore di scansione %sApri mixerSinistroFile rimastiLivello: Guadagno del limitatore: Little endianLittle-endianCarica fileCarica un file da discoApertura in corso...Aprire e ri-salvare file in formati 'lossy' (come MP3 e OGG) porta ad una perdita di qualità, anche nella parte di file che non viene modificata.Modo ciclico (suona sempre da capo)Low 6dB corner: Passa bassoFiltro passa basso (polo singolo)Preferenze MP3Mailing list (bisogna iscriversi prima di inviare messaggi): MappaMappa canaliSegniMaschera rumoreMessaggioMetodo: Mi_xer: Formato WAV MicrosoftLieveMiscelazioneMiscelazione canaliModulazione Modulation|SinusoidaleModulation|TriangolareMonoN/DNome :Nuovo tasso camp.: NoNessun errore!Nessun file con quel nome!Noise modeNessuno/aModalità normalizzazione:Normalizza a...Da notare che le stringhe simili a "RecordStatus|Paused" devono essere tradotte soltanto nella parte alla destra della barra ("Paused" in questo esempio). Questa convenzione serve per rendere possibile l'uso della traduzione in modi diversi in diversi contesti. Numero di porte (0-8): Numero di file recenti nel menu File:OKPreferenze OSSOGG VorbisSu questo sistema è necessaria la presenza di libsndfile per salvare file WAV con virgola mobile.Apri con MPlayerAltroDimensioni _buffer uscita:Canali OUT:Risposta del comando '%s': Guadagno OUT: Livello OUT (dB)Over/underrun in JACK driverOverruns: PCM, %d(%d) bit, %s %s Pa_OpenStream failed: %s CompattatoIncolla alla posizione del cursoreIncolla, coprendo i dati dopo la posizione attualePausa registrazioneLimitatore di piccoPicco max: Picco: PhaserInvia attraverso programmaRegola altezzaPorta il cursore aSuona file _mono come stereoSuona dal cursoreSuona l'area selezionataSuonaDispositivo di esecuzione:Dispositivo di esecuzione: SuonareAscoltare un file è semplice: lo si carica e si preme il bottone Suona. Il triangolo verde suona dalla posizione attuale del cursore, quello giallo suona la selezione attuale o l'intero file se non è selezionato niente. Fermare l'esecuzione con il bottone Ferma (quadrato rosso) Porta n. %dPorta cursoreGuadagno post-processo: PreferenzePreparazione test..Impostazioni:Elabora uscitaElaborazioneBarra progressoPagina del progetto con bug tracker, mailing list e iscrizione: Pure-ScaledQualitàQualità: Forma d'onda DxRMS: Test intervalli fallito per il formato: dati PCM grezziPronto a registrareRegistraIn pausaIn corsoRegistrareDispositivo di registrazione:Dispositivo di registrazione: La registrazione si avvia con 'Registra...' dal menu Suona, oppure dal bottone Registra (cerchio rosso). Compare una finestra dove si può selezionare il formato di registrazione. Appena fatta questa scelta, compaiono indicatori e numeri che mostrano il livello dei suoni in ingresso. Impostazioni registrazioneStato registrazione: Rifai l'ultima operazioneAzzera contatore picchiRiprendi registrazioneRiavvia sessione selezionataRiverberoTempo riverbero:InvertiDestroEsecuzione test..SDL (solo out)SDL: Couldn't open audio: %sFormato da usare quando il formato non è riconosciutoFormato campione: Tasso del campione: Ripeti/salta campione (bassa qualità)Tipo di campione: Vista campioniSalva fileSalvare cambiamenti a %s?Salva selezione come...Salva il file su discoSalvataggio in corso...Secondi di silenzio: La scelta del server ESD a cui connettersi è compiuta dalla variabile di ambiente ESPEAKERSelezioneSelezione: %s+%sInvia header WAVSessioniImpostaImposta formatoImposta la fine selezione al cursoreImposta l'inizio della selezione al cursoreShift amount: Maiusc+Spazio Suona tutto Should not reach this pointShould not reach this point!Mostra cursore ingrandimento ori_zzontaleMostra cur_sore velocitàMostra scala tempiMostra cursore ingrandimento _verticaleMostra posizio_ne del buffer di esecuzioneMostr_a etichette cursoriCon segnoSegno:Sinc-windowed filterSoX ha chiuso la connessione troppo presto!Alcune note sulla qualità del suono. Alcune impostazioni modificate non saranno attive fino al riavvio del programmaAlcune versioni di libsndfile permetto di accedere ai file OGG senza l'uso di un file temporaneo per la decompressione.AudioI dati sonori sono normalmente memorizzati come numeri interi. Le operazioni di normalizzazione, regolazione volume, diminuzione della dimensione del campione o filtraggio, quindi, producono risultati che devono essere arrotondati. Usando campioni a 24 o 32 bit questo non è un problema, ma ad 8 o 16 bit l'arrotondamento può diminuire la qualità del suono. SorgenteImpossibile avviare il supporto a soxSpazio Suona/Ferma VelocitàVelocità (Hz) Effetto velocità: Velocità:Velocità: Standard (alta qualità)Inizia nuova sessioneAvvia registrazioneInizio:StereoFerma il suonoSunAudio: Couldn't open %sSunAudio: Error reading from sound deviceSunAudio: Error writing to sound deviceSospesoSintassi: %s [file] Tab Sposta la vista al cursore Anche i file temporanei sono salvati nella cartella ~/.mhwaveedit. La cartella da usare può essere indicata nel pannello delle preferenze. Per ottenere le migliori prestazioni, ci deve essere una sola cartella temporanea per ogni filesystem locale. I file temporanei hanno nomi nel formato "mhwaveedit-temp--nnnn-". NON aprire o cancellare questi file se hanno lo stesso numero PID di una finestra mhWaveEdit aperta. Prova delle funzioni terminata.Prova delle funzioni di conversione:La funzione 'Ritaglia' cancella tutte le parti del file che non sono selezionate. Le funzioni 'Taglia' e 'Copia' funzionano come in tutti gli altri programmi. La funzione 'Incolla come nuovo' apre una nuova finestra e ci mette il contenuto della memoria di transito. La funzione 'Incolla mix' mescola i dati esistenti con quelli incollati. La funzione 'Incolla' inserisce il contenuto della memoria di transito alla posizione del cursore. La funzione 'Incolla sopra' funziona allo stesso modo, ma copre il suono esistente dopo la posizione del cursore. La funzione 'Silenzia selezione' sostituisce la selezione con silenzio. Per evitare clic, la parte silenziosa si raccorda con l'onda esistente agli estremi. L'area dove si 'vedono' i contenuti del file che si sta modificando è chiamata 'vista dei campioni'. Il nome cliente non cambierà fino al riavvio del programma.Il file di configurazione si chiama config. Può essere modificato a mano, ma il modo più facile è di usare 'Preferenze' dal menu 'Modifica'. Il file %s non esiste!Il file %s è un WAV compresso. Questo programma lavora solo con file non compressi.Il file %s non è regolare!Il file %s può essere corrotto perché il salvataggio è fallito. Cercare di liberare spazio sul disco e salvare di nuovo. Se si esce ora il contenuto del file può essere rovinato.Il file non è stato cambiato dall'ultimo salvataggio. Premer OK per salvare lo stesso.Il nome del file %s ha un'estensione ignota al programma. Specificare in che formato deve essere salvato.I file appartenenti alla sessione bloccata sono stati recuperati.Se i file non vengono salvati verranno rimossi definitivamente. (questo avviso appare una sola volta)Il formato del file '%s' non è riconoscibile Specificare il formato dei campionamento qui sotto.La regola generale quando si modifica un suono è di non manipolare i dati più del necessario, e tenere una copia dell'originale se si lavora su dati importanti. Durante il processo, il suono è stato tagliato %d volte.La funzione Incolla mix non diminuisce la qualità, a meno che i picchi diventino troppo alti e vengano tosati. In questo caso apparirà un avvertimento. Il risultato miscelato è stato tagliato %d volte.La velocità di esecuzione può variare regolando il cursore verticale all'estrema destra. La diminuzione di qualità dovuta all'arrotondamento può essere mascherata aggiungendo una piccola quantità di rumore prima che esso avvenga. Questo è chiamato 'dithering'. mhWaveEdit può applicare il dithering semplice ed è di solito attivo. Il segno e l'endian-ness di solito possono rimanere come sono, ma dovrebbero essere cambiati se non si riesce a registrare o si ottiene un suono alterato.Il formato sonoro di questo file non è supportato per l'esecuzione.C'è già rimasto solo un canale!Chi vuole aiutare lo sviluppo di mhWaveEdit può fare tante cose. L'effetto si applica a tutto il file, non solo alla selezioneL'effetto non può essere caricato.Questo effetto non ha opzioni.Questo formato non è supportato dal driver d'ingresso!Time Code 24fpsTime Code 25fps (PAL)Time Code 29.97fps (NTSC)Time Code 30fpsLimite di tempo: Tempo registrato: Allunga tempoTimeDisplay|CampioniFormato _scala dei tempi: Per evitare errori di arrotondamento quando si applicano diversi effetti sugli stessi dati, possono essere usati file temporanei con decimali. Tuttavia questo aumenta il consumo di CPU e di memoria.Per salvare un file in altro formato, usare "Salva come..." e scegliere un formato nella finestra di dialogo. CimaPrimi byteImpossibile verificare gli effetti sox disponibiliImpossibile scrivere dati su %sAnnulla l'ultimo cambiamentoEOF inaspettato nella connessione al sottoprocessoFine del file inattesaFine file inaspettata mentre si legge da %sFormato file sconosciutoTipo file sconosciutoOpzione sconosciuta '%s'Senza segnoSuAggiorna impostazioneUsa impostazioni predefiniteUsa metodo veloce e rumorosoUsare sempre queste impostazioniUsa matematica a doppia precisioneIl valore di %s deve essere un numero tra %ld e %ldIl valore di '%s' deve essere un numero compreso tra %f e %fIl valore di '%s' non deve essere maggiore di %fIl valore di '%s' non deve essere minore di %fBitrate variabile (predefinito)Variavelocità:Limite ingrandimento verticale:Vibro_Qualità vista:Vista: [ %s - %s]Regola volume/sfumaAttenzione: errore inaspettato: %sQuando si vuol far partire la registrazione, premere il bottone 'Avvia registrazione'. Alla fine, premere il bottone 'Finisci': la finestra di registrazione scompare ed i suoni appena registrati appariranno in una nuova finestra. BiancoAmpiezza: Lunghezza finestra: Dim. finestra: Ampiezza finestra: Con JACK l'unico formato di registrazione possibile è Con virgola, Singola precisione, %d HzY,U Sposta cursore al più vicino zero (tutti i canali) SìSi sta salvando un file più grande di 2048MB. Questo non è standard e potrebbe dare problemi di lettura su alcuni programmi. (questo avvertimento non verrà ripetuto)Le modifiche normali possono essere fatte durante l'esecuzione. L'ultima versione di mhWaveEdit si trova a: Premendo Ctrl con un tasto numerico si possono creare dei segnalibri sul suono. Comparirà una barra verde con il numero scelto. Per portare il cursore alla posizione segnata basta premere quel tasto numerico. L'impostazione e il salto ai segni possono essere fatti suonando. Per togliere un segno, saltare al numero e reimpostarlo. Il cursore può essere usato per perfezionare la selezione. I bottoni 'Inizio selezione al cursore' e 'Fine selezione al cursore' muovono l'inizio o la fine della selezione alla posizione corrente del cursore. I confini della selezione possono anche essere spostati col mouse. Più di un canale è mappato in uscita al canale '%s'. Si può collegare una sola porta ad ogni canale.Nessun file aperto su cui applicare l'effetto!La selezione si può fare trascinando il mouse sopra alla vista campioni. Si può ascoltare quanto selezionato cliccando sul bottone 'Suona selezione' (quello con il triangolo giallo) o scegliendo 'Suona selezione' dal menu 'Suona'. Livello zero_Aggiungi_Auto partenza quando salta ad un segno_Sfoglia...Scambia ordine _byte (provare se il suono è orribile)_Annulla_Chiudi_Giù_Disegna forma d'onda due volte con qualità migliore_Driver:_Tieni il cursore al centro quando segue il suonoTieni aperto il driver audio (per evitare clic alla partenza/fermata)_OKAnte_prima_Ricorda dimensioni/posizione finestre_Rimuovi_Impostazioni_SuAggiorna info c_ursore mentre suona_Usa file temporanei con decimalidopo l'inizio del filedopo la posizione del cursoredopo la fine del filedopo la fine della selezionedopo l'inizio della selezionebytesdimensione headerhttp://gna.org/projects/mhwaveedit http://gna.org/projects/mhwaveedit/ jack_get_ports returned NULLritardo saltomagnus.hjorth@home.se massimo ingrandimento verticaleAiuto di mhWaveEditmhWaveEdit controlla ad ogni avvio se ci sono file temporanei rimasti, e propone all'utente di aprirli. Dopo aver aperto una sessione bloccata, i file possono essere salvati o buttati. mhWaveEdit crea una cartella, ~/.mhwaveedit dove salva le informazioni di configurazione. mhWaveEdit ha pochi effetti semplici, che si trovano sotto il menu 'Effetti'. mhWaveEdit ha un supporto di base per i formati MP3 e OGG. Questo funziona se LAME è installato (per gli MP3) e OggDec/OggEnc (per i file OGG). Se ci sono questi programmi, l'apertura di questi file funziona come quella degli altri. mhWaveEdit è un programma grafico per modificare i file sonori. E' totalmente libero (GPL). mhWaveEdit supporta gli effetti LADSPA e può anche fare uso della maggior parte degli effetti di SoX. Per trovare gli effetti LADSPA, la variabile d'ambiente LADSPA_PATH deve essere impostata correttamente. mhWaveEdit: mhWaveEdit: %s (%s): %d Hz, %smhWaveEdit: %s: %s mhwaveedit-discuss@gna.org msnumero di file recentiputenv failed!tasso campionecampionicampioni/pixelsecondisnd_pcm_hw_params_set_access failedsnd_pcm_hw_params_set_buffer_size_last failedsnd_pcm_hw_params_set_channels failedsnd_pcm_hw_params_set_format failedsnd_pcm_hw_params_set_rate failedsound-portaudio: nessun dispositivo di ingresso disponibile!sound-portaudio: nessun dispositivo di uscita disponibile!unsetenv failed!senza nome #%dxmhwaveedit-1.4.24/po/it.po000066400000000000000000003126511334022513400153360ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Magnus Hjorth # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # # Andrea Primiani , 2009. msgid "" msgstr "" "Project-Id-Version: 1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-08-25 11:56+0200\n" "PO-Revision-Date: 2014-04-14 18:08+0100\n" "Last-Translator: Andrea Primiani \n" "Language-Team: Italian \n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: src/chunk.c:199 msgid "Converting samplerate" msgstr "Conversione tasso campionamento" #: src/chunk.c:226 msgid "Adjusting speed" msgstr "Regolazione velocità" #: src/chunk.c:703 msgid "Mixing" msgstr "Miscelazione" #: src/chunk.c:758 #, c-format msgid "The mixed result was clipped %d times." msgstr "Il risultato miscelato è stato tagliato %d volte." #: src/chunk.c:822 msgid "Combining channels" msgstr "Combina canali" #: src/chunk.c:1083 msgid "Mixing channels" msgstr "Miscelazione canali" #: src/chunk.c:1471 msgid "Calculating peak level" msgstr "Calcolo livello di picco" #: src/chunk.c:1542 src/chunk.c:1552 src/chunk.c:1590 src/chunk.c:1600 msgid "Finding zero-crossing" msgstr "Ricerca punto zero" #: src/chunk.c:1628 #, c-format msgid "Amplifying (by %3.1f%% / %+.1fdB)" msgstr "Amplificazione (di %3.1f%% / %+.1f dB)" #: src/chunk.c:1669 msgid "Amplifying" msgstr "Amplificazione" #: src/chunk.c:1867 #, c-format msgid "The input was clipped %d times during processing." msgstr "Durante il processo, il suono è stato tagliato %d volte." #: src/configdialog.c:65 msgid "number of recent files" msgstr "numero di file recenti" #: src/configdialog.c:66 msgid "maximum vertical zoom" msgstr "massimo ingrandimento verticale" #: src/configdialog.c:80 msgid "" "Some of the settings you have changed will not be activated until you " "restart the program" msgstr "" "Alcune impostazioni modificate non saranno attive fino al riavvio del " "programma" #: src/configdialog.c:292 msgid "Colors" msgstr "Colori" #: src/configdialog.c:329 msgid "_Preview" msgstr "Ante_prima" #: src/configdialog.c:336 src/configdialog.c:1204 msgid "_OK" msgstr "_OK" #: src/configdialog.c:353 msgid "_Cancel" msgstr "_Annulla" #: src/configdialog.c:430 msgid "Browse directory" msgstr "Sfoglia cartella" #: src/configdialog.c:480 msgid "Preferences" msgstr "Preferenze" #: src/configdialog.c:539 msgid "Show _time scale by default" msgstr "Mostra scala tempi" #: src/configdialog.c:549 msgid "Show _horizontal zoom slider by default" msgstr "Mostra cursore ingrandimento ori_zzontale" #: src/configdialog.c:559 msgid "Show _vertical zoom slider by default" msgstr "Mostra cursore ingrandimento _verticale" #: src/configdialog.c:569 msgid "Show _speed slider by default" msgstr "Mostra cur_sore velocità" #: src/configdialog.c:579 msgid "Show slider l_abels by default" msgstr "Mostr_a etichette cursori" #: src/configdialog.c:589 msgid "Show playback buffer positio_n by default" msgstr "Mostra posizio_ne del buffer di esecuzione" #: src/configdialog.c:598 msgid "_Settings" msgstr "_Impostazioni" #: src/configdialog.c:608 msgid "_Keep sound driver opened (to avoid start/stop clicks)" msgstr "Tieni aperto il driver audio (per evitare clic alla partenza/fermata)" #: src/configdialog.c:617 msgid "_Byte-swap output (try this if playback sounds horrible)" msgstr "Scambia ordine _byte (provare se il suono è orribile)" #: src/configdialog.c:626 msgid "Play _mono files as stereo" msgstr "Suona file _mono come stereo" #: src/configdialog.c:634 msgid "_Update cursor information while playing" msgstr "Aggiorna info c_ursore mentre suona" #: src/configdialog.c:642 msgid "_Keep cursor in center of view when following playback" msgstr "_Tieni il cursore al centro quando segue il suono" #: src/configdialog.c:652 msgid "_Auto-start playback when jumping to mark" msgstr "_Auto partenza quando salta ad un segno" #: src/configdialog.c:660 msgid "Enable _variable speed playback" msgstr "Abilita esecuzione a _velocità variabile" #: src/configdialog.c:669 msgid "Auto-_reset speed" msgstr "Auto-_reset velocità" #: src/configdialog.c:676 msgid "Use fast and noisy method" msgstr "Usa metodo veloce e rumoroso" #: src/configdialog.c:684 msgid "(H')MM:SS.t" msgstr "(O')MM:SS.t" #: src/configdialog.c:685 msgid "(H')MM:SS.mmmm" msgstr "(O')MM:SS.mmmm" #: src/configdialog.c:686 msgid "TimeDisplay|Samples" msgstr "TimeDisplay|Campioni" #: src/configdialog.c:687 msgid "Time Code 24fps" msgstr "Time Code 24fps" #: src/configdialog.c:688 msgid "Time Code 25fps (PAL)" msgstr "Time Code 25fps (PAL)" #: src/configdialog.c:689 msgid "Time Code 29.97fps (NTSC)" msgstr "Time Code 29.97fps (NTSC)" #: src/configdialog.c:690 msgid "Time Code 30fps" msgstr "Time Code 30fps" #: src/configdialog.c:703 msgid "_Remember window sizes/positions" msgstr "_Ricorda dimensioni/posizione finestre" #: src/configdialog.c:712 msgid "_Draw waveform a second time with improved quality" msgstr "_Disegna forma d'onda due volte con qualità migliore" #: src/configdialog.c:742 msgid "_Remove" msgstr "_Rimuovi" #: src/configdialog.c:750 msgid "_Add" msgstr "_Aggiungi" #: src/configdialog.c:757 msgid "_Browse..." msgstr "_Sfoglia..." #: src/configdialog.c:764 msgid "_Up" msgstr "_Su" #: src/configdialog.c:772 msgid "_Down" msgstr "_Giù" #: src/configdialog.c:788 msgid "Keep main _window in front after applying effect" msgstr "Tieni _finestra davanti dopo applicazione effetto" #: src/configdialog.c:804 msgid "_Use floating-point temporary files" msgstr "_Usa file temporanei con decimali" #: src/configdialog.c:813 msgid "Enable _dithering for editing" msgstr "Abilita _dithering per la modifica" #: src/configdialog.c:821 msgid "Enable dithering for _playback" msgstr "Abilita dithering per l'es_ecuzione" #: src/configdialog.c:829 msgid "Auto dete_ct driver on each start-up" msgstr "Auto-rilevamento driver ad ogni avvio" #: src/configdialog.c:842 msgid "Direct access" msgstr "Accesso diretto" #: src/configdialog.c:843 msgid "Decompress" msgstr "Decomprimi" #: src/configdialog.c:844 msgid "Bypass" msgstr "Bypass" #: src/configdialog.c:855 msgid "Biased" msgstr "Biased" #: src/configdialog.c:856 msgid "Pure-Scaled" msgstr "Pure-Scaled" #: src/configdialog.c:873 msgid "Interface" msgstr "Interfaccia" #: src/configdialog.c:874 msgid " Main window " msgstr " Finestra principale " #: src/configdialog.c:885 msgid "Number of recent files in File menu: " msgstr "Numero di file recenti nel menu File:" #: src/configdialog.c:890 msgid " View " msgstr " Vista " #: src/configdialog.c:901 msgid "Customize co_lors..." msgstr "Modifica co_lori..." #: src/configdialog.c:908 msgid " Window contents " msgstr " Contenuto finestra " #: src/configdialog.c:925 msgid "Vertical zoom limit: " msgstr "Limite ingrandimento verticale:" #: src/configdialog.c:929 msgid "x" msgstr "x" #: src/configdialog.c:935 msgid "Sound" msgstr "Audio" #: src/configdialog.c:936 msgid " Driver options " msgstr " Opzioni driver " #: src/configdialog.c:944 msgid "_Driver:" msgstr "_Driver:" #: src/configdialog.c:961 msgid " Fallback format " msgstr " Formato di riserva " #: src/configdialog.c:966 msgid "Sample format to try when the sound file's format isn't supported." msgstr "Formato da usare quando il formato non è riconosciuto" #: src/configdialog.c:978 msgid "Playback" msgstr "Suona" #: src/configdialog.c:980 msgid " Playback settings " msgstr " Impostazioni di esecuzione " #: src/configdialog.c:992 msgid " Variable speed " msgstr " Velocità variabile " #: src/configdialog.c:1007 src/help.c:38 msgid "Files" msgstr "File" #: src/configdialog.c:1009 msgid " Temporary file directories " msgstr " Cartelle dei file temporanei " #: src/configdialog.c:1035 msgid " Temporary file settings " msgstr " Impostazioni dei file temporanei " #: src/configdialog.c:1040 msgid "" "To avoid rounding errors when applying more than one effect on the same " "data, floating-point temporary files can be used. However, this will " "increase disk and CPU usage." msgstr "" "Per evitare errori di arrotondamento quando si applicano diversi effetti " "sugli stessi dati, possono essere usati file temporanei con decimali. " "Tuttavia questo aumenta il consumo di CPU e di memoria." #: src/configdialog.c:1048 msgid "" "Some versions of libsndfile supports accessing Ogg files without " "decompressing to a temporary file." msgstr "" "Alcune versioni di libsndfile permetto di accedere ai file OGG senza l'uso " "di un file temporaneo per la decompressione." #: src/configdialog.c:1062 src/help.c:36 msgid "Quality" msgstr "Qualità" #: src/configdialog.c:1064 msgid " Rate conversions " msgstr " Conversioni di tasso " #: src/configdialog.c:1071 msgid "Varispeed: " msgstr "Variavelocità:" #: src/configdialog.c:1072 msgid "Speed effect: " msgstr "Effetto velocità: " #: src/configdialog.c:1079 msgid " Dithering " msgstr " Dithering " #: src/configdialog.c:1090 msgid " Sample conversion " msgstr " Conversioni di tasso " #: src/configdialog.c:1097 msgid "Normalization mode: " msgstr "Modalità normalizzazione:" #: src/configdialog.c:1104 msgid "Other" msgstr "Altro" #: src/configdialog.c:1106 msgid " Time format " msgstr " Formato tempo " #: src/configdialog.c:1115 msgid "Display t_imes as: " msgstr "Mostra temp_i come: " #: src/configdialog.c:1126 msgid "Times_cale format: " msgstr "Formato _scala dei tempi: " #: src/configdialog.c:1137 msgid " External applications " msgstr " Applicazioni esterne " #: src/configdialog.c:1145 msgid "Mi_xer utility: " msgstr "Mi_xer: " #: src/configdialog.c:1155 msgid "Advanced" msgstr "Avanzato" #: src/configdialog.c:1156 msgid " Advanced settings " msgstr " Impostazioni avanzate " #: src/configdialog.c:1164 msgid "Disk editing _threshold: " msgstr "Soglia editing su disco: " #: src/configdialog.c:1175 msgid "View _quality:" msgstr "_Qualità vista:" #: src/configdialog.c:1181 msgid "samples/pixel" msgstr "campioni/pixel" #: src/configdialog.c:1187 msgid "Output _buffer size:" msgstr "Dimensioni _buffer uscita:" #: src/configdialog.c:1193 msgid "bytes" msgstr "bytes" #: src/configdialog.c:1218 msgid "_Close" msgstr "_Chiudi" #: src/dataformat.c:886 #, c-format msgid "Floating-point (single %s)\n" msgstr "Virgola mobile (singola %s)\n" #: src/dataformat.c:886 src/dataformat.c:888 src/dataformat.c:892 msgid "Big-endian" msgstr "Big-endian" #: src/dataformat.c:886 src/dataformat.c:888 src/dataformat.c:892 msgid "Little-endian" msgstr "Little-endian" #: src/dataformat.c:888 #, c-format msgid "Floating-point (double %s)\n" msgstr "Virgola mobile (doppia %s)\n" #: src/dataformat.c:890 #, c-format msgid "PCM, %d(%d) bit, %s %s\n" msgstr "PCM, %d(%d) bit, %s %s\n" #: src/dataformat.c:891 src/formatselector.c:77 msgid "Signed" msgstr "Con segno" #: src/dataformat.c:891 src/formatselector.c:76 msgid "Unsigned" msgstr "Senza segno" #: src/dataformat.c:952 msgid " Testing ranges..." msgstr " Test degli intervalli in corso..." #: src/dataformat.c:976 msgid "Range test failed for format: " msgstr "Test intervalli fallito per il formato: " #: src/dataformat.c:990 msgid " Testing all conversions.." msgstr " Test di tutte le conversioni..." #: src/dataformat.c:1032 msgid "(expected) " msgstr "(atteso) " #: src/dataformat.c:1033 msgid "Conversion test failed, between: " msgstr "Test di conversione fallito, tra: " #: src/dataformat.c:1035 msgid " and: " msgstr " e: " #: src/dataformat.c:1112 msgid "No errors detected!" msgstr "Nessun errore!" #: src/dataformat.c:1146 msgid "Preparing tests.." msgstr "Preparazione test.." #: src/dataformat.c:1154 msgid "Running tests.." msgstr "Esecuzione test.." #: src/dataformat.c:1196 #, c-format msgid "" "\n" "\n" "Test results (1 time unit = %f usec/sample)\n" msgstr "" "\n" "\n" "Risultati test (1 unità di tempo = %f usec/campione)\n" #: src/datasource.c:366 #, c-format msgid "Couldn't open %s" msgstr "Non si riesce ad aprire %s" #: src/datasource.c:497 msgid "Unexpected end of file" msgstr "Fine del file inattesa" #: src/datasource.c:498 #, c-format msgid "Error reading %s: %s" msgstr "Errore di lettura %s: %s" #: src/datasource.c:515 #, c-format msgid "Error seeking in %s: %s" msgstr "Errore di ricerca in %s: %s" #: src/effectbrowser.c:99 msgid "Built-in" msgstr "Interni (B)" #: src/effectbrowser.c:102 msgid "Volume adjust/fade" msgstr "Regola volume/sfuma" #: src/effectbrowser.c:104 msgid "Convert samplerate" msgstr "Converti tasso" #: src/effectbrowser.c:106 msgid "Convert sample format" msgstr "Converti formato campione" #: src/effectbrowser.c:108 msgid "Map channels" msgstr "Mappa canali" #: src/effectbrowser.c:110 msgid "Combine channels" msgstr "Combina canali" #: src/effectbrowser.c:113 msgid "Add channels from other file" msgstr "Aggiungi canali da altro file" #: src/effectbrowser.c:114 msgid "Speed" msgstr "Velocità" #: src/effectbrowser.c:115 msgid "Pipe through program" msgstr "Invia attraverso programma" #: src/effectbrowser.c:250 msgid "You have no open file to apply the effect to!" msgstr "Nessun file aperto su cui applicare l'effetto!" #: src/effectbrowser.c:275 msgid "This effect could not be loaded." msgstr "L'effetto non può essere caricato." #: src/effectbrowser.c:582 msgid "/Move Up" msgstr "/Sposta su" #: src/effectbrowser.c:583 msgid "/Move Down" msgstr "/Sposta giù" #: src/effectbrowser.c:584 msgid "/Move to Top" msgstr "/Sposta in cima" #: src/effectbrowser.c:585 msgid "/Move to Bottom" msgstr "/Sposta in fondo" #: src/effectbrowser.c:587 msgid "/Sort by Name" msgstr "/Ordina per nome" #: src/effectbrowser.c:588 msgid "/Sort by Type" msgstr "/Ordina per tipo" #: src/effectbrowser.c:589 msgid "/Sort by Location" msgstr "/Ordina per posizione" #: src/effectbrowser.c:590 msgid "/Sort by Author" msgstr "/Ordina per autore" #: src/effectbrowser.c:592 msgid "/Restore Order" msgstr "/Ripristina ordine" #: src/effectbrowser.c:593 msgid "/Rebuild Effect List" msgstr "/Rileggi lista effetti" #: src/effectbrowser.c:744 msgid "Top" msgstr "Cima" #: src/effectbrowser.c:751 msgid "Up" msgstr "Su" #: src/effectbrowser.c:758 msgid "Down" msgstr "Giù" #: src/effectbrowser.c:765 msgid "Bottom" msgstr "Fondo" #: src/effectbrowser.c:793 msgid "Close dialog after applying effect" msgstr "Chiudi questa finestra dopo l'applicazione dell'effetto" #: src/effectbrowser.c:800 src/gotodialog.c:154 msgid "Apply" msgstr "Applica" #: src/effectbrowser.c:808 src/gotodialog.c:159 src/mainwindow.c:1438 #: src/pipedialog.c:165 src/recorddialog.c:610 src/recorddialog.c:987 #: src/sound-esound.c:290 src/sound-jack.c:264 src/sound-oss.c:479 msgid "Close" msgstr "Chiudi" #: src/effectbrowser.c:830 src/help.c:35 msgid "Effects" msgstr "Effetti" #: src/effectbrowser.c:892 msgid "Apply to: " msgstr "Applica a:" #: src/filetypes.c:103 msgid "putenv failed!" msgstr "putenv failed!" #: src/filetypes.c:113 msgid "unsetenv failed!" msgstr "unsetenv failed!" #: src/filetypes.c:155 msgid "Microsoft WAV format" msgstr "Formato WAV Microsoft" #: src/filetypes.c:181 msgid "Ogg Vorbis" msgstr "OGG Vorbis" #: src/filetypes.c:188 msgid "Raw PCM data" msgstr "dati PCM grezzi" #: src/filetypes.c:190 msgid "Open with MPlayer" msgstr "Apri con MPlayer" #: src/filetypes.c:275 #, c-format msgid "The file %s does not exist!" msgstr "Il file %s non esiste!" #: src/filetypes.c:282 #, c-format msgid "The file %s is not a regular file!" msgstr "Il file %s non è regolare!" #: src/filetypes.c:294 msgid "Loading" msgstr "Apertura in corso..." #: src/filetypes.c:333 #, c-format msgid "" "The file name '%s' has an extension unknown to the program. Please specify " "in which format this file should be saved." msgstr "" "Il nome del file %s ha un'estensione ignota al programma. Specificare in che " "formato deve essere salvato." #: src/filetypes.c:338 msgid "Unknown file type" msgstr "Tipo file sconosciuto" #: src/filetypes.c:389 msgid "Saving" msgstr "Salvataggio in corso..." #: src/filetypes.c:393 #, c-format msgid "" "The file %s may be destroyed since the saving failed. Try to free up some " "disk space and save again. If you exit now the file's contents could be in a " "bad state. " msgstr "" "Il file %s può essere corrotto perché il salvataggio è fallito. Cercare di " "liberare spazio sul disco e salvare di nuovo. Se si esce ora il contenuto " "del file può essere rovinato." #: src/filetypes.c:457 #, c-format msgid "%s is not a valid wav file" msgstr "%s non è un file WAV valido" #: src/filetypes.c:472 #, c-format msgid "" "The file %s is a compressed wav file. This program can only work with " "uncompressed wav files." msgstr "" "Il file %s è un WAV compresso. Questo programma lavora solo con file non " "compressi." #: src/filetypes.c:593 msgid "" "On this system, libsndfile is required to save floating-point wav files." msgstr "" "Su questo sistema è necessaria la presenza di libsndfile per salvare file " "WAV con virgola mobile." #: src/filetypes.c:616 msgid "" "You are saving a wav file larger than 2048MB. Such large files are non-" "standard and may not be readable by all programs.\n" "\n" " (this warning will not be displayed again)" msgstr "" "Si sta salvando un file più grande di 2048MB. Questo non è standard e " "potrebbe dare problemi di lettura su alcuni programmi.\n" "\n" "(questo avvertimento non verrà ripetuto)" #: src/filetypes.c:732 src/filetypes.c:877 #, c-format msgid "Failed to open '%s'!" msgstr "Caricamento fallito '%s'!" #: src/filetypes.c:849 msgid "Invalid sample format or number of channels for this file format" msgstr "Formato campioni o numero canali non valido per questo formato" #: src/filetypes.c:943 #, c-format msgid "Failed to write to '%s'!" msgstr "Scrittura fallita in '%s'!" #: src/filetypes.c:1028 msgid "Decoding" msgstr "Decodifica in corso..." #: src/filetypes.c:1149 msgid "Variable bitrate (default)" msgstr "Bitrate variabile (predefinito)" #: src/filetypes.c:1150 msgid "Average bitrate" msgstr "Bitrate medio" #: src/filetypes.c:1151 msgid "Constant bitrate" msgstr "Bitrate costante" #: src/filetypes.c:1152 msgid "Custom argument" msgstr "Argomento opzionale" #: src/filetypes.c:1156 msgid "Standard (high quality)" msgstr "Standard (alta qualità)" #: src/filetypes.c:1157 msgid "Extreme (higher quality)" msgstr "Estremo (qualità altissima)" #: src/filetypes.c:1158 msgid "Insane (highest possible quality)" msgstr "Senza senso (qualità massima possibile)" #: src/filetypes.c:1176 #, c-format msgid "%s kbit/s" msgstr "%s kbit/s" #: src/filetypes.c:1205 msgid "MP3 Preferences" msgstr "Preferenze MP3" #: src/filetypes.c:1216 msgid "Encoding type: " msgstr "Tipo codifica: " #: src/filetypes.c:1229 msgid "Quality: " msgstr "Qualità: " #: src/filetypes.c:1238 msgid "Custom argument: " msgstr "Argomento facoltativo: " #: src/filetypes.c:1244 msgid "Use this setting by default" msgstr "Usare sempre queste impostazioni" #: src/filetypes.c:1249 src/gotodialog.c:146 src/mainwindow.c:1509 #: src/rawdialog.c:101 src/sound-alsalib.c:98 src/sound-esound.c:286 #: src/sound-jack.c:260 src/sound-oss.c:475 src/um.c:109 src/um.c:142 #: src/um.c:341 src/um.c:449 msgid "OK" msgstr "OK" #: src/filetypes.c:1257 src/rawdialog.c:107 src/sound-alsalib.c:102 #: src/um.c:133 src/um.c:150 src/um.c:347 src/um.c:458 msgid "Cancel" msgstr "Annulla" #: src/float_box.c:184 src/int_box.c:184 #, c-format msgid "'%s' is not a number!" msgstr "'%s' non è un numero!" #: src/float_box.c:202 #, c-format msgid "Value for '%s' must be a number between %f and %f" msgstr "Il valore di '%s' deve essere un numero compreso tra %f e %f" #: src/formatselector.c:60 msgid "Sample type: " msgstr "Tipo di campione: " #: src/formatselector.c:62 msgid "8 bit PCM" msgstr "PCM 8 bit" #: src/formatselector.c:63 msgid "16 bit PCM" msgstr "PCM 16 bit" #: src/formatselector.c:64 msgid "24 bit PCM" msgstr "PCM 24 bit" #: src/formatselector.c:65 msgid "32 bit PCM" msgstr "PCM 32 bit" #: src/formatselector.c:66 msgid "Floating-point, single" msgstr "Con virgola, singola precisione" #: src/formatselector.c:67 msgid "Floating-point, double" msgstr "Con virgola, doppia precisione" #: src/formatselector.c:74 msgid "Signedness: " msgstr "Segno:" #: src/formatselector.c:82 msgid "Endianness: " msgstr "Ordine dei bit: " #: src/formatselector.c:84 msgid "Little endian" msgstr "Little endian" #: src/formatselector.c:85 msgid "Big endian" msgstr "Big endian" #: src/formatselector.c:90 msgid "Alignment:" msgstr "Allineamento:" #: src/formatselector.c:92 msgid "Packed" msgstr "Compattato" #: src/formatselector.c:93 msgid "Top bytes" msgstr "Primi byte" #: src/formatselector.c:94 msgid "Bottom bytes" msgstr "Ultimi byte" #: src/formatselector.c:130 msgid "Channels: " msgstr "Canali: " #: src/formatselector.c:139 msgid "Sample rate: " msgstr "Tasso del campione: " #: src/formatselector.c:226 msgid "sample rate" msgstr "tasso campione" #: src/gotodialog.c:102 msgid "Place cursor " msgstr "Porta il cursore a" #: src/gotodialog.c:107 src/sound-esound.c:274 msgid "seconds" msgstr "secondi" #: src/gotodialog.c:111 src/soxdialog.c:487 msgid "samples" msgstr "campioni" #: src/gotodialog.c:115 msgid "after beginning of file" msgstr "dopo l'inizio del file" #: src/gotodialog.c:120 msgid "after end of file" msgstr "dopo la fine del file" #: src/gotodialog.c:125 msgid "after current cursor position" msgstr "dopo la posizione del cursore" #: src/gotodialog.c:130 msgid "after selection start" msgstr "dopo l'inizio della selezione" #: src/gotodialog.c:135 msgid "after selection end" msgstr "dopo la fine della selezione" #: src/gotodialog.c:139 msgid "" "(use a negative number to place the cursor before instead of after the " "selected point)" msgstr "" "(usare numeri negativi per portare il cursore prima del punto selezionato)" #: src/gotodialog.c:178 msgid "Position cursor" msgstr "Porta cursore" #: src/gtkfiles.c:48 #, c-format msgid "Could not open %s: %s" msgstr "Impossible aprire %s: %s" #: src/gtkfiles.c:53 #, c-format msgid "Warning: Unexpected error: %s" msgstr "Attenzione: errore inaspettato: %s" #: src/gtkfiles.c:110 src/gtkfiles.c:125 #, c-format msgid "Error closing %s: %s" msgstr "Errore di chiusura %s: %s" #: src/gtkfiles.c:140 #, c-format msgid "Could not seek in %s: %s" msgstr "Impossibile cercare in %s: %s" #: src/gtkfiles.c:159 src/gtkfiles.c:204 #, c-format msgid "Could not read from %s: %s" msgstr "Impossibile leggere da %s: %s" #: src/gtkfiles.c:178 #, c-format msgid "Unexpected end of file reading from %s" msgstr "Fine file inaspettata mentre si legge da %s" #: src/gtkfiles.c:196 #, c-format msgid "Unable to write data to %s" msgstr "Impossibile scrivere dati su %s" #: src/gtkfiles.c:262 #, c-format msgid "Could not get file position in %s: %s" msgstr "Impossibile trovare posizione in %s: %s" #: src/gtkfiles.c:313 src/gtkfiles.c:473 msgid "File already exists. Overwrite?" msgstr "Il file esiste. Sovrascrivere?" #: src/gtkfiles.c:321 msgid "No file with that name!" msgstr "Nessun file con quel nome!" #: src/gtkfiles.c:705 #, c-format msgid "Error reading from %s: %s" msgstr "Errore di lettura da %s: %s" #: src/gtkfiles.c:737 #, c-format msgid "Could not remove '%s': %s" msgstr "Impossibile eliminare '%s': %s" #: src/gtkfiles.c:757 #, c-format msgid "Error creating link to '%s': %s" msgstr "Errore creazione link a '%s': %s" #: src/help.c:30 msgid "General" msgstr "Generale" #: src/help.c:31 msgid "Sample view" msgstr "Vista campioni" #: src/help.c:32 msgid "Playing" msgstr "Suonare" #: src/help.c:33 msgid "Recording" msgstr "Registrare" #: src/help.c:34 msgid "Editing" msgstr "Modificare" #: src/help.c:37 msgid "File formats" msgstr "Formati file" #: src/help.c:39 msgid "Keyboard shortcuts" msgstr "Abbreviazioni da tastiera" #: src/help.c:40 msgid "Bug reporting" msgstr "Riportare errori" #: src/help.c:41 msgid "Helping out" msgstr "Aiutare" #: src/help.c:42 msgid "Contact" msgstr "Contatti" #: src/help.c:47 #, no-c-format msgid "" "mhWaveEdit is a graphical program for editing sound files. It is completely " "free (GPL).\n" msgstr "" "mhWaveEdit è un programma grafico per modificare i file sonori. E' " "totalmente libero (GPL).\n" #: src/help.c:49 #, no-c-format msgid "You can find the latest release of mhWaveEdit at:\n" msgstr "L'ultima versione di mhWaveEdit si trova a:\n" #: src/help.c:50 #, no-c-format msgid "http://gna.org/projects/mhwaveedit/\n" msgstr "http://gna.org/projects/mhwaveedit/\n" #: src/help.c:55 #, no-c-format msgid "" "The area where you 'see' the contents of the file you are editing, is called " "the 'sample view'. \n" msgstr "" "L'area dove si 'vedono' i contenuti del file che si sta modificando è " "chiamata 'vista dei campioni'.\n" #: src/help.c:57 #, no-c-format msgid "" "In the sample view there is a grey vertical bar called the 'cursor'. The " "cursor follows the sound wave when you play the sound. You can position the " "cursor by clicking with the right (2:nd) mouse button. If you do this while " "you're playing a file, the playing will continue from the new cursor " "position. You can also position the cursor more exact by using the 'Position " "Cursor...' command on the Edit menu.\n" msgstr "" "Nella vista c'è una barra grigia chiamata 'cursore'. Il cursore segue l'onda " "sonora quando si suona il file. Si può spostare il cursore con un clic " "destro del mouse. Se si clicca mentre il file sta suonando, l'esecuzione " "continua dalla nuova posizione del cursore. La voce 'Posizione cursore' del " "menu Cursore contiene alcuni comandi per posizionare più precisamente la " "barra.\n" #: src/help.c:59 #, no-c-format msgid "" "You can place marks in your file by holding down Ctrl and pressing a number " "from 0 to 9. This will place a mark (green vertical bar) with the same " "number at the current cursor position. You can later make the cursor go to " "that position again by just pressing the number. Setting and jumping to " "marks can be done while playing. To remove a mark, jump to the mark and set " "it again.\n" msgstr "" "Premendo Ctrl con un tasto numerico si possono creare dei segnalibri sul " "suono. Comparirà una barra verde con il numero scelto. Per portare il " "cursore alla posizione segnata basta premere quel tasto numerico. " "L'impostazione e il salto ai segni possono essere fatti suonando. Per " "togliere un segno, saltare al numero e reimpostarlo.\n" #: src/help.c:64 #, no-c-format msgid "" "Playing a file is simple, just load the file and press the play button. The " "green play button plays from the current position. The yellow play button " "plays the current selection, or the entire file if nothing is selected. Stop " "the playback with the stop button (with the red square). \n" msgstr "" "Ascoltare un file è semplice: lo si carica e si preme il bottone Suona. Il " "triangolo verde suona dalla posizione attuale del cursore, quello giallo " "suona la selezione attuale o l'intero file se non è selezionato niente. " "Fermare l'esecuzione con il bottone Ferma (quadrato rosso)\n" #: src/help.c:66 #, no-c-format msgid "" "The playback speed can be varied by adjusting the slider to the far right. \n" msgstr "" "La velocità di esecuzione può variare regolando il cursore verticale " "all'estrema destra.\n" #: src/help.c:68 #, no-c-format msgid "You can do normal editing while the file is playing.\n" msgstr "Le modifiche normali possono essere fatte durante l'esecuzione.\n" #: src/help.c:73 #, no-c-format msgid "" "Recording is done with 'Record...' on the Play menu, or the Record button " "(the red circle). A dialog box will pop up where you can select what format " "you want to record in. After selecting the format, meters and numbers will " "appear showing info about the volume level of the sound input. \n" msgstr "" "La registrazione si avvia con 'Registra...' dal menu Suona, oppure dal " "bottone Registra (cerchio rosso). Compare una finestra dove si può " "selezionare il formato di registrazione. Appena fatta questa scelta, " "compaiono indicatori e numeri che mostrano il livello dei suoni in " "ingresso.\n" #: src/help.c:75 #, no-c-format msgid "" "When you want to start recording, press the \"Start recording\" button. When " "you've recorded everything you wanted to, press the Finish button and the " "record dialog will disappear and newly recorded sound will show up in a new " "window.\n" msgstr "" "Quando si vuol far partire la registrazione, premere il bottone 'Avvia " "registrazione'. Alla fine, premere il bottone 'Finisci': la finestra di " "registrazione scompare ed i suoni appena registrati appariranno in una nuova " "finestra.\n" #: src/help.c:77 #, no-c-format msgid "" "Currently it is impossible to play and record at the same time, so the " "playback will stop when you record.\n" msgstr "" "E' attualmente impossibile registrare mentre si sta suonando, quindi " "l'esecuzione si ferma quando si avvia una registrazione.\n" #: src/help.c:82 #, no-c-format msgid "" "You make selections by dragging the mouse over the sample view. You can hear " "what you've currently selected by clicking on the \"play selection\" button " "(the button with the yellow arrow) or by selecting 'Play selection' from the " "Play menu.\n" msgstr "" "La selezione si può fare trascinando il mouse sopra alla vista campioni. Si " "può ascoltare quanto selezionato cliccando sul bottone 'Suona " "selezione' (quello con il triangolo giallo) o scegliendo 'Suona selezione' " "dal menu 'Suona'.\n" #: src/help.c:84 #, no-c-format msgid "" "You can use the cursor to refine the selection. Use the 'Selection start at " "cursor' and 'Selection end at cursor' buttons to move the selection starting " "point or the selection end point to the current cursor position. You can " "also drag the selection endpoints using the mouse.\n" msgstr "" "Il cursore può essere usato per perfezionare la selezione. I bottoni 'Inizio " "selezione al cursore' e 'Fine selezione al cursore' muovono l'inizio o la " "fine della selezione alla posizione corrente del cursore. I confini della " "selezione possono anche essere spostati col mouse.\n" #: src/help.c:86 #, no-c-format msgid "The 'Cut' and 'Copy' functions work like in any other software. \n" msgstr "" "Le funzioni 'Taglia' e 'Copia' funzionano come in tutti gli altri " "programmi.\n" #: src/help.c:88 #, no-c-format msgid "" "The 'Paste' function insert the clipboard contents at the cursor position. " "The 'Paste over' function works like 'Paste', except that it overwrites the " "data after the insert position. \n" msgstr "" "La funzione 'Incolla' inserisce il contenuto della memoria di transito alla " "posizione del cursore. La funzione 'Incolla sopra' funziona allo stesso " "modo, ma copre il suono esistente dopo la posizione del cursore.\n" #: src/help.c:90 #, no-c-format msgid "" "The 'Paste mix' function combines the clipboard data with the data at the " "cursor position.\n" msgstr "" "La funzione 'Incolla mix' mescola i dati esistenti con quelli incollati.\n" #: src/help.c:92 #, no-c-format msgid "" "The 'Paste as new' function opens a new window and puts the clipboard " "contents into it. \n" msgstr "" "La funzione 'Incolla come nuovo' apre una nuova finestra e ci mette il " "contenuto della memoria di transito.\n" #: src/help.c:94 #, no-c-format msgid "" "The 'Crop' function deletes all parts of the file that are not selected.\n" msgstr "" "La funzione 'Ritaglia' cancella tutte le parti del file che non sono " "selezionate.\n" #: src/help.c:96 #, no-c-format msgid "" "The 'Silence selection' function replaces the selected part with silence. To " "avoid clicks, the silent part is a line that meets the wave at the " "endpoints.\n" msgstr "" "La funzione 'Silenzia selezione' sostituisce la selezione con silenzio. Per " "evitare clic, la parte silenziosa si raccorda con l'onda esistente agli " "estremi.\n" #: src/help.c:98 #, no-c-format msgid "" "All editing functions work non-destructively, that is, the file you're " "editing isn't actually changed until you save it (the effects also work this " "way).\n" msgstr "" "Tutte le funzioni di modifica lavorano in modo non distruttivo, cioè le " "modifiche apportate non vengono applicate fin quando non si salva il file " "(anche gli effetti funzionano allo stesso modo).\n" #: src/help.c:104 #, no-c-format msgid "" "mhWaveEdit has a few simple effects, which are available from the 'Effects' " "menu. \n" msgstr "" "mhWaveEdit ha pochi effetti semplici, che si trovano sotto il menu " "'Effetti'.\n" #: src/help.c:106 #, no-c-format msgid " * Fade in/out\n" msgstr " * Fade in/out\n" #: src/help.c:108 #, no-c-format msgid " This creates a linear fade in or fade out effect.\n" msgstr " Crea una sfumatura lineare in ingresso o uscita.\n" #: src/help.c:110 #, no-c-format msgid " * Normalize, Normalize to...\n" msgstr " * Normalizza, Normalizza a...\n" #: src/help.c:112 #, no-c-format msgid "" " This amplifies the sound as much as possible without getting clipping " "distortion. The \"Normalize to...\" item lets you specify which level to " "normalize to.\n" msgstr "" " Amplifica il suono quanto più possibile senza tagliare i picchi o " "distorcere. La voce 'Normalizza a...' permette di indicare a che livello si " "vuole normalizzare.\n" #: src/help.c:114 #, no-c-format msgid " * Volume adjust/fade...\n" msgstr " * Regola volume/sfuma...\n" #: src/help.c:116 #, no-c-format msgid "" " This effect lets you select a starting volume and a ending volume and " "amplifies the selection fading from the starting volume to the ending " "volume.\n" msgstr "" " Questo effetto permette di scegliere un volume iniziale e uno finale ed " "aumenta la selezione in base ai livelli scelti, partendo dal primo per " "arrivare al secondo.\n" #: src/help.c:118 #, no-c-format msgid "" " Note that volumes above 100% may cause sound distortion. Use the 'Find " "top volume' to find out the maximum amplification possible without " "distortion. (You can use this for normalizing samples.) \n" msgstr "" " Notare che volumi oltre il 100% possono causare distorsione. Usare il " "bottone 'Trova volume massimo' per cercare la massima amplificazione senza " "distorsione (si può usare per normalizzare dei frammenti).\n" #: src/help.c:120 #, no-c-format msgid "" " By setting starting volume and ending volume to the same value you get a " "simple amplification of the sound. \n" msgstr "" " Impostando il volume iniziale e finale allo stesso livello, si ottiene " "l'amplificazione semplice del suono.\n" #: src/help.c:122 #, no-c-format msgid " * Convert samplerate...\n" msgstr " * Converti tasso campionamento...\n" #: src/help.c:124 #, no-c-format msgid "" " This converts the samplerate of the entire file to one you specify. There " "are different methods for doing this, usually the one in the top has the " "best quality but can take longer than the other methode.\n" msgstr "" " Converte il tasso di campionamento dell'intero file. Ci sono diversi " "metodi per farlo, normalmente il primo ha la migliore qualità ma può essere " "più lento degli altri.\n" #: src/help.c:126 #, no-c-format msgid " * Convert sample format...\n" msgstr " * Converti formato campione\n" #: src/help.c:128 #, no-c-format msgid " This converts the sample format of the entire file.\n" msgstr " Converte il formato del campione per l'intero file.\n" #: src/help.c:130 #, no-c-format msgid "" " The 'Don't actually change the data' option can be used if the program " "was wrong about the file's format.\n" msgstr "" " L'opzione 'Non cambiare i dati' può essere usata se il programma ha " "sbagliato ad identificare il formato del file quando lo ha aperto.\n" #: src/help.c:132 #, no-c-format msgid " * Byte swap\n" msgstr " * Scambia byte\n" #: src/help.c:134 #, no-c-format msgid "" " This \"byte swaps\" the selected part. It can be used to repair damaged " "files where the byte order is wrong. Note that if the sound looks alright " "but plays wrong, you should not use this option, instead you should use the " "\"byte-swap output\" option in the Preferences dialog.\n" msgstr "" " Scambia i byte nella selezione. Può essere usato per riparare file " "danneggiati, quando l'ordine dei byte è errato. Notare che se il suono " "sembra a posto ma si sente male, non si deve usare questa opzione ma " "'Scambia ordine byte' nel pannello Modifica/Preferenze/Audio.\n" #: src/help.c:136 #, no-c-format msgid " * Mix to mono\n" msgstr " * Mix a mono\n" #: src/help.c:138 #, no-c-format msgid " This mixes all channels of the file together to a mono sound.\n" msgstr " Miscela tutti i canali in un suono monofonico.\n" #: src/help.c:140 #, no-c-format msgid " * Add channel\n" msgstr " * Aggiungi canale\n" #: src/help.c:142 #, no-c-format msgid "" " This copies the first channel to a new channel in the sound, converting " "mono to stereo etc.\n" msgstr "" " Copia il primo canale ad un nuovo canale, convertendo ad esempio mono a " "stereo eccetera.\n" #: src/help.c:144 #, no-c-format msgid " * Map channels...\n" msgstr " * Mappa canali...\n" #: src/help.c:145 #, no-c-format msgid " \n" msgstr " \n" #: src/help.c:146 #, no-c-format msgid "" " With this effect, you can change the number of channels in the file. You " "can also rearrange and add (i.e. mix) channels.\n" msgstr "" " Con questo effetto si può cambiare il numero di canali nel file. Si " "possono anche riorganizzare ed aggiungere (es. miscelare) canali.\n" # msgstr "* Regola velocità\n" #: src/help.c:148 #, no-c-format msgid " * Combine channels...\n" msgstr " * Combina canali...\n" #: src/help.c:150 #, no-c-format msgid "" " This effect lets you create a new sound by a linear combination of the " "old channels. This means you can do channel mixing / swapping / balance / " "panning / amplification etc. by entering different values. For example, to " "swap the left and right channel, you select that the new Channel 1 should be " "0% of the old Channel 1 and 100% of the old Channel 2, and the new Channel 2 " "should be 100% of the old Channel 1 and 0% of the old Channel 2 \n" msgstr "" " Con questo effetto si può creare un nuovo suono con una combinazione " "lineare dei vecchi canali. Si possono fare miscelazioni/ scambio/ " "bilanciamento/ posizionamento/ amplificazione ecc. inserendo diversi valori. " "Per esempio per scambiare destro e sinistro si imposta Nuovo Canale 1 con 0% " "del Vecchio Canale 1 e 100% del Vecchio Canale 2, e Nuovo Canale 2 con 100% " "di Vecchio Canale 1 e 0% di Vecchio Canale 2.\n" # msgstr "* Invia a programma...\n" #: src/help.c:152 #, no-c-format msgid " * Speed adjustment...\n" msgstr " * Cambia velocità...\n" #: src/help.c:154 #, no-c-format msgid "" " This effect changes the speed of the selection. The tone will change as " "well.\n" msgstr "" " Questo effetto cambia la velocità della selezione. Anche la tonalità " "cambia, ovviamente.\n" #: src/help.c:155 #, no-c-format msgid " * Pipe through program...\n" msgstr " * Invia a programma...\n" #: src/help.c:156 #, no-c-format msgid " \n" msgstr " \n" #: src/help.c:157 #, no-c-format msgid "" " This effect is for advanced users wanting to pipe raw audio data through " "an external program. The output of the program is read back and replaces the " "processed part. \n" msgstr "" " Questo effetto è per utenti esperti che vogliono inviare dati grezzi ad " "un programma esterno. Il risultato viene riletto e sostituisce la " "selezione.\n" #: src/help.c:159 #, no-c-format msgid "" "mhWaveEdit supports LADSPA effects and can also make use of most of the SoX " "utility's effects. To find the LADSPA plugins the environment variable " "LADSPA_PATH must be properly set up. \n" msgstr "" "mhWaveEdit supporta gli effetti LADSPA e può anche fare uso della maggior " "parte degli effetti di SoX. Per trovare gli effetti LADSPA, la variabile " "d'ambiente LADSPA_PATH deve essere impostata correttamente.\n" #: src/help.c:161 #, no-c-format msgid "" "All supported effects can be found by choosing the 'Effects...' menu item. " "The effects are listed with names beginning with [B] for builtin effects, " "[L] for LADSPA effects, and [S] for SoX effects.\n" msgstr "" "Tutti gli effetti supportati possono essere trovati aprendo 'Effetti/" "Finestra effetti...'. Gli effetti sono elencati per nome, preceduti da [B] " "per quelli interni, [L] per i LADSPA e [S] per i SoX.\n" #: src/help.c:167 #, no-c-format msgid "Some notes on sound quality.\n" msgstr "Alcune note sulla qualità del suono.\n" #: src/help.c:169 #, no-c-format msgid "" "The general rule when doing audio editing/processing is to not manipulate " "the data more than necessary and keep an original copy whenever you're " "processing your important files. \n" msgstr "" "La regola generale quando si modifica un suono è di non manipolare i dati " "più del necessario, e tenere una copia dell'originale se si lavora su dati " "importanti.\n" #: src/help.c:171 #, no-c-format msgid "" "Cut, copy and paste operations move the data around without modifying it, so " "these don't degrade the sound quality. Because of level differences, you may " "get a \"step\" at the start and end of the inserted part, which can cause a " "small clicking sound. \n" msgstr "" "Taglia, copia e incolla spostano i dati senza modificarli, dunque non " "degradano la qualità del suono. A causa delle differenze di volume, si " "possono provocare degli 'scalini' ad inizio e fine delle parti inserite, che " "possono causare un piccolo clic sonoro.\n" #: src/help.c:173 #, no-c-format msgid "" "The mix paste function doesn't decrease quality, unless the peaks become too " "high and you get clipping. In that case you will get a warning message.\n" msgstr "" "La funzione Incolla mix non diminuisce la qualità, a meno che i picchi " "diventino troppo alti e vengano tosati. In questo caso apparirà un " "avvertimento.\n" #: src/help.c:175 #, no-c-format msgid "" "Sound data is normally stored as integer values. Therefore, whenever you " "normalize, adjust volume, decrease sample size or filter a sound, the result " "must be rounded. If you use 24 or 32 bit sample sizes, this is not really a " "problem, but if you use 8 or 16 bits sample size, this rounding causes a " "decrease in quality. \n" msgstr "" "I dati sonori sono normalmente memorizzati come numeri interi. Le operazioni " "di normalizzazione, regolazione volume, diminuzione della dimensione del " "campione o filtraggio, quindi, producono risultati che devono essere " "arrotondati. Usando campioni a 24 o 32 bit questo non è un problema, ma ad 8 " "o 16 bit l'arrotondamento può diminuire la qualità del suono.\n" #: src/help.c:177 #, no-c-format msgid "" "The quality decrease that the rounding causes can be masked by adding a " "small amount of noise before rounding. This is called \"dithering\". " "mhWaveEdit supports basic dithering and it's enabled by default.\n" msgstr "" "La diminuzione di qualità dovuta all'arrotondamento può essere mascherata " "aggiungendo una piccola quantità di rumore prima che esso avvenga. Questo è " "chiamato 'dithering'. mhWaveEdit può applicare il dithering semplice ed è di " "solito attivo.\n" #: src/help.c:179 #, no-c-format msgid "" "By default, mhWaveEdit uses floating-point temporary files for storing " "processed results to avoid rounding until the file is saved.\n" msgstr "" "Di solito mhWaveEdit usa file temporanei con virgola per memorizzare i " "risultati, evitando di arrotondare fino al momento di salvare il file.\n" #: src/help.c:184 #, no-c-format msgid "" "Even if mhWaveEdit was originally built for editing wav files, it's also " "possible to load and save in a few other formats. mhWaveEdit always supports " "wav and raw files, but if it's compiled with the libsndfile library, " "mhWaveEdit supports a couple of other formats as well. \n" msgstr "" "Anche se mhWaveEdit è stato creato per modificare file WAV, è anche " "possibile caricare e salvare in alcuni altri formati. mhWaveEdit legge i " "file WAV e RAW, ma se viene compilato con libsndfile può lavorare anche con " "qualche altro formato.\n" #: src/help.c:186 #, no-c-format msgid "" "To save a file with a different file format, use \"Save as...\" and choose a " "format in the file type selection box. \n" msgstr "" "Per salvare un file in altro formato, usare \"Salva come...\" e scegliere un " "formato nella finestra di dialogo.\n" #: src/help.c:188 #, no-c-format msgid "" "mhWaveEdit has basic support for mp3 and ogg formats. For this to work you " "need to have LAME installed for mp3 support, and OggDec/OggEnc for Ogg " "support. If you have these programs, you can open and save mp3/ogg files " "just like any other file format.\n" msgstr "" "mhWaveEdit ha un supporto di base per i formati MP3 e OGG. Questo funziona " "se LAME è installato (per gli MP3) e OggDec/OggEnc (per i file OGG). Se ci " "sono questi programmi, l'apertura di questi file funziona come quella degli " "altri.\n" #: src/help.c:190 #, no-c-format msgid "" "If mplayer is installed, mhwaveedit can open all formats that it supports, " "for example the soundtrack of a video file. Since mplayer is only a player, " "these files can not be saved back after editing, you have to save the file " "into a supported format.\n" msgstr "" "Se viene installato Mplayer, mhWaveEdit apre tutti i formati supportati da " "esso, ad esempio la colonna sonora di un file video. Siccome Mplayer è solo " "un lettore, però, questi file non possono essere risalvati dopo la modifica. " "Si possono solo salvare in uno dei formati di mhWaveEdit.\n" #: src/help.c:195 #, no-c-format msgid "" "mhWaveEdit creates a directory ~/.mhwaveedit where it stores configuration " "information. \n" msgstr "" "mhWaveEdit crea una cartella, ~/.mhwaveedit dove salva le informazioni di " "configurazione.\n" #: src/help.c:197 #, no-c-format msgid "" "The configuration file is called config. It can be hand edited, but the " "easiest way is through 'Preferences' on the Edit menu.\n" msgstr "" "Il file di configurazione si chiama config. Può essere modificato a mano, ma " "il modo più facile è di usare 'Preferenze' dal menu 'Modifica'.\n" #: src/help.c:199 #, no-c-format msgid "" "Each mhwaveedit process creates a session file in the .mhwaveedit directory " "called mhwaveedit-session---, where is the " "session ID number and is a character code showing the state of the " "session ('r' for running sessions). \n" msgstr "" "Ogni processo mhWaveEdit crea un file sessione nella cartella .mhwaveedit, " "chiamato mhwaveedit-session---, dove è il " "numero ID della sessione e è un carattere che mostra lo stato della " "sessione ('r' per le sessioni in corso).\n" #: src/help.c:201 #, no-c-format msgid "" "Temporary files are by default also stored in the ~/.mhwaveedit directory. " "Which directories to use can be set through the preferences dialog. To get " "the best performance, you should have one temporary directory for each local " "filesystem. The temporary files have names of the form \"mhwaveedit-temp-" "-nnnn-\". Do NOT open or remove temporary files with the same " "pid number as a currently running mhWaveEdit.\n" msgstr "" "Anche i file temporanei sono salvati nella cartella ~/.mhwaveedit. La " "cartella da usare può essere indicata nel pannello delle preferenze. Per " "ottenere le migliori prestazioni, ci deve essere una sola cartella " "temporanea per ogni filesystem locale. I file temporanei hanno nomi nel " "formato \"mhwaveedit-temp--nnnn-\". NON aprire o cancellare " "questi file se hanno lo stesso numero PID di una finestra mhWaveEdit " "aperta.\n" #: src/help.c:203 #, no-c-format msgid "" "mhWaveEdit checks on startup for leftover temporary files and lets the user " "open them. After opening a crashed session, the files can be saved or thrown " "away.\n" msgstr "" "mhWaveEdit controlla ad ogni avvio se ci sono file temporanei rimasti, e " "propone all'utente di aprirli. Dopo aver aperto una sessione bloccata, i " "file possono essere salvati o buttati.\n" #: src/help.c:208 #, no-c-format msgid "F1 Help\n" msgstr "F1 Aiuto\n" #: src/help.c:209 #, no-c-format msgid "F12 Record\n" msgstr "F12 Registra\n" #: src/help.c:211 #, no-c-format msgid "Ctrl+(number) Set mark\n" msgstr "Ctrl+(numero) Metti segno\n" #: src/help.c:212 #, no-c-format msgid "(number) Goto mark\n" msgstr "(numero) Vai al segno\n" #: src/help.c:214 #, no-c-format msgid "Ctrl+P Preferences\n" msgstr "Ctrl+P Preferenze\n" #: src/help.c:215 #, no-c-format msgid "Ctrl+E Effects\n" msgstr "Ctrl+E Effetti\n" #: src/help.c:217 #, no-c-format msgid "Ctrl+O Open file\n" msgstr "Ctrl+O Apri file\n" #: src/help.c:218 #, no-c-format msgid "Ctrl+S Save file\n" msgstr "Ctrl+S Salva file\n" #: src/help.c:219 #, no-c-format msgid "Ctrl+U Save selection as\n" msgstr "Ctrl+U Salva selezione come\n" #: src/help.c:221 #, no-c-format msgid "Ctrl+C Copy\n" msgstr "Ctrl+C Copia\n" #: src/help.c:222 #, no-c-format msgid "Ctrl+X Cut\n" msgstr "Ctrl+X Taglia\n" #: src/help.c:223 #, no-c-format msgid "Ctrl+D Delete\n" msgstr "Ctrl+D Cancella\n" #: src/help.c:224 #, no-c-format msgid "Delete Delete\n" msgstr "Canc Cancella\n" #: src/help.c:225 #, no-c-format msgid "Ctrl+V Paste\n" msgstr "Ctrl+V Incolla\n" #: src/help.c:226 #, no-c-format msgid "Ctrl+Z Undo\n" msgstr "Ctrl+Z Annulla\n" #: src/help.c:227 #, no-c-format msgid "Ctrl+A Select all\n" msgstr "Ctrl+A Selez tutto\n" #: src/help.c:229 #, no-c-format msgid "Ctrl+G Position cursor (Go to)\n" msgstr "Ctrl+G Porta cursore a (vai a)\n" #: src/help.c:230 #, no-c-format msgid "Ctrl+H Position cursor at file start\n" msgstr "Ctrl+H Porta cursore a inizio file\n" #: src/help.c:231 #, no-c-format msgid "Ctrl+J Position cursor at file end\n" msgstr "Ctrl+J Porta cursore a fine file\n" #: src/help.c:232 #, no-c-format msgid "Ctrl+K Position cursor at selection start\n" msgstr "Ctrl+K Porta cursore a inizio selezione\n" #: src/help.c:233 #, no-c-format msgid "Ctrl+L Position cursor at selection end\n" msgstr "Ctrl+L Porta cursore a fine selezione\n" #: src/help.c:234 #, no-c-format msgid "Y,U Move cursor to nearest all-channel zero-crossing\n" msgstr "Y,U Sposta cursore al più vicino zero (tutti i canali)\n" #: src/help.c:235 #, no-c-format msgid "I,O Move cursor to nearest any-channel zero-crossing\n" msgstr "I,O Sposta cursore al più vicino zero (qualsiasi canale)\n" #: src/help.c:237 #, no-c-format msgid "Ctrl+Q Selection start at cursor\n" msgstr "Ctrl+Q Inizia selezione al cursore\n" #: src/help.c:238 #, no-c-format msgid "Ctrl+W Selection end at cursor\n" msgstr "Ctrl+W Termina selezione al cursore\n" #: src/help.c:240 #, no-c-format msgid "+,= Zoom in\n" msgstr "+,= Zoom in\n" #: src/help.c:241 #, no-c-format msgid "- Zoom out\n" msgstr "- Zoom out\n" #: src/help.c:242 #, no-c-format msgid "> Zoom to selection\n" msgstr "> Zoom a selezione\n" #: src/help.c:243 #, no-c-format msgid "< Zoom all\n" msgstr "< Zoom tutto\n" #: src/help.c:244 #, no-c-format msgid "Arrow keys Scroll left/right\n" msgstr "Frecce Scorri sinistra/destra\n" #: src/help.c:246 #, no-c-format msgid "Home Move view to file start\n" msgstr "Home Sposta vista a inizio file\n" #: src/help.c:247 #, no-c-format msgid "End Move view to file end\n" msgstr "Fine Sposta la vista a fine file\n" #: src/help.c:248 #, no-c-format msgid "Tab Move view to cursor\n" msgstr "Tab Sposta la vista al cursore\n" #: src/help.c:249 #, no-c-format msgid "Ctrl+Tab Move cursor to center of view\n" msgstr "Ctrl+Tab Sposta il cursore a centro vista\n" #: src/help.c:251 #, no-c-format msgid "Space Play/Stop\n" msgstr "Spazio Suona/Ferma\n" #: src/help.c:252 #, no-c-format msgid "Shift+Space Play all\n" msgstr "Maiusc+Spazio Suona tutto\n" #: src/help.c:253 #, no-c-format msgid ", Play from cursor pos\n" msgstr ", Suona dal cursore\n" #: src/help.c:254 #, no-c-format msgid ". Stop\n" msgstr ". Stop\n" #: src/help.c:255 #, no-c-format msgid "/ Play selection\n" msgstr "/ Suona selezione\n" #: src/help.c:256 #, no-c-format msgid "H,J Move cursor (and playback) 1/8 of view\n" msgstr "H,J Sposta cursore (e suona) 1/8 del visibile\n" #: src/help.c:257 #, no-c-format msgid "K,L Move cursor one sample\n" msgstr "K,L Sposta cursore di un campione\n" #: src/help.c:258 #, no-c-format msgid "Ctrl+arrow Move cursor (and playback) half second\n" msgstr "Ctrl+frecce Sposta cursore (e suona) mezzo secondo\n" #: src/help.c:259 #, no-c-format msgid "( Play first 3 seconds of selection\n" msgstr "( Suona primi 3 secondi della selezione\n" #: src/help.c:260 #, no-c-format msgid ") Play last 3 seconds of selection\n" msgstr ") Suona ultimi 3 secondi della selezione\n" #: src/help.c:265 #, no-c-format msgid "" "If you find a bug or flaw in the program that's not mentioned in the BUGS " "file, report the bug in the bug tracker (see contact info) or mail a bug " "report describing the bug to: magnus.hjorth@home.se\n" msgstr "" "Se si trova un difetto o un problema non menzionato nel file BUGS, " "segnalarlo nel bug tracker (Vedi info contatti) o spedire un messaggio che " "descriva il difetto a: magnus.hjorth@home.se\n" #: src/help.c:267 #, no-c-format msgid "" "In case of a crash, please do not send me any core dumps. They are huge and " "completely useless to me. Instead, create a backtrace. Backtraces tell you " "exactly where the program crashed.\n" msgstr "" "In caso di blocco, non spedire nessun core dump. Sono enormi e del tutto " "inutili per me. Creare invece un backtrace: i backtrace dicono esattamente " "dove il programma si è bloccato.\n" #: src/help.c:269 #, no-c-format msgid "How to create a backtrace:\n" msgstr "Come creare un backtrace:\n" #: src/help.c:270 #, no-c-format msgid "1. Enable core dumps: ulimit -c unlimited\n" msgstr "1) abilitare i core dumps: ulimit -c unlimited\n" #: src/help.c:271 #, no-c-format msgid "2. Run the program: mhwaveedit\n" msgstr "2) avviare il programma: mhwaveedit\n" #: src/help.c:272 #, no-c-format msgid "" "3. Make the program crash. You should now get a file named core or core.1234 " "in the directory you're in.\n" msgstr "" "3) far bloccare il programma. Dovrebbe apparire un file chiamato core oppure " "core.1234 nella cartella corrente.\n" #: src/help.c:273 #, no-c-format msgid "4. Run gdb with the program and core file: \n" msgstr "4) eseguire gdb con il programma e il file core:\n" #: src/help.c:274 #, no-c-format msgid " gdb /usr/local/bin/mhwaveedit core | tee backtrace.txt\n" msgstr "gdb /usr/local/bin/mhwaveedit core | tee backtrace.txt\n" #: src/help.c:275 #, no-c-format msgid "5. After gdb has loaded, use the command: bt\n" msgstr "5) dopo che gdb si è avviato, usare il comando: bt\n" #: src/help.c:276 #, no-c-format msgid "6. Quit gdb with the command: quit\n" msgstr "6) uscire da gdb con il comando quit\n" #: src/help.c:277 #, no-c-format msgid "7. Now you should have a back trace in the file backtrace.txt\n" msgstr "7) ora il backtrace è stato scritto nel file backtrace.txt\n" #: src/help.c:282 #, no-c-format msgid "" "There are plenty of things you can do if you want to help the development of " "mhWaveEdit. \n" msgstr "Chi vuole aiutare lo sviluppo di mhWaveEdit può fare tante cose.\n" #: src/help.c:284 #, no-c-format msgid "" "First of all, look for bugs and report all bugs you find into the bug " "tracker or through e-mail. Sometimes a bug can get overlooked for a long " "time because nobody reports it, so don't be afraid to report bugs that have " "been there for a few releases. You don't have to provide fixes or very " "detailed information, although it helps of course.\n" msgstr "" "Per prima cosa, cercare errori e riportarli nel bugtracker o per posta " "elettronica. A volte un errore può rimanere trascurato per molto tempo " "perché nessuno lo segnala, dunque non esitate a riportare errori che sono lì " "da qualche tempo. Non è necessario suggerire correzioni o informazioni molto " "dettagliate, anche se ovviamente ciò aiuta.\n" #: src/help.c:286 #, no-c-format msgid "" "Feature requests are also welcome, report them to the mailing list or to the " "bug tracker.\n" msgstr "" "Anche le richieste di nuove funzioni sono gradite, inviatele alla mailing " "list o al bug tracker.\n" #: src/help.c:288 #, no-c-format msgid "" "If you speak a language other than English and mhWaveEdit isn't translated " "to your language, you can contribute a translation. To do that, copy the " "template mhwaveedit.pot in the po directory into a new file ll.po, where ll " "is your language code (see http://www.gnu.org/software/gettext/manual/" "html_node/gettext_221.html for a list of language codes). \n" msgstr "" "Se parlate una lingua diversa dall'inglese e mhWaveEdit non è tradotto nella " "vostra lingua, potete contribuire con una traduzione. Per farlo, copiate il " "modello nella cartella po con il nome ll.po, dove ll è il " "codice della vostra lingua (vedi http://www.gnu.org/software/gettext/manual/" "html_node/gettext_221.html per una lista dei codici).\n" #: src/help.c:290 #, no-c-format msgid "" "It's possible to edit po-files by hand, but I recommend a program such as " "poEdit (http://www.poedit.org) for editing translations. \n" msgstr "" "E' possibile modificare il file po a mano, ma raccomandiamo di usare un " "programma come poEdit (http://www.poedit.org).\n" #: src/help.c:292 #, no-c-format msgid "" "Note that for those translatable strings that look like \"RecordStatus|Paused" "\", you should ignore what's to the left and only translate the string to " "the right (\"Paused\" in this example). This convention is there to make it " "possible to translate the same string to different things depending on " "context. \n" msgstr "" "Da notare che le stringhe simili a \"RecordStatus|Paused\" devono essere " "tradotte soltanto nella parte alla destra della barra (\"Paused\" in questo " "esempio). Questa convenzione serve per rendere possibile l'uso della " "traduzione in modi diversi in diversi contesti.\n" #: src/help.c:294 #, no-c-format msgid "" "After you've filled in all the translations you want (you don't have to " "translate all the strings), mail in the po file to me (see contact info) and " "I'll add it to the next release. \n" msgstr "" "Quando la traduzione è completa (ma non è necessario tradurre tutte le " "frasi) si può spedire il file po a me (vedi info contatto) e verrà aggiunta " "alla prossima versione.\n" #: src/help.c:296 #, no-c-format msgid "" "If a translation is incomplete, you're very welcome to translate the " "remaining untranslated messages and mail them in. Corrections to " "translations are also appreciated, but they may need to be checked with the " "previous translator before including them. \n" msgstr "" "Se la traduzione è incompleta, potete tradurre le frasi restanti e spedirle. " "Anche le correzioni alla traduzione sono ammesse, ma è possibile che si " "debba procedere ad un confronto con il precedente traduttore prima di " "inserirle.\n" #: src/help.c:302 #, no-c-format msgid "For bug reports, translation updates, patches and PayPal donations:\n" msgstr "" "Per segnalazione di errori, traduzioni, aggiornamenti e donazioni PayPal\n" #: src/help.c:303 #, no-c-format msgid "magnus.hjorth@home.se\n" msgstr "magnus.hjorth@home.se\n" #: src/help.c:305 #, no-c-format msgid "Project page with bug tracker, mailing list membership:\n" msgstr "Pagina del progetto con bug tracker, mailing list e iscrizione:\n" #: src/help.c:306 #, no-c-format msgid "http://gna.org/projects/mhwaveedit\n" msgstr "http://gna.org/projects/mhwaveedit\n" #: src/help.c:308 #, no-c-format msgid "Mailing list (you must be a subscriber before you can post messages):\n" msgstr "Mailing list (bisogna iscriversi prima di inviare messaggi):\n" #: src/help.c:309 #, no-c-format msgid "mhwaveedit-discuss@gna.org\n" msgstr "mhwaveedit-discuss@gna.org\n" #: src/inifile.c:84 src/inifile.c:91 #, c-format msgid "%s: Expected '=': %s\n" msgstr "%s: Atteso '=': %s\n" #: src/inifile.c:97 #, c-format msgid "%s: Expected value: %s\n" msgstr "%s: valore atteso: %s\n" #: src/int_box.c:202 #, c-format msgid "Value for %s must be a number between %ld and %ld" msgstr "Il valore di %s deve essere un numero tra %ld e %ld" #: src/ladspacore.c:94 #, c-format msgid "Effect %s contains invalid port %s" msgstr "L'effetto %s usa la porta non valida %s" #: src/ladspacore.c:140 #, c-format msgid "Ladspa: Error scanning %s" msgstr "LADSPA: errore di scansione %s" #: src/ladspacore.c:409 #, c-format msgid "Applying effect '%s'" msgstr "Applicazione effetto '%s'" #: src/ladspadialog.c:87 #, c-format msgid "Value for '%s' must not be below %f" msgstr "Il valore di '%s' non deve essere minore di %f" #: src/ladspadialog.c:94 #, c-format msgid "Value for '%s' must not be above %f" msgstr "Il valore di '%s' non deve essere maggiore di %f" #: src/ladspadialog.c:127 #, c-format msgid "" "You have mapped more than one output port to channel '%s'. You can only map " "one output port to each channel." msgstr "" "Più di un canale è mappato in uscita al canale '%s'. Si può collegare una " "sola porta ad ogni canale." #: src/ladspadialog.c:191 #, c-format msgid "Author: %s" msgstr "Autore: %s" #: src/ladspadialog.c:196 #, c-format msgid "Copyright: %s" msgstr "Copyright: %s" #: src/ladspadialog.c:203 msgid " Input controls " msgstr " controlli IN" #: src/ladspadialog.c:292 msgid " Output controls " msgstr " controlli OUT" #: src/ladspadialog.c:311 src/recorddialog.c:311 src/recorddialog.c:739 msgid "None" msgstr "Nessuno/a" #: src/ladspadialog.c:319 msgid " Input audio " msgstr " audio IN" #: src/ladspadialog.c:319 msgid " Output audio " msgstr " audio OUT" #: src/ladspadialog.c:350 msgid "Keep data in unmapped output channels" msgstr "Mantenere i dati nei canali OUT non mappati" #: src/main.c:166 #, c-format msgid "Syntax: %s [files]\n" msgstr "Sintassi: %s [file]\n" #: src/main.c:169 msgid "Testing conversion functions:" msgstr "Prova delle funzioni di conversione:" #: src/main.c:171 msgid "Testing conversion functions finished." msgstr "Prova delle funzioni terminata." #: src/main.c:190 msgid "Expected driver name after --driver option" msgstr "E' necessario un nome di driver dopo l'opzione --driver" #: src/main.c:196 #, c-format msgid "Unknown option '%s'" msgstr "Opzione sconosciuta '%s'" #: src/main.c:340 msgid "" "Could not find home directory. Using current directory as home directory." msgstr "Non trovo la cartella home. Uso la cartella corrente come home." #: src/main.c:368 msgid "Black" msgstr "Nero" #: src/main.c:369 msgid "White" msgstr "Bianco" #: src/main.c:370 msgid "Background" msgstr "Sfondo" #: src/main.c:371 msgid "L Waveform" msgstr "Forma d'onda Sx" #: src/main.c:372 msgid "R Waveform" msgstr "Forma d'onda Dx" #: src/main.c:373 msgid "Cursor" msgstr "Cursore" #: src/main.c:374 msgid "Marks" msgstr "Segni" #: src/main.c:375 msgid "Selection" msgstr "Selezione" #: src/main.c:376 msgid "Progress bar" msgstr "Barra progresso" #: src/main.c:377 msgid "Zero-level" msgstr "Livello zero" #: src/main.c:378 msgid "Buffer position" msgstr "Posizione buffer" #: src/main.c:501 #, c-format msgid "Error launching mixer: fork: %s" msgstr "Errore lancio mixer: fork %s" #: src/main.c:552 src/main.c:571 msgid "Mono" msgstr "Mono" #: src/main.c:553 msgid "Left" msgstr "Sinistro" #: src/main.c:554 msgid "Right" msgstr "Destro" #: src/main.c:556 #, c-format msgid "Ch%d" msgstr "Can.%d" #: src/main.c:572 msgid "Stereo" msgstr "Stereo" #: src/main.c:574 #, c-format msgid "%d channels" msgstr "%d canali" #: src/main.c:1149 msgid "Ignoring extreme old window size/position values\n" msgstr "Ignoro vecchissime impostazioni di posizione/dimensione finestra\n" #: src/mainwindow.c:217 #, c-format msgid "mhWaveEdit: %s (%s): %d Hz, %s" msgstr "mhWaveEdit: %s (%s): %d Hz, %s" #: src/mainwindow.c:300 msgid "Use default settings" msgstr "Usa impostazioni predefinite" #: src/mainwindow.c:304 msgid "Auto-detect from extension" msgstr "Deduci dall'estensione" #: src/mainwindow.c:319 msgid "File type: " msgstr "Tipo file: " #: src/mainwindow.c:365 msgid "" "The file has not changed since last save. Press OK if you want to save it " "anyway?" msgstr "" "Il file non è stato cambiato dall'ultimo salvataggio. Premer OK per salvare " "lo stesso." #: src/mainwindow.c:374 msgid "Save File" msgstr "Salva file" #: src/mainwindow.c:399 #, c-format msgid "Save changes to %s?" msgstr "Salvare cambiamenti a %s?" #: src/mainwindow.c:792 src/mainwindow.c:796 msgid "Load File" msgstr "Carica file" #: src/mainwindow.c:821 msgid "Save selection as ..." msgstr "Salva selezione come..." #: src/mainwindow.c:1116 #, c-format msgid "Chunk %p has opencount=%d\n" msgstr "Chunk %p has opencount=%d\n" #: src/mainwindow.c:1199 #, c-format msgid "" "\n" "Window '%s'\n" msgstr "" "\n" "Finestra '%s'\n" #: src/mainwindow.c:1200 msgid " Current chunk:" msgstr " Chunk attuale:" #: src/mainwindow.c:1202 msgid " History:" msgstr " Storico:" #: src/mainwindow.c:1257 msgid "There already is only one channel!" msgstr "C'è già rimasto solo un canale!" #: src/mainwindow.c:1366 msgid "mhWaveEdit Help" msgstr "Aiuto di mhWaveEdit" #: src/mainwindow.c:1465 msgid "About mhWaveEdit" msgstr "Informazioni su mhWaveEdit" #: src/mainwindow.c:1477 #, fuzzy msgid "" "Created by Magnus Hjorth (magnus.hjorth@home.se)\n" "Copyright 2002-2018, Magnus Hjorth" msgstr "" "Creato da Magnus Hjorth (magnus.hjorth@home.se)\n" "Copyright 2002-2012, Magnus Hjorth" #: src/mainwindow.c:1484 #, c-format msgid "Current sound driver: %s" msgstr "Driver audio attuale: %s" #: src/mainwindow.c:1492 #, c-format msgid "Compiled %s %s" msgstr "Compilato %s %s" #: src/mainwindow.c:1498 msgid "Uses double-precision math" msgstr "Usa matematica a doppia precisione" #: src/mainwindow.c:1505 msgid "" "Distributed under GNU General Public License.\n" "For information, see the file COPYING" msgstr "" "Distribuito sotto la GNU General Public License.\n" "Per informazioni, vedi il file COPYING" #: src/mainwindow.c:1669 msgid "Seconds of silence: " msgstr "Secondi di silenzio: " #: src/mainwindow.c:1669 msgid "Insert Silence" msgstr "Inserisci silenzio" #: src/mainwindow.c:1718 msgid "Level: " msgstr "Livello: " #: src/mainwindow.c:1718 msgid "Normalize to..." msgstr "Normalizza a..." #: src/mainwindow.c:1928 msgid "/_File" msgstr "/_File" #: src/mainwindow.c:1929 msgid "/File/_Open..." msgstr "/File/_Apri..." #: src/mainwindow.c:1930 msgid "/File/_Save" msgstr "/File/_Salva" #: src/mainwindow.c:1931 msgid "/File/Save _as..." msgstr "/File/Sal_va come..." #: src/mainwindow.c:1932 msgid "/File/Save selection as..." msgstr "/File/Salva selezione come..." #: src/mainwindow.c:1933 msgid "/_Edit" msgstr "/_Modifica" #: src/mainwindow.c:1934 msgid "/Edit/_Undo" msgstr "/Modifica/_Annulla" #: src/mainwindow.c:1935 msgid "/Edit/_Redo" msgstr "/Modifica/_Rifai" #: src/mainwindow.c:1936 msgid "/Edit/sep1" msgstr "/Modifica/sep1" #: src/mainwindow.c:1937 msgid "/Edit/Cu_t" msgstr "/Modifica/_Taglia" #: src/mainwindow.c:1938 msgid "/Edit/_Copy" msgstr "/Modifica/_Copia" #: src/mainwindow.c:1939 msgid "/Edit/_Paste" msgstr "/Modifica/_Incolla" #: src/mainwindow.c:1940 msgid "/Edit/Paste _over" msgstr "/Modifica/Incolla _sopra" #: src/mainwindow.c:1941 msgid "/Edit/_Mix paste" msgstr "/Modifica/Incolla _mix" #: src/mainwindow.c:1942 msgid "/Edit/Insert _silence" msgstr "/Modifica/Inserisci _silenzio" #: src/mainwindow.c:1943 msgid "/Edit/Paste to _new" msgstr "/Modifica/Incolla _nuovo" #: src/mainwindow.c:1944 msgid "/Edit/Cr_op" msgstr "/Modifica/Ritaglia" #: src/mainwindow.c:1945 msgid "/Edit/_Delete" msgstr "/Modifica/Cancella" #: src/mainwindow.c:1946 msgid "/Edit/Silence selection" msgstr "/Modifica/Seleziona silenzio" #: src/mainwindow.c:1947 msgid "/Edit/sep2" msgstr "/Modifica/sep2" #: src/mainwindow.c:1948 msgid "/Edit/Select _all" msgstr "/Modifica/Seleziona tutto" #: src/mainwindow.c:1949 msgid "/Edit/Select none" msgstr "/Modifica/Seleziona niente" #: src/mainwindow.c:1950 msgid "/Edit/sep3" msgstr "/Modifica/sep3" #: src/mainwindow.c:1951 msgid "/Edit/Clear clipboard" msgstr "/Modifica/Svuota clipboard" #: src/mainwindow.c:1952 msgid "/Edit/sep4" msgstr "/Modifica/sep4" #: src/mainwindow.c:1953 msgid "/Edit/Preferences" msgstr "/Modifica/Preferenze" #: src/mainwindow.c:1954 msgid "/_View" msgstr "/_Vista" #: src/mainwindow.c:1955 msgid "/View/Zoom _in" msgstr "/Vista/_Ingrandisci" #: src/mainwindow.c:1956 msgid "/View/Zoom _out" msgstr "/Vista/_Rimpicci_olisci" #: src/mainwindow.c:1957 msgid "/View/Zoom to _selection" msgstr "/Vista/Ingrandisci a _selezione" #: src/mainwindow.c:1958 msgid "/View/sep1" msgstr "/Vista/sep1" #: src/mainwindow.c:1959 msgid "/View/Zoom _all" msgstr "/Vista/Ingrandisci a _tutto il file" #: src/mainwindow.c:1960 msgid "/View/sep2" msgstr "/Vista/sep2" #: src/mainwindow.c:1961 msgid "/View/_Time scale" msgstr "/Vista/Scala _tempo" #: src/mainwindow.c:1962 msgid "/View/_Horizontal zoom" msgstr "/Vista/Ingrandisci ori_zzontale" #: src/mainwindow.c:1963 msgid "/View/_Vertical zoom" msgstr "/Vista/Ingrandisci _verticale" #: src/mainwindow.c:1964 msgid "/View/Sp_eed slider" msgstr "/Vista/_Cursore velocità" #: src/mainwindow.c:1965 msgid "/View/Slider labels" msgstr "/Vista/Etichette cursore" #: src/mainwindow.c:1966 msgid "/View/Buffer position" msgstr "/Vista/Posizione buffer" #: src/mainwindow.c:1967 msgid "/_Cursor" msgstr "/_Cursore" #: src/mainwindow.c:1968 msgid "/Cursor/Set selection start" msgstr "/Cursore/Inizio selezione qui" #: src/mainwindow.c:1970 msgid "/Cursor/Set selection end" msgstr "/Cursore/Fine selezione qui" #: src/mainwindow.c:1971 msgid "/Cursor/sep1" msgstr "/Cursore/sep1" #: src/mainwindow.c:1972 msgid "/Cursor/Move to" msgstr "/Cursore/Vai a" #: src/mainwindow.c:1973 msgid "/Cursor/Move to/Beginning" msgstr "/Cursore/Vai a/Inizio" #: src/mainwindow.c:1975 msgid "/Cursor/Move to/End" msgstr "/Cursore/Vai a/Fine" #: src/mainwindow.c:1976 msgid "/Cursor/Move to/Selection start" msgstr "/Cursore/Vai a /Inizio selezione" #: src/mainwindow.c:1978 msgid "/Cursor/Move to/Selection end" msgstr "/Cursore/Vai a/Fine selezione" #: src/mainwindow.c:1980 msgid "/Cursor/Move" msgstr "/Cursore/Sposta" #: src/mainwindow.c:1981 msgid "/Cursor/Move/Left" msgstr "/Cursore/Sposta/Sinistra" #: src/mainwindow.c:1982 msgid "/Cursor/Move/Right" msgstr "/Cursore/Sposta/Destra" #: src/mainwindow.c:1983 msgid "/Cursor/Move/Left sample" msgstr "/Cursore/Sposta/Campione sinistro" #: src/mainwindow.c:1984 msgid "/Cursor/Move/Right sample" msgstr "Cursore/Sposta/Campione destro" #: src/mainwindow.c:1985 msgid "/Cursor/Find zero-crossing" msgstr "/Cursore/Trova punto zero" #: src/mainwindow.c:1986 msgid "/Cursor/Find zero-crossing/Left (all channels)" msgstr "/Cursore/Trova punto zero/Sinistra (tutti i canali)" #: src/mainwindow.c:1988 msgid "/Cursor/Find zero-crossing/Right (all channels)" msgstr "/Cursore/Trova punto zero/Destra (tutti i canali)" #: src/mainwindow.c:1990 msgid "/Cursor/Find zero-crossing/Left (any channel)" msgstr "/Cursore/Trova punto zero/Sinistra (qualsiasi canale)" #: src/mainwindow.c:1992 msgid "/Cursor/Find zero-crossing/Right (any channel)" msgstr "/Cursore/Trova punto zero/Destra (qualsiasi canale)" #: src/mainwindow.c:1994 msgid "/Cursor/sep2" msgstr "/Cursore/sep2" #: src/mainwindow.c:1995 msgid "/Cursor/Position cursor..." msgstr "/Cursore/Posiziona cursore..." #: src/mainwindow.c:1997 msgid "/_Play" msgstr "/_Suona" #: src/mainwindow.c:1998 msgid "/Play/_Play from cursor" msgstr "/Suona/_Dal cursore" #: src/mainwindow.c:1999 msgid "/Play/Play _all" msgstr "/Suona/_Tutto" #: src/mainwindow.c:2000 msgid "/Play/Play se_lection" msgstr "/Suona/Se_lezione" #: src/mainwindow.c:2001 msgid "/Play/_Stop" msgstr "/Suona/_Ferma" #: src/mainwindow.c:2002 msgid "/Play/sep1" msgstr "/Suona/sep1" #: src/mainwindow.c:2003 msgid "/Play/_Record..." msgstr "/Suona/_Registra..." #: src/mainwindow.c:2004 msgid "/Effec_ts" msgstr "/_Effetti" #: src/mainwindow.c:2005 msgid "/Effects/Fade _in" msgstr "/Effetti/Fade _in" #: src/mainwindow.c:2006 msgid "/Effects/Fade o_ut" msgstr "/Effetti/Fade o_ut" #: src/mainwindow.c:2007 msgid "/Effects/_Normalize" msgstr "/Effetti/_Normalizza" #: src/mainwindow.c:2008 msgid "/Effects/Normali_ze to..." msgstr "/Effetti/Normali_zza a..." #: src/mainwindow.c:2009 msgid "/Effects/_Volume adjust (fade)..." msgstr "/Effetti/Regola _volume (fade)..." #: src/mainwindow.c:2010 msgid "/Effects/sep1" msgstr "/Effetti/sep1" #: src/mainwindow.c:2011 msgid "/Effects/Convert sample_rate..." msgstr "/Effetti/Conve_rti tasso campione..." #: src/mainwindow.c:2012 msgid "/Effects/Convert sample _format..." msgstr "/Effetti/Converti _formato campione..." #: src/mainwindow.c:2014 msgid "/Effects/B_yte swap" msgstr "/Effetti/Scambia b_yte" #: src/mainwindow.c:2015 msgid "/Effects/sep2" msgstr "/Effetti/sep2" #: src/mainwindow.c:2016 msgid "/Effects/_Mix to mono" msgstr "/Effetti/_Mix a mono" #: src/mainwindow.c:2017 msgid "/Effects/Add channe_l" msgstr "/Effetti/Aggiungi cana_le" #: src/mainwindow.c:2018 msgid "/Effects/Ma_p channels..." msgstr "/Effetti/Ma_ppa canali..." #: src/mainwindow.c:2019 msgid "/Effects/_Combine channels..." msgstr "/Effetti/_Combina canali..." #: src/mainwindow.c:2020 msgid "/Effects/Add channels from other file..." msgstr "/Effetti/Aggiungi canale da altro file..." #: src/mainwindow.c:2021 msgid "/Effects/sep3" msgstr "/Effetti/sep3" #: src/mainwindow.c:2022 msgid "/Effects/_Speed adjustment..." msgstr "/Effetti/Regola velocità..." #: src/mainwindow.c:2023 msgid "/Effects/Pipe through program..." msgstr "/Effetti/Invia a programma..." #: src/mainwindow.c:2024 msgid "/Effects/sep4" msgstr "/Effetti/sep4" #: src/mainwindow.c:2025 msgid "/Effects/Effects dialog..." msgstr "/Effetti/Finestra effetti..." #: src/mainwindow.c:2027 msgid "/Debug" msgstr "/Debug" #: src/mainwindow.c:2029 msgid "/Debug/Dummy effect" msgstr "/Debug/Dummy effect" #: src/mainwindow.c:2030 msgid "/Debug/Dummy effect FP" msgstr "/Debug/Dummy effect FP" #: src/mainwindow.c:2031 msgid "/Debug/Check opencount" msgstr "/Debug/Check opencount" #: src/mainwindow.c:2032 msgid "/Debug/Dump chunk info" msgstr "/Debug/Dump chunk info" #: src/mainwindow.c:2034 msgid "/_Help" msgstr "/_Aiuto" #: src/mainwindow.c:2035 msgid "/Help/_Documentation" msgstr "/Aiuto/_Documentazione" #: src/mainwindow.c:2036 msgid "/Help/_About" msgstr "/Aiuto/_Informazioni" #: src/mainwindow.c:2040 msgid "/File/sep1" msgstr "/File/sep1" #: src/mainwindow.c:2041 msgid "/File/_Close" msgstr "/File/_Chiudi" #: src/mainwindow.c:2042 msgid "/File/sep2" msgstr "/File/sep2" #: src/mainwindow.c:2043 msgid "/File/_Exit" msgstr "/File/_Esci" #: src/mainwindow.c:2215 msgid "Load a file from disk" msgstr "Carica un file da disco" #: src/mainwindow.c:2222 msgid "Save the current file to disk" msgstr "Salva il file su disco" #: src/mainwindow.c:2231 msgid "Undo the last change" msgstr "Annulla l'ultimo cambiamento" #: src/mainwindow.c:2239 msgid "Redo the last undo operation" msgstr "Rifai l'ultima operazione" #: src/mainwindow.c:2249 msgid "Cut out the current selection" msgstr "Taglia la selezione" #: src/mainwindow.c:2257 msgid "Copy the current selection" msgstr "Copia la selezione" #: src/mainwindow.c:2265 msgid "Paste at cursor position" msgstr "Incolla alla posizione del cursore" #: src/mainwindow.c:2273 msgid "Paste, overwriting the data after the cursor position" msgstr "Incolla, coprendo i dati dopo la posizione attuale" #: src/mainwindow.c:2283 msgid "Delete the selection" msgstr "Cancella la selezione" #: src/mainwindow.c:2292 msgid "Set selection start to cursor position" msgstr "Imposta l'inizio della selezione al cursore" #: src/mainwindow.c:2301 msgid "Set selection end to cursor position" msgstr "Imposta la fine selezione al cursore" #: src/mainwindow.c:2311 msgid "Play from cursor position" msgstr "Suona dal cursore" #: src/mainwindow.c:2320 msgid "Play selected area" msgstr "Suona l'area selezionata" #: src/mainwindow.c:2329 msgid "Stop playing" msgstr "Ferma il suono" #: src/mainwindow.c:2339 msgid "Loop mode (play over and over)" msgstr "Modo ciclico (suona sempre da capo)" #: src/mainwindow.c:2349 msgid "Keep view and playback together" msgstr "Mantieni vista ed esecuzione allineate" #: src/mainwindow.c:2362 msgid "Auto return to playback start" msgstr "Torna all'inizio" #: src/mainwindow.c:2376 src/recorddialog.c:874 msgid "Record" msgstr "Registra" #: src/mainwindow.c:2385 src/recorddialog.c:983 msgid "Launch mixer" msgstr "Apri mixer" #: src/pipedialog.c:92 msgid "Command line: " msgstr "Linea di comando: " #: src/pipedialog.c:99 msgid "Send wav header" msgstr "Invia header WAV" #: src/pipedialog.c:153 msgid "Process output" msgstr "Elabora uscita" #: src/pipedialog.c:178 #, c-format msgid "" "Output from command '%s':\n" "\n" msgstr "" "Risposta del comando '%s':\n" "\n" #: src/pipedialog.c:201 #, c-format msgid "Could not create pipe: %s" msgstr "Impossibile creare pipe: %s" #: src/pipedialog.c:216 #, c-format msgid "Error: fork: %s" msgstr "Errore: fork: %s" #: src/pipedialog.c:268 msgid "Should not reach this point!" msgstr "Should not reach this point!" #: src/pipedialog.c:482 msgid "Command failed without returning any data" msgstr "Il comando ha fallito senza restituire nulla" #: src/pipedialog.c:492 #, c-format msgid "Error: %s" msgstr "Errore: %s" #: src/player.c:294 msgid "The sound format of this file is not supported for playing." msgstr "Il formato sonoro di questo file non è supportato per l'esecuzione." #: src/rateconv.c:97 #, c-format msgid "Error initialising sample rate conversion: %s" msgstr "Errore di avvio della conversione di tasso di campione: %s" #: src/rateconv.c:162 #, c-format msgid "Error converting samplerate: %s\n" msgstr "Errore di conversione tasso: %s\n" #: src/rateconv.c:201 #, c-format msgid "Error changing samplerate conversion ratio: %s\n" msgstr "Errore di cambiamento del rapporto di cambio di tasso: %s\n" #: src/rateconv.c:323 msgid "Unexpected EOF in connection to subprocess" msgstr "EOF inaspettato nella connessione al sottoprocesso" #: src/rateconv.c:327 #, c-format msgid "Error writing to subprocess: %s" msgstr "Errore di scrittura al sottoprocesso: %s" #: src/rateconv.c:383 src/rateconv.c:405 #, c-format msgid "Error reading from sub process: %s" msgstr "Errore di lettura dal sottoprocesso: %s" #: src/rateconv.c:413 msgid "SoX closed connection too early!" msgstr "SoX ha chiuso la connessione troppo presto!" #: src/rateconv.c:599 msgid "(SoX) Simulated analog filtration" msgstr "(SoX) filtro analogico simulato" #: src/rateconv.c:605 msgid "(SoX) Polyphase interpolation" msgstr "(SoX) interpolazione polifase" #: src/rateconv.c:612 msgid "Sample repeat/skip (low quality)" msgstr "Ripeti/salta campione (bassa qualità)" #: src/rawdialog.c:42 msgid "header size" msgstr "dimensione header" #: src/rawdialog.c:73 msgid "Unknown file format" msgstr "Formato file sconosciuto" #: src/rawdialog.c:80 #, c-format msgid "" "The format of file '%s' could not be recognized.\n" "\n" "Please specify the sample format below." msgstr "" "Il formato del file '%s' non è riconoscibile\n" "\n" "Specificare il formato dei campionamento qui sotto." #: src/rawdialog.c:92 msgid "Header bytes: " msgstr "Byte intestazione: " #: src/recorddialog.c:207 src/recorddialog.c:671 src/recorddialog.c:918 msgid "(no limit)" msgstr "(nessun limite)" #: src/recorddialog.c:314 msgid "Mild" msgstr "Lieve" #: src/recorddialog.c:316 msgid "Heavy" msgstr "Pesante" #: src/recorddialog.c:430 msgid "Update preset" msgstr "Aggiorna impostazione" #: src/recorddialog.c:435 msgid "Add preset" msgstr "Aggiungi impostazione" #: src/recorddialog.c:514 msgid "Custom format" msgstr "Altro formato" #: src/recorddialog.c:552 msgid "" "The sign and endian-ness can usually be left at their defaults, but should " "be changed if you're unable to record or get bad sound." msgstr "" "Il segno e l'endian-ness di solito possono rimanere come sono, ma dovrebbero " "essere cambiati se non si riesce a registrare o si ottiene un suono alterato." #: src/recorddialog.c:566 msgid "Name :" msgstr "Nome :" #: src/recorddialog.c:578 msgid "Presets:" msgstr "Impostazioni:" #: src/recorddialog.c:593 msgid "Set format" msgstr "Imposta formato" #: src/recorddialog.c:601 msgid "Add/Update preset" msgstr "Aggiungi/aggiorna impostazione" #: src/recorddialog.c:654 msgid "" "Invalid time value. Time must be specified in the form (HH')MM:SS(.mmmm)" msgstr "" "Valore di tempo non valido. Il tempo deve essere scritto come (OO')MM:" "SS( mmmm)" #: src/recorddialog.c:698 src/recorddialog.c:948 msgid "Format not selected" msgstr "Formato non selezionato" #: src/recorddialog.c:705 msgid "This format is not supported by the input driver!" msgstr "Questo formato non è supportato dal driver d'ingresso!" #: src/recorddialog.c:710 msgid "Ready for recording" msgstr "Pronto a registrare" #: src/recorddialog.c:723 msgid "Peak: " msgstr "Picco: " #: src/recorddialog.c:724 msgid "Peak max: " msgstr "Picco max: " #: src/recorddialog.c:725 msgid "RMS: " msgstr "RMS: " #: src/recorddialog.c:726 msgid "Clipping: " msgstr "Tosatura: " #: src/recorddialog.c:795 msgid "Resume recording" msgstr "Riprendi registrazione" #: src/recorddialog.c:795 src/recorddialog.c:815 msgid "Pause recording" msgstr "Pausa registrazione" #: src/recorddialog.c:797 msgid "RecordStatus|Paused" msgstr "In pausa" #: src/recorddialog.c:798 src/recorddialog.c:823 msgid "RecordStatus|Recording" msgstr "In corso" #: src/recorddialog.c:818 msgid "Finish" msgstr "Finisci" #: src/recorddialog.c:826 msgid "Overruns: " msgstr "Overruns: " #: src/recorddialog.c:829 msgid "Bytes written: " msgstr "Byte scritti: " #: src/recorddialog.c:830 msgid "Auto stop in: " msgstr "Auto stop tra: " #: src/recorddialog.c:894 msgid "Recording settings" msgstr "Impostazioni registrazione" #: src/recorddialog.c:901 msgid "Sample format: " msgstr "Formato campione: " #: src/recorddialog.c:916 msgid "Time limit: " msgstr "Limite di tempo: " #: src/recorddialog.c:924 msgid "Disable" msgstr "Disabilita" #: src/recorddialog.c:930 msgid "Set" msgstr "Imposta" #: src/recorddialog.c:942 msgid "Input levels" msgstr "Livelli d'ingresso" #: src/recorddialog.c:947 msgid "Recording status: " msgstr "Stato registrazione: " #: src/recorddialog.c:952 msgid "Time recorded: " msgstr "Tempo registrato: " #: src/recorddialog.c:953 msgid "N/A" msgstr "N/D" #: src/recorddialog.c:966 msgid "Start recording" msgstr "Avvia registrazione" #: src/recorddialog.c:977 msgid "Reset max peaks" msgstr "Azzera contatore picchi" #: src/sampleratedialog.c:87 msgid "" "(This changes the sample rate of \n" "the entire file, not just the selection)" msgstr "" "(Cambia il tasso di campionamento di\n" "tutto il file, non solo della selezione)" #: src/sampleratedialog.c:92 msgid "New samplerate: " msgstr "Nuovo tasso camp.: " #: src/sampleratedialog.c:99 msgid "Method: " msgstr "Metodo: " #: src/samplesizedialog.c:38 msgid "File already has the selected sample format" msgstr "Il file ha già il formato di campionamento scelto" #: src/samplesizedialog.c:87 msgid "" "(This changes the sample type of the entire file, not just the selection)" msgstr "" "(Cambia il tipo di campione di tutto il file, non solo della selezione)" #: src/samplesizedialog.c:99 msgid "Don't actually change the data (for repairing bad files etc)" msgstr "Non cambia davvero i dati (per riparare file corrotti ecc.)" #: src/sound-alsalib.c:73 msgid "ALSA Preferences" msgstr "Preferenze ALSA" #: src/sound-alsalib.c:81 msgid "Playback device: " msgstr "Dispositivo di esecuzione: " #: src/sound-alsalib.c:85 msgid "Recording device: " msgstr "Dispositivo di registrazione: " #: src/sound-alsalib.c:91 msgid "Event driven I/O" msgstr "I/O guidato da eventi" #: src/sound-alsalib.c:123 #, c-format msgid "Error opening ALSA device '%s' for recording: %s" msgstr "Errore di apertura dispositivo ALSA '%s' per registrare: %s" #: src/sound-alsalib.c:125 #, c-format msgid "Error opening ALSA device '%s' for playback: %s" msgstr "Errore apertura dispositivo ALSA '%s' per suonare: %s" #: src/sound-alsalib.c:273 msgid "snd_pcm_hw_params_set_access failed" msgstr "snd_pcm_hw_params_set_access failed" #: src/sound-alsalib.c:278 msgid "snd_pcm_hw_params_set_format failed" msgstr "snd_pcm_hw_params_set_format failed" #: src/sound-alsalib.c:283 msgid "snd_pcm_hw_params_set_channels failed" msgstr "snd_pcm_hw_params_set_channels failed" #: src/sound-alsalib.c:288 msgid "snd_pcm_hw_params_set_rate failed" msgstr "snd_pcm_hw_params_set_rate failed" #: src/sound-alsalib.c:293 msgid "snd_pcm_hw_params_set_buffer_size_last failed" msgstr "snd_pcm_hw_params_set_buffer_size_last failed" #: src/sound-alsalib.c:436 src/sound-alsalib.c:492 msgid "" msgstr "" #: src/sound-alsalib.c:536 msgid "" msgstr "" #: src/sound.c:167 msgid "SDL (output only)" msgstr "SDL (solo out)" #: src/sound.c:209 msgid "Dummy (no sound)" msgstr "Fittizio (nessun suono)" #: src/sound.c:334 #, c-format msgid "" "Invalid driver name: %s\n" "Using '%s' driver instead" msgstr "" "Nome driver non valido: %s\n" "Uso il driver '%s' al posto." #: src/sound-esound.c:59 #, c-format msgid "Couldn't connect to ESD daemon: %s" msgstr "Collegamento con demone ESD fallito: %s" #: src/sound-esound.c:114 msgid "EsounD: Unable to open playback stream" msgstr "EsounD: errore di apertura flusso in uscita" #: src/sound-esound.c:130 msgid "EsounD: Unable to open recording stream" msgstr "EsounD: errore di apertura flusso in ingresso" #: src/sound-esound.c:145 src/sound-esound.c:217 msgid "EsounD driver: select" msgstr "EsounD driver: scelta" #: src/sound-esound.c:157 msgid "EsounD driver: write" msgstr "Esound driver: scrittura" #: src/sound-esound.c:221 msgid "Esound connection closed by server" msgstr "Connessione EsounD chiusa dal server" #: src/sound-esound.c:227 msgid "EsounD driver: read" msgstr "Esound driver: lettura" #: src/sound-esound.c:241 msgid "jump delay" msgstr "ritardo salto" #: src/sound-esound.c:255 msgid "ESD preferences" msgstr "Preferenze ESD" #: src/sound-esound.c:263 msgid "" "If the cursor starts running too early when jumping, this delay should be " "increased." msgstr "" "Se il cursore inizia a scorrere troppo presto dopo un salto, aumentare " "questo ritardo" #: src/sound-esound.c:269 msgid "Jump delay:" msgstr "Ritardo salto:" #: src/sound-esound.c:278 msgid "" "Selecting the ESD host to connect to is done through the ESPEAKER " "environment variable." msgstr "" "La scelta del server ESD a cui connettersi è compiuta dalla variabile di " "ambiente ESPEAKER" #: src/sound-jack.c:117 msgid "Invalid number of input ports." msgstr "Numero non valido di porte IN." #: src/sound-jack.c:121 msgid "Invalid number of output ports." msgstr "Numero non valido di porte OUT." #: src/sound-jack.c:130 msgid "The client name change won't take effect until you restart the program." msgstr "Il nome cliente non cambierà fino al riavvio del programma." #: src/sound-jack.c:187 msgid " Input ports " msgstr "Porte ingresso" #: src/sound-jack.c:188 msgid " Output ports " msgstr "Porte uscita" #: src/sound-jack.c:197 msgid "Jack Preferences" msgstr "Preferenze JACK" #: src/sound-jack.c:206 msgid "Client name: " msgstr "Nome client: " #: src/sound-jack.c:223 msgid "Number of ports (0-8): " msgstr "Numero di porte (0-8): " #: src/sound-jack.c:231 #, c-format msgid "Port #%d" msgstr "Porta n. %d" #: src/sound-jack.c:244 msgid "Automatically connect input ports on startup" msgstr "Collega automaticamente le porte in ingresso all'avvio" #: src/sound-jack.c:250 msgid "Automatically connect output ports on startup" msgstr "Collega automaticamente le porte in uscita all'avvio" #: src/sound-jack.c:402 msgid "Over/underrun in JACK driver" msgstr "Over/underrun in JACK driver" #: src/sound-jack.c:417 msgid "jack_get_ports returned NULL" msgstr "jack_get_ports returned NULL" #: src/sound-jack.c:433 #, c-format msgid "Connection from %s to %s failed: %s" msgstr "Connessione da %s a %s fallita: %s" #: src/sound-jack.c:480 msgid "Could not connect to the JACK server." msgstr "Impossibile connettersi al server JACK" #: src/sound-jack.c:494 msgid "Activation failed!" msgstr "Attivazione fallita!" #: src/sound-jack.c:825 #, c-format msgid "" "With JACK, the only supported recording format is Floating-point, single " "precision, %d Hz" msgstr "" "Con JACK l'unico formato di registrazione possibile è Con virgola, Singola " "precisione, %d Hz" #: src/sound-oss.c:96 #, c-format msgid "Could not open '%s': %s" msgstr "Impossibile aprire '%s': %s" #: src/sound-oss.c:109 #, c-format msgid "Error in sound driver: ioctl failed: %s" msgstr "Error in sound driver: ioctl failed: %s" #: src/sound-oss.c:216 #, c-format msgid "Error in sound driver: write failed: %s" msgstr "Error in sound driver: write failed: %s" #: src/sound-oss.c:229 #, c-format msgid "Error in sound driver: read failed: %s" msgstr "Error in sound driver: read failed: %s" #: src/sound-oss.c:253 src/sound-oss.c:385 #, c-format msgid "Error in sound driver: select failed: %s" msgstr "Error in sound driver: select failed: %s" #: src/sound-oss.c:440 msgid "OSS preferences" msgstr "Preferenze OSS" #: src/sound-oss.c:450 msgid "Playback device file:" msgstr "Dispositivo di esecuzione:" #: src/sound-oss.c:459 msgid "Recording device file:" msgstr "Dispositivo di registrazione:" #: src/sound-oss.c:465 msgid "Avoid select calls (try this if recording locks up)" msgstr "Avoid select calls (try this if recording locks up)" #: src/sound-portaudio.c:61 msgid "sound-portaudio: No output devices available!" msgstr "sound-portaudio: nessun dispositivo di uscita disponibile!" #: src/sound-portaudio.c:63 msgid "sound-portaudio: No input devices available!" msgstr "sound-portaudio: nessun dispositivo di ingresso disponibile!" #: src/sound-portaudio.c:191 src/sound-portaudio.c:278 #, c-format msgid "Pa_OpenStream failed: %s\n" msgstr "Pa_OpenStream failed: %s\n" #: src/sound-portaudio.c:252 msgid "Buffer overrun!" msgstr "Buffer overrun!" #: src/sound-sdl.c:38 #, c-format msgid "Could not initialize SDL: %s" msgstr "Could not initialize SDL: %s" #: src/sound-sdl.c:89 #, c-format msgid "SDL: Couldn't open audio: %s" msgstr "SDL: Couldn't open audio: %s" #: src/sound-sun.c:72 #, c-format msgid "SunAudio: Couldn't open %s" msgstr "SunAudio: Couldn't open %s" #: src/sound-sun.c:159 msgid "SunAudio: Error writing to sound device" msgstr "SunAudio: Error writing to sound device" #: src/sound-sun.c:241 msgid "SunAudio: Error reading from sound device" msgstr "SunAudio: Error reading from sound device" #: src/soxdialog.c:54 msgid "Echo" msgstr "Eco" #: src/soxdialog.c:55 msgid "Echo sequence" msgstr "Sequenza eco" #: src/soxdialog.c:56 msgid "Reverb" msgstr "Riverbero" #: src/soxdialog.c:57 msgid "Chorus" msgstr "Coro" #: src/soxdialog.c:58 msgid "Flanger" msgstr "Flanger" #: src/soxdialog.c:59 msgid "Phaser" msgstr "Phaser" #: src/soxdialog.c:60 msgid "Compress/Expand" msgstr "Comprimi/Espandi" #: src/soxdialog.c:61 msgid "Pitch adjust" msgstr "Regola altezza" #: src/soxdialog.c:62 msgid "Time stretch" msgstr "Allunga tempo" #: src/soxdialog.c:63 msgid "DC Shift" msgstr "DC Shift" #: src/soxdialog.c:64 msgid "Masking noise" msgstr "Maschera rumore" #: src/soxdialog.c:65 msgid "Reverse" msgstr "Inverti" #: src/soxdialog.c:66 msgid "Earwax" msgstr "Earwax" #: src/soxdialog.c:67 msgid "Vibro" msgstr "Vibro" #: src/soxdialog.c:68 msgid "Lowpass filter (single-pole)" msgstr "Filtro passa basso (polo singolo)" #: src/soxdialog.c:69 msgid "Highpass filter (single-pole)" msgstr "Filtro passa alto (polo singolo)" #: src/soxdialog.c:70 msgid "Bandpass filter" msgstr "Filtro passa banda" #: src/soxdialog.c:71 msgid "Butterworth lowpass filter" msgstr "Filtro passa basso Butterworth" #: src/soxdialog.c:72 msgid "Butterworth highpass filter" msgstr "Filtro passa alto Butterworth" #: src/soxdialog.c:73 msgid "Butterworth bandpass filter" msgstr "Filtro passa banda Butterworth" #: src/soxdialog.c:74 msgid "Butterworth bandreject filter" msgstr "Filtro escludi banda Butterworth" #: src/soxdialog.c:75 msgid "Sinc-windowed filter" msgstr "Sinc-windowed filter" #: src/soxdialog.c:312 msgid "Frequency: " msgstr "Frequenza: " #: src/soxdialog.c:317 src/soxdialog.c:324 src/soxdialog.c:483 #: src/soxdialog.c:485 msgid "Hz" msgstr "Hz" #: src/soxdialog.c:327 msgid "Noise mode" msgstr "Noise mode" #: src/soxdialog.c:387 msgid "Reverb time: " msgstr "Tempo riverbero:" #: src/soxdialog.c:392 msgid "ms" msgstr "ms" #: src/soxdialog.c:397 msgid "Delay (ms) " msgstr "Ritardo (ms) " #: src/soxdialog.c:400 msgid "Decay " msgstr "Caduta.." #: src/soxdialog.c:404 msgid "Speed (Hz) " msgstr "Velocità (Hz) " #: src/soxdialog.c:408 msgid "Depth (ms) " msgstr "Profondità (ms) " #: src/soxdialog.c:412 msgid "Modulation " msgstr "Modulazione " #: src/soxdialog.c:415 msgid "Modulation|Sinusoidal" msgstr "Modulation|Sinusoidale" #: src/soxdialog.c:416 msgid "Modulation|Triangular" msgstr "Modulation|Triangolare" #: src/soxdialog.c:429 msgid "(Lines with delay=0 will be ignored.)" msgstr "(Le righe con ritardo=0 saranno ignorate)" #: src/soxdialog.c:448 src/soxdialog.c:450 src/soxdialog.c:454 #: src/soxdialog.c:456 src/soxdialog.c:458 msgid "Input gain: " msgstr "Guadagno IN: " #: src/soxdialog.c:452 msgid "Output gain: " msgstr "Guadagno OUT: " #: src/soxdialog.c:464 msgid "Width: " msgstr "Ampiezza: " #: src/soxdialog.c:470 src/soxdialog.c:472 msgid "Bandwidth: " msgstr "Larghezza banda: " #: src/soxdialog.c:481 msgid "Filter type: " msgstr "Tipo di filtro: " #: src/soxdialog.c:482 msgid "Low 6dB corner: " msgstr "Low 6dB corner: " #: src/soxdialog.c:484 msgid "High 6db corner: " msgstr "High 6db corner: " #: src/soxdialog.c:486 msgid "Window length: " msgstr "Lunghezza finestra: " #: src/soxdialog.c:488 msgid "Beta" msgstr "Beta" #: src/soxdialog.c:491 msgid "Lowpass" msgstr "Passa basso" #: src/soxdialog.c:492 msgid "Highpass" msgstr "Passa alto" #: src/soxdialog.c:493 msgid "Bandpass" msgstr "Passa banda" #: src/soxdialog.c:526 msgid "Attack integration time: " msgstr "Attack integration time: " #: src/soxdialog.c:530 src/soxdialog.c:535 src/soxdialog.c:565 msgid " seconds" msgstr " secondi" #: src/soxdialog.c:531 msgid "Decay integration time: " msgstr "Decay integration time: " #: src/soxdialog.c:538 msgid "Input level (dB)" msgstr "Livello IN (dB)" #: src/soxdialog.c:539 msgid "Output level (dB)" msgstr "Livello OUT (dB)" #: src/soxdialog.c:552 msgid "Post-processing gain: " msgstr "Guadagno post-processo: " #: src/soxdialog.c:556 msgid " dB" msgstr " dB" #: src/soxdialog.c:557 msgid "Initial volume: " msgstr "Volume iniziale: " #: src/soxdialog.c:561 msgid "Delay time: " msgstr "Tempo di ritardo: " #: src/soxdialog.c:570 msgid "Shift amount: " msgstr "Shift amount: " #: src/soxdialog.c:574 msgid "Peak limiter" msgstr "Limitatore di picco" #: src/soxdialog.c:578 msgid "Limiter gain: " msgstr "Guadagno del limitatore: " #: src/soxdialog.c:591 msgid "Amount: " msgstr "Quantità: " #: src/soxdialog.c:592 msgid " cents" msgstr " cents" #: src/soxdialog.c:593 msgid "Window width: " msgstr "Ampiezza finestra: " #: src/soxdialog.c:594 src/soxdialog.c:625 msgid " ms" msgstr " ms" #: src/soxdialog.c:595 msgid "Interpolation: " msgstr "Interpolazione: " #: src/soxdialog.c:596 msgid "Fade: " msgstr "Fade: " #: src/soxdialog.c:605 msgid "Interpolation|Cubic" msgstr "Interpolation|Cubica" #: src/soxdialog.c:606 msgid "Interpolation|Linear" msgstr "Interpolation|Lineare" #: src/soxdialog.c:612 msgid "Fade|Cos" msgstr "Fade|Cos" #: src/soxdialog.c:613 msgid "Fade|Hamming" msgstr "Fade|Hamming" #: src/soxdialog.c:614 msgid "Fade|Linear" msgstr "Fade|Lineare" #: src/soxdialog.c:615 msgid "Fade|Trapezoid" msgstr "Fade|Trapezoide" #: src/soxdialog.c:623 msgid "Factor: " msgstr "Fattore: " #: src/soxdialog.c:624 msgid "Window size: " msgstr "Dim. finestra: " #: src/soxdialog.c:636 msgid "Speed: " msgstr "Velocità: " #: src/soxdialog.c:637 msgid " Hz" msgstr " Hz" #: src/soxdialog.c:638 msgid "Depth: " msgstr "Profondità: " #: src/soxdialog.c:649 msgid "This effect has no options." msgstr "Questo effetto non ha opzioni." #: src/soxdialog.c:723 msgid "Error creating pipe" msgstr "Errore creazione pipe" #: src/soxdialog.c:730 msgid "Couldn't fork" msgstr "Fork impossibile" #: src/soxdialog.c:745 #, c-format msgid "Error running 'sox -h': %s\n" msgstr "Errore di esecuzione 'sox -h': %s\n" #: src/soxdialog.c:747 msgid "Should not reach this point" msgstr "Should not reach this point" #: src/soxdialog.c:762 msgid "Error reading sox output" msgstr "Errorr di lettura dei dati sox" #: src/soxdialog.c:794 msgid "Unable to detect supported SoX effects" msgstr "Impossibile verificare gli effetti sox disponibili" #: src/soxdialog.c:832 msgid "Sox support couldn't be initialized" msgstr "Impossibile avviare il supporto a sox" #: src/speeddialog.c:58 msgid "Speed:" msgstr "Velocità:" #: src/statusbar.c:72 msgid "(no file loaded)" msgstr "(nessun file caricato)" #: src/statusbar.c:235 msgid "Cursor: running" msgstr "Cursore: scorrevole" #: src/statusbar.c:237 msgid "Cursor: " msgstr "Cursore: " #: src/statusbar.c:260 #, c-format msgid "View: [ %s - %s ]" msgstr "Vista: [ %s - %s]" #: src/statusbar.c:281 #, c-format msgid "Selection: %s+%s" msgstr "Selezione: %s+%s" #: src/statusbar.c:304 msgid "Processing data" msgstr "Elaborazione" #: src/statusbar.c:306 #, c-format msgid "%s... (Press ESC to cancel)" msgstr "%s... (Premi ESC per annullare)" #: src/um.c:51 msgid "mhWaveEdit: " msgstr "mhWaveEdit: " #: src/um.c:64 #, c-format msgid "mhWaveEdit: %s: %s\n" msgstr "mhWaveEdit: %s: %s\n" #: src/um.c:97 msgid "Message" msgstr "Messaggio" #: src/um.c:117 msgid "Yes" msgstr "Sì" #: src/um.c:125 msgid "No" msgstr "No" #: src/um.c:318 msgid "Input" msgstr "Ingresso" #: src/um.c:407 msgid "Choice" msgstr "Scelta" #: src/volumedialog.c:71 msgid "Calculating peak volume..." msgstr "Calcolo volume di picco:" #: src/volumedialog.c:87 msgid "Start:" msgstr "Inizio:" #: src/volumedialog.c:90 msgid "End:" msgstr "Fine:" #: src/volumedialog.c:109 msgid "Find top volume" msgstr "Trova volume massimo" #: src/document.c:230 #, c-format msgid "untitled #%d" msgstr "senza nome #%d" #: src/document.c:282 msgid "" "Loading and then saving files with 'lossy' formats (like mp3 and ogg) leads " "to a quality loss, also for the unmodified parts of the file." msgstr "" "Aprire e ri-salvare file in formati 'lossy' (come MP3 e OGG) porta ad una " "perdita di qualità, anche nella parte di file che non viene modificata." #: src/session.c:87 msgid "Error opening session directory" msgstr "Errore di apertura della cartella sessione" #: src/session.c:104 src/session.c:164 #, c-format msgid "%s: Wrong file type" msgstr "%s: tipo file errato" #: src/session.c:238 msgid "Could not create session file" msgstr "Impossibile creare file di sessione" #: src/session.c:280 msgid "" "The files that belonged to the crashed session have been recovered. Any " "files that are not saved will be removed permanently.\n" "\n" "(This notice is only shown once)" msgstr "" "I file appartenenti alla sessione bloccata sono stati recuperati.Se i file " "non vengono salvati verranno rimossi definitivamente.\n" "\n" "(questo avviso appare una sola volta)" #: src/session.c:380 msgid "Suspended" msgstr "Sospeso" #: src/session.c:380 src/session.c:381 msgid "Crash" msgstr "Bloccato" #: src/session.c:381 msgid "Left files" msgstr "File rimasti" #: src/session.c:391 #, c-format msgid "%s on %s(%d files, %ld bytes)" msgstr "%s su %s(%d files, %ld bytes)" #: src/session.c:409 msgid "Sessions" msgstr "Sessioni" #: src/session.c:419 msgid "" "Earlier sessions were found. Choose one to resume or start a new session." msgstr "" "Trovate sessioni precedenti. Sceglierne una da proseguire o iniziarne una " "nuova." #: src/session.c:439 msgid "Resume selected" msgstr "Riavvia sessione selezionata" #: src/session.c:449 msgid "Delete selected" msgstr "Cancella sessione selezionata" #: src/session.c:456 msgid "Start new session" msgstr "Inizia nuova sessione" #: src/session.c:462 msgid "Exit" msgstr "Esci" #: src/mapchannelsdialog.c:116 msgid "This effect applies to the whole file, not just the selection" msgstr "L'effetto si applica a tutto il file, non solo alla selezione" #: src/mapchannelsdialog.c:123 msgid "Output channels: " msgstr "Canali OUT:" #: src/mapchannelsdialog.c:130 msgid "Map" msgstr "Mappa" #: src/mapchannelsdialog.c:137 msgid "Source" msgstr "Sorgente" #: src/mapchannelsdialog.c:139 msgid "Destination" msgstr "Destinazione" #: src/sandwichdialog.c:107 msgid "Align beginning of files" msgstr "Allinea file all'inizio" #: src/sandwichdialog.c:110 msgid "Align end of files" msgstr "Allinea file alla fine" #: src/sandwichdialog.c:113 msgid "Align at marker: " msgstr "Allinea al segno:" #: src/sandwichdialog.c:126 msgid "Add channels from: " msgstr "Aggiungi canali da:" #: src/sandwichdialog.c:130 msgid "Alignment" msgstr "Allineamento" #~ msgid "double" #~ msgstr "doppio" #~ msgid "float" #~ msgstr "virgola" #~ msgid "mhWaveEdit: %s (%s): %d Hz, %d bit" #~ msgstr "mhWaveEdit: %s (%s): %d Hz, %d bit" #~ msgid "Follow cursor while playing" #~ msgstr "Segui cursore mentre suona" #~ msgid "Removing channel" #~ msgstr "Rimozione canale" #~ msgid "Mapping channels" #~ msgstr "Mappa canali" #~ msgid "Removing channels" #~ msgstr "Rimozione canali" #~ msgid "Choose a sample format" #~ msgstr "Scegliere un formato di campionamento" #~ msgid "%d-bit" #~ msgstr "%d-bit" #~ msgid "%s (%s %s %d Hz)" #~ msgstr "%s (%s %s %d Hz)" #~ msgid "%s %s %d Hz" #~ msgstr "%s %s %d Hz" #~ msgid "Other format..." #~ msgstr "Altro formato..." #~ msgid "" #~ "To add this format to the presets, enter a name below. Otherwise, leave " #~ "it blank." #~ msgstr "" #~ "Per aggiungere questo formato ai preset, scrivere un nome. Altrimenti " #~ "lasciare in bianco." #~ msgid "Sound device file:" #~ msgstr "Sound device file:" mhwaveedit-1.4.24/po/mhwaveedit.pot000066400000000000000000002123451334022513400172420ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Magnus Hjorth # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-08-25 11:56+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" #: src/chunk.c:199 msgid "Converting samplerate" msgstr "" #: src/chunk.c:226 msgid "Adjusting speed" msgstr "" #: src/chunk.c:703 msgid "Mixing" msgstr "" #: src/chunk.c:758 #, c-format msgid "The mixed result was clipped %d times." msgstr "" #: src/chunk.c:822 msgid "Combining channels" msgstr "" #: src/chunk.c:1083 msgid "Mixing channels" msgstr "" #: src/chunk.c:1471 msgid "Calculating peak level" msgstr "" #: src/chunk.c:1542 src/chunk.c:1552 src/chunk.c:1590 src/chunk.c:1600 msgid "Finding zero-crossing" msgstr "" #: src/chunk.c:1628 #, c-format msgid "Amplifying (by %3.1f%% / %+.1fdB)" msgstr "" #: src/chunk.c:1669 msgid "Amplifying" msgstr "" #: src/chunk.c:1867 #, c-format msgid "The input was clipped %d times during processing." msgstr "" #: src/configdialog.c:65 msgid "number of recent files" msgstr "" #: src/configdialog.c:66 msgid "maximum vertical zoom" msgstr "" #: src/configdialog.c:80 msgid "" "Some of the settings you have changed will not be activated until you " "restart the program" msgstr "" #: src/configdialog.c:292 msgid "Colors" msgstr "" #: src/configdialog.c:329 msgid "_Preview" msgstr "" #: src/configdialog.c:336 src/configdialog.c:1204 msgid "_OK" msgstr "" #: src/configdialog.c:353 msgid "_Cancel" msgstr "" #: src/configdialog.c:430 msgid "Browse directory" msgstr "" #: src/configdialog.c:480 msgid "Preferences" msgstr "" #: src/configdialog.c:539 msgid "Show _time scale by default" msgstr "" #: src/configdialog.c:549 msgid "Show _horizontal zoom slider by default" msgstr "" #: src/configdialog.c:559 msgid "Show _vertical zoom slider by default" msgstr "" #: src/configdialog.c:569 msgid "Show _speed slider by default" msgstr "" #: src/configdialog.c:579 msgid "Show slider l_abels by default" msgstr "" #: src/configdialog.c:589 msgid "Show playback buffer positio_n by default" msgstr "" #: src/configdialog.c:598 msgid "_Settings" msgstr "" #: src/configdialog.c:608 msgid "_Keep sound driver opened (to avoid start/stop clicks)" msgstr "" #: src/configdialog.c:617 msgid "_Byte-swap output (try this if playback sounds horrible)" msgstr "" #: src/configdialog.c:626 msgid "Play _mono files as stereo" msgstr "" #: src/configdialog.c:634 msgid "_Update cursor information while playing" msgstr "" #: src/configdialog.c:642 msgid "_Keep cursor in center of view when following playback" msgstr "" #: src/configdialog.c:652 msgid "_Auto-start playback when jumping to mark" msgstr "" #: src/configdialog.c:660 msgid "Enable _variable speed playback" msgstr "" #: src/configdialog.c:669 msgid "Auto-_reset speed" msgstr "" #: src/configdialog.c:676 msgid "Use fast and noisy method" msgstr "" #: src/configdialog.c:684 msgid "(H')MM:SS.t" msgstr "" #: src/configdialog.c:685 msgid "(H')MM:SS.mmmm" msgstr "" #: src/configdialog.c:686 msgid "TimeDisplay|Samples" msgstr "" #: src/configdialog.c:687 msgid "Time Code 24fps" msgstr "" #: src/configdialog.c:688 msgid "Time Code 25fps (PAL)" msgstr "" #: src/configdialog.c:689 msgid "Time Code 29.97fps (NTSC)" msgstr "" #: src/configdialog.c:690 msgid "Time Code 30fps" msgstr "" #: src/configdialog.c:703 msgid "_Remember window sizes/positions" msgstr "" #: src/configdialog.c:712 msgid "_Draw waveform a second time with improved quality" msgstr "" #: src/configdialog.c:742 msgid "_Remove" msgstr "" #: src/configdialog.c:750 msgid "_Add" msgstr "" #: src/configdialog.c:757 msgid "_Browse..." msgstr "" #: src/configdialog.c:764 msgid "_Up" msgstr "" #: src/configdialog.c:772 msgid "_Down" msgstr "" #: src/configdialog.c:788 msgid "Keep main _window in front after applying effect" msgstr "" #: src/configdialog.c:804 msgid "_Use floating-point temporary files" msgstr "" #: src/configdialog.c:813 msgid "Enable _dithering for editing" msgstr "" #: src/configdialog.c:821 msgid "Enable dithering for _playback" msgstr "" #: src/configdialog.c:829 msgid "Auto dete_ct driver on each start-up" msgstr "" #: src/configdialog.c:842 msgid "Direct access" msgstr "" #: src/configdialog.c:843 msgid "Decompress" msgstr "" #: src/configdialog.c:844 msgid "Bypass" msgstr "" #: src/configdialog.c:855 msgid "Biased" msgstr "" #: src/configdialog.c:856 msgid "Pure-Scaled" msgstr "" #: src/configdialog.c:873 msgid "Interface" msgstr "" #: src/configdialog.c:874 msgid " Main window " msgstr "" #: src/configdialog.c:885 msgid "Number of recent files in File menu: " msgstr "" #: src/configdialog.c:890 msgid " View " msgstr "" #: src/configdialog.c:901 msgid "Customize co_lors..." msgstr "" #: src/configdialog.c:908 msgid " Window contents " msgstr "" #: src/configdialog.c:925 msgid "Vertical zoom limit: " msgstr "" #: src/configdialog.c:929 msgid "x" msgstr "" #: src/configdialog.c:935 msgid "Sound" msgstr "" #: src/configdialog.c:936 msgid " Driver options " msgstr "" #: src/configdialog.c:944 msgid "_Driver:" msgstr "" #: src/configdialog.c:961 msgid " Fallback format " msgstr "" #: src/configdialog.c:966 msgid "Sample format to try when the sound file's format isn't supported." msgstr "" #: src/configdialog.c:978 msgid "Playback" msgstr "" #: src/configdialog.c:980 msgid " Playback settings " msgstr "" #: src/configdialog.c:992 msgid " Variable speed " msgstr "" #: src/configdialog.c:1007 src/help.c:38 msgid "Files" msgstr "" #: src/configdialog.c:1009 msgid " Temporary file directories " msgstr "" #: src/configdialog.c:1035 msgid " Temporary file settings " msgstr "" #: src/configdialog.c:1040 msgid "" "To avoid rounding errors when applying more than one effect on the same " "data, floating-point temporary files can be used. However, this will " "increase disk and CPU usage." msgstr "" #: src/configdialog.c:1048 msgid "" "Some versions of libsndfile supports accessing Ogg files without " "decompressing to a temporary file." msgstr "" #: src/configdialog.c:1062 src/help.c:36 msgid "Quality" msgstr "" #: src/configdialog.c:1064 msgid " Rate conversions " msgstr "" #: src/configdialog.c:1071 msgid "Varispeed: " msgstr "" #: src/configdialog.c:1072 msgid "Speed effect: " msgstr "" #: src/configdialog.c:1079 msgid " Dithering " msgstr "" #: src/configdialog.c:1090 msgid " Sample conversion " msgstr "" #: src/configdialog.c:1097 msgid "Normalization mode: " msgstr "" #: src/configdialog.c:1104 msgid "Other" msgstr "" #: src/configdialog.c:1106 msgid " Time format " msgstr "" #: src/configdialog.c:1115 msgid "Display t_imes as: " msgstr "" #: src/configdialog.c:1126 msgid "Times_cale format: " msgstr "" #: src/configdialog.c:1137 msgid " External applications " msgstr "" #: src/configdialog.c:1145 msgid "Mi_xer utility: " msgstr "" #: src/configdialog.c:1155 msgid "Advanced" msgstr "" #: src/configdialog.c:1156 msgid " Advanced settings " msgstr "" #: src/configdialog.c:1164 msgid "Disk editing _threshold: " msgstr "" #: src/configdialog.c:1175 msgid "View _quality:" msgstr "" #: src/configdialog.c:1181 msgid "samples/pixel" msgstr "" #: src/configdialog.c:1187 msgid "Output _buffer size:" msgstr "" #: src/configdialog.c:1193 msgid "bytes" msgstr "" #: src/configdialog.c:1218 msgid "_Close" msgstr "" #: src/dataformat.c:886 #, c-format msgid "Floating-point (single %s)\n" msgstr "" #: src/dataformat.c:886 src/dataformat.c:888 src/dataformat.c:892 msgid "Big-endian" msgstr "" #: src/dataformat.c:886 src/dataformat.c:888 src/dataformat.c:892 msgid "Little-endian" msgstr "" #: src/dataformat.c:888 #, c-format msgid "Floating-point (double %s)\n" msgstr "" #: src/dataformat.c:890 #, c-format msgid "PCM, %d(%d) bit, %s %s\n" msgstr "" #: src/dataformat.c:891 src/formatselector.c:77 msgid "Signed" msgstr "" #: src/dataformat.c:891 src/formatselector.c:76 msgid "Unsigned" msgstr "" #: src/dataformat.c:952 msgid " Testing ranges..." msgstr "" #: src/dataformat.c:976 msgid "Range test failed for format: " msgstr "" #: src/dataformat.c:990 msgid " Testing all conversions.." msgstr "" #: src/dataformat.c:1032 msgid "(expected) " msgstr "" #: src/dataformat.c:1033 msgid "Conversion test failed, between: " msgstr "" #: src/dataformat.c:1035 msgid " and: " msgstr "" #: src/dataformat.c:1112 msgid "No errors detected!" msgstr "" #: src/dataformat.c:1146 msgid "Preparing tests.." msgstr "" #: src/dataformat.c:1154 msgid "Running tests.." msgstr "" #: src/dataformat.c:1196 #, c-format msgid "" "\n" "\n" "Test results (1 time unit = %f usec/sample)\n" msgstr "" #: src/datasource.c:366 #, c-format msgid "Couldn't open %s" msgstr "" #: src/datasource.c:497 msgid "Unexpected end of file" msgstr "" #: src/datasource.c:498 #, c-format msgid "Error reading %s: %s" msgstr "" #: src/datasource.c:515 #, c-format msgid "Error seeking in %s: %s" msgstr "" #: src/effectbrowser.c:99 msgid "Built-in" msgstr "" #: src/effectbrowser.c:102 msgid "Volume adjust/fade" msgstr "" #: src/effectbrowser.c:104 msgid "Convert samplerate" msgstr "" #: src/effectbrowser.c:106 msgid "Convert sample format" msgstr "" #: src/effectbrowser.c:108 msgid "Map channels" msgstr "" #: src/effectbrowser.c:110 msgid "Combine channels" msgstr "" #: src/effectbrowser.c:113 msgid "Add channels from other file" msgstr "" #: src/effectbrowser.c:114 msgid "Speed" msgstr "" #: src/effectbrowser.c:115 msgid "Pipe through program" msgstr "" #: src/effectbrowser.c:250 msgid "You have no open file to apply the effect to!" msgstr "" #: src/effectbrowser.c:275 msgid "This effect could not be loaded." msgstr "" #: src/effectbrowser.c:582 msgid "/Move Up" msgstr "" #: src/effectbrowser.c:583 msgid "/Move Down" msgstr "" #: src/effectbrowser.c:584 msgid "/Move to Top" msgstr "" #: src/effectbrowser.c:585 msgid "/Move to Bottom" msgstr "" #: src/effectbrowser.c:587 msgid "/Sort by Name" msgstr "" #: src/effectbrowser.c:588 msgid "/Sort by Type" msgstr "" #: src/effectbrowser.c:589 msgid "/Sort by Location" msgstr "" #: src/effectbrowser.c:590 msgid "/Sort by Author" msgstr "" #: src/effectbrowser.c:592 msgid "/Restore Order" msgstr "" #: src/effectbrowser.c:593 msgid "/Rebuild Effect List" msgstr "" #: src/effectbrowser.c:744 msgid "Top" msgstr "" #: src/effectbrowser.c:751 msgid "Up" msgstr "" #: src/effectbrowser.c:758 msgid "Down" msgstr "" #: src/effectbrowser.c:765 msgid "Bottom" msgstr "" #: src/effectbrowser.c:793 msgid "Close dialog after applying effect" msgstr "" #: src/effectbrowser.c:800 src/gotodialog.c:154 msgid "Apply" msgstr "" #: src/effectbrowser.c:808 src/gotodialog.c:159 src/mainwindow.c:1438 #: src/pipedialog.c:165 src/recorddialog.c:610 src/recorddialog.c:987 #: src/sound-esound.c:290 src/sound-jack.c:264 src/sound-oss.c:479 msgid "Close" msgstr "" #: src/effectbrowser.c:830 src/help.c:35 msgid "Effects" msgstr "" #: src/effectbrowser.c:892 msgid "Apply to: " msgstr "" #: src/filetypes.c:103 msgid "putenv failed!" msgstr "" #: src/filetypes.c:113 msgid "unsetenv failed!" msgstr "" #: src/filetypes.c:155 msgid "Microsoft WAV format" msgstr "" #: src/filetypes.c:181 msgid "Ogg Vorbis" msgstr "" #: src/filetypes.c:188 msgid "Raw PCM data" msgstr "" #: src/filetypes.c:190 msgid "Open with MPlayer" msgstr "" #: src/filetypes.c:275 #, c-format msgid "The file %s does not exist!" msgstr "" #: src/filetypes.c:282 #, c-format msgid "The file %s is not a regular file!" msgstr "" #: src/filetypes.c:294 msgid "Loading" msgstr "" #: src/filetypes.c:333 #, c-format msgid "" "The file name '%s' has an extension unknown to the program. Please specify " "in which format this file should be saved." msgstr "" #: src/filetypes.c:338 msgid "Unknown file type" msgstr "" #: src/filetypes.c:389 msgid "Saving" msgstr "" #: src/filetypes.c:393 #, c-format msgid "" "The file %s may be destroyed since the saving failed. Try to free up some " "disk space and save again. If you exit now the file's contents could be in a " "bad state. " msgstr "" #: src/filetypes.c:457 #, c-format msgid "%s is not a valid wav file" msgstr "" #: src/filetypes.c:472 #, c-format msgid "" "The file %s is a compressed wav file. This program can only work with " "uncompressed wav files." msgstr "" #: src/filetypes.c:593 msgid "" "On this system, libsndfile is required to save floating-point wav files." msgstr "" #: src/filetypes.c:616 msgid "" "You are saving a wav file larger than 2048MB. Such large files are non-" "standard and may not be readable by all programs.\n" "\n" " (this warning will not be displayed again)" msgstr "" #: src/filetypes.c:732 src/filetypes.c:877 #, c-format msgid "Failed to open '%s'!" msgstr "" #: src/filetypes.c:849 msgid "Invalid sample format or number of channels for this file format" msgstr "" #: src/filetypes.c:943 #, c-format msgid "Failed to write to '%s'!" msgstr "" #: src/filetypes.c:1028 msgid "Decoding" msgstr "" #: src/filetypes.c:1149 msgid "Variable bitrate (default)" msgstr "" #: src/filetypes.c:1150 msgid "Average bitrate" msgstr "" #: src/filetypes.c:1151 msgid "Constant bitrate" msgstr "" #: src/filetypes.c:1152 msgid "Custom argument" msgstr "" #: src/filetypes.c:1156 msgid "Standard (high quality)" msgstr "" #: src/filetypes.c:1157 msgid "Extreme (higher quality)" msgstr "" #: src/filetypes.c:1158 msgid "Insane (highest possible quality)" msgstr "" #: src/filetypes.c:1176 #, c-format msgid "%s kbit/s" msgstr "" #: src/filetypes.c:1205 msgid "MP3 Preferences" msgstr "" #: src/filetypes.c:1216 msgid "Encoding type: " msgstr "" #: src/filetypes.c:1229 msgid "Quality: " msgstr "" #: src/filetypes.c:1238 msgid "Custom argument: " msgstr "" #: src/filetypes.c:1244 msgid "Use this setting by default" msgstr "" #: src/filetypes.c:1249 src/gotodialog.c:146 src/mainwindow.c:1509 #: src/rawdialog.c:101 src/sound-alsalib.c:98 src/sound-esound.c:286 #: src/sound-jack.c:260 src/sound-oss.c:475 src/um.c:109 src/um.c:142 #: src/um.c:341 src/um.c:449 msgid "OK" msgstr "" #: src/filetypes.c:1257 src/rawdialog.c:107 src/sound-alsalib.c:102 #: src/um.c:133 src/um.c:150 src/um.c:347 src/um.c:458 msgid "Cancel" msgstr "" #: src/float_box.c:184 src/int_box.c:184 #, c-format msgid "'%s' is not a number!" msgstr "" #: src/float_box.c:202 #, c-format msgid "Value for '%s' must be a number between %f and %f" msgstr "" #: src/formatselector.c:60 msgid "Sample type: " msgstr "" #: src/formatselector.c:62 msgid "8 bit PCM" msgstr "" #: src/formatselector.c:63 msgid "16 bit PCM" msgstr "" #: src/formatselector.c:64 msgid "24 bit PCM" msgstr "" #: src/formatselector.c:65 msgid "32 bit PCM" msgstr "" #: src/formatselector.c:66 msgid "Floating-point, single" msgstr "" #: src/formatselector.c:67 msgid "Floating-point, double" msgstr "" #: src/formatselector.c:74 msgid "Signedness: " msgstr "" #: src/formatselector.c:82 msgid "Endianness: " msgstr "" #: src/formatselector.c:84 msgid "Little endian" msgstr "" #: src/formatselector.c:85 msgid "Big endian" msgstr "" #: src/formatselector.c:90 msgid "Alignment:" msgstr "" #: src/formatselector.c:92 msgid "Packed" msgstr "" #: src/formatselector.c:93 msgid "Top bytes" msgstr "" #: src/formatselector.c:94 msgid "Bottom bytes" msgstr "" #: src/formatselector.c:130 msgid "Channels: " msgstr "" #: src/formatselector.c:139 msgid "Sample rate: " msgstr "" #: src/formatselector.c:226 msgid "sample rate" msgstr "" #: src/gotodialog.c:102 msgid "Place cursor " msgstr "" #: src/gotodialog.c:107 src/sound-esound.c:274 msgid "seconds" msgstr "" #: src/gotodialog.c:111 src/soxdialog.c:487 msgid "samples" msgstr "" #: src/gotodialog.c:115 msgid "after beginning of file" msgstr "" #: src/gotodialog.c:120 msgid "after end of file" msgstr "" #: src/gotodialog.c:125 msgid "after current cursor position" msgstr "" #: src/gotodialog.c:130 msgid "after selection start" msgstr "" #: src/gotodialog.c:135 msgid "after selection end" msgstr "" #: src/gotodialog.c:139 msgid "" "(use a negative number to place the cursor before instead of after the " "selected point)" msgstr "" #: src/gotodialog.c:178 msgid "Position cursor" msgstr "" #: src/gtkfiles.c:48 #, c-format msgid "Could not open %s: %s" msgstr "" #: src/gtkfiles.c:53 #, c-format msgid "Warning: Unexpected error: %s" msgstr "" #: src/gtkfiles.c:110 src/gtkfiles.c:125 #, c-format msgid "Error closing %s: %s" msgstr "" #: src/gtkfiles.c:140 #, c-format msgid "Could not seek in %s: %s" msgstr "" #: src/gtkfiles.c:159 src/gtkfiles.c:204 #, c-format msgid "Could not read from %s: %s" msgstr "" #: src/gtkfiles.c:178 #, c-format msgid "Unexpected end of file reading from %s" msgstr "" #: src/gtkfiles.c:196 #, c-format msgid "Unable to write data to %s" msgstr "" #: src/gtkfiles.c:262 #, c-format msgid "Could not get file position in %s: %s" msgstr "" #: src/gtkfiles.c:313 src/gtkfiles.c:473 msgid "File already exists. Overwrite?" msgstr "" #: src/gtkfiles.c:321 msgid "No file with that name!" msgstr "" #: src/gtkfiles.c:705 #, c-format msgid "Error reading from %s: %s" msgstr "" #: src/gtkfiles.c:737 #, c-format msgid "Could not remove '%s': %s" msgstr "" #: src/gtkfiles.c:757 #, c-format msgid "Error creating link to '%s': %s" msgstr "" #: src/help.c:30 msgid "General" msgstr "" #: src/help.c:31 msgid "Sample view" msgstr "" #: src/help.c:32 msgid "Playing" msgstr "" #: src/help.c:33 msgid "Recording" msgstr "" #: src/help.c:34 msgid "Editing" msgstr "" #: src/help.c:37 msgid "File formats" msgstr "" #: src/help.c:39 msgid "Keyboard shortcuts" msgstr "" #: src/help.c:40 msgid "Bug reporting" msgstr "" #: src/help.c:41 msgid "Helping out" msgstr "" #: src/help.c:42 msgid "Contact" msgstr "" #: src/help.c:47 #, no-c-format msgid "" "mhWaveEdit is a graphical program for editing sound files. It is completely " "free (GPL).\n" msgstr "" #: src/help.c:49 #, no-c-format msgid "You can find the latest release of mhWaveEdit at:\n" msgstr "" #: src/help.c:50 #, no-c-format msgid "http://gna.org/projects/mhwaveedit/\n" msgstr "" #: src/help.c:55 #, no-c-format msgid "" "The area where you 'see' the contents of the file you are editing, is called " "the 'sample view'. \n" msgstr "" #: src/help.c:57 #, no-c-format msgid "" "In the sample view there is a grey vertical bar called the 'cursor'. The " "cursor follows the sound wave when you play the sound. You can position the " "cursor by clicking with the right (2:nd) mouse button. If you do this while " "you're playing a file, the playing will continue from the new cursor " "position. You can also position the cursor more exact by using the 'Position " "Cursor...' command on the Edit menu.\n" msgstr "" #: src/help.c:59 #, no-c-format msgid "" "You can place marks in your file by holding down Ctrl and pressing a number " "from 0 to 9. This will place a mark (green vertical bar) with the same " "number at the current cursor position. You can later make the cursor go to " "that position again by just pressing the number. Setting and jumping to " "marks can be done while playing. To remove a mark, jump to the mark and set " "it again.\n" msgstr "" #: src/help.c:64 #, no-c-format msgid "" "Playing a file is simple, just load the file and press the play button. The " "green play button plays from the current position. The yellow play button " "plays the current selection, or the entire file if nothing is selected. Stop " "the playback with the stop button (with the red square). \n" msgstr "" #: src/help.c:66 #, no-c-format msgid "" "The playback speed can be varied by adjusting the slider to the far right. \n" msgstr "" #: src/help.c:68 #, no-c-format msgid "You can do normal editing while the file is playing.\n" msgstr "" #: src/help.c:73 #, no-c-format msgid "" "Recording is done with 'Record...' on the Play menu, or the Record button " "(the red circle). A dialog box will pop up where you can select what format " "you want to record in. After selecting the format, meters and numbers will " "appear showing info about the volume level of the sound input. \n" msgstr "" #: src/help.c:75 #, no-c-format msgid "" "When you want to start recording, press the \"Start recording\" button. When " "you've recorded everything you wanted to, press the Finish button and the " "record dialog will disappear and newly recorded sound will show up in a new " "window.\n" msgstr "" #: src/help.c:77 #, no-c-format msgid "" "Currently it is impossible to play and record at the same time, so the " "playback will stop when you record.\n" msgstr "" #: src/help.c:82 #, no-c-format msgid "" "You make selections by dragging the mouse over the sample view. You can hear " "what you've currently selected by clicking on the \"play selection\" button " "(the button with the yellow arrow) or by selecting 'Play selection' from the " "Play menu.\n" msgstr "" #: src/help.c:84 #, no-c-format msgid "" "You can use the cursor to refine the selection. Use the 'Selection start at " "cursor' and 'Selection end at cursor' buttons to move the selection starting " "point or the selection end point to the current cursor position. You can " "also drag the selection endpoints using the mouse.\n" msgstr "" #: src/help.c:86 #, no-c-format msgid "The 'Cut' and 'Copy' functions work like in any other software. \n" msgstr "" #: src/help.c:88 #, no-c-format msgid "" "The 'Paste' function insert the clipboard contents at the cursor position. " "The 'Paste over' function works like 'Paste', except that it overwrites the " "data after the insert position. \n" msgstr "" #: src/help.c:90 #, no-c-format msgid "" "The 'Paste mix' function combines the clipboard data with the data at the " "cursor position.\n" msgstr "" #: src/help.c:92 #, no-c-format msgid "" "The 'Paste as new' function opens a new window and puts the clipboard " "contents into it. \n" msgstr "" #: src/help.c:94 #, no-c-format msgid "" "The 'Crop' function deletes all parts of the file that are not selected.\n" msgstr "" #: src/help.c:96 #, no-c-format msgid "" "The 'Silence selection' function replaces the selected part with silence. To " "avoid clicks, the silent part is a line that meets the wave at the " "endpoints.\n" msgstr "" #: src/help.c:98 #, no-c-format msgid "" "All editing functions work non-destructively, that is, the file you're " "editing isn't actually changed until you save it (the effects also work this " "way).\n" msgstr "" #: src/help.c:104 #, no-c-format msgid "" "mhWaveEdit has a few simple effects, which are available from the 'Effects' " "menu. \n" msgstr "" #: src/help.c:106 #, no-c-format msgid " * Fade in/out\n" msgstr "" #: src/help.c:108 #, no-c-format msgid " This creates a linear fade in or fade out effect.\n" msgstr "" #: src/help.c:110 #, no-c-format msgid " * Normalize, Normalize to...\n" msgstr "" #: src/help.c:112 #, no-c-format msgid "" " This amplifies the sound as much as possible without getting clipping " "distortion. The \"Normalize to...\" item lets you specify which level to " "normalize to.\n" msgstr "" #: src/help.c:114 #, no-c-format msgid " * Volume adjust/fade...\n" msgstr "" #: src/help.c:116 #, no-c-format msgid "" " This effect lets you select a starting volume and a ending volume and " "amplifies the selection fading from the starting volume to the ending " "volume.\n" msgstr "" #: src/help.c:118 #, no-c-format msgid "" " Note that volumes above 100% may cause sound distortion. Use the 'Find " "top volume' to find out the maximum amplification possible without " "distortion. (You can use this for normalizing samples.) \n" msgstr "" #: src/help.c:120 #, no-c-format msgid "" " By setting starting volume and ending volume to the same value you get a " "simple amplification of the sound. \n" msgstr "" #: src/help.c:122 #, no-c-format msgid " * Convert samplerate...\n" msgstr "" #: src/help.c:124 #, no-c-format msgid "" " This converts the samplerate of the entire file to one you specify. There " "are different methods for doing this, usually the one in the top has the " "best quality but can take longer than the other methode.\n" msgstr "" #: src/help.c:126 #, no-c-format msgid " * Convert sample format...\n" msgstr "" #: src/help.c:128 #, no-c-format msgid " This converts the sample format of the entire file.\n" msgstr "" #: src/help.c:130 #, no-c-format msgid "" " The 'Don't actually change the data' option can be used if the program " "was wrong about the file's format.\n" msgstr "" #: src/help.c:132 #, no-c-format msgid " * Byte swap\n" msgstr "" #: src/help.c:134 #, no-c-format msgid "" " This \"byte swaps\" the selected part. It can be used to repair damaged " "files where the byte order is wrong. Note that if the sound looks alright " "but plays wrong, you should not use this option, instead you should use the " "\"byte-swap output\" option in the Preferences dialog.\n" msgstr "" #: src/help.c:136 #, no-c-format msgid " * Mix to mono\n" msgstr "" #: src/help.c:138 #, no-c-format msgid " This mixes all channels of the file together to a mono sound.\n" msgstr "" #: src/help.c:140 #, no-c-format msgid " * Add channel\n" msgstr "" #: src/help.c:142 #, no-c-format msgid "" " This copies the first channel to a new channel in the sound, converting " "mono to stereo etc.\n" msgstr "" #: src/help.c:144 #, no-c-format msgid " * Map channels...\n" msgstr "" #: src/help.c:145 #, no-c-format msgid " \n" msgstr "" #: src/help.c:146 #, no-c-format msgid "" " With this effect, you can change the number of channels in the file. You " "can also rearrange and add (i.e. mix) channels.\n" msgstr "" #: src/help.c:148 #, no-c-format msgid " * Combine channels...\n" msgstr "" #: src/help.c:150 #, no-c-format msgid "" " This effect lets you create a new sound by a linear combination of the " "old channels. This means you can do channel mixing / swapping / balance / " "panning / amplification etc. by entering different values. For example, to " "swap the left and right channel, you select that the new Channel 1 should be " "0% of the old Channel 1 and 100% of the old Channel 2, and the new Channel 2 " "should be 100% of the old Channel 1 and 0% of the old Channel 2 \n" msgstr "" #: src/help.c:152 #, no-c-format msgid " * Speed adjustment...\n" msgstr "" #: src/help.c:154 #, no-c-format msgid "" " This effect changes the speed of the selection. The tone will change as " "well.\n" msgstr "" #: src/help.c:155 #, no-c-format msgid " * Pipe through program...\n" msgstr "" #: src/help.c:156 #, no-c-format msgid " \n" msgstr "" #: src/help.c:157 #, no-c-format msgid "" " This effect is for advanced users wanting to pipe raw audio data through " "an external program. The output of the program is read back and replaces the " "processed part. \n" msgstr "" #: src/help.c:159 #, no-c-format msgid "" "mhWaveEdit supports LADSPA effects and can also make use of most of the SoX " "utility's effects. To find the LADSPA plugins the environment variable " "LADSPA_PATH must be properly set up. \n" msgstr "" #: src/help.c:161 #, no-c-format msgid "" "All supported effects can be found by choosing the 'Effects...' menu item. " "The effects are listed with names beginning with [B] for builtin effects, " "[L] for LADSPA effects, and [S] for SoX effects.\n" msgstr "" #: src/help.c:167 #, no-c-format msgid "Some notes on sound quality.\n" msgstr "" #: src/help.c:169 #, no-c-format msgid "" "The general rule when doing audio editing/processing is to not manipulate " "the data more than necessary and keep an original copy whenever you're " "processing your important files. \n" msgstr "" #: src/help.c:171 #, no-c-format msgid "" "Cut, copy and paste operations move the data around without modifying it, so " "these don't degrade the sound quality. Because of level differences, you may " "get a \"step\" at the start and end of the inserted part, which can cause a " "small clicking sound. \n" msgstr "" #: src/help.c:173 #, no-c-format msgid "" "The mix paste function doesn't decrease quality, unless the peaks become too " "high and you get clipping. In that case you will get a warning message.\n" msgstr "" #: src/help.c:175 #, no-c-format msgid "" "Sound data is normally stored as integer values. Therefore, whenever you " "normalize, adjust volume, decrease sample size or filter a sound, the result " "must be rounded. If you use 24 or 32 bit sample sizes, this is not really a " "problem, but if you use 8 or 16 bits sample size, this rounding causes a " "decrease in quality. \n" msgstr "" #: src/help.c:177 #, no-c-format msgid "" "The quality decrease that the rounding causes can be masked by adding a " "small amount of noise before rounding. This is called \"dithering\". " "mhWaveEdit supports basic dithering and it's enabled by default.\n" msgstr "" #: src/help.c:179 #, no-c-format msgid "" "By default, mhWaveEdit uses floating-point temporary files for storing " "processed results to avoid rounding until the file is saved.\n" msgstr "" #: src/help.c:184 #, no-c-format msgid "" "Even if mhWaveEdit was originally built for editing wav files, it's also " "possible to load and save in a few other formats. mhWaveEdit always supports " "wav and raw files, but if it's compiled with the libsndfile library, " "mhWaveEdit supports a couple of other formats as well. \n" msgstr "" #: src/help.c:186 #, no-c-format msgid "" "To save a file with a different file format, use \"Save as...\" and choose a " "format in the file type selection box. \n" msgstr "" #: src/help.c:188 #, no-c-format msgid "" "mhWaveEdit has basic support for mp3 and ogg formats. For this to work you " "need to have LAME installed for mp3 support, and OggDec/OggEnc for Ogg " "support. If you have these programs, you can open and save mp3/ogg files " "just like any other file format.\n" msgstr "" #: src/help.c:190 #, no-c-format msgid "" "If mplayer is installed, mhwaveedit can open all formats that it supports, " "for example the soundtrack of a video file. Since mplayer is only a player, " "these files can not be saved back after editing, you have to save the file " "into a supported format.\n" msgstr "" #: src/help.c:195 #, no-c-format msgid "" "mhWaveEdit creates a directory ~/.mhwaveedit where it stores configuration " "information. \n" msgstr "" #: src/help.c:197 #, no-c-format msgid "" "The configuration file is called config. It can be hand edited, but the " "easiest way is through 'Preferences' on the Edit menu.\n" msgstr "" #: src/help.c:199 #, no-c-format msgid "" "Each mhwaveedit process creates a session file in the .mhwaveedit directory " "called mhwaveedit-session---, where is the " "session ID number and is a character code showing the state of the " "session ('r' for running sessions). \n" msgstr "" #: src/help.c:201 #, no-c-format msgid "" "Temporary files are by default also stored in the ~/.mhwaveedit directory. " "Which directories to use can be set through the preferences dialog. To get " "the best performance, you should have one temporary directory for each local " "filesystem. The temporary files have names of the form \"mhwaveedit-temp-" "-nnnn-\". Do NOT open or remove temporary files with the same " "pid number as a currently running mhWaveEdit.\n" msgstr "" #: src/help.c:203 #, no-c-format msgid "" "mhWaveEdit checks on startup for leftover temporary files and lets the user " "open them. After opening a crashed session, the files can be saved or thrown " "away.\n" msgstr "" #: src/help.c:208 #, no-c-format msgid "F1 Help\n" msgstr "" #: src/help.c:209 #, no-c-format msgid "F12 Record\n" msgstr "" #: src/help.c:211 #, no-c-format msgid "Ctrl+(number) Set mark\n" msgstr "" #: src/help.c:212 #, no-c-format msgid "(number) Goto mark\n" msgstr "" #: src/help.c:214 #, no-c-format msgid "Ctrl+P Preferences\n" msgstr "" #: src/help.c:215 #, no-c-format msgid "Ctrl+E Effects\n" msgstr "" #: src/help.c:217 #, no-c-format msgid "Ctrl+O Open file\n" msgstr "" #: src/help.c:218 #, no-c-format msgid "Ctrl+S Save file\n" msgstr "" #: src/help.c:219 #, no-c-format msgid "Ctrl+U Save selection as\n" msgstr "" #: src/help.c:221 #, no-c-format msgid "Ctrl+C Copy\n" msgstr "" #: src/help.c:222 #, no-c-format msgid "Ctrl+X Cut\n" msgstr "" #: src/help.c:223 #, no-c-format msgid "Ctrl+D Delete\n" msgstr "" #: src/help.c:224 #, no-c-format msgid "Delete Delete\n" msgstr "" #: src/help.c:225 #, no-c-format msgid "Ctrl+V Paste\n" msgstr "" #: src/help.c:226 #, no-c-format msgid "Ctrl+Z Undo\n" msgstr "" #: src/help.c:227 #, no-c-format msgid "Ctrl+A Select all\n" msgstr "" #: src/help.c:229 #, no-c-format msgid "Ctrl+G Position cursor (Go to)\n" msgstr "" #: src/help.c:230 #, no-c-format msgid "Ctrl+H Position cursor at file start\n" msgstr "" #: src/help.c:231 #, no-c-format msgid "Ctrl+J Position cursor at file end\n" msgstr "" #: src/help.c:232 #, no-c-format msgid "Ctrl+K Position cursor at selection start\n" msgstr "" #: src/help.c:233 #, no-c-format msgid "Ctrl+L Position cursor at selection end\n" msgstr "" #: src/help.c:234 #, no-c-format msgid "Y,U Move cursor to nearest all-channel zero-crossing\n" msgstr "" #: src/help.c:235 #, no-c-format msgid "I,O Move cursor to nearest any-channel zero-crossing\n" msgstr "" #: src/help.c:237 #, no-c-format msgid "Ctrl+Q Selection start at cursor\n" msgstr "" #: src/help.c:238 #, no-c-format msgid "Ctrl+W Selection end at cursor\n" msgstr "" #: src/help.c:240 #, no-c-format msgid "+,= Zoom in\n" msgstr "" #: src/help.c:241 #, no-c-format msgid "- Zoom out\n" msgstr "" #: src/help.c:242 #, no-c-format msgid "> Zoom to selection\n" msgstr "" #: src/help.c:243 #, no-c-format msgid "< Zoom all\n" msgstr "" #: src/help.c:244 #, no-c-format msgid "Arrow keys Scroll left/right\n" msgstr "" #: src/help.c:246 #, no-c-format msgid "Home Move view to file start\n" msgstr "" #: src/help.c:247 #, no-c-format msgid "End Move view to file end\n" msgstr "" #: src/help.c:248 #, no-c-format msgid "Tab Move view to cursor\n" msgstr "" #: src/help.c:249 #, no-c-format msgid "Ctrl+Tab Move cursor to center of view\n" msgstr "" #: src/help.c:251 #, no-c-format msgid "Space Play/Stop\n" msgstr "" #: src/help.c:252 #, no-c-format msgid "Shift+Space Play all\n" msgstr "" #: src/help.c:253 #, no-c-format msgid ", Play from cursor pos\n" msgstr "" #: src/help.c:254 #, no-c-format msgid ". Stop\n" msgstr "" #: src/help.c:255 #, no-c-format msgid "/ Play selection\n" msgstr "" #: src/help.c:256 #, no-c-format msgid "H,J Move cursor (and playback) 1/8 of view\n" msgstr "" #: src/help.c:257 #, no-c-format msgid "K,L Move cursor one sample\n" msgstr "" #: src/help.c:258 #, no-c-format msgid "Ctrl+arrow Move cursor (and playback) half second\n" msgstr "" #: src/help.c:259 #, no-c-format msgid "( Play first 3 seconds of selection\n" msgstr "" #: src/help.c:260 #, no-c-format msgid ") Play last 3 seconds of selection\n" msgstr "" #: src/help.c:265 #, no-c-format msgid "" "If you find a bug or flaw in the program that's not mentioned in the BUGS " "file, report the bug in the bug tracker (see contact info) or mail a bug " "report describing the bug to: magnus.hjorth@home.se\n" msgstr "" #: src/help.c:267 #, no-c-format msgid "" "In case of a crash, please do not send me any core dumps. They are huge and " "completely useless to me. Instead, create a backtrace. Backtraces tell you " "exactly where the program crashed.\n" msgstr "" #: src/help.c:269 #, no-c-format msgid "How to create a backtrace:\n" msgstr "" #: src/help.c:270 #, no-c-format msgid "1. Enable core dumps: ulimit -c unlimited\n" msgstr "" #: src/help.c:271 #, no-c-format msgid "2. Run the program: mhwaveedit\n" msgstr "" #: src/help.c:272 #, no-c-format msgid "" "3. Make the program crash. You should now get a file named core or core.1234 " "in the directory you're in.\n" msgstr "" #: src/help.c:273 #, no-c-format msgid "4. Run gdb with the program and core file: \n" msgstr "" #: src/help.c:274 #, no-c-format msgid " gdb /usr/local/bin/mhwaveedit core | tee backtrace.txt\n" msgstr "" #: src/help.c:275 #, no-c-format msgid "5. After gdb has loaded, use the command: bt\n" msgstr "" #: src/help.c:276 #, no-c-format msgid "6. Quit gdb with the command: quit\n" msgstr "" #: src/help.c:277 #, no-c-format msgid "7. Now you should have a back trace in the file backtrace.txt\n" msgstr "" #: src/help.c:282 #, no-c-format msgid "" "There are plenty of things you can do if you want to help the development of " "mhWaveEdit. \n" msgstr "" #: src/help.c:284 #, no-c-format msgid "" "First of all, look for bugs and report all bugs you find into the bug " "tracker or through e-mail. Sometimes a bug can get overlooked for a long " "time because nobody reports it, so don't be afraid to report bugs that have " "been there for a few releases. You don't have to provide fixes or very " "detailed information, although it helps of course.\n" msgstr "" #: src/help.c:286 #, no-c-format msgid "" "Feature requests are also welcome, report them to the mailing list or to the " "bug tracker.\n" msgstr "" #: src/help.c:288 #, no-c-format msgid "" "If you speak a language other than English and mhWaveEdit isn't translated " "to your language, you can contribute a translation. To do that, copy the " "template mhwaveedit.pot in the po directory into a new file ll.po, where ll " "is your language code (see http://www.gnu.org/software/gettext/manual/" "html_node/gettext_221.html for a list of language codes). \n" msgstr "" #: src/help.c:290 #, no-c-format msgid "" "It's possible to edit po-files by hand, but I recommend a program such as " "poEdit (http://www.poedit.org) for editing translations. \n" msgstr "" #: src/help.c:292 #, no-c-format msgid "" "Note that for those translatable strings that look like \"RecordStatus|Paused" "\", you should ignore what's to the left and only translate the string to " "the right (\"Paused\" in this example). This convention is there to make it " "possible to translate the same string to different things depending on " "context. \n" msgstr "" #: src/help.c:294 #, no-c-format msgid "" "After you've filled in all the translations you want (you don't have to " "translate all the strings), mail in the po file to me (see contact info) and " "I'll add it to the next release. \n" msgstr "" #: src/help.c:296 #, no-c-format msgid "" "If a translation is incomplete, you're very welcome to translate the " "remaining untranslated messages and mail them in. Corrections to " "translations are also appreciated, but they may need to be checked with the " "previous translator before including them. \n" msgstr "" #: src/help.c:302 #, no-c-format msgid "For bug reports, translation updates, patches and PayPal donations:\n" msgstr "" #: src/help.c:303 #, no-c-format msgid "magnus.hjorth@home.se\n" msgstr "" #: src/help.c:305 #, no-c-format msgid "Project page with bug tracker, mailing list membership:\n" msgstr "" #: src/help.c:306 #, no-c-format msgid "http://gna.org/projects/mhwaveedit\n" msgstr "" #: src/help.c:308 #, no-c-format msgid "Mailing list (you must be a subscriber before you can post messages):\n" msgstr "" #: src/help.c:309 #, no-c-format msgid "mhwaveedit-discuss@gna.org\n" msgstr "" #: src/inifile.c:84 src/inifile.c:91 #, c-format msgid "%s: Expected '=': %s\n" msgstr "" #: src/inifile.c:97 #, c-format msgid "%s: Expected value: %s\n" msgstr "" #: src/int_box.c:202 #, c-format msgid "Value for %s must be a number between %ld and %ld" msgstr "" #: src/ladspacore.c:94 #, c-format msgid "Effect %s contains invalid port %s" msgstr "" #: src/ladspacore.c:140 #, c-format msgid "Ladspa: Error scanning %s" msgstr "" #: src/ladspacore.c:409 #, c-format msgid "Applying effect '%s'" msgstr "" #: src/ladspadialog.c:87 #, c-format msgid "Value for '%s' must not be below %f" msgstr "" #: src/ladspadialog.c:94 #, c-format msgid "Value for '%s' must not be above %f" msgstr "" #: src/ladspadialog.c:127 #, c-format msgid "" "You have mapped more than one output port to channel '%s'. You can only map " "one output port to each channel." msgstr "" #: src/ladspadialog.c:191 #, c-format msgid "Author: %s" msgstr "" #: src/ladspadialog.c:196 #, c-format msgid "Copyright: %s" msgstr "" #: src/ladspadialog.c:203 msgid " Input controls " msgstr "" #: src/ladspadialog.c:292 msgid " Output controls " msgstr "" #: src/ladspadialog.c:311 src/recorddialog.c:311 src/recorddialog.c:739 msgid "None" msgstr "" #: src/ladspadialog.c:319 msgid " Input audio " msgstr "" #: src/ladspadialog.c:319 msgid " Output audio " msgstr "" #: src/ladspadialog.c:350 msgid "Keep data in unmapped output channels" msgstr "" #: src/main.c:166 #, c-format msgid "Syntax: %s [files]\n" msgstr "" #: src/main.c:169 msgid "Testing conversion functions:" msgstr "" #: src/main.c:171 msgid "Testing conversion functions finished." msgstr "" #: src/main.c:190 msgid "Expected driver name after --driver option" msgstr "" #: src/main.c:196 #, c-format msgid "Unknown option '%s'" msgstr "" #: src/main.c:340 msgid "" "Could not find home directory. Using current directory as home directory." msgstr "" #: src/main.c:368 msgid "Black" msgstr "" #: src/main.c:369 msgid "White" msgstr "" #: src/main.c:370 msgid "Background" msgstr "" #: src/main.c:371 msgid "L Waveform" msgstr "" #: src/main.c:372 msgid "R Waveform" msgstr "" #: src/main.c:373 msgid "Cursor" msgstr "" #: src/main.c:374 msgid "Marks" msgstr "" #: src/main.c:375 msgid "Selection" msgstr "" #: src/main.c:376 msgid "Progress bar" msgstr "" #: src/main.c:377 msgid "Zero-level" msgstr "" #: src/main.c:378 msgid "Buffer position" msgstr "" #: src/main.c:501 #, c-format msgid "Error launching mixer: fork: %s" msgstr "" #: src/main.c:552 src/main.c:571 msgid "Mono" msgstr "" #: src/main.c:553 msgid "Left" msgstr "" #: src/main.c:554 msgid "Right" msgstr "" #: src/main.c:556 #, c-format msgid "Ch%d" msgstr "" #: src/main.c:572 msgid "Stereo" msgstr "" #: src/main.c:574 #, c-format msgid "%d channels" msgstr "" #: src/main.c:1149 msgid "Ignoring extreme old window size/position values\n" msgstr "" #: src/mainwindow.c:217 #, c-format msgid "mhWaveEdit: %s (%s): %d Hz, %s" msgstr "" #: src/mainwindow.c:300 msgid "Use default settings" msgstr "" #: src/mainwindow.c:304 msgid "Auto-detect from extension" msgstr "" #: src/mainwindow.c:319 msgid "File type: " msgstr "" #: src/mainwindow.c:365 msgid "" "The file has not changed since last save. Press OK if you want to save it " "anyway?" msgstr "" #: src/mainwindow.c:374 msgid "Save File" msgstr "" #: src/mainwindow.c:399 #, c-format msgid "Save changes to %s?" msgstr "" #: src/mainwindow.c:792 src/mainwindow.c:796 msgid "Load File" msgstr "" #: src/mainwindow.c:821 msgid "Save selection as ..." msgstr "" #: src/mainwindow.c:1116 #, c-format msgid "Chunk %p has opencount=%d\n" msgstr "" #: src/mainwindow.c:1199 #, c-format msgid "" "\n" "Window '%s'\n" msgstr "" #: src/mainwindow.c:1200 msgid " Current chunk:" msgstr "" #: src/mainwindow.c:1202 msgid " History:" msgstr "" #: src/mainwindow.c:1257 msgid "There already is only one channel!" msgstr "" #: src/mainwindow.c:1366 msgid "mhWaveEdit Help" msgstr "" #: src/mainwindow.c:1465 msgid "About mhWaveEdit" msgstr "" #: src/mainwindow.c:1477 msgid "" "Created by Magnus Hjorth (magnus.hjorth@home.se)\n" "Copyright 2002-2018, Magnus Hjorth" msgstr "" #: src/mainwindow.c:1484 #, c-format msgid "Current sound driver: %s" msgstr "" #: src/mainwindow.c:1492 #, c-format msgid "Compiled %s %s" msgstr "" #: src/mainwindow.c:1498 msgid "Uses double-precision math" msgstr "" #: src/mainwindow.c:1505 msgid "" "Distributed under GNU General Public License.\n" "For information, see the file COPYING" msgstr "" #: src/mainwindow.c:1669 msgid "Seconds of silence: " msgstr "" #: src/mainwindow.c:1669 msgid "Insert Silence" msgstr "" #: src/mainwindow.c:1718 msgid "Level: " msgstr "" #: src/mainwindow.c:1718 msgid "Normalize to..." msgstr "" #: src/mainwindow.c:1928 msgid "/_File" msgstr "" #: src/mainwindow.c:1929 msgid "/File/_Open..." msgstr "" #: src/mainwindow.c:1930 msgid "/File/_Save" msgstr "" #: src/mainwindow.c:1931 msgid "/File/Save _as..." msgstr "" #: src/mainwindow.c:1932 msgid "/File/Save selection as..." msgstr "" #: src/mainwindow.c:1933 msgid "/_Edit" msgstr "" #: src/mainwindow.c:1934 msgid "/Edit/_Undo" msgstr "" #: src/mainwindow.c:1935 msgid "/Edit/_Redo" msgstr "" #: src/mainwindow.c:1936 msgid "/Edit/sep1" msgstr "" #: src/mainwindow.c:1937 msgid "/Edit/Cu_t" msgstr "" #: src/mainwindow.c:1938 msgid "/Edit/_Copy" msgstr "" #: src/mainwindow.c:1939 msgid "/Edit/_Paste" msgstr "" #: src/mainwindow.c:1940 msgid "/Edit/Paste _over" msgstr "" #: src/mainwindow.c:1941 msgid "/Edit/_Mix paste" msgstr "" #: src/mainwindow.c:1942 msgid "/Edit/Insert _silence" msgstr "" #: src/mainwindow.c:1943 msgid "/Edit/Paste to _new" msgstr "" #: src/mainwindow.c:1944 msgid "/Edit/Cr_op" msgstr "" #: src/mainwindow.c:1945 msgid "/Edit/_Delete" msgstr "" #: src/mainwindow.c:1946 msgid "/Edit/Silence selection" msgstr "" #: src/mainwindow.c:1947 msgid "/Edit/sep2" msgstr "" #: src/mainwindow.c:1948 msgid "/Edit/Select _all" msgstr "" #: src/mainwindow.c:1949 msgid "/Edit/Select none" msgstr "" #: src/mainwindow.c:1950 msgid "/Edit/sep3" msgstr "" #: src/mainwindow.c:1951 msgid "/Edit/Clear clipboard" msgstr "" #: src/mainwindow.c:1952 msgid "/Edit/sep4" msgstr "" #: src/mainwindow.c:1953 msgid "/Edit/Preferences" msgstr "" #: src/mainwindow.c:1954 msgid "/_View" msgstr "" #: src/mainwindow.c:1955 msgid "/View/Zoom _in" msgstr "" #: src/mainwindow.c:1956 msgid "/View/Zoom _out" msgstr "" #: src/mainwindow.c:1957 msgid "/View/Zoom to _selection" msgstr "" #: src/mainwindow.c:1958 msgid "/View/sep1" msgstr "" #: src/mainwindow.c:1959 msgid "/View/Zoom _all" msgstr "" #: src/mainwindow.c:1960 msgid "/View/sep2" msgstr "" #: src/mainwindow.c:1961 msgid "/View/_Time scale" msgstr "" #: src/mainwindow.c:1962 msgid "/View/_Horizontal zoom" msgstr "" #: src/mainwindow.c:1963 msgid "/View/_Vertical zoom" msgstr "" #: src/mainwindow.c:1964 msgid "/View/Sp_eed slider" msgstr "" #: src/mainwindow.c:1965 msgid "/View/Slider labels" msgstr "" #: src/mainwindow.c:1966 msgid "/View/Buffer position" msgstr "" #: src/mainwindow.c:1967 msgid "/_Cursor" msgstr "" #: src/mainwindow.c:1968 msgid "/Cursor/Set selection start" msgstr "" #: src/mainwindow.c:1970 msgid "/Cursor/Set selection end" msgstr "" #: src/mainwindow.c:1971 msgid "/Cursor/sep1" msgstr "" #: src/mainwindow.c:1972 msgid "/Cursor/Move to" msgstr "" #: src/mainwindow.c:1973 msgid "/Cursor/Move to/Beginning" msgstr "" #: src/mainwindow.c:1975 msgid "/Cursor/Move to/End" msgstr "" #: src/mainwindow.c:1976 msgid "/Cursor/Move to/Selection start" msgstr "" #: src/mainwindow.c:1978 msgid "/Cursor/Move to/Selection end" msgstr "" #: src/mainwindow.c:1980 msgid "/Cursor/Move" msgstr "" #: src/mainwindow.c:1981 msgid "/Cursor/Move/Left" msgstr "" #: src/mainwindow.c:1982 msgid "/Cursor/Move/Right" msgstr "" #: src/mainwindow.c:1983 msgid "/Cursor/Move/Left sample" msgstr "" #: src/mainwindow.c:1984 msgid "/Cursor/Move/Right sample" msgstr "" #: src/mainwindow.c:1985 msgid "/Cursor/Find zero-crossing" msgstr "" #: src/mainwindow.c:1986 msgid "/Cursor/Find zero-crossing/Left (all channels)" msgstr "" #: src/mainwindow.c:1988 msgid "/Cursor/Find zero-crossing/Right (all channels)" msgstr "" #: src/mainwindow.c:1990 msgid "/Cursor/Find zero-crossing/Left (any channel)" msgstr "" #: src/mainwindow.c:1992 msgid "/Cursor/Find zero-crossing/Right (any channel)" msgstr "" #: src/mainwindow.c:1994 msgid "/Cursor/sep2" msgstr "" #: src/mainwindow.c:1995 msgid "/Cursor/Position cursor..." msgstr "" #: src/mainwindow.c:1997 msgid "/_Play" msgstr "" #: src/mainwindow.c:1998 msgid "/Play/_Play from cursor" msgstr "" #: src/mainwindow.c:1999 msgid "/Play/Play _all" msgstr "" #: src/mainwindow.c:2000 msgid "/Play/Play se_lection" msgstr "" #: src/mainwindow.c:2001 msgid "/Play/_Stop" msgstr "" #: src/mainwindow.c:2002 msgid "/Play/sep1" msgstr "" #: src/mainwindow.c:2003 msgid "/Play/_Record..." msgstr "" #: src/mainwindow.c:2004 msgid "/Effec_ts" msgstr "" #: src/mainwindow.c:2005 msgid "/Effects/Fade _in" msgstr "" #: src/mainwindow.c:2006 msgid "/Effects/Fade o_ut" msgstr "" #: src/mainwindow.c:2007 msgid "/Effects/_Normalize" msgstr "" #: src/mainwindow.c:2008 msgid "/Effects/Normali_ze to..." msgstr "" #: src/mainwindow.c:2009 msgid "/Effects/_Volume adjust (fade)..." msgstr "" #: src/mainwindow.c:2010 msgid "/Effects/sep1" msgstr "" #: src/mainwindow.c:2011 msgid "/Effects/Convert sample_rate..." msgstr "" #: src/mainwindow.c:2012 msgid "/Effects/Convert sample _format..." msgstr "" #: src/mainwindow.c:2014 msgid "/Effects/B_yte swap" msgstr "" #: src/mainwindow.c:2015 msgid "/Effects/sep2" msgstr "" #: src/mainwindow.c:2016 msgid "/Effects/_Mix to mono" msgstr "" #: src/mainwindow.c:2017 msgid "/Effects/Add channe_l" msgstr "" #: src/mainwindow.c:2018 msgid "/Effects/Ma_p channels..." msgstr "" #: src/mainwindow.c:2019 msgid "/Effects/_Combine channels..." msgstr "" #: src/mainwindow.c:2020 msgid "/Effects/Add channels from other file..." msgstr "" #: src/mainwindow.c:2021 msgid "/Effects/sep3" msgstr "" #: src/mainwindow.c:2022 msgid "/Effects/_Speed adjustment..." msgstr "" #: src/mainwindow.c:2023 msgid "/Effects/Pipe through program..." msgstr "" #: src/mainwindow.c:2024 msgid "/Effects/sep4" msgstr "" #: src/mainwindow.c:2025 msgid "/Effects/Effects dialog..." msgstr "" #: src/mainwindow.c:2027 msgid "/Debug" msgstr "" #: src/mainwindow.c:2029 msgid "/Debug/Dummy effect" msgstr "" #: src/mainwindow.c:2030 msgid "/Debug/Dummy effect FP" msgstr "" #: src/mainwindow.c:2031 msgid "/Debug/Check opencount" msgstr "" #: src/mainwindow.c:2032 msgid "/Debug/Dump chunk info" msgstr "" #: src/mainwindow.c:2034 msgid "/_Help" msgstr "" #: src/mainwindow.c:2035 msgid "/Help/_Documentation" msgstr "" #: src/mainwindow.c:2036 msgid "/Help/_About" msgstr "" #: src/mainwindow.c:2040 msgid "/File/sep1" msgstr "" #: src/mainwindow.c:2041 msgid "/File/_Close" msgstr "" #: src/mainwindow.c:2042 msgid "/File/sep2" msgstr "" #: src/mainwindow.c:2043 msgid "/File/_Exit" msgstr "" #: src/mainwindow.c:2215 msgid "Load a file from disk" msgstr "" #: src/mainwindow.c:2222 msgid "Save the current file to disk" msgstr "" #: src/mainwindow.c:2231 msgid "Undo the last change" msgstr "" #: src/mainwindow.c:2239 msgid "Redo the last undo operation" msgstr "" #: src/mainwindow.c:2249 msgid "Cut out the current selection" msgstr "" #: src/mainwindow.c:2257 msgid "Copy the current selection" msgstr "" #: src/mainwindow.c:2265 msgid "Paste at cursor position" msgstr "" #: src/mainwindow.c:2273 msgid "Paste, overwriting the data after the cursor position" msgstr "" #: src/mainwindow.c:2283 msgid "Delete the selection" msgstr "" #: src/mainwindow.c:2292 msgid "Set selection start to cursor position" msgstr "" #: src/mainwindow.c:2301 msgid "Set selection end to cursor position" msgstr "" #: src/mainwindow.c:2311 msgid "Play from cursor position" msgstr "" #: src/mainwindow.c:2320 msgid "Play selected area" msgstr "" #: src/mainwindow.c:2329 msgid "Stop playing" msgstr "" #: src/mainwindow.c:2339 msgid "Loop mode (play over and over)" msgstr "" #: src/mainwindow.c:2349 msgid "Keep view and playback together" msgstr "" #: src/mainwindow.c:2362 msgid "Auto return to playback start" msgstr "" #: src/mainwindow.c:2376 src/recorddialog.c:874 msgid "Record" msgstr "" #: src/mainwindow.c:2385 src/recorddialog.c:983 msgid "Launch mixer" msgstr "" #: src/pipedialog.c:92 msgid "Command line: " msgstr "" #: src/pipedialog.c:99 msgid "Send wav header" msgstr "" #: src/pipedialog.c:153 msgid "Process output" msgstr "" #: src/pipedialog.c:178 #, c-format msgid "" "Output from command '%s':\n" "\n" msgstr "" #: src/pipedialog.c:201 #, c-format msgid "Could not create pipe: %s" msgstr "" #: src/pipedialog.c:216 #, c-format msgid "Error: fork: %s" msgstr "" #: src/pipedialog.c:268 msgid "Should not reach this point!" msgstr "" #: src/pipedialog.c:482 msgid "Command failed without returning any data" msgstr "" #: src/pipedialog.c:492 #, c-format msgid "Error: %s" msgstr "" #: src/player.c:294 msgid "The sound format of this file is not supported for playing." msgstr "" #: src/rateconv.c:97 #, c-format msgid "Error initialising sample rate conversion: %s" msgstr "" #: src/rateconv.c:162 #, c-format msgid "Error converting samplerate: %s\n" msgstr "" #: src/rateconv.c:201 #, c-format msgid "Error changing samplerate conversion ratio: %s\n" msgstr "" #: src/rateconv.c:323 msgid "Unexpected EOF in connection to subprocess" msgstr "" #: src/rateconv.c:327 #, c-format msgid "Error writing to subprocess: %s" msgstr "" #: src/rateconv.c:383 src/rateconv.c:405 #, c-format msgid "Error reading from sub process: %s" msgstr "" #: src/rateconv.c:413 msgid "SoX closed connection too early!" msgstr "" #: src/rateconv.c:599 msgid "(SoX) Simulated analog filtration" msgstr "" #: src/rateconv.c:605 msgid "(SoX) Polyphase interpolation" msgstr "" #: src/rateconv.c:612 msgid "Sample repeat/skip (low quality)" msgstr "" #: src/rawdialog.c:42 msgid "header size" msgstr "" #: src/rawdialog.c:73 msgid "Unknown file format" msgstr "" #: src/rawdialog.c:80 #, c-format msgid "" "The format of file '%s' could not be recognized.\n" "\n" "Please specify the sample format below." msgstr "" #: src/rawdialog.c:92 msgid "Header bytes: " msgstr "" #: src/recorddialog.c:207 src/recorddialog.c:671 src/recorddialog.c:918 msgid "(no limit)" msgstr "" #: src/recorddialog.c:314 msgid "Mild" msgstr "" #: src/recorddialog.c:316 msgid "Heavy" msgstr "" #: src/recorddialog.c:430 msgid "Update preset" msgstr "" #: src/recorddialog.c:435 msgid "Add preset" msgstr "" #: src/recorddialog.c:514 msgid "Custom format" msgstr "" #: src/recorddialog.c:552 msgid "" "The sign and endian-ness can usually be left at their defaults, but should " "be changed if you're unable to record or get bad sound." msgstr "" #: src/recorddialog.c:566 msgid "Name :" msgstr "" #: src/recorddialog.c:578 msgid "Presets:" msgstr "" #: src/recorddialog.c:593 msgid "Set format" msgstr "" #: src/recorddialog.c:601 msgid "Add/Update preset" msgstr "" #: src/recorddialog.c:654 msgid "" "Invalid time value. Time must be specified in the form (HH')MM:SS(.mmmm)" msgstr "" #: src/recorddialog.c:698 src/recorddialog.c:948 msgid "Format not selected" msgstr "" #: src/recorddialog.c:705 msgid "This format is not supported by the input driver!" msgstr "" #: src/recorddialog.c:710 msgid "Ready for recording" msgstr "" #: src/recorddialog.c:723 msgid "Peak: " msgstr "" #: src/recorddialog.c:724 msgid "Peak max: " msgstr "" #: src/recorddialog.c:725 msgid "RMS: " msgstr "" #: src/recorddialog.c:726 msgid "Clipping: " msgstr "" #: src/recorddialog.c:795 msgid "Resume recording" msgstr "" #: src/recorddialog.c:795 src/recorddialog.c:815 msgid "Pause recording" msgstr "" #: src/recorddialog.c:797 msgid "RecordStatus|Paused" msgstr "" #: src/recorddialog.c:798 src/recorddialog.c:823 msgid "RecordStatus|Recording" msgstr "" #: src/recorddialog.c:818 msgid "Finish" msgstr "" #: src/recorddialog.c:826 msgid "Overruns: " msgstr "" #: src/recorddialog.c:829 msgid "Bytes written: " msgstr "" #: src/recorddialog.c:830 msgid "Auto stop in: " msgstr "" #: src/recorddialog.c:894 msgid "Recording settings" msgstr "" #: src/recorddialog.c:901 msgid "Sample format: " msgstr "" #: src/recorddialog.c:916 msgid "Time limit: " msgstr "" #: src/recorddialog.c:924 msgid "Disable" msgstr "" #: src/recorddialog.c:930 msgid "Set" msgstr "" #: src/recorddialog.c:942 msgid "Input levels" msgstr "" #: src/recorddialog.c:947 msgid "Recording status: " msgstr "" #: src/recorddialog.c:952 msgid "Time recorded: " msgstr "" #: src/recorddialog.c:953 msgid "N/A" msgstr "" #: src/recorddialog.c:966 msgid "Start recording" msgstr "" #: src/recorddialog.c:977 msgid "Reset max peaks" msgstr "" #: src/sampleratedialog.c:87 msgid "" "(This changes the sample rate of \n" "the entire file, not just the selection)" msgstr "" #: src/sampleratedialog.c:92 msgid "New samplerate: " msgstr "" #: src/sampleratedialog.c:99 msgid "Method: " msgstr "" #: src/samplesizedialog.c:38 msgid "File already has the selected sample format" msgstr "" #: src/samplesizedialog.c:87 msgid "" "(This changes the sample type of the entire file, not just the selection)" msgstr "" #: src/samplesizedialog.c:99 msgid "Don't actually change the data (for repairing bad files etc)" msgstr "" #: src/sound-alsalib.c:73 msgid "ALSA Preferences" msgstr "" #: src/sound-alsalib.c:81 msgid "Playback device: " msgstr "" #: src/sound-alsalib.c:85 msgid "Recording device: " msgstr "" #: src/sound-alsalib.c:91 msgid "Event driven I/O" msgstr "" #: src/sound-alsalib.c:123 #, c-format msgid "Error opening ALSA device '%s' for recording: %s" msgstr "" #: src/sound-alsalib.c:125 #, c-format msgid "Error opening ALSA device '%s' for playback: %s" msgstr "" #: src/sound-alsalib.c:273 msgid "snd_pcm_hw_params_set_access failed" msgstr "" #: src/sound-alsalib.c:278 msgid "snd_pcm_hw_params_set_format failed" msgstr "" #: src/sound-alsalib.c:283 msgid "snd_pcm_hw_params_set_channels failed" msgstr "" #: src/sound-alsalib.c:288 msgid "snd_pcm_hw_params_set_rate failed" msgstr "" #: src/sound-alsalib.c:293 msgid "snd_pcm_hw_params_set_buffer_size_last failed" msgstr "" #: src/sound-alsalib.c:436 src/sound-alsalib.c:492 msgid "" msgstr "" #: src/sound-alsalib.c:536 msgid "" msgstr "" #: src/sound.c:167 msgid "SDL (output only)" msgstr "" #: src/sound.c:209 msgid "Dummy (no sound)" msgstr "" #: src/sound.c:334 #, c-format msgid "" "Invalid driver name: %s\n" "Using '%s' driver instead" msgstr "" #: src/sound-esound.c:59 #, c-format msgid "Couldn't connect to ESD daemon: %s" msgstr "" #: src/sound-esound.c:114 msgid "EsounD: Unable to open playback stream" msgstr "" #: src/sound-esound.c:130 msgid "EsounD: Unable to open recording stream" msgstr "" #: src/sound-esound.c:145 src/sound-esound.c:217 msgid "EsounD driver: select" msgstr "" #: src/sound-esound.c:157 msgid "EsounD driver: write" msgstr "" #: src/sound-esound.c:221 msgid "Esound connection closed by server" msgstr "" #: src/sound-esound.c:227 msgid "EsounD driver: read" msgstr "" #: src/sound-esound.c:241 msgid "jump delay" msgstr "" #: src/sound-esound.c:255 msgid "ESD preferences" msgstr "" #: src/sound-esound.c:263 msgid "" "If the cursor starts running too early when jumping, this delay should be " "increased." msgstr "" #: src/sound-esound.c:269 msgid "Jump delay:" msgstr "" #: src/sound-esound.c:278 msgid "" "Selecting the ESD host to connect to is done through the ESPEAKER " "environment variable." msgstr "" #: src/sound-jack.c:117 msgid "Invalid number of input ports." msgstr "" #: src/sound-jack.c:121 msgid "Invalid number of output ports." msgstr "" #: src/sound-jack.c:130 msgid "The client name change won't take effect until you restart the program." msgstr "" #: src/sound-jack.c:187 msgid " Input ports " msgstr "" #: src/sound-jack.c:188 msgid " Output ports " msgstr "" #: src/sound-jack.c:197 msgid "Jack Preferences" msgstr "" #: src/sound-jack.c:206 msgid "Client name: " msgstr "" #: src/sound-jack.c:223 msgid "Number of ports (0-8): " msgstr "" #: src/sound-jack.c:231 #, c-format msgid "Port #%d" msgstr "" #: src/sound-jack.c:244 msgid "Automatically connect input ports on startup" msgstr "" #: src/sound-jack.c:250 msgid "Automatically connect output ports on startup" msgstr "" #: src/sound-jack.c:402 msgid "Over/underrun in JACK driver" msgstr "" #: src/sound-jack.c:417 msgid "jack_get_ports returned NULL" msgstr "" #: src/sound-jack.c:433 #, c-format msgid "Connection from %s to %s failed: %s" msgstr "" #: src/sound-jack.c:480 msgid "Could not connect to the JACK server." msgstr "" #: src/sound-jack.c:494 msgid "Activation failed!" msgstr "" #: src/sound-jack.c:825 #, c-format msgid "" "With JACK, the only supported recording format is Floating-point, single " "precision, %d Hz" msgstr "" #: src/sound-oss.c:96 #, c-format msgid "Could not open '%s': %s" msgstr "" #: src/sound-oss.c:109 #, c-format msgid "Error in sound driver: ioctl failed: %s" msgstr "" #: src/sound-oss.c:216 #, c-format msgid "Error in sound driver: write failed: %s" msgstr "" #: src/sound-oss.c:229 #, c-format msgid "Error in sound driver: read failed: %s" msgstr "" #: src/sound-oss.c:253 src/sound-oss.c:385 #, c-format msgid "Error in sound driver: select failed: %s" msgstr "" #: src/sound-oss.c:440 msgid "OSS preferences" msgstr "" #: src/sound-oss.c:450 msgid "Playback device file:" msgstr "" #: src/sound-oss.c:459 msgid "Recording device file:" msgstr "" #: src/sound-oss.c:465 msgid "Avoid select calls (try this if recording locks up)" msgstr "" #: src/sound-portaudio.c:61 msgid "sound-portaudio: No output devices available!" msgstr "" #: src/sound-portaudio.c:63 msgid "sound-portaudio: No input devices available!" msgstr "" #: src/sound-portaudio.c:191 src/sound-portaudio.c:278 #, c-format msgid "Pa_OpenStream failed: %s\n" msgstr "" #: src/sound-portaudio.c:252 msgid "Buffer overrun!" msgstr "" #: src/sound-sdl.c:38 #, c-format msgid "Could not initialize SDL: %s" msgstr "" #: src/sound-sdl.c:89 #, c-format msgid "SDL: Couldn't open audio: %s" msgstr "" #: src/sound-sun.c:72 #, c-format msgid "SunAudio: Couldn't open %s" msgstr "" #: src/sound-sun.c:159 msgid "SunAudio: Error writing to sound device" msgstr "" #: src/sound-sun.c:241 msgid "SunAudio: Error reading from sound device" msgstr "" #: src/soxdialog.c:54 msgid "Echo" msgstr "" #: src/soxdialog.c:55 msgid "Echo sequence" msgstr "" #: src/soxdialog.c:56 msgid "Reverb" msgstr "" #: src/soxdialog.c:57 msgid "Chorus" msgstr "" #: src/soxdialog.c:58 msgid "Flanger" msgstr "" #: src/soxdialog.c:59 msgid "Phaser" msgstr "" #: src/soxdialog.c:60 msgid "Compress/Expand" msgstr "" #: src/soxdialog.c:61 msgid "Pitch adjust" msgstr "" #: src/soxdialog.c:62 msgid "Time stretch" msgstr "" #: src/soxdialog.c:63 msgid "DC Shift" msgstr "" #: src/soxdialog.c:64 msgid "Masking noise" msgstr "" #: src/soxdialog.c:65 msgid "Reverse" msgstr "" #: src/soxdialog.c:66 msgid "Earwax" msgstr "" #: src/soxdialog.c:67 msgid "Vibro" msgstr "" #: src/soxdialog.c:68 msgid "Lowpass filter (single-pole)" msgstr "" #: src/soxdialog.c:69 msgid "Highpass filter (single-pole)" msgstr "" #: src/soxdialog.c:70 msgid "Bandpass filter" msgstr "" #: src/soxdialog.c:71 msgid "Butterworth lowpass filter" msgstr "" #: src/soxdialog.c:72 msgid "Butterworth highpass filter" msgstr "" #: src/soxdialog.c:73 msgid "Butterworth bandpass filter" msgstr "" #: src/soxdialog.c:74 msgid "Butterworth bandreject filter" msgstr "" #: src/soxdialog.c:75 msgid "Sinc-windowed filter" msgstr "" #: src/soxdialog.c:312 msgid "Frequency: " msgstr "" #: src/soxdialog.c:317 src/soxdialog.c:324 src/soxdialog.c:483 #: src/soxdialog.c:485 msgid "Hz" msgstr "" #: src/soxdialog.c:327 msgid "Noise mode" msgstr "" #: src/soxdialog.c:387 msgid "Reverb time: " msgstr "" #: src/soxdialog.c:392 msgid "ms" msgstr "" #: src/soxdialog.c:397 msgid "Delay (ms) " msgstr "" #: src/soxdialog.c:400 msgid "Decay " msgstr "" #: src/soxdialog.c:404 msgid "Speed (Hz) " msgstr "" #: src/soxdialog.c:408 msgid "Depth (ms) " msgstr "" #: src/soxdialog.c:412 msgid "Modulation " msgstr "" #: src/soxdialog.c:415 msgid "Modulation|Sinusoidal" msgstr "" #: src/soxdialog.c:416 msgid "Modulation|Triangular" msgstr "" #: src/soxdialog.c:429 msgid "(Lines with delay=0 will be ignored.)" msgstr "" #: src/soxdialog.c:448 src/soxdialog.c:450 src/soxdialog.c:454 #: src/soxdialog.c:456 src/soxdialog.c:458 msgid "Input gain: " msgstr "" #: src/soxdialog.c:452 msgid "Output gain: " msgstr "" #: src/soxdialog.c:464 msgid "Width: " msgstr "" #: src/soxdialog.c:470 src/soxdialog.c:472 msgid "Bandwidth: " msgstr "" #: src/soxdialog.c:481 msgid "Filter type: " msgstr "" #: src/soxdialog.c:482 msgid "Low 6dB corner: " msgstr "" #: src/soxdialog.c:484 msgid "High 6db corner: " msgstr "" #: src/soxdialog.c:486 msgid "Window length: " msgstr "" #: src/soxdialog.c:488 msgid "Beta" msgstr "" #: src/soxdialog.c:491 msgid "Lowpass" msgstr "" #: src/soxdialog.c:492 msgid "Highpass" msgstr "" #: src/soxdialog.c:493 msgid "Bandpass" msgstr "" #: src/soxdialog.c:526 msgid "Attack integration time: " msgstr "" #: src/soxdialog.c:530 src/soxdialog.c:535 src/soxdialog.c:565 msgid " seconds" msgstr "" #: src/soxdialog.c:531 msgid "Decay integration time: " msgstr "" #: src/soxdialog.c:538 msgid "Input level (dB)" msgstr "" #: src/soxdialog.c:539 msgid "Output level (dB)" msgstr "" #: src/soxdialog.c:552 msgid "Post-processing gain: " msgstr "" #: src/soxdialog.c:556 msgid " dB" msgstr "" #: src/soxdialog.c:557 msgid "Initial volume: " msgstr "" #: src/soxdialog.c:561 msgid "Delay time: " msgstr "" #: src/soxdialog.c:570 msgid "Shift amount: " msgstr "" #: src/soxdialog.c:574 msgid "Peak limiter" msgstr "" #: src/soxdialog.c:578 msgid "Limiter gain: " msgstr "" #: src/soxdialog.c:591 msgid "Amount: " msgstr "" #: src/soxdialog.c:592 msgid " cents" msgstr "" #: src/soxdialog.c:593 msgid "Window width: " msgstr "" #: src/soxdialog.c:594 src/soxdialog.c:625 msgid " ms" msgstr "" #: src/soxdialog.c:595 msgid "Interpolation: " msgstr "" #: src/soxdialog.c:596 msgid "Fade: " msgstr "" #: src/soxdialog.c:605 msgid "Interpolation|Cubic" msgstr "" #: src/soxdialog.c:606 msgid "Interpolation|Linear" msgstr "" #: src/soxdialog.c:612 msgid "Fade|Cos" msgstr "" #: src/soxdialog.c:613 msgid "Fade|Hamming" msgstr "" #: src/soxdialog.c:614 msgid "Fade|Linear" msgstr "" #: src/soxdialog.c:615 msgid "Fade|Trapezoid" msgstr "" #: src/soxdialog.c:623 msgid "Factor: " msgstr "" #: src/soxdialog.c:624 msgid "Window size: " msgstr "" #: src/soxdialog.c:636 msgid "Speed: " msgstr "" #: src/soxdialog.c:637 msgid " Hz" msgstr "" #: src/soxdialog.c:638 msgid "Depth: " msgstr "" #: src/soxdialog.c:649 msgid "This effect has no options." msgstr "" #: src/soxdialog.c:723 msgid "Error creating pipe" msgstr "" #: src/soxdialog.c:730 msgid "Couldn't fork" msgstr "" #: src/soxdialog.c:745 #, c-format msgid "Error running 'sox -h': %s\n" msgstr "" #: src/soxdialog.c:747 msgid "Should not reach this point" msgstr "" #: src/soxdialog.c:762 msgid "Error reading sox output" msgstr "" #: src/soxdialog.c:794 msgid "Unable to detect supported SoX effects" msgstr "" #: src/soxdialog.c:832 msgid "Sox support couldn't be initialized" msgstr "" #: src/speeddialog.c:58 msgid "Speed:" msgstr "" #: src/statusbar.c:72 msgid "(no file loaded)" msgstr "" #: src/statusbar.c:235 msgid "Cursor: running" msgstr "" #: src/statusbar.c:237 msgid "Cursor: " msgstr "" #: src/statusbar.c:260 #, c-format msgid "View: [ %s - %s ]" msgstr "" #: src/statusbar.c:281 #, c-format msgid "Selection: %s+%s" msgstr "" #: src/statusbar.c:304 msgid "Processing data" msgstr "" #: src/statusbar.c:306 #, c-format msgid "%s... (Press ESC to cancel)" msgstr "" #: src/um.c:51 msgid "mhWaveEdit: " msgstr "" #: src/um.c:64 #, c-format msgid "mhWaveEdit: %s: %s\n" msgstr "" #: src/um.c:97 msgid "Message" msgstr "" #: src/um.c:117 msgid "Yes" msgstr "" #: src/um.c:125 msgid "No" msgstr "" #: src/um.c:318 msgid "Input" msgstr "" #: src/um.c:407 msgid "Choice" msgstr "" #: src/volumedialog.c:71 msgid "Calculating peak volume..." msgstr "" #: src/volumedialog.c:87 msgid "Start:" msgstr "" #: src/volumedialog.c:90 msgid "End:" msgstr "" #: src/volumedialog.c:109 msgid "Find top volume" msgstr "" #: src/document.c:230 #, c-format msgid "untitled #%d" msgstr "" #: src/document.c:282 msgid "" "Loading and then saving files with 'lossy' formats (like mp3 and ogg) leads " "to a quality loss, also for the unmodified parts of the file." msgstr "" #: src/session.c:87 msgid "Error opening session directory" msgstr "" #: src/session.c:104 src/session.c:164 #, c-format msgid "%s: Wrong file type" msgstr "" #: src/session.c:238 msgid "Could not create session file" msgstr "" #: src/session.c:280 msgid "" "The files that belonged to the crashed session have been recovered. Any " "files that are not saved will be removed permanently.\n" "\n" "(This notice is only shown once)" msgstr "" #: src/session.c:380 msgid "Suspended" msgstr "" #: src/session.c:380 src/session.c:381 msgid "Crash" msgstr "" #: src/session.c:381 msgid "Left files" msgstr "" #: src/session.c:391 #, c-format msgid "%s on %s(%d files, %ld bytes)" msgstr "" #: src/session.c:409 msgid "Sessions" msgstr "" #: src/session.c:419 msgid "" "Earlier sessions were found. Choose one to resume or start a new session." msgstr "" #: src/session.c:439 msgid "Resume selected" msgstr "" #: src/session.c:449 msgid "Delete selected" msgstr "" #: src/session.c:456 msgid "Start new session" msgstr "" #: src/session.c:462 msgid "Exit" msgstr "" #: src/mapchannelsdialog.c:116 msgid "This effect applies to the whole file, not just the selection" msgstr "" #: src/mapchannelsdialog.c:123 msgid "Output channels: " msgstr "" #: src/mapchannelsdialog.c:130 msgid "Map" msgstr "" #: src/mapchannelsdialog.c:137 msgid "Source" msgstr "" #: src/mapchannelsdialog.c:139 msgid "Destination" msgstr "" #: src/sandwichdialog.c:107 msgid "Align beginning of files" msgstr "" #: src/sandwichdialog.c:110 msgid "Align end of files" msgstr "" #: src/sandwichdialog.c:113 msgid "Align at marker: " msgstr "" #: src/sandwichdialog.c:126 msgid "Add channels from: " msgstr "" #: src/sandwichdialog.c:130 msgid "Alignment" msgstr "" mhwaveedit-1.4.24/po/mkinstalldirs000077500000000000000000000013251334022513400171610ustar00rootroot00000000000000#! /bin/sh # mkinstalldirs --- make directory hierarchy # Author: Noah Friedman # Created: 1993-05-16 # Public domain # $Id: mkinstalldirs,v 1.1 2005-08-12 14:33:08 magnush Exp $ errstatus=0 for file do set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` shift pathcomp= for d do pathcomp="$pathcomp$d" case "$pathcomp" in -* ) pathcomp=./$pathcomp ;; esac if test ! -d "$pathcomp"; then echo "mkdir $pathcomp" mkdir "$pathcomp" || lasterr=$? if test ! -d "$pathcomp"; then errstatus=$lasterr fi fi pathcomp="$pathcomp/" done done exit $errstatus # mkinstalldirs ends here mhwaveedit-1.4.24/po/pl.gmo000066400000000000000000002314531334022513400155010ustar00rootroot00000000000000%|1B.B @BNBQBpVBBmCCE7EE_F5GQNGGKHJAJ|J:]KK KKK KKKL)L9LML]L|LLLL LLLM%M )M7M HM VMdMsMMMMMM MNNN*N1N5N9N BNNN iNsNNNNNN0O6O EO%QOwO!OJOIP LPXP iPtPVP/PQ#+QOQgQ{QQ.Q-Q/R.AR pR}RRRRRR S$S7SQSlSS S SSSSST T 'T2THTZTnTTTT T TT T T U U U "U -U 8UBU(XUU"UUUUVV2V LVmVVVV!V V W W W-W?W ZW gWsW W W W WW WWW WWXX5X FX RX]XrXXX X XXXXXYY2YDY YY dYoYxYYYYY*Y Y!Y YiY hZ,sZ-Z#Z>Z 1[;[S[s[ [[[[[\ \%\7\G\P\]]3] F]P]]^ ^!^^ ^^ _/_ I_$T_y____,_-`.`3>` r`}`` `` ` ````` ``aab hu͑ԑ ۑ)'- U_s&?I]AY[CXaGV]:"Q^u&Yƚ 1ԛ&LÜ;"ϝZ=M 1Ȟ  : JW gtsF&*@&W~ ġҡ181j##   2EcMS[ kyY?"&5̥2|5lȨ-5c S^)c 8Ѫ٪26"6Y  ƫЫ(ԫ#!9Wi} #$ɬ -=YݭS7X ǰ۰ , 4B#J-n%#±!,-5c t]7߳ #&+mI U/_9MMչX>u>: %7Oo Ҿ#0Tn}Ͽ*;To   4!>%`1 *-6d$J: .< Q^Q{0*Fcw!:6;+7g!$DZx   #)M&e 9Mbs 'E%\"  ##Gd|#( -IXh z   3Tj{4Oe{   &/. ^!i | ,*Kv7 (435#i '* BO6R kw* %"H Q_&x 4/&<$[84MMRg  &#"#F"j8I%h  $ -)0A9W%-1K+b, \')$A-_+(A1j.2/.J1d!.-@C~")2FYn   $9I_h[=5;TcaI  " (%Hn 9"" 01F4x21+/>8n7 .O!l$ )3B2v+*.Lk !l&   &1QL_r:z (*AUD"fCp5@Tox& >4"s"COM15':]   ! /< Q]!,'=eWt  "7 @K `l $ S0& U5MRl'+2^s , DPo 2 +<NG] - 5 MXv#% 7GO_gm#P  (< e  v       Z P  W e |   & )  # $$ .I #x  .    * !B `d    b(l    #*!@0b0 )KEHVG-^oLl&,SawyV;-xTA L;>"z92 CQ `nuY. &/?o*   # $? d / 6 6 -"!-P!~! !!!!$!'!!"# ##-#<#eO#X#$$C$2 %@%*&'8(( ))1))B) 0*;*D*2M* *4*I* + +"+<+ C+ O+2Y+,++++,,,,2,#E,$i,,,,,,a-N-J.iP// 000000,151S1[1k1/s19111/2-?2=m2=2,23j~-YP&daq(hd16ow ?PZ:7 !=MXAFL sH q@i3G% P1yv2A,5^TOz^C0cJ\I,mX*FcUg( +r. "goBoC@` /QD!;3na7M\+>"RLsY``|N.s TQw^R']BN-}>6ebe <almlKgEn{?S&[ /Jk% tme7 }=<0y:nu {$!1K_G8r_iSSVD4[zU,<Tb-G5y}Wf&k? # :hjp % u2 ]\5~fCOxfF _)jwr#t|H$9DzQ3'9A[6V;E4cMvuN=lpL>]t$WB/~IOWIRZ*.8pU 'K ZHx*{hYVxib J49k8"0;|E)qvX@2)(+#d Test results (1 time unit = %f usec/sample) Window '%s' By setting starting volume and ending volume to the same value you get a simple amplification of the sound. Note that volumes above 100% may cause sound distortion. Use the 'Find top volume' to find out the maximum amplification possible without distortion. (You can use this for normalizing samples.) The 'Don't actually change the data' option can be used if the program was wrong about the file's format. This "byte swaps" the selected part. It can be used to repair damaged files where the byte order is wrong. Note that if the sound looks alright but plays wrong, you should not use this option, instead you should use the "byte-swap output" option in the Preferences dialog. This amplifies the sound as much as possible without getting clipping distortion. The "Normalize to..." item lets you specify which level to normalize to. This converts the sample format of the entire file. This converts the samplerate of the entire file to one you specify. There are different methods for doing this, usually the one in the top has the best quality but can take longer than the other methode. This copies the first channel to a new channel in the sound, converting mono to stereo etc. This creates a linear fade in or fade out effect. This effect changes the speed of the selection. The tone will change as well. This effect is for advanced users wanting to pipe raw audio data through an external program. The output of the program is read back and replaces the processed part. This effect lets you create a new sound by a linear combination of the old channels. This means you can do channel mixing / swapping / balance / panning / amplification etc. by entering different values. For example, to swap the left and right channel, you select that the new Channel 1 should be 0% of the old Channel 1 and 100% of the old Channel 2, and the new Channel 2 should be 100% of the old Channel 1 and 0% of the old Channel 2 This effect lets you select a starting volume and a ending volume and amplifies the selection fading from the starting volume to the ending volume. This mixes all channels of the file together to a mono sound. With this effect, you can change the number of channels in the file. You can also rearrange and add (i.e. mix) channels. gdb /usr/local/bin/mhwaveedit core | tee backtrace.txt Current chunk: History: and: * Add channel * Byte swap * Combine channels... * Convert sample format... * Convert samplerate... * Fade in/out * Map channels... * Mix to mono * Normalize, Normalize to... * Pipe through program... * Speed adjustment... * Volume adjust/fade... Advanced settings Dithering Driver options External applications Fallback format Hz Input audio Input controls Input ports Main window Output audio Output controls Output ports Playback settings Rate conversions Temporary file directories Temporary file settings Time format Variable speed View Window contents cents dB ms seconds%d channels%s is not a valid wav file%s kbit/s%s on %s(%d files, %ld bytes)%s... (Press ESC to cancel)%s: Expected '=': %s %s: Expected value: %s %s: Wrong file type'%s' is not a number!( Play first 3 seconds of selection (H')MM:SS.mmmm(H')MM:SS.t(Lines with delay=0 will be ignored.)(SoX) Polyphase interpolation(SoX) Simulated analog filtration(This changes the sample rate of the entire file, not just the selection)(This changes the sample type of the entire file, not just the selection)(expected) (no file loaded)(no limit)(number) Goto mark (use a negative number to place the cursor before instead of after the selected point)) Play last 3 seconds of selection +,= Zoom in , Play from cursor pos - Zoom out . Stop / Play selection /Cursor/Find zero-crossing/Cursor/Find zero-crossing/Left (all channels)/Cursor/Find zero-crossing/Left (any channel)/Cursor/Find zero-crossing/Right (all channels)/Cursor/Find zero-crossing/Right (any channel)/Cursor/Move/Cursor/Move to/Cursor/Move to/Beginning/Cursor/Move to/End/Cursor/Move to/Selection end/Cursor/Move to/Selection start/Cursor/Move/Left/Cursor/Move/Left sample/Cursor/Move/Right/Cursor/Move/Right sample/Cursor/Position cursor.../Cursor/Set selection end/Cursor/Set selection start/Cursor/sep1/Cursor/sep2/Debug/Debug/Check opencount/Debug/Dummy effect/Debug/Dump chunk info/Edit/Clear clipboard/Edit/Cr_op/Edit/Cu_t/Edit/Insert _silence/Edit/Paste _over/Edit/Paste to _new/Edit/Preferences/Edit/Select _all/Edit/Select none/Edit/Silence selection/Edit/_Copy/Edit/_Delete/Edit/_Mix paste/Edit/_Paste/Edit/_Redo/Edit/_Undo/Edit/sep1/Edit/sep2/Edit/sep3/Edit/sep4/Effec_ts/Effects/Add channe_l/Effects/Add channels from other file.../Effects/B_yte swap/Effects/Convert sample _format.../Effects/Convert sample_rate.../Effects/Effects dialog.../Effects/Fade _in/Effects/Fade o_ut/Effects/Ma_p channels.../Effects/Normali_ze to.../Effects/Pipe through program.../Effects/_Combine channels.../Effects/_Mix to mono/Effects/_Normalize/Effects/_Speed adjustment.../Effects/_Volume adjust (fade).../Effects/sep1/Effects/sep2/Effects/sep3/Effects/sep4/File/Save _as.../File/Save selection as.../File/_Close/File/_Exit/File/_Open.../File/_Save/File/sep1/File/sep2/Help/_About/Help/_Documentation/Move Down/Move Up/Move to Bottom/Move to Top/Play/Play _all/Play/Play se_lection/Play/_Play from cursor/Play/_Record.../Play/_Stop/Play/sep1/Rebuild Effect List/Restore Order/Sort by Author/Sort by Location/Sort by Name/Sort by Type/View/Sp_eed slider/View/Zoom _all/View/Zoom _in/View/Zoom _out/View/Zoom to _selection/View/_Horizontal zoom/View/_Time scale/View/_Vertical zoom/View/sep1/View/sep2/_Cursor/_Edit/_File/_Help/_Play/_View1. Enable core dumps: ulimit -c unlimited 16 bit PCM2. Run the program: mhwaveedit 24 bit PCM3. Make the program crash. You should now get a file named core or core.1234 in the directory you're in. 32 bit PCM4. Run gdb with the program and core file: 5. After gdb has loaded, use the command: bt 6. Quit gdb with the command: quit 7. Now you should have a back trace in the file backtrace.txt 8 bit PCM< Zoom all > Zoom to selection ALSA PreferencesAbout mhWaveEditActivation failed!Add channels from other fileAdd channels from: Add presetAdd/Update presetAdjusting speedAdvancedAfter you've filled in all the translations you want (you don't have to translate all the strings), mail in the po file to me (see contact info) and I'll add it to the next release. Align at marker: Align beginning of filesAlign end of filesAlignmentAll editing functions work non-destructively, that is, the file you're editing isn't actually changed until you save it (the effects also work this way). All supported effects can be found by choosing the 'Effects...' menu item. The effects are listed with names beginning with [B] for builtin effects, [L] for LADSPA effects, and [S] for SoX effects. Amount: AmplifyingAmplifying (by %3.1f%% / %+.1fdB)ApplyApply to: Applying effect '%s'Arrow keys Scroll left/right Attack integration time: Author: %sAuto dete_ct driver on each start-upAuto return to playback startAuto stop in: Auto-_reset speedAuto-detect from extensionAutomatically connect input ports on startupAutomatically connect output ports on startupAverage bitrateAvoid select calls (try this if recording locks up)BackgroundBandpassBandpass filterBandwidth: BetaBig endianBig-endianBlackBottomBrowse directoryBuffer overrun!Bug reportingBuilt-inButterworth bandpass filterButterworth bandreject filterButterworth highpass filterButterworth lowpass filterBy default, mhWaveEdit uses floating-point temporary files for storing processed results to avoid rounding until the file is saved. Bytes written: Calculating peak levelCalculating peak volume...CancelCh%dChannels: ChoiceChorusChunk %p has opencount=%d Client name: Clipping: CloseClose dialog after applying effectColorsCombine channelsCombining channelsCommand failed without returning any dataCommand line: Compiled %s %sCompress/ExpandConnection from %s to %s failed: %sConstant bitrateContactConversion test failed, between: Convert sample formatConvert samplerateConverting samplerateCopy the current selectionCopyright: %sCould not connect to the JACK server.Could not create pipe: %sCould not create session fileCould not find home directory. Using current directory as home directory.Could not get file position in %s: %sCould not initialize SDL: %sCould not open %s: %sCould not open '%s': %sCould not read from %s: %sCould not remove '%s': %sCould not seek in %s: %sCouldn't connect to ESD daemon: %sCouldn't forkCouldn't open %sCrashCtrl+(number) Set mark Ctrl+A Select all Ctrl+C Copy Ctrl+D Delete Ctrl+E Effects Ctrl+G Position cursor (Go to) Ctrl+H Position cursor at file start Ctrl+J Position cursor at file end Ctrl+K Position cursor at selection start Ctrl+L Position cursor at selection end Ctrl+O Open file Ctrl+P Preferences Ctrl+Q Selection start at cursor Ctrl+S Save file Ctrl+U Save selection as Ctrl+V Paste Ctrl+W Selection end at cursor Ctrl+X Cut Ctrl+Z Undo Ctrl+arrow Move cursor (and playback) half second Current sound driver: %sCurrently it is impossible to play and record at the same time, so the playback will stop when you record. CursorCursor: Cursor: runningCustom argumentCustom argument: Custom formatCustomize co_lors...Cut out the current selectionCut, copy and paste operations move the data around without modifying it, so these don't degrade the sound quality. Because of level differences, you may get a "step" at the start and end of the inserted part, which can cause a small clicking sound. DC ShiftDecay Decay integration time: DecodingDelay (ms) Delay time: Delete selectedDelete the selectionDepth (ms) Depth: DestinationDisableDisk editing _threshold: Display t_imes as: Distributed under GNU General Public License. For information, see the file COPYINGDon't actually change the data (for repairing bad files etc)DownDummy (no sound)ESD preferencesEach mhwaveedit process creates a session file in the .mhwaveedit directory called mhwaveedit-session---, where is the session ID number and is a character code showing the state of the session ('r' for running sessions). Earlier sessions were found. Choose one to resume or start a new session.EarwaxEchoEcho sequenceEditingEffect %s contains invalid port %sEffectsEnable _dithering for editingEnable _variable speed playbackEnable dithering for _playbackEncoding type: End:Endianness: Error changing samplerate conversion ratio: %s Error closing %s: %sError converting samplerate: %s Error creating link to '%s': %sError creating pipeError in sound driver: ioctl failed: %sError in sound driver: read failed: %sError in sound driver: select failed: %sError in sound driver: write failed: %sError initialising sample rate conversion: %sError launching mixer: fork: %sError opening ALSA device '%s' for playback: %sError opening ALSA device '%s' for recording: %sError opening session directoryError reading %s: %sError reading from %s: %sError reading from sub process: %sError reading sox outputError running 'sox -h': %s Error seeking in %s: %sError writing to subprocess: %sError: %sError: fork: %sEsounD driver: readEsounD driver: selectEsounD driver: writeEsounD: Unable to open playback streamEsounD: Unable to open recording streamEsound connection closed by serverEven if mhWaveEdit was originally built for editing wav files, it's also possible to load and save in a few other formats. mhWaveEdit always supports wav and raw files, but if it's compiled with the libsndfile library, mhWaveEdit supports a couple of other formats as well. Event driven I/OExitExpected driver name after --driver optionExtreme (higher quality)F1 Help F12 Record Factor: Fade: Fade|CosFade|HammingFade|LinearFade|TrapezoidFailed to open '%s'!Failed to write to '%s'!Feature requests are also welcome, report them to the mailing list or to the bug tracker. File already exists. Overwrite?File formatsFile type: FilesFilter type: Find top volumeFinding zero-crossingFinishFirst of all, look for bugs and report all bugs you find into the bug tracker or through e-mail. Sometimes a bug can get overlooked for a long time because nobody reports it, so don't be afraid to report bugs that have been there for a few releases. You don't have to provide fixes or very detailed information, although it helps of course. FlangerFloating-point, doubleFloating-point, singleFor bug reports, translation updates, patches and PayPal donations: Format not selectedFrequency: GeneralH,J Move cursor (and playback) 1/8 of view Header bytes: HeavyHelping outHigh 6db corner: HighpassHighpass filter (single-pole)How to create a backtrace: HzI,O Move cursor to nearest any-channel zero-crossing If a translation is incomplete, you're very welcome to translate the remaining untranslated messages and mail them in. Corrections to translations are also appreciated, but they may need to be checked with the previous translator before including them. If mplayer is installed, mhwaveedit can open all formats that it supports, for example the soundtrack of a video file. Since mplayer is only a player, these files can not be saved back after editing, you have to save the file into a supported format. If the cursor starts running too early when jumping, this delay should be increased.If you find a bug or flaw in the program that's not mentioned in the BUGS file, report the bug in the bug tracker (see contact info) or mail a bug report describing the bug to: magnus.hjorth@home.se If you speak a language other than English and mhWaveEdit isn't translated to your language, you can contribute a translation. To do that, copy the template mhwaveedit.pot in the po directory into a new file ll.po, where ll is your language code (see http://www.gnu.org/software/gettext/manual/html_node/gettext_221.html for a list of language codes). Ignoring extreme old window size/position values In case of a crash, please do not send me any core dumps. They are huge and completely useless to me. Instead, create a backtrace. Backtraces tell you exactly where the program crashed. In the sample view there is a grey vertical bar called the 'cursor'. The cursor follows the sound wave when you play the sound. You can position the cursor by clicking with the right (2:nd) mouse button. If you do this while you're playing a file, the playing will continue from the new cursor position. You can also position the cursor more exact by using the 'Position Cursor...' command on the Edit menu. Initial volume: InputInput gain: Input level (dB)Input levelsInsane (highest possible quality)Insert SilenceInterfaceInterpolation: Interpolation|CubicInterpolation|LinearInvalid driver name: %s Using '%s' driver insteadInvalid number of input ports.Invalid number of output ports.Invalid sample format or number of channels for this file formatInvalid time value. Time must be specified in the form (HH')MM:SS(.mmmm)It's possible to edit po-files by hand, but I recommend a program such as poEdit (http://www.poedit.org) for editing translations. Jack PreferencesJump delay:K,L Move cursor one sample Keep data in unmapped output channelsKeep main _window in front after applying effectKeyboard shortcutsL WaveformLadspa: Error scanning %sLaunch mixerLeftLeft filesLevel: Limiter gain: Little endianLittle-endianLoad FileLoad a file from diskLoadingLoading and then saving files with 'lossy' formats (like mp3 and ogg) leads to a quality loss, also for the unmodified parts of the file.Loop mode (play over and over)Low 6dB corner: LowpassLowpass filter (single-pole)MP3 PreferencesMailing list (you must be a subscriber before you can post messages): MapMap channelsMarksMasking noiseMessageMethod: Mi_xer utility: Microsoft WAV formatMildMixingMixing channelsModulation Modulation|SinusoidalModulation|TriangularMonoN/AName :New samplerate: NoNo errors detected!No file with that name!Noise modeNoneNormalize to...Note that for those translatable strings that look like "RecordStatus|Paused", you should ignore what's to the left and only translate the string to the right ("Paused" in this example). This convention is there to make it possible to translate the same string to different things depending on context. Number of ports (0-8): Number of recent files in File menu: OKOSS preferencesOgg VorbisOn this system, libsndfile is required to save floating-point wav files.Open with MPlayerOtherOutput _buffer size:Output channels: Output from command '%s': Output gain: Output level (dB)Over/underrun in JACK driverOverruns: Pa_OpenStream failed: %s Paste at cursor positionPaste, overwriting the data after the cursor positionPause recordingPeak limiterPeak max: Peak: PhaserPipe through programPitch adjustPlace cursor Play _mono files as stereoPlay from cursor positionPlay selected areaPlaybackPlayback device file:Playback device: PlayingPlaying a file is simple, just load the file and press the play button. The green play button plays from the current position. The yellow play button plays the current selection, or the entire file if nothing is selected. Stop the playback with the stop button (with the red square). Port #%dPosition cursorPost-processing gain: PreferencesPreparing tests..Presets:Process outputProcessing dataProgress barProject page with bug tracker, mailing list membership: QualityQuality: R WaveformRMS: Range test failed for format: Raw PCM dataReady for recordingRecordRecordStatus|PausedRecordStatus|RecordingRecordingRecording device file:Recording device: Recording is done with 'Record...' on the Play menu, or the Record button (the red circle). A dialog box will pop up where you can select what format you want to record in. After selecting the format, meters and numbers will appear showing info about the volume level of the sound input. Recording settingsRecording status: Redo the last undo operationReset max peaksResume recordingResume selectedReverbReverb time: ReverseRightRunning tests..SDL (output only)SDL: Couldn't open audio: %sSample format to try when the sound file's format isn't supported.Sample format: Sample rate: Sample repeat/skip (low quality)Sample type: Sample viewSave FileSave changes to %s?Save selection as ...Save the current file to diskSavingSeconds of silence: Selecting the ESD host to connect to is done through the ESPEAKER environment variable.SelectionSelection: %s+%sSend wav headerSessionsSetSet formatSet selection end to cursor positionSet selection start to cursor positionShift amount: Should not reach this pointShould not reach this point!Show _horizontal zoom slider by defaultShow _speed slider by defaultShow _time scale by defaultShow _vertical zoom slider by defaultSignedSignedness: Sinc-windowed filterSoX closed connection too early!Some notes on sound quality. Some of the settings you have changed will not be activated until you restart the programSoundSound data is normally stored as integer values. Therefore, whenever you normalize, adjust volume, decrease sample size or filter a sound, the result must be rounded. If you use 24 or 32 bit sample sizes, this is not really a problem, but if you use 8 or 16 bits sample size, this rounding causes a decrease in quality. SourceSox support couldn't be initializedSpeedSpeed (Hz) Speed effect: Speed:Speed: Standard (high quality)Start new sessionStart recordingStart:StereoStop playingSunAudio: Couldn't open %sSunAudio: Error reading from sound deviceSunAudio: Error writing to sound deviceSuspendedSyntax: %s [files] Temporary files are by default also stored in the ~/.mhwaveedit directory. Which directories to use can be set through the preferences dialog. To get the best performance, you should have one temporary directory for each local filesystem. The temporary files have names of the form "mhwaveedit-temp--nnnn-". Do NOT open or remove temporary files with the same pid number as a currently running mhWaveEdit. Testing conversion functions finished.Testing conversion functions:The 'Crop' function deletes all parts of the file that are not selected. The 'Cut' and 'Copy' functions work like in any other software. The 'Paste as new' function opens a new window and puts the clipboard contents into it. The 'Paste mix' function combines the clipboard data with the data at the cursor position. The 'Paste' function insert the clipboard contents at the cursor position. The 'Paste over' function works like 'Paste', except that it overwrites the data after the insert position. The 'Silence selection' function replaces the selected part with silence. To avoid clicks, the silent part is a line that meets the wave at the endpoints. The area where you 'see' the contents of the file you are editing, is called the 'sample view'. The client name change won't take effect until you restart the program.The configuration file is called config. It can be hand edited, but the easiest way is through 'Preferences' on the Edit menu. The file %s does not exist!The file %s is a compressed wav file. This program can only work with uncompressed wav files.The file %s is not a regular file!The file %s may be destroyed since the saving failed. Try to free up some disk space and save again. If you exit now the file's contents could be in a bad state. The file has not changed since last save. Press OK if you want to save it anyway?The file name '%s' has an extension unknown to the program. Please specify in which format this file should be saved.The files that belonged to the crashed session have been recovered. Any files that are not saved will be removed permanently. (This notice is only shown once)The format of file '%s' could not be recognized. Please specify the sample format below.The general rule when doing audio editing/processing is to not manipulate the data more than necessary and keep an original copy whenever you're processing your important files. The input was clipped %d times during processing.The mix paste function doesn't decrease quality, unless the peaks become too high and you get clipping. In that case you will get a warning message. The mixed result was clipped %d times.The playback speed can be varied by adjusting the slider to the far right. The sign and endian-ness can usually be left at their defaults, but should be changed if you're unable to record or get bad sound.The sound format of this file is not supported for playing.There already is only one channel!There are plenty of things you can do if you want to help the development of mhWaveEdit. This effect applies to the whole file, not just the selectionThis effect could not be loaded.This effect has no options.This format is not supported by the input driver!Time Code 24fpsTime Code 25fps (PAL)Time Code 29.97fps (NTSC)Time Code 30fpsTime limit: Time recorded: Time stretchTimeDisplay|SamplesTimes_cale format: To avoid rounding errors when applying more than one effect on the same data, floating-point temporary files can be used. However, this will increase disk and CPU usage.To save a file with a different file format, use "Save as..." and choose a format in the file type selection box. TopUnable to detect supported SoX effectsUnable to write data to %sUndo the last changeUnexpected EOF in connection to subprocessUnexpected end of fileUnexpected end of file reading from %sUnknown file formatUnknown file typeUnknown option '%s'UnsignedUpUpdate presetUse default settingsUse fast and noisy methodUse this setting by defaultUses double-precision mathValue for %s must be a number between %ld and %ldValue for '%s' must be a number between %f and %fValue for '%s' must not be above %fValue for '%s' must not be below %fVariable bitrate (default)Varispeed: VibroView _quality:View: [ %s - %s ]Volume adjust/fadeWarning: Unexpected error: %sWhen you want to start recording, press the "Start recording" button. When you've recorded everything you wanted to, press the Finish button and the record dialog will disappear and newly recorded sound will show up in a new window. WhiteWidth: Window length: Window size: Window width: With JACK, the only supported recording format is Floating-point, single precision, %d HzY,U Move cursor to nearest all-channel zero-crossing YesYou are saving a wav file larger than 2048MB. Such large files are non-standard and may not be readable by all programs. (this warning will not be displayed again)You can do normal editing while the file is playing. You can find the latest release of mhWaveEdit at: You can place marks in your file by holding down Ctrl and pressing a number from 0 to 9. This will place a mark (green vertical bar) with the same number at the current cursor position. You can later make the cursor go to that position again by just pressing the number. Setting and jumping to marks can be done while playing. To remove a mark, jump to the mark and set it again. You can use the cursor to refine the selection. Use the 'Selection start at cursor' and 'Selection end at cursor' buttons to move the selection starting point or the selection end point to the current cursor position. You can also drag the selection endpoints using the mouse. You have mapped more than one output port to channel '%s'. You can only map one output port to each channel.You have no open file to apply the effect to!You make selections by dragging the mouse over the sample view. You can hear what you've currently selected by clicking on the "play selection" button (the button with the yellow arrow) or by selecting 'Play selection' from the Play menu. Zero-level_Add_Auto-start playback when jumping to mark_Browse..._Byte-swap output (try this if playback sounds horrible)_Cancel_Close_Down_Draw waveform a second time with improved quality_Driver:_Keep cursor in center of view when following playback_Keep sound driver opened (to avoid start/stop clicks)_OK_Preview_Remember window sizes/positions_Remove_Settings_Up_Update cursor information while playing_Use floating-point temporary filesafter beginning of fileafter current cursor positionafter end of fileafter selection endafter selection startbytesheader sizehttp://gna.org/projects/mhwaveedit http://gna.org/projects/mhwaveedit/ jack_get_ports returned NULLjump delaymagnus.hjorth@home.se mhWaveEdit HelpmhWaveEdit checks on startup for leftover temporary files and lets the user open them. After opening a crashed session, the files can be saved or thrown away. mhWaveEdit creates a directory ~/.mhwaveedit where it stores configuration information. mhWaveEdit has a few simple effects, which are available from the 'Effects' menu. mhWaveEdit has basic support for mp3 and ogg formats. For this to work you need to have LAME installed for mp3 support, and OggDec/OggEnc for Ogg support. If you have these programs, you can open and save mp3/ogg files just like any other file format. mhWaveEdit is a graphical program for editing sound files. It is completely free (GPL). mhWaveEdit supports LADSPA effects and can also make use of most of the SoX utility's effects. To find the LADSPA plugins the environment variable LADSPA_PATH must be properly set up. mhWaveEdit: mhWaveEdit: %s (%s): %d Hz, %smhWaveEdit: %s: %s mhwaveedit-discuss@gna.org msnumber of recent filesputenv failed!sample ratesamplessamples/pixelsecondssnd_pcm_hw_params_set_access failedsnd_pcm_hw_params_set_buffer_size_last failedsnd_pcm_hw_params_set_channels failedsnd_pcm_hw_params_set_format failedsnd_pcm_hw_params_set_rate failedsound-portaudio: No input devices available!sound-portaudio: No output devices available!unsetenv failed!untitled #%dProject-Id-Version: mhwaveedit_pl Report-Msgid-Bugs-To: POT-Creation-Date: 2018-08-25 11:56+0200 PO-Revision-Date: 2011-02-24 10:00+0100 Last-Translator: Robert Wojewódzki Language-Team: polish Language: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Wyniki testów (1 jednostka czasu = %f usec/próbka) Okno '%s' Przez ustawienie głośności startowej i głośności końcowej na tą samą wartość dostaniesz proste wzmocnienie dźwięku. Zauważ że głośności powyżej 100% mogą powodować zakłócenia dźwięku. Użyj 'Znajdź szczytową głośność' żeby znaleźć maksymalne możliwe wzmocnienie bez zakłóceń. (Możesz to użyć dla normalizacji próbek.) Opcja 'Nie zmieniaj aktualnie danych' może być użyta jeśli program pomylił się co do formatu pliku. To "Zamiana bajtu" wybranej części. Może być użyta żeby naprawić uszkodzone pliki gdzie porządek bajtów jest zły. Zauważ że jeśli dźwięk wygląda w porządku ale odtwarza się źle, nie powinieneś użyć tej opcji, zamiast tego powinieneś użyć opcji "zamiana-bajtu wyjście" w okienku dialogowym Ustawień. To wzmacnia dźwięk jak tylko możliwe bez obcinania zakłóceń. Pozycja "Normalizuj do..." pozwala określić do jakiego poziomu normalizować. To konwertuje format próbki całego pliku. To konwertuje próbkowanie całego pliku do jednego określonego. Są różne metody żeby to zrobić, najczęściej to na szczycie ma najlepszą jakość ale może zabrać więcej czasu niż inna metoda. To skopiuje pierwszy kanał do nowego kanału w dźwięku, konwertując mono do stereo itp. To tworzy a liniowy efekt wzmocnienia lub wyciszenia. Ten efekt zmienia prędkość wyboru. Brzmienie będzie zmienione także. Ten efekt jest dla zaawansowanych użytkowników chcących skanalizować surowe dane audio przez zewnętrzny program. Wyjście programu jest odczytywane ponownie i zamienia przetwarzaną część. Ten efekt pozwala stworzyć nowy dźwięk przez liniowe połączenie starych kanałów. To znaczy że możesz zrobić miksować kanał / zamiana / balans / przesuwanie / wzmocnienie itp. wprowadzając różne wartości. Na przykład, żeby zamienić lewy i prawy kanał, wybierasz że nowy Kanał 1 powinien być 0% starego Kanału 1 i 100% starego Kanału 2, i nowy Kanał 2 powinien być 100% starego Kanału 1 i 0% starego Kanału 2 Ten efekt pozwala wybrać głośność początkową i głośność końcową i wzmacnia wybór przechodząc z początkowej głośności do końcowej głośności. To miesza wszystkie kanały pliku razem do dźwięku mono. Tym efektem, możesz zmienić liczbę kanałów w pliku. Możesz też poprawić i dodać (np. miksować) kanały. gdb /usr/local/bin/mhwaveedit core | tee backtrace.txt Obecny kawałek: Historia: i: * Dodaj kanał * Zamiana bajtu * Połącz kanały... * Konwertuj format próbki... * Konwertuj próbkowanie... * Wzmocnienie/wyciszenie * Mapa kanałów... * Mieszaj do mono * Normalizuj, Normalizyj do... * Rura za pomocą programu... * Regulacja prędkości... * Głośność dostosuj/wycisz... Ustawienia zaawansowane Rozpraszanie Opcje sterownika Zewnętrzne aplikacje Awaryjny format Hz Wejście audio Kontrolki wejścia Porty wejścia Główne okno Wyjście audio Kontrolki wyjścia Porty wyjścia Ustawienia odtwarzania Współczynnik konwersji Katalogi plików tymczasowych Ustawienia pliku tymczasowego Format czasu Zmienna szybkość Wygląd Zawartość okna centy dB ms sekundy%d kanałów%s nie jest dobrym plikiem WAV%s kbit/s%s na %s(%d plików, %ld bajtów)%s... (Naciśnij ESC żeby anulować)%s: Spodziewane '=': %s %s: Spodziewana wartość: %s %s: Zły rodzaj pliku%s nie jest liczbą!( Odtwórz pierwsze 3 sekundy wyboru (G')MM:SS.mmmm(G')MM:SS.t(Linie z opóźnieniem=0 będą zignorowane.)(SoX) Wielofazowa interpolacja(SoX) Symulowana filtracja analogowa(To zmieni częstotliwość próbkowania całego pliku, nie tylko wyboru)(To zmieni rodzaj próbki całego pliku, nie tylko wyboru)(oczekiwany) (nie wczytano pliku)(bez limitu)(liczba) Idź do znaku (użyj ujemną liczbę żeby umieścić kursor przed zamiast po wybranym punkcie)) Odtwórz ostanie 3 sekundy wyboru +,= Powiększenie , Odtwórz od pozycji kursora - Pomniejszenie . Stop / Odtwórz wybrane /Kursor/Znajdź przejście zerowe/Kursor/Znajdź przejście zerowe/Lewe (wszystkie kanały)/Kursor/Znajdź przejście zerowe/Lewe (jakiś kanał)/Kursor/Znajdź przejście zerowe/Prawe (wszystkie kanały)/Kursor/Znajdź przejście zerowe/Prawe (jakiś kanał)/Kursor/Przesuń/Kursor/Przesuń do/Kursor/Przesuń do/Początek/Kursor/Przesuń do/Koniec/Kursor/Przesuń do/Koniec wyboru/Kursor/Przesuń do/Początek wyboru/Kursor/Przesuń/Lewo/Kursor/Przesuń/Lewa próbka/Kursor/Przesuń/Prawo/Kursor/Przesuń/Prawa próbka/Kursor/Pozycja kursora.../Kursor/Ustaw koniec wyboru/Kursor/Ustaw początek wyboru/Kursor/sep 1/Kursor/sep 2/Debuguj/Debuguj/Sprawdź liczbę otwartych/Debuguj/Sztuczny efekt/Debuguj/Zrzuć informację o kawałku/Edycja/Wyczyść schowek/Edycja/_Przytnij/Edycja/_Wytnij/Edycja/Wstaw _ciszę/Edycja/Wklej _ponad/Edycja/Wklej do _nowego/Edycja/Ustawienia/Edycja/Wybierz _wszystko/Edycja/Wybierz nic/Edycja/Wybór ciszy/Edycja/_Skopiuj/Edycja/_Usuń/Edycja/Wklej _miks/Edycja/_Wklej/Edycja/_Ponów/Edytcja/_Cofnij/Edycja/sep 1/Edycja/spe 2/Edycja/sep 3/Edycja/sep 4/_Efekty/Efekty/Dodaj _kanał/Efekty/Dodaj kanały z innego pliku.../Efekty/_Zamiana bajtu/Efekty/Konwersja _formatu próbki.../Efekty/Konwersja _próbkowania.../Efekty/Efekty okno dialogowe.../Efekty/_Wzmocnienie/Efekty/_Ściszenie/Efekty/_Mapuj kanały.../Efekty/Normalizuj _do.../Efekty/Rura za pomocą programu.../Efekty/_Połącz kanały.../Efekty/_Miksuj do mono/Efekty/_Normalizacja/Efekty/Dostosowanie _szybkości...Efekty/_Dostosuj głośność (zanik).../Efekty/sep 1/Efekty/sep 2/Efekty/sep 3/Efekty/sep 4/Plik/Zapisz _jako.../Plik/Zapisz wybór jako.../Plik/_Zamknij/Plik/_Wyjście/Plik/_Otwórz.../Plik/_Zapisz/Plik/sep 1/Plik/sep 2/Pomoc/_O/Pomoc/_Dokumentacja/Opuść/Podnieś/Przesuń na dno/Przesuń do szczyt/Odtwarzaj/Odtwarzaj _wszystko/Odtwarzaj/Odtwarzaj _wybór/Odtwarzaj/_Odtwarzaj od kursora/Odtwarzaj/_Nagraj.../Odtwarzaj/_Stop/Odtwarzaj/sep 1/Przebuduj listę efektu/Przywróc porządek/Sortuj według Autora/Sortuj według położenia/Sortuj według nazwy/Sortuj według rodzaju/Widok/Suwak _szybkości/Widok/Powiększ _wszystko/Widok/_Powiększenie/Widok/_Pomniejszenie/Widok/Powiększ do _wyboru/Widok/Powiększ _poziomo/Widok/_Skala czasu/Widok/Powiększ _pionowo/Widok/sep 1/Widok/sep 2/_Kursor/_Edycja/_Plik/_Pomoc/_Odtwarzaj/_Widok1. Włącz zrzut pamięci: ulimit -c unlimited 16 bit PCM2. Uruchom program: mhwaveedit 24 bit PCM3. Zrób zawieszenie się programu. Powinieneś teraz dostać plik nazwany core lub core.1234 w katalogu w którym jesteś. 32 bit PCM4. Uruchom gdb z programem i plikiem core: 5. Gdy wczyta się gdb, użyj komendy: bt 6. Opuść gdb komendą: quit 7. Teraz powinieneś mieć ślad w pliku backtrace.txt 8 bit PCM< Powiększenie wszystkiego > Powiększenie wyboru Ustawienia ALSAO mhWaveEditUaktywnienie nieudane!Dodaj kanały z innego plikuDodaj kanały z: Dodaj standardoweDodaj/Uaktualnij ustawienia początkoweDostosowanie szybkościZaawansowaneGdy wypełnisz wszystkie tłumaczenia które chcesz (nie musisz tłumaczyć wszystkich łańcuchów), wyślij mail z plikiem po do mnie (spójrz informacja kontaktowa) i dodam ją do następnego wydania. Wyrównaj na znaczniku: Wyrównaj początek plikówWyrównaj koniec plikówWyrównanieWszystkie funkcje edycji działają nie-destrukcyjnie, to jest, plik który edytujesz nie jest aktualnie zmianiony zanim go nie zapiszesz (efekty też działają w ten sposób). Wszystkie obsługiwane efekty mogą być znalezione wybierając pozycję menu 'Efekty...'. Efekty są w liście z nazwami rozpoczynającymi się od [B] dla wbudowanych efektów, [L] dla efektów LADSPA, i [S] dla efektów SoX. Kwota: WzmacnianieWzmacnianie (przez %3.1f%% / %+.1fdB)ZastosujZastosuj do: Zastosowanie efektu '%s'Klaw strzałek Przewijanie lewo/prawo Czas ataku integracji: Autor: %sAutomatycznie _wykryj sterownik przy każdym starcieAutomatycznie powróć do początku odtwarzaniaAutomatyczny stop w: Automatyczny _reset szybkościAutomatyczne wykrycie z rozszerzeniaAutomatycznie połącz z portami wejściowymi na starcieAutomatycznie połącz z portami wyjścia na starcieŚrednia bitrateUnikaj wybierania połączeń (spróbuj tego jeśli nagrywanie zamraża się)TłoŚrodkowoprzepustowyFiltr środkowoprzepustowyPasmo: BetaBig endianBig-endianCzarnyDnoPrzeglądaj katalogPrzekroczenie bufora!Raportowanie błędówWbudowaneFiltr środkowoprzepustowy ButterworthFiltr środkowozaporowy ButterworthFiltr górnoprzepustowy ButterworthFiltr dolnoprzepustowy ButterworthDomyślnie, mhWaveEdit używa zmiennoprzecinkowych plików tymczasowych dla przechowywania wyników przetwarzania żeby uniknąć zaokrąglania do czasu zapisania pliku. Bajty zapisane: Obliczanie poziomu szczytowegoObliczanie głośności szczytowej...ZrezygnujCh%dKanały: WybórChórKawałek %p ma liczbę otwartych=%d Nazwa klienta: ObcinanieZamknijZamknij okno dialogowe po zastosowaniu efektuKoloryPołącz kanałyPołącznie kanałówKomenda nie powiodła się bez zwrócenia żadnych danychLinia komend: Skompilowane %s %sSkompresuj/RozwińPołączenie od %s do %s nieudane: %sStała bitrateKontaktTest konwersji nie powiódł się pomiędzy: Konwersja formatu próbkiKonwersja próbkowaniaKonwertowanie częstotliwości próbkowaniaSkopiuj bieżący wybórPrawa autorskie: %sNie można połączyć się z serwerem JACK.Nie można utworzyć rury: %sNie można utworzyć pliku sesjiNie można znaleźć katalogu domowego. Użycie bieżącego katalogu jako katalogu domowego.Nie można dostać pozycji pliku w %s: %sNie można zainicjować SDL: %sNie można otworzyć %s: %sNie można otworzyć '%s': %sNie można czytać z %s: %sNie można usunąć '%s': %sNie można wyszukać w %s: %sNie można połączyć się z demonem ESD: %sNie można odgałęzićNie można otworzyć %sWypadekCtrl+(liczba) Ustaw znak Ctrl+A Wybierz wszystko Ctrl+C Skopiuj Ctrl+D Usuń Ctrl+E Efekty Ctrl+G Pozycja kursora (Idź do) Ctrl+H Pozycja kursora na początku pliku Ctrl+J Pozycja kursora na końcu pliku Ctrl+K Pozycja kursora na początku wyboru Ctrl+L Pozycja kursora na końcu wyboru Ctrl+O Otwórz plik Ctrl+P Ustawienia Ctrl+Q Początek wyboru w pozycji kursora Ctrl+S Zapisz plik Ctrl+U Zapisz wybór jako Ctrl+V Wklej Ctrl+W Koniec wyboru w pozycji kursora Ctrl+X Wytnij Ctrl+Z Cofnij Ctrl+strzałka Przenieś kursor (i odtwarzanie) o pół sekundy Obecny sterownik dźwięku: %sObecnie nie jest możliwe odtwarzać i nagrywać w tym samym czasie, zatem odtwarzanie zatrzyma się gdy będziesz nagrywał. KursorKursor: Kursor: uruchomionyZwyczajny argumentZwyczajny argument: Zwyczajny formatDostosuj _kolory...Wytnij bieżący wybórOperacje wytnij, skopiuj i wklej przeniosą dane bez ich modyfikacji, zatem nie pogorszą jakości dźwięku. Z powodu różnic poziomu, możesz dostać "krok" na starcie i końcu dodanej części, który może spowodować małe trzaski dźwięku. Zmiana DCZanik Czas zaniku integracji: DekodowanieOpóźnienie (ms) Czas opóźnienia: Wybrano usunięcieUsuń wybórGłębokość (ms) Głębokość: Miejsce przeznaczeniaWyłącz_Próg edytowanego dysku: Wyświetl _czasy jako: Rozpowszechniany według GNU General Public License. Dla informacji, zobacz plik KOPIOWANIEAktualnie nie zmieni danych (dla naprawy złych plików itp.)DółSztuczny (bez dźwięku)Ustawienia ESDKażdy proces mhwaveedit tworzy plik sesji w katalogu .mhwaveedit zwany mhwaveedit-session---, gdzie to numer sesji ID i to kody znaku pokazujące stan sesji ('r' dla uruchomionych sesji). Wcześniejsze sesje zostały znalezione. Wybierz jedną by powrócić lub wystartuj nową sesję.WoskowinaEchoSekwencja echoEdytowanieEfekt %s zawiera nieważny port %sEfektyWłącz _rozpraszanie dla edycjiWłącz _zmienną szybkość odtwarzaniaWłącz rozpraszanie dla _odtwarzaniaRodzaj kodowania: Koniec:Endianness: Błąd zmiany współczynnika konwersji próbkowania: %s Błąd zamknięcia %s: %sBłąd konwersji próbkowania: %s Błąd tworzenia linku do '%s': %sBłąd tworzenia ruryBłąd w sterowniku dźwięku: ioctl nieudane: %sBłąd w sterowniku dźwięku: czytanie nieudane: %sBłąd w sterowniku dźwięku: wybór nieudany: %sBłąd w sterowniku dźwięku: zapis nieudany: %sBłąd inicjacji konwersji próbkowania: %sBłąd uruchomienia miksera: część pliku: %sBłąd otwarcia urządzenia ALSA '%s' do odtwarzania: %sBłąd otwarcia urządzenia ALSA '%s' do nagrywania: %sBłąd otwarcia katalogu sesjiBłąd czytania %s: %sBłąd czytania z %s: %sBłąd czytania z podprocesu: %sBłąd czytania wyjścia soxBłąd uruchomienia 'sox -h': %s Błąd wyszukiwania w %s: %sBłąd zapisywania do podprocesu: %sBłąd: %sBłąd: część pliku: %sSterownik EsounD: czytajSterownik EsounD: wybierzSterownik EsounD: zapiszEsounD: Nie można otworzyć strumienia odtwarzaniaEsounD: Nie można otworzyć strumienia nagrywaniaPołączenie Esound zamknięte przez serwerNawet jeśli mhWaveEdit był oryginalnie zbudowany dla edycji plików wav, jest też możliwe wczytywać i nagrywać w kilku innych formatach. mhWaveEdit zawsze obsługuje pliki wav i raw, ale jeśli jest skompilowany z biblioteką libsndfile, mhWaveEdit obsługuje kilka innych formatów także. Przez zdarzenie I/OWyjścieSpodziewana nazwa sterownika po opcji --driverEkstremalna (wyższa jakość)F1 Pomoc F12 Nagranie Współczynnik: Zanik: Fade|CosFade|HammingaFade|LiniowaFade|TrapezowaNie udało się otworzyć '%s'!Nie udało się zapisać do '%s'!Prośby o funkcje są także mile widziane, zgłaszaj je na listę mailingową lub do tropiciela błędów. Plik już istnieje. Nadpisać?Formaty plikuRodzaj pliku: PlikiRodzaj filtra: Znajdź maksymalną głośnośćZnajdowanie przejścia zerowegoUkończonePrzede wszystkim, szukaj błędów i zaraportuj wszystkie znalezione błędy w tropicielu błędów lub poprzez e-mail. Czasem możesz mieć błąd przeoczony od długiego czasu ponieważ nikt go nie zaraportował, zatem nie bój się raportować błędów które są od kilku wydań. Nie musisz dostarczać poprawek lub bardzo szczegółowej informacji, chociaż to oczywiście pomoże. FlangerZmiennoprzecinkowy podwójnyZmiennoprzecinkowy pojedyńczyDla raportowania błędów, uaktualniania tłumaczeń, łatek i darowizn PayPal: Format nie wybranyCzęstotliwość: OgólneH,J Przenieś kursor (i odtwarzanie) 1/8 widoku Bajty nagłówka: CiężkiPomagającWysoki róg 6 db: WysokoprzepustowyFiltr wysokoprzepustowy (jednobiegunowy)Jak stworzyć ślady: HzI,O Przesuń kursor do najbliższego jakiegoś kanału przejścia zerowego Jeśli tłumaczenie jest niekompletne, jesteś bardzo zapraszany by przetłumaczyć pozostające nieprzetłumaczone treści i wysłać je mailem. Korekty tłumaczenia są także mile widziane, ale one mogą potrzebować być sprawdzone z poprzednim tłumaczem przed ich załączeniem. Jeśli jest zainstalowany mplayer, mhwaveedit może otworzyć wszystkie formaty które on obsługuje, na przykład ścieżkę dźwiękową pliku video. Jako że mplayer to tylko odtwarzacz, te pliki nie mogą być zapisane ponownie po edycji, musisz zapisać plik w obsługiwanym formacie. Jeśli kursor uruchomi się zbyt wcześnie podczas skakania, to opóźnienie powinno być zwiększone.Jeśli znajdziesz błąd lub wadę programu która nie jest wymieniona w pliku BUGS, zaraportuj ten błąd w tropicielu błędów (spójrz informacja kontaktu) lub wyślij mail z raportem błędu opisującym błąd do: magnus.hjorth@home.se Jeśli mówisz językiem innym niż angielski i mhWaveEdit nie jest przetłumaczony na twój język, możesz przyczynić się do tłumaczenia. Żeby to zrobić, skopiuj szablon mhwaveedit.pot w katalogu po do nowego pliku ll.po, gdzie ll to twój kod języka (spójrz http://www.gnu.org/software/gettext/manual/html_node/gettext_221.html dla listy kodów języków). Ignorowanie ekstremalnie starego okna rozmiar/pozycja wartości W przypadku zawieszenia się komputera, proszę nie wysyłaj mi zrzutów pamięci. One są ogromne i kompletnie bezużyteczne dla mnie. Zamiast, stwórz ślad. Ślady powiedzą dokładnie gdzie program zawiesił się. W prostym widoku jest szary pionowy pasek zwany 'kursor'. Kursor podąża za falą dźwięku gdy odtwarzasz dźwięk. Możesz umieścić kursor klikając prawym (drugim) przyciskiem myszy. Jeśli to zrobisz podczas odtwarzania pliku, odtwarzanie będzie kontynuowane od nowej pozycji kursora. Możesz także umieścić kursor bardziej dokładnie używając komendy 'Pozycja Kursora...' w menu Edycja. Początkowa głośność: WejścieWzmocnienie wejścia: Poziom wejścia (dB)Poziomy wejścioweSzalona (najwyższa możliwa jakość)Wstaw CiszęInterfejsInterpolacja: Interpolation|SześciennaInterpolation|LiniowaNieważna nazwa sterownika: %s Użyje w zamian sterownika '%s'Nieważna liczba portów wejścia.Nieważna liczba portów wyjścia.Niedobry format próbki lub liczba kanałów dla tego formatu plikuNieważna wartość czasu. Czas musi być określony w formie (GG')MM:SS(.mmmm)Jest możliwa edycja plików po ręcznie, ale rekomenduję program taki jak poEdit (http://www.poedit.org) dla edycji tłumaczeń. Ustawienia JackSkok opóźnienia:K,L Przenieś kursor o jedną próbkę Zachowaj dane w niezmapowanych kanałach wyjściowychZachowaj główne _okno na wierzchu po zastosowaniu efektuSkróty klawiaturoweL FalaLadspa: Błąd skanowania %sUruchom mikserLewyPliki lewePoziom: Ogranicznik wzmocnienia: Little endianLittle-endianWczytaj plikWczytaj plik z dyskuWczytywanieWczytanie i następnie zapisanie plików z formatów 'stratnych' (jak mp3 i ogg) prowadzi do straty jakości, także dla niezmodyfikowanych części pliku.Tryb pętli (odtwarzaj w kółko)Niski róg 6dB: NiskoprzepustowyFiltr dolnoprzepustowy (jednobiegunowy)Ustawienia MP3Lista mailingowa (musisz być abonentem zanim będziesz mógł wysyłać wiadomości): MapaMapa kanałówZnakiMaskowanie szumuWiadomościMetoda: Narzędzie _miksera: Format Microsoft WAVŁagodnyMiksowanieMiksowanie kanałówModulacja Modulation|Sinusoida lModulation|TrójkątnaMonoNiedostępnyNazwaNowa częstotliwość próbkowania: NieNie wykryto błędów!Nie ma pliku z tą nazwą!Tryb szumuŻadenNormalizuj do...Zauważ że dla tych tłumaczonych łańcuchów które wyglądają jak "RecordStatus|Paused", powinieneś zignorować co jest z lewa i tylko przetłumaczyć łańcuch z prawej ("Paused" w tym przykładzie). Ta konwencja jest tu by zrobić możliwym przetłumaczenie tych samych łańcuchów na różne rzeczy w zależności od kontekstu. Liczba portów (0-8): Liczba ostatnich plików w menu Plik: OKUstawienia OSSOgg VorbisW tym systemie, libsndfile jest wymagana żeby zapisać zmiennoprzecinkowe pliki wav.Otwórz poprzez MPlayerInnyRozmiar _bufora wyjścia:Kanały wyjścia: Wyjście z komendy '%s': Wzmocnienie wyjścia: Poziom wyjścia (dB)Nadwyżka/opróżnienie sterownika JACKPrzekroczenia: Pa_OpenStream nieudane: %s Wklej w pozycji kursoraWklej, nadpisanie danych po pozycji kursoraWstrzymaj nagrywanieOgranicznik szczytuMaksimum szczytu: SzczytPhaserRura za pomocą programuDostosowanie wysokości tonuUmieść kursor Odtwórz _mono pliki jako stereoOdtwórz od pozycji kursoraOdtwórz wybrany obszarOdtwarzanieUrządzenie odtwarzania pliku:Urządzenie odtwarzania: OdtwarzanieOdtworzenie pliku jest proste, tylko wczytaj plik i naciśnij przycisk odtwarzania. zielony przycisk odtwarzania odtworzy od bieżącej pozycji. Żółty przycisk odtwarzania odtworzy bieżący wybór, albo cały plik jeśli nic nie wybrano. Zastopuj odtwarzanie przyciskiem stop (z czerwonym kwadratem). Port #%dPozycja kursoraZysk obróbki: UstawieniaPrzygotowanie testów..Ustawienia początkoweWyjście procesuPrzetwarzane danePasek postępuStrona projektu z tropicielem błędów, członkami listy mailingowej: JakośćJakość: P FalaRMS: Test zakresu nie powiódł się dla formatu: Raw PCM daneGotowy do nagrywaniaNagrajRecordStatus|WstrzymaneRecordStatus|NagrywanieNagrywanieUrządzenie nagrywania pliku:Urządzenie nagrywania: Nagrywanie jest robione poprzez 'Nagraj...' w menu Graj, lub przycisk Nagraj (czerwone kółko). Okienko dialogowe wyskoczy gdzie możesz wybrać jaki format chcesz nagrać. Po wyborze formatu, metry i liczby pojawią się pokazując informację o poziomie głośności wejścia dźwięku. Ustawienia nagrywaniaStatus nagrywania: Ponów ostatnią cofniętą operacjęReset maksymalnych szczytówPowróć do nagrywaniaWybrano powrótPogłosCzas pogłosu: OdwrótPrawyUruchomione testy..SDL (tylko wyjście)SDL: Nie można otworzyć audio: %sFormat próbki do spróbowania gdy format pliku dźwięku nie jest obsługiwany.Format próbki: Częstotliwość próbkowania: Próbka powtórz/pomiń (niska jakość)Rodzaj próbki: Prosty widokZapisz plikZapisz zmiany do %s?Zapisz wybór jako ...Zapisz bieżący plik na dyskZapisywanieSekundy ciszy: Wybranie hosta ESD do połączenia jest zrobione poprzez zmienną środowiskową ESPEAKER.WybórWybór: %s+%sWyślij nagłówek wavSesjeUstawUstaw formatUstaw koniec wyboru na pozycji kursoraUstaw początek wyboru na pozycji kursoraWartość przesunięcia: Nie powinno dotrzeć do tego punktuNie powinny dotrzeć do tego punktu!Pokaż _poziomy suwak powiększenia domyślniePokaż _szybkości suwak domyślniePokaż _czasu skalę domyślniePokaż _pionowy suwak powiększenia domyślniePodpisanySignedness: Filtr okienkowy SincSoX zamknął połączenie zbyt wcześnie!Kilka uwag o jakości dźwięku. Niektóre z ustawień które zmieniłeś nie będą uaktywnione zanim nie zrestartujesz programuDźwiękDane dźwiękowe są normalnie przechowywane jako wartości całkowite. Dlatego gdy normalizujesz, dostosowujesz głośność, zmniejszasz wielkość próbki lub filtra dźwięku, wynik musi być zaokrąglony. Gdy używasz 24 lub 32 bitowe wielkości próbki, to nie jest rzeczywiście problem, ale jeśli używasz 8 lub 16 bitową wielkość próbki, to zaokrąglenie spowoduje zmniejszenie jakości. ŹródłoObsługa SoX nie może być zainicjowanaSzybkośćSzybkość (Hz) Efekt szybkości: Szybkość:Szybkość: Standard (wysoka jakość)Start nowej sesjiStart nagrywaniaStart:StereoZatrzymaj odtwarzanieSunAudio: Nie można otworzyć %sSunAudio: Błąd odczytu z urządzenia dźwiękuSunAudio: Błąd zapisu do urządzenie dźwiękuWstrzymaneSkładnia: %s [plików] Pliki tymczasowe są domyślnie także przechowywane w katalogu ~/.mhwaveedit. Które katalogi użyć może być ustawione poprzez okienko dialogowe ustawień. By mieć najlepszą wydajność, powinieneś mieć jeden katalog tymczasowy dla każdego lokalnego systemu plików. Pliki tymczasowe mają nazwy formy "mhwaveedit-temp--nnnn-". NIE otwieraj ani nie usuwaj plików tymczasowych z tym samym numerem pid jak obecnie uruchomiony mhWaveEdit. Testowanie funkcji ukończonych konwersjiTestowanie funkcji konwersjiFunkcja 'Przytnij' usunie wszystkie części pliku które nie są wybrane. Funkcje 'Wytnij' i 'Skopiuj' działają jak w innym oprogramowaniu. Funkcja 'Wklej jako nowy' otworzy nowe okno i umieści zawartość schowka do niego. Funkcja 'Wklej mix' połączy dane schowka z danymi z pozycji kursora. Funkcja 'Wklej' wstawi zawartość schowka w pozycji kursora. Funkcja 'Wklej ponad' działa jak 'Wklej', z wyjątkiem tego że nadpisze dane po pozycji wstawienia. Funkcja 'Wybór ciszy' zastąpi wybraną część ciszą. Żeby uniknąć trzasków, część ciszy jest linią która spotyka fale w punktach końcowych. Ten obszar gdzie widzisz zawartość pliku edytowanego 'spójrz', jest zwany 'prosty widok'. Zmiana nazwy klienta nie przyniesie efektu zanim nie zrestartujesz programu.Plik konfiguracji nazywa się config. Może być ręcznie edytowany, ale najłatwiejszy sposób jest poprzez 'Ustawienia' w menu Edycji. Ten plik %s nie istnieje!Plik %s jest skompresowanym plikiem wav. Ten program może tylko działać z nieskompresowanymi plikami wav.Ten plik %s nie jest zwykłym plikiem!Plik %s może być zniszczony gdy nie powiedzie się zapisanie go. Spróbuj zwolnić nieco miejsca na dysku i zapisz ponownie. Jeśli teraz wyjdziesz zawartość pliku może być w złym stanie. Plik nie zmienił się od ostatniego zapisu. Naciśnij OK jeśli chcesz go zapisać tak czy owak?Nazwa pliku '%s' ma nieznane programowi rozszerzenie. Proszę określ w jakim formacie ten plik powinien być zapisany.Pliki które należą do zawieszonych sesji zostały odzyskane. Pliki które nie są zapisane będą trwale usunięte. (Ta uwaga pokaże się tylko raz)Format pliku '%s' nie może być rozpoznany. Proszę określ format próbki poniżej.Generalna zasada gdy robi się edycję/przetwarzanie audio to żeby nie manipulować danymi bardziej niż potrzeba i zachować oryginalną kopię zawsze gdy przetwarzasz ważne pliki. Wejście zostało przycięte %d razy podczas przetwarzania.Funkcja miksowania wklejania nie zmniejszy jakości, chyba że szczyty staną się zbyt wysokie i dostaniesz trzaski. W tym przypadku dostaniesz ostrzeżenie. Wynik miksowanie został przycięty o %d razySzybkość odtwarzania może być zmieniona regulacją suwaka maksymalnie w prawo. Znak i endian-ness mogą być standardowo pozostawione domyślnie, ale powinny być zmienione jeśli nie możesz nagrywać lub masz zły dźwięk.Format dźwięku tego pliku nie jest obsługiwany do odtwarzania.Tu już jest tylko jeden kanał!Możesz zrobić mnóstwo rzeczy jeśli chcesz pomóc w rozwoju mhWaveEdit. Ten efekt zastosuje się do całego pliku, nie tylko wyboruTen efekt nie może być wczytany.Ten efekt nie ma opcji.Ten format nie jest obsługiwany przez sterownik wejściaKod czasu 24 fpsKod czasu 25 fps (PAL)Kod czasu 29.97 fps (NTSC)Kod czasu 30 fpsLimit czasu: Nagrany czas: Odcinek czasuTimeDisplay|PróbekFormat _skali czasu Aby uniknąć błędów zaokrągleń gdy stosuje się więcej niż jeden efekt na tych samych danych, zmiennoprzecinkowe pliki tymczasowe będą użyte. Jednak to zwiększy użycie dysku i CPU.Żeby zapisać plik w innym formacie pliku, użyj "Zapisz jako..." i wybierz format w okienku wyboru rodzaju pliku. SzczytNie można wykryć obsługiwanych efektów SoXNie można zapisać danych do %sCofnij ostatnią zmianęNiespodziewany EOF w połączeniu do podprocesuNiespodziewany koniec plikuNiespodziewany koniec pliku czytanego z %sNieznany format plikuNieznany rodzaj plikuNieznana opcja '%s'NiepodpisanyDo góryUaktualnij standardoweUżyj ustawień domyślnychUżyj szybkiej i hałaśliwej metodyUżyj tych ustawień domyślnieWykorzystuje podwójną precyzję matematycznąWartość dla %s musi być liczbą pomiędzy %ld a %ldWartość dla '%s' musi być liczbą pomiędzy %f a %fWartość dla '%s' nie może być powyżej %fWartość dla '%s' nie może być poniżej %fZmienna bitrate (domyślnie)Falowniki: WibratorWidok _jakość:Widok: [ %s - %s ]Głośności dostosowanie/wyciszenieOstrzeżenie: Niespodziewany błąd: %sGdy chcesz zacząc nagrywanie, naciśnij przycisk "Start nagrywania". Gdy nagrałeś wszystko co chciałeś, naciśnij przycisk Zakończ i okienko dialogowe nagrywania zniknie i nowo nagrany dźwięk pokaże się w nowym oknie. BiałySzerokość: Długość okna: Rozmiar okna: Szerokość okna: Z JACK, jedyny obsługiwany format nagrywania to Zmiennoprzecinkowy, pojedynczej dokładności, %d HzY,U Przesuń kursor do najbliższego wszystkich kanałów przejścia zerowego TakZapisujesz plik wav większy niż 2048 MB. Tak duże pliki nie sąstandardowe i mogą nie być czytane przez wszystkie programy. (to ostrzeżenie nie będzie ponownie wyświetlone)Możesz robić normalną edycję podczas gdy plik jest odtwarzany. Możesz znaleźć ostatnie wydanie mhWaveEdit na: Możesz umieścić znaki w pliku przytrzymując Ctrl i naciskając liczbę od 0 do 9. To umieści znak (szary pionowy pasek) z tą samą liczbą w bieżącej pozycji kursora. Możesz później zrobić kursor idącym do tej pozycji ponownie poprzez tylko naciśnięcie liczby. Ustawienie i skok do znaków może być zrobiony podczas odtwarzania. Żeby usunąć znak, skocz do znaku i ustaw go ponownie. Możesz użyć kursor żeby udoskonalić wybór. Użyj przyciski 'Wybór startuje od kursora' i 'Wybór kończy się przy kursorze' żeby przenieść punkt startowy wyboru lub punkt końcowy wyboru na obecną pozycję kursora. Możesz także przeciągnąć punkty końcowe wyboru używając myszy. Zmapowałeś więcej niż jeden port wyjścia do kanału '%s'. Możesz tylko zmapować jeden port wyjścia dla każdego kanału.Nie ma otwartego pliku żeby zastosować efekt do niego!Zrobisz wybory przeciągając mysz ponad prostym widokiem. Możesz słyszeć co obecnie wybrałeś klikając na przycisk "odtwórz wybrane" (przycisk z żółtą strzałką) lub wybierając 'Odtwórz wybrane' z menu Graj. Poziom zero_Dodaj_Automatyczny start odtwarzania gdy skok do znaku_Przeglądaj..._Zamiana Bajtu wyjście (spróbuj tego gdy odtwarzanie brzmi źle)_Zrezygnuj_Zamknij_W dół_Rysuj przebieg sekundy czasu z lepszą jakością_Sterownik:_Zachowaj kursor w centrum widoku gdy po odtwarzaniu_Zachowaj sterownik dźwięku otwartym (by uniknąć klikania start/stop)_OK_Podgląd_Zapamiętaj rozmiary/pozycje okna_Usuń_Ustawienia_W górę_Uaktualnij informacje kursora podczas odtwarzania_Użyj zmiennoprzecinkowego katalogu plikówpo rozpoczęciu plikupo bieżącej pozycji kursorapo zakończeniu plikupo końcu wybranegopo starcie wybranegobajtyrozmiar nagłówkahttp://gna.org/projects/mhwaveedit http://gna.org/projects/mhwaveedit/ jack_get_ports zwrócił NULLskok opóźnieniamagnus.hjorth@home.se Pomoc mhWaveEditmhWaveEdit sprawdza na starcie pozostałości plików tymczasowych i pozwala użytkownikowi je otworzyć. Po otwarciu zawieszonej sesji, pliki mogą być zapisane lub wyrzucone. mhWaveEdit utworzy katalog ~/.mhwaveedit gdzie będzie przechowywał informacje o konfuguracji. mhWaveEdit ma kilka prostych efektów, które są dostępne z menu 'Efekty'. mhWaveEdit ma podstawową obsługę formatów mp3 i ogg. Żeby to działało musisz mieć zainstalowany LAME do obsługi mp3, i OggDec/OggEnc do obsługi Ogg. Jeśli masz te programy, możesz otworzyć i zapisać pliki mp3/ogg tak jak każdy inny format pliku. mhWaveEdit jest graficznym programem dla edytowania plików dźwiękowych. Jest całkowicie wolny (GPL). mhWaveEdit obsługuje efekty LADSPA i może również zrobić użytek z większości narzędzi efekty programu SoX. Żeby znaleźć wtyczki LADSPA zmienna środowiskowa LADSPA_PATH musi być poprawnie ustawiona. mhWaveEdit: mhWaveEdit: %s (%s): %d Hz, %smhWaveEdit: %s: %s mhwaveedit-discuss@gna.org msliczba ostatnich plikówumieszczenie środowiska nie powiodło się!częstotliwość próbkowaniapróbkipróbki/pikselesekundysnd_pcm_hw_params_set_access nie powiódł sięsnd_pcm_hw_params_set_buffer_size_last nie powiódł sięsnd_pcm_hw_params_set_channels nie powiódł sięsnd_pcm_hw_params_set_format nie powiódł sięsnd_pcm_hw_params_set_rate nie powiódł siędźwięk-portaudio: Brak dostępnych urządzeń wejściowych!dźwięk-portaudio: Brak dostępnych urządzeń wyjściowych!wyłączenie środowiska nie powiodło się!niezatytułowany #%dmhwaveedit-1.4.24/po/pl.po000066400000000000000000003152261334022513400153360ustar00rootroot00000000000000# Polish translation for mhwaveedit. # Copyright (C) YEAR Magnus Hjorth # This file is distributed under the same license as the PACKAGE package. # Robert Wojewódzki , 2011. # msgid "" msgstr "" "Project-Id-Version: mhwaveedit_pl\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-08-25 11:56+0200\n" "PO-Revision-Date: 2011-02-24 10:00+0100\n" "Last-Translator: Robert Wojewódzki \n" "Language-Team: polish \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: src/chunk.c:199 msgid "Converting samplerate" msgstr "Konwertowanie częstotliwości próbkowania" #: src/chunk.c:226 msgid "Adjusting speed" msgstr "Dostosowanie szybkości" #: src/chunk.c:703 msgid "Mixing" msgstr "Miksowanie" #: src/chunk.c:758 #, c-format msgid "The mixed result was clipped %d times." msgstr "Wynik miksowanie został przycięty o %d razy" #: src/chunk.c:822 msgid "Combining channels" msgstr "Połącznie kanałów" #: src/chunk.c:1083 msgid "Mixing channels" msgstr "Miksowanie kanałów" #: src/chunk.c:1471 msgid "Calculating peak level" msgstr "Obliczanie poziomu szczytowego" #: src/chunk.c:1542 src/chunk.c:1552 src/chunk.c:1590 src/chunk.c:1600 msgid "Finding zero-crossing" msgstr "Znajdowanie przejścia zerowego" #: src/chunk.c:1628 #, c-format msgid "Amplifying (by %3.1f%% / %+.1fdB)" msgstr "Wzmacnianie (przez %3.1f%% / %+.1fdB)" #: src/chunk.c:1669 msgid "Amplifying" msgstr "Wzmacnianie" #: src/chunk.c:1867 #, c-format msgid "The input was clipped %d times during processing." msgstr "Wejście zostało przycięte %d razy podczas przetwarzania." #: src/configdialog.c:65 msgid "number of recent files" msgstr "liczba ostatnich plików" #: src/configdialog.c:66 #, fuzzy msgid "maximum vertical zoom" msgstr "/Widok/Powiększ _pionowo" #: src/configdialog.c:80 msgid "" "Some of the settings you have changed will not be activated until you " "restart the program" msgstr "" "Niektóre z ustawień które zmieniłeś nie będą uaktywnione zanim nie " "zrestartujesz programu" #: src/configdialog.c:292 msgid "Colors" msgstr "Kolory" #: src/configdialog.c:329 msgid "_Preview" msgstr "_Podgląd" #: src/configdialog.c:336 src/configdialog.c:1204 msgid "_OK" msgstr "_OK" #: src/configdialog.c:353 msgid "_Cancel" msgstr "_Zrezygnuj" #: src/configdialog.c:430 msgid "Browse directory" msgstr "Przeglądaj katalog" #: src/configdialog.c:480 msgid "Preferences" msgstr "Ustawienia" #: src/configdialog.c:539 msgid "Show _time scale by default" msgstr "Pokaż _czasu skalę domyślnie" #: src/configdialog.c:549 msgid "Show _horizontal zoom slider by default" msgstr "Pokaż _poziomy suwak powiększenia domyślnie" #: src/configdialog.c:559 msgid "Show _vertical zoom slider by default" msgstr "Pokaż _pionowy suwak powiększenia domyślnie" #: src/configdialog.c:569 msgid "Show _speed slider by default" msgstr "Pokaż _szybkości suwak domyślnie" #: src/configdialog.c:579 #, fuzzy msgid "Show slider l_abels by default" msgstr "Pokaż _szybkości suwak domyślnie" #: src/configdialog.c:589 #, fuzzy msgid "Show playback buffer positio_n by default" msgstr "" #: src/configdialog.c:598 msgid "_Settings" msgstr "_Ustawienia" #: src/configdialog.c:608 msgid "_Keep sound driver opened (to avoid start/stop clicks)" msgstr "_Zachowaj sterownik dźwięku otwartym (by uniknąć klikania start/stop)" #: src/configdialog.c:617 msgid "_Byte-swap output (try this if playback sounds horrible)" msgstr "_Zamiana Bajtu wyjście (spróbuj tego gdy odtwarzanie brzmi źle)" #: src/configdialog.c:626 msgid "Play _mono files as stereo" msgstr "Odtwórz _mono pliki jako stereo" #: src/configdialog.c:634 msgid "_Update cursor information while playing" msgstr "_Uaktualnij informacje kursora podczas odtwarzania" #: src/configdialog.c:642 msgid "_Keep cursor in center of view when following playback" msgstr "_Zachowaj kursor w centrum widoku gdy po odtwarzaniu" #: src/configdialog.c:652 msgid "_Auto-start playback when jumping to mark" msgstr "_Automatyczny start odtwarzania gdy skok do znaku" #: src/configdialog.c:660 msgid "Enable _variable speed playback" msgstr "Włącz _zmienną szybkość odtwarzania" #: src/configdialog.c:669 msgid "Auto-_reset speed" msgstr "Automatyczny _reset szybkości" #: src/configdialog.c:676 msgid "Use fast and noisy method" msgstr "Użyj szybkiej i hałaśliwej metody" #: src/configdialog.c:684 msgid "(H')MM:SS.t" msgstr "(G')MM:SS.t" #: src/configdialog.c:685 msgid "(H')MM:SS.mmmm" msgstr "(G')MM:SS.mmmm" #: src/configdialog.c:686 msgid "TimeDisplay|Samples" msgstr "TimeDisplay|Próbek" #: src/configdialog.c:687 msgid "Time Code 24fps" msgstr "Kod czasu 24 fps" #: src/configdialog.c:688 msgid "Time Code 25fps (PAL)" msgstr "Kod czasu 25 fps (PAL)" #: src/configdialog.c:689 msgid "Time Code 29.97fps (NTSC)" msgstr "Kod czasu 29.97 fps (NTSC)" #: src/configdialog.c:690 msgid "Time Code 30fps" msgstr "Kod czasu 30 fps" #: src/configdialog.c:703 msgid "_Remember window sizes/positions" msgstr "_Zapamiętaj rozmiary/pozycje okna" #: src/configdialog.c:712 msgid "_Draw waveform a second time with improved quality" msgstr "_Rysuj przebieg sekundy czasu z lepszą jakością" #: src/configdialog.c:742 msgid "_Remove" msgstr "_Usuń" #: src/configdialog.c:750 msgid "_Add" msgstr "_Dodaj" #: src/configdialog.c:757 msgid "_Browse..." msgstr "_Przeglądaj..." #: src/configdialog.c:764 msgid "_Up" msgstr "_W górę" #: src/configdialog.c:772 msgid "_Down" msgstr "_W dół" #: src/configdialog.c:788 msgid "Keep main _window in front after applying effect" msgstr "Zachowaj główne _okno na wierzchu po zastosowaniu efektu" #: src/configdialog.c:804 msgid "_Use floating-point temporary files" msgstr "_Użyj zmiennoprzecinkowego katalogu plików" #: src/configdialog.c:813 msgid "Enable _dithering for editing" msgstr "Włącz _rozpraszanie dla edycji" #: src/configdialog.c:821 msgid "Enable dithering for _playback" msgstr "Włącz rozpraszanie dla _odtwarzania" #: src/configdialog.c:829 msgid "Auto dete_ct driver on each start-up" msgstr "Automatycznie _wykryj sterownik przy każdym starcie" #: src/configdialog.c:842 msgid "Direct access" msgstr "" #: src/configdialog.c:843 msgid "Decompress" msgstr "" #: src/configdialog.c:844 #, fuzzy msgid "Bypass" msgstr "Środkowoprzepustowy" #: src/configdialog.c:855 msgid "Biased" msgstr "" #: src/configdialog.c:856 msgid "Pure-Scaled" msgstr "" #: src/configdialog.c:873 msgid "Interface" msgstr "Interfejs" #: src/configdialog.c:874 msgid " Main window " msgstr " Główne okno " #: src/configdialog.c:885 msgid "Number of recent files in File menu: " msgstr "Liczba ostatnich plików w menu Plik: " #: src/configdialog.c:890 msgid " View " msgstr " Wygląd " #: src/configdialog.c:901 msgid "Customize co_lors..." msgstr "Dostosuj _kolory..." #: src/configdialog.c:908 msgid " Window contents " msgstr " Zawartość okna " #: src/configdialog.c:925 #, fuzzy msgid "Vertical zoom limit: " msgstr "/Widok/Powiększ _pionowo" #: src/configdialog.c:929 msgid "x" msgstr "" #: src/configdialog.c:935 msgid "Sound" msgstr "Dźwięk" #: src/configdialog.c:936 msgid " Driver options " msgstr " Opcje sterownika " #: src/configdialog.c:944 msgid "_Driver:" msgstr "_Sterownik:" #: src/configdialog.c:961 msgid " Fallback format " msgstr " Awaryjny format " #: src/configdialog.c:966 msgid "Sample format to try when the sound file's format isn't supported." msgstr "" "Format próbki do spróbowania gdy format pliku dźwięku nie jest obsługiwany." #: src/configdialog.c:978 msgid "Playback" msgstr "Odtwarzanie" #: src/configdialog.c:980 msgid " Playback settings " msgstr " Ustawienia odtwarzania " #: src/configdialog.c:992 msgid " Variable speed " msgstr " Zmienna szybkość " #: src/configdialog.c:1007 src/help.c:38 msgid "Files" msgstr "Pliki" #: src/configdialog.c:1009 msgid " Temporary file directories " msgstr " Katalogi plików tymczasowych " #: src/configdialog.c:1035 msgid " Temporary file settings " msgstr " Ustawienia pliku tymczasowego " #: src/configdialog.c:1040 msgid "" "To avoid rounding errors when applying more than one effect on the same " "data, floating-point temporary files can be used. However, this will " "increase disk and CPU usage." msgstr "" "Aby uniknąć błędów zaokrągleń gdy stosuje się więcej niż jeden efekt na tych " "samych danych, zmiennoprzecinkowe pliki tymczasowe będą użyte. Jednak to " "zwiększy użycie dysku i CPU." #: src/configdialog.c:1048 msgid "" "Some versions of libsndfile supports accessing Ogg files without " "decompressing to a temporary file." msgstr "" #: src/configdialog.c:1062 src/help.c:36 msgid "Quality" msgstr "Jakość" #: src/configdialog.c:1064 msgid " Rate conversions " msgstr " Współczynnik konwersji " #: src/configdialog.c:1071 msgid "Varispeed: " msgstr "Falowniki: " #: src/configdialog.c:1072 msgid "Speed effect: " msgstr "Efekt szybkości: " #: src/configdialog.c:1079 msgid " Dithering " msgstr " Rozpraszanie " #: src/configdialog.c:1090 #, fuzzy msgid " Sample conversion " msgstr " Współczynnik konwersji " #: src/configdialog.c:1097 msgid "Normalization mode: " msgstr "" #: src/configdialog.c:1104 msgid "Other" msgstr "Inny" #: src/configdialog.c:1106 msgid " Time format " msgstr " Format czasu " #: src/configdialog.c:1115 msgid "Display t_imes as: " msgstr "Wyświetl _czasy jako: " #: src/configdialog.c:1126 msgid "Times_cale format: " msgstr "Format _skali czasu " #: src/configdialog.c:1137 msgid " External applications " msgstr " Zewnętrzne aplikacje " #: src/configdialog.c:1145 msgid "Mi_xer utility: " msgstr "Narzędzie _miksera: " #: src/configdialog.c:1155 msgid "Advanced" msgstr "Zaawansowane" #: src/configdialog.c:1156 msgid " Advanced settings " msgstr " Ustawienia zaawansowane " #: src/configdialog.c:1164 msgid "Disk editing _threshold: " msgstr "_Próg edytowanego dysku: " #: src/configdialog.c:1175 msgid "View _quality:" msgstr "Widok _jakość:" #: src/configdialog.c:1181 msgid "samples/pixel" msgstr "próbki/piksele" #: src/configdialog.c:1187 msgid "Output _buffer size:" msgstr "Rozmiar _bufora wyjścia:" #: src/configdialog.c:1193 msgid "bytes" msgstr "bajty" #: src/configdialog.c:1218 msgid "_Close" msgstr "_Zamknij" #: src/dataformat.c:886 #, fuzzy, c-format msgid "Floating-point (single %s)\n" msgstr "Zmiennoprzecinkowy (pojedyńczy)" #: src/dataformat.c:886 src/dataformat.c:888 src/dataformat.c:892 msgid "Big-endian" msgstr "Big-endian" #: src/dataformat.c:886 src/dataformat.c:888 src/dataformat.c:892 msgid "Little-endian" msgstr "Little-endian" #: src/dataformat.c:888 #, fuzzy, c-format msgid "Floating-point (double %s)\n" msgstr "Zmiennoprzecinkowy (podwójny)" #: src/dataformat.c:890 #, fuzzy, c-format msgid "PCM, %d(%d) bit, %s %s\n" msgstr "PCM, %d bit, %s %s\n" #: src/dataformat.c:891 src/formatselector.c:77 msgid "Signed" msgstr "Podpisany" #: src/dataformat.c:891 src/formatselector.c:76 msgid "Unsigned" msgstr "Niepodpisany" #: src/dataformat.c:952 #, fuzzy msgid " Testing ranges..." msgstr "Testowanie zakresów..." #: src/dataformat.c:976 msgid "Range test failed for format: " msgstr "Test zakresu nie powiódł się dla formatu: " #: src/dataformat.c:990 #, fuzzy msgid " Testing all conversions.." msgstr "Testowanie wszystkich konwersji.." #: src/dataformat.c:1032 msgid "(expected) " msgstr "(oczekiwany) " #: src/dataformat.c:1033 msgid "Conversion test failed, between: " msgstr "Test konwersji nie powiódł się pomiędzy: " #: src/dataformat.c:1035 msgid " and: " msgstr " i: " #: src/dataformat.c:1112 msgid "No errors detected!" msgstr "Nie wykryto błędów!" #: src/dataformat.c:1146 msgid "Preparing tests.." msgstr "Przygotowanie testów.." #: src/dataformat.c:1154 msgid "Running tests.." msgstr "Uruchomione testy.." #: src/dataformat.c:1196 #, c-format msgid "" "\n" "\n" "Test results (1 time unit = %f usec/sample)\n" msgstr "" "\n" "\n" "Wyniki testów (1 jednostka czasu = %f usec/próbka)\n" #: src/datasource.c:366 #, c-format msgid "Couldn't open %s" msgstr "Nie można otworzyć %s" #: src/datasource.c:497 msgid "Unexpected end of file" msgstr "Niespodziewany koniec pliku" #: src/datasource.c:498 #, c-format msgid "Error reading %s: %s" msgstr "Błąd czytania %s: %s" #: src/datasource.c:515 #, c-format msgid "Error seeking in %s: %s" msgstr "Błąd wyszukiwania w %s: %s" #: src/effectbrowser.c:99 msgid "Built-in" msgstr "Wbudowane" #: src/effectbrowser.c:102 msgid "Volume adjust/fade" msgstr "Głośności dostosowanie/wyciszenie" #: src/effectbrowser.c:104 msgid "Convert samplerate" msgstr "Konwersja próbkowania" #: src/effectbrowser.c:106 msgid "Convert sample format" msgstr "Konwersja formatu próbki" #: src/effectbrowser.c:108 msgid "Map channels" msgstr "Mapa kanałów" #: src/effectbrowser.c:110 msgid "Combine channels" msgstr "Połącz kanały" #: src/effectbrowser.c:113 msgid "Add channels from other file" msgstr "Dodaj kanały z innego pliku" #: src/effectbrowser.c:114 msgid "Speed" msgstr "Szybkość" #: src/effectbrowser.c:115 msgid "Pipe through program" msgstr "Rura za pomocą programu" #: src/effectbrowser.c:250 msgid "You have no open file to apply the effect to!" msgstr "Nie ma otwartego pliku żeby zastosować efekt do niego!" #: src/effectbrowser.c:275 msgid "This effect could not be loaded." msgstr "Ten efekt nie może być wczytany." #: src/effectbrowser.c:582 msgid "/Move Up" msgstr "/Podnieś" #: src/effectbrowser.c:583 msgid "/Move Down" msgstr "/Opuść" #: src/effectbrowser.c:584 msgid "/Move to Top" msgstr "/Przesuń do szczyt" #: src/effectbrowser.c:585 msgid "/Move to Bottom" msgstr "/Przesuń na dno" #: src/effectbrowser.c:587 msgid "/Sort by Name" msgstr "/Sortuj według nazwy" #: src/effectbrowser.c:588 msgid "/Sort by Type" msgstr "/Sortuj według rodzaju" #: src/effectbrowser.c:589 msgid "/Sort by Location" msgstr "/Sortuj według położenia" #: src/effectbrowser.c:590 msgid "/Sort by Author" msgstr "/Sortuj według Autora" #: src/effectbrowser.c:592 msgid "/Restore Order" msgstr "/Przywróc porządek" #: src/effectbrowser.c:593 msgid "/Rebuild Effect List" msgstr "/Przebuduj listę efektu" #: src/effectbrowser.c:744 msgid "Top" msgstr "Szczyt" #: src/effectbrowser.c:751 msgid "Up" msgstr "Do góry" #: src/effectbrowser.c:758 msgid "Down" msgstr "Dół" #: src/effectbrowser.c:765 msgid "Bottom" msgstr "Dno" #: src/effectbrowser.c:793 msgid "Close dialog after applying effect" msgstr "Zamknij okno dialogowe po zastosowaniu efektu" #: src/effectbrowser.c:800 src/gotodialog.c:154 msgid "Apply" msgstr "Zastosuj" #: src/effectbrowser.c:808 src/gotodialog.c:159 src/mainwindow.c:1438 #: src/pipedialog.c:165 src/recorddialog.c:610 src/recorddialog.c:987 #: src/sound-esound.c:290 src/sound-jack.c:264 src/sound-oss.c:479 msgid "Close" msgstr "Zamknij" #: src/effectbrowser.c:830 src/help.c:35 msgid "Effects" msgstr "Efekty" #: src/effectbrowser.c:892 msgid "Apply to: " msgstr "Zastosuj do: " #: src/filetypes.c:103 msgid "putenv failed!" msgstr "umieszczenie środowiska nie powiodło się!" #: src/filetypes.c:113 msgid "unsetenv failed!" msgstr "wyłączenie środowiska nie powiodło się!" #: src/filetypes.c:155 msgid "Microsoft WAV format" msgstr "Format Microsoft WAV" #: src/filetypes.c:181 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: src/filetypes.c:188 msgid "Raw PCM data" msgstr "Raw PCM dane" #: src/filetypes.c:190 msgid "Open with MPlayer" msgstr "Otwórz poprzez MPlayer" #: src/filetypes.c:275 #, c-format msgid "The file %s does not exist!" msgstr "Ten plik %s nie istnieje!" #: src/filetypes.c:282 #, c-format msgid "The file %s is not a regular file!" msgstr "Ten plik %s nie jest zwykłym plikiem!" #: src/filetypes.c:294 msgid "Loading" msgstr "Wczytywanie" #: src/filetypes.c:333 #, c-format msgid "" "The file name '%s' has an extension unknown to the program. Please specify " "in which format this file should be saved." msgstr "" "Nazwa pliku '%s' ma nieznane programowi rozszerzenie. Proszę określ w jakim " "formacie ten plik powinien być zapisany." #: src/filetypes.c:338 msgid "Unknown file type" msgstr "Nieznany rodzaj pliku" #: src/filetypes.c:389 msgid "Saving" msgstr "Zapisywanie" #: src/filetypes.c:393 #, c-format msgid "" "The file %s may be destroyed since the saving failed. Try to free up some " "disk space and save again. If you exit now the file's contents could be in a " "bad state. " msgstr "" "Plik %s może być zniszczony gdy nie powiedzie się zapisanie go. Spróbuj " "zwolnić nieco miejsca na dysku i zapisz ponownie. Jeśli teraz wyjdziesz " "zawartość pliku może być w złym stanie. " #: src/filetypes.c:457 #, c-format msgid "%s is not a valid wav file" msgstr "%s nie jest dobrym plikiem WAV" #: src/filetypes.c:472 #, c-format msgid "" "The file %s is a compressed wav file. This program can only work with " "uncompressed wav files." msgstr "" "Plik %s jest skompresowanym plikiem wav. Ten program może tylko działać z " "nieskompresowanymi plikami wav." #: src/filetypes.c:593 msgid "" "On this system, libsndfile is required to save floating-point wav files." msgstr "" "W tym systemie, libsndfile jest wymagana żeby zapisać zmiennoprzecinkowe " "pliki wav." #: src/filetypes.c:616 msgid "" "You are saving a wav file larger than 2048MB. Such large files are non-" "standard and may not be readable by all programs.\n" "\n" " (this warning will not be displayed again)" msgstr "" "Zapisujesz plik wav większy niż 2048 MB. Tak duże pliki nie sąstandardowe i " "mogą nie być czytane przez wszystkie programy.\n" "\n" " (to ostrzeżenie nie będzie ponownie wyświetlone)" #: src/filetypes.c:732 src/filetypes.c:877 #, c-format msgid "Failed to open '%s'!" msgstr "Nie udało się otworzyć '%s'!" #: src/filetypes.c:849 msgid "Invalid sample format or number of channels for this file format" msgstr "Niedobry format próbki lub liczba kanałów dla tego formatu pliku" #: src/filetypes.c:943 #, c-format msgid "Failed to write to '%s'!" msgstr "Nie udało się zapisać do '%s'!" #: src/filetypes.c:1028 msgid "Decoding" msgstr "Dekodowanie" #: src/filetypes.c:1149 msgid "Variable bitrate (default)" msgstr "Zmienna bitrate (domyślnie)" #: src/filetypes.c:1150 msgid "Average bitrate" msgstr "Średnia bitrate" #: src/filetypes.c:1151 msgid "Constant bitrate" msgstr "Stała bitrate" #: src/filetypes.c:1152 msgid "Custom argument" msgstr "Zwyczajny argument" #: src/filetypes.c:1156 msgid "Standard (high quality)" msgstr "Standard (wysoka jakość)" #: src/filetypes.c:1157 msgid "Extreme (higher quality)" msgstr "Ekstremalna (wyższa jakość)" #: src/filetypes.c:1158 msgid "Insane (highest possible quality)" msgstr "Szalona (najwyższa możliwa jakość)" #: src/filetypes.c:1176 #, c-format msgid "%s kbit/s" msgstr "%s kbit/s" #: src/filetypes.c:1205 msgid "MP3 Preferences" msgstr "Ustawienia MP3" #: src/filetypes.c:1216 msgid "Encoding type: " msgstr "Rodzaj kodowania: " #: src/filetypes.c:1229 msgid "Quality: " msgstr "Jakość: " #: src/filetypes.c:1238 msgid "Custom argument: " msgstr "Zwyczajny argument: " #: src/filetypes.c:1244 msgid "Use this setting by default" msgstr "Użyj tych ustawień domyślnie" #: src/filetypes.c:1249 src/gotodialog.c:146 src/mainwindow.c:1509 #: src/rawdialog.c:101 src/sound-alsalib.c:98 src/sound-esound.c:286 #: src/sound-jack.c:260 src/sound-oss.c:475 src/um.c:109 src/um.c:142 #: src/um.c:341 src/um.c:449 msgid "OK" msgstr "OK" #: src/filetypes.c:1257 src/rawdialog.c:107 src/sound-alsalib.c:102 #: src/um.c:133 src/um.c:150 src/um.c:347 src/um.c:458 msgid "Cancel" msgstr "Zrezygnuj" #: src/float_box.c:184 src/int_box.c:184 #, c-format msgid "'%s' is not a number!" msgstr "%s nie jest liczbą!" #: src/float_box.c:202 #, c-format msgid "Value for '%s' must be a number between %f and %f" msgstr "Wartość dla '%s' musi być liczbą pomiędzy %f a %f" #: src/formatselector.c:60 msgid "Sample type: " msgstr "Rodzaj próbki: " #: src/formatselector.c:62 msgid "8 bit PCM" msgstr "8 bit PCM" #: src/formatselector.c:63 msgid "16 bit PCM" msgstr "16 bit PCM" #: src/formatselector.c:64 msgid "24 bit PCM" msgstr "24 bit PCM" #: src/formatselector.c:65 msgid "32 bit PCM" msgstr "32 bit PCM" #: src/formatselector.c:66 msgid "Floating-point, single" msgstr "Zmiennoprzecinkowy pojedyńczy" #: src/formatselector.c:67 msgid "Floating-point, double" msgstr "Zmiennoprzecinkowy podwójny" #: src/formatselector.c:74 msgid "Signedness: " msgstr "Signedness: " #: src/formatselector.c:82 msgid "Endianness: " msgstr "Endianness: " #: src/formatselector.c:84 msgid "Little endian" msgstr "Little endian" #: src/formatselector.c:85 msgid "Big endian" msgstr "Big endian" #: src/formatselector.c:90 #, fuzzy msgid "Alignment:" msgstr "Wyrównanie" #: src/formatselector.c:92 msgid "Packed" msgstr "" #: src/formatselector.c:93 #, fuzzy msgid "Top bytes" msgstr "bajty" #: src/formatselector.c:94 #, fuzzy msgid "Bottom bytes" msgstr "Dno" #: src/formatselector.c:130 msgid "Channels: " msgstr "Kanały: " #: src/formatselector.c:139 msgid "Sample rate: " msgstr "Częstotliwość próbkowania: " #: src/formatselector.c:226 msgid "sample rate" msgstr "częstotliwość próbkowania" #: src/gotodialog.c:102 msgid "Place cursor " msgstr "Umieść kursor " #: src/gotodialog.c:107 src/sound-esound.c:274 msgid "seconds" msgstr "sekundy" #: src/gotodialog.c:111 src/soxdialog.c:487 msgid "samples" msgstr "próbki" #: src/gotodialog.c:115 msgid "after beginning of file" msgstr "po rozpoczęciu pliku" #: src/gotodialog.c:120 msgid "after end of file" msgstr "po zakończeniu pliku" #: src/gotodialog.c:125 msgid "after current cursor position" msgstr "po bieżącej pozycji kursora" #: src/gotodialog.c:130 msgid "after selection start" msgstr "po starcie wybranego" #: src/gotodialog.c:135 msgid "after selection end" msgstr "po końcu wybranego" #: src/gotodialog.c:139 msgid "" "(use a negative number to place the cursor before instead of after the " "selected point)" msgstr "" "(użyj ujemną liczbę żeby umieścić kursor przed zamiast po wybranym punkcie)" #: src/gotodialog.c:178 msgid "Position cursor" msgstr "Pozycja kursora" #: src/gtkfiles.c:48 #, c-format msgid "Could not open %s: %s" msgstr "Nie można otworzyć %s: %s" #: src/gtkfiles.c:53 #, c-format msgid "Warning: Unexpected error: %s" msgstr "Ostrzeżenie: Niespodziewany błąd: %s" #: src/gtkfiles.c:110 src/gtkfiles.c:125 #, c-format msgid "Error closing %s: %s" msgstr "Błąd zamknięcia %s: %s" #: src/gtkfiles.c:140 #, c-format msgid "Could not seek in %s: %s" msgstr "Nie można wyszukać w %s: %s" #: src/gtkfiles.c:159 src/gtkfiles.c:204 #, c-format msgid "Could not read from %s: %s" msgstr "Nie można czytać z %s: %s" #: src/gtkfiles.c:178 #, c-format msgid "Unexpected end of file reading from %s" msgstr "Niespodziewany koniec pliku czytanego z %s" #: src/gtkfiles.c:196 #, c-format msgid "Unable to write data to %s" msgstr "Nie można zapisać danych do %s" #: src/gtkfiles.c:262 #, c-format msgid "Could not get file position in %s: %s" msgstr "Nie można dostać pozycji pliku w %s: %s" #: src/gtkfiles.c:313 src/gtkfiles.c:473 msgid "File already exists. Overwrite?" msgstr "Plik już istnieje. Nadpisać?" #: src/gtkfiles.c:321 msgid "No file with that name!" msgstr "Nie ma pliku z tą nazwą!" #: src/gtkfiles.c:705 #, c-format msgid "Error reading from %s: %s" msgstr "Błąd czytania z %s: %s" #: src/gtkfiles.c:737 #, c-format msgid "Could not remove '%s': %s" msgstr "Nie można usunąć '%s': %s" #: src/gtkfiles.c:757 #, c-format msgid "Error creating link to '%s': %s" msgstr "Błąd tworzenia linku do '%s': %s" #: src/help.c:30 msgid "General" msgstr "Ogólne" #: src/help.c:31 msgid "Sample view" msgstr "Prosty widok" #: src/help.c:32 msgid "Playing" msgstr "Odtwarzanie" #: src/help.c:33 msgid "Recording" msgstr "Nagrywanie" #: src/help.c:34 msgid "Editing" msgstr "Edytowanie" #: src/help.c:37 msgid "File formats" msgstr "Formaty pliku" #: src/help.c:39 msgid "Keyboard shortcuts" msgstr "Skróty klawiaturowe" #: src/help.c:40 msgid "Bug reporting" msgstr "Raportowanie błędów" #: src/help.c:41 msgid "Helping out" msgstr "Pomagając" #: src/help.c:42 msgid "Contact" msgstr "Kontakt" #: src/help.c:47 #, no-c-format msgid "" "mhWaveEdit is a graphical program for editing sound files. It is completely " "free (GPL).\n" msgstr "" "mhWaveEdit jest graficznym programem dla edytowania plików dźwiękowych. Jest " "całkowicie wolny (GPL).\n" #: src/help.c:49 #, no-c-format msgid "You can find the latest release of mhWaveEdit at:\n" msgstr "Możesz znaleźć ostatnie wydanie mhWaveEdit na:\n" #: src/help.c:50 #, no-c-format msgid "http://gna.org/projects/mhwaveedit/\n" msgstr "http://gna.org/projects/mhwaveedit/\n" #: src/help.c:55 #, no-c-format msgid "" "The area where you 'see' the contents of the file you are editing, is called " "the 'sample view'. \n" msgstr "" "Ten obszar gdzie widzisz zawartość pliku edytowanego 'spójrz', jest zwany " "'prosty widok'. \n" #: src/help.c:57 #, no-c-format msgid "" "In the sample view there is a grey vertical bar called the 'cursor'. The " "cursor follows the sound wave when you play the sound. You can position the " "cursor by clicking with the right (2:nd) mouse button. If you do this while " "you're playing a file, the playing will continue from the new cursor " "position. You can also position the cursor more exact by using the 'Position " "Cursor...' command on the Edit menu.\n" msgstr "" "W prostym widoku jest szary pionowy pasek zwany 'kursor'. Kursor podąża za " "falą dźwięku gdy odtwarzasz dźwięk. Możesz umieścić kursor klikając prawym " "(drugim) przyciskiem myszy. Jeśli to zrobisz podczas odtwarzania pliku, " "odtwarzanie będzie kontynuowane od nowej pozycji kursora. Możesz także " "umieścić kursor bardziej dokładnie używając komendy 'Pozycja Kursora...' w " "menu Edycja.\n" #: src/help.c:59 #, no-c-format msgid "" "You can place marks in your file by holding down Ctrl and pressing a number " "from 0 to 9. This will place a mark (green vertical bar) with the same " "number at the current cursor position. You can later make the cursor go to " "that position again by just pressing the number. Setting and jumping to " "marks can be done while playing. To remove a mark, jump to the mark and set " "it again.\n" msgstr "" "Możesz umieścić znaki w pliku przytrzymując Ctrl i naciskając liczbę od 0 do " "9. To umieści znak (szary pionowy pasek) z tą samą liczbą w bieżącej pozycji " "kursora. Możesz później zrobić kursor idącym do tej pozycji ponownie poprzez " "tylko naciśnięcie liczby. Ustawienie i skok do znaków może być zrobiony " "podczas odtwarzania. Żeby usunąć znak, skocz do znaku i ustaw go ponownie.\n" #: src/help.c:64 #, no-c-format msgid "" "Playing a file is simple, just load the file and press the play button. The " "green play button plays from the current position. The yellow play button " "plays the current selection, or the entire file if nothing is selected. Stop " "the playback with the stop button (with the red square). \n" msgstr "" "Odtworzenie pliku jest proste, tylko wczytaj plik i naciśnij przycisk " "odtwarzania. zielony przycisk odtwarzania odtworzy od bieżącej pozycji. " "Żółty przycisk odtwarzania odtworzy bieżący wybór, albo cały plik jeśli nic " "nie wybrano. Zastopuj odtwarzanie przyciskiem stop (z czerwonym " "kwadratem). \n" #: src/help.c:66 #, no-c-format msgid "" "The playback speed can be varied by adjusting the slider to the far right. \n" msgstr "" "Szybkość odtwarzania może być zmieniona regulacją suwaka maksymalnie w " "prawo. \n" #: src/help.c:68 #, no-c-format msgid "You can do normal editing while the file is playing.\n" msgstr "Możesz robić normalną edycję podczas gdy plik jest odtwarzany.\n" #: src/help.c:73 #, no-c-format msgid "" "Recording is done with 'Record...' on the Play menu, or the Record button " "(the red circle). A dialog box will pop up where you can select what format " "you want to record in. After selecting the format, meters and numbers will " "appear showing info about the volume level of the sound input. \n" msgstr "" "Nagrywanie jest robione poprzez 'Nagraj...' w menu Graj, lub przycisk Nagraj " "(czerwone kółko). Okienko dialogowe wyskoczy gdzie możesz wybrać jaki format " "chcesz nagrać. Po wyborze formatu, metry i liczby pojawią się pokazując " "informację o poziomie głośności wejścia dźwięku. \n" #: src/help.c:75 #, no-c-format msgid "" "When you want to start recording, press the \"Start recording\" button. When " "you've recorded everything you wanted to, press the Finish button and the " "record dialog will disappear and newly recorded sound will show up in a new " "window.\n" msgstr "" "Gdy chcesz zacząc nagrywanie, naciśnij przycisk \"Start nagrywania\". Gdy " "nagrałeś wszystko co chciałeś, naciśnij przycisk Zakończ i okienko dialogowe " "nagrywania zniknie i nowo nagrany dźwięk pokaże się w nowym oknie.\n" #: src/help.c:77 #, no-c-format msgid "" "Currently it is impossible to play and record at the same time, so the " "playback will stop when you record.\n" msgstr "" "Obecnie nie jest możliwe odtwarzać i nagrywać w tym samym czasie, zatem " "odtwarzanie zatrzyma się gdy będziesz nagrywał.\n" #: src/help.c:82 #, no-c-format msgid "" "You make selections by dragging the mouse over the sample view. You can hear " "what you've currently selected by clicking on the \"play selection\" button " "(the button with the yellow arrow) or by selecting 'Play selection' from the " "Play menu.\n" msgstr "" "Zrobisz wybory przeciągając mysz ponad prostym widokiem. Możesz słyszeć co " "obecnie wybrałeś klikając na przycisk \"odtwórz wybrane\" (przycisk z żółtą " "strzałką) lub wybierając 'Odtwórz wybrane' z menu Graj.\n" #: src/help.c:84 #, no-c-format msgid "" "You can use the cursor to refine the selection. Use the 'Selection start at " "cursor' and 'Selection end at cursor' buttons to move the selection starting " "point or the selection end point to the current cursor position. You can " "also drag the selection endpoints using the mouse.\n" msgstr "" "Możesz użyć kursor żeby udoskonalić wybór. Użyj przyciski 'Wybór startuje od " "kursora' i 'Wybór kończy się przy kursorze' żeby przenieść punkt startowy " "wyboru lub punkt końcowy wyboru na obecną pozycję kursora. Możesz także " "przeciągnąć punkty końcowe wyboru używając myszy.\n" #: src/help.c:86 #, no-c-format msgid "The 'Cut' and 'Copy' functions work like in any other software. \n" msgstr "Funkcje 'Wytnij' i 'Skopiuj' działają jak w innym oprogramowaniu. \n" #: src/help.c:88 #, no-c-format msgid "" "The 'Paste' function insert the clipboard contents at the cursor position. " "The 'Paste over' function works like 'Paste', except that it overwrites the " "data after the insert position. \n" msgstr "" "Funkcja 'Wklej' wstawi zawartość schowka w pozycji kursora. Funkcja 'Wklej " "ponad' działa jak 'Wklej', z wyjątkiem tego że nadpisze dane po pozycji " "wstawienia. \n" #: src/help.c:90 #, no-c-format msgid "" "The 'Paste mix' function combines the clipboard data with the data at the " "cursor position.\n" msgstr "Funkcja 'Wklej mix' połączy dane schowka z danymi z pozycji kursora.\n" #: src/help.c:92 #, no-c-format msgid "" "The 'Paste as new' function opens a new window and puts the clipboard " "contents into it. \n" msgstr "" "Funkcja 'Wklej jako nowy' otworzy nowe okno i umieści zawartość schowka do " "niego. \n" #: src/help.c:94 #, no-c-format msgid "" "The 'Crop' function deletes all parts of the file that are not selected.\n" msgstr "" "Funkcja 'Przytnij' usunie wszystkie części pliku które nie są wybrane.\n" #: src/help.c:96 #, no-c-format msgid "" "The 'Silence selection' function replaces the selected part with silence. To " "avoid clicks, the silent part is a line that meets the wave at the " "endpoints.\n" msgstr "" "Funkcja 'Wybór ciszy' zastąpi wybraną część ciszą. Żeby uniknąć trzasków, " "część ciszy jest linią która spotyka fale w punktach końcowych.\n" #: src/help.c:98 #, no-c-format msgid "" "All editing functions work non-destructively, that is, the file you're " "editing isn't actually changed until you save it (the effects also work this " "way).\n" msgstr "" "Wszystkie funkcje edycji działają nie-destrukcyjnie, to jest, plik który " "edytujesz nie jest aktualnie zmianiony zanim go nie zapiszesz (efekty też " "działają w ten sposób).\n" #: src/help.c:104 #, no-c-format msgid "" "mhWaveEdit has a few simple effects, which are available from the 'Effects' " "menu. \n" msgstr "" "mhWaveEdit ma kilka prostych efektów, które są dostępne z menu 'Efekty'. \n" #: src/help.c:106 #, no-c-format msgid " * Fade in/out\n" msgstr " * Wzmocnienie/wyciszenie\n" #: src/help.c:108 #, no-c-format msgid " This creates a linear fade in or fade out effect.\n" msgstr " To tworzy a liniowy efekt wzmocnienia lub wyciszenia.\n" #: src/help.c:110 #, no-c-format msgid " * Normalize, Normalize to...\n" msgstr " * Normalizuj, Normalizyj do...\n" #: src/help.c:112 #, no-c-format msgid "" " This amplifies the sound as much as possible without getting clipping " "distortion. The \"Normalize to...\" item lets you specify which level to " "normalize to.\n" msgstr "" " To wzmacnia dźwięk jak tylko możliwe bez obcinania zakłóceń. Pozycja " "\"Normalizuj do...\" pozwala określić do jakiego poziomu normalizować.\n" #: src/help.c:114 #, no-c-format msgid " * Volume adjust/fade...\n" msgstr " * Głośność dostosuj/wycisz...\n" #: src/help.c:116 #, no-c-format msgid "" " This effect lets you select a starting volume and a ending volume and " "amplifies the selection fading from the starting volume to the ending " "volume.\n" msgstr "" " Ten efekt pozwala wybrać głośność początkową i głośność końcową i " "wzmacnia wybór przechodząc z początkowej głośności do końcowej głośności.\n" #: src/help.c:118 #, no-c-format msgid "" " Note that volumes above 100% may cause sound distortion. Use the 'Find " "top volume' to find out the maximum amplification possible without " "distortion. (You can use this for normalizing samples.) \n" msgstr "" " Zauważ że głośności powyżej 100% mogą powodować zakłócenia dźwięku. Użyj " "'Znajdź szczytową głośność' żeby znaleźć maksymalne możliwe wzmocnienie bez " "zakłóceń. (Możesz to użyć dla normalizacji próbek.) \n" #: src/help.c:120 #, no-c-format msgid "" " By setting starting volume and ending volume to the same value you get a " "simple amplification of the sound. \n" msgstr "" " Przez ustawienie głośności startowej i głośności końcowej na tą samą " "wartość dostaniesz proste wzmocnienie dźwięku. \n" #: src/help.c:122 #, no-c-format msgid " * Convert samplerate...\n" msgstr " * Konwertuj próbkowanie...\n" #: src/help.c:124 #, no-c-format msgid "" " This converts the samplerate of the entire file to one you specify. There " "are different methods for doing this, usually the one in the top has the " "best quality but can take longer than the other methode.\n" msgstr "" " To konwertuje próbkowanie całego pliku do jednego określonego. Są różne " "metody żeby to zrobić, najczęściej to na szczycie ma najlepszą jakość ale " "może zabrać więcej czasu niż inna metoda.\n" #: src/help.c:126 #, no-c-format msgid " * Convert sample format...\n" msgstr " * Konwertuj format próbki...\n" #: src/help.c:128 #, no-c-format msgid " This converts the sample format of the entire file.\n" msgstr " To konwertuje format próbki całego pliku.\n" #: src/help.c:130 #, no-c-format msgid "" " The 'Don't actually change the data' option can be used if the program " "was wrong about the file's format.\n" msgstr "" " Opcja 'Nie zmieniaj aktualnie danych' może być użyta jeśli program " "pomylił się co do formatu pliku.\n" #: src/help.c:132 #, no-c-format msgid " * Byte swap\n" msgstr " * Zamiana bajtu\n" #: src/help.c:134 #, no-c-format msgid "" " This \"byte swaps\" the selected part. It can be used to repair damaged " "files where the byte order is wrong. Note that if the sound looks alright " "but plays wrong, you should not use this option, instead you should use the " "\"byte-swap output\" option in the Preferences dialog.\n" msgstr "" " To \"Zamiana bajtu\" wybranej części. Może być użyta żeby naprawić " "uszkodzone pliki gdzie porządek bajtów jest zły. Zauważ że jeśli dźwięk " "wygląda w porządku ale odtwarza się źle, nie powinieneś użyć tej opcji, " "zamiast tego powinieneś użyć opcji \"zamiana-bajtu wyjście\" w okienku " "dialogowym Ustawień.\n" #: src/help.c:136 #, no-c-format msgid " * Mix to mono\n" msgstr " * Mieszaj do mono\n" #: src/help.c:138 #, no-c-format msgid " This mixes all channels of the file together to a mono sound.\n" msgstr " To miesza wszystkie kanały pliku razem do dźwięku mono.\n" #: src/help.c:140 #, no-c-format msgid " * Add channel\n" msgstr " * Dodaj kanał\n" #: src/help.c:142 #, no-c-format msgid "" " This copies the first channel to a new channel in the sound, converting " "mono to stereo etc.\n" msgstr "" " To skopiuje pierwszy kanał do nowego kanału w dźwięku, konwertując mono " "do stereo itp.\n" #: src/help.c:144 #, no-c-format msgid " * Map channels...\n" msgstr " * Mapa kanałów...\n" #: src/help.c:145 #, no-c-format msgid " \n" msgstr " \n" #: src/help.c:146 #, no-c-format msgid "" " With this effect, you can change the number of channels in the file. You " "can also rearrange and add (i.e. mix) channels.\n" msgstr "" " Tym efektem, możesz zmienić liczbę kanałów w pliku. Możesz też poprawić i " "dodać (np. miksować) kanały.\n" #: src/help.c:148 #, no-c-format msgid " * Combine channels...\n" msgstr " * Połącz kanały...\n" #: src/help.c:150 #, no-c-format msgid "" " This effect lets you create a new sound by a linear combination of the " "old channels. This means you can do channel mixing / swapping / balance / " "panning / amplification etc. by entering different values. For example, to " "swap the left and right channel, you select that the new Channel 1 should be " "0% of the old Channel 1 and 100% of the old Channel 2, and the new Channel 2 " "should be 100% of the old Channel 1 and 0% of the old Channel 2 \n" msgstr "" " Ten efekt pozwala stworzyć nowy dźwięk przez liniowe połączenie starych " "kanałów. To znaczy że możesz zrobić miksować kanał / zamiana / balans / " "przesuwanie / wzmocnienie itp. wprowadzając różne wartości. Na przykład, " "żeby zamienić lewy i prawy kanał, wybierasz że nowy Kanał 1 powinien być 0% " "starego Kanału 1 i 100% starego Kanału 2, i nowy Kanał 2 powinien być 100% " "starego Kanału 1 i 0% starego Kanału 2 \n" #: src/help.c:152 #, no-c-format msgid " * Speed adjustment...\n" msgstr " * Regulacja prędkości...\n" #: src/help.c:154 #, no-c-format msgid "" " This effect changes the speed of the selection. The tone will change as " "well.\n" msgstr "" " Ten efekt zmienia prędkość wyboru. Brzmienie będzie zmienione także.\n" #: src/help.c:155 #, no-c-format msgid " * Pipe through program...\n" msgstr " * Rura za pomocą programu...\n" #: src/help.c:156 #, no-c-format msgid " \n" msgstr " \n" #: src/help.c:157 #, no-c-format msgid "" " This effect is for advanced users wanting to pipe raw audio data through " "an external program. The output of the program is read back and replaces the " "processed part. \n" msgstr "" " Ten efekt jest dla zaawansowanych użytkowników chcących skanalizować " "surowe dane audio przez zewnętrzny program. Wyjście programu jest " "odczytywane ponownie i zamienia przetwarzaną część. \n" #: src/help.c:159 #, no-c-format msgid "" "mhWaveEdit supports LADSPA effects and can also make use of most of the SoX " "utility's effects. To find the LADSPA plugins the environment variable " "LADSPA_PATH must be properly set up. \n" msgstr "" "mhWaveEdit obsługuje efekty LADSPA i może również zrobić użytek z większości " "narzędzi efekty programu SoX. Żeby znaleźć wtyczki LADSPA zmienna " "środowiskowa LADSPA_PATH musi być poprawnie ustawiona. \n" #: src/help.c:161 #, no-c-format msgid "" "All supported effects can be found by choosing the 'Effects...' menu item. " "The effects are listed with names beginning with [B] for builtin effects, " "[L] for LADSPA effects, and [S] for SoX effects.\n" msgstr "" "Wszystkie obsługiwane efekty mogą być znalezione wybierając pozycję menu " "'Efekty...'. Efekty są w liście z nazwami rozpoczynającymi się od [B] dla " "wbudowanych efektów, [L] dla efektów LADSPA, i [S] dla efektów SoX.\n" #: src/help.c:167 #, no-c-format msgid "Some notes on sound quality.\n" msgstr "Kilka uwag o jakości dźwięku.\n" #: src/help.c:169 #, no-c-format msgid "" "The general rule when doing audio editing/processing is to not manipulate " "the data more than necessary and keep an original copy whenever you're " "processing your important files. \n" msgstr "" "Generalna zasada gdy robi się edycję/przetwarzanie audio to żeby nie " "manipulować danymi bardziej niż potrzeba i zachować oryginalną kopię zawsze " "gdy przetwarzasz ważne pliki. \n" #: src/help.c:171 #, no-c-format msgid "" "Cut, copy and paste operations move the data around without modifying it, so " "these don't degrade the sound quality. Because of level differences, you may " "get a \"step\" at the start and end of the inserted part, which can cause a " "small clicking sound. \n" msgstr "" "Operacje wytnij, skopiuj i wklej przeniosą dane bez ich modyfikacji, zatem " "nie pogorszą jakości dźwięku. Z powodu różnic poziomu, możesz dostać \"krok" "\" na starcie i końcu dodanej części, który może spowodować małe trzaski " "dźwięku. \n" #: src/help.c:173 #, no-c-format msgid "" "The mix paste function doesn't decrease quality, unless the peaks become too " "high and you get clipping. In that case you will get a warning message.\n" msgstr "" "Funkcja miksowania wklejania nie zmniejszy jakości, chyba że szczyty staną " "się zbyt wysokie i dostaniesz trzaski. W tym przypadku dostaniesz " "ostrzeżenie.\n" #: src/help.c:175 #, no-c-format msgid "" "Sound data is normally stored as integer values. Therefore, whenever you " "normalize, adjust volume, decrease sample size or filter a sound, the result " "must be rounded. If you use 24 or 32 bit sample sizes, this is not really a " "problem, but if you use 8 or 16 bits sample size, this rounding causes a " "decrease in quality. \n" msgstr "" "Dane dźwiękowe są normalnie przechowywane jako wartości całkowite. Dlatego " "gdy normalizujesz, dostosowujesz głośność, zmniejszasz wielkość próbki lub " "filtra dźwięku, wynik musi być zaokrąglony. Gdy używasz 24 lub 32 bitowe " "wielkości próbki, to nie jest rzeczywiście problem, ale jeśli używasz 8 lub " "16 bitową wielkość próbki, to zaokrąglenie spowoduje zmniejszenie jakości. \n" #: src/help.c:177 #, fuzzy, no-c-format msgid "" "The quality decrease that the rounding causes can be masked by adding a " "small amount of noise before rounding. This is called \"dithering\". " "mhWaveEdit supports basic dithering and it's enabled by default.\n" msgstr "" "Spadek jakości powodowany zaokrągleniem może być maskowany przez dodanie " "małej ilości hałasu przed zaokrąglaniem. To jest zwane \"rozpraszanie\". " "mhWaveEdit obsługuje podstawowe trójkątne rozpraszanie i jest ono domyślnie " "włączone. \n" #: src/help.c:179 #, no-c-format msgid "" "By default, mhWaveEdit uses floating-point temporary files for storing " "processed results to avoid rounding until the file is saved.\n" msgstr "" "Domyślnie, mhWaveEdit używa zmiennoprzecinkowych plików tymczasowych dla " "przechowywania wyników przetwarzania żeby uniknąć zaokrąglania do czasu " "zapisania pliku.\n" #: src/help.c:184 #, no-c-format msgid "" "Even if mhWaveEdit was originally built for editing wav files, it's also " "possible to load and save in a few other formats. mhWaveEdit always supports " "wav and raw files, but if it's compiled with the libsndfile library, " "mhWaveEdit supports a couple of other formats as well. \n" msgstr "" "Nawet jeśli mhWaveEdit był oryginalnie zbudowany dla edycji plików wav, jest " "też możliwe wczytywać i nagrywać w kilku innych formatach. mhWaveEdit zawsze " "obsługuje pliki wav i raw, ale jeśli jest skompilowany z biblioteką " "libsndfile, mhWaveEdit obsługuje kilka innych formatów także. \n" #: src/help.c:186 #, no-c-format msgid "" "To save a file with a different file format, use \"Save as...\" and choose a " "format in the file type selection box. \n" msgstr "" "Żeby zapisać plik w innym formacie pliku, użyj \"Zapisz jako...\" i wybierz " "format w okienku wyboru rodzaju pliku. \n" #: src/help.c:188 #, no-c-format msgid "" "mhWaveEdit has basic support for mp3 and ogg formats. For this to work you " "need to have LAME installed for mp3 support, and OggDec/OggEnc for Ogg " "support. If you have these programs, you can open and save mp3/ogg files " "just like any other file format.\n" msgstr "" "mhWaveEdit ma podstawową obsługę formatów mp3 i ogg. Żeby to działało musisz " "mieć zainstalowany LAME do obsługi mp3, i OggDec/OggEnc do obsługi Ogg. " "Jeśli masz te programy, możesz otworzyć i zapisać pliki mp3/ogg tak jak " "każdy inny format pliku.\n" #: src/help.c:190 #, no-c-format msgid "" "If mplayer is installed, mhwaveedit can open all formats that it supports, " "for example the soundtrack of a video file. Since mplayer is only a player, " "these files can not be saved back after editing, you have to save the file " "into a supported format.\n" msgstr "" "Jeśli jest zainstalowany mplayer, mhwaveedit może otworzyć wszystkie formaty " "które on obsługuje, na przykład ścieżkę dźwiękową pliku video. Jako że " "mplayer to tylko odtwarzacz, te pliki nie mogą być zapisane ponownie po " "edycji, musisz zapisać plik w obsługiwanym formacie.\n" #: src/help.c:195 #, no-c-format msgid "" "mhWaveEdit creates a directory ~/.mhwaveedit where it stores configuration " "information. \n" msgstr "" "mhWaveEdit utworzy katalog ~/.mhwaveedit gdzie będzie przechowywał " "informacje o konfuguracji. \n" #: src/help.c:197 #, no-c-format msgid "" "The configuration file is called config. It can be hand edited, but the " "easiest way is through 'Preferences' on the Edit menu.\n" msgstr "" "Plik konfiguracji nazywa się config. Może być ręcznie edytowany, ale " "najłatwiejszy sposób jest poprzez 'Ustawienia' w menu Edycji.\n" #: src/help.c:199 #, no-c-format msgid "" "Each mhwaveedit process creates a session file in the .mhwaveedit directory " "called mhwaveedit-session---, where is the " "session ID number and is a character code showing the state of the " "session ('r' for running sessions). \n" msgstr "" "Każdy proces mhwaveedit tworzy plik sesji w katalogu .mhwaveedit zwany " "mhwaveedit-session---, gdzie to numer sesji " "ID i to kody znaku pokazujące stan sesji ('r' dla uruchomionych " "sesji). \n" #: src/help.c:201 #, no-c-format msgid "" "Temporary files are by default also stored in the ~/.mhwaveedit directory. " "Which directories to use can be set through the preferences dialog. To get " "the best performance, you should have one temporary directory for each local " "filesystem. The temporary files have names of the form \"mhwaveedit-temp-" "-nnnn-\". Do NOT open or remove temporary files with the same " "pid number as a currently running mhWaveEdit.\n" msgstr "" "Pliki tymczasowe są domyślnie także przechowywane w katalogu ~/.mhwaveedit. " "Które katalogi użyć może być ustawione poprzez okienko dialogowe ustawień. " "By mieć najlepszą wydajność, powinieneś mieć jeden katalog tymczasowy dla " "każdego lokalnego systemu plików. Pliki tymczasowe mają nazwy formy " "\"mhwaveedit-temp--nnnn-\". NIE otwieraj ani nie usuwaj plików " "tymczasowych z tym samym numerem pid jak obecnie uruchomiony mhWaveEdit.\n" #: src/help.c:203 #, no-c-format msgid "" "mhWaveEdit checks on startup for leftover temporary files and lets the user " "open them. After opening a crashed session, the files can be saved or thrown " "away.\n" msgstr "" "mhWaveEdit sprawdza na starcie pozostałości plików tymczasowych i pozwala " "użytkownikowi je otworzyć. Po otwarciu zawieszonej sesji, pliki mogą być " "zapisane lub wyrzucone.\n" #: src/help.c:208 #, no-c-format msgid "F1 Help\n" msgstr "F1 Pomoc\n" #: src/help.c:209 #, no-c-format msgid "F12 Record\n" msgstr "F12 Nagranie\n" #: src/help.c:211 #, no-c-format msgid "Ctrl+(number) Set mark\n" msgstr "Ctrl+(liczba) Ustaw znak\n" #: src/help.c:212 #, no-c-format msgid "(number) Goto mark\n" msgstr "(liczba) Idź do znaku\n" #: src/help.c:214 #, no-c-format msgid "Ctrl+P Preferences\n" msgstr "Ctrl+P Ustawienia\n" #: src/help.c:215 #, no-c-format msgid "Ctrl+E Effects\n" msgstr "Ctrl+E Efekty\n" #: src/help.c:217 #, no-c-format msgid "Ctrl+O Open file\n" msgstr "Ctrl+O Otwórz plik\n" #: src/help.c:218 #, no-c-format msgid "Ctrl+S Save file\n" msgstr "Ctrl+S Zapisz plik\n" #: src/help.c:219 #, no-c-format msgid "Ctrl+U Save selection as\n" msgstr "Ctrl+U Zapisz wybór jako\n" #: src/help.c:221 #, no-c-format msgid "Ctrl+C Copy\n" msgstr "Ctrl+C Skopiuj\n" #: src/help.c:222 #, no-c-format msgid "Ctrl+X Cut\n" msgstr "Ctrl+X Wytnij\n" #: src/help.c:223 #, no-c-format msgid "Ctrl+D Delete\n" msgstr "Ctrl+D Usuń\n" #: src/help.c:224 #, fuzzy, no-c-format msgid "Delete Delete\n" msgstr "Ctrl+D Usuń\n" #: src/help.c:225 #, no-c-format msgid "Ctrl+V Paste\n" msgstr "Ctrl+V Wklej\n" #: src/help.c:226 #, no-c-format msgid "Ctrl+Z Undo\n" msgstr "Ctrl+Z Cofnij\n" #: src/help.c:227 #, no-c-format msgid "Ctrl+A Select all\n" msgstr "Ctrl+A Wybierz wszystko\n" #: src/help.c:229 #, no-c-format msgid "Ctrl+G Position cursor (Go to)\n" msgstr "Ctrl+G Pozycja kursora (Idź do)\n" #: src/help.c:230 #, no-c-format msgid "Ctrl+H Position cursor at file start\n" msgstr "Ctrl+H Pozycja kursora na początku pliku\n" #: src/help.c:231 #, no-c-format msgid "Ctrl+J Position cursor at file end\n" msgstr "Ctrl+J Pozycja kursora na końcu pliku\n" #: src/help.c:232 #, no-c-format msgid "Ctrl+K Position cursor at selection start\n" msgstr "Ctrl+K Pozycja kursora na początku wyboru\n" #: src/help.c:233 #, no-c-format msgid "Ctrl+L Position cursor at selection end\n" msgstr "Ctrl+L Pozycja kursora na końcu wyboru\n" #: src/help.c:234 #, no-c-format msgid "Y,U Move cursor to nearest all-channel zero-crossing\n" msgstr "" "Y,U Przesuń kursor do najbliższego wszystkich kanałów przejścia " "zerowego\n" #: src/help.c:235 #, no-c-format msgid "I,O Move cursor to nearest any-channel zero-crossing\n" msgstr "" "I,O Przesuń kursor do najbliższego jakiegoś kanału przejścia " "zerowego\n" #: src/help.c:237 #, no-c-format msgid "Ctrl+Q Selection start at cursor\n" msgstr "Ctrl+Q Początek wyboru w pozycji kursora\n" #: src/help.c:238 #, no-c-format msgid "Ctrl+W Selection end at cursor\n" msgstr "Ctrl+W Koniec wyboru w pozycji kursora\n" #: src/help.c:240 #, no-c-format msgid "+,= Zoom in\n" msgstr "+,= Powiększenie\n" #: src/help.c:241 #, no-c-format msgid "- Zoom out\n" msgstr "- Pomniejszenie\n" #: src/help.c:242 #, no-c-format msgid "> Zoom to selection\n" msgstr "> Powiększenie wyboru\n" #: src/help.c:243 #, no-c-format msgid "< Zoom all\n" msgstr "< Powiększenie wszystkiego\n" #: src/help.c:244 #, no-c-format msgid "Arrow keys Scroll left/right\n" msgstr "Klaw strzałek Przewijanie lewo/prawo\n" #: src/help.c:246 #, fuzzy, no-c-format msgid "Home Move view to file start\n" msgstr "Ctrl+H Pozycja kursora na początku pliku\n" #: src/help.c:247 #, fuzzy, no-c-format msgid "End Move view to file end\n" msgstr "K,L Przenieś kursor o jedną próbkę\n" #: src/help.c:248 #, fuzzy, no-c-format msgid "Tab Move view to cursor\n" msgstr "K,L Przenieś kursor o jedną próbkę\n" #: src/help.c:249 #, fuzzy, no-c-format msgid "Ctrl+Tab Move cursor to center of view\n" msgstr "Ctrl+L Pozycja kursora na końcu wyboru\n" #: src/help.c:251 #, fuzzy, no-c-format msgid "Space Play/Stop\n" msgstr " Odtórz/Stop\n" #: src/help.c:252 #, no-c-format msgid "Shift+Space Play all\n" msgstr "" #: src/help.c:253 #, no-c-format msgid ", Play from cursor pos\n" msgstr ", Odtwórz od pozycji kursora\n" #: src/help.c:254 #, no-c-format msgid ". Stop\n" msgstr ". Stop\n" #: src/help.c:255 #, no-c-format msgid "/ Play selection\n" msgstr "/ Odtwórz wybrane\n" #: src/help.c:256 #, no-c-format msgid "H,J Move cursor (and playback) 1/8 of view\n" msgstr "H,J Przenieś kursor (i odtwarzanie) 1/8 widoku\n" #: src/help.c:257 #, no-c-format msgid "K,L Move cursor one sample\n" msgstr "K,L Przenieś kursor o jedną próbkę\n" #: src/help.c:258 #, no-c-format msgid "Ctrl+arrow Move cursor (and playback) half second\n" msgstr "Ctrl+strzałka Przenieś kursor (i odtwarzanie) o pół sekundy\n" #: src/help.c:259 #, no-c-format msgid "( Play first 3 seconds of selection\n" msgstr "( Odtwórz pierwsze 3 sekundy wyboru\n" #: src/help.c:260 #, no-c-format msgid ") Play last 3 seconds of selection\n" msgstr ") Odtwórz ostanie 3 sekundy wyboru\n" #: src/help.c:265 #, no-c-format msgid "" "If you find a bug or flaw in the program that's not mentioned in the BUGS " "file, report the bug in the bug tracker (see contact info) or mail a bug " "report describing the bug to: magnus.hjorth@home.se\n" msgstr "" "Jeśli znajdziesz błąd lub wadę programu która nie jest wymieniona w pliku " "BUGS, zaraportuj ten błąd w tropicielu błędów (spójrz informacja kontaktu) " "lub wyślij mail z raportem błędu opisującym błąd do: magnus.hjorth@home.se\n" #: src/help.c:267 #, no-c-format msgid "" "In case of a crash, please do not send me any core dumps. They are huge and " "completely useless to me. Instead, create a backtrace. Backtraces tell you " "exactly where the program crashed.\n" msgstr "" "W przypadku zawieszenia się komputera, proszę nie wysyłaj mi zrzutów " "pamięci. One są ogromne i kompletnie bezużyteczne dla mnie. Zamiast, stwórz " "ślad. Ślady powiedzą dokładnie gdzie program zawiesił się.\n" #: src/help.c:269 #, no-c-format msgid "How to create a backtrace:\n" msgstr "Jak stworzyć ślady:\n" #: src/help.c:270 #, no-c-format msgid "1. Enable core dumps: ulimit -c unlimited\n" msgstr "1. Włącz zrzut pamięci: ulimit -c unlimited\n" #: src/help.c:271 #, no-c-format msgid "2. Run the program: mhwaveedit\n" msgstr "2. Uruchom program: mhwaveedit\n" #: src/help.c:272 #, no-c-format msgid "" "3. Make the program crash. You should now get a file named core or core.1234 " "in the directory you're in.\n" msgstr "" "3. Zrób zawieszenie się programu. Powinieneś teraz dostać plik nazwany core " "lub core.1234 w katalogu w którym jesteś.\n" #: src/help.c:273 #, no-c-format msgid "4. Run gdb with the program and core file: \n" msgstr "4. Uruchom gdb z programem i plikiem core: \n" #: src/help.c:274 #, no-c-format msgid " gdb /usr/local/bin/mhwaveedit core | tee backtrace.txt\n" msgstr " gdb /usr/local/bin/mhwaveedit core | tee backtrace.txt\n" #: src/help.c:275 #, no-c-format msgid "5. After gdb has loaded, use the command: bt\n" msgstr "5. Gdy wczyta się gdb, użyj komendy: bt\n" #: src/help.c:276 #, no-c-format msgid "6. Quit gdb with the command: quit\n" msgstr "6. Opuść gdb komendą: quit\n" #: src/help.c:277 #, no-c-format msgid "7. Now you should have a back trace in the file backtrace.txt\n" msgstr "7. Teraz powinieneś mieć ślad w pliku backtrace.txt\n" #: src/help.c:282 #, no-c-format msgid "" "There are plenty of things you can do if you want to help the development of " "mhWaveEdit. \n" msgstr "" "Możesz zrobić mnóstwo rzeczy jeśli chcesz pomóc w rozwoju mhWaveEdit. \n" #: src/help.c:284 #, no-c-format msgid "" "First of all, look for bugs and report all bugs you find into the bug " "tracker or through e-mail. Sometimes a bug can get overlooked for a long " "time because nobody reports it, so don't be afraid to report bugs that have " "been there for a few releases. You don't have to provide fixes or very " "detailed information, although it helps of course.\n" msgstr "" "Przede wszystkim, szukaj błędów i zaraportuj wszystkie znalezione błędy w " "tropicielu błędów lub poprzez e-mail. Czasem możesz mieć błąd przeoczony od " "długiego czasu ponieważ nikt go nie zaraportował, zatem nie bój się " "raportować błędów które są od kilku wydań. Nie musisz dostarczać poprawek " "lub bardzo szczegółowej informacji, chociaż to oczywiście pomoże.\n" #: src/help.c:286 #, no-c-format msgid "" "Feature requests are also welcome, report them to the mailing list or to the " "bug tracker.\n" msgstr "" "Prośby o funkcje są także mile widziane, zgłaszaj je na listę mailingową lub " "do tropiciela błędów.\n" #: src/help.c:288 #, no-c-format msgid "" "If you speak a language other than English and mhWaveEdit isn't translated " "to your language, you can contribute a translation. To do that, copy the " "template mhwaveedit.pot in the po directory into a new file ll.po, where ll " "is your language code (see http://www.gnu.org/software/gettext/manual/" "html_node/gettext_221.html for a list of language codes). \n" msgstr "" "Jeśli mówisz językiem innym niż angielski i mhWaveEdit nie jest " "przetłumaczony na twój język, możesz przyczynić się do tłumaczenia. Żeby to " "zrobić, skopiuj szablon mhwaveedit.pot w katalogu po do nowego pliku ll.po, " "gdzie ll to twój kod języka (spójrz http://www.gnu.org/software/gettext/" "manual/html_node/gettext_221.html dla listy kodów języków). \n" #: src/help.c:290 #, no-c-format msgid "" "It's possible to edit po-files by hand, but I recommend a program such as " "poEdit (http://www.poedit.org) for editing translations. \n" msgstr "" "Jest możliwa edycja plików po ręcznie, ale rekomenduję program taki jak " "poEdit (http://www.poedit.org) dla edycji tłumaczeń. \n" #: src/help.c:292 #, no-c-format msgid "" "Note that for those translatable strings that look like \"RecordStatus|Paused" "\", you should ignore what's to the left and only translate the string to " "the right (\"Paused\" in this example). This convention is there to make it " "possible to translate the same string to different things depending on " "context. \n" msgstr "" "Zauważ że dla tych tłumaczonych łańcuchów które wyglądają jak \"RecordStatus|" "Paused\", powinieneś zignorować co jest z lewa i tylko przetłumaczyć łańcuch " "z prawej (\"Paused\" w tym przykładzie). Ta konwencja jest tu by zrobić " "możliwym przetłumaczenie tych samych łańcuchów na różne rzeczy w zależności " "od kontekstu. \n" #: src/help.c:294 #, no-c-format msgid "" "After you've filled in all the translations you want (you don't have to " "translate all the strings), mail in the po file to me (see contact info) and " "I'll add it to the next release. \n" msgstr "" "Gdy wypełnisz wszystkie tłumaczenia które chcesz (nie musisz tłumaczyć " "wszystkich łańcuchów), wyślij mail z plikiem po do mnie (spójrz informacja " "kontaktowa) i dodam ją do następnego wydania. \n" #: src/help.c:296 #, no-c-format msgid "" "If a translation is incomplete, you're very welcome to translate the " "remaining untranslated messages and mail them in. Corrections to " "translations are also appreciated, but they may need to be checked with the " "previous translator before including them. \n" msgstr "" "Jeśli tłumaczenie jest niekompletne, jesteś bardzo zapraszany by " "przetłumaczyć pozostające nieprzetłumaczone treści i wysłać je mailem. " "Korekty tłumaczenia są także mile widziane, ale one mogą potrzebować być " "sprawdzone z poprzednim tłumaczem przed ich załączeniem. \n" #: src/help.c:302 #, no-c-format msgid "For bug reports, translation updates, patches and PayPal donations:\n" msgstr "" "Dla raportowania błędów, uaktualniania tłumaczeń, łatek i darowizn PayPal:\n" #: src/help.c:303 #, no-c-format msgid "magnus.hjorth@home.se\n" msgstr "magnus.hjorth@home.se\n" #: src/help.c:305 #, no-c-format msgid "Project page with bug tracker, mailing list membership:\n" msgstr "Strona projektu z tropicielem błędów, członkami listy mailingowej:\n" #: src/help.c:306 #, no-c-format msgid "http://gna.org/projects/mhwaveedit\n" msgstr "http://gna.org/projects/mhwaveedit\n" #: src/help.c:308 #, no-c-format msgid "Mailing list (you must be a subscriber before you can post messages):\n" msgstr "" "Lista mailingowa (musisz być abonentem zanim będziesz mógł wysyłać " "wiadomości):\n" #: src/help.c:309 #, no-c-format msgid "mhwaveedit-discuss@gna.org\n" msgstr "mhwaveedit-discuss@gna.org\n" #: src/inifile.c:84 src/inifile.c:91 #, c-format msgid "%s: Expected '=': %s\n" msgstr "%s: Spodziewane '=': %s\n" #: src/inifile.c:97 #, c-format msgid "%s: Expected value: %s\n" msgstr "%s: Spodziewana wartość: %s\n" #: src/int_box.c:202 #, c-format msgid "Value for %s must be a number between %ld and %ld" msgstr "Wartość dla %s musi być liczbą pomiędzy %ld a %ld" #: src/ladspacore.c:94 #, c-format msgid "Effect %s contains invalid port %s" msgstr "Efekt %s zawiera nieważny port %s" #: src/ladspacore.c:140 #, c-format msgid "Ladspa: Error scanning %s" msgstr "Ladspa: Błąd skanowania %s" #: src/ladspacore.c:409 #, c-format msgid "Applying effect '%s'" msgstr "Zastosowanie efektu '%s'" #: src/ladspadialog.c:87 #, c-format msgid "Value for '%s' must not be below %f" msgstr "Wartość dla '%s' nie może być poniżej %f" #: src/ladspadialog.c:94 #, c-format msgid "Value for '%s' must not be above %f" msgstr "Wartość dla '%s' nie może być powyżej %f" #: src/ladspadialog.c:127 #, c-format msgid "" "You have mapped more than one output port to channel '%s'. You can only map " "one output port to each channel." msgstr "" "Zmapowałeś więcej niż jeden port wyjścia do kanału '%s'. Możesz tylko " "zmapować jeden port wyjścia dla każdego kanału." #: src/ladspadialog.c:191 #, c-format msgid "Author: %s" msgstr "Autor: %s" #: src/ladspadialog.c:196 #, c-format msgid "Copyright: %s" msgstr "Prawa autorskie: %s" #: src/ladspadialog.c:203 msgid " Input controls " msgstr " Kontrolki wejścia" #: src/ladspadialog.c:292 msgid " Output controls " msgstr " Kontrolki wyjścia " #: src/ladspadialog.c:311 src/recorddialog.c:311 src/recorddialog.c:739 msgid "None" msgstr "Żaden" #: src/ladspadialog.c:319 msgid " Input audio " msgstr " Wejście audio " #: src/ladspadialog.c:319 msgid " Output audio " msgstr " Wyjście audio " #: src/ladspadialog.c:350 msgid "Keep data in unmapped output channels" msgstr "Zachowaj dane w niezmapowanych kanałach wyjściowych" #: src/main.c:166 #, c-format msgid "Syntax: %s [files]\n" msgstr "Składnia: %s [plików]\n" #: src/main.c:169 msgid "Testing conversion functions:" msgstr "Testowanie funkcji konwersji" #: src/main.c:171 msgid "Testing conversion functions finished." msgstr "Testowanie funkcji ukończonych konwersji" #: src/main.c:190 msgid "Expected driver name after --driver option" msgstr "Spodziewana nazwa sterownika po opcji --driver" #: src/main.c:196 #, c-format msgid "Unknown option '%s'" msgstr "Nieznana opcja '%s'" #: src/main.c:340 msgid "" "Could not find home directory. Using current directory as home directory." msgstr "" "Nie można znaleźć katalogu domowego. Użycie bieżącego katalogu jako katalogu " "domowego." #: src/main.c:368 msgid "Black" msgstr "Czarny" #: src/main.c:369 msgid "White" msgstr "Biały" #: src/main.c:370 msgid "Background" msgstr "Tło" #: src/main.c:371 msgid "L Waveform" msgstr "L Fala" #: src/main.c:372 msgid "R Waveform" msgstr "P Fala" #: src/main.c:373 msgid "Cursor" msgstr "Kursor" #: src/main.c:374 msgid "Marks" msgstr "Znaki" #: src/main.c:375 msgid "Selection" msgstr "Wybór" #: src/main.c:376 msgid "Progress bar" msgstr "Pasek postępu" #: src/main.c:377 msgid "Zero-level" msgstr "Poziom zero" #: src/main.c:378 #, fuzzy msgid "Buffer position" msgstr "Przekroczenie bufora!" #: src/main.c:501 #, c-format msgid "Error launching mixer: fork: %s" msgstr "Błąd uruchomienia miksera: część pliku: %s" #: src/main.c:552 src/main.c:571 msgid "Mono" msgstr "Mono" #: src/main.c:553 msgid "Left" msgstr "Lewy" #: src/main.c:554 msgid "Right" msgstr "Prawy" #: src/main.c:556 #, c-format msgid "Ch%d" msgstr "Ch%d" #: src/main.c:572 msgid "Stereo" msgstr "Stereo" #: src/main.c:574 #, c-format msgid "%d channels" msgstr "%d kanałów" #: src/main.c:1149 msgid "Ignoring extreme old window size/position values\n" msgstr "Ignorowanie ekstremalnie starego okna rozmiar/pozycja wartości\n" #: src/mainwindow.c:217 #, c-format msgid "mhWaveEdit: %s (%s): %d Hz, %s" msgstr "mhWaveEdit: %s (%s): %d Hz, %s" #: src/mainwindow.c:300 msgid "Use default settings" msgstr "Użyj ustawień domyślnych" #: src/mainwindow.c:304 msgid "Auto-detect from extension" msgstr "Automatyczne wykrycie z rozszerzenia" #: src/mainwindow.c:319 msgid "File type: " msgstr "Rodzaj pliku: " #: src/mainwindow.c:365 msgid "" "The file has not changed since last save. Press OK if you want to save it " "anyway?" msgstr "" "Plik nie zmienił się od ostatniego zapisu. Naciśnij OK jeśli chcesz go " "zapisać tak czy owak?" #: src/mainwindow.c:374 msgid "Save File" msgstr "Zapisz plik" #: src/mainwindow.c:399 #, c-format msgid "Save changes to %s?" msgstr "Zapisz zmiany do %s?" #: src/mainwindow.c:792 src/mainwindow.c:796 msgid "Load File" msgstr "Wczytaj plik" #: src/mainwindow.c:821 msgid "Save selection as ..." msgstr "Zapisz wybór jako ..." #: src/mainwindow.c:1116 #, c-format msgid "Chunk %p has opencount=%d\n" msgstr "Kawałek %p ma liczbę otwartych=%d\n" #: src/mainwindow.c:1199 #, c-format msgid "" "\n" "Window '%s'\n" msgstr "" "\n" "Okno '%s'\n" #: src/mainwindow.c:1200 msgid " Current chunk:" msgstr " Obecny kawałek:" #: src/mainwindow.c:1202 msgid " History:" msgstr " Historia:" #: src/mainwindow.c:1257 msgid "There already is only one channel!" msgstr "Tu już jest tylko jeden kanał!" #: src/mainwindow.c:1366 msgid "mhWaveEdit Help" msgstr "Pomoc mhWaveEdit" #: src/mainwindow.c:1465 msgid "About mhWaveEdit" msgstr "O mhWaveEdit" #: src/mainwindow.c:1477 #, fuzzy msgid "" "Created by Magnus Hjorth (magnus.hjorth@home.se)\n" "Copyright 2002-2018, Magnus Hjorth" msgstr "" "Stworzone przez Magnus Hjorth (magnus.hjorth@home.se)\n" "Prawa autorskie 2002-2007, Magnus Hjorth" #: src/mainwindow.c:1484 #, c-format msgid "Current sound driver: %s" msgstr "Obecny sterownik dźwięku: %s" #: src/mainwindow.c:1492 #, c-format msgid "Compiled %s %s" msgstr "Skompilowane %s %s" #: src/mainwindow.c:1498 msgid "Uses double-precision math" msgstr "Wykorzystuje podwójną precyzję matematyczną" #: src/mainwindow.c:1505 msgid "" "Distributed under GNU General Public License.\n" "For information, see the file COPYING" msgstr "" "Rozpowszechniany według GNU General Public License.\n" "Dla informacji, zobacz plik KOPIOWANIE" #: src/mainwindow.c:1669 msgid "Seconds of silence: " msgstr "Sekundy ciszy: " #: src/mainwindow.c:1669 msgid "Insert Silence" msgstr "Wstaw Ciszę" #: src/mainwindow.c:1718 msgid "Level: " msgstr "Poziom: " #: src/mainwindow.c:1718 msgid "Normalize to..." msgstr "Normalizuj do..." #: src/mainwindow.c:1928 msgid "/_File" msgstr "/_Plik" #: src/mainwindow.c:1929 msgid "/File/_Open..." msgstr "/Plik/_Otwórz..." #: src/mainwindow.c:1930 msgid "/File/_Save" msgstr "/Plik/_Zapisz" #: src/mainwindow.c:1931 msgid "/File/Save _as..." msgstr "/Plik/Zapisz _jako..." #: src/mainwindow.c:1932 msgid "/File/Save selection as..." msgstr "/Plik/Zapisz wybór jako..." #: src/mainwindow.c:1933 msgid "/_Edit" msgstr "/_Edycja" #: src/mainwindow.c:1934 msgid "/Edit/_Undo" msgstr "/Edytcja/_Cofnij" #: src/mainwindow.c:1935 msgid "/Edit/_Redo" msgstr "/Edycja/_Ponów" #: src/mainwindow.c:1936 msgid "/Edit/sep1" msgstr "/Edycja/sep 1" #: src/mainwindow.c:1937 msgid "/Edit/Cu_t" msgstr "/Edycja/_Wytnij" #: src/mainwindow.c:1938 msgid "/Edit/_Copy" msgstr "/Edycja/_Skopiuj" #: src/mainwindow.c:1939 msgid "/Edit/_Paste" msgstr "/Edycja/_Wklej" #: src/mainwindow.c:1940 msgid "/Edit/Paste _over" msgstr "/Edycja/Wklej _ponad" #: src/mainwindow.c:1941 msgid "/Edit/_Mix paste" msgstr "/Edycja/Wklej _miks" #: src/mainwindow.c:1942 msgid "/Edit/Insert _silence" msgstr "/Edycja/Wstaw _ciszę" #: src/mainwindow.c:1943 msgid "/Edit/Paste to _new" msgstr "/Edycja/Wklej do _nowego" #: src/mainwindow.c:1944 msgid "/Edit/Cr_op" msgstr "/Edycja/_Przytnij" #: src/mainwindow.c:1945 msgid "/Edit/_Delete" msgstr "/Edycja/_Usuń" #: src/mainwindow.c:1946 msgid "/Edit/Silence selection" msgstr "/Edycja/Wybór ciszy" #: src/mainwindow.c:1947 msgid "/Edit/sep2" msgstr "/Edycja/spe 2" #: src/mainwindow.c:1948 msgid "/Edit/Select _all" msgstr "/Edycja/Wybierz _wszystko" #: src/mainwindow.c:1949 msgid "/Edit/Select none" msgstr "/Edycja/Wybierz nic" #: src/mainwindow.c:1950 msgid "/Edit/sep3" msgstr "/Edycja/sep 3" #: src/mainwindow.c:1951 msgid "/Edit/Clear clipboard" msgstr "/Edycja/Wyczyść schowek" #: src/mainwindow.c:1952 msgid "/Edit/sep4" msgstr "/Edycja/sep 4" #: src/mainwindow.c:1953 msgid "/Edit/Preferences" msgstr "/Edycja/Ustawienia" #: src/mainwindow.c:1954 msgid "/_View" msgstr "/_Widok" #: src/mainwindow.c:1955 msgid "/View/Zoom _in" msgstr "/Widok/_Powiększenie" #: src/mainwindow.c:1956 msgid "/View/Zoom _out" msgstr "/Widok/_Pomniejszenie" #: src/mainwindow.c:1957 msgid "/View/Zoom to _selection" msgstr "/Widok/Powiększ do _wyboru" #: src/mainwindow.c:1958 msgid "/View/sep1" msgstr "/Widok/sep 1" #: src/mainwindow.c:1959 msgid "/View/Zoom _all" msgstr "/Widok/Powiększ _wszystko" #: src/mainwindow.c:1960 msgid "/View/sep2" msgstr "/Widok/sep 2" #: src/mainwindow.c:1961 msgid "/View/_Time scale" msgstr "/Widok/_Skala czasu" #: src/mainwindow.c:1962 msgid "/View/_Horizontal zoom" msgstr "/Widok/Powiększ _poziomo" #: src/mainwindow.c:1963 msgid "/View/_Vertical zoom" msgstr "/Widok/Powiększ _pionowo" #: src/mainwindow.c:1964 msgid "/View/Sp_eed slider" msgstr "/Widok/Suwak _szybkości" #: src/mainwindow.c:1965 #, fuzzy msgid "/View/Slider labels" msgstr "/Widok/Suwak _szybkości" #: src/mainwindow.c:1966 msgid "/View/Buffer position" msgstr "" #: src/mainwindow.c:1967 msgid "/_Cursor" msgstr "/_Kursor" #: src/mainwindow.c:1968 msgid "/Cursor/Set selection start" msgstr "/Kursor/Ustaw początek wyboru" #: src/mainwindow.c:1970 msgid "/Cursor/Set selection end" msgstr "/Kursor/Ustaw koniec wyboru" #: src/mainwindow.c:1971 msgid "/Cursor/sep1" msgstr "/Kursor/sep 1" #: src/mainwindow.c:1972 msgid "/Cursor/Move to" msgstr "/Kursor/Przesuń do" #: src/mainwindow.c:1973 msgid "/Cursor/Move to/Beginning" msgstr "/Kursor/Przesuń do/Początek" #: src/mainwindow.c:1975 msgid "/Cursor/Move to/End" msgstr "/Kursor/Przesuń do/Koniec" #: src/mainwindow.c:1976 msgid "/Cursor/Move to/Selection start" msgstr "/Kursor/Przesuń do/Początek wyboru" #: src/mainwindow.c:1978 msgid "/Cursor/Move to/Selection end" msgstr "/Kursor/Przesuń do/Koniec wyboru" #: src/mainwindow.c:1980 msgid "/Cursor/Move" msgstr "/Kursor/Przesuń" #: src/mainwindow.c:1981 msgid "/Cursor/Move/Left" msgstr "/Kursor/Przesuń/Lewo" #: src/mainwindow.c:1982 msgid "/Cursor/Move/Right" msgstr "/Kursor/Przesuń/Prawo" #: src/mainwindow.c:1983 msgid "/Cursor/Move/Left sample" msgstr "/Kursor/Przesuń/Lewa próbka" #: src/mainwindow.c:1984 msgid "/Cursor/Move/Right sample" msgstr "/Kursor/Przesuń/Prawa próbka" #: src/mainwindow.c:1985 msgid "/Cursor/Find zero-crossing" msgstr "/Kursor/Znajdź przejście zerowe" #: src/mainwindow.c:1986 msgid "/Cursor/Find zero-crossing/Left (all channels)" msgstr "/Kursor/Znajdź przejście zerowe/Lewe (wszystkie kanały)" #: src/mainwindow.c:1988 msgid "/Cursor/Find zero-crossing/Right (all channels)" msgstr "/Kursor/Znajdź przejście zerowe/Prawe (wszystkie kanały)" #: src/mainwindow.c:1990 msgid "/Cursor/Find zero-crossing/Left (any channel)" msgstr "/Kursor/Znajdź przejście zerowe/Lewe (jakiś kanał)" #: src/mainwindow.c:1992 msgid "/Cursor/Find zero-crossing/Right (any channel)" msgstr "/Kursor/Znajdź przejście zerowe/Prawe (jakiś kanał)" #: src/mainwindow.c:1994 msgid "/Cursor/sep2" msgstr "/Kursor/sep 2" #: src/mainwindow.c:1995 msgid "/Cursor/Position cursor..." msgstr "/Kursor/Pozycja kursora..." #: src/mainwindow.c:1997 msgid "/_Play" msgstr "/_Odtwarzaj" #: src/mainwindow.c:1998 msgid "/Play/_Play from cursor" msgstr "/Odtwarzaj/_Odtwarzaj od kursora" #: src/mainwindow.c:1999 msgid "/Play/Play _all" msgstr "/Odtwarzaj/Odtwarzaj _wszystko" #: src/mainwindow.c:2000 msgid "/Play/Play se_lection" msgstr "/Odtwarzaj/Odtwarzaj _wybór" #: src/mainwindow.c:2001 msgid "/Play/_Stop" msgstr "/Odtwarzaj/_Stop" #: src/mainwindow.c:2002 msgid "/Play/sep1" msgstr "/Odtwarzaj/sep 1" #: src/mainwindow.c:2003 msgid "/Play/_Record..." msgstr "/Odtwarzaj/_Nagraj..." #: src/mainwindow.c:2004 msgid "/Effec_ts" msgstr "/_Efekty" #: src/mainwindow.c:2005 msgid "/Effects/Fade _in" msgstr "/Efekty/_Wzmocnienie" #: src/mainwindow.c:2006 msgid "/Effects/Fade o_ut" msgstr "/Efekty/_Ściszenie" #: src/mainwindow.c:2007 msgid "/Effects/_Normalize" msgstr "/Efekty/_Normalizacja" #: src/mainwindow.c:2008 msgid "/Effects/Normali_ze to..." msgstr "/Efekty/Normalizuj _do..." #: src/mainwindow.c:2009 msgid "/Effects/_Volume adjust (fade)..." msgstr "Efekty/_Dostosuj głośność (zanik)..." #: src/mainwindow.c:2010 msgid "/Effects/sep1" msgstr "/Efekty/sep 1" #: src/mainwindow.c:2011 msgid "/Effects/Convert sample_rate..." msgstr "/Efekty/Konwersja _próbkowania..." #: src/mainwindow.c:2012 msgid "/Effects/Convert sample _format..." msgstr "/Efekty/Konwersja _formatu próbki..." #: src/mainwindow.c:2014 msgid "/Effects/B_yte swap" msgstr "/Efekty/_Zamiana bajtu" #: src/mainwindow.c:2015 msgid "/Effects/sep2" msgstr "/Efekty/sep 2" #: src/mainwindow.c:2016 msgid "/Effects/_Mix to mono" msgstr "/Efekty/_Miksuj do mono" #: src/mainwindow.c:2017 msgid "/Effects/Add channe_l" msgstr "/Efekty/Dodaj _kanał" #: src/mainwindow.c:2018 msgid "/Effects/Ma_p channels..." msgstr "/Efekty/_Mapuj kanały..." #: src/mainwindow.c:2019 msgid "/Effects/_Combine channels..." msgstr "/Efekty/_Połącz kanały..." #: src/mainwindow.c:2020 msgid "/Effects/Add channels from other file..." msgstr "/Efekty/Dodaj kanały z innego pliku..." #: src/mainwindow.c:2021 msgid "/Effects/sep3" msgstr "/Efekty/sep 3" #: src/mainwindow.c:2022 msgid "/Effects/_Speed adjustment..." msgstr "/Efekty/Dostosowanie _szybkości..." #: src/mainwindow.c:2023 msgid "/Effects/Pipe through program..." msgstr "/Efekty/Rura za pomocą programu..." #: src/mainwindow.c:2024 msgid "/Effects/sep4" msgstr "/Efekty/sep 4" #: src/mainwindow.c:2025 msgid "/Effects/Effects dialog..." msgstr "/Efekty/Efekty okno dialogowe..." #: src/mainwindow.c:2027 msgid "/Debug" msgstr "/Debuguj" #: src/mainwindow.c:2029 msgid "/Debug/Dummy effect" msgstr "/Debuguj/Sztuczny efekt" #: src/mainwindow.c:2030 #, fuzzy msgid "/Debug/Dummy effect FP" msgstr "/Debuguj/Sztuczny efekt" #: src/mainwindow.c:2031 msgid "/Debug/Check opencount" msgstr "/Debuguj/Sprawdź liczbę otwartych" #: src/mainwindow.c:2032 msgid "/Debug/Dump chunk info" msgstr "/Debuguj/Zrzuć informację o kawałku" #: src/mainwindow.c:2034 msgid "/_Help" msgstr "/_Pomoc" #: src/mainwindow.c:2035 msgid "/Help/_Documentation" msgstr "/Pomoc/_Dokumentacja" #: src/mainwindow.c:2036 msgid "/Help/_About" msgstr "/Pomoc/_O" #: src/mainwindow.c:2040 msgid "/File/sep1" msgstr "/Plik/sep 1" #: src/mainwindow.c:2041 msgid "/File/_Close" msgstr "/Plik/_Zamknij" #: src/mainwindow.c:2042 msgid "/File/sep2" msgstr "/Plik/sep 2" #: src/mainwindow.c:2043 msgid "/File/_Exit" msgstr "/Plik/_Wyjście" #: src/mainwindow.c:2215 msgid "Load a file from disk" msgstr "Wczytaj plik z dysku" #: src/mainwindow.c:2222 msgid "Save the current file to disk" msgstr "Zapisz bieżący plik na dysk" #: src/mainwindow.c:2231 msgid "Undo the last change" msgstr "Cofnij ostatnią zmianę" #: src/mainwindow.c:2239 msgid "Redo the last undo operation" msgstr "Ponów ostatnią cofniętą operację" #: src/mainwindow.c:2249 msgid "Cut out the current selection" msgstr "Wytnij bieżący wybór" #: src/mainwindow.c:2257 msgid "Copy the current selection" msgstr "Skopiuj bieżący wybór" #: src/mainwindow.c:2265 msgid "Paste at cursor position" msgstr "Wklej w pozycji kursora" #: src/mainwindow.c:2273 msgid "Paste, overwriting the data after the cursor position" msgstr "Wklej, nadpisanie danych po pozycji kursora" #: src/mainwindow.c:2283 msgid "Delete the selection" msgstr "Usuń wybór" #: src/mainwindow.c:2292 msgid "Set selection start to cursor position" msgstr "Ustaw początek wyboru na pozycji kursora" #: src/mainwindow.c:2301 msgid "Set selection end to cursor position" msgstr "Ustaw koniec wyboru na pozycji kursora" #: src/mainwindow.c:2311 msgid "Play from cursor position" msgstr "Odtwórz od pozycji kursora" #: src/mainwindow.c:2320 msgid "Play selected area" msgstr "Odtwórz wybrany obszar" #: src/mainwindow.c:2329 msgid "Stop playing" msgstr "Zatrzymaj odtwarzanie" #: src/mainwindow.c:2339 msgid "Loop mode (play over and over)" msgstr "Tryb pętli (odtwarzaj w kółko)" #: src/mainwindow.c:2349 msgid "Keep view and playback together" msgstr "" #: src/mainwindow.c:2362 msgid "Auto return to playback start" msgstr "Automatycznie powróć do początku odtwarzania" #: src/mainwindow.c:2376 src/recorddialog.c:874 msgid "Record" msgstr "Nagraj" #: src/mainwindow.c:2385 src/recorddialog.c:983 msgid "Launch mixer" msgstr "Uruchom mikser" #: src/pipedialog.c:92 msgid "Command line: " msgstr "Linia komend: " #: src/pipedialog.c:99 msgid "Send wav header" msgstr "Wyślij nagłówek wav" #: src/pipedialog.c:153 msgid "Process output" msgstr "Wyjście procesu" #: src/pipedialog.c:178 #, c-format msgid "" "Output from command '%s':\n" "\n" msgstr "" "Wyjście z komendy '%s':\n" "\n" #: src/pipedialog.c:201 #, c-format msgid "Could not create pipe: %s" msgstr "Nie można utworzyć rury: %s" #: src/pipedialog.c:216 #, c-format msgid "Error: fork: %s" msgstr "Błąd: część pliku: %s" #: src/pipedialog.c:268 msgid "Should not reach this point!" msgstr "Nie powinny dotrzeć do tego punktu!" #: src/pipedialog.c:482 msgid "Command failed without returning any data" msgstr "Komenda nie powiodła się bez zwrócenia żadnych danych" #: src/pipedialog.c:492 #, c-format msgid "Error: %s" msgstr "Błąd: %s" #: src/player.c:294 msgid "The sound format of this file is not supported for playing." msgstr "Format dźwięku tego pliku nie jest obsługiwany do odtwarzania." #: src/rateconv.c:97 #, c-format msgid "Error initialising sample rate conversion: %s" msgstr "Błąd inicjacji konwersji próbkowania: %s" #: src/rateconv.c:162 #, c-format msgid "Error converting samplerate: %s\n" msgstr "Błąd konwersji próbkowania: %s\n" #: src/rateconv.c:201 #, c-format msgid "Error changing samplerate conversion ratio: %s\n" msgstr "Błąd zmiany współczynnika konwersji próbkowania: %s\n" #: src/rateconv.c:323 msgid "Unexpected EOF in connection to subprocess" msgstr "Niespodziewany EOF w połączeniu do podprocesu" #: src/rateconv.c:327 #, c-format msgid "Error writing to subprocess: %s" msgstr "Błąd zapisywania do podprocesu: %s" #: src/rateconv.c:383 src/rateconv.c:405 #, c-format msgid "Error reading from sub process: %s" msgstr "Błąd czytania z podprocesu: %s" #: src/rateconv.c:413 msgid "SoX closed connection too early!" msgstr "SoX zamknął połączenie zbyt wcześnie!" #: src/rateconv.c:599 msgid "(SoX) Simulated analog filtration" msgstr "(SoX) Symulowana filtracja analogowa" #: src/rateconv.c:605 msgid "(SoX) Polyphase interpolation" msgstr "(SoX) Wielofazowa interpolacja" #: src/rateconv.c:612 msgid "Sample repeat/skip (low quality)" msgstr "Próbka powtórz/pomiń (niska jakość)" #: src/rawdialog.c:42 msgid "header size" msgstr "rozmiar nagłówka" #: src/rawdialog.c:73 msgid "Unknown file format" msgstr "Nieznany format pliku" #: src/rawdialog.c:80 #, c-format msgid "" "The format of file '%s' could not be recognized.\n" "\n" "Please specify the sample format below." msgstr "" "Format pliku '%s' nie może być rozpoznany.\n" "\n" "Proszę określ format próbki poniżej." #: src/rawdialog.c:92 msgid "Header bytes: " msgstr "Bajty nagłówka: " #: src/recorddialog.c:207 src/recorddialog.c:671 src/recorddialog.c:918 msgid "(no limit)" msgstr "(bez limitu)" #: src/recorddialog.c:314 msgid "Mild" msgstr "Łagodny" #: src/recorddialog.c:316 msgid "Heavy" msgstr "Ciężki" #: src/recorddialog.c:430 msgid "Update preset" msgstr "Uaktualnij standardowe" #: src/recorddialog.c:435 msgid "Add preset" msgstr "Dodaj standardowe" #: src/recorddialog.c:514 msgid "Custom format" msgstr "Zwyczajny format" #: src/recorddialog.c:552 msgid "" "The sign and endian-ness can usually be left at their defaults, but should " "be changed if you're unable to record or get bad sound." msgstr "" "Znak i endian-ness mogą być standardowo pozostawione domyślnie, ale powinny " "być zmienione jeśli nie możesz nagrywać lub masz zły dźwięk." #: src/recorddialog.c:566 msgid "Name :" msgstr "Nazwa" #: src/recorddialog.c:578 msgid "Presets:" msgstr "Ustawienia początkowe" #: src/recorddialog.c:593 msgid "Set format" msgstr "Ustaw format" #: src/recorddialog.c:601 msgid "Add/Update preset" msgstr "Dodaj/Uaktualnij ustawienia początkowe" #: src/recorddialog.c:654 msgid "" "Invalid time value. Time must be specified in the form (HH')MM:SS(.mmmm)" msgstr "" "Nieważna wartość czasu. Czas musi być określony w formie (GG')MM:SS(.mmmm)" #: src/recorddialog.c:698 src/recorddialog.c:948 msgid "Format not selected" msgstr "Format nie wybrany" #: src/recorddialog.c:705 msgid "This format is not supported by the input driver!" msgstr "Ten format nie jest obsługiwany przez sterownik wejścia" #: src/recorddialog.c:710 msgid "Ready for recording" msgstr "Gotowy do nagrywania" #: src/recorddialog.c:723 msgid "Peak: " msgstr "Szczyt" #: src/recorddialog.c:724 msgid "Peak max: " msgstr "Maksimum szczytu: " #: src/recorddialog.c:725 msgid "RMS: " msgstr "RMS: " #: src/recorddialog.c:726 msgid "Clipping: " msgstr "Obcinanie" #: src/recorddialog.c:795 msgid "Resume recording" msgstr "Powróć do nagrywania" #: src/recorddialog.c:795 src/recorddialog.c:815 msgid "Pause recording" msgstr "Wstrzymaj nagrywanie" #: src/recorddialog.c:797 msgid "RecordStatus|Paused" msgstr "RecordStatus|Wstrzymane" #: src/recorddialog.c:798 src/recorddialog.c:823 msgid "RecordStatus|Recording" msgstr "RecordStatus|Nagrywanie" #: src/recorddialog.c:818 msgid "Finish" msgstr "Ukończone" #: src/recorddialog.c:826 msgid "Overruns: " msgstr "Przekroczenia: " #: src/recorddialog.c:829 msgid "Bytes written: " msgstr "Bajty zapisane: " #: src/recorddialog.c:830 msgid "Auto stop in: " msgstr "Automatyczny stop w: " #: src/recorddialog.c:894 msgid "Recording settings" msgstr "Ustawienia nagrywania" #: src/recorddialog.c:901 msgid "Sample format: " msgstr "Format próbki: " #: src/recorddialog.c:916 msgid "Time limit: " msgstr "Limit czasu: " #: src/recorddialog.c:924 msgid "Disable" msgstr "Wyłącz" #: src/recorddialog.c:930 msgid "Set" msgstr "Ustaw" #: src/recorddialog.c:942 msgid "Input levels" msgstr "Poziomy wejściowe" #: src/recorddialog.c:947 msgid "Recording status: " msgstr "Status nagrywania: " #: src/recorddialog.c:952 msgid "Time recorded: " msgstr "Nagrany czas: " #: src/recorddialog.c:953 msgid "N/A" msgstr "Niedostępny" #: src/recorddialog.c:966 msgid "Start recording" msgstr "Start nagrywania" #: src/recorddialog.c:977 msgid "Reset max peaks" msgstr "Reset maksymalnych szczytów" #: src/sampleratedialog.c:87 msgid "" "(This changes the sample rate of \n" "the entire file, not just the selection)" msgstr "" "(To zmieni częstotliwość próbkowania \n" "całego pliku, nie tylko wyboru)" #: src/sampleratedialog.c:92 msgid "New samplerate: " msgstr "Nowa częstotliwość próbkowania: " #: src/sampleratedialog.c:99 msgid "Method: " msgstr "Metoda: " #: src/samplesizedialog.c:38 msgid "File already has the selected sample format" msgstr "" #: src/samplesizedialog.c:87 msgid "" "(This changes the sample type of the entire file, not just the selection)" msgstr "(To zmieni rodzaj próbki całego pliku, nie tylko wyboru)" #: src/samplesizedialog.c:99 msgid "Don't actually change the data (for repairing bad files etc)" msgstr "Aktualnie nie zmieni danych (dla naprawy złych plików itp.)" #: src/sound-alsalib.c:73 msgid "ALSA Preferences" msgstr "Ustawienia ALSA" #: src/sound-alsalib.c:81 msgid "Playback device: " msgstr "Urządzenie odtwarzania: " #: src/sound-alsalib.c:85 msgid "Recording device: " msgstr "Urządzenie nagrywania: " #: src/sound-alsalib.c:91 msgid "Event driven I/O" msgstr "Przez zdarzenie I/O" #: src/sound-alsalib.c:123 #, c-format msgid "Error opening ALSA device '%s' for recording: %s" msgstr "Błąd otwarcia urządzenia ALSA '%s' do nagrywania: %s" #: src/sound-alsalib.c:125 #, c-format msgid "Error opening ALSA device '%s' for playback: %s" msgstr "Błąd otwarcia urządzenia ALSA '%s' do odtwarzania: %s" #: src/sound-alsalib.c:273 msgid "snd_pcm_hw_params_set_access failed" msgstr "snd_pcm_hw_params_set_access nie powiódł się" #: src/sound-alsalib.c:278 msgid "snd_pcm_hw_params_set_format failed" msgstr "snd_pcm_hw_params_set_format nie powiódł się" #: src/sound-alsalib.c:283 msgid "snd_pcm_hw_params_set_channels failed" msgstr "snd_pcm_hw_params_set_channels nie powiódł się" #: src/sound-alsalib.c:288 msgid "snd_pcm_hw_params_set_rate failed" msgstr "snd_pcm_hw_params_set_rate nie powiódł się" #: src/sound-alsalib.c:293 msgid "snd_pcm_hw_params_set_buffer_size_last failed" msgstr "snd_pcm_hw_params_set_buffer_size_last nie powiódł się" #: src/sound-alsalib.c:436 src/sound-alsalib.c:492 msgid "" msgstr "" #: src/sound-alsalib.c:536 msgid "" msgstr "" #: src/sound.c:167 msgid "SDL (output only)" msgstr "SDL (tylko wyjście)" #: src/sound.c:209 msgid "Dummy (no sound)" msgstr "Sztuczny (bez dźwięku)" #: src/sound.c:334 #, c-format msgid "" "Invalid driver name: %s\n" "Using '%s' driver instead" msgstr "" "Nieważna nazwa sterownika: %s\n" "Użyje w zamian sterownika '%s'" #: src/sound-esound.c:59 #, c-format msgid "Couldn't connect to ESD daemon: %s" msgstr "Nie można połączyć się z demonem ESD: %s" #: src/sound-esound.c:114 msgid "EsounD: Unable to open playback stream" msgstr "EsounD: Nie można otworzyć strumienia odtwarzania" #: src/sound-esound.c:130 msgid "EsounD: Unable to open recording stream" msgstr "EsounD: Nie można otworzyć strumienia nagrywania" #: src/sound-esound.c:145 src/sound-esound.c:217 msgid "EsounD driver: select" msgstr "Sterownik EsounD: wybierz" #: src/sound-esound.c:157 msgid "EsounD driver: write" msgstr "Sterownik EsounD: zapisz" #: src/sound-esound.c:221 msgid "Esound connection closed by server" msgstr "Połączenie Esound zamknięte przez serwer" #: src/sound-esound.c:227 msgid "EsounD driver: read" msgstr "Sterownik EsounD: czytaj" #: src/sound-esound.c:241 msgid "jump delay" msgstr "skok opóźnienia" #: src/sound-esound.c:255 msgid "ESD preferences" msgstr "Ustawienia ESD" #: src/sound-esound.c:263 msgid "" "If the cursor starts running too early when jumping, this delay should be " "increased." msgstr "" "Jeśli kursor uruchomi się zbyt wcześnie podczas skakania, to opóźnienie " "powinno być zwiększone." #: src/sound-esound.c:269 msgid "Jump delay:" msgstr "Skok opóźnienia:" #: src/sound-esound.c:278 msgid "" "Selecting the ESD host to connect to is done through the ESPEAKER " "environment variable." msgstr "" "Wybranie hosta ESD do połączenia jest zrobione poprzez zmienną środowiskową " "ESPEAKER." #: src/sound-jack.c:117 msgid "Invalid number of input ports." msgstr "Nieważna liczba portów wejścia." #: src/sound-jack.c:121 msgid "Invalid number of output ports." msgstr "Nieważna liczba portów wyjścia." #: src/sound-jack.c:130 msgid "The client name change won't take effect until you restart the program." msgstr "" "Zmiana nazwy klienta nie przyniesie efektu zanim nie zrestartujesz programu." #: src/sound-jack.c:187 msgid " Input ports " msgstr " Porty wejścia " #: src/sound-jack.c:188 msgid " Output ports " msgstr " Porty wyjścia " #: src/sound-jack.c:197 msgid "Jack Preferences" msgstr "Ustawienia Jack" #: src/sound-jack.c:206 msgid "Client name: " msgstr "Nazwa klienta: " #: src/sound-jack.c:223 msgid "Number of ports (0-8): " msgstr "Liczba portów (0-8): " #: src/sound-jack.c:231 #, c-format msgid "Port #%d" msgstr "Port #%d" #: src/sound-jack.c:244 msgid "Automatically connect input ports on startup" msgstr "Automatycznie połącz z portami wejściowymi na starcie" #: src/sound-jack.c:250 msgid "Automatically connect output ports on startup" msgstr "Automatycznie połącz z portami wyjścia na starcie" #: src/sound-jack.c:402 msgid "Over/underrun in JACK driver" msgstr "Nadwyżka/opróżnienie sterownika JACK" #: src/sound-jack.c:417 msgid "jack_get_ports returned NULL" msgstr "jack_get_ports zwrócił NULL" #: src/sound-jack.c:433 #, c-format msgid "Connection from %s to %s failed: %s" msgstr "Połączenie od %s do %s nieudane: %s" #: src/sound-jack.c:480 msgid "Could not connect to the JACK server." msgstr "Nie można połączyć się z serwerem JACK." #: src/sound-jack.c:494 msgid "Activation failed!" msgstr "Uaktywnienie nieudane!" #: src/sound-jack.c:825 #, c-format msgid "" "With JACK, the only supported recording format is Floating-point, single " "precision, %d Hz" msgstr "" "Z JACK, jedyny obsługiwany format nagrywania to Zmiennoprzecinkowy, " "pojedynczej dokładności, %d Hz" #: src/sound-oss.c:96 #, c-format msgid "Could not open '%s': %s" msgstr "Nie można otworzyć '%s': %s" #: src/sound-oss.c:109 #, c-format msgid "Error in sound driver: ioctl failed: %s" msgstr "Błąd w sterowniku dźwięku: ioctl nieudane: %s" #: src/sound-oss.c:216 #, c-format msgid "Error in sound driver: write failed: %s" msgstr "Błąd w sterowniku dźwięku: zapis nieudany: %s" #: src/sound-oss.c:229 #, c-format msgid "Error in sound driver: read failed: %s" msgstr "Błąd w sterowniku dźwięku: czytanie nieudane: %s" #: src/sound-oss.c:253 src/sound-oss.c:385 #, c-format msgid "Error in sound driver: select failed: %s" msgstr "Błąd w sterowniku dźwięku: wybór nieudany: %s" #: src/sound-oss.c:440 msgid "OSS preferences" msgstr "Ustawienia OSS" #: src/sound-oss.c:450 msgid "Playback device file:" msgstr "Urządzenie odtwarzania pliku:" #: src/sound-oss.c:459 msgid "Recording device file:" msgstr "Urządzenie nagrywania pliku:" #: src/sound-oss.c:465 msgid "Avoid select calls (try this if recording locks up)" msgstr "Unikaj wybierania połączeń (spróbuj tego jeśli nagrywanie zamraża się)" #: src/sound-portaudio.c:61 msgid "sound-portaudio: No output devices available!" msgstr "dźwięk-portaudio: Brak dostępnych urządzeń wyjściowych!" #: src/sound-portaudio.c:63 msgid "sound-portaudio: No input devices available!" msgstr "dźwięk-portaudio: Brak dostępnych urządzeń wejściowych!" #: src/sound-portaudio.c:191 src/sound-portaudio.c:278 #, c-format msgid "Pa_OpenStream failed: %s\n" msgstr "Pa_OpenStream nieudane: %s\n" #: src/sound-portaudio.c:252 msgid "Buffer overrun!" msgstr "Przekroczenie bufora!" #: src/sound-sdl.c:38 #, c-format msgid "Could not initialize SDL: %s" msgstr "Nie można zainicjować SDL: %s" #: src/sound-sdl.c:89 #, c-format msgid "SDL: Couldn't open audio: %s" msgstr "SDL: Nie można otworzyć audio: %s" #: src/sound-sun.c:72 #, c-format msgid "SunAudio: Couldn't open %s" msgstr "SunAudio: Nie można otworzyć %s" #: src/sound-sun.c:159 msgid "SunAudio: Error writing to sound device" msgstr "SunAudio: Błąd zapisu do urządzenie dźwięku" #: src/sound-sun.c:241 msgid "SunAudio: Error reading from sound device" msgstr "SunAudio: Błąd odczytu z urządzenia dźwięku" #: src/soxdialog.c:54 msgid "Echo" msgstr "Echo" #: src/soxdialog.c:55 msgid "Echo sequence" msgstr "Sekwencja echo" #: src/soxdialog.c:56 msgid "Reverb" msgstr "Pogłos" #: src/soxdialog.c:57 msgid "Chorus" msgstr "Chór" #: src/soxdialog.c:58 msgid "Flanger" msgstr "Flanger" #: src/soxdialog.c:59 msgid "Phaser" msgstr "Phaser" #: src/soxdialog.c:60 msgid "Compress/Expand" msgstr "Skompresuj/Rozwiń" #: src/soxdialog.c:61 msgid "Pitch adjust" msgstr "Dostosowanie wysokości tonu" #: src/soxdialog.c:62 msgid "Time stretch" msgstr "Odcinek czasu" #: src/soxdialog.c:63 msgid "DC Shift" msgstr "Zmiana DC" #: src/soxdialog.c:64 msgid "Masking noise" msgstr "Maskowanie szumu" #: src/soxdialog.c:65 msgid "Reverse" msgstr "Odwrót" #: src/soxdialog.c:66 msgid "Earwax" msgstr "Woskowina" #: src/soxdialog.c:67 msgid "Vibro" msgstr "Wibrator" #: src/soxdialog.c:68 msgid "Lowpass filter (single-pole)" msgstr "Filtr dolnoprzepustowy (jednobiegunowy)" #: src/soxdialog.c:69 msgid "Highpass filter (single-pole)" msgstr "Filtr wysokoprzepustowy (jednobiegunowy)" #: src/soxdialog.c:70 msgid "Bandpass filter" msgstr "Filtr środkowoprzepustowy" #: src/soxdialog.c:71 msgid "Butterworth lowpass filter" msgstr "Filtr dolnoprzepustowy Butterworth" #: src/soxdialog.c:72 msgid "Butterworth highpass filter" msgstr "Filtr górnoprzepustowy Butterworth" #: src/soxdialog.c:73 msgid "Butterworth bandpass filter" msgstr "Filtr środkowoprzepustowy Butterworth" #: src/soxdialog.c:74 msgid "Butterworth bandreject filter" msgstr "Filtr środkowozaporowy Butterworth" #: src/soxdialog.c:75 msgid "Sinc-windowed filter" msgstr "Filtr okienkowy Sinc" #: src/soxdialog.c:312 msgid "Frequency: " msgstr "Częstotliwość: " #: src/soxdialog.c:317 src/soxdialog.c:324 src/soxdialog.c:483 #: src/soxdialog.c:485 msgid "Hz" msgstr "Hz" #: src/soxdialog.c:327 msgid "Noise mode" msgstr "Tryb szumu" #: src/soxdialog.c:387 msgid "Reverb time: " msgstr "Czas pogłosu: " #: src/soxdialog.c:392 msgid "ms" msgstr "ms" #: src/soxdialog.c:397 msgid "Delay (ms) " msgstr "Opóźnienie (ms) " #: src/soxdialog.c:400 msgid "Decay " msgstr "Zanik " #: src/soxdialog.c:404 msgid "Speed (Hz) " msgstr "Szybkość (Hz) " #: src/soxdialog.c:408 msgid "Depth (ms) " msgstr "Głębokość (ms) " #: src/soxdialog.c:412 msgid "Modulation " msgstr "Modulacja " #: src/soxdialog.c:415 msgid "Modulation|Sinusoidal" msgstr "Modulation|Sinusoida l" #: src/soxdialog.c:416 msgid "Modulation|Triangular" msgstr "Modulation|Trójkątna" #: src/soxdialog.c:429 msgid "(Lines with delay=0 will be ignored.)" msgstr "(Linie z opóźnieniem=0 będą zignorowane.)" #: src/soxdialog.c:448 src/soxdialog.c:450 src/soxdialog.c:454 #: src/soxdialog.c:456 src/soxdialog.c:458 msgid "Input gain: " msgstr "Wzmocnienie wejścia: " #: src/soxdialog.c:452 msgid "Output gain: " msgstr "Wzmocnienie wyjścia: " #: src/soxdialog.c:464 msgid "Width: " msgstr "Szerokość: " #: src/soxdialog.c:470 src/soxdialog.c:472 msgid "Bandwidth: " msgstr "Pasmo: " #: src/soxdialog.c:481 msgid "Filter type: " msgstr "Rodzaj filtra: " #: src/soxdialog.c:482 msgid "Low 6dB corner: " msgstr "Niski róg 6dB: " #: src/soxdialog.c:484 msgid "High 6db corner: " msgstr "Wysoki róg 6 db: " #: src/soxdialog.c:486 msgid "Window length: " msgstr "Długość okna: " #: src/soxdialog.c:488 msgid "Beta" msgstr "Beta" #: src/soxdialog.c:491 msgid "Lowpass" msgstr "Niskoprzepustowy" #: src/soxdialog.c:492 msgid "Highpass" msgstr "Wysokoprzepustowy" #: src/soxdialog.c:493 msgid "Bandpass" msgstr "Środkowoprzepustowy" #: src/soxdialog.c:526 msgid "Attack integration time: " msgstr "Czas ataku integracji: " #: src/soxdialog.c:530 src/soxdialog.c:535 src/soxdialog.c:565 msgid " seconds" msgstr " sekundy" #: src/soxdialog.c:531 msgid "Decay integration time: " msgstr "Czas zaniku integracji: " #: src/soxdialog.c:538 msgid "Input level (dB)" msgstr "Poziom wejścia (dB)" #: src/soxdialog.c:539 msgid "Output level (dB)" msgstr "Poziom wyjścia (dB)" #: src/soxdialog.c:552 msgid "Post-processing gain: " msgstr "Zysk obróbki: " #: src/soxdialog.c:556 msgid " dB" msgstr " dB" #: src/soxdialog.c:557 msgid "Initial volume: " msgstr "Początkowa głośność: " #: src/soxdialog.c:561 msgid "Delay time: " msgstr "Czas opóźnienia: " #: src/soxdialog.c:570 msgid "Shift amount: " msgstr "Wartość przesunięcia: " #: src/soxdialog.c:574 msgid "Peak limiter" msgstr "Ogranicznik szczytu" #: src/soxdialog.c:578 msgid "Limiter gain: " msgstr "Ogranicznik wzmocnienia: " #: src/soxdialog.c:591 msgid "Amount: " msgstr "Kwota: " #: src/soxdialog.c:592 msgid " cents" msgstr " centy" #: src/soxdialog.c:593 msgid "Window width: " msgstr "Szerokość okna: " #: src/soxdialog.c:594 src/soxdialog.c:625 msgid " ms" msgstr " ms" #: src/soxdialog.c:595 msgid "Interpolation: " msgstr "Interpolacja: " #: src/soxdialog.c:596 msgid "Fade: " msgstr "Zanik: " #: src/soxdialog.c:605 msgid "Interpolation|Cubic" msgstr "Interpolation|Sześcienna" #: src/soxdialog.c:606 msgid "Interpolation|Linear" msgstr "Interpolation|Liniowa" #: src/soxdialog.c:612 msgid "Fade|Cos" msgstr "Fade|Cos" #: src/soxdialog.c:613 msgid "Fade|Hamming" msgstr "Fade|Hamminga" #: src/soxdialog.c:614 msgid "Fade|Linear" msgstr "Fade|Liniowa" #: src/soxdialog.c:615 msgid "Fade|Trapezoid" msgstr "Fade|Trapezowa" #: src/soxdialog.c:623 msgid "Factor: " msgstr "Współczynnik: " #: src/soxdialog.c:624 msgid "Window size: " msgstr "Rozmiar okna: " #: src/soxdialog.c:636 msgid "Speed: " msgstr "Szybkość: " #: src/soxdialog.c:637 msgid " Hz" msgstr " Hz" #: src/soxdialog.c:638 msgid "Depth: " msgstr "Głębokość: " #: src/soxdialog.c:649 msgid "This effect has no options." msgstr "Ten efekt nie ma opcji." #: src/soxdialog.c:723 msgid "Error creating pipe" msgstr "Błąd tworzenia rury" #: src/soxdialog.c:730 msgid "Couldn't fork" msgstr "Nie można odgałęzić" #: src/soxdialog.c:745 #, c-format msgid "Error running 'sox -h': %s\n" msgstr "Błąd uruchomienia 'sox -h': %s\n" #: src/soxdialog.c:747 msgid "Should not reach this point" msgstr "Nie powinno dotrzeć do tego punktu" #: src/soxdialog.c:762 msgid "Error reading sox output" msgstr "Błąd czytania wyjścia sox" #: src/soxdialog.c:794 msgid "Unable to detect supported SoX effects" msgstr "Nie można wykryć obsługiwanych efektów SoX" #: src/soxdialog.c:832 msgid "Sox support couldn't be initialized" msgstr "Obsługa SoX nie może być zainicjowana" #: src/speeddialog.c:58 msgid "Speed:" msgstr "Szybkość:" #: src/statusbar.c:72 msgid "(no file loaded)" msgstr "(nie wczytano pliku)" #: src/statusbar.c:235 msgid "Cursor: running" msgstr "Kursor: uruchomiony" #: src/statusbar.c:237 msgid "Cursor: " msgstr "Kursor: " #: src/statusbar.c:260 #, c-format msgid "View: [ %s - %s ]" msgstr "Widok: [ %s - %s ]" #: src/statusbar.c:281 #, c-format msgid "Selection: %s+%s" msgstr "Wybór: %s+%s" #: src/statusbar.c:304 msgid "Processing data" msgstr "Przetwarzane dane" #: src/statusbar.c:306 #, c-format msgid "%s... (Press ESC to cancel)" msgstr "%s... (Naciśnij ESC żeby anulować)" #: src/um.c:51 msgid "mhWaveEdit: " msgstr "mhWaveEdit: " #: src/um.c:64 #, c-format msgid "mhWaveEdit: %s: %s\n" msgstr "mhWaveEdit: %s: %s\n" #: src/um.c:97 msgid "Message" msgstr "Wiadomości" #: src/um.c:117 msgid "Yes" msgstr "Tak" #: src/um.c:125 msgid "No" msgstr "Nie" #: src/um.c:318 msgid "Input" msgstr "Wejście" #: src/um.c:407 msgid "Choice" msgstr "Wybór" #: src/volumedialog.c:71 msgid "Calculating peak volume..." msgstr "Obliczanie głośności szczytowej..." #: src/volumedialog.c:87 msgid "Start:" msgstr "Start:" #: src/volumedialog.c:90 msgid "End:" msgstr "Koniec:" #: src/volumedialog.c:109 msgid "Find top volume" msgstr "Znajdź maksymalną głośność" #: src/document.c:230 #, c-format msgid "untitled #%d" msgstr "niezatytułowany #%d" #: src/document.c:282 msgid "" "Loading and then saving files with 'lossy' formats (like mp3 and ogg) leads " "to a quality loss, also for the unmodified parts of the file." msgstr "" "Wczytanie i następnie zapisanie plików z formatów 'stratnych' (jak mp3 i " "ogg) prowadzi do straty jakości, także dla niezmodyfikowanych części pliku." #: src/session.c:87 msgid "Error opening session directory" msgstr "Błąd otwarcia katalogu sesji" #: src/session.c:104 src/session.c:164 #, c-format msgid "%s: Wrong file type" msgstr "%s: Zły rodzaj pliku" #: src/session.c:238 msgid "Could not create session file" msgstr "Nie można utworzyć pliku sesji" #: src/session.c:280 msgid "" "The files that belonged to the crashed session have been recovered. Any " "files that are not saved will be removed permanently.\n" "\n" "(This notice is only shown once)" msgstr "" "Pliki które należą do zawieszonych sesji zostały odzyskane. Pliki które nie " "są zapisane będą trwale usunięte.\n" "\n" "(Ta uwaga pokaże się tylko raz)" #: src/session.c:380 msgid "Suspended" msgstr "Wstrzymane" #: src/session.c:380 src/session.c:381 msgid "Crash" msgstr "Wypadek" #: src/session.c:381 msgid "Left files" msgstr "Pliki lewe" #: src/session.c:391 #, c-format msgid "%s on %s(%d files, %ld bytes)" msgstr "%s na %s(%d plików, %ld bajtów)" #: src/session.c:409 msgid "Sessions" msgstr "Sesje" #: src/session.c:419 msgid "" "Earlier sessions were found. Choose one to resume or start a new session." msgstr "" "Wcześniejsze sesje zostały znalezione. Wybierz jedną by powrócić lub " "wystartuj nową sesję." #: src/session.c:439 msgid "Resume selected" msgstr "Wybrano powrót" #: src/session.c:449 msgid "Delete selected" msgstr "Wybrano usunięcie" #: src/session.c:456 msgid "Start new session" msgstr "Start nowej sesji" #: src/session.c:462 msgid "Exit" msgstr "Wyjście" #: src/mapchannelsdialog.c:116 msgid "This effect applies to the whole file, not just the selection" msgstr "Ten efekt zastosuje się do całego pliku, nie tylko wyboru" #: src/mapchannelsdialog.c:123 msgid "Output channels: " msgstr "Kanały wyjścia: " #: src/mapchannelsdialog.c:130 msgid "Map" msgstr "Mapa" #: src/mapchannelsdialog.c:137 msgid "Source" msgstr "Źródło" #: src/mapchannelsdialog.c:139 msgid "Destination" msgstr "Miejsce przeznaczenia" #: src/sandwichdialog.c:107 msgid "Align beginning of files" msgstr "Wyrównaj początek plików" #: src/sandwichdialog.c:110 msgid "Align end of files" msgstr "Wyrównaj koniec plików" #: src/sandwichdialog.c:113 msgid "Align at marker: " msgstr "Wyrównaj na znaczniku: " #: src/sandwichdialog.c:126 msgid "Add channels from: " msgstr "Dodaj kanały z: " #: src/sandwichdialog.c:130 msgid "Alignment" msgstr "Wyrównanie" #~ msgid "double" #~ msgstr "podwójny" #~ msgid "float" #~ msgstr "zmienny" #~ msgid "mhWaveEdit: %s (%s): %d Hz, %d bit" #~ msgstr "mhWaveEdit: %s (%s): %d Hz, %d bit" #~ msgid "Follow cursor while playing" #~ msgstr "Podążaj kursorem podczas odtwarzania" mhwaveedit-1.4.24/po/quot.sed000066400000000000000000000002311334022513400160330ustar00rootroot00000000000000s/"\([^"]*\)"/“\1”/g s/`\([^`']*\)'/‘\1’/g s/ '\([^`']*\)' / ‘\1’ /g s/ '\([^`']*\)'$/ ‘\1’/g s/^'\([^`']*\)' /‘\1’ /g s/“”/""/g mhwaveedit-1.4.24/po/remove-potcdate.sin000066400000000000000000000006601334022513400201650ustar00rootroot00000000000000# Sed script that remove the POT-Creation-Date line in the header entry # from a POT file. # # The distinction between the first and the following occurrences of the # pattern is achieved by looking at the hold space. /^"POT-Creation-Date: .*"$/{ x # Test if the hold space is empty. s/P/P/ ta # Yes it was empty. First occurrence. Remove the line. g d bb :a # The hold space was nonempty. Following occurrences. Do nothing. x :b } mhwaveedit-1.4.24/po/ru.gmo000066400000000000000000001310241334022513400155050ustar00rootroot00000000000000P*.Q* ** *** **** * + + ,+:+I+[+j+~+++ ++++,,, ,,8,T,j,,, ,%,,!,J-Id- -- -V--.H.b. ~. .. . ....// +/ 7/E/ V/ c/ o/ z/ / / //"///0)0 <0]0{00!0 0 0 0 011 41 A1M1 \1 h1 s1 ~111111 1 122*292I2b2y22 2 2222222 2 2 2 3 33/3B3R3[3 34 44 '424A4,S4-434 4 4 45 5 5(55555 56 6 6!6'6).6X6g6#v6!666 6%6!7I;7%777778+8"D8g8x8k889 9 9+9@9^9Z:b: k: x:: :::::S:<9;v;;;";;;;<'< ,</9<i< ~<<<'<&<("='K=-s==/=0=">7>"Q>t>>>> >>&>'"?"J?*m??? ????? @@ $@2@B@I@`@w@ @@@@T@1@/ABB BB B C C#C3CGC1\CCC@CHDWD hD0tDD DD DD D D EE+E3EREXE`EiEzEEE EEEEEEEEE F $F/F4F%LFrFuF FHFFFF GG0G5IGG GG GGGGGGGI&I6I MIYIkIzI II II IIIIJ J&J!9J[KnKKK KKKKKBK8L HL VL wL L LLLLLLWL WMaMrMM$M&MMM' N3NQN%mNN N NNYN@OAFO#P PPPPPPP PQ)Q'GQoQ&QQIQARYTR[R SSa_TGT U]%U"UUQIVuVYWkWX&XLX)Y;Y"Y Z1'Z YZfZvZZ&4[[[v[*[[&[[\\.\7\Q\1l\1\#\#\ ]$]3]E]c]M^S^[^ k^y^Y^^^5_2_|_ralb-b#c dd)#d Md8Xdddd2dd6d6ePeTe ]e~e ee(e#eeef)f=fSf$Yf ~ffXf ffg2g5gLg [ggg og}g,g-gg gMg6Li ii iii iiii jj j.j =jKj^jmj jjjjjkk&k*k.k 6k$Akfkkkkk k3kl*5l?`l:l lllX mfm"m#m m mmmn#n7̀  "BY x0'Ł$+ > LXaq"Ăӂ ق !#*N _iryX|>Ճօ' 7A P[8d%&ÆMR87'8>ZvĈ ʈԈ܈ # 2>CRXpt 8͉ J"mt͊20BI [|ËӋύ '7@"Vy FЎ(;Vj\̐):(L uۑ I _iz ,-ɒ !<:-w*:Г #1@cr֔y۔!Uw ǖϖ֖/->l%9Ɨ[^\iX%~j)C؛`#Pth?vHh1*B+n.֡-"?5\(ӣ $#+H<t<((@Ul&}~ l#&;٧/EJsh?ܫ[x = Э?ڭ $-<3 p=zJ 5 >I3P<ԯ1$6[ki~ ((+Tfv ~./± .(\m:uo[g9=x4r4i<hHaeEPzrEKe,FDakNvt*6 1v{[\CqL$5&'RXb?F#OgO!nU.|?2ABCDY91qi23]; Z A@}3~H'uM-hwf>7Nzm _68+pI~J, ] S*c$G7WBbXljo-U^05"Wf@ QRT|{%ZV dnS(c08t/sy)TydG&V :#%JxL`j_Y< ^K)}` +M"/sP!>pwIQ=; lk Test results (1 time unit = %f usec/sample) Window '%s' Current chunk: History: and: Advanced settings Dithering Driver options External applications Hz Input audio Input controls Input ports Main window Output audio Output controls Output ports Playback settings Rate conversions Temporary file directories Temporary file settings Time format Variable speed View Window contents dB ms seconds%d channels%s is not a valid wav file%s... (Press ESC to cancel)%s: Expected '=': %s %s: Expected value: %s '%s' is not a number!(H')MM:SS.mmmm(H')MM:SS.t(Lines with delay=0 will be ignored.)(SoX) Polyphase interpolation(SoX) Simulated analog filtration(This changes the sample rate of the entire file, not just the selection)(This changes the sample type of the entire file, not just the selection)(expected) (no file loaded)(no limit)(use a negative number to place the cursor before instead of after the selected point)/Cursor/Position cursor.../Cursor/Set selection end/Cursor/Set selection start/Cursor/sep1/Cursor/sep2/Edit/Clear clipboard/Edit/Cr_op/Edit/Cu_t/Edit/Insert _silence/Edit/Paste _over/Edit/Paste to _new/Edit/Select _all/Edit/Silence selection/Edit/_Copy/Edit/_Delete/Edit/_Mix paste/Edit/_Paste/Edit/_Undo/Edit/sep1/Edit/sep2/Edit/sep3/Edit/sep4/Effec_ts/Effects/B_yte swap/Effects/Convert sample _format.../Effects/Convert sample_rate.../Effects/Effects dialog.../Effects/Fade _in/Effects/Fade o_ut/Effects/Pipe through program.../Effects/_Combine channels.../Effects/_Normalize/Effects/_Speed adjustment.../Effects/_Volume adjust (fade).../Effects/sep1/Effects/sep2/Effects/sep3/Effects/sep4/File/Save _as.../File/Save selection as.../File/_Close/File/_Exit/File/_Open.../File/_Save/File/sep1/File/sep2/Help/_About/Help/_Documentation/Play/Play _all/Play/Play se_lection/Play/_Play from cursor/Play/_Record.../Play/_Stop/Play/sep1/View/Sp_eed slider/View/Zoom _all/View/Zoom _in/View/Zoom _out/View/Zoom to _selection/View/_Horizontal zoom/View/_Time scale/View/_Vertical zoom/View/sep1/View/sep2/_Cursor/_Edit/_File/_Help/_Play/_View16 bit PCM24 bit PCM32 bit PCM8 bit PCMALSA PreferencesAbout mhWaveEditActivation failed!Adjusting speedAdvancedAll editing functions work non-destructively, that is, the file you're editing isn't actually changed until you save it (the effects also work this way). AmplifyingApplyApply to: Applying effect '%s'Author: %sAuto stop in: Auto-_reset speedAutomatically connect input ports on startupAutomatically connect output ports on startupAvoid select calls (try this if recording locks up)BackgroundBig endianBig-endianBlackBrowse directoryBug reportingBy default, mhWaveEdit uses floating-point temporary files for storing processed results to avoid rounding until the file is saved. Bytes written: Calculating peak levelCalculating peak volume...CancelChannels: ChoiceClient name: Clipping: CloseColorsCommand failed without returning any dataCommand line: Compiled %s %sConnection from %s to %s failed: %sConversion test failed, between: Converting samplerateCopy the current selectionCopyright: %sCould not connect to the JACK server.Could not create pipe: %sCould not find home directory. Using current directory as home directory.Could not get file position in %s: %sCould not initialize SDL: %sCould not open %s: %sCould not open '%s': %sCould not read from %s: %sCould not remove '%s': %sCould not seek in %s: %sCouldn't connect to ESD daemon: %sCouldn't open %sCurrent sound driver: %sCurrently it is impossible to play and record at the same time, so the playback will stop when you record. CursorCursor: Cursor: runningCustom formatCustomize co_lors...Cut out the current selectionCut, copy and paste operations move the data around without modifying it, so these don't degrade the sound quality. Because of level differences, you may get a "step" at the start and end of the inserted part, which can cause a small clicking sound. Decay DecodingDelay (ms) Delay time: Delete the selectionDepth (ms) Depth: DisableDisk editing _threshold: Display t_imes as: Distributed under GNU General Public License. For information, see the file COPYINGDon't actually change the data (for repairing bad files etc)Dummy (no sound)ESD preferencesEditingEffect %s contains invalid port %sEffectsEnable _dithering for editingEnable _variable speed playbackEnable dithering for _playbackEnd:Endianness: Error changing samplerate conversion ratio: %s Error closing %s: %sError converting samplerate: %s Error creating link to '%s': %sError creating pipeError in sound driver: ioctl failed: %sError in sound driver: read failed: %sError in sound driver: select failed: %sError in sound driver: write failed: %sError initialising sample rate conversion: %sError launching mixer: fork: %sError opening ALSA device '%s' for playback: %sError opening ALSA device '%s' for recording: %sError reading %s: %sError reading from %s: %sError reading from sub process: %sError reading sox outputError running 'sox -h': %s Error seeking in %s: %sError writing to subprocess: %sError: %sError: fork: %sEsounD: Unable to open playback streamEsounD: Unable to open recording streamEsound connection closed by serverExpected driver name after --driver optionFactor: Fade: Fade|LinearFade|TrapezoidFailed to open '%s'!Failed to write to '%s'!File already exists. Overwrite?File formatsFilesFilter type: Find top volumeFinishFloating-point, doubleFloating-point, singleFormat not selectedFrequency: GeneralHeavyHzIf the cursor starts running too early when jumping, this delay should be increased.Ignoring extreme old window size/position values In the sample view there is a grey vertical bar called the 'cursor'. The cursor follows the sound wave when you play the sound. You can position the cursor by clicking with the right (2:nd) mouse button. If you do this while you're playing a file, the playing will continue from the new cursor position. You can also position the cursor more exact by using the 'Position Cursor...' command on the Edit menu. Initial volume: InputInput gain: Input level (dB)Input levelsInsert SilenceInterfaceInterpolation: Interpolation|CubicInterpolation|LinearInvalid driver name: %s Using '%s' driver insteadInvalid number of input ports.Invalid number of output ports.Invalid sample format or number of channels for this file formatInvalid time value. Time must be specified in the form (HH')MM:SS(.mmmm)Jack PreferencesJump delay:Keep main _window in front after applying effectKeyboard shortcutsL WaveformLadspa: Error scanning %sLaunch mixerLeftLittle endianLittle-endianLoad FileLoad a file from diskLoadingLoop mode (play over and over)MarksMessageMethod: Mi_xer utility: Microsoft WAV formatMildMixingModulation Modulation|SinusoidalModulation|TriangularMonoN/AName :New samplerate: NoNo errors detected!No file with that name!Noise modeNoneNumber of ports (0-8): Number of recent files in File menu: OKOSS preferencesOgg VorbisOn this system, libsndfile is required to save floating-point wav files.OtherOutput _buffer size:Output from command '%s': Output gain: Output level (dB)Paste at cursor positionPaste, overwriting the data after the cursor positionPause recordingPeak max: Peak: Place cursor Play from cursor positionPlay selected areaPlaybackPlayback device: PlayingPlaying a file is simple, just load the file and press the play button. The green play button plays from the current position. The yellow play button plays the current selection, or the entire file if nothing is selected. Stop the playback with the stop button (with the red square). Port #%dPosition cursorPost-processing gain: PreferencesPreparing tests..Process outputProcessing dataProgress barQualityR WaveformRange test failed for format: Raw PCM dataReady for recordingRecordRecordStatus|PausedRecordStatus|RecordingRecordingRecording device: Recording is done with 'Record...' on the Play menu, or the Record button (the red circle). A dialog box will pop up where you can select what format you want to record in. After selecting the format, meters and numbers will appear showing info about the volume level of the sound input. Recording settingsRecording status: Reset max peaksResume recordingReverb time: RightRunning tests..SDL (output only)SDL: Couldn't open audio: %sSample format to try when the sound file's format isn't supported.Sample format: Sample rate: Sample repeat/skip (low quality)Sample type: Sample viewSave FileSave changes to %s?Save selection as ...Save the current file to diskSavingSeconds of silence: Selecting the ESD host to connect to is done through the ESPEAKER environment variable.SelectionSelection: %s+%sSend wav headerSetSet selection end to cursor positionSet selection start to cursor positionShould not reach this pointShould not reach this point!Show _horizontal zoom slider by defaultShow _speed slider by defaultShow _time scale by defaultShow _vertical zoom slider by defaultSignedSignedness: SoX closed connection too early!Some notes on sound quality. Some of the settings you have changed will not be activated until you restart the programSoundSound data is normally stored as integer values. Therefore, whenever you normalize, adjust volume, decrease sample size or filter a sound, the result must be rounded. If you use 24 or 32 bit sample sizes, this is not really a problem, but if you use 8 or 16 bits sample size, this rounding causes a decrease in quality. Sox support couldn't be initializedSpeed (Hz) Speed effect: Speed:Speed: Start recordingStart:StereoStop playingSunAudio: Couldn't open %sSunAudio: Error reading from sound deviceSunAudio: Error writing to sound deviceSyntax: %s [files] Testing conversion functions finished.Testing conversion functions:The 'Crop' function deletes all parts of the file that are not selected. The 'Cut' and 'Copy' functions work like in any other software. The 'Paste as new' function opens a new window and puts the clipboard contents into it. The 'Paste mix' function combines the clipboard data with the data at the cursor position. The 'Paste' function insert the clipboard contents at the cursor position. The 'Paste over' function works like 'Paste', except that it overwrites the data after the insert position. The 'Silence selection' function replaces the selected part with silence. To avoid clicks, the silent part is a line that meets the wave at the endpoints. The area where you 'see' the contents of the file you are editing, is called the 'sample view'. The client name change won't take effect until you restart the program.The file %s does not exist!The file %s is a compressed wav file. This program can only work with uncompressed wav files.The file %s is not a regular file!The file %s may be destroyed since the saving failed. Try to free up some disk space and save again. If you exit now the file's contents could be in a bad state. The file has not changed since last save. Press OK if you want to save it anyway?The file name '%s' has an extension unknown to the program. Please specify in which format this file should be saved.The format of file '%s' could not be recognized. Please specify the sample format below.The general rule when doing audio editing/processing is to not manipulate the data more than necessary and keep an original copy whenever you're processing your important files. The mix paste function doesn't decrease quality, unless the peaks become too high and you get clipping. In that case you will get a warning message. The mixed result was clipped %d times.The playback speed can be varied by adjusting the slider to the far right. The sign and endian-ness can usually be left at their defaults, but should be changed if you're unable to record or get bad sound.The sound format of this file is not supported for playing.There already is only one channel!This effect has no options.This format is not supported by the input driver!Time limit: Time recorded: TimeDisplay|SamplesTo avoid rounding errors when applying more than one effect on the same data, floating-point temporary files can be used. However, this will increase disk and CPU usage.Unable to detect supported SoX effectsUnable to write data to %sUndo the last changeUnexpected EOF in connection to subprocessUnexpected end of fileUnexpected end of file reading from %sUnknown file formatUnknown file typeUnknown option '%s'UnsignedUse fast and noisy methodUses double-precision mathValue for %s must be a number between %ld and %ldValue for '%s' must be a number between %f and %fValue for '%s' must not be above %fValue for '%s' must not be below %fVarispeed: View _quality:View: [ %s - %s ]Warning: Unexpected error: %sWhen you want to start recording, press the "Start recording" button. When you've recorded everything you wanted to, press the Finish button and the record dialog will disappear and newly recorded sound will show up in a new window. WhiteWidth: Window length: Window size: Window width: With JACK, the only supported recording format is Floating-point, single precision, %d HzYesYou are saving a wav file larger than 2048MB. Such large files are non-standard and may not be readable by all programs. (this warning will not be displayed again)You can do normal editing while the file is playing. You can find the latest release of mhWaveEdit at: You can place marks in your file by holding down Ctrl and pressing a number from 0 to 9. This will place a mark (green vertical bar) with the same number at the current cursor position. You can later make the cursor go to that position again by just pressing the number. Setting and jumping to marks can be done while playing. To remove a mark, jump to the mark and set it again. You can use the cursor to refine the selection. Use the 'Selection start at cursor' and 'Selection end at cursor' buttons to move the selection starting point or the selection end point to the current cursor position. You can also drag the selection endpoints using the mouse. You have mapped more than one output port to channel '%s'. You can only map one output port to each channel.You have no open file to apply the effect to!You make selections by dragging the mouse over the sample view. You can hear what you've currently selected by clicking on the "play selection" button (the button with the yellow arrow) or by selecting 'Play selection' from the Play menu. Zero-level_Add_Auto-start playback when jumping to mark_Browse..._Byte-swap output (try this if playback sounds horrible)_Cancel_Close_Down_Draw waveform a second time with improved quality_Driver:_Keep cursor in center of view when following playback_Keep sound driver opened (to avoid start/stop clicks)_OK_Preview_Remember window sizes/positions_Remove_Settings_Up_Update cursor information while playing_Use floating-point temporary filesafter beginning of fileafter current cursor positionafter end of fileafter selection endafter selection startbyteshttp://gna.org/projects/mhwaveedit/ jump delaymhWaveEdit HelpmhWaveEdit is a graphical program for editing sound files. It is completely free (GPL). mhWaveEdit: mhWaveEdit: %s (%s): %d Hz, %smhWaveEdit: %s: %s msnumber of recent filesputenv failed!sample ratesamplessamples/pixelsecondssound-portaudio: No input devices available!sound-portaudio: No output devices available!unsetenv failed!untitled #%dProject-Id-Version: mhWaveEdit 1.3.8 Report-Msgid-Bugs-To: POT-Creation-Date: 2018-08-25 11:56+0200 PO-Revision-Date: 2005-08-11 22:50+0300 Last-Translator: Konstantin Korikov Language-Team: Russian Language: ru MIME-Version: 1.0 Content-Type: text/plain; charset=KOI8-R Content-Transfer-Encoding: 8bit (1 = %f /) '%s' : : : %d %s wav-%s... ( ESC )%s: '=': %s %s: : %s '%s' !('):.('):.( .)(SoX) (SoX) ( , )( , )() ( )( )( , , )// ...// // //sep1/sep2// //_//_// _// _// _// _// //_//_// _//_//_//sep1//sep2//sep3//sep4/_// _// _ ...// _ ...// ...// _// _// (pipe)...//_ ...//_// _...// _ (fade)...//sep1//sep2//sep3//sep4// _...// ...//_//_//_...//_//sep1//sep2//_ //_// _// _//_ //_...//_//sep1// _// _//_ //_ // _// _ //_ // _ //sep1//sep2/_/_/_/_/_/_16- PCM24- PCM32- PCM8- PCM ALSA mhWaveEdit ! , , , ( ). : '%s': %s : select ( ) (big-endian) (big-endian) mhWaveEdit , . : ...: : : , : %s %s %s %s: %s : Copyright: %s JACK-. (pipe): %s . . %s: %s SDL: %s %s: %s '%s': %s %s: %s '%s': %s %s: %s ESD: %s %s : %s , , . : : _... "", "" "" , . "" , . () : () : _: _ : GNU. COPYING ( , ..) ( ) ESD %s %s _ _ _: : : %s %s: %s : %s '%s': %s (pipe) : ioctl : %s : read : %s : select : %s : write : %s : %s : fork: %s ALSA '%s' : %s ALSA '%s' : %s %s: %s %s: %s : %s sox 'sox -h': %s %s: %s : %s: %s: fork: %sEsounD: EsounD: Esound --driver : : '%s'! '%s'! . ? : , , : , . / , . , . () . , . , " ..." "". : : () : : %s '%s' . . . ('):(.) Jack : _ Ladspa: %s (little-endian) (little-endian) ( ): _: Microsoft WAV : : ! ! (0-8): "": OSSOgg Vorbis , libsndfile wav- . _: '%s': : () , : : , , " " " ". " " () . " " () , , . " " ( ). #%d : .. : PCM- : "..." "", "" ( ). , . , , . : : ..SDL ( )SDL: : %s . : : / ( ) : %s? ... : ESD- ESPEAKER.: %s+%s wav- ! _ _ _ _ : SoX ! . , , . , , , , . 24- 32- , , 8- 16- , . Sox () : :: : SunAudio: %sSunAudio: SunAudio: : %s [] . : "" . "" "" . " " , . " " . "" ( , , , . .). " " "", . " " . , , . , "" , . . %s ! %s wav-. wav-. %s ! %s . . , . . , . '%s' . . '%s' . . / : , , . " " , , . . %d . , , . , , . . ! . ! : : , , . , . SoX %s %s '%s' %s %ld %ld '%s' %f %f '%s' %f '%s' %f : _ :: [ %s - %s ]: : %s , " ". , "". , . : : : : JACK - , , %d wav- 2048. , . ( ) . mhWaveEdit : . Ctrl, 0 9. ( ) . , . . , . . " " " " . . '%s'. . , ! . () , . " " ( ), "" " ". __ _... ( )____ _:_ _ ( )___ / ____ _ http://gna.org/projects/mhwaveedit/ mhWaveEditmhWaveEdit - . (GPL). mhWaveEdit: mhWaveEdit: %s (%s): %d , %smhWaveEdit: %s: %s putenv ! /sound-portaudio: !sound-portaudio: !unsetenv ! #%dmhwaveedit-1.4.24/po/ru.po000066400000000000000000003065021334022513400153460ustar00rootroot00000000000000# Russian translation for mhWaveEdit # Copyright (C) 2002, 2003, 2004 Magnus Hjorth # This file is distributed under the same license as the mhWaveEdit package. # Konstantin Korikov , 2005.. # msgid "" msgstr "" "Project-Id-Version: mhWaveEdit 1.3.8\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-08-25 11:56+0200\n" "PO-Revision-Date: 2005-08-11 22:50+0300\n" "Last-Translator: Konstantin Korikov \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=KOI8-R\n" "Content-Transfer-Encoding: 8bit\n" #: src/chunk.c:199 msgid "Converting samplerate" msgstr " " #: src/chunk.c:226 msgid "Adjusting speed" msgstr " " #: src/chunk.c:703 msgid "Mixing" msgstr "" #: src/chunk.c:758 #, c-format msgid "The mixed result was clipped %d times." msgstr " %d ." #: src/chunk.c:822 #, fuzzy msgid "Combining channels" msgstr "[B] " #: src/chunk.c:1083 #, fuzzy msgid "Mixing channels" msgstr " " #: src/chunk.c:1471 msgid "Calculating peak level" msgstr " " #: src/chunk.c:1542 src/chunk.c:1552 src/chunk.c:1590 src/chunk.c:1600 msgid "Finding zero-crossing" msgstr "" #: src/chunk.c:1628 #, c-format msgid "Amplifying (by %3.1f%% / %+.1fdB)" msgstr "" #: src/chunk.c:1669 msgid "Amplifying" msgstr "" #: src/chunk.c:1867 #, fuzzy, c-format msgid "The input was clipped %d times during processing." msgstr " %d ." #: src/configdialog.c:65 msgid "number of recent files" msgstr " " #: src/configdialog.c:66 #, fuzzy msgid "maximum vertical zoom" msgstr "// _ " #: src/configdialog.c:80 msgid "" "Some of the settings you have changed will not be activated until you " "restart the program" msgstr "" " , , " " " #: src/configdialog.c:292 msgid "Colors" msgstr "" #: src/configdialog.c:329 msgid "_Preview" msgstr "_" #: src/configdialog.c:336 src/configdialog.c:1204 msgid "_OK" msgstr "_" #: src/configdialog.c:353 msgid "_Cancel" msgstr "_" #: src/configdialog.c:430 msgid "Browse directory" msgstr " " #: src/configdialog.c:480 msgid "Preferences" msgstr "" #: src/configdialog.c:539 msgid "Show _time scale by default" msgstr " _ " #: src/configdialog.c:549 msgid "Show _horizontal zoom slider by default" msgstr " _ " #: src/configdialog.c:559 msgid "Show _vertical zoom slider by default" msgstr " _ " #: src/configdialog.c:569 msgid "Show _speed slider by default" msgstr " _" #: src/configdialog.c:579 #, fuzzy msgid "Show slider l_abels by default" msgstr " _" #: src/configdialog.c:589 #, fuzzy msgid "Show playback buffer positio_n by default" msgstr " _" #: src/configdialog.c:598 msgid "_Settings" msgstr "_" #: src/configdialog.c:608 msgid "_Keep sound driver opened (to avoid start/stop clicks)" msgstr "" "_ ( )" #: src/configdialog.c:617 msgid "_Byte-swap output (try this if playback sounds horrible)" msgstr " ( )" #: src/configdialog.c:626 msgid "Play _mono files as stereo" msgstr "" #: src/configdialog.c:634 msgid "_Update cursor information while playing" msgstr "_ " #: src/configdialog.c:642 msgid "_Keep cursor in center of view when following playback" msgstr "_ " #: src/configdialog.c:652 msgid "_Auto-start playback when jumping to mark" msgstr "_ " #: src/configdialog.c:660 msgid "Enable _variable speed playback" msgstr " _ " #: src/configdialog.c:669 msgid "Auto-_reset speed" msgstr " " #: src/configdialog.c:676 msgid "Use fast and noisy method" msgstr " " #: src/configdialog.c:684 msgid "(H')MM:SS.t" msgstr "('):." #: src/configdialog.c:685 msgid "(H')MM:SS.mmmm" msgstr "('):." #: src/configdialog.c:686 msgid "TimeDisplay|Samples" msgstr "" #: src/configdialog.c:687 #, fuzzy msgid "Time Code 24fps" msgstr " : " #: src/configdialog.c:688 msgid "Time Code 25fps (PAL)" msgstr "" #: src/configdialog.c:689 msgid "Time Code 29.97fps (NTSC)" msgstr "" #: src/configdialog.c:690 #, fuzzy msgid "Time Code 30fps" msgstr " : " #: src/configdialog.c:703 msgid "_Remember window sizes/positions" msgstr "_ / " #: src/configdialog.c:712 msgid "_Draw waveform a second time with improved quality" msgstr "_ " #: src/configdialog.c:742 msgid "_Remove" msgstr "_" #: src/configdialog.c:750 msgid "_Add" msgstr "_" #: src/configdialog.c:757 msgid "_Browse..." msgstr "_..." #: src/configdialog.c:764 msgid "_Up" msgstr "_" #: src/configdialog.c:772 msgid "_Down" msgstr "_" #: src/configdialog.c:788 msgid "Keep main _window in front after applying effect" msgstr " _ " #: src/configdialog.c:804 msgid "_Use floating-point temporary files" msgstr "_ " #: src/configdialog.c:813 msgid "Enable _dithering for editing" msgstr " _" #: src/configdialog.c:821 msgid "Enable dithering for _playback" msgstr " _" #: src/configdialog.c:829 msgid "Auto dete_ct driver on each start-up" msgstr "" #: src/configdialog.c:842 msgid "Direct access" msgstr "" #: src/configdialog.c:843 msgid "Decompress" msgstr "" #: src/configdialog.c:844 msgid "Bypass" msgstr "" #: src/configdialog.c:855 msgid "Biased" msgstr "" #: src/configdialog.c:856 msgid "Pure-Scaled" msgstr "" #: src/configdialog.c:873 msgid "Interface" msgstr "" #: src/configdialog.c:874 msgid " Main window " msgstr " " #: src/configdialog.c:885 msgid "Number of recent files in File menu: " msgstr " \"\": " #: src/configdialog.c:890 msgid " View " msgstr " " #: src/configdialog.c:901 msgid "Customize co_lors..." msgstr " _..." #: src/configdialog.c:908 msgid " Window contents " msgstr " " #: src/configdialog.c:925 #, fuzzy msgid "Vertical zoom limit: " msgstr "// _ " #: src/configdialog.c:929 msgid "x" msgstr "" #: src/configdialog.c:935 msgid "Sound" msgstr "" #: src/configdialog.c:936 msgid " Driver options " msgstr " " #: src/configdialog.c:944 msgid "_Driver:" msgstr "_:" #: src/configdialog.c:961 msgid " Fallback format " msgstr "" #: src/configdialog.c:966 msgid "Sample format to try when the sound file's format isn't supported." msgstr "" " " "." #: src/configdialog.c:978 msgid "Playback" msgstr "" #: src/configdialog.c:980 msgid " Playback settings " msgstr " " #: src/configdialog.c:992 msgid " Variable speed " msgstr " " #: src/configdialog.c:1007 src/help.c:38 msgid "Files" msgstr "" #: src/configdialog.c:1009 msgid " Temporary file directories " msgstr " " #: src/configdialog.c:1035 msgid " Temporary file settings " msgstr " " #: src/configdialog.c:1040 msgid "" "To avoid rounding errors when applying more than one effect on the same " "data, floating-point temporary files can be used. However, this will " "increase disk and CPU usage." msgstr "" " , " " , " " . , " " ." #: src/configdialog.c:1048 msgid "" "Some versions of libsndfile supports accessing Ogg files without " "decompressing to a temporary file." msgstr "" #: src/configdialog.c:1062 src/help.c:36 msgid "Quality" msgstr "" #: src/configdialog.c:1064 msgid " Rate conversions " msgstr " " #: src/configdialog.c:1071 msgid "Varispeed: " msgstr " : " #: src/configdialog.c:1072 msgid "Speed effect: " msgstr " : " #: src/configdialog.c:1079 msgid " Dithering " msgstr " " #: src/configdialog.c:1090 #, fuzzy msgid " Sample conversion " msgstr " " #: src/configdialog.c:1097 msgid "Normalization mode: " msgstr "" #: src/configdialog.c:1104 msgid "Other" msgstr "" #: src/configdialog.c:1106 msgid " Time format " msgstr " " #: src/configdialog.c:1115 msgid "Display t_imes as: " msgstr " _ : " #: src/configdialog.c:1126 #, fuzzy msgid "Times_cale format: " msgstr " " #: src/configdialog.c:1137 msgid " External applications " msgstr " " #: src/configdialog.c:1145 msgid "Mi_xer utility: " msgstr " _: " #: src/configdialog.c:1155 msgid "Advanced" msgstr "" #: src/configdialog.c:1156 msgid " Advanced settings " msgstr " " #: src/configdialog.c:1164 msgid "Disk editing _threshold: " msgstr " _: " #: src/configdialog.c:1175 msgid "View _quality:" msgstr "_ :" #: src/configdialog.c:1181 msgid "samples/pixel" msgstr "/" #: src/configdialog.c:1187 msgid "Output _buffer size:" msgstr " _:" #: src/configdialog.c:1193 msgid "bytes" msgstr "" #: src/configdialog.c:1218 msgid "_Close" msgstr "_" #: src/dataformat.c:886 #, fuzzy, c-format msgid "Floating-point (single %s)\n" msgstr " ( )" #: src/dataformat.c:886 src/dataformat.c:888 src/dataformat.c:892 msgid "Big-endian" msgstr " (big-endian)" #: src/dataformat.c:886 src/dataformat.c:888 src/dataformat.c:892 msgid "Little-endian" msgstr " (little-endian)" #: src/dataformat.c:888 #, fuzzy, c-format msgid "Floating-point (double %s)\n" msgstr " ( )" #: src/dataformat.c:890 #, fuzzy, c-format msgid "PCM, %d(%d) bit, %s %s\n" msgstr "PCM, %d , %s %s\n" #: src/dataformat.c:891 src/formatselector.c:77 msgid "Signed" msgstr " " #: src/dataformat.c:891 src/formatselector.c:76 msgid "Unsigned" msgstr " " #: src/dataformat.c:952 #, fuzzy msgid " Testing ranges..." msgstr " ..." #: src/dataformat.c:976 msgid "Range test failed for format: " msgstr " : " #: src/dataformat.c:990 #, fuzzy msgid " Testing all conversions.." msgstr " .." #: src/dataformat.c:1032 msgid "(expected) " msgstr "() " #: src/dataformat.c:1033 msgid "Conversion test failed, between: " msgstr " :" #: src/dataformat.c:1035 msgid " and: " msgstr " : " #: src/dataformat.c:1112 msgid "No errors detected!" msgstr " !" #: src/dataformat.c:1146 msgid "Preparing tests.." msgstr " .." #: src/dataformat.c:1154 msgid "Running tests.." msgstr " .." #: src/dataformat.c:1196 #, c-format msgid "" "\n" "\n" "Test results (1 time unit = %f usec/sample)\n" msgstr "" "\n" "\n" " (1 = %f /)\n" #: src/datasource.c:366 #, c-format msgid "Couldn't open %s" msgstr " %s" #: src/datasource.c:497 msgid "Unexpected end of file" msgstr " " #: src/datasource.c:498 #, c-format msgid "Error reading %s: %s" msgstr " %s: %s" #: src/datasource.c:515 #, c-format msgid "Error seeking in %s: %s" msgstr " %s: %s" #: src/effectbrowser.c:99 msgid "Built-in" msgstr "" #: src/effectbrowser.c:102 #, fuzzy msgid "Volume adjust/fade" msgstr "[B] " #: src/effectbrowser.c:104 #, fuzzy msgid "Convert samplerate" msgstr " " #: src/effectbrowser.c:106 #, fuzzy msgid "Convert sample format" msgstr "[B] " #: src/effectbrowser.c:108 #, fuzzy msgid "Map channels" msgstr "%d " #: src/effectbrowser.c:110 #, fuzzy msgid "Combine channels" msgstr "[B] " #: src/effectbrowser.c:113 msgid "Add channels from other file" msgstr "" #: src/effectbrowser.c:114 #, fuzzy msgid "Speed" msgstr ":" #: src/effectbrowser.c:115 #, fuzzy msgid "Pipe through program" msgstr "[B] (pipe)" #: src/effectbrowser.c:250 msgid "You have no open file to apply the effect to!" msgstr " , !" #: src/effectbrowser.c:275 #, fuzzy msgid "This effect could not be loaded." msgstr " ." #: src/effectbrowser.c:582 msgid "/Move Up" msgstr "" #: src/effectbrowser.c:583 msgid "/Move Down" msgstr "" #: src/effectbrowser.c:584 msgid "/Move to Top" msgstr "" #: src/effectbrowser.c:585 msgid "/Move to Bottom" msgstr "" #: src/effectbrowser.c:587 msgid "/Sort by Name" msgstr "" #: src/effectbrowser.c:588 msgid "/Sort by Type" msgstr "" #: src/effectbrowser.c:589 msgid "/Sort by Location" msgstr "" #: src/effectbrowser.c:590 msgid "/Sort by Author" msgstr "" #: src/effectbrowser.c:592 msgid "/Restore Order" msgstr "" #: src/effectbrowser.c:593 msgid "/Rebuild Effect List" msgstr "" #: src/effectbrowser.c:744 msgid "Top" msgstr "" #: src/effectbrowser.c:751 #, fuzzy msgid "Up" msgstr "_" #: src/effectbrowser.c:758 #, fuzzy msgid "Down" msgstr "_" #: src/effectbrowser.c:765 msgid "Bottom" msgstr "" #: src/effectbrowser.c:793 #, fuzzy msgid "Close dialog after applying effect" msgstr " _ " #: src/effectbrowser.c:800 src/gotodialog.c:154 msgid "Apply" msgstr "" #: src/effectbrowser.c:808 src/gotodialog.c:159 src/mainwindow.c:1438 #: src/pipedialog.c:165 src/recorddialog.c:610 src/recorddialog.c:987 #: src/sound-esound.c:290 src/sound-jack.c:264 src/sound-oss.c:479 msgid "Close" msgstr "" #: src/effectbrowser.c:830 src/help.c:35 msgid "Effects" msgstr "" #: src/effectbrowser.c:892 msgid "Apply to: " msgstr " : " #: src/filetypes.c:103 msgid "putenv failed!" msgstr "putenv !" #: src/filetypes.c:113 msgid "unsetenv failed!" msgstr "unsetenv !" #: src/filetypes.c:155 msgid "Microsoft WAV format" msgstr "Microsoft WAV " #: src/filetypes.c:181 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: src/filetypes.c:188 msgid "Raw PCM data" msgstr " PCM-" #: src/filetypes.c:190 msgid "Open with MPlayer" msgstr "" #: src/filetypes.c:275 #, c-format msgid "The file %s does not exist!" msgstr " %s !" #: src/filetypes.c:282 #, c-format msgid "The file %s is not a regular file!" msgstr " %s !" #: src/filetypes.c:294 msgid "Loading" msgstr "" #: src/filetypes.c:333 #, c-format msgid "" "The file name '%s' has an extension unknown to the program. Please specify " "in which format this file should be saved." msgstr "" " '%s' . " " ." #: src/filetypes.c:338 msgid "Unknown file type" msgstr " " #: src/filetypes.c:389 msgid "Saving" msgstr "" #: src/filetypes.c:393 #, c-format msgid "" "The file %s may be destroyed since the saving failed. Try to free up some " "disk space and save again. If you exit now the file's contents could be in a " "bad state. " msgstr "" " %s . " " . " ", . " #: src/filetypes.c:457 #, c-format msgid "%s is not a valid wav file" msgstr "%s wav-" #: src/filetypes.c:472 #, c-format msgid "" "The file %s is a compressed wav file. This program can only work with " "uncompressed wav files." msgstr "" " %s wav-. " " wav-." #: src/filetypes.c:593 msgid "" "On this system, libsndfile is required to save floating-point wav files." msgstr "" " , libsndfile wav- ." #: src/filetypes.c:616 msgid "" "You are saving a wav file larger than 2048MB. Such large files are non-" "standard and may not be readable by all programs.\n" "\n" " (this warning will not be displayed again)" msgstr "" " wav- 2048. " ", .\n" "\n" " ( )" #: src/filetypes.c:732 src/filetypes.c:877 #, c-format msgid "Failed to open '%s'!" msgstr " '%s'!" #: src/filetypes.c:849 msgid "Invalid sample format or number of channels for this file format" msgstr "" " " #: src/filetypes.c:943 #, c-format msgid "Failed to write to '%s'!" msgstr " '%s'!" #: src/filetypes.c:1028 msgid "Decoding" msgstr "" #: src/filetypes.c:1149 msgid "Variable bitrate (default)" msgstr "" #: src/filetypes.c:1150 msgid "Average bitrate" msgstr "" #: src/filetypes.c:1151 msgid "Constant bitrate" msgstr "" #: src/filetypes.c:1152 #, fuzzy msgid "Custom argument" msgstr " " #: src/filetypes.c:1156 msgid "Standard (high quality)" msgstr "" #: src/filetypes.c:1157 msgid "Extreme (higher quality)" msgstr "" #: src/filetypes.c:1158 msgid "Insane (highest possible quality)" msgstr "" #: src/filetypes.c:1176 #, c-format msgid "%s kbit/s" msgstr "" #: src/filetypes.c:1205 #, fuzzy msgid "MP3 Preferences" msgstr "" #: src/filetypes.c:1216 #, fuzzy msgid "Encoding type: " msgstr " : " #: src/filetypes.c:1229 #, fuzzy msgid "Quality: " msgstr "" #: src/filetypes.c:1238 #, fuzzy msgid "Custom argument: " msgstr " " #: src/filetypes.c:1244 #, fuzzy msgid "Use this setting by default" msgstr " _ " #: src/filetypes.c:1249 src/gotodialog.c:146 src/mainwindow.c:1509 #: src/rawdialog.c:101 src/sound-alsalib.c:98 src/sound-esound.c:286 #: src/sound-jack.c:260 src/sound-oss.c:475 src/um.c:109 src/um.c:142 #: src/um.c:341 src/um.c:449 msgid "OK" msgstr "" #: src/filetypes.c:1257 src/rawdialog.c:107 src/sound-alsalib.c:102 #: src/um.c:133 src/um.c:150 src/um.c:347 src/um.c:458 msgid "Cancel" msgstr "" #: src/float_box.c:184 src/int_box.c:184 #, c-format msgid "'%s' is not a number!" msgstr "'%s' !" #: src/float_box.c:202 #, c-format msgid "Value for '%s' must be a number between %f and %f" msgstr " '%s' %f %f" #: src/formatselector.c:60 msgid "Sample type: " msgstr " : " #: src/formatselector.c:62 msgid "8 bit PCM" msgstr "8- PCM" #: src/formatselector.c:63 msgid "16 bit PCM" msgstr "16- PCM" #: src/formatselector.c:64 msgid "24 bit PCM" msgstr "24- PCM" #: src/formatselector.c:65 msgid "32 bit PCM" msgstr "32- PCM" #: src/formatselector.c:66 msgid "Floating-point, single" msgstr " , " #: src/formatselector.c:67 msgid "Floating-point, double" msgstr " , " #: src/formatselector.c:74 msgid "Signedness: " msgstr ": " #: src/formatselector.c:82 msgid "Endianness: " msgstr " : " #: src/formatselector.c:84 msgid "Little endian" msgstr " (little-endian)" #: src/formatselector.c:85 msgid "Big endian" msgstr " (big-endian)" #: src/formatselector.c:90 msgid "Alignment:" msgstr "" #: src/formatselector.c:92 msgid "Packed" msgstr "" #: src/formatselector.c:93 #, fuzzy msgid "Top bytes" msgstr "" #: src/formatselector.c:94 msgid "Bottom bytes" msgstr "" #: src/formatselector.c:130 msgid "Channels: " msgstr ": " #: src/formatselector.c:139 msgid "Sample rate: " msgstr " : " #: src/formatselector.c:226 msgid "sample rate" msgstr " " #: src/gotodialog.c:102 msgid "Place cursor " msgstr " " #: src/gotodialog.c:107 src/sound-esound.c:274 msgid "seconds" msgstr "" #: src/gotodialog.c:111 src/soxdialog.c:487 msgid "samples" msgstr "" #: src/gotodialog.c:115 msgid "after beginning of file" msgstr " " #: src/gotodialog.c:120 msgid "after end of file" msgstr " " #: src/gotodialog.c:125 msgid "after current cursor position" msgstr " " #: src/gotodialog.c:130 msgid "after selection start" msgstr " " #: src/gotodialog.c:135 msgid "after selection end" msgstr " " #: src/gotodialog.c:139 msgid "" "(use a negative number to place the cursor before instead of after the " "selected point)" msgstr "" "( , , " " )" #: src/gotodialog.c:178 msgid "Position cursor" msgstr " " #: src/gtkfiles.c:48 #, c-format msgid "Could not open %s: %s" msgstr " %s: %s" #: src/gtkfiles.c:53 #, c-format msgid "Warning: Unexpected error: %s" msgstr ": : %s" #: src/gtkfiles.c:110 src/gtkfiles.c:125 #, c-format msgid "Error closing %s: %s" msgstr " %s: %s" #: src/gtkfiles.c:140 #, c-format msgid "Could not seek in %s: %s" msgstr " %s: %s" #: src/gtkfiles.c:159 src/gtkfiles.c:204 #, c-format msgid "Could not read from %s: %s" msgstr " %s: %s" #: src/gtkfiles.c:178 #, c-format msgid "Unexpected end of file reading from %s" msgstr " %s" #: src/gtkfiles.c:196 #, c-format msgid "Unable to write data to %s" msgstr " %s" #: src/gtkfiles.c:262 #, c-format msgid "Could not get file position in %s: %s" msgstr " %s: %s" #: src/gtkfiles.c:313 src/gtkfiles.c:473 msgid "File already exists. Overwrite?" msgstr " . ?" #: src/gtkfiles.c:321 msgid "No file with that name!" msgstr " !" #: src/gtkfiles.c:705 #, c-format msgid "Error reading from %s: %s" msgstr " %s: %s" #: src/gtkfiles.c:737 #, c-format msgid "Could not remove '%s': %s" msgstr " '%s': %s" #: src/gtkfiles.c:757 #, c-format msgid "Error creating link to '%s': %s" msgstr " '%s': %s" #: src/help.c:30 msgid "General" msgstr "" #: src/help.c:31 msgid "Sample view" msgstr " " #: src/help.c:32 msgid "Playing" msgstr "" #: src/help.c:33 msgid "Recording" msgstr "" #: src/help.c:34 msgid "Editing" msgstr "" #: src/help.c:37 msgid "File formats" msgstr " " #: src/help.c:39 msgid "Keyboard shortcuts" msgstr " " #: src/help.c:40 msgid "Bug reporting" msgstr " " #: src/help.c:41 #, fuzzy msgid "Helping out" msgstr "//_ " #: src/help.c:42 msgid "Contact" msgstr "" #: src/help.c:47 #, no-c-format msgid "" "mhWaveEdit is a graphical program for editing sound files. It is completely " "free (GPL).\n" msgstr "" "mhWaveEdit - . " " (GPL).\n" #: src/help.c:49 #, no-c-format msgid "You can find the latest release of mhWaveEdit at:\n" msgstr " mhWaveEdit :\n" #: src/help.c:50 #, no-c-format msgid "http://gna.org/projects/mhwaveedit/\n" msgstr "http://gna.org/projects/mhwaveedit/\n" #: src/help.c:55 #, no-c-format msgid "" "The area where you 'see' the contents of the file you are editing, is called " "the 'sample view'. \n" msgstr "" ", \"\" , " " . \n" #: src/help.c:57 #, no-c-format msgid "" "In the sample view there is a grey vertical bar called the 'cursor'. The " "cursor follows the sound wave when you play the sound. You can position the " "cursor by clicking with the right (2:nd) mouse button. If you do this while " "you're playing a file, the playing will continue from the new cursor " "position. You can also position the cursor more exact by using the 'Position " "Cursor...' command on the Edit menu.\n" msgstr "" " , " " . , " ". () " ". , " " . " " , \" ...\" " " \"\".\n" #: src/help.c:59 #, no-c-format msgid "" "You can place marks in your file by holding down Ctrl and pressing a number " "from 0 to 9. This will place a mark (green vertical bar) with the same " "number at the current cursor position. You can later make the cursor go to " "that position again by just pressing the number. Setting and jumping to " "marks can be done while playing. To remove a mark, jump to the mark and set " "it again.\n" msgstr "" " . " "Ctrl, 0 9. " " ( ) " " . , " " . " " . , " " .\n" #: src/help.c:64 #, no-c-format msgid "" "Playing a file is simple, just load the file and press the play button. The " "green play button plays from the current position. The yellow play button " "plays the current selection, or the entire file if nothing is selected. Stop " "the playback with the stop button (with the red square). \n" msgstr "" " , , " " \" \" \" " " \". \" \" () " " . \" " " \" () , " " , . " " \" \" ( ).\n" #: src/help.c:66 #, no-c-format msgid "" "The playback speed can be varied by adjusting the slider to the far right. \n" msgstr "" " , " " , .\n" #: src/help.c:68 #, no-c-format msgid "You can do normal editing while the file is playing.\n" msgstr " .\n" #: src/help.c:73 #, no-c-format msgid "" "Recording is done with 'Record...' on the Play menu, or the Record button " "(the red circle). A dialog box will pop up where you can select what format " "you want to record in. After selecting the format, meters and numbers will " "appear showing info about the volume level of the sound input. \n" msgstr "" " \"...\" " "\"\", \"\" ( ). " " , . " " , , " " . \n" #: src/help.c:75 #, no-c-format msgid "" "When you want to start recording, press the \"Start recording\" button. When " "you've recorded everything you wanted to, press the Finish button and the " "record dialog will disappear and newly recorded sound will show up in a new " "window.\n" msgstr "" " , \" \". " " , \"\". " " , .\n" #: src/help.c:77 #, no-c-format msgid "" "Currently it is impossible to play and record at the same time, so the " "playback will stop when you record.\n" msgstr "" " , " " , .\n" #: src/help.c:82 #, no-c-format msgid "" "You make selections by dragging the mouse over the sample view. You can hear " "what you've currently selected by clicking on the \"play selection\" button " "(the button with the yellow arrow) or by selecting 'Play selection' from the " "Play menu.\n" msgstr "" " . " " () , " " . " " \" \" ( ), " " \"\" \" \".\n" #: src/help.c:84 #, no-c-format msgid "" "You can use the cursor to refine the selection. Use the 'Selection start at " "cursor' and 'Selection end at cursor' buttons to move the selection starting " "point or the selection end point to the current cursor position. You can " "also drag the selection endpoints using the mouse.\n" msgstr "" " . " "\" \" \" " " \" " " . " " .\n" #: src/help.c:86 #, no-c-format msgid "The 'Cut' and 'Copy' functions work like in any other software. \n" msgstr "" " \"\" \"\" " " .\n" #: src/help.c:88 #, no-c-format msgid "" "The 'Paste' function insert the clipboard contents at the cursor position. " "The 'Paste over' function works like 'Paste', except that it overwrites the " "data after the insert position. \n" msgstr "" " \"\" " " ( , " " , , . .). " "\" \" \"\", " " .\n" #: src/help.c:90 #, no-c-format msgid "" "The 'Paste mix' function combines the clipboard data with the data at the " "cursor position.\n" msgstr "" " \" \" " " .\n" #: src/help.c:92 #, no-c-format msgid "" "The 'Paste as new' function opens a new window and puts the clipboard " "contents into it. \n" msgstr "" " \" \" , " " .\n" #: src/help.c:94 #, no-c-format msgid "" "The 'Crop' function deletes all parts of the file that are not selected.\n" msgstr " \"\" .\n" #: src/help.c:96 #, no-c-format msgid "" "The 'Silence selection' function replaces the selected part with silence. To " "avoid clicks, the silent part is a line that meets the wave at the " "endpoints.\n" msgstr "" " \" \" . " " , , " " .\n" #: src/help.c:98 #, no-c-format msgid "" "All editing functions work non-destructively, that is, the file you're " "editing isn't actually changed until you save it (the effects also work this " "way).\n" msgstr "" " , , " " , " "( ).\n" #: src/help.c:104 #, fuzzy, no-c-format msgid "" "mhWaveEdit has a few simple effects, which are available from the 'Effects' " "menu. \n" msgstr "" "mhWaveEdit , " "\"\". \n" #: src/help.c:106 #, fuzzy, no-c-format msgid " * Fade in/out\n" msgstr " * \n" #: src/help.c:108 #, fuzzy, no-c-format msgid " This creates a linear fade in or fade out effect.\n" msgstr " .\n" #: src/help.c:110 #, fuzzy, no-c-format msgid " * Normalize, Normalize to...\n" msgstr " * \n" #: src/help.c:112 #, fuzzy, no-c-format msgid "" " This amplifies the sound as much as possible without getting clipping " "distortion. The \"Normalize to...\" item lets you specify which level to " "normalize to.\n" msgstr "" " , " ", , " ". \n" #: src/help.c:114 #, fuzzy, no-c-format msgid " * Volume adjust/fade...\n" msgstr " * ...\n" #: src/help.c:116 #, fuzzy, no-c-format msgid "" " This effect lets you select a starting volume and a ending volume and " "amplifies the selection fading from the starting volume to the ending " "volume.\n" msgstr "" " , " " , " ".\n" #: src/help.c:118 #, fuzzy, no-c-format msgid "" " Note that volumes above 100% may cause sound distortion. Use the 'Find " "top volume' to find out the maximum amplification possible without " "distortion. (You can use this for normalizing samples.) \n" msgstr "" " 100% . " " \" \" " " , . ( " " .) \n" #: src/help.c:120 #, fuzzy, no-c-format msgid "" " By setting starting volume and ending volume to the same value you get a " "simple amplification of the sound. \n" msgstr "" " " " . \n" #: src/help.c:122 #, fuzzy, no-c-format msgid " * Convert samplerate...\n" msgstr " * ...\n" #: src/help.c:124 #, fuzzy, no-c-format msgid "" " This converts the samplerate of the entire file to one you specify. There " "are different methods for doing this, usually the one in the top has the " "best quality but can take longer than the other methode.\n" msgstr "" " " ". , " " , " " .\n" #: src/help.c:126 #, fuzzy, no-c-format msgid " * Convert sample format...\n" msgstr " * ...\n" #: src/help.c:128 #, fuzzy, no-c-format msgid " This converts the sample format of the entire file.\n" msgstr " .\n" #: src/help.c:130 #, fuzzy, no-c-format msgid "" " The 'Don't actually change the data' option can be used if the program " "was wrong about the file's format.\n" msgstr "" " \" \" " " .\n" #: src/help.c:132 #, fuzzy, no-c-format msgid " * Byte swap\n" msgstr " * \n" #: src/help.c:134 #, fuzzy, no-c-format msgid "" " This \"byte swaps\" the selected part. It can be used to repair damaged " "files where the byte order is wrong. Note that if the sound looks alright " "but plays wrong, you should not use this option, instead you should use the " "\"byte-swap output\" option in the Preferences dialog.\n" msgstr "" " . " " c " " . , " ", , " " \" \" \"\".\n" #: src/help.c:136 #, fuzzy, no-c-format msgid " * Mix to mono\n" msgstr " * ...\n" #: src/help.c:138 #, fuzzy, no-c-format msgid " This mixes all channels of the file together to a mono sound.\n" msgstr "" " , -.\n" #: src/help.c:140 #, fuzzy, no-c-format msgid " * Add channel\n" msgstr " * ...\n" #: src/help.c:142 #, fuzzy, no-c-format msgid "" " This copies the first channel to a new channel in the sound, converting " "mono to stereo etc.\n" msgstr "" " , " ", ..\n" #: src/help.c:144 #, fuzzy, no-c-format msgid " * Map channels...\n" msgstr " * ...\n" #: src/help.c:145 #, fuzzy, no-c-format msgid " \n" msgstr "" " , " " . / " " / / , . " ", , " " 1 0% 1 100% 2, " " 2 100% 1 0% 2.\n" #: src/help.c:146 #, fuzzy, no-c-format msgid "" " With this effect, you can change the number of channels in the file. You " "can also rearrange and add (i.e. mix) channels.\n" msgstr " * ...\n" #: src/help.c:148 #, fuzzy, no-c-format msgid " * Combine channels...\n" msgstr "" " . " ".\n" #: src/help.c:150 #, fuzzy, no-c-format msgid "" " This effect lets you create a new sound by a linear combination of the " "old channels. This means you can do channel mixing / swapping / balance / " "panning / amplification etc. by entering different values. For example, to " "swap the left and right channel, you select that the new Channel 1 should be " "0% of the old Channel 1 and 100% of the old Channel 2, and the new Channel 2 " "should be 100% of the old Channel 1 and 0% of the old Channel 2 \n" msgstr "" "mhWaveEdit LADSPA, " " SoX. " " \"\", " "\" ...\" \"\". \n" #: src/help.c:152 #, fuzzy, no-c-format msgid " * Speed adjustment...\n" msgstr " \n" #: src/help.c:154 #, fuzzy, no-c-format msgid "" " This effect changes the speed of the selection. The tone will change as " "well.\n" msgstr " \n" #: src/help.c:155 #, fuzzy, no-c-format msgid " * Pipe through program...\n" msgstr " \n" #: src/help.c:156 #, fuzzy, no-c-format msgid " \n" msgstr " \n" #: src/help.c:157 #, fuzzy, no-c-format msgid "" " This effect is for advanced users wanting to pipe raw audio data through " "an external program. The output of the program is read back and replaces the " "processed part. \n" msgstr " \n" #: src/help.c:159 #, fuzzy, no-c-format msgid "" "mhWaveEdit supports LADSPA effects and can also make use of most of the SoX " "utility's effects. To find the LADSPA plugins the environment variable " "LADSPA_PATH must be properly set up. \n" msgstr " \n" #: src/help.c:161 #, fuzzy, no-c-format msgid "" "All supported effects can be found by choosing the 'Effects...' menu item. " "The effects are listed with names beginning with [B] for builtin effects, " "[L] for LADSPA effects, and [S] for SoX effects.\n" msgstr " \n" #: src/help.c:167 #, no-c-format msgid "Some notes on sound quality.\n" msgstr " .\n" #: src/help.c:169 #, no-c-format msgid "" "The general rule when doing audio editing/processing is to not manipulate " "the data more than necessary and keep an original copy whenever you're " "processing your important files. \n" msgstr "" " / : " " , " " , . \n" #: src/help.c:171 #, no-c-format msgid "" "Cut, copy and paste operations move the data around without modifying it, so " "these don't degrade the sound quality. Because of level differences, you may " "get a \"step\" at the start and end of the inserted part, which can cause a " "small clicking sound. \n" msgstr "" " \"\", \"\" \"\" " " , . " " \"\" " ", . \n" #: src/help.c:173 #, no-c-format msgid "" "The mix paste function doesn't decrease quality, unless the peaks become too " "high and you get clipping. In that case you will get a warning message.\n" msgstr "" " \" \" , " " , . " " .\n" #: src/help.c:175 #, no-c-format msgid "" "Sound data is normally stored as integer values. Therefore, whenever you " "normalize, adjust volume, decrease sample size or filter a sound, the result " "must be rounded. If you use 24 or 32 bit sample sizes, this is not really a " "problem, but if you use 8 or 16 bits sample size, this rounding causes a " "decrease in quality. \n" msgstr "" " . , " ", , " " , . 24- " " 32- , , " " 8- 16- , " " . \n" #: src/help.c:177 #, fuzzy, no-c-format msgid "" "The quality decrease that the rounding causes can be masked by adding a " "small amount of noise before rounding. This is called \"dithering\". " "mhWaveEdit supports basic dithering and it's enabled by default.\n" msgstr "" " , , " " . " "\"\" (\"dithering\"). mhWaveEdit " ", . \n" #: src/help.c:179 #, no-c-format msgid "" "By default, mhWaveEdit uses floating-point temporary files for storing " "processed results to avoid rounding until the file is saved.\n" msgstr "" " mhWaveEdit " " , " " .\n" #: src/help.c:184 #, fuzzy, no-c-format msgid "" "Even if mhWaveEdit was originally built for editing wav files, it's also " "possible to load and save in a few other formats. mhWaveEdit always supports " "wav and raw files, but if it's compiled with the libsndfile library, " "mhWaveEdit supports a couple of other formats as well. \n" msgstr "" " mhWaveEdit wav-" ", " " . mhWaveEdit wav- raw-, " " libsndfile, " " . \n" #: src/help.c:186 #, fuzzy, no-c-format msgid "" "To save a file with a different file format, use \"Save as...\" and choose a " "format in the file type selection box. \n" msgstr "" " , , " " (). " " , , " " .\n" #: src/help.c:188 #, fuzzy, no-c-format msgid "" "mhWaveEdit has basic support for mp3 and ogg formats. For this to work you " "need to have LAME installed for mp3 support, and OggDec/OggEnc for Ogg " "support. If you have these programs, you can open and save mp3/ogg files " "just like any other file format.\n" msgstr "" "mhWaveEdit MP3 OGG . " ", LAME, MP3, OggDec/" "OggEnc, OGG. , " " mp3- ogg- " ".\n" #: src/help.c:190 #, fuzzy, no-c-format msgid "" "If mplayer is installed, mhwaveedit can open all formats that it supports, " "for example the soundtrack of a video file. Since mplayer is only a player, " "these files can not be saved back after editing, you have to save the file " "into a supported format.\n" msgstr " \n" #: src/help.c:195 #, fuzzy, no-c-format msgid "" "mhWaveEdit creates a directory ~/.mhwaveedit where it stores configuration " "information. \n" msgstr "" "mhWaveEdit ~/.mhwaveedit, " ". \n" #: src/help.c:197 #, fuzzy, no-c-format msgid "" "The configuration file is called config. It can be hand edited, but the " "easiest way is through 'Preferences' on the Edit menu.\n" msgstr "" " config. , " " \"\", " " \"\".\n" #: src/help.c:199 #, fuzzy, no-c-format msgid "" "Each mhwaveedit process creates a session file in the .mhwaveedit directory " "called mhwaveedit-session---, where is the " "session ID number and is a character code showing the state of the " "session ('r' for running sessions). \n" msgstr "" " ~/.mhwaveedit. " " , " " \"\". , " " " ". \"mhwaveedit-temp--nnnn\". " " pid ( " ") mhWaveEdit.\n" #: src/help.c:201 #, fuzzy, no-c-format msgid "" "Temporary files are by default also stored in the ~/.mhwaveedit directory. " "Which directories to use can be set through the preferences dialog. To get " "the best performance, you should have one temporary directory for each local " "filesystem. The temporary files have names of the form \"mhwaveedit-temp-" "-nnnn-\". Do NOT open or remove temporary files with the same " "pid number as a currently running mhWaveEdit.\n" msgstr " \n" #: src/help.c:203 #, fuzzy, no-c-format msgid "" "mhWaveEdit checks on startup for leftover temporary files and lets the user " "open them. After opening a crashed session, the files can be saved or thrown " "away.\n" msgstr " \n" #: src/help.c:208 #, fuzzy, no-c-format msgid "F1 Help\n" msgstr "F12 \n" #: src/help.c:209 #, fuzzy, no-c-format msgid "F12 Record\n" msgstr "Ctrl+() \n" #: src/help.c:211 #, fuzzy, no-c-format msgid "Ctrl+(number) Set mark\n" msgstr "() \n" #: src/help.c:212 #, fuzzy, no-c-format msgid "(number) Goto mark\n" msgstr "Ctrl+P \n" #: src/help.c:214 #, fuzzy, no-c-format msgid "Ctrl+P Preferences\n" msgstr "Ctrl+E \n" #: src/help.c:215 #, fuzzy, no-c-format msgid "Ctrl+E Effects\n" msgstr "Ctrl+O \n" #: src/help.c:217 #, fuzzy, no-c-format msgid "Ctrl+O Open file\n" msgstr "Ctrl+S \n" #: src/help.c:218 #, fuzzy, no-c-format msgid "Ctrl+S Save file\n" msgstr "Ctrl+U \n" #: src/help.c:219 #, fuzzy, no-c-format msgid "Ctrl+U Save selection as\n" msgstr "Ctrl+C \n" #: src/help.c:221 #, fuzzy, no-c-format msgid "Ctrl+C Copy\n" msgstr "Ctrl+X \n" #: src/help.c:222 #, fuzzy, no-c-format msgid "Ctrl+X Cut\n" msgstr "Ctrl+D \n" #: src/help.c:223 #, fuzzy, no-c-format msgid "Ctrl+D Delete\n" msgstr "Ctrl+V \n" #: src/help.c:224 #, fuzzy, no-c-format msgid "Delete Delete\n" msgstr "Ctrl+V \n" #: src/help.c:225 #, fuzzy, no-c-format msgid "Ctrl+V Paste\n" msgstr "Ctrl+Z \n" #: src/help.c:226 #, fuzzy, no-c-format msgid "Ctrl+Z Undo\n" msgstr "Ctrl+A \n" #: src/help.c:227 #, fuzzy, no-c-format msgid "Ctrl+A Select all\n" msgstr "Ctrl+G ()\n" #: src/help.c:229 #, fuzzy, no-c-format msgid "Ctrl+G Position cursor (Go to)\n" msgstr "Ctrl+H \n" #: src/help.c:230 #, fuzzy, no-c-format msgid "Ctrl+H Position cursor at file start\n" msgstr "Ctrl+J \n" #: src/help.c:231 #, fuzzy, no-c-format msgid "Ctrl+J Position cursor at file end\n" msgstr "Ctrl+K \n" #: src/help.c:232 #, fuzzy, no-c-format msgid "Ctrl+K Position cursor at selection start\n" msgstr " \n" #: src/help.c:233 #, fuzzy, no-c-format msgid "Ctrl+L Position cursor at selection end\n" msgstr "Ctrl+L \n" #: src/help.c:234 #, fuzzy, no-c-format msgid "Y,U Move cursor to nearest all-channel zero-crossing\n" msgstr " \n" #: src/help.c:235 #, fuzzy, no-c-format msgid "I,O Move cursor to nearest any-channel zero-crossing\n" msgstr "Ctrl+Q \n" #: src/help.c:237 #, fuzzy, no-c-format msgid "Ctrl+Q Selection start at cursor\n" msgstr " \n" #: src/help.c:238 #, fuzzy, no-c-format msgid "Ctrl+W Selection end at cursor\n" msgstr "Ctrl+W \n" #: src/help.c:240 #, fuzzy, no-c-format msgid "+,= Zoom in\n" msgstr " \n" #: src/help.c:241 #, fuzzy, no-c-format msgid "- Zoom out\n" msgstr "+,= \n" #: src/help.c:242 #, fuzzy, no-c-format msgid "> Zoom to selection\n" msgstr "- \n" #: src/help.c:243 #, fuzzy, no-c-format msgid "< Zoom all\n" msgstr "> \n" #: src/help.c:244 #, fuzzy, no-c-format msgid "Arrow keys Scroll left/right\n" msgstr "< \n" #: src/help.c:246 #, fuzzy, no-c-format msgid "Home Move view to file start\n" msgstr "Ctrl+J \n" #: src/help.c:247 #, fuzzy, no-c-format msgid "End Move view to file end\n" msgstr ". \n" #: src/help.c:248 #, fuzzy, no-c-format msgid "Tab Move view to cursor\n" msgstr ". \n" #: src/help.c:249 #, fuzzy, no-c-format msgid "Ctrl+Tab Move cursor to center of view\n" msgstr "Ctrl+L \n" #: src/help.c:251 #, fuzzy, no-c-format msgid "Space Play/Stop\n" msgstr " /\n" #: src/help.c:252 #, no-c-format msgid "Shift+Space Play all\n" msgstr "" #: src/help.c:253 #, fuzzy, no-c-format msgid ", Play from cursor pos\n" msgstr "<> \n" #: src/help.c:254 #, fuzzy, no-c-format msgid ". Stop\n" msgstr " \n" #: src/help.c:255 #, fuzzy, no-c-format msgid "/ Play selection\n" msgstr ", \n" #: src/help.c:256 #, fuzzy, no-c-format msgid "H,J Move cursor (and playback) 1/8 of view\n" msgstr " \n" #: src/help.c:257 #, fuzzy, no-c-format msgid "K,L Move cursor one sample\n" msgstr ". \n" #: src/help.c:258 #, fuzzy, no-c-format msgid "Ctrl+arrow Move cursor (and playback) half second\n" msgstr "/ \n" #: src/help.c:259 #, fuzzy, no-c-format msgid "( Play first 3 seconds of selection\n" msgstr "" "Ctrl+ \n" " /\n" "( 3 \n" " \n" ") 3 \n" " \n" #: src/help.c:260 #, fuzzy, no-c-format msgid ") Play last 3 seconds of selection\n" msgstr " \n" #: src/help.c:265 #, no-c-format msgid "" "If you find a bug or flaw in the program that's not mentioned in the BUGS " "file, report the bug in the bug tracker (see contact info) or mail a bug " "report describing the bug to: magnus.hjorth@home.se\n" msgstr "" #: src/help.c:267 #, no-c-format msgid "" "In case of a crash, please do not send me any core dumps. They are huge and " "completely useless to me. Instead, create a backtrace. Backtraces tell you " "exactly where the program crashed.\n" msgstr "" #: src/help.c:269 #, no-c-format msgid "How to create a backtrace:\n" msgstr "" #: src/help.c:270 #, no-c-format msgid "1. Enable core dumps: ulimit -c unlimited\n" msgstr "" #: src/help.c:271 #, no-c-format msgid "2. Run the program: mhwaveedit\n" msgstr "" #: src/help.c:272 #, no-c-format msgid "" "3. Make the program crash. You should now get a file named core or core.1234 " "in the directory you're in.\n" msgstr "" #: src/help.c:273 #, no-c-format msgid "4. Run gdb with the program and core file: \n" msgstr "" #: src/help.c:274 #, no-c-format msgid " gdb /usr/local/bin/mhwaveedit core | tee backtrace.txt\n" msgstr "" #: src/help.c:275 #, no-c-format msgid "5. After gdb has loaded, use the command: bt\n" msgstr "" #: src/help.c:276 #, no-c-format msgid "6. Quit gdb with the command: quit\n" msgstr "" #: src/help.c:277 #, no-c-format msgid "7. Now you should have a back trace in the file backtrace.txt\n" msgstr "" #: src/help.c:282 #, no-c-format msgid "" "There are plenty of things you can do if you want to help the development of " "mhWaveEdit. \n" msgstr "" #: src/help.c:284 #, no-c-format msgid "" "First of all, look for bugs and report all bugs you find into the bug " "tracker or through e-mail. Sometimes a bug can get overlooked for a long " "time because nobody reports it, so don't be afraid to report bugs that have " "been there for a few releases. You don't have to provide fixes or very " "detailed information, although it helps of course.\n" msgstr "" #: src/help.c:286 #, no-c-format msgid "" "Feature requests are also welcome, report them to the mailing list or to the " "bug tracker.\n" msgstr "" #: src/help.c:288 #, no-c-format msgid "" "If you speak a language other than English and mhWaveEdit isn't translated " "to your language, you can contribute a translation. To do that, copy the " "template mhwaveedit.pot in the po directory into a new file ll.po, where ll " "is your language code (see http://www.gnu.org/software/gettext/manual/" "html_node/gettext_221.html for a list of language codes). \n" msgstr "" #: src/help.c:290 #, no-c-format msgid "" "It's possible to edit po-files by hand, but I recommend a program such as " "poEdit (http://www.poedit.org) for editing translations. \n" msgstr "" #: src/help.c:292 #, no-c-format msgid "" "Note that for those translatable strings that look like \"RecordStatus|Paused" "\", you should ignore what's to the left and only translate the string to " "the right (\"Paused\" in this example). This convention is there to make it " "possible to translate the same string to different things depending on " "context. \n" msgstr "" #: src/help.c:294 #, no-c-format msgid "" "After you've filled in all the translations you want (you don't have to " "translate all the strings), mail in the po file to me (see contact info) and " "I'll add it to the next release. \n" msgstr "" #: src/help.c:296 #, no-c-format msgid "" "If a translation is incomplete, you're very welcome to translate the " "remaining untranslated messages and mail them in. Corrections to " "translations are also appreciated, but they may need to be checked with the " "previous translator before including them. \n" msgstr "" #: src/help.c:302 #, no-c-format msgid "For bug reports, translation updates, patches and PayPal donations:\n" msgstr "" #: src/help.c:303 #, no-c-format msgid "magnus.hjorth@home.se\n" msgstr "" #: src/help.c:305 #, no-c-format msgid "Project page with bug tracker, mailing list membership:\n" msgstr "" #: src/help.c:306 #, fuzzy, no-c-format msgid "http://gna.org/projects/mhwaveedit\n" msgstr "http://gna.org/projects/mhwaveedit/\n" #: src/help.c:308 #, no-c-format msgid "Mailing list (you must be a subscriber before you can post messages):\n" msgstr "" #: src/help.c:309 #, no-c-format msgid "mhwaveedit-discuss@gna.org\n" msgstr "" #: src/inifile.c:84 src/inifile.c:91 #, c-format msgid "%s: Expected '=': %s\n" msgstr "%s: '=': %s\n" #: src/inifile.c:97 #, c-format msgid "%s: Expected value: %s\n" msgstr "%s: : %s\n" #: src/int_box.c:202 #, c-format msgid "Value for %s must be a number between %ld and %ld" msgstr " %s %ld %ld" #: src/ladspacore.c:94 #, c-format msgid "Effect %s contains invalid port %s" msgstr " %s %s" #: src/ladspacore.c:140 #, c-format msgid "Ladspa: Error scanning %s" msgstr "Ladspa: %s" #: src/ladspacore.c:409 #, c-format msgid "Applying effect '%s'" msgstr " '%s'" #: src/ladspadialog.c:87 #, c-format msgid "Value for '%s' must not be below %f" msgstr " '%s' %f" #: src/ladspadialog.c:94 #, c-format msgid "Value for '%s' must not be above %f" msgstr " '%s' %f" #: src/ladspadialog.c:127 #, c-format msgid "" "You have mapped more than one output port to channel '%s'. You can only map " "one output port to each channel." msgstr "" " '%s'. " " ." #: src/ladspadialog.c:191 #, c-format msgid "Author: %s" msgstr ": %s" #: src/ladspadialog.c:196 #, c-format msgid "Copyright: %s" msgstr "Copyright: %s" #: src/ladspadialog.c:203 msgid " Input controls " msgstr " " #: src/ladspadialog.c:292 msgid " Output controls " msgstr " " #: src/ladspadialog.c:311 src/recorddialog.c:311 src/recorddialog.c:739 msgid "None" msgstr "" #: src/ladspadialog.c:319 msgid " Input audio " msgstr " " #: src/ladspadialog.c:319 msgid " Output audio " msgstr " " #: src/ladspadialog.c:350 msgid "Keep data in unmapped output channels" msgstr "" #: src/main.c:166 #, c-format msgid "Syntax: %s [files]\n" msgstr ": %s []\n" #: src/main.c:169 msgid "Testing conversion functions:" msgstr " :" #: src/main.c:171 msgid "Testing conversion functions finished." msgstr " ." #: src/main.c:190 msgid "Expected driver name after --driver option" msgstr " --driver " #: src/main.c:196 #, c-format msgid "Unknown option '%s'" msgstr " '%s'" #: src/main.c:340 msgid "" "Could not find home directory. Using current directory as home directory." msgstr "" " . ." #: src/main.c:368 msgid "Black" msgstr "" #: src/main.c:369 msgid "White" msgstr "" #: src/main.c:370 msgid "Background" msgstr "" #: src/main.c:371 msgid "L Waveform" msgstr " " #: src/main.c:372 msgid "R Waveform" msgstr " " #: src/main.c:373 msgid "Cursor" msgstr "" #: src/main.c:374 msgid "Marks" msgstr "" #: src/main.c:375 msgid "Selection" msgstr "" #: src/main.c:376 msgid "Progress bar" msgstr " " #: src/main.c:377 msgid "Zero-level" msgstr " " #: src/main.c:378 msgid "Buffer position" msgstr "" #: src/main.c:501 #, c-format msgid "Error launching mixer: fork: %s" msgstr " : fork: %s" #: src/main.c:552 src/main.c:571 msgid "Mono" msgstr "" #: src/main.c:553 msgid "Left" msgstr "" #: src/main.c:554 msgid "Right" msgstr "" #: src/main.c:556 #, c-format msgid "Ch%d" msgstr "" #: src/main.c:572 msgid "Stereo" msgstr "" #: src/main.c:574 #, c-format msgid "%d channels" msgstr "%d " #: src/main.c:1149 msgid "Ignoring extreme old window size/position values\n" msgstr " / \n" #: src/mainwindow.c:217 #, c-format msgid "mhWaveEdit: %s (%s): %d Hz, %s" msgstr "mhWaveEdit: %s (%s): %d , %s" #: src/mainwindow.c:300 #, fuzzy msgid "Use default settings" msgstr " " #: src/mainwindow.c:304 msgid "Auto-detect from extension" msgstr "" #: src/mainwindow.c:319 #, fuzzy msgid "File type: " msgstr " : " #: src/mainwindow.c:365 msgid "" "The file has not changed since last save. Press OK if you want to save it " "anyway?" msgstr "" " . " " , ." #: src/mainwindow.c:374 msgid "Save File" msgstr " " #: src/mainwindow.c:399 #, c-format msgid "Save changes to %s?" msgstr " %s?" #: src/mainwindow.c:792 src/mainwindow.c:796 msgid "Load File" msgstr " " #: src/mainwindow.c:821 msgid "Save selection as ..." msgstr " ..." #: src/mainwindow.c:1116 #, c-format msgid "Chunk %p has opencount=%d\n" msgstr "" #: src/mainwindow.c:1199 #, c-format msgid "" "\n" "Window '%s'\n" msgstr "" "\n" " '%s'\n" #: src/mainwindow.c:1200 msgid " Current chunk:" msgstr " :" #: src/mainwindow.c:1202 msgid " History:" msgstr " :" #: src/mainwindow.c:1257 msgid "There already is only one channel!" msgstr " !" #: src/mainwindow.c:1366 msgid "mhWaveEdit Help" msgstr " mhWaveEdit" #: src/mainwindow.c:1465 msgid "About mhWaveEdit" msgstr " mhWaveEdit" #: src/mainwindow.c:1477 #, fuzzy msgid "" "Created by Magnus Hjorth (magnus.hjorth@home.se)\n" "Copyright 2002-2018, Magnus Hjorth" msgstr "" " Magnus Hjorth (magnus.hjorth@home.se)\n" "Copyright 2002-2005, Magnus Hjorth" #: src/mainwindow.c:1484 #, c-format msgid "Current sound driver: %s" msgstr " : %s" #: src/mainwindow.c:1492 #, c-format msgid "Compiled %s %s" msgstr " %s %s" #: src/mainwindow.c:1498 msgid "Uses double-precision math" msgstr " " #: src/mainwindow.c:1505 msgid "" "Distributed under GNU General Public License.\n" "For information, see the file COPYING" msgstr "" " GNU.\n" " COPYING" #: src/mainwindow.c:1669 msgid "Seconds of silence: " msgstr " : " #: src/mainwindow.c:1669 msgid "Insert Silence" msgstr " " #: src/mainwindow.c:1718 msgid "Level: " msgstr "" #: src/mainwindow.c:1718 msgid "Normalize to..." msgstr "" #: src/mainwindow.c:1928 msgid "/_File" msgstr "/_" #: src/mainwindow.c:1929 msgid "/File/_Open..." msgstr "//_..." #: src/mainwindow.c:1930 msgid "/File/_Save" msgstr "//_" #: src/mainwindow.c:1931 msgid "/File/Save _as..." msgstr "// _..." #: src/mainwindow.c:1932 msgid "/File/Save selection as..." msgstr "// ..." #: src/mainwindow.c:1933 msgid "/_Edit" msgstr "/_" #: src/mainwindow.c:1934 msgid "/Edit/_Undo" msgstr "//_" #: src/mainwindow.c:1935 #, fuzzy msgid "/Edit/_Redo" msgstr "//_" #: src/mainwindow.c:1936 msgid "/Edit/sep1" msgstr "//sep1" #: src/mainwindow.c:1937 msgid "/Edit/Cu_t" msgstr "//_" #: src/mainwindow.c:1938 msgid "/Edit/_Copy" msgstr "//_" #: src/mainwindow.c:1939 msgid "/Edit/_Paste" msgstr "//_" #: src/mainwindow.c:1940 msgid "/Edit/Paste _over" msgstr "// _" #: src/mainwindow.c:1941 msgid "/Edit/_Mix paste" msgstr "// _" #: src/mainwindow.c:1942 msgid "/Edit/Insert _silence" msgstr "// _" #: src/mainwindow.c:1943 msgid "/Edit/Paste to _new" msgstr "// _" #: src/mainwindow.c:1944 msgid "/Edit/Cr_op" msgstr "//_" #: src/mainwindow.c:1945 msgid "/Edit/_Delete" msgstr "//_" #: src/mainwindow.c:1946 msgid "/Edit/Silence selection" msgstr "// " #: src/mainwindow.c:1947 msgid "/Edit/sep2" msgstr "//sep2" #: src/mainwindow.c:1948 msgid "/Edit/Select _all" msgstr "// _" #: src/mainwindow.c:1949 #, fuzzy msgid "/Edit/Select none" msgstr "// _" #: src/mainwindow.c:1950 msgid "/Edit/sep3" msgstr "//sep3" #: src/mainwindow.c:1951 msgid "/Edit/Clear clipboard" msgstr "// " #: src/mainwindow.c:1952 msgid "/Edit/sep4" msgstr "//sep4" #: src/mainwindow.c:1953 #, fuzzy msgid "/Edit/Preferences" msgstr "//_" #: src/mainwindow.c:1954 msgid "/_View" msgstr "/_" #: src/mainwindow.c:1955 msgid "/View/Zoom _in" msgstr "//_ " #: src/mainwindow.c:1956 msgid "/View/Zoom _out" msgstr "//_ " #: src/mainwindow.c:1957 msgid "/View/Zoom to _selection" msgstr "// _" #: src/mainwindow.c:1958 msgid "/View/sep1" msgstr "//sep1" #: src/mainwindow.c:1959 msgid "/View/Zoom _all" msgstr "// _" #: src/mainwindow.c:1960 msgid "/View/sep2" msgstr "//sep2" #: src/mainwindow.c:1961 msgid "/View/_Time scale" msgstr "//_ " #: src/mainwindow.c:1962 msgid "/View/_Horizontal zoom" msgstr "// _ " #: src/mainwindow.c:1963 msgid "/View/_Vertical zoom" msgstr "// _ " #: src/mainwindow.c:1964 msgid "/View/Sp_eed slider" msgstr "// _" #: src/mainwindow.c:1965 #, fuzzy msgid "/View/Slider labels" msgstr "// _" #: src/mainwindow.c:1966 msgid "/View/Buffer position" msgstr "" #: src/mainwindow.c:1967 msgid "/_Cursor" msgstr "/_" #: src/mainwindow.c:1968 msgid "/Cursor/Set selection start" msgstr "// " #: src/mainwindow.c:1970 msgid "/Cursor/Set selection end" msgstr "// " #: src/mainwindow.c:1971 msgid "/Cursor/sep1" msgstr "//sep1" #: src/mainwindow.c:1972 #, fuzzy msgid "/Cursor/Move to" msgstr "// " #: src/mainwindow.c:1973 #, fuzzy msgid "/Cursor/Move to/Beginning" msgstr "// " #: src/mainwindow.c:1975 #, fuzzy msgid "/Cursor/Move to/End" msgstr "// " #: src/mainwindow.c:1976 #, fuzzy msgid "/Cursor/Move to/Selection start" msgstr "// " #: src/mainwindow.c:1978 #, fuzzy msgid "/Cursor/Move to/Selection end" msgstr "// " #: src/mainwindow.c:1980 #, fuzzy msgid "/Cursor/Move" msgstr "// " #: src/mainwindow.c:1981 #, fuzzy msgid "/Cursor/Move/Left" msgstr "// " #: src/mainwindow.c:1982 #, fuzzy msgid "/Cursor/Move/Right" msgstr "// " #: src/mainwindow.c:1983 #, fuzzy msgid "/Cursor/Move/Left sample" msgstr "// " #: src/mainwindow.c:1984 #, fuzzy msgid "/Cursor/Move/Right sample" msgstr "// " #: src/mainwindow.c:1985 msgid "/Cursor/Find zero-crossing" msgstr "" #: src/mainwindow.c:1986 msgid "/Cursor/Find zero-crossing/Left (all channels)" msgstr "" #: src/mainwindow.c:1988 msgid "/Cursor/Find zero-crossing/Right (all channels)" msgstr "" #: src/mainwindow.c:1990 msgid "/Cursor/Find zero-crossing/Left (any channel)" msgstr "" #: src/mainwindow.c:1992 msgid "/Cursor/Find zero-crossing/Right (any channel)" msgstr "" #: src/mainwindow.c:1994 msgid "/Cursor/sep2" msgstr "/sep2" #: src/mainwindow.c:1995 msgid "/Cursor/Position cursor..." msgstr "// ..." #: src/mainwindow.c:1997 msgid "/_Play" msgstr "/_" #: src/mainwindow.c:1998 msgid "/Play/_Play from cursor" msgstr "//_ " #: src/mainwindow.c:1999 msgid "/Play/Play _all" msgstr "// _" #: src/mainwindow.c:2000 msgid "/Play/Play se_lection" msgstr "// _" #: src/mainwindow.c:2001 msgid "/Play/_Stop" msgstr "//_" #: src/mainwindow.c:2002 msgid "/Play/sep1" msgstr "//sep1" #: src/mainwindow.c:2003 msgid "/Play/_Record..." msgstr "//_..." #: src/mainwindow.c:2004 msgid "/Effec_ts" msgstr "/_" #: src/mainwindow.c:2005 msgid "/Effects/Fade _in" msgstr "// _" #: src/mainwindow.c:2006 msgid "/Effects/Fade o_ut" msgstr "// _" #: src/mainwindow.c:2007 msgid "/Effects/_Normalize" msgstr "//_" #: src/mainwindow.c:2008 #, fuzzy msgid "/Effects/Normali_ze to..." msgstr "//_" #: src/mainwindow.c:2009 msgid "/Effects/_Volume adjust (fade)..." msgstr "// _ (fade)..." #: src/mainwindow.c:2010 msgid "/Effects/sep1" msgstr "//sep1" #: src/mainwindow.c:2011 msgid "/Effects/Convert sample_rate..." msgstr "// _ ..." #: src/mainwindow.c:2012 msgid "/Effects/Convert sample _format..." msgstr "// _ ..." #: src/mainwindow.c:2014 msgid "/Effects/B_yte swap" msgstr "// _" #: src/mainwindow.c:2015 msgid "/Effects/sep2" msgstr "//sep2" #: src/mainwindow.c:2016 #, fuzzy msgid "/Effects/_Mix to mono" msgstr "//_ ..." #: src/mainwindow.c:2017 #, fuzzy msgid "/Effects/Add channe_l" msgstr "//_ ..." #: src/mainwindow.c:2018 #, fuzzy msgid "/Effects/Ma_p channels..." msgstr "//_ ..." #: src/mainwindow.c:2019 msgid "/Effects/_Combine channels..." msgstr "//_ ..." #: src/mainwindow.c:2020 #, fuzzy msgid "/Effects/Add channels from other file..." msgstr "//_ ..." #: src/mainwindow.c:2021 msgid "/Effects/sep3" msgstr "//sep3" #: src/mainwindow.c:2022 msgid "/Effects/_Speed adjustment..." msgstr "// _..." #: src/mainwindow.c:2023 msgid "/Effects/Pipe through program..." msgstr "// (pipe)..." #: src/mainwindow.c:2024 msgid "/Effects/sep4" msgstr "//sep4" #: src/mainwindow.c:2025 msgid "/Effects/Effects dialog..." msgstr "// ..." #: src/mainwindow.c:2027 msgid "/Debug" msgstr "" #: src/mainwindow.c:2029 msgid "/Debug/Dummy effect" msgstr "" #: src/mainwindow.c:2030 msgid "/Debug/Dummy effect FP" msgstr "" #: src/mainwindow.c:2031 msgid "/Debug/Check opencount" msgstr "" #: src/mainwindow.c:2032 msgid "/Debug/Dump chunk info" msgstr "" #: src/mainwindow.c:2034 msgid "/_Help" msgstr "/_" #: src/mainwindow.c:2035 msgid "/Help/_Documentation" msgstr "//_" #: src/mainwindow.c:2036 msgid "/Help/_About" msgstr "//_ " #: src/mainwindow.c:2040 msgid "/File/sep1" msgstr "//sep1" #: src/mainwindow.c:2041 msgid "/File/_Close" msgstr "//_" #: src/mainwindow.c:2042 msgid "/File/sep2" msgstr "//sep2" #: src/mainwindow.c:2043 msgid "/File/_Exit" msgstr "//_" #: src/mainwindow.c:2215 msgid "Load a file from disk" msgstr " " #: src/mainwindow.c:2222 msgid "Save the current file to disk" msgstr " " #: src/mainwindow.c:2231 msgid "Undo the last change" msgstr " " #: src/mainwindow.c:2239 msgid "Redo the last undo operation" msgstr "" #: src/mainwindow.c:2249 msgid "Cut out the current selection" msgstr " " #: src/mainwindow.c:2257 msgid "Copy the current selection" msgstr " " #: src/mainwindow.c:2265 msgid "Paste at cursor position" msgstr " " #: src/mainwindow.c:2273 msgid "Paste, overwriting the data after the cursor position" msgstr ", " #: src/mainwindow.c:2283 msgid "Delete the selection" msgstr " " #: src/mainwindow.c:2292 msgid "Set selection start to cursor position" msgstr " " #: src/mainwindow.c:2301 msgid "Set selection end to cursor position" msgstr " " #: src/mainwindow.c:2311 msgid "Play from cursor position" msgstr " " #: src/mainwindow.c:2320 msgid "Play selected area" msgstr " " #: src/mainwindow.c:2329 msgid "Stop playing" msgstr " " #: src/mainwindow.c:2339 msgid "Loop mode (play over and over)" msgstr " ( )" #: src/mainwindow.c:2349 msgid "Keep view and playback together" msgstr "" #: src/mainwindow.c:2362 msgid "Auto return to playback start" msgstr "" #: src/mainwindow.c:2376 src/recorddialog.c:874 msgid "Record" msgstr "" #: src/mainwindow.c:2385 src/recorddialog.c:983 msgid "Launch mixer" msgstr " " #: src/pipedialog.c:92 msgid "Command line: " msgstr " : " #: src/pipedialog.c:99 msgid "Send wav header" msgstr " wav-" #: src/pipedialog.c:153 msgid "Process output" msgstr " " #: src/pipedialog.c:178 #, c-format msgid "" "Output from command '%s':\n" "\n" msgstr "" " '%s':\n" "\n" #: src/pipedialog.c:201 #, c-format msgid "Could not create pipe: %s" msgstr " (pipe): %s" #: src/pipedialog.c:216 #, c-format msgid "Error: fork: %s" msgstr ": fork: %s" #: src/pipedialog.c:268 msgid "Should not reach this point!" msgstr " !" #: src/pipedialog.c:482 msgid "Command failed without returning any data" msgstr " , " #: src/pipedialog.c:492 #, c-format msgid "Error: %s" msgstr ": %s" #: src/player.c:294 msgid "The sound format of this file is not supported for playing." msgstr " ." #: src/rateconv.c:97 #, c-format msgid "Error initialising sample rate conversion: %s" msgstr " : %s" #: src/rateconv.c:162 #, c-format msgid "Error converting samplerate: %s\n" msgstr " : %s\n" #: src/rateconv.c:201 #, c-format msgid "Error changing samplerate conversion ratio: %s\n" msgstr " : %s\n" #: src/rateconv.c:323 msgid "Unexpected EOF in connection to subprocess" msgstr " " #: src/rateconv.c:327 #, c-format msgid "Error writing to subprocess: %s" msgstr " : %s" #: src/rateconv.c:383 src/rateconv.c:405 #, c-format msgid "Error reading from sub process: %s" msgstr " : %s" #: src/rateconv.c:413 msgid "SoX closed connection too early!" msgstr "SoX !" #: src/rateconv.c:599 msgid "(SoX) Simulated analog filtration" msgstr "(SoX) " #: src/rateconv.c:605 msgid "(SoX) Polyphase interpolation" msgstr "(SoX) " #: src/rateconv.c:612 msgid "Sample repeat/skip (low quality)" msgstr "/ ( )" #: src/rawdialog.c:42 msgid "header size" msgstr "" #: src/rawdialog.c:73 msgid "Unknown file format" msgstr " " #: src/rawdialog.c:80 #, c-format msgid "" "The format of file '%s' could not be recognized.\n" "\n" "Please specify the sample format below." msgstr "" " '%s' .\n" "\n" " ." #: src/rawdialog.c:92 msgid "Header bytes: " msgstr "" #: src/recorddialog.c:207 src/recorddialog.c:671 src/recorddialog.c:918 msgid "(no limit)" msgstr "( )" #: src/recorddialog.c:314 msgid "Mild" msgstr "" #: src/recorddialog.c:316 msgid "Heavy" msgstr "" #: src/recorddialog.c:430 msgid "Update preset" msgstr "" #: src/recorddialog.c:435 msgid "Add preset" msgstr "" #: src/recorddialog.c:514 msgid "Custom format" msgstr " " #: src/recorddialog.c:552 msgid "" "The sign and endian-ness can usually be left at their defaults, but should " "be changed if you're unable to record or get bad sound." msgstr "" " , " " , ." #: src/recorddialog.c:566 msgid "Name :" msgstr " :" #: src/recorddialog.c:578 msgid "Presets:" msgstr "" #: src/recorddialog.c:593 #, fuzzy msgid "Set format" msgstr " " #: src/recorddialog.c:601 msgid "Add/Update preset" msgstr "" #: src/recorddialog.c:654 msgid "" "Invalid time value. Time must be specified in the form (HH')MM:SS(.mmmm)" msgstr "" " . ('):(." ")" #: src/recorddialog.c:698 src/recorddialog.c:948 msgid "Format not selected" msgstr " " #: src/recorddialog.c:705 msgid "This format is not supported by the input driver!" msgstr " !" #: src/recorddialog.c:710 msgid "Ready for recording" msgstr " " #: src/recorddialog.c:723 msgid "Peak: " msgstr ": " #: src/recorddialog.c:724 msgid "Peak max: " msgstr " " #: src/recorddialog.c:725 msgid "RMS: " msgstr "" #: src/recorddialog.c:726 msgid "Clipping: " msgstr ": " #: src/recorddialog.c:795 msgid "Resume recording" msgstr " " #: src/recorddialog.c:795 src/recorddialog.c:815 msgid "Pause recording" msgstr " " #: src/recorddialog.c:797 msgid "RecordStatus|Paused" msgstr "" #: src/recorddialog.c:798 src/recorddialog.c:823 msgid "RecordStatus|Recording" msgstr "" #: src/recorddialog.c:818 msgid "Finish" msgstr "" #: src/recorddialog.c:826 msgid "Overruns: " msgstr "" #: src/recorddialog.c:829 msgid "Bytes written: " msgstr " : " #: src/recorddialog.c:830 msgid "Auto stop in: " msgstr " : " #: src/recorddialog.c:894 msgid "Recording settings" msgstr " " #: src/recorddialog.c:901 msgid "Sample format: " msgstr " : " #: src/recorddialog.c:916 msgid "Time limit: " msgstr " : " #: src/recorddialog.c:924 msgid "Disable" msgstr "" #: src/recorddialog.c:930 msgid "Set" msgstr "" #: src/recorddialog.c:942 msgid "Input levels" msgstr " " #: src/recorddialog.c:947 msgid "Recording status: " msgstr " : " #: src/recorddialog.c:952 msgid "Time recorded: " msgstr " : " #: src/recorddialog.c:953 msgid "N/A" msgstr " " #: src/recorddialog.c:966 msgid "Start recording" msgstr " " #: src/recorddialog.c:977 msgid "Reset max peaks" msgstr " " #: src/sampleratedialog.c:87 msgid "" "(This changes the sample rate of \n" "the entire file, not just the selection)" msgstr "" "( , \n" " )" #: src/sampleratedialog.c:92 msgid "New samplerate: " msgstr " : " #: src/sampleratedialog.c:99 msgid "Method: " msgstr ": " #: src/samplesizedialog.c:38 msgid "File already has the selected sample format" msgstr "" #: src/samplesizedialog.c:87 msgid "" "(This changes the sample type of the entire file, not just the selection)" msgstr "( , )" #: src/samplesizedialog.c:99 msgid "Don't actually change the data (for repairing bad files etc)" msgstr "" " ( , ..)" #: src/sound-alsalib.c:73 msgid "ALSA Preferences" msgstr " ALSA" #: src/sound-alsalib.c:81 msgid "Playback device: " msgstr " : " #: src/sound-alsalib.c:85 msgid "Recording device: " msgstr " : " #: src/sound-alsalib.c:91 msgid "Event driven I/O" msgstr "" #: src/sound-alsalib.c:123 #, c-format msgid "Error opening ALSA device '%s' for recording: %s" msgstr " ALSA '%s' : %s" #: src/sound-alsalib.c:125 #, c-format msgid "Error opening ALSA device '%s' for playback: %s" msgstr " ALSA '%s' : %s" #: src/sound-alsalib.c:273 msgid "snd_pcm_hw_params_set_access failed" msgstr "" #: src/sound-alsalib.c:278 msgid "snd_pcm_hw_params_set_format failed" msgstr "" #: src/sound-alsalib.c:283 msgid "snd_pcm_hw_params_set_channels failed" msgstr "" #: src/sound-alsalib.c:288 msgid "snd_pcm_hw_params_set_rate failed" msgstr "" #: src/sound-alsalib.c:293 msgid "snd_pcm_hw_params_set_buffer_size_last failed" msgstr "" #: src/sound-alsalib.c:436 src/sound-alsalib.c:492 msgid "" msgstr "" #: src/sound-alsalib.c:536 msgid "" msgstr "" #: src/sound.c:167 msgid "SDL (output only)" msgstr "SDL ( )" #: src/sound.c:209 msgid "Dummy (no sound)" msgstr " ( )" #: src/sound.c:334 #, c-format msgid "" "Invalid driver name: %s\n" "Using '%s' driver instead" msgstr "" " : %s\n" " '%s'" #: src/sound-esound.c:59 #, c-format msgid "Couldn't connect to ESD daemon: %s" msgstr " ESD: %s" #: src/sound-esound.c:114 msgid "EsounD: Unable to open playback stream" msgstr "EsounD: " #: src/sound-esound.c:130 msgid "EsounD: Unable to open recording stream" msgstr "EsounD: " #: src/sound-esound.c:145 src/sound-esound.c:217 msgid "EsounD driver: select" msgstr "" #: src/sound-esound.c:157 msgid "EsounD driver: write" msgstr "" #: src/sound-esound.c:221 msgid "Esound connection closed by server" msgstr " Esound " #: src/sound-esound.c:227 msgid "EsounD driver: read" msgstr "" #: src/sound-esound.c:241 msgid "jump delay" msgstr " " #: src/sound-esound.c:255 msgid "ESD preferences" msgstr " ESD" #: src/sound-esound.c:263 msgid "" "If the cursor starts running too early when jumping, this delay should be " "increased." msgstr "" " , " " ." #: src/sound-esound.c:269 msgid "Jump delay:" msgstr " :" #: src/sound-esound.c:278 msgid "" "Selecting the ESD host to connect to is done through the ESPEAKER " "environment variable." msgstr "" " ESD- ESPEAKER." #: src/sound-jack.c:117 msgid "Invalid number of input ports." msgstr " ." #: src/sound-jack.c:121 msgid "Invalid number of output ports." msgstr " ." #: src/sound-jack.c:130 msgid "The client name change won't take effect until you restart the program." msgstr " ." #: src/sound-jack.c:187 msgid " Input ports " msgstr " " #: src/sound-jack.c:188 msgid " Output ports " msgstr " " #: src/sound-jack.c:197 msgid "Jack Preferences" msgstr " Jack" #: src/sound-jack.c:206 msgid "Client name: " msgstr " : " #: src/sound-jack.c:223 msgid "Number of ports (0-8): " msgstr " (0-8): " #: src/sound-jack.c:231 #, c-format msgid "Port #%d" msgstr " #%d" #: src/sound-jack.c:244 msgid "Automatically connect input ports on startup" msgstr " " #: src/sound-jack.c:250 msgid "Automatically connect output ports on startup" msgstr " " #: src/sound-jack.c:402 msgid "Over/underrun in JACK driver" msgstr "" #: src/sound-jack.c:417 msgid "jack_get_ports returned NULL" msgstr "" #: src/sound-jack.c:433 #, c-format msgid "Connection from %s to %s failed: %s" msgstr " %s %s: %s" #: src/sound-jack.c:480 msgid "Could not connect to the JACK server." msgstr " JACK-." #: src/sound-jack.c:494 msgid "Activation failed!" msgstr " !" #: src/sound-jack.c:825 #, c-format msgid "" "With JACK, the only supported recording format is Floating-point, single " "precision, %d Hz" msgstr "" " JACK - " ", , %d " #: src/sound-oss.c:96 #, c-format msgid "Could not open '%s': %s" msgstr " '%s': %s" #: src/sound-oss.c:109 #, c-format msgid "Error in sound driver: ioctl failed: %s" msgstr " : ioctl : %s" #: src/sound-oss.c:216 #, c-format msgid "Error in sound driver: write failed: %s" msgstr " : write : %s" #: src/sound-oss.c:229 #, c-format msgid "Error in sound driver: read failed: %s" msgstr " : read : %s" #: src/sound-oss.c:253 src/sound-oss.c:385 #, c-format msgid "Error in sound driver: select failed: %s" msgstr " : select : %s" #: src/sound-oss.c:440 msgid "OSS preferences" msgstr " OSS" #: src/sound-oss.c:450 #, fuzzy msgid "Playback device file:" msgstr " : " #: src/sound-oss.c:459 #, fuzzy msgid "Recording device file:" msgstr " : " #: src/sound-oss.c:465 msgid "Avoid select calls (try this if recording locks up)" msgstr " select ( )" #: src/sound-portaudio.c:61 msgid "sound-portaudio: No output devices available!" msgstr "sound-portaudio: !" #: src/sound-portaudio.c:63 msgid "sound-portaudio: No input devices available!" msgstr "sound-portaudio: !" #: src/sound-portaudio.c:191 src/sound-portaudio.c:278 #, c-format msgid "Pa_OpenStream failed: %s\n" msgstr "" #: src/sound-portaudio.c:252 msgid "Buffer overrun!" msgstr "" #: src/sound-sdl.c:38 #, c-format msgid "Could not initialize SDL: %s" msgstr " SDL: %s" #: src/sound-sdl.c:89 #, c-format msgid "SDL: Couldn't open audio: %s" msgstr "SDL: : %s" #: src/sound-sun.c:72 #, c-format msgid "SunAudio: Couldn't open %s" msgstr "SunAudio: %s" #: src/sound-sun.c:159 msgid "SunAudio: Error writing to sound device" msgstr "SunAudio: " #: src/sound-sun.c:241 msgid "SunAudio: Error reading from sound device" msgstr "SunAudio: " #: src/soxdialog.c:54 #, fuzzy msgid "Echo" msgstr "[S] " #: src/soxdialog.c:55 #, fuzzy msgid "Echo sequence" msgstr "[S] " #: src/soxdialog.c:56 #, fuzzy msgid "Reverb" msgstr "[S] " #: src/soxdialog.c:57 #, fuzzy msgid "Chorus" msgstr "" #: src/soxdialog.c:58 msgid "Flanger" msgstr "" #: src/soxdialog.c:59 msgid "Phaser" msgstr "" #: src/soxdialog.c:60 msgid "Compress/Expand" msgstr "" #: src/soxdialog.c:61 #, fuzzy msgid "Pitch adjust" msgstr "[S] " #: src/soxdialog.c:62 #, fuzzy msgid "Time stretch" msgstr "[S] " #: src/soxdialog.c:63 msgid "DC Shift" msgstr "" #: src/soxdialog.c:64 #, fuzzy msgid "Masking noise" msgstr "[S] " #: src/soxdialog.c:65 #, fuzzy msgid "Reverse" msgstr "[S] " #: src/soxdialog.c:66 msgid "Earwax" msgstr "" #: src/soxdialog.c:67 #, fuzzy msgid "Vibro" msgstr "[S] " #: src/soxdialog.c:68 msgid "Lowpass filter (single-pole)" msgstr "" #: src/soxdialog.c:69 msgid "Highpass filter (single-pole)" msgstr "" #: src/soxdialog.c:70 msgid "Bandpass filter" msgstr "" #: src/soxdialog.c:71 msgid "Butterworth lowpass filter" msgstr "" #: src/soxdialog.c:72 msgid "Butterworth highpass filter" msgstr "" #: src/soxdialog.c:73 msgid "Butterworth bandpass filter" msgstr "" #: src/soxdialog.c:74 msgid "Butterworth bandreject filter" msgstr "" #: src/soxdialog.c:75 msgid "Sinc-windowed filter" msgstr "" #: src/soxdialog.c:312 msgid "Frequency: " msgstr ": " #: src/soxdialog.c:317 src/soxdialog.c:324 src/soxdialog.c:483 #: src/soxdialog.c:485 msgid "Hz" msgstr "" #: src/soxdialog.c:327 msgid "Noise mode" msgstr " " #: src/soxdialog.c:387 msgid "Reverb time: " msgstr " : " #: src/soxdialog.c:392 msgid "ms" msgstr "" #: src/soxdialog.c:397 msgid "Delay (ms) " msgstr " () " #: src/soxdialog.c:400 msgid "Decay " msgstr " " #: src/soxdialog.c:404 msgid "Speed (Hz) " msgstr " () " #: src/soxdialog.c:408 msgid "Depth (ms) " msgstr " () " #: src/soxdialog.c:412 msgid "Modulation " msgstr " " #: src/soxdialog.c:415 msgid "Modulation|Sinusoidal" msgstr "" #: src/soxdialog.c:416 msgid "Modulation|Triangular" msgstr "" #: src/soxdialog.c:429 msgid "(Lines with delay=0 will be ignored.)" msgstr "( .)" #: src/soxdialog.c:448 src/soxdialog.c:450 src/soxdialog.c:454 #: src/soxdialog.c:456 src/soxdialog.c:458 msgid "Input gain: " msgstr " : " #: src/soxdialog.c:452 msgid "Output gain: " msgstr " : " #: src/soxdialog.c:464 msgid "Width: " msgstr ": " #: src/soxdialog.c:470 src/soxdialog.c:472 msgid "Bandwidth: " msgstr "" #: src/soxdialog.c:481 msgid "Filter type: " msgstr " : " #: src/soxdialog.c:482 msgid "Low 6dB corner: " msgstr "" #: src/soxdialog.c:484 msgid "High 6db corner: " msgstr "" #: src/soxdialog.c:486 msgid "Window length: " msgstr " : " #: src/soxdialog.c:488 msgid "Beta" msgstr "" #: src/soxdialog.c:491 msgid "Lowpass" msgstr "" #: src/soxdialog.c:492 msgid "Highpass" msgstr "" #: src/soxdialog.c:493 msgid "Bandpass" msgstr "" #: src/soxdialog.c:526 msgid "Attack integration time: " msgstr "" #: src/soxdialog.c:530 src/soxdialog.c:535 src/soxdialog.c:565 msgid " seconds" msgstr " " #: src/soxdialog.c:531 msgid "Decay integration time: " msgstr "" #: src/soxdialog.c:538 msgid "Input level (dB)" msgstr " ()" #: src/soxdialog.c:539 msgid "Output level (dB)" msgstr " ()" #: src/soxdialog.c:552 msgid "Post-processing gain: " msgstr " : " #: src/soxdialog.c:556 msgid " dB" msgstr " " #: src/soxdialog.c:557 msgid "Initial volume: " msgstr " : " #: src/soxdialog.c:561 msgid "Delay time: " msgstr " : " #: src/soxdialog.c:570 msgid "Shift amount: " msgstr "" #: src/soxdialog.c:574 msgid "Peak limiter" msgstr "" #: src/soxdialog.c:578 msgid "Limiter gain: " msgstr "" #: src/soxdialog.c:591 msgid "Amount: " msgstr "" #: src/soxdialog.c:592 msgid " cents" msgstr "" #: src/soxdialog.c:593 msgid "Window width: " msgstr " : " #: src/soxdialog.c:594 src/soxdialog.c:625 msgid " ms" msgstr " " #: src/soxdialog.c:595 msgid "Interpolation: " msgstr ": " #: src/soxdialog.c:596 msgid "Fade: " msgstr ": " #: src/soxdialog.c:605 msgid "Interpolation|Cubic" msgstr "" #: src/soxdialog.c:606 msgid "Interpolation|Linear" msgstr "" #: src/soxdialog.c:612 msgid "Fade|Cos" msgstr "" #: src/soxdialog.c:613 msgid "Fade|Hamming" msgstr "" #: src/soxdialog.c:614 msgid "Fade|Linear" msgstr "" #: src/soxdialog.c:615 msgid "Fade|Trapezoid" msgstr "" #: src/soxdialog.c:623 msgid "Factor: " msgstr ": " #: src/soxdialog.c:624 msgid "Window size: " msgstr " : " #: src/soxdialog.c:636 msgid "Speed: " msgstr ": " #: src/soxdialog.c:637 msgid " Hz" msgstr " " #: src/soxdialog.c:638 msgid "Depth: " msgstr ": " #: src/soxdialog.c:649 msgid "This effect has no options." msgstr " ." #: src/soxdialog.c:723 msgid "Error creating pipe" msgstr " (pipe)" #: src/soxdialog.c:730 msgid "Couldn't fork" msgstr "" #: src/soxdialog.c:745 #, c-format msgid "Error running 'sox -h': %s\n" msgstr " 'sox -h': %s\n" #: src/soxdialog.c:747 msgid "Should not reach this point" msgstr " " #: src/soxdialog.c:762 msgid "Error reading sox output" msgstr " sox" #: src/soxdialog.c:794 msgid "Unable to detect supported SoX effects" msgstr " SoX" #: src/soxdialog.c:832 msgid "Sox support couldn't be initialized" msgstr " Sox " #: src/speeddialog.c:58 msgid "Speed:" msgstr ":" #: src/statusbar.c:72 msgid "(no file loaded)" msgstr "( )" #: src/statusbar.c:235 msgid "Cursor: running" msgstr ": " #: src/statusbar.c:237 msgid "Cursor: " msgstr ": " #: src/statusbar.c:260 #, c-format msgid "View: [ %s - %s ]" msgstr ": [ %s - %s ]" #: src/statusbar.c:281 #, c-format msgid "Selection: %s+%s" msgstr ": %s+%s" #: src/statusbar.c:304 msgid "Processing data" msgstr " " #: src/statusbar.c:306 #, c-format msgid "%s... (Press ESC to cancel)" msgstr "%s... ( ESC )" #: src/um.c:51 msgid "mhWaveEdit: " msgstr "mhWaveEdit: " #: src/um.c:64 #, c-format msgid "mhWaveEdit: %s: %s\n" msgstr "mhWaveEdit: %s: %s\n" #: src/um.c:97 msgid "Message" msgstr "" #: src/um.c:117 msgid "Yes" msgstr "" #: src/um.c:125 msgid "No" msgstr "" #: src/um.c:318 msgid "Input" msgstr "" #: src/um.c:407 msgid "Choice" msgstr "" #: src/volumedialog.c:71 msgid "Calculating peak volume..." msgstr " ..." #: src/volumedialog.c:87 msgid "Start:" msgstr ":" #: src/volumedialog.c:90 msgid "End:" msgstr ":" #: src/volumedialog.c:109 msgid "Find top volume" msgstr " " #: src/document.c:230 #, c-format msgid "untitled #%d" msgstr " #%d" #: src/document.c:282 msgid "" "Loading and then saving files with 'lossy' formats (like mp3 and ogg) leads " "to a quality loss, also for the unmodified parts of the file." msgstr "" #: src/session.c:87 msgid "Error opening session directory" msgstr "" #: src/session.c:104 src/session.c:164 #, fuzzy, c-format msgid "%s: Wrong file type" msgstr " " #: src/session.c:238 #, fuzzy msgid "Could not create session file" msgstr " (pipe): %s" #: src/session.c:280 msgid "" "The files that belonged to the crashed session have been recovered. Any " "files that are not saved will be removed permanently.\n" "\n" "(This notice is only shown once)" msgstr "" #: src/session.c:380 #, fuzzy msgid "Suspended" msgstr ":" #: src/session.c:380 src/session.c:381 msgid "Crash" msgstr "" #: src/session.c:381 msgid "Left files" msgstr "" #: src/session.c:391 #, c-format msgid "%s on %s(%d files, %ld bytes)" msgstr "" #: src/session.c:409 msgid "Sessions" msgstr "" #: src/session.c:419 msgid "" "Earlier sessions were found. Choose one to resume or start a new session." msgstr "" #: src/session.c:439 #, fuzzy msgid "Resume selected" msgstr " " #: src/session.c:449 #, fuzzy msgid "Delete selected" msgstr " " #: src/session.c:456 msgid "Start new session" msgstr "" #: src/session.c:462 #, fuzzy msgid "Exit" msgstr "/_" #: src/mapchannelsdialog.c:116 #, fuzzy msgid "This effect applies to the whole file, not just the selection" msgstr "( , )" #: src/mapchannelsdialog.c:123 #, fuzzy msgid "Output channels: " msgstr " : " #: src/mapchannelsdialog.c:130 msgid "Map" msgstr "" #: src/mapchannelsdialog.c:137 msgid "Source" msgstr "" #: src/mapchannelsdialog.c:139 msgid "Destination" msgstr "" #: src/sandwichdialog.c:107 #, fuzzy msgid "Align beginning of files" msgstr " " #: src/sandwichdialog.c:110 #, fuzzy msgid "Align end of files" msgstr " " #: src/sandwichdialog.c:113 #, fuzzy msgid "Align at marker: " msgstr " : " #: src/sandwichdialog.c:126 #, fuzzy msgid "Add channels from: " msgstr " " #: src/sandwichdialog.c:130 msgid "Alignment" msgstr "" #~ msgid "double" #~ msgstr "" #~ msgid "float" #~ msgstr "" #~ msgid "mhWaveEdit: %s (%s): %d Hz, %d bit" #~ msgstr "mhWaveEdit: %s (%s): %d , %d " #~ msgid "Follow cursor while playing" #~ msgstr " " #~ msgid "Removing channel" #~ msgstr " " #, fuzzy #~ msgid "Mapping channels" #~ msgstr " " #~ msgid "Removing channels" #~ msgstr " " #~ msgid "Choose a sample format" #~ msgstr " " #~ msgid "%d-bit" #~ msgstr "%d-" #~ msgid "%s (%s %s %d Hz)" #~ msgstr "%s (%s %s %d )" #~ msgid "%s %s %d Hz" #~ msgstr "%s %s %d " #~ msgid "Other format..." #~ msgstr " ..." #~ msgid "" #~ "To add this format to the presets, enter a name below. Otherwise, leave " #~ "it blank." #~ msgstr "" #~ " , " #~ " . ." #~ msgid "Sound device file:" #~ msgstr " :" #~ msgid "" #~ "Environment variable LADSPA_PATH not set.\n" #~ "LADSPA support is disabled." #~ msgstr "" #~ " LADSPA_PATH .\n" #~ " LADSPA ." #~ msgid "8-bit wav-files must be in unsigned format!" #~ msgstr "8- wav- !" #~ msgid "16/24/32-bit wav-files must be in signed format!" #~ msgstr "16/24/32- wav- !" #~ msgid "[B] Convert samplerate" #~ msgstr "[B] " #~ msgid "[B] Speed" #~ msgstr "[B] " #~ msgid "Channel %d" #~ msgstr " %d" #~ msgid "/Effects/Sp_lit channel..." #~ msgstr "//_ ..." #~ msgid "SoX only supports 8, 16 and 32-bit sample sizes" #~ msgstr "SoX 8, 16 32- " #~ msgid "This will clear the entire undo buffer!" #~ msgstr " !" #~ msgid "This will clear the undo buffer up to the last save" #~ msgstr " " #~ msgid "/Edit/Clear undo buffer" #~ msgstr "// " #~ msgid "Conversion method: " #~ msgstr " : " #~ msgid "mhWaveEdit: Couldn't open %s: %s\n" #~ msgstr "mhWaveEdit: %s: %s\n" mhwaveedit-1.4.24/po/splithelp.rb000066400000000000000000000057171334022513400167150ustar00rootroot00000000000000#! /usr/bin/env ruby # Ruby script to split up translations for mhwaveedit help pages # Syntax: ruby splithelp.rb pofile pofile2 ... require 'pathname' Encoding.default_external="ASCII-8BIT" # Process a PO file. # Yields to block once for each entry in the PO file. def poproc(fn) p = Pathname.new(fn); pt = p.sub_ext(".tmp"); p.rename(pt); tc = 0 lines = Array.new x = p.open("w"); pt.each_line do |l| if l[/\A\s*\z/] # empty line or whitespace only if lines.length > 0 yield(lines,x,tc); tc = tc+1 lines = Array.new end else lines << l; end end if lines.length > 0 yield(lines,x,tc) end x.close pt.unlink tc end # Takes an array of lines and returns an array of array of lines # Each sub-array contains lines correspoding to one line of translation # text (the last one contains a newline character). Empty lines are skipped def linegroup(la) r = Array.new g = Array.new la.each do |l| g << l if l.strip.end_with?('\n"') if g.length > 1 or g[0].strip != '"\n"' r << g end g = Array.new end end if g.length > 0 r << g end return r end ARGV.each do |fn| scount = 0 e=poproc(fn) do |l,f,c| hsline = l.grep(/\A\#: src\/help.c:/) idl = l.find_index("msgid \"\"\n") stl = l.find_index("msgstr \"\"\n") # puts "hsline:#{hsline} idl:#{idl} stl:#{stl}" if c==0 then # Pass on header unchanged l.each do |x| f.puts x end elsif hsline.length>0 and stl==l.length-1 then # Empty message - skip puts "Skipping untranslated entry #{hsline[0].strip}" elsif hsline.length>0 and idl and stl then # This PO entry should be processed # Group lines of translation together idlg = linegroup(l[idl+1...stl]) stlg = linegroup(l[stl+1..-1]) # If there are more lines in translation, include all trailing # lines in the last entry if stlg.length > idlg.length stlg[idlg.length-1] = stlg[(idlg.length-1) .. -1].flatten stlg = stlg[1...idlg.length] end # If there are more lines in original than in translation, # create empty translation. while stlg.length < idlg.length stlg << [ "\" \\n\"\n" ] end for i in 0...idlg.length do f.puts "" l[0...idl].each { |x| f.puts(x) } if idlg[i].length > 1 f.puts 'msgid ""' idlg[i].each do |x| f.puts x end else f.puts "msgid #{idlg[i][0]}" end if stlg[i].length > 1 f.puts 'msgstr ""' stlg[i].each do |x| f.puts x end else f.puts "msgstr #{stlg[i][0]}" end end puts "Split entry #{hsline[0].strip} into #{idlg.length} entries" scount = scount+1 else # Pass on entry unchanged f.puts "" l.each do |x| f.puts x end end end puts "#{fn}: #{scount} entries were split (#{e} total)" end mhwaveedit-1.4.24/po/sv.gmo000066400000000000000000002223731334022513400155170ustar00rootroot00000000000000%l1B.B 0B>BABpFBBm~CCE7EE_F5GQ>GG;HIAJ|J:MKK KKK KKKKL)L=LMLlLLLL LLLMM M'M 8M FMTMcMuMMMMM MMNNN!N%N)N 2N>N YNcNNNNNN0N&O 5O%AOgO!OJOIO Z ![+[C[c[ [[[[[[ \\'\7\@\\ ]#] 6]@]]^ ^!^^ ^^ ^_ 9_$D_i____,_-_`3.` b`m`v` `` ` ````` ```a,aHacaaab*b1b 6bAbHbOb jb xbb"bbbb)bccc#/cScdc!lccccc c%cd6dITd%dddde*eDe"]e eeeeeeef&f,?f*lf1f/ffg(-gVg ogg&ggg5g)hkBhhhhhh hhi1i-j6j>jWj `j mjzjj jj jjjjSj<JkkkkkIllm mm" mCmKmimmmm m/mm n0nPn'dn&n(n'n-o2o/Ro0oooo"p%p>pZprp ppppp&p'q":q]qqrr*rrrrrrs s s's6sKsZdss s ss s tt2tU9tuuuDu v v*v52vhvwv }vvvvvv?v!w xTyqya9z1{{|!~2~ 8~E~ V~!c~~ ~~~~1~ (@HHW h%t%0  )6 ;FN ] k y+J[cFׂ ۂ  38? O\r ؃0)%Agj zH΅ )7I fq5چ   % 2@[u߈ -6E U8b  ݉ 0:Q!dɋً -?B\ ތ ,JQWf ȍٍ $&&M\x'ێ% $1 FgYߏA'#.R Xet{đ ˑؑ)' EOc&/IMAYٔ[3HaGF]*"QNuY1ě&L;"Z== {1* :G Wdxs6&ՠ*0&Gn ¡ס 1(1Z##Ԣ "5S=CK [iYx?Ҥ52|%l-%S CN)S }8ɪЪ2֪ 66I  (ī#)GYm #$ެ -YͭS'{Xxѯ ˰  $2#:%^#!,ʱ-% 6SC6γݳpSQ\A-̶3w[xAԸٹܹ.:̺ $,@{VҼ!%:Ka]4 þ;  / :G[ ju#ʿ *04 8 BM jt!9 D S(_"JF Yf {R82,Jw/+ -8)f%'7!Np 6Rp/Kex -8f"' (#Fj$3H gt  %=W j x&:JZu  , )#7 [i */$#T8x &$#+O bp   pps {" & /&5VC(( I<_   !)Da{y1GN V`dk (4 /:K+`& 2%@fE& &>Xt( 'CZq1/7 5Aw3"17i=K:AJYo   ,8?GOjT|3 .bH '", "M p~ (,&*+C*o,+7'+7S6"%"A d' **)U#=,DMTX` g q"q'' OYb htVN0 5   ,MEP}OtqW6=q   /=U do@=@@~'$AL3 "  ") E S ak.K[c|1  16 < JW `kpry# * 7: LWW .M]}#  -Jd z   +8 GIT #   *FYm"   ')@>j$   7SZFq  ./4 dq/(, IT]%r"M M\d    !(=*ft+%Q*oAPH- v  D O *  ^ 2 R S gE  J@=\GB-U7g"!' 8U hto(.M.i#   %!B%d(25$%Ag RF?)4.^;_5S. 78B {E. 5IR%1'CWv#$ % E U l } E2!Kx!!"# ###B#V#r#u#### ##(#+#)*$'T$-|$-$$ $j~-YP&daq(hd16ow ?PZ:7 !=MXAFL sH q@i3G% P1yv2A,5^TOz^C0cJ\I,mX*FcUg( +r. "goBoC@` /QD!;3na7M\+>"RLsY``|N.s TQw^R']BN-}>6ebe <almlKgEn{?S&[ /Jk% tme7 }=<0y:nu {$!1K_G8r_iSSVD4[zU,<Tb-G5y}Wf&k? # :hjp % u2 ]\5~fCOxfF _)jwr#t|H$9DzQ3'9A[6V;E4cMvuN=lpL>]t$WB/~IOWIRZ*.8pU 'K ZHx*{hYVxib J49k8"0;|E)qvX@2)(+#d Test results (1 time unit = %f usec/sample) Window '%s' By setting starting volume and ending volume to the same value you get a simple amplification of the sound. Note that volumes above 100% may cause sound distortion. Use the 'Find top volume' to find out the maximum amplification possible without distortion. (You can use this for normalizing samples.) The 'Don't actually change the data' option can be used if the program was wrong about the file's format. This "byte swaps" the selected part. It can be used to repair damaged files where the byte order is wrong. Note that if the sound looks alright but plays wrong, you should not use this option, instead you should use the "byte-swap output" option in the Preferences dialog. This amplifies the sound as much as possible without getting clipping distortion. The "Normalize to..." item lets you specify which level to normalize to. This converts the sample format of the entire file. This converts the samplerate of the entire file to one you specify. There are different methods for doing this, usually the one in the top has the best quality but can take longer than the other methode. This copies the first channel to a new channel in the sound, converting mono to stereo etc. This creates a linear fade in or fade out effect. This effect changes the speed of the selection. The tone will change as well. This effect is for advanced users wanting to pipe raw audio data through an external program. The output of the program is read back and replaces the processed part. This effect lets you create a new sound by a linear combination of the old channels. This means you can do channel mixing / swapping / balance / panning / amplification etc. by entering different values. For example, to swap the left and right channel, you select that the new Channel 1 should be 0% of the old Channel 1 and 100% of the old Channel 2, and the new Channel 2 should be 100% of the old Channel 1 and 0% of the old Channel 2 This effect lets you select a starting volume and a ending volume and amplifies the selection fading from the starting volume to the ending volume. This mixes all channels of the file together to a mono sound. With this effect, you can change the number of channels in the file. You can also rearrange and add (i.e. mix) channels. gdb /usr/local/bin/mhwaveedit core | tee backtrace.txt Current chunk: History: and: * Add channel * Byte swap * Combine channels... * Convert sample format... * Convert samplerate... * Fade in/out * Map channels... * Mix to mono * Normalize, Normalize to... * Pipe through program... * Speed adjustment... * Volume adjust/fade... Advanced settings Dithering Driver options External applications Fallback format Hz Input audio Input controls Input ports Main window Output audio Output controls Output ports Playback settings Rate conversions Temporary file directories Temporary file settings Time format Variable speed View Window contents cents dB ms seconds%d channels%s is not a valid wav file%s kbit/s%s on %s(%d files, %ld bytes)%s... (Press ESC to cancel)%s: Expected '=': %s %s: Expected value: %s %s: Wrong file type'%s' is not a number!( Play first 3 seconds of selection (H')MM:SS.mmmm(H')MM:SS.t(Lines with delay=0 will be ignored.)(SoX) Polyphase interpolation(SoX) Simulated analog filtration(This changes the sample rate of the entire file, not just the selection)(This changes the sample type of the entire file, not just the selection)(expected) (no file loaded)(no limit)(number) Goto mark (use a negative number to place the cursor before instead of after the selected point)) Play last 3 seconds of selection +,= Zoom in , Play from cursor pos - Zoom out . Stop / Play selection /Cursor/Find zero-crossing/Cursor/Find zero-crossing/Left (all channels)/Cursor/Find zero-crossing/Left (any channel)/Cursor/Find zero-crossing/Right (all channels)/Cursor/Find zero-crossing/Right (any channel)/Cursor/Move/Cursor/Move to/Cursor/Move to/Beginning/Cursor/Move to/End/Cursor/Move to/Selection end/Cursor/Move to/Selection start/Cursor/Move/Left/Cursor/Move/Left sample/Cursor/Move/Right/Cursor/Move/Right sample/Cursor/Position cursor.../Cursor/Set selection end/Cursor/Set selection start/Cursor/sep1/Cursor/sep2/Debug/Debug/Check opencount/Debug/Dummy effect/Debug/Dump chunk info/Edit/Clear clipboard/Edit/Cr_op/Edit/Cu_t/Edit/Insert _silence/Edit/Paste _over/Edit/Paste to _new/Edit/Preferences/Edit/Select _all/Edit/Select none/Edit/Silence selection/Edit/_Copy/Edit/_Delete/Edit/_Mix paste/Edit/_Paste/Edit/_Redo/Edit/_Undo/Edit/sep1/Edit/sep2/Edit/sep3/Edit/sep4/Effec_ts/Effects/Add channe_l/Effects/Add channels from other file.../Effects/B_yte swap/Effects/Convert sample _format.../Effects/Convert sample_rate.../Effects/Effects dialog.../Effects/Fade _in/Effects/Fade o_ut/Effects/Ma_p channels.../Effects/Normali_ze to.../Effects/Pipe through program.../Effects/_Combine channels.../Effects/_Mix to mono/Effects/_Normalize/Effects/_Speed adjustment.../Effects/_Volume adjust (fade).../Effects/sep1/Effects/sep2/Effects/sep3/Effects/sep4/File/Save _as.../File/Save selection as.../File/_Close/File/_Exit/File/_Open.../File/_Save/File/sep1/File/sep2/Help/_About/Help/_Documentation/Move Down/Move Up/Move to Bottom/Move to Top/Play/Play _all/Play/Play se_lection/Play/_Play from cursor/Play/_Record.../Play/_Stop/Play/sep1/Rebuild Effect List/Restore Order/Sort by Author/Sort by Location/Sort by Name/Sort by Type/View/Sp_eed slider/View/Zoom _all/View/Zoom _in/View/Zoom _out/View/Zoom to _selection/View/_Horizontal zoom/View/_Time scale/View/_Vertical zoom/View/sep1/View/sep2/_Cursor/_Edit/_File/_Help/_Play/_View1. Enable core dumps: ulimit -c unlimited 16 bit PCM2. Run the program: mhwaveedit 24 bit PCM3. Make the program crash. You should now get a file named core or core.1234 in the directory you're in. 32 bit PCM4. Run gdb with the program and core file: 5. After gdb has loaded, use the command: bt 6. Quit gdb with the command: quit 7. Now you should have a back trace in the file backtrace.txt 8 bit PCM< Zoom all > Zoom to selection ALSA PreferencesAbout mhWaveEditActivation failed!Add channels from other fileAdd channels from: Add presetAdd/Update presetAdjusting speedAdvancedAfter you've filled in all the translations you want (you don't have to translate all the strings), mail in the po file to me (see contact info) and I'll add it to the next release. Align at marker: Align beginning of filesAlign end of filesAlignmentAll editing functions work non-destructively, that is, the file you're editing isn't actually changed until you save it (the effects also work this way). All supported effects can be found by choosing the 'Effects...' menu item. The effects are listed with names beginning with [B] for builtin effects, [L] for LADSPA effects, and [S] for SoX effects. Amount: AmplifyingAmplifying (by %3.1f%% / %+.1fdB)ApplyApply to: Applying effect '%s'Arrow keys Scroll left/right Attack integration time: Author: %sAuto dete_ct driver on each start-upAuto return to playback startAuto stop in: Auto-_reset speedAuto-detect from extensionAutomatically connect input ports on startupAutomatically connect output ports on startupAverage bitrateAvoid select calls (try this if recording locks up)BackgroundBandpassBandpass filterBandwidth: BetaBig endianBig-endianBlackBottomBrowse directoryBuffer overrun!Bug reportingBuilt-inButterworth bandpass filterButterworth bandreject filterButterworth highpass filterButterworth lowpass filterBy default, mhWaveEdit uses floating-point temporary files for storing processed results to avoid rounding until the file is saved. Bytes written: Calculating peak levelCalculating peak volume...CancelCh%dChannels: ChoiceChorusChunk %p has opencount=%d Client name: Clipping: CloseClose dialog after applying effectColorsCombine channelsCombining channelsCommand failed without returning any dataCommand line: Compiled %s %sCompress/ExpandConnection from %s to %s failed: %sConstant bitrateContactConversion test failed, between: Convert sample formatConvert samplerateConverting samplerateCopy the current selectionCopyright: %sCould not connect to the JACK server.Could not create pipe: %sCould not create session fileCould not find home directory. Using current directory as home directory.Could not get file position in %s: %sCould not initialize SDL: %sCould not open %s: %sCould not open '%s': %sCould not read from %s: %sCould not remove '%s': %sCould not seek in %s: %sCouldn't connect to ESD daemon: %sCouldn't forkCouldn't open %sCrashCtrl+(number) Set mark Ctrl+A Select all Ctrl+C Copy Ctrl+D Delete Ctrl+E Effects Ctrl+G Position cursor (Go to) Ctrl+H Position cursor at file start Ctrl+J Position cursor at file end Ctrl+K Position cursor at selection start Ctrl+L Position cursor at selection end Ctrl+O Open file Ctrl+P Preferences Ctrl+Q Selection start at cursor Ctrl+S Save file Ctrl+U Save selection as Ctrl+V Paste Ctrl+W Selection end at cursor Ctrl+X Cut Ctrl+Z Undo Ctrl+arrow Move cursor (and playback) half second Current sound driver: %sCurrently it is impossible to play and record at the same time, so the playback will stop when you record. CursorCursor: Cursor: runningCustom argumentCustom argument: Custom formatCustomize co_lors...Cut out the current selectionCut, copy and paste operations move the data around without modifying it, so these don't degrade the sound quality. Because of level differences, you may get a "step" at the start and end of the inserted part, which can cause a small clicking sound. DC ShiftDecay Decay integration time: DecodingDelay (ms) Delay time: Delete selectedDelete the selectionDepth (ms) Depth: DestinationDisableDisk editing _threshold: Display t_imes as: Distributed under GNU General Public License. For information, see the file COPYINGDon't actually change the data (for repairing bad files etc)DownDummy (no sound)ESD preferencesEach mhwaveedit process creates a session file in the .mhwaveedit directory called mhwaveedit-session---, where is the session ID number and is a character code showing the state of the session ('r' for running sessions). Earlier sessions were found. Choose one to resume or start a new session.EarwaxEchoEcho sequenceEditingEffect %s contains invalid port %sEffectsEnable _dithering for editingEnable _variable speed playbackEnable dithering for _playbackEncoding type: End:Endianness: Error changing samplerate conversion ratio: %s Error closing %s: %sError converting samplerate: %s Error creating link to '%s': %sError creating pipeError in sound driver: ioctl failed: %sError in sound driver: read failed: %sError in sound driver: select failed: %sError in sound driver: write failed: %sError initialising sample rate conversion: %sError launching mixer: fork: %sError opening ALSA device '%s' for playback: %sError opening ALSA device '%s' for recording: %sError opening session directoryError reading %s: %sError reading from %s: %sError reading from sub process: %sError reading sox outputError running 'sox -h': %s Error seeking in %s: %sError writing to subprocess: %sError: %sError: fork: %sEsounD driver: readEsounD driver: selectEsounD driver: writeEsounD: Unable to open playback streamEsounD: Unable to open recording streamEsound connection closed by serverEven if mhWaveEdit was originally built for editing wav files, it's also possible to load and save in a few other formats. mhWaveEdit always supports wav and raw files, but if it's compiled with the libsndfile library, mhWaveEdit supports a couple of other formats as well. Event driven I/OExitExpected driver name after --driver optionExtreme (higher quality)F1 Help F12 Record Factor: Fade: Fade|CosFade|HammingFade|LinearFade|TrapezoidFailed to open '%s'!Failed to write to '%s'!Feature requests are also welcome, report them to the mailing list or to the bug tracker. File already exists. Overwrite?File formatsFile type: FilesFilter type: Find top volumeFinding zero-crossingFinishFirst of all, look for bugs and report all bugs you find into the bug tracker or through e-mail. Sometimes a bug can get overlooked for a long time because nobody reports it, so don't be afraid to report bugs that have been there for a few releases. You don't have to provide fixes or very detailed information, although it helps of course. FlangerFloating-point, doubleFloating-point, singleFor bug reports, translation updates, patches and PayPal donations: Format not selectedFrequency: GeneralH,J Move cursor (and playback) 1/8 of view Header bytes: HeavyHelping outHigh 6db corner: HighpassHighpass filter (single-pole)How to create a backtrace: HzI,O Move cursor to nearest any-channel zero-crossing If a translation is incomplete, you're very welcome to translate the remaining untranslated messages and mail them in. Corrections to translations are also appreciated, but they may need to be checked with the previous translator before including them. If mplayer is installed, mhwaveedit can open all formats that it supports, for example the soundtrack of a video file. Since mplayer is only a player, these files can not be saved back after editing, you have to save the file into a supported format. If the cursor starts running too early when jumping, this delay should be increased.If you find a bug or flaw in the program that's not mentioned in the BUGS file, report the bug in the bug tracker (see contact info) or mail a bug report describing the bug to: magnus.hjorth@home.se If you speak a language other than English and mhWaveEdit isn't translated to your language, you can contribute a translation. To do that, copy the template mhwaveedit.pot in the po directory into a new file ll.po, where ll is your language code (see http://www.gnu.org/software/gettext/manual/html_node/gettext_221.html for a list of language codes). Ignoring extreme old window size/position values In case of a crash, please do not send me any core dumps. They are huge and completely useless to me. Instead, create a backtrace. Backtraces tell you exactly where the program crashed. In the sample view there is a grey vertical bar called the 'cursor'. The cursor follows the sound wave when you play the sound. You can position the cursor by clicking with the right (2:nd) mouse button. If you do this while you're playing a file, the playing will continue from the new cursor position. You can also position the cursor more exact by using the 'Position Cursor...' command on the Edit menu. Initial volume: InputInput gain: Input level (dB)Input levelsInsane (highest possible quality)Insert SilenceInterfaceInterpolation: Interpolation|CubicInterpolation|LinearInvalid driver name: %s Using '%s' driver insteadInvalid number of input ports.Invalid number of output ports.Invalid sample format or number of channels for this file formatInvalid time value. Time must be specified in the form (HH')MM:SS(.mmmm)It's possible to edit po-files by hand, but I recommend a program such as poEdit (http://www.poedit.org) for editing translations. Jack PreferencesJump delay:K,L Move cursor one sample Keep data in unmapped output channelsKeep main _window in front after applying effectKeyboard shortcutsL WaveformLadspa: Error scanning %sLaunch mixerLeftLeft filesLevel: Limiter gain: Little endianLittle-endianLoad FileLoad a file from diskLoadingLoading and then saving files with 'lossy' formats (like mp3 and ogg) leads to a quality loss, also for the unmodified parts of the file.Loop mode (play over and over)Low 6dB corner: LowpassLowpass filter (single-pole)MP3 PreferencesMailing list (you must be a subscriber before you can post messages): MapMap channelsMarksMasking noiseMessageMethod: Mi_xer utility: Microsoft WAV formatMildMixingMixing channelsModulation Modulation|SinusoidalModulation|TriangularMonoN/AName :New samplerate: NoNo errors detected!No file with that name!Noise modeNoneNormalize to...Note that for those translatable strings that look like "RecordStatus|Paused", you should ignore what's to the left and only translate the string to the right ("Paused" in this example). This convention is there to make it possible to translate the same string to different things depending on context. Number of ports (0-8): Number of recent files in File menu: OKOSS preferencesOgg VorbisOn this system, libsndfile is required to save floating-point wav files.Open with MPlayerOtherOutput _buffer size:Output channels: Output from command '%s': Output gain: Output level (dB)Over/underrun in JACK driverOverruns: Pa_OpenStream failed: %s Paste at cursor positionPaste, overwriting the data after the cursor positionPause recordingPeak limiterPeak max: Peak: PhaserPipe through programPitch adjustPlace cursor Play _mono files as stereoPlay from cursor positionPlay selected areaPlaybackPlayback device file:Playback device: PlayingPlaying a file is simple, just load the file and press the play button. The green play button plays from the current position. The yellow play button plays the current selection, or the entire file if nothing is selected. Stop the playback with the stop button (with the red square). Port #%dPosition cursorPost-processing gain: PreferencesPreparing tests..Presets:Process outputProcessing dataProgress barProject page with bug tracker, mailing list membership: QualityQuality: R WaveformRMS: Range test failed for format: Raw PCM dataReady for recordingRecordRecordStatus|PausedRecordStatus|RecordingRecordingRecording device file:Recording device: Recording is done with 'Record...' on the Play menu, or the Record button (the red circle). A dialog box will pop up where you can select what format you want to record in. After selecting the format, meters and numbers will appear showing info about the volume level of the sound input. Recording settingsRecording status: Redo the last undo operationReset max peaksResume recordingResume selectedReverbReverb time: ReverseRightRunning tests..SDL (output only)SDL: Couldn't open audio: %sSample format to try when the sound file's format isn't supported.Sample format: Sample rate: Sample repeat/skip (low quality)Sample type: Sample viewSave FileSave changes to %s?Save selection as ...Save the current file to diskSavingSeconds of silence: Selecting the ESD host to connect to is done through the ESPEAKER environment variable.SelectionSelection: %s+%sSend wav headerSessionsSetSet formatSet selection end to cursor positionSet selection start to cursor positionShift amount: Should not reach this pointShould not reach this point!Show _horizontal zoom slider by defaultShow _speed slider by defaultShow _time scale by defaultShow _vertical zoom slider by defaultSignedSignedness: Sinc-windowed filterSoX closed connection too early!Some notes on sound quality. Some of the settings you have changed will not be activated until you restart the programSoundSound data is normally stored as integer values. Therefore, whenever you normalize, adjust volume, decrease sample size or filter a sound, the result must be rounded. If you use 24 or 32 bit sample sizes, this is not really a problem, but if you use 8 or 16 bits sample size, this rounding causes a decrease in quality. SourceSox support couldn't be initializedSpeedSpeed (Hz) Speed effect: Speed:Speed: Standard (high quality)Start new sessionStart recordingStart:StereoStop playingSunAudio: Couldn't open %sSunAudio: Error reading from sound deviceSunAudio: Error writing to sound deviceSuspendedSyntax: %s [files] Temporary files are by default also stored in the ~/.mhwaveedit directory. Which directories to use can be set through the preferences dialog. To get the best performance, you should have one temporary directory for each local filesystem. The temporary files have names of the form "mhwaveedit-temp--nnnn-". Do NOT open or remove temporary files with the same pid number as a currently running mhWaveEdit. Testing conversion functions finished.Testing conversion functions:The 'Crop' function deletes all parts of the file that are not selected. The 'Cut' and 'Copy' functions work like in any other software. The 'Paste as new' function opens a new window and puts the clipboard contents into it. The 'Paste mix' function combines the clipboard data with the data at the cursor position. The 'Paste' function insert the clipboard contents at the cursor position. The 'Paste over' function works like 'Paste', except that it overwrites the data after the insert position. The 'Silence selection' function replaces the selected part with silence. To avoid clicks, the silent part is a line that meets the wave at the endpoints. The area where you 'see' the contents of the file you are editing, is called the 'sample view'. The client name change won't take effect until you restart the program.The configuration file is called config. It can be hand edited, but the easiest way is through 'Preferences' on the Edit menu. The file %s does not exist!The file %s is a compressed wav file. This program can only work with uncompressed wav files.The file %s is not a regular file!The file %s may be destroyed since the saving failed. Try to free up some disk space and save again. If you exit now the file's contents could be in a bad state. The file has not changed since last save. Press OK if you want to save it anyway?The file name '%s' has an extension unknown to the program. Please specify in which format this file should be saved.The files that belonged to the crashed session have been recovered. Any files that are not saved will be removed permanently. (This notice is only shown once)The format of file '%s' could not be recognized. Please specify the sample format below.The general rule when doing audio editing/processing is to not manipulate the data more than necessary and keep an original copy whenever you're processing your important files. The input was clipped %d times during processing.The mix paste function doesn't decrease quality, unless the peaks become too high and you get clipping. In that case you will get a warning message. The mixed result was clipped %d times.The playback speed can be varied by adjusting the slider to the far right. The sign and endian-ness can usually be left at their defaults, but should be changed if you're unable to record or get bad sound.The sound format of this file is not supported for playing.There already is only one channel!There are plenty of things you can do if you want to help the development of mhWaveEdit. This effect applies to the whole file, not just the selectionThis effect could not be loaded.This effect has no options.This format is not supported by the input driver!Time Code 24fpsTime Code 25fps (PAL)Time Code 29.97fps (NTSC)Time Code 30fpsTime limit: Time recorded: Time stretchTimeDisplay|SamplesTimes_cale format: To avoid rounding errors when applying more than one effect on the same data, floating-point temporary files can be used. However, this will increase disk and CPU usage.To save a file with a different file format, use "Save as..." and choose a format in the file type selection box. TopUnable to detect supported SoX effectsUnable to write data to %sUndo the last changeUnexpected EOF in connection to subprocessUnexpected end of fileUnexpected end of file reading from %sUnknown file formatUnknown file typeUnknown option '%s'UnsignedUpUpdate presetUse default settingsUse fast and noisy methodUse this setting by defaultUses double-precision mathValue for %s must be a number between %ld and %ldValue for '%s' must be a number between %f and %fValue for '%s' must not be above %fValue for '%s' must not be below %fVariable bitrate (default)Varispeed: VibroView _quality:View: [ %s - %s ]Volume adjust/fadeWarning: Unexpected error: %sWhen you want to start recording, press the "Start recording" button. When you've recorded everything you wanted to, press the Finish button and the record dialog will disappear and newly recorded sound will show up in a new window. WhiteWidth: Window length: Window size: Window width: With JACK, the only supported recording format is Floating-point, single precision, %d HzY,U Move cursor to nearest all-channel zero-crossing YesYou are saving a wav file larger than 2048MB. Such large files are non-standard and may not be readable by all programs. (this warning will not be displayed again)You can do normal editing while the file is playing. You can find the latest release of mhWaveEdit at: You can place marks in your file by holding down Ctrl and pressing a number from 0 to 9. This will place a mark (green vertical bar) with the same number at the current cursor position. You can later make the cursor go to that position again by just pressing the number. Setting and jumping to marks can be done while playing. To remove a mark, jump to the mark and set it again. You can use the cursor to refine the selection. Use the 'Selection start at cursor' and 'Selection end at cursor' buttons to move the selection starting point or the selection end point to the current cursor position. You can also drag the selection endpoints using the mouse. You have mapped more than one output port to channel '%s'. You can only map one output port to each channel.You have no open file to apply the effect to!You make selections by dragging the mouse over the sample view. You can hear what you've currently selected by clicking on the "play selection" button (the button with the yellow arrow) or by selecting 'Play selection' from the Play menu. Zero-level_Add_Auto-start playback when jumping to mark_Browse..._Byte-swap output (try this if playback sounds horrible)_Cancel_Close_Down_Draw waveform a second time with improved quality_Driver:_Keep cursor in center of view when following playback_Keep sound driver opened (to avoid start/stop clicks)_OK_Preview_Remember window sizes/positions_Remove_Settings_Up_Update cursor information while playing_Use floating-point temporary filesafter beginning of fileafter current cursor positionafter end of fileafter selection endafter selection startbytesheader sizehttp://gna.org/projects/mhwaveedit http://gna.org/projects/mhwaveedit/ jack_get_ports returned NULLjump delaymagnus.hjorth@home.se mhWaveEdit HelpmhWaveEdit checks on startup for leftover temporary files and lets the user open them. After opening a crashed session, the files can be saved or thrown away. mhWaveEdit creates a directory ~/.mhwaveedit where it stores configuration information. mhWaveEdit has a few simple effects, which are available from the 'Effects' menu. mhWaveEdit has basic support for mp3 and ogg formats. For this to work you need to have LAME installed for mp3 support, and OggDec/OggEnc for Ogg support. If you have these programs, you can open and save mp3/ogg files just like any other file format. mhWaveEdit is a graphical program for editing sound files. It is completely free (GPL). mhWaveEdit supports LADSPA effects and can also make use of most of the SoX utility's effects. To find the LADSPA plugins the environment variable LADSPA_PATH must be properly set up. mhWaveEdit: mhWaveEdit: %s (%s): %d Hz, %smhWaveEdit: %s: %s mhwaveedit-discuss@gna.org msnumber of recent filesputenv failed!sample ratesamplessamples/pixelsecondssnd_pcm_hw_params_set_access failedsnd_pcm_hw_params_set_channels failedsnd_pcm_hw_params_set_format failedsnd_pcm_hw_params_set_rate failedsound-portaudio: No input devices available!sound-portaudio: No output devices available!unsetenv failed!untitled #%dProject-Id-Version: mhWaveEdit 1.3.8 Report-Msgid-Bugs-To: POT-Creation-Date: 2018-08-25 11:56+0200 PO-Revision-Date: 2009-12-29 00:16+0100 Last-Translator: Magnus Hjorth Language-Team: Swedish Language: sv MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit Testresultat (1 tidsenhet = %f mikrosekunder/sampel Fnster '%s' Med denna effekt kan man ndra antalet kanaler i filen. Det gr ocks att flytta om och mixa ihop kanaler. Stter man samma start- och slutvolym fr man en vanlig frstrkning av ljudet. Frstrkning ver 100% kan orsaka distortion. Anvnd 'Hitta maxvolym'-knappen fr att hitta hgsta mjliga frstrkning som gr att f utan distortion. Knappen "ndra ej datat" kan anvndas om programmet inte har lst filen med rtt format. Denna effekt kan anvndas fr att reparera skadade filer dr byteordningen blivit fel. Observera att om ljudfilen ser bra ut p skrmen men lter illa nr man spelar den ska man inte anvnda denna effekt, anvnd i stllet instllningen "Vxla byteordning p spelat ljud" i Instllningar-fnstret. Detta justerar volymen s hgt som gr innan distortion intrffar. "Normalisera till..." gr samma sak men lter dig vlja vilken niv som de hgsta topparna ska ha. Denna effekt omvandlar sampelformatet p filen. Denna effekt omvandlar samplingsfrekvensen p aktuell fil. Det finns olika metoder att gra detta p, det frsta alternativet i listan har hgst kvalitet men kan ta lngre tid n metoderna lngre ner. Delar den frsta kanalen till en ny kanal i ljudet, om ljudet var mono blir det stereo. Detta gr en linjr fade-in eller fade-ut p markerat omrde. mhWaveEdit stder LADSPA-effekter och kan ocks anvnda de flesta av programmet SoX effekter. Fr att programmet ska hitta LADSPA-effekterna mste miljvariabeln LADSPA_PATH vara rtt instlld. * ndra hastighet... Denna effekt lter dig ange start- och slutvolym och "fade:ar" markeringen. Fr att skapa en fade-ut, vlj startvolym 100% och slutvolym 0%. Mixar ihop alla kanaler i filen till mono. * Kombinera kanaler... gdb /usr/local/bin/mhwaveedit core | tee backtrace.txt Aktuell chunk: Historia: och: * Lgg till kanal * Vxla byteordning Med denna effekt gr man en linjrkombination av kanalerna. Genom att vlja olika vrden kan man gra mixning, byta plats p kanaler, justera balans, frstrking osv. Till exempel, fr att byta plats p vnster och hger kanal, ange att nya Kanal 1 ska vara 0% av gamla Kanal 1 och 100% av gamla Kanal 2, och nya Kanal 2 ska vara 100% av gamla Kanal 1 och 0% av gamla Kanal 2 * Omvandla sampelformat... * Omvandla samplingsfrekvens... * Fade-in/Fade-ut * ndra kanaler... * Mixa kanaler * Normalisera volym Alla effekter som stds kan man hitta genom att vlja "Effektfnster..." p Effekter-menyn. Effekterna listas med namn som brjar p [B] fr inbyggda effekter, [L] fr LADSPA-effekter och [S] fr SoX-effekter. Med denna effekt ndrar man hastigheten p ljudet. Tonen kommer att ndras p samma stt. * Volymjustering... Avancerade instllningar Dithering Drivrutinsinstllningar Externa program Backupformat Hz Ingende ljuddata Inkontroller Inportar Huvudfnster Utgende ljuddata Utkontroller Utportar Uppspelningsinstllningar Hastighetsomvandlingar Kataloger fr temporra filer Instllningar fr temporra filer Tidsformat Variabel hastighet Vy Fnstrets innehll cent dB ms sekunder%d kanaler%s r inte en giltig wav-fil%s kbit/s%s, %s(%d filer, %ld byte)%s... (Tryck ESC fr att avbryta)%s: Frvntade '=': %s %s: Frvntat vrde: %s %s: Fel filtyp'%s' r inte ett nummer!( Spela de frsta 3 sekunderna i markeringen (T')MM:SS.mmmm(T')MM:SS.t(Rader med delay=0 kommer att ignoreras)(SoX) Polyfas-interpolation(SoX) Simulerade analog filtrering(detta ndrar samplingfrekvensen p hela filen, inte bara markerat omrde)(Detta ndrar sampelformatet p hela filen, inte bara markerat omrde)(frvntat) (ingen fil inladdad)(ingen grns)(siffra) G till mrke (anvnd negativt tal fr att placera markren fre i stllet fr efter vald punkt)) Spela de sista 3 sekunderna i markeringen +,= Zooma in , Spela frn markrens position - Zooma ut . Stopp / Spela markering /Markr/G till nollniv/Markr/G till nollniv/Vnster (alla kanaler)/Markr/G till nollniv/Vnster (en kanal)/Markr/G till nollniv/Hger (alla kanaler)/Markr/G till nollniv/Hger (en kanal)/Markr/Flytta/Markr/Flytta till/Markr/Flytta till/Brjan/Markr/Flytta till/Slutet/Markr/Flytta till/Markeringens slut/Markr/Flytta till/Markeringens brjan/Markr/Flytta/Vnster/Markr/Flytta/Vnster ett sampel/Markr/Flytta/Hger/Markr/Flytta/Hger ett sampel/Markr/Placera markr.../Markr/Stt slut p markering/Markr/Stt start p markering/Markr/sep1/Markr/sep2/Debug/Debug/Kolla opencount/Debug/Gr ingenting-effekt/Debug/Dumpa chunkinformation/Redigera/Rensa urklipp/Redigera/Skr ut/Redigera/Klipp u_t/Redigera/Infoga _tystnad/Redigera/Klistra _ver/Redigera/Klistra in till _ny/Redigera/_Instllningar/Redigera/Markera _allt/Redigera/Markera ingenting/Redigera/Tysta markering/Redigera/_Kopiera/Redigera/Ta bort/Redigera/_Mixa in/Redigera/Klistra _in/Redigera/_Gr om/Redigera/_ngra/Redigera/sep1/Redigera/sep2/Redigera/sep3/Redigera/sep4/Effek_ter/Effekter/_Lgg till kanal/Effekter/Lgg till kanaler frn annan fil.../Effekter/Vxla byteordning/Effekter/Omvandla sampelformat.../Effekter/Omvandla samplingsfrekvens.../Effekter/Fler effekter.../Effekter/Fade-in/Effekter/Fade-ut/Effekter/_ndra kanaler.../Effekter/Normalisera till.../Effekter/Filtrera genom program.../Effekter/_Kombinera kanaler.../Effekter/_Mixa kanaler/Effekter/Normalisera volym/Effekter/ndra hastighet.../Effekter/Volymjustering.../Effekter/sep1/Effekter/sep2/Effekter/sep3/Effekter/sep4/Arkiv/S_para som.../Arkiv/Spara _markering som.../Arkiv/Stng/Arkiv/A_vsluta/Arkiv/_ppna.../Arkiv/_Spara/Arkiv/sep1/Arkiv/sep2/Hjlp/_Om/Hjlp/_Dokumentation/Flytta Ner/Flytta Upp/Flytta Underst/Flytta verst/Spela/Spela allt/Spela/Spela _markering/Spela/S_pela frn markr/Spela/Spela in.../Spela/_Stopp/Spela/sep1/Bygg om effektlista/terstll ursprunglig ordning/Sortera efter Frfattare/Sortera efter Plats/Sortera efter Namn/Sortera efter Typ/Visa/Hastighetsvljare/Visa/Zooma ut helt/Visa/Zooma _in/Visa/Zooma _ut/Visa/Zooma till markering/Visa/_Horisontell zoom/Visa/_Tidsskala/Visa/_Vertikal zoom/Visa/sep1/View/sep2/_Markr/_Redigera/_Arkiv/_Hjlp/S_pela/_Visa1. Aktivera core-filer: ulimit -c unlimited 16-bitars PCM2. Kr programmet: mhwaveedit 24-bitars PCM3. Gr s att programmet kraschar. Nr det gr det s ska en fil som heter core eller core.nnnn dyka upp i den katalog du r i. 32-bitars PCM4. Kr gdb med programmet och core-filen: 5. Efter att gdb laddats, anvnd kommandot: bt 6. Avsluta gdb med kommandot: quit 7. Nu ska det finnas en backtrace i filen backtrace.txt 8-bitars PCM< Zooma ut maximalt > Zooma till markering ALSA-instllningarOm mhWaveEditAktivering misslyckades!Lgg till kanaler frn annan filLgg till kanaler frn: Lgg till instllningLgg till/uppdatera instllningndrar hastighetAvanceratEfter att du versatt s mycket du vill (du behver inte verstta allt p en gng), skicka in po-filen till mig (se Adresser) s lgger jag till den till nsta version. Gemensamt mrke: Brja samtidigtSluta samtidigtPositioneringAll redigering och alla effekter sker icke-destruktivt, dvs filen ndras inte i verkligheten frrn man sparar. Mngd: FrstrkerFrstrker (med %3.1f%% / %+.1fdB)VerkstllVerkstll p: Verkstller effekt '%s'Piltangenter Flytta vy vnster/hger Attack integrationstid: Skapare: %sSk rtt drivrutin automatiskt vid programstartHoppa automatiskt tillbaka till uppspelningens brjanTid till auto-stopp: Stll _tillbaka hastigheten till normal varje gng spelning startasVlj automatisktAnslut inportar automatiskt vid uppstartAnslut utportar automatiskt vid uppstartGenomsnittlig bitrateLt bli select-anrop (prova detta om inspelningen lser sig)BakgrundBandpassBandpassfilterBandbredd: BetaBig-endianBig-endianSvartUnderstVlj katalogBuffert-overrun!BuggrapporteringInbyggdButterworth bandpassfilterButterworth bandstopp filterButterworth hgpassfilterButterworth lgpassfilterVanligtvis anvnder mhWaveEdit temporra filer i flyttalsformat fr att undvika ondiga avrundningar tills filen sparas. Skrivna bytes: Berknar toppnivBerknar toppvolym...AvbrytKanal%dKanaler: ValChorusChunk %p har opencount=%d Klientnamn: Klippning: StngStng detta fnster efter effekten krtsFrgerKombinera kanalerKombinerar kanalerKommandot misslyckades utan att returnera ngot dataKommando: Kompilerad %s %sKomprimera/ExpanderaAnslutning frn %s till %s misslyckades: %sKonstant bitrateAdresserOmvandlingstest misslyckades, mellan: Omvandla sampelformatOmvandla samplingsfrekvensOmvandlar samplingsfrekvensKopiera markerat omrdeCopyright: %sKunde inte ansluta till JACK-servern.Kunde inte skapa pipe: %sKunde inte skapa sessionsfilKunde inte hitta hemkatalog. Anvnder aktuell katalog som hemkatalog.Kunde inte utlsa filposition i %s: %sKunde inte initiera SDL: %sKunde inte ppna %s: %sKunde inte ppna '%s': %sKunde inte lsa frn %s: %sKunde inte ta bort '%s': %sKunde inte positionera i %s: %sKunde inte koppla upp mot ESD-daemon: %sKunde inte gra forkKunde inte ppna fil %sKraschCtrl+(siffra) Stt mrke Ctrl+A Markera allt Ctrl+C Kopiera Ctrl+D Ta bort Ctrl+E Effekter Ctrl+G Placera markr Ctrl+H Placera markren vid filens brjan Ctrl+J Placera markren vid filens slut Ctrl+K Placera markren vid markeringens brjan Ctrl+L Placera markren vid markeringens slut Ctrl+O ppna fil Ctrl+P Instllningar Ctrl+Q Stt markeringens brjan till markr Ctrl+S Spara fil Ctrl+U Spara markering som Ctrl+V Klistra in Ctrl+W Stt markeringens slut till markr Ctrl+X Klipp ut Ctrl+Z ngra Ctrl+pil Flytta markr (och uppspelning) en halv sekund Aktuell ljuddrivrutin: %sDet gr fr nrvarande inte att spela in och spela upp ljud p samma gng. MarkrMarkr: Markr: spelarEget kommandoargumentEget argument: Annat formatStll in frger...Klipp ut markerat omrdeKlipp ut, kopiera och klistra in flyttar data utan att ndra i det, s de snker normalt inte ljudkvaliteten. P grund av nivskillnader kan man f ett litet "steg" vid brjan och slutet p den inklistrade delen, vilket kan orsaka ett litet klickljud. DC-skiftDecay Decay integrationstid: AvkodarFrdrjning (ms) Frdrjning: Ta bort markeratTa bort markeringenDjup (ms) Djup: UtkanalTa bortGrns fr diskredigering: Visa t_ider som: Distribuerad under GNU General Public License. Fr mer information, se filen COPYINGndra inte datat (fr att reparera felaktiga filer)NerDummy (inget ljud)ESD-instllningarVarje mhWaveEdit-process skapar en sessionsfil i .mhwaveedit-katalogen. Den har namn p formen mhwaveedit-session---, dr r ett ID-nummer och r en bokstav som talar om vilket tillstnd sessionen r i ('r' betyder att den r igng). Data frn tidigare sessioner hittades. Vlj en session att terstlla eller pbrja en ny session.EarwaxEkoEkosekvensRedigeringEffekten %s innehller felaktig port %sEffekterAktivera _dithering fr redigeringAktivera uppspelning med _variabel hastighetAktivera dithering fr uppspelningKodningstyp: Slut:Endian-typ: Fel vid ndring at omvandlingsratio: %s Fel vid stngning av %s: %sFel vid omvandling av samplingsfrekvens: %s Fel vid skapande av lnk till '%s': %sFel vid skapande av pipeFel i ljuddrivrutin: ioctl misslyckades: %sFel i ljuddrivrutin: read misslyckades: %sFel i ljuddrivrutin: select misslyckades: %sFel i ljuddrivrutin: write misslyckades: %sFel vid uppstart av omvandling av samplingsfrekvens: %sFel vid start av mixerprogram: fork: %sFel vid ppnande av ALSA-enhet '%s' fr uppspelning: %sFel vid ppnande av ALSA-enhet '%s' fr inspelning: %sFel vid ppning av sessionskatalogFel vid lsning av %s: %sFel vid lsning frn %s: %sFel vid lsning frn underprocess: %sFel vid lsning av utdata frn soxFel vid krning av 'sox -h': %s Fel vid positionering i %s: %sFel vid skrivning till underprocess: %sFel: %sFel: fork: %sEsounD-drivrutin: readEsounD-drivrutin: selectEsounD-drivrutin: writeEsounD: Kunde inte ppna uppspelningsstrmEsounD: Kunde inte ppna inspelningsstrmEsound-uppkoppling stngd av serverven om mhWaveEdit frn brjan byggdes fr att redigera wav-filer kan man ocks ladda in och spara filer i ett antal andra format. Wav och raw-filer stds alltid, men om mhWaveEdit kompilerats med libsndfile-biblioteket, stds ett antal andra format ocks. Hndelsedriven I/OAvslutaMan mste skriva namnet p drivrutinen efter --driver-flagganExtrem (hgre kvalitet)F1 Hjlp F12 Spela in Faktor: Fade: CosHammingLinjrTrapezoidMisslyckades med att ppna '%s'!Misslyckades att skriva till '%s'!Frbttringsfrslag och nya ider r ocks vlkomna, skicka dem till maillistan eller buggrapporteringssystemet. Filen finns redan. Vill du erstta den?FilformatFiltyp: FilerFiltertyp: Berkna toppvolymSker efter nollnivSlutfrFrst och frmst, leta efter fel och buggar och rapportera alla fel du hittar i buggrapporteringssystemet eller via e-mail. Ibland kan en bugg finnas lnge utan att upptckas, s tveka inte att rapportera ven om problemet funnits i flera versioner tillbaka. Du mste inte ha lsningar eller detaljerad information, ven om det underlttar. FlangerFlyttalsformat, dubbelFlyttalsformat, normalFr buggrapporter, uppdaterade versttningar, patchar och PayPal-donationer: Format ej valtFrekvens: AllmntH,J Flytta markr (och uppspelning) 1/8 vy Datahuvud bytes: MycketHjlp tillHgt 6dB-hrn: HgpassHgpassfilter (enkelpol)S hr skapar man en backtrace: HzI,O Flytta markren till nrmaste nollniv fr ngon kanal Om en versttning r ofullstndig s fr du grna verstta de terstende icke-versatta meddelandena och skicka in dem. Rttelser tas ocks emot, men de kan behva godknnas av tidigare versttare om han eller hon gr att n. Om programmet MPlayer r installerat s kan mhWaveEdit ppna alla filer som det stder, till exempel ljudet till videoklipp. Eftersom mplayer bara r en spelare s kan man inte spara tillbaka filen, utan man fr spara filen i ngot annat format. Om markren brjar rulla fr tidigt nr man hoppar, ska denna frdrjning kas.Om du hittar ett fel i programmet som inte nmnts i BUGS-filen, maila en buggrapport till: magnus.hjorth@home.se Om du pratar ngot sprk som mhWaveEdit inte har blivit versatt till nnu s kan du bidra med en versttning till det sprket. Fr att gra detta, kopiera filen mhwaveedit.pot i po-katalogen till en ny fil ll.po, dr ll r en sprkkod (se http://www.gnu.org/software/gettext/manual/html_node/gettext_221.html fr en lista med sdana koder.) Ignorerar extrema sparade vrden fr lge/storlek p fnster Om programmet kraschar, maila inte ngra core-filer till mig. De har jag ingen anvndning fr. Skapa istllet en "backtrace" som talar om var programmet kraschade. I vyn finns en gr linje som kallas 'markr'. Nr man spelar upp en ljudfil fljer markren efter ljudvgen. Med hger musknapp s kan man placera markren dr man vill i filen. Detta kan gras ven under tiden man spelar upp ljudfilen, d kommer uppspelningen hoppa till den nya positionen. Man kan ocks placera markren mer exakt genom att anvnda 'Placera markr...' i Redigera-menyn Startvolym: InmatningInfrstrkning: Ingngsniv (dB)IngngsniverGalen (hgsta kvalitet)Infoga tystnadGrnssnittInterpolering: KubiskLinjrFelaktigt drivrutinsnamn: %s Anvnder drivrutinen "%s" i stlletFelaktigt antal inportar.Felaktigt antal utportar.Ogiltigt sampelformat eller antal kanaler fr detta filformatFelaktigt tidsvrde. Tid mste anges p formen (TT')MM:SS(.mmmm)Det gr att redigera po-filer fr hand, men jag rekommenderar att du anvnder ett program som poEdit (http://www.poedit.org). Jack-instllningarHoppfrdrjning:K,L Flytta markr ett sampel Behll nuvarande data i kanaler som ej kopplats till ngon utportBehll huvudfnstret ovanfr efter genomfrd effektKortkommandonV ljudvgLadspa: Fel vid genomskning av %sppna mixerVnsterverblivna filerNiv: Begrnsarens frstrkning: Little-endianLittle-endianLadda filLadda in en fil frn diskLaddarOm man laddar in och sedan sparar filer i icke frlustfria format (som mp3 eller ogg) tappar man lite i kvalitet, ven fr de delar av filen som inte redigerats.Loopa (spela om och om igen)Lgt 6dB-hrn: LgpassLgpassfilter (enkelpol)Instllningar fr MP3-exportMaillista (du mste bli medlem innan du postar): KopplingFlytta kanalerMrkenMaskeringsbrusMeddelandeMetod: Mi_xerprogram: Microsoft WAV-formatMildMixarMixar kanalerModulering SinusoidTriangulrMono-Namn: Ny samplingsfrekvens: NejInga fel upptcktes!Det finns ingen fil med det namnet!Brusig metodIngenNormalisera till...I de texter som ser ut som "RecordStatus|Paused" s ska man ignorera det som str till vnster och bara verstta det som str till hger, dvs "Paused" i detta exempel. Denna konvention anvnds nr samma ord kan betyda olika saker beroende p sammanhanget. Antal portar (0-8): Antal nyligen ppnade filer i Arkivmenyn: OKOSS-instllningarOgg VorbisP denna dator krvs libsndfile fr att man ska kunna spara wav-filer i flyttalsformat.ppna med MPlayervrigtStorlek p utdata_buffert:Antal utkanaler: Frn kommandot '%s': Utfrstrkning: Utgngsniv (dB)Over/underrun i JACK-drivrutinAntal overrun: Pa_OpenStream misslyckades: %s Klistra in vid markrenKlistra in, skriv ver vid markrenPausa inspelningToppbegrnsningHgsta topp: Topp: PhaserFiltrera genom programJustera tonlgePlacera markr Spela _mono-filer som stereoSpela frn markrpositionSpela markerat omrdeUppspelningDevice-fil fr uppspelning: Uppspelningsenhet: UppspelningAtt spela upp en fil r enkelt, bara ladda filen och tryck p spelaknappen. Den grna spelaknappen spelar frn nuvarande markrposition. Den gula spelar aktuell markering eller hela filen om ingenting r markerat. Stoppa uppspelningen med stoppknappen. Port #%dPlacera markrEfterbearbetningsfrstrkning: InstllningarFrbereder tester..Instllningar: Kr kommandoBearbetar dataArbetsvisareProjektsida med buggrapporteringssystem, mailinglistmedlemskap med mera: KvalitetKvalitet: H ljudvgRMS: Grnstest misslyckades fr format: PCM rdataRedo fr inspelningSpela inPausadSpelar inInspelningDevice-fil fr inspelning: Inspelningsenhet: Inspelning startas med 'Spela in...' p Spela-menyn, eller inspelningsknappen (den rda cirkeln). En dialogruta dyker upp dr man kan vlja vilket format man ska spela in. Efter att ha valt format dyker mtare och nummer upp som visar information om volymniv p insignalen. InspelningsinstllningarInspelningsstatus: Gr om den senast ngrade tgrdenNollstll hgsta toppvrdenFortstt inspelningterstllReverbReverbtid: BaklngesHgerKr tester..SDL (endast uppspelning)SDL: Kunde inte ppna ljuduppspelning: %sSampelformat som kan anvndas om ljudfilens format inte stds.Sampelformat: Samplingsfrekvens: Upprepa/skippa sampel (lg kvalitet)Sampeltyp: VySpara filSpara ndrad fil %s?Spara markering som ...Spara aktuell fil till diskSpararSekunder med tystnad: Val av ESD-server att ansluta till grs genom miljvariabeln ESPEAKER.MarkeringMarkering: %s+%sSnd wav-huvudSessionerSttAnvnd detta formatStt slut p markeringen till markrpositionenStt start p markeringen till markrpositionenSkiftmngd: Borde inte n denna punktBorde inte n denna punkt!Visa _horisontell zoom-instllning som standardVisa hastighet_sinstllning som standardVisa _tidsskala som standardVisa _vertikal zoom-instllning som standardMed teckenTecken: Sinc-fnstrat filterSoX stngde uppkopplingen fr tidigt!Lite information om ljudkvalitet. Programmet mste startas om fr att vissa ndrade instllningar ska aktiverasLjudLjuddata lagras normalt som heltalsvrden. Drfr sker det avrundningar nr man normaliserar, justerar volym, omvandlar mellan format eller filtrerar ljud p olika stt. Om man anvnder 24- eller 32-bitars sampelstorlek s mrks inte avrundningen, men anvnder man 8 eller 16 bitar orsakar avrundningen en hrbar kvalitetssnkning. InkanalSox-std kunde inte initierasHastighetHastighet (Hz) Vid redigering: Hastighet:Hastighet: Standard (hg kvalitet)Ny sessionStarta inspelningStart:StereoStoppa uppspelningSunAudio: Kunde inte ppna fil %sSunAudio: Fel vid lsning frn ljudenhetSunAudio: Fel vid skrivning till ljudenhetSparadAnvndning: %s [filer] Temporra filer lagras ocks normalt i ~/.mhwaveedit-katalogen. Vilka kataloger som skall anvndas kan man vlja genom Instllningar-fnstret. Fr att f s bra prestanda som mjligt, anvnd en katalog fr varje lokalt filsystem. Temporra filer har namn p formen "mhwaveedit-temp--nnnn-". ppna INTE och ta INTE bort temporra filer medan mhWaveEdit krs. Test av omvandlingsfunktioner misslyckades.Testar omvandlingsfunktioner:'Skr ut' tar bort allt utom markeringen. 'Klipp ut' och 'Kopiera' fungerar som i de flesta andra program. 'Klistra in till ny' ppnar ett nytt fnster och lgger in urklippets innehll. 'Mixa in'-funktionen mixar ihop urklippets data och datat vid markren. 'Klistra in' infogar urklippets innehll vid markren. 'Klistra ver' fungerar som 'Klistra in', fast det skriver ver datat som ligger framfr markren. 'Tysta markering' byter ut markerat omrde mot tystnad. Fr att undvika klick s grs tystnaden som en linje mellan ndpunkterna. Den yta i fnstret dr du ser ljudfilen som ppnats kallas fr vyn. ndringen av klientnamn kommer inte genomfras frrn du startat om programmet.Instllningsfilen kallas config. Den kan redigeras fr hand med en texteditor, men det enklaste sttet r genom "Instllningar" p Redigera-menyn. Filen %s finns inte!Filen %s r en komprimerad wav-fil. Detta program kan bara arbeta med okomprimerade wav-filer.Filen %s r inte en normal fil!Filen %s kan ha skadats d sparningen misslyckades. Frsk att frigra utrymme p hrddisken och spara igen. Om du avslutar nu kan filens innehll bli skadat.Filen har inte ndrats sedan den sparades sist. Tryck OK om du vill spara den nd.Filnamnet '%s' har en ndelse som programmet inte knner till. Ange i vilket format filen skall sparas.Filerna som tillhrde den kraschade sessionen har terstllts. De filer som inte sparas kommer att raderas. (Detta meddelande visas bara en gng)Formatet p filen '%s' kunde inte knnas igen. Var god ange sampelformat.Den viktigaste regeln nr man hller p med ljud r att inte ndra datat mer n ndvndigt och att behlla originalversionen nr man gr ngon form av bearbetning av ljudfiler. Insignalen bottnade %d gnger.Mixa in-funktionen snker inte kvaliteten om inte topparna blir fr hga och klipps. I s fall fr man ett varningsmeddelande. Mixningen bottnade %d gnger.Uppspelningshastigheten kan regleras med kontrollen lngst till hger. Tecken och endian-ness kan vanligvis lmnas p sina standardvrden, men ska ndras om du inte kan spela in eller fr dligt ljud.Ljudformatet i denna fil kan inte spelas upp.Det finns redan bara en kanal!Det finns mycket du kan gra om du vill hjlpa till med utvecklingen av mhWaveEdit. Effekten pverkar hela filen, inte bara markerat omrdeDenna effekt kunde inte laddas in.Denna effekt har inga alternativ.Detta format stds inte av drivrutinen!Tidkod 24 bilder/sTidkod 25 bilder/s (PAL)Tidkod 29.97 bilder/s (NTSC)Tidkod 30 bilder/sTidsgrns: Inspelad tid: TidsstrckningSampel Tidskalans format: Fr att undvika de avrundningsfel som man fr nr man genomfr mer n en effekt p samma data, kan man anvnda flyttalsformat i de temporra filerna. Detta frbttrar kvaliteten men kar disk och processor-anvndning ngot.Fr att spara en fil med ett annat filformat, vlj "Spara som..." och ndra filtyp i fnstret som kommer upp. verstKunde inte detektera stdda SoX-effekterKunde inte skriva data till %sngra den senaste ndringenOvntat filslut i uppkoppling mot underprocessOvntat slut p filOvntat filslut vid lsning frn %sOknt filformatOknd filtypOknd flagga '%s'Utan teckenUppUppdatera instllningAnvnd standardinstllningarAnvnd snabbare men skrnig metodAnvnd denna instllning som standardAnvnder dubbelprecision vid berkningarVrdet p %s mste vara ett tal mellan %ld och %ldVrdet p '%s' mste vara ett nummer mellan %f och %fVrdet p '%s' fr inte vara ver %fVrdet p '%s' fr inte vara under %fVarierande bitrate (standard)Vid uppspelning:VibroVykvalitet:Vy: [ %s - %s ]Volymndring/rampningVarning: Ovntat fel: %sNr man vill starta inspelningen, tryck knappen "Starta inspelning". Nr inspelningen r klar, tryck "Slutfr"-knappen. Dialogrutan frsvinner d och det inspelade ljudet dyker upp i ett nytt fnster. VitBredd: Fnsterlngd: Fnsterstorlek: Fnsterbredd: Med JACK r det enda inspelningsformat som stds, flyttal, normal precision, %d HzY,U Flytta markren till nrmaste nollniv fr alla kanaler JaDu vill spara en wav-fil som r strre n 2048MB. S stora wav-filer r inte standard, och kan drfr vara olsliga fr vissa program. (denna varning visas bara en gng)Man kan redigera filen medan man spelar. Den senaste versionen av mhWaveEdit finns p: Man kan placera mrken i filen genom att trycka Ctrl och en siffertangent. Gr man detta placeras en linje med motsvarande siffra vid nuvarande markrposition. Man kan sedan flytta markren till denna position genom att bara trycka p siffertangenten. Man kan placera och hoppa till mrken medan uppspelning pgr. Det finns tv stt att ndra en markering. Man kan anvnda markren och knapparna "Start p markeringen till markren" och "Slut p markeringen till markren". Man kan ocks justera markeringen genom att dra markeringens ndpunkter med musen. Du har kopplat mer n en utport till kanal '%s'. Du kan bara koppla en utport till varje kanal.Det finns ingen ppen fil att verkstlla effekten p!Man kan markera ett omrde i filen genom att dra med musen. Det gr sedan att lyssna p det som markerats genom att trycka p "spela markering"-knappen (den gula triangeln) eller vlja "Spela markering" p Spela-menyn Nollniv_Lgg tillStarta uppspelning automatiskt nr man hoppar till mrke_Blddra...Vxla byteordning p spelat ljud (prova om ljudet lter vldigt illa)_Avbryt_Stng_NerRita upp vyn en andra gng med bttre kvalitet_Drivrutin:Hll markren i _centrum nr vyn fljer uppspelningenFortstt _hlla uppspelningen igng vid stopp (fr att undvika klickljud)_OK_Visaterstll placering p ppna _fnster_Ta bort_Instllningar_Upp_Uppdatera positionsinformation medan ljud spelasAnvnd flyttalsformat i temporra filerefter filens brjanefter nuvarande markrpositionefter filens slutefter markerat omrdes slutefter markerat omrdes brjanbytedatahuvudets storlekhttp://gna.org/projects/mhwaveedit http://gna.org/projects/mhwaveedit/ jack_get_ports returnerade NULLhoppfrdrjningmagnus.hjorth@home.se mhWaveEdit-hjlpVid uppstart s kollar mhWaveEdit om det finns ngra vergivna temorra filer och lter i s fall anvndaren ppna upp dem. De kan sedan antingen sparas p riktigt eller slngas. mhWaveEdit skapar en katalog ~/.mhwaveedit dr instllningar lagras. mhWaveEdit har ngra enkla effekter som gr att n under 'Effekter'-menyn. mhWaveEdit har visst std fr mp3- och ogg-filer. Fr att detta ska fungera mste du ha LAME installerat fr mp3, och OggDec/OggEnc fr Ogg-std. Finns dessa program kan man ppna och spara mp3/ogg-filer. mhWaveEdit r ett grafiskt program fr att redigera ljudfiler. Programmet r fri programvara som distribueras under GPL-licens. mhWaveEdit: mhWaveEdit: %s (%s): %d Hz, %smhWaveEdit: %s: %s mhwaveedit-discuss@gna.org msantal nyligen ppnade filerputenv misslyckades!samplingsfrekvenssampelsampel/pixelsekundersnd_pcm_hw_param_set_access misslyckadessnd_pcm_hw_params_set_channels misslyckadessnd_pcm_hw_params_set_format misslyckadessnd_pcm_hw_params_set_rate misslyckadessound-portaudio: Inga inenheter tillgngliga!sound-portaudio: Inga utenheter tillgngliga!unsetenv misslyckades!namnls #%dmhwaveedit-1.4.24/po/sv.po000066400000000000000000003125301334022513400153460ustar00rootroot00000000000000# Swedish translation for mhWaveEdit # Copyright (C) 2005 Magnus Hjorth # This file is distributed under the same license as the mhWaveEdit package. # Magnus Hjorth , 2005. # msgid "" msgstr "" "Project-Id-Version: mhWaveEdit 1.3.8\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-08-25 11:56+0200\n" "PO-Revision-Date: 2009-12-29 00:16+0100\n" "Last-Translator: Magnus Hjorth \n" "Language-Team: Swedish \n" "Language: sv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ISO-8859-1\n" "Content-Transfer-Encoding: 8bit\n" #: src/chunk.c:199 msgid "Converting samplerate" msgstr "Omvandlar samplingsfrekvens" #: src/chunk.c:226 msgid "Adjusting speed" msgstr "ndrar hastighet" #: src/chunk.c:703 msgid "Mixing" msgstr "Mixar" #: src/chunk.c:758 #, c-format msgid "The mixed result was clipped %d times." msgstr "Mixningen bottnade %d gnger." #: src/chunk.c:822 msgid "Combining channels" msgstr "Kombinerar kanaler" #: src/chunk.c:1083 msgid "Mixing channels" msgstr "Mixar kanaler" #: src/chunk.c:1471 msgid "Calculating peak level" msgstr "Berknar toppniv" #: src/chunk.c:1542 src/chunk.c:1552 src/chunk.c:1590 src/chunk.c:1600 msgid "Finding zero-crossing" msgstr "Sker efter nollniv" #: src/chunk.c:1628 #, c-format msgid "Amplifying (by %3.1f%% / %+.1fdB)" msgstr "Frstrker (med %3.1f%% / %+.1fdB)" #: src/chunk.c:1669 msgid "Amplifying" msgstr "Frstrker" #: src/chunk.c:1867 #, c-format msgid "The input was clipped %d times during processing." msgstr "Insignalen bottnade %d gnger." #: src/configdialog.c:65 msgid "number of recent files" msgstr "antal nyligen ppnade filer" #: src/configdialog.c:66 #, fuzzy msgid "maximum vertical zoom" msgstr "/Visa/_Vertikal zoom" #: src/configdialog.c:80 msgid "" "Some of the settings you have changed will not be activated until you " "restart the program" msgstr "" "Programmet mste startas om fr att vissa ndrade instllningar ska aktiveras" #: src/configdialog.c:292 msgid "Colors" msgstr "Frger" #: src/configdialog.c:329 msgid "_Preview" msgstr "_Visa" #: src/configdialog.c:336 src/configdialog.c:1204 msgid "_OK" msgstr "_OK" #: src/configdialog.c:353 msgid "_Cancel" msgstr "_Avbryt" #: src/configdialog.c:430 msgid "Browse directory" msgstr "Vlj katalog" #: src/configdialog.c:480 msgid "Preferences" msgstr "Instllningar" #: src/configdialog.c:539 msgid "Show _time scale by default" msgstr "Visa _tidsskala som standard" #: src/configdialog.c:549 msgid "Show _horizontal zoom slider by default" msgstr "Visa _horisontell zoom-instllning som standard" #: src/configdialog.c:559 msgid "Show _vertical zoom slider by default" msgstr "Visa _vertikal zoom-instllning som standard" #: src/configdialog.c:569 msgid "Show _speed slider by default" msgstr "Visa hastighet_sinstllning som standard" #: src/configdialog.c:579 #, fuzzy msgid "Show slider l_abels by default" msgstr "Visa hastighet_sinstllning som standard" #: src/configdialog.c:589 #, fuzzy msgid "Show playback buffer positio_n by default" msgstr "" #: src/configdialog.c:598 msgid "_Settings" msgstr "_Instllningar" #: src/configdialog.c:608 msgid "_Keep sound driver opened (to avoid start/stop clicks)" msgstr "" "Fortstt _hlla uppspelningen igng vid stopp (fr att undvika klickljud)" #: src/configdialog.c:617 msgid "_Byte-swap output (try this if playback sounds horrible)" msgstr "Vxla byteordning p spelat ljud (prova om ljudet lter vldigt illa)" #: src/configdialog.c:626 msgid "Play _mono files as stereo" msgstr "Spela _mono-filer som stereo" #: src/configdialog.c:634 msgid "_Update cursor information while playing" msgstr "_Uppdatera positionsinformation medan ljud spelas" #: src/configdialog.c:642 msgid "_Keep cursor in center of view when following playback" msgstr "Hll markren i _centrum nr vyn fljer uppspelningen" #: src/configdialog.c:652 msgid "_Auto-start playback when jumping to mark" msgstr "Starta uppspelning automatiskt nr man hoppar till mrke" #: src/configdialog.c:660 msgid "Enable _variable speed playback" msgstr "Aktivera uppspelning med _variabel hastighet" #: src/configdialog.c:669 msgid "Auto-_reset speed" msgstr "Stll _tillbaka hastigheten till normal varje gng spelning startas" #: src/configdialog.c:676 msgid "Use fast and noisy method" msgstr "Anvnd snabbare men skrnig metod" #: src/configdialog.c:684 msgid "(H')MM:SS.t" msgstr "(T')MM:SS.t" #: src/configdialog.c:685 msgid "(H')MM:SS.mmmm" msgstr "(T')MM:SS.mmmm" #: src/configdialog.c:686 msgid "TimeDisplay|Samples" msgstr "Sampel" #: src/configdialog.c:687 msgid "Time Code 24fps" msgstr "Tidkod 24 bilder/s" #: src/configdialog.c:688 msgid "Time Code 25fps (PAL)" msgstr "Tidkod 25 bilder/s (PAL)" #: src/configdialog.c:689 msgid "Time Code 29.97fps (NTSC)" msgstr "Tidkod 29.97 bilder/s (NTSC)" #: src/configdialog.c:690 msgid "Time Code 30fps" msgstr "Tidkod 30 bilder/s" #: src/configdialog.c:703 msgid "_Remember window sizes/positions" msgstr "terstll placering p ppna _fnster" #: src/configdialog.c:712 msgid "_Draw waveform a second time with improved quality" msgstr "Rita upp vyn en andra gng med bttre kvalitet" #: src/configdialog.c:742 msgid "_Remove" msgstr "_Ta bort" #: src/configdialog.c:750 msgid "_Add" msgstr "_Lgg till" #: src/configdialog.c:757 msgid "_Browse..." msgstr "_Blddra..." #: src/configdialog.c:764 msgid "_Up" msgstr "_Upp" #: src/configdialog.c:772 msgid "_Down" msgstr "_Ner" #: src/configdialog.c:788 msgid "Keep main _window in front after applying effect" msgstr "Behll huvudfnstret ovanfr efter genomfrd effekt" #: src/configdialog.c:804 msgid "_Use floating-point temporary files" msgstr "Anvnd flyttalsformat i temporra filer" #: src/configdialog.c:813 msgid "Enable _dithering for editing" msgstr "Aktivera _dithering fr redigering" #: src/configdialog.c:821 msgid "Enable dithering for _playback" msgstr "Aktivera dithering fr uppspelning" #: src/configdialog.c:829 msgid "Auto dete_ct driver on each start-up" msgstr "Sk rtt drivrutin automatiskt vid programstart" #: src/configdialog.c:842 msgid "Direct access" msgstr "" #: src/configdialog.c:843 msgid "Decompress" msgstr "" #: src/configdialog.c:844 #, fuzzy msgid "Bypass" msgstr "Bandpass" #: src/configdialog.c:855 msgid "Biased" msgstr "" #: src/configdialog.c:856 msgid "Pure-Scaled" msgstr "" #: src/configdialog.c:873 msgid "Interface" msgstr "Grnssnitt" #: src/configdialog.c:874 msgid " Main window " msgstr "Huvudfnster" #: src/configdialog.c:885 msgid "Number of recent files in File menu: " msgstr "Antal nyligen ppnade filer i Arkivmenyn: " #: src/configdialog.c:890 msgid " View " msgstr " Vy " #: src/configdialog.c:901 msgid "Customize co_lors..." msgstr "Stll in frger..." #: src/configdialog.c:908 msgid " Window contents " msgstr " Fnstrets innehll " #: src/configdialog.c:925 #, fuzzy msgid "Vertical zoom limit: " msgstr "/Visa/_Vertikal zoom" #: src/configdialog.c:929 msgid "x" msgstr "" #: src/configdialog.c:935 msgid "Sound" msgstr "Ljud" #: src/configdialog.c:936 msgid " Driver options " msgstr " Drivrutinsinstllningar " #: src/configdialog.c:944 msgid "_Driver:" msgstr "_Drivrutin:" #: src/configdialog.c:961 msgid " Fallback format " msgstr " Backupformat " #: src/configdialog.c:966 msgid "Sample format to try when the sound file's format isn't supported." msgstr "Sampelformat som kan anvndas om ljudfilens format inte stds." #: src/configdialog.c:978 msgid "Playback" msgstr "Uppspelning" #: src/configdialog.c:980 msgid " Playback settings " msgstr " Uppspelningsinstllningar " #: src/configdialog.c:992 msgid " Variable speed " msgstr " Variabel hastighet " #: src/configdialog.c:1007 src/help.c:38 msgid "Files" msgstr "Filer" #: src/configdialog.c:1009 msgid " Temporary file directories " msgstr " Kataloger fr temporra filer " #: src/configdialog.c:1035 msgid " Temporary file settings " msgstr " Instllningar fr temporra filer " #: src/configdialog.c:1040 msgid "" "To avoid rounding errors when applying more than one effect on the same " "data, floating-point temporary files can be used. However, this will " "increase disk and CPU usage." msgstr "" "Fr att undvika de avrundningsfel som man fr nr man genomfr mer n en " "effekt p samma data, kan man anvnda flyttalsformat i de temporra filerna. " "Detta frbttrar kvaliteten men kar disk och processor-anvndning ngot." #: src/configdialog.c:1048 msgid "" "Some versions of libsndfile supports accessing Ogg files without " "decompressing to a temporary file." msgstr "" #: src/configdialog.c:1062 src/help.c:36 msgid "Quality" msgstr "Kvalitet" #: src/configdialog.c:1064 msgid " Rate conversions " msgstr " Hastighetsomvandlingar " #: src/configdialog.c:1071 msgid "Varispeed: " msgstr "Vid uppspelning:" #: src/configdialog.c:1072 msgid "Speed effect: " msgstr "Vid redigering: " #: src/configdialog.c:1079 msgid " Dithering " msgstr "Dithering" #: src/configdialog.c:1090 #, fuzzy msgid " Sample conversion " msgstr " Hastighetsomvandlingar " #: src/configdialog.c:1097 msgid "Normalization mode: " msgstr "" #: src/configdialog.c:1104 msgid "Other" msgstr "vrigt" #: src/configdialog.c:1106 msgid " Time format " msgstr " Tidsformat " #: src/configdialog.c:1115 msgid "Display t_imes as: " msgstr "Visa t_ider som: " #: src/configdialog.c:1126 msgid "Times_cale format: " msgstr " Tidskalans format: " #: src/configdialog.c:1137 msgid " External applications " msgstr " Externa program " #: src/configdialog.c:1145 msgid "Mi_xer utility: " msgstr "Mi_xerprogram: " #: src/configdialog.c:1155 msgid "Advanced" msgstr "Avancerat" #: src/configdialog.c:1156 msgid " Advanced settings " msgstr " Avancerade instllningar " #: src/configdialog.c:1164 msgid "Disk editing _threshold: " msgstr "Grns fr diskredigering: " #: src/configdialog.c:1175 msgid "View _quality:" msgstr "Vykvalitet:" #: src/configdialog.c:1181 msgid "samples/pixel" msgstr "sampel/pixel" #: src/configdialog.c:1187 msgid "Output _buffer size:" msgstr "Storlek p utdata_buffert:" #: src/configdialog.c:1193 msgid "bytes" msgstr "byte" #: src/configdialog.c:1218 msgid "_Close" msgstr "_Stng" #: src/dataformat.c:886 #, fuzzy, c-format msgid "Floating-point (single %s)\n" msgstr "Flyttal (normal)" #: src/dataformat.c:886 src/dataformat.c:888 src/dataformat.c:892 msgid "Big-endian" msgstr "Big-endian" #: src/dataformat.c:886 src/dataformat.c:888 src/dataformat.c:892 msgid "Little-endian" msgstr "Little-endian" #: src/dataformat.c:888 #, fuzzy, c-format msgid "Floating-point (double %s)\n" msgstr "Flyttal (dubbel)" #: src/dataformat.c:890 #, fuzzy, c-format msgid "PCM, %d(%d) bit, %s %s\n" msgstr "PCM, %d bitar, %s %s\n" #: src/dataformat.c:891 src/formatselector.c:77 msgid "Signed" msgstr "Med tecken" #: src/dataformat.c:891 src/formatselector.c:76 msgid "Unsigned" msgstr "Utan tecken" #: src/dataformat.c:952 #, fuzzy msgid " Testing ranges..." msgstr "Testar grnser..." #: src/dataformat.c:976 msgid "Range test failed for format: " msgstr "Grnstest misslyckades fr format: " #: src/dataformat.c:990 #, fuzzy msgid " Testing all conversions.." msgstr "Testar alla omvandlingar..." #: src/dataformat.c:1032 msgid "(expected) " msgstr "(frvntat) " #: src/dataformat.c:1033 msgid "Conversion test failed, between: " msgstr "Omvandlingstest misslyckades, mellan: " #: src/dataformat.c:1035 msgid " and: " msgstr " och: " #: src/dataformat.c:1112 msgid "No errors detected!" msgstr "Inga fel upptcktes!" #: src/dataformat.c:1146 msgid "Preparing tests.." msgstr "Frbereder tester.." #: src/dataformat.c:1154 msgid "Running tests.." msgstr "Kr tester.." #: src/dataformat.c:1196 #, c-format msgid "" "\n" "\n" "Test results (1 time unit = %f usec/sample)\n" msgstr "" "\n" "\n" "Testresultat (1 tidsenhet = %f mikrosekunder/sampel\n" #: src/datasource.c:366 #, c-format msgid "Couldn't open %s" msgstr "Kunde inte ppna fil %s" #: src/datasource.c:497 msgid "Unexpected end of file" msgstr "Ovntat slut p fil" #: src/datasource.c:498 #, c-format msgid "Error reading %s: %s" msgstr "Fel vid lsning av %s: %s" #: src/datasource.c:515 #, c-format msgid "Error seeking in %s: %s" msgstr "Fel vid positionering i %s: %s" #: src/effectbrowser.c:99 msgid "Built-in" msgstr "Inbyggd" #: src/effectbrowser.c:102 msgid "Volume adjust/fade" msgstr "Volymndring/rampning" #: src/effectbrowser.c:104 msgid "Convert samplerate" msgstr "Omvandla samplingsfrekvens" #: src/effectbrowser.c:106 msgid "Convert sample format" msgstr "Omvandla sampelformat" #: src/effectbrowser.c:108 msgid "Map channels" msgstr "Flytta kanaler" #: src/effectbrowser.c:110 msgid "Combine channels" msgstr "Kombinera kanaler" #: src/effectbrowser.c:113 msgid "Add channels from other file" msgstr "Lgg till kanaler frn annan fil" #: src/effectbrowser.c:114 msgid "Speed" msgstr "Hastighet" #: src/effectbrowser.c:115 msgid "Pipe through program" msgstr "Filtrera genom program" #: src/effectbrowser.c:250 msgid "You have no open file to apply the effect to!" msgstr "Det finns ingen ppen fil att verkstlla effekten p!" #: src/effectbrowser.c:275 msgid "This effect could not be loaded." msgstr "Denna effekt kunde inte laddas in." #: src/effectbrowser.c:582 msgid "/Move Up" msgstr "/Flytta Upp" #: src/effectbrowser.c:583 msgid "/Move Down" msgstr "/Flytta Ner" #: src/effectbrowser.c:584 msgid "/Move to Top" msgstr "/Flytta verst" #: src/effectbrowser.c:585 msgid "/Move to Bottom" msgstr "/Flytta Underst" #: src/effectbrowser.c:587 msgid "/Sort by Name" msgstr "/Sortera efter Namn" #: src/effectbrowser.c:588 msgid "/Sort by Type" msgstr "/Sortera efter Typ" #: src/effectbrowser.c:589 msgid "/Sort by Location" msgstr "/Sortera efter Plats" #: src/effectbrowser.c:590 msgid "/Sort by Author" msgstr "/Sortera efter Frfattare" #: src/effectbrowser.c:592 msgid "/Restore Order" msgstr "/terstll ursprunglig ordning" #: src/effectbrowser.c:593 msgid "/Rebuild Effect List" msgstr "/Bygg om effektlista" #: src/effectbrowser.c:744 msgid "Top" msgstr "verst" #: src/effectbrowser.c:751 msgid "Up" msgstr "Upp" #: src/effectbrowser.c:758 msgid "Down" msgstr "Ner" #: src/effectbrowser.c:765 msgid "Bottom" msgstr "Underst" #: src/effectbrowser.c:793 msgid "Close dialog after applying effect" msgstr "Stng detta fnster efter effekten krts" #: src/effectbrowser.c:800 src/gotodialog.c:154 msgid "Apply" msgstr "Verkstll" #: src/effectbrowser.c:808 src/gotodialog.c:159 src/mainwindow.c:1438 #: src/pipedialog.c:165 src/recorddialog.c:610 src/recorddialog.c:987 #: src/sound-esound.c:290 src/sound-jack.c:264 src/sound-oss.c:479 msgid "Close" msgstr "Stng" #: src/effectbrowser.c:830 src/help.c:35 msgid "Effects" msgstr "Effekter" #: src/effectbrowser.c:892 msgid "Apply to: " msgstr "Verkstll p: " #: src/filetypes.c:103 msgid "putenv failed!" msgstr "putenv misslyckades!" #: src/filetypes.c:113 msgid "unsetenv failed!" msgstr "unsetenv misslyckades!" #: src/filetypes.c:155 msgid "Microsoft WAV format" msgstr "Microsoft WAV-format" #: src/filetypes.c:181 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: src/filetypes.c:188 msgid "Raw PCM data" msgstr "PCM rdata" #: src/filetypes.c:190 msgid "Open with MPlayer" msgstr "ppna med MPlayer" #: src/filetypes.c:275 #, c-format msgid "The file %s does not exist!" msgstr "Filen %s finns inte!" #: src/filetypes.c:282 #, c-format msgid "The file %s is not a regular file!" msgstr "Filen %s r inte en normal fil!" #: src/filetypes.c:294 msgid "Loading" msgstr "Laddar" #: src/filetypes.c:333 #, c-format msgid "" "The file name '%s' has an extension unknown to the program. Please specify " "in which format this file should be saved." msgstr "" "Filnamnet '%s' har en ndelse som programmet inte knner till. Ange i vilket " "format filen skall sparas." #: src/filetypes.c:338 msgid "Unknown file type" msgstr "Oknd filtyp" #: src/filetypes.c:389 msgid "Saving" msgstr "Sparar" #: src/filetypes.c:393 #, c-format msgid "" "The file %s may be destroyed since the saving failed. Try to free up some " "disk space and save again. If you exit now the file's contents could be in a " "bad state. " msgstr "" "Filen %s kan ha skadats d sparningen misslyckades. Frsk att frigra " "utrymme p hrddisken och spara igen. Om du avslutar nu kan filens innehll " "bli skadat." #: src/filetypes.c:457 #, c-format msgid "%s is not a valid wav file" msgstr "%s r inte en giltig wav-fil" #: src/filetypes.c:472 #, c-format msgid "" "The file %s is a compressed wav file. This program can only work with " "uncompressed wav files." msgstr "" "Filen %s r en komprimerad wav-fil. Detta program kan bara arbeta med " "okomprimerade wav-filer." #: src/filetypes.c:593 msgid "" "On this system, libsndfile is required to save floating-point wav files." msgstr "" "P denna dator krvs libsndfile fr att man ska kunna spara wav-filer i " "flyttalsformat." #: src/filetypes.c:616 msgid "" "You are saving a wav file larger than 2048MB. Such large files are non-" "standard and may not be readable by all programs.\n" "\n" " (this warning will not be displayed again)" msgstr "" "Du vill spara en wav-fil som r strre n 2048MB. S stora wav-filer r inte " "standard, och kan drfr vara olsliga fr vissa program.\n" "\n" "(denna varning visas bara en gng)" #: src/filetypes.c:732 src/filetypes.c:877 #, c-format msgid "Failed to open '%s'!" msgstr "Misslyckades med att ppna '%s'!" #: src/filetypes.c:849 msgid "Invalid sample format or number of channels for this file format" msgstr "Ogiltigt sampelformat eller antal kanaler fr detta filformat" #: src/filetypes.c:943 #, c-format msgid "Failed to write to '%s'!" msgstr "Misslyckades att skriva till '%s'!" #: src/filetypes.c:1028 msgid "Decoding" msgstr "Avkodar" #: src/filetypes.c:1149 msgid "Variable bitrate (default)" msgstr "Varierande bitrate (standard)" #: src/filetypes.c:1150 msgid "Average bitrate" msgstr "Genomsnittlig bitrate" #: src/filetypes.c:1151 msgid "Constant bitrate" msgstr "Konstant bitrate" #: src/filetypes.c:1152 msgid "Custom argument" msgstr "Eget kommandoargument" #: src/filetypes.c:1156 msgid "Standard (high quality)" msgstr "Standard (hg kvalitet)" #: src/filetypes.c:1157 msgid "Extreme (higher quality)" msgstr "Extrem (hgre kvalitet)" #: src/filetypes.c:1158 msgid "Insane (highest possible quality)" msgstr "Galen (hgsta kvalitet)" #: src/filetypes.c:1176 #, c-format msgid "%s kbit/s" msgstr "%s kbit/s" #: src/filetypes.c:1205 msgid "MP3 Preferences" msgstr "Instllningar fr MP3-export" #: src/filetypes.c:1216 msgid "Encoding type: " msgstr "Kodningstyp: " #: src/filetypes.c:1229 msgid "Quality: " msgstr "Kvalitet: " #: src/filetypes.c:1238 msgid "Custom argument: " msgstr "Eget argument: " #: src/filetypes.c:1244 msgid "Use this setting by default" msgstr "Anvnd denna instllning som standard" #: src/filetypes.c:1249 src/gotodialog.c:146 src/mainwindow.c:1509 #: src/rawdialog.c:101 src/sound-alsalib.c:98 src/sound-esound.c:286 #: src/sound-jack.c:260 src/sound-oss.c:475 src/um.c:109 src/um.c:142 #: src/um.c:341 src/um.c:449 msgid "OK" msgstr "OK" #: src/filetypes.c:1257 src/rawdialog.c:107 src/sound-alsalib.c:102 #: src/um.c:133 src/um.c:150 src/um.c:347 src/um.c:458 msgid "Cancel" msgstr "Avbryt" #: src/float_box.c:184 src/int_box.c:184 #, c-format msgid "'%s' is not a number!" msgstr "'%s' r inte ett nummer!" #: src/float_box.c:202 #, c-format msgid "Value for '%s' must be a number between %f and %f" msgstr "Vrdet p '%s' mste vara ett nummer mellan %f och %f" #: src/formatselector.c:60 msgid "Sample type: " msgstr "Sampeltyp: " #: src/formatselector.c:62 msgid "8 bit PCM" msgstr "8-bitars PCM" #: src/formatselector.c:63 msgid "16 bit PCM" msgstr "16-bitars PCM" #: src/formatselector.c:64 msgid "24 bit PCM" msgstr "24-bitars PCM" #: src/formatselector.c:65 msgid "32 bit PCM" msgstr "32-bitars PCM" #: src/formatselector.c:66 msgid "Floating-point, single" msgstr "Flyttalsformat, normal" #: src/formatselector.c:67 msgid "Floating-point, double" msgstr "Flyttalsformat, dubbel" #: src/formatselector.c:74 msgid "Signedness: " msgstr "Tecken: " #: src/formatselector.c:82 msgid "Endianness: " msgstr "Endian-typ: " #: src/formatselector.c:84 msgid "Little endian" msgstr "Little-endian" #: src/formatselector.c:85 msgid "Big endian" msgstr "Big-endian" #: src/formatselector.c:90 #, fuzzy msgid "Alignment:" msgstr "Positionering" #: src/formatselector.c:92 msgid "Packed" msgstr "" #: src/formatselector.c:93 #, fuzzy msgid "Top bytes" msgstr "byte" #: src/formatselector.c:94 #, fuzzy msgid "Bottom bytes" msgstr "Underst" #: src/formatselector.c:130 msgid "Channels: " msgstr "Kanaler: " #: src/formatselector.c:139 msgid "Sample rate: " msgstr "Samplingsfrekvens: " #: src/formatselector.c:226 msgid "sample rate" msgstr "samplingsfrekvens" #: src/gotodialog.c:102 msgid "Place cursor " msgstr "Placera markr " #: src/gotodialog.c:107 src/sound-esound.c:274 msgid "seconds" msgstr "sekunder" #: src/gotodialog.c:111 src/soxdialog.c:487 msgid "samples" msgstr "sampel" #: src/gotodialog.c:115 msgid "after beginning of file" msgstr "efter filens brjan" #: src/gotodialog.c:120 msgid "after end of file" msgstr "efter filens slut" #: src/gotodialog.c:125 msgid "after current cursor position" msgstr "efter nuvarande markrposition" #: src/gotodialog.c:130 msgid "after selection start" msgstr "efter markerat omrdes brjan" #: src/gotodialog.c:135 msgid "after selection end" msgstr "efter markerat omrdes slut" #: src/gotodialog.c:139 msgid "" "(use a negative number to place the cursor before instead of after the " "selected point)" msgstr "" "(anvnd negativt tal fr att placera markren fre i stllet fr efter vald " "punkt)" #: src/gotodialog.c:178 msgid "Position cursor" msgstr "Placera markr" #: src/gtkfiles.c:48 #, c-format msgid "Could not open %s: %s" msgstr "Kunde inte ppna %s: %s" #: src/gtkfiles.c:53 #, c-format msgid "Warning: Unexpected error: %s" msgstr "Varning: Ovntat fel: %s" #: src/gtkfiles.c:110 src/gtkfiles.c:125 #, c-format msgid "Error closing %s: %s" msgstr "Fel vid stngning av %s: %s" #: src/gtkfiles.c:140 #, c-format msgid "Could not seek in %s: %s" msgstr "Kunde inte positionera i %s: %s" #: src/gtkfiles.c:159 src/gtkfiles.c:204 #, c-format msgid "Could not read from %s: %s" msgstr "Kunde inte lsa frn %s: %s" #: src/gtkfiles.c:178 #, c-format msgid "Unexpected end of file reading from %s" msgstr "Ovntat filslut vid lsning frn %s" #: src/gtkfiles.c:196 #, c-format msgid "Unable to write data to %s" msgstr "Kunde inte skriva data till %s" #: src/gtkfiles.c:262 #, c-format msgid "Could not get file position in %s: %s" msgstr "Kunde inte utlsa filposition i %s: %s" #: src/gtkfiles.c:313 src/gtkfiles.c:473 msgid "File already exists. Overwrite?" msgstr "Filen finns redan. Vill du erstta den?" #: src/gtkfiles.c:321 msgid "No file with that name!" msgstr "Det finns ingen fil med det namnet!" #: src/gtkfiles.c:705 #, c-format msgid "Error reading from %s: %s" msgstr "Fel vid lsning frn %s: %s" #: src/gtkfiles.c:737 #, c-format msgid "Could not remove '%s': %s" msgstr "Kunde inte ta bort '%s': %s" #: src/gtkfiles.c:757 #, c-format msgid "Error creating link to '%s': %s" msgstr "Fel vid skapande av lnk till '%s': %s" #: src/help.c:30 msgid "General" msgstr "Allmnt" #: src/help.c:31 msgid "Sample view" msgstr "Vy" #: src/help.c:32 msgid "Playing" msgstr "Uppspelning" #: src/help.c:33 msgid "Recording" msgstr "Inspelning" #: src/help.c:34 msgid "Editing" msgstr "Redigering" #: src/help.c:37 msgid "File formats" msgstr "Filformat" #: src/help.c:39 msgid "Keyboard shortcuts" msgstr "Kortkommandon" #: src/help.c:40 msgid "Bug reporting" msgstr "Buggrapportering" #: src/help.c:41 msgid "Helping out" msgstr "Hjlp till" #: src/help.c:42 msgid "Contact" msgstr "Adresser" #: src/help.c:47 #, no-c-format msgid "" "mhWaveEdit is a graphical program for editing sound files. It is completely " "free (GPL).\n" msgstr "" "mhWaveEdit r ett grafiskt program fr att redigera ljudfiler. Programmet r " "fri programvara som distribueras under GPL-licens.\n" #: src/help.c:49 #, no-c-format msgid "You can find the latest release of mhWaveEdit at:\n" msgstr "Den senaste versionen av mhWaveEdit finns p:\n" #: src/help.c:50 #, no-c-format msgid "http://gna.org/projects/mhwaveedit/\n" msgstr "http://gna.org/projects/mhwaveedit/\n" #: src/help.c:55 #, no-c-format msgid "" "The area where you 'see' the contents of the file you are editing, is called " "the 'sample view'. \n" msgstr "Den yta i fnstret dr du ser ljudfilen som ppnats kallas fr vyn.\n" #: src/help.c:57 #, no-c-format msgid "" "In the sample view there is a grey vertical bar called the 'cursor'. The " "cursor follows the sound wave when you play the sound. You can position the " "cursor by clicking with the right (2:nd) mouse button. If you do this while " "you're playing a file, the playing will continue from the new cursor " "position. You can also position the cursor more exact by using the 'Position " "Cursor...' command on the Edit menu.\n" msgstr "" "I vyn finns en gr linje som kallas 'markr'. Nr man spelar upp en ljudfil " "fljer markren efter ljudvgen. Med hger musknapp s kan man placera " "markren dr man vill i filen. Detta kan gras ven under tiden man spelar " "upp ljudfilen, d kommer uppspelningen hoppa till den nya positionen. Man " "kan ocks placera markren mer exakt genom att anvnda 'Placera markr...' i " "Redigera-menyn\n" #: src/help.c:59 #, no-c-format msgid "" "You can place marks in your file by holding down Ctrl and pressing a number " "from 0 to 9. This will place a mark (green vertical bar) with the same " "number at the current cursor position. You can later make the cursor go to " "that position again by just pressing the number. Setting and jumping to " "marks can be done while playing. To remove a mark, jump to the mark and set " "it again.\n" msgstr "" "Man kan placera mrken i filen genom att trycka Ctrl och en siffertangent. " "Gr man detta placeras en linje med motsvarande siffra vid nuvarande " "markrposition. Man kan sedan flytta markren till denna position genom att " "bara trycka p siffertangenten. Man kan placera och hoppa till mrken medan " "uppspelning pgr.\n" #: src/help.c:64 #, no-c-format msgid "" "Playing a file is simple, just load the file and press the play button. The " "green play button plays from the current position. The yellow play button " "plays the current selection, or the entire file if nothing is selected. Stop " "the playback with the stop button (with the red square). \n" msgstr "" "Att spela upp en fil r enkelt, bara ladda filen och tryck p spelaknappen. " "Den grna spelaknappen spelar frn nuvarande markrposition. Den gula spelar " "aktuell markering eller hela filen om ingenting r markerat. Stoppa " "uppspelningen med stoppknappen.\n" #: src/help.c:66 #, no-c-format msgid "" "The playback speed can be varied by adjusting the slider to the far right. \n" msgstr "" "Uppspelningshastigheten kan regleras med kontrollen lngst till hger.\n" #: src/help.c:68 #, no-c-format msgid "You can do normal editing while the file is playing.\n" msgstr "Man kan redigera filen medan man spelar.\n" #: src/help.c:73 #, no-c-format msgid "" "Recording is done with 'Record...' on the Play menu, or the Record button " "(the red circle). A dialog box will pop up where you can select what format " "you want to record in. After selecting the format, meters and numbers will " "appear showing info about the volume level of the sound input. \n" msgstr "" "Inspelning startas med 'Spela in...' p Spela-menyn, eller " "inspelningsknappen (den rda cirkeln). En dialogruta dyker upp dr man kan " "vlja vilket format man ska spela in. Efter att ha valt format dyker mtare " "och nummer upp som visar information om volymniv p insignalen.\n" #: src/help.c:75 #, no-c-format msgid "" "When you want to start recording, press the \"Start recording\" button. When " "you've recorded everything you wanted to, press the Finish button and the " "record dialog will disappear and newly recorded sound will show up in a new " "window.\n" msgstr "" "Nr man vill starta inspelningen, tryck knappen \"Starta inspelning\". Nr " "inspelningen r klar, tryck \"Slutfr\"-knappen. Dialogrutan frsvinner d " "och det inspelade ljudet dyker upp i ett nytt fnster.\n" #: src/help.c:77 #, no-c-format msgid "" "Currently it is impossible to play and record at the same time, so the " "playback will stop when you record.\n" msgstr "" "Det gr fr nrvarande inte att spela in och spela upp ljud p samma gng.\n" #: src/help.c:82 #, no-c-format msgid "" "You make selections by dragging the mouse over the sample view. You can hear " "what you've currently selected by clicking on the \"play selection\" button " "(the button with the yellow arrow) or by selecting 'Play selection' from the " "Play menu.\n" msgstr "" "Man kan markera ett omrde i filen genom att dra med musen. Det gr sedan " "att lyssna p det som markerats genom att trycka p \"spela markering\"-" "knappen (den gula triangeln) eller vlja \"Spela markering\" p Spela-menyn\n" #: src/help.c:84 #, no-c-format msgid "" "You can use the cursor to refine the selection. Use the 'Selection start at " "cursor' and 'Selection end at cursor' buttons to move the selection starting " "point or the selection end point to the current cursor position. You can " "also drag the selection endpoints using the mouse.\n" msgstr "" "Det finns tv stt att ndra en markering. Man kan anvnda markren och " "knapparna \"Start p markeringen till markren\" och \"Slut p markeringen " "till markren\". Man kan ocks justera markeringen genom att dra " "markeringens ndpunkter med musen.\n" #: src/help.c:86 #, no-c-format msgid "The 'Cut' and 'Copy' functions work like in any other software. \n" msgstr "'Klipp ut' och 'Kopiera' fungerar som i de flesta andra program.\n" #: src/help.c:88 #, no-c-format msgid "" "The 'Paste' function insert the clipboard contents at the cursor position. " "The 'Paste over' function works like 'Paste', except that it overwrites the " "data after the insert position. \n" msgstr "" "'Klistra in' infogar urklippets innehll vid markren. 'Klistra ver' " "fungerar som 'Klistra in', fast det skriver ver datat som ligger framfr " "markren. \n" #: src/help.c:90 #, no-c-format msgid "" "The 'Paste mix' function combines the clipboard data with the data at the " "cursor position.\n" msgstr "" "'Mixa in'-funktionen mixar ihop urklippets data och datat vid markren.\n" #: src/help.c:92 #, no-c-format msgid "" "The 'Paste as new' function opens a new window and puts the clipboard " "contents into it. \n" msgstr "" "'Klistra in till ny' ppnar ett nytt fnster och lgger in urklippets " "innehll.\n" #: src/help.c:94 #, no-c-format msgid "" "The 'Crop' function deletes all parts of the file that are not selected.\n" msgstr "'Skr ut' tar bort allt utom markeringen.\n" #: src/help.c:96 #, no-c-format msgid "" "The 'Silence selection' function replaces the selected part with silence. To " "avoid clicks, the silent part is a line that meets the wave at the " "endpoints.\n" msgstr "" "'Tysta markering' byter ut markerat omrde mot tystnad. Fr att undvika " "klick s grs tystnaden som en linje mellan ndpunkterna.\n" #: src/help.c:98 #, no-c-format msgid "" "All editing functions work non-destructively, that is, the file you're " "editing isn't actually changed until you save it (the effects also work this " "way).\n" msgstr "" "All redigering och alla effekter sker icke-destruktivt, dvs filen ndras " "inte i verkligheten frrn man sparar.\n" #: src/help.c:104 #, no-c-format msgid "" "mhWaveEdit has a few simple effects, which are available from the 'Effects' " "menu. \n" msgstr "" "mhWaveEdit har ngra enkla effekter som gr att n under 'Effekter'-menyn.\n" #: src/help.c:106 #, no-c-format msgid " * Fade in/out\n" msgstr " * Fade-in/Fade-ut\n" #: src/help.c:108 #, no-c-format msgid " This creates a linear fade in or fade out effect.\n" msgstr " Detta gr en linjr fade-in eller fade-ut p markerat omrde.\n" #: src/help.c:110 #, no-c-format msgid " * Normalize, Normalize to...\n" msgstr " * Normalisera volym\n" #: src/help.c:112 #, no-c-format msgid "" " This amplifies the sound as much as possible without getting clipping " "distortion. The \"Normalize to...\" item lets you specify which level to " "normalize to.\n" msgstr "" " Detta justerar volymen s hgt som gr innan distortion intrffar. " "\"Normalisera till...\" gr samma sak men lter dig vlja vilken niv som de " "hgsta topparna ska ha. \n" #: src/help.c:114 #, no-c-format msgid " * Volume adjust/fade...\n" msgstr " * Volymjustering...\n" #: src/help.c:116 #, no-c-format msgid "" " This effect lets you select a starting volume and a ending volume and " "amplifies the selection fading from the starting volume to the ending " "volume.\n" msgstr "" " Denna effekt lter dig ange start- och slutvolym och \"fade:ar\" " "markeringen. Fr att skapa en fade-ut, vlj startvolym 100% och slutvolym " "0%.\n" #: src/help.c:118 #, no-c-format msgid "" " Note that volumes above 100% may cause sound distortion. Use the 'Find " "top volume' to find out the maximum amplification possible without " "distortion. (You can use this for normalizing samples.) \n" msgstr "" " Frstrkning ver 100% kan orsaka distortion. Anvnd 'Hitta maxvolym'-" "knappen fr att hitta hgsta mjliga frstrkning som gr att f utan " "distortion.\n" #: src/help.c:120 #, no-c-format msgid "" " By setting starting volume and ending volume to the same value you get a " "simple amplification of the sound. \n" msgstr "" " Stter man samma start- och slutvolym fr man en vanlig frstrkning av " "ljudet.\n" #: src/help.c:122 #, no-c-format msgid " * Convert samplerate...\n" msgstr " * Omvandla samplingsfrekvens...\n" #: src/help.c:124 #, no-c-format msgid "" " This converts the samplerate of the entire file to one you specify. There " "are different methods for doing this, usually the one in the top has the " "best quality but can take longer than the other methode.\n" msgstr "" " Denna effekt omvandlar samplingsfrekvensen p aktuell fil. Det finns " "olika metoder att gra detta p, det frsta alternativet i listan har hgst " "kvalitet men kan ta lngre tid n metoderna lngre ner.\n" #: src/help.c:126 #, no-c-format msgid " * Convert sample format...\n" msgstr " * Omvandla sampelformat...\n" #: src/help.c:128 #, no-c-format msgid " This converts the sample format of the entire file.\n" msgstr " Denna effekt omvandlar sampelformatet p filen.\n" #: src/help.c:130 #, no-c-format msgid "" " The 'Don't actually change the data' option can be used if the program " "was wrong about the file's format.\n" msgstr "" " Knappen \"ndra ej datat\" kan anvndas om programmet inte har lst filen " "med rtt format.\n" #: src/help.c:132 #, no-c-format msgid " * Byte swap\n" msgstr " * Vxla byteordning\n" #: src/help.c:134 #, no-c-format msgid "" " This \"byte swaps\" the selected part. It can be used to repair damaged " "files where the byte order is wrong. Note that if the sound looks alright " "but plays wrong, you should not use this option, instead you should use the " "\"byte-swap output\" option in the Preferences dialog.\n" msgstr "" " Denna effekt kan anvndas fr att reparera skadade filer dr " "byteordningen blivit fel. Observera att om ljudfilen ser bra ut p skrmen " "men lter illa nr man spelar den ska man inte anvnda denna effekt, anvnd " "i stllet instllningen \"Vxla byteordning p spelat ljud\" i Instllningar-" "fnstret. \n" #: src/help.c:136 #, no-c-format msgid " * Mix to mono\n" msgstr " * Mixa kanaler\n" #: src/help.c:138 #, no-c-format msgid " This mixes all channels of the file together to a mono sound.\n" msgstr " Mixar ihop alla kanaler i filen till mono.\n" #: src/help.c:140 #, no-c-format msgid " * Add channel\n" msgstr " * Lgg till kanal\n" #: src/help.c:142 #, no-c-format msgid "" " This copies the first channel to a new channel in the sound, converting " "mono to stereo etc.\n" msgstr "" " Delar den frsta kanalen till en ny kanal i ljudet, om ljudet var mono " "blir det stereo.\n" #: src/help.c:144 #, no-c-format msgid " * Map channels...\n" msgstr " * ndra kanaler...\n" #: src/help.c:145 #, no-c-format msgid " \n" msgstr "" " Med denna effekt kan man ndra antalet kanaler i filen. Det gr ocks " "att flytta om och mixa ihop kanaler. \n" #: src/help.c:146 #, no-c-format msgid "" " With this effect, you can change the number of channels in the file. You " "can also rearrange and add (i.e. mix) channels.\n" msgstr " * Kombinera kanaler...\n" #: src/help.c:148 #, no-c-format msgid " * Combine channels...\n" msgstr "" " Med denna effekt gr man en linjrkombination av kanalerna. Genom att " "vlja olika vrden kan man gra mixning, byta plats p kanaler, justera " "balans, frstrking osv. Till exempel, fr att byta plats p vnster och " "hger kanal, ange att nya Kanal 1 ska vara 0% av gamla Kanal 1 och 100% av " "gamla Kanal 2, och nya Kanal 2 ska vara 100% av gamla Kanal 1 och 0% av " "gamla Kanal 2\n" #: src/help.c:150 #, no-c-format msgid "" " This effect lets you create a new sound by a linear combination of the " "old channels. This means you can do channel mixing / swapping / balance / " "panning / amplification etc. by entering different values. For example, to " "swap the left and right channel, you select that the new Channel 1 should be " "0% of the old Channel 1 and 100% of the old Channel 2, and the new Channel 2 " "should be 100% of the old Channel 1 and 0% of the old Channel 2 \n" msgstr " * ndra hastighet...\n" #: src/help.c:152 #, no-c-format msgid " * Speed adjustment...\n" msgstr "" " Med denna effekt ndrar man hastigheten p ljudet. Tonen kommer att " "ndras p samma stt.\n" #: src/help.c:154 #, no-c-format msgid "" " This effect changes the speed of the selection. The tone will change as " "well.\n" msgstr "" "mhWaveEdit stder LADSPA-effekter och kan ocks anvnda de flesta av " "programmet SoX effekter. Fr att programmet ska hitta LADSPA-effekterna " "mste miljvariabeln LADSPA_PATH vara rtt instlld.\n" #: src/help.c:155 #, no-c-format msgid " * Pipe through program...\n" msgstr "" "Alla effekter som stds kan man hitta genom att vlja \"Effektfnster...\" " "p Effekter-menyn. Effekterna listas med namn som brjar p [B] fr inbyggda " "effekter, [L] fr LADSPA-effekter och [S] fr SoX-effekter.\n" #: src/help.c:156 #, no-c-format msgid " \n" msgstr " \n" #: src/help.c:157 #, no-c-format msgid "" " This effect is for advanced users wanting to pipe raw audio data through " "an external program. The output of the program is read back and replaces the " "processed part. \n" msgstr " \n" #: src/help.c:159 #, no-c-format msgid "" "mhWaveEdit supports LADSPA effects and can also make use of most of the SoX " "utility's effects. To find the LADSPA plugins the environment variable " "LADSPA_PATH must be properly set up. \n" msgstr " \n" #: src/help.c:161 #, no-c-format msgid "" "All supported effects can be found by choosing the 'Effects...' menu item. " "The effects are listed with names beginning with [B] for builtin effects, " "[L] for LADSPA effects, and [S] for SoX effects.\n" msgstr " \n" #: src/help.c:167 #, no-c-format msgid "Some notes on sound quality.\n" msgstr "Lite information om ljudkvalitet.\n" #: src/help.c:169 #, no-c-format msgid "" "The general rule when doing audio editing/processing is to not manipulate " "the data more than necessary and keep an original copy whenever you're " "processing your important files. \n" msgstr "" "Den viktigaste regeln nr man hller p med ljud r att inte ndra datat mer " "n ndvndigt och att behlla originalversionen nr man gr ngon form av " "bearbetning av ljudfiler.\n" #: src/help.c:171 #, no-c-format msgid "" "Cut, copy and paste operations move the data around without modifying it, so " "these don't degrade the sound quality. Because of level differences, you may " "get a \"step\" at the start and end of the inserted part, which can cause a " "small clicking sound. \n" msgstr "" "Klipp ut, kopiera och klistra in flyttar data utan att ndra i det, s de " "snker normalt inte ljudkvaliteten. P grund av nivskillnader kan man f " "ett litet \"steg\" vid brjan och slutet p den inklistrade delen, vilket " "kan orsaka ett litet klickljud.\n" #: src/help.c:173 #, no-c-format msgid "" "The mix paste function doesn't decrease quality, unless the peaks become too " "high and you get clipping. In that case you will get a warning message.\n" msgstr "" "Mixa in-funktionen snker inte kvaliteten om inte topparna blir fr hga och " "klipps. I s fall fr man ett varningsmeddelande.\n" #: src/help.c:175 #, no-c-format msgid "" "Sound data is normally stored as integer values. Therefore, whenever you " "normalize, adjust volume, decrease sample size or filter a sound, the result " "must be rounded. If you use 24 or 32 bit sample sizes, this is not really a " "problem, but if you use 8 or 16 bits sample size, this rounding causes a " "decrease in quality. \n" msgstr "" "Ljuddata lagras normalt som heltalsvrden. Drfr sker det avrundningar nr " "man normaliserar, justerar volym, omvandlar mellan format eller filtrerar " "ljud p olika stt. Om man anvnder 24- eller 32-bitars sampelstorlek s " "mrks inte avrundningen, men anvnder man 8 eller 16 bitar orsakar " "avrundningen en hrbar kvalitetssnkning. \n" #: src/help.c:177 #, fuzzy, no-c-format msgid "" "The quality decrease that the rounding causes can be masked by adding a " "small amount of noise before rounding. This is called \"dithering\". " "mhWaveEdit supports basic dithering and it's enabled by default.\n" msgstr "" "Kvalitetssnkningen vid avrundningar kan dljas genom att lgga till mycket " "svagt brus innan avrundningen. Detta kallas \"dithering\". mhWaveEdit stder " "vanlig triangulr dithering och det r pslaget som standard. \n" #: src/help.c:179 #, no-c-format msgid "" "By default, mhWaveEdit uses floating-point temporary files for storing " "processed results to avoid rounding until the file is saved.\n" msgstr "" "Vanligtvis anvnder mhWaveEdit temporra filer i flyttalsformat fr att " "undvika ondiga avrundningar tills filen sparas.\n" #: src/help.c:184 #, no-c-format msgid "" "Even if mhWaveEdit was originally built for editing wav files, it's also " "possible to load and save in a few other formats. mhWaveEdit always supports " "wav and raw files, but if it's compiled with the libsndfile library, " "mhWaveEdit supports a couple of other formats as well. \n" msgstr "" "ven om mhWaveEdit frn brjan byggdes fr att redigera wav-filer kan man " "ocks ladda in och spara filer i ett antal andra format. Wav och raw-filer " "stds alltid, men om mhWaveEdit kompilerats med libsndfile-biblioteket, " "stds ett antal andra format ocks. \n" #: src/help.c:186 #, no-c-format msgid "" "To save a file with a different file format, use \"Save as...\" and choose a " "format in the file type selection box. \n" msgstr "" "Fr att spara en fil med ett annat filformat, vlj \"Spara som...\" och " "ndra filtyp i fnstret som kommer upp. \n" #: src/help.c:188 #, no-c-format msgid "" "mhWaveEdit has basic support for mp3 and ogg formats. For this to work you " "need to have LAME installed for mp3 support, and OggDec/OggEnc for Ogg " "support. If you have these programs, you can open and save mp3/ogg files " "just like any other file format.\n" msgstr "" "mhWaveEdit har visst std fr mp3- och ogg-filer. Fr att detta ska fungera " "mste du ha LAME installerat fr mp3, och OggDec/OggEnc fr Ogg-std. Finns " "dessa program kan man ppna och spara mp3/ogg-filer.\n" #: src/help.c:190 #, no-c-format msgid "" "If mplayer is installed, mhwaveedit can open all formats that it supports, " "for example the soundtrack of a video file. Since mplayer is only a player, " "these files can not be saved back after editing, you have to save the file " "into a supported format.\n" msgstr "" "Om programmet MPlayer r installerat s kan mhWaveEdit ppna alla filer som " "det stder, till exempel ljudet till videoklipp. Eftersom mplayer bara r en " "spelare s kan man inte spara tillbaka filen, utan man fr spara filen i " "ngot annat format.\n" #: src/help.c:195 #, no-c-format msgid "" "mhWaveEdit creates a directory ~/.mhwaveedit where it stores configuration " "information. \n" msgstr "mhWaveEdit skapar en katalog ~/.mhwaveedit dr instllningar lagras.\n" #: src/help.c:197 #, no-c-format msgid "" "The configuration file is called config. It can be hand edited, but the " "easiest way is through 'Preferences' on the Edit menu.\n" msgstr "" "Instllningsfilen kallas config. Den kan redigeras fr hand med en " "texteditor, men det enklaste sttet r genom \"Instllningar\" p Redigera-" "menyn.\n" #: src/help.c:199 #, no-c-format msgid "" "Each mhwaveedit process creates a session file in the .mhwaveedit directory " "called mhwaveedit-session---, where is the " "session ID number and is a character code showing the state of the " "session ('r' for running sessions). \n" msgstr "" "Varje mhWaveEdit-process skapar en sessionsfil i .mhwaveedit-katalogen. Den " "har namn p formen mhwaveedit-session---, dr " " r ett ID-nummer och r en bokstav som talar om vilket " "tillstnd sessionen r i ('r' betyder att den r igng).\n" #: src/help.c:201 #, no-c-format msgid "" "Temporary files are by default also stored in the ~/.mhwaveedit directory. " "Which directories to use can be set through the preferences dialog. To get " "the best performance, you should have one temporary directory for each local " "filesystem. The temporary files have names of the form \"mhwaveedit-temp-" "-nnnn-\". Do NOT open or remove temporary files with the same " "pid number as a currently running mhWaveEdit.\n" msgstr "" "Temporra filer lagras ocks normalt i ~/.mhwaveedit-katalogen. Vilka " "kataloger som skall anvndas kan man vlja genom Instllningar-fnstret. Fr " "att f s bra prestanda som mjligt, anvnd en katalog fr varje lokalt " "filsystem. Temporra filer har namn p formen \"mhwaveedit-temp--nnnn-" "\". ppna INTE och ta INTE bort temporra filer medan mhWaveEdit " "krs.\n" #: src/help.c:203 #, no-c-format msgid "" "mhWaveEdit checks on startup for leftover temporary files and lets the user " "open them. After opening a crashed session, the files can be saved or thrown " "away.\n" msgstr "" "Vid uppstart s kollar mhWaveEdit om det finns ngra vergivna temorra " "filer och lter i s fall anvndaren ppna upp dem. De kan sedan antingen " "sparas p riktigt eller slngas. \n" #: src/help.c:208 #, no-c-format msgid "F1 Help\n" msgstr "F1 Hjlp\n" #: src/help.c:209 #, no-c-format msgid "F12 Record\n" msgstr "F12 Spela in\n" #: src/help.c:211 #, no-c-format msgid "Ctrl+(number) Set mark\n" msgstr "Ctrl+(siffra) Stt mrke\n" #: src/help.c:212 #, no-c-format msgid "(number) Goto mark\n" msgstr "(siffra) G till mrke\n" #: src/help.c:214 #, no-c-format msgid "Ctrl+P Preferences\n" msgstr "Ctrl+P Instllningar\n" #: src/help.c:215 #, no-c-format msgid "Ctrl+E Effects\n" msgstr "Ctrl+E Effekter\n" #: src/help.c:217 #, no-c-format msgid "Ctrl+O Open file\n" msgstr "Ctrl+O ppna fil\n" #: src/help.c:218 #, no-c-format msgid "Ctrl+S Save file\n" msgstr "Ctrl+S Spara fil\n" #: src/help.c:219 #, no-c-format msgid "Ctrl+U Save selection as\n" msgstr "Ctrl+U Spara markering som\n" #: src/help.c:221 #, no-c-format msgid "Ctrl+C Copy\n" msgstr "Ctrl+C Kopiera\n" #: src/help.c:222 #, no-c-format msgid "Ctrl+X Cut\n" msgstr "Ctrl+X Klipp ut\n" #: src/help.c:223 #, no-c-format msgid "Ctrl+D Delete\n" msgstr "Ctrl+D Ta bort\n" #: src/help.c:224 #, fuzzy, no-c-format msgid "Delete Delete\n" msgstr "Ctrl+D Ta bort\n" #: src/help.c:225 #, no-c-format msgid "Ctrl+V Paste\n" msgstr "Ctrl+V Klistra in\n" #: src/help.c:226 #, no-c-format msgid "Ctrl+Z Undo\n" msgstr "Ctrl+Z ngra\n" #: src/help.c:227 #, no-c-format msgid "Ctrl+A Select all\n" msgstr "Ctrl+A Markera allt\n" #: src/help.c:229 #, no-c-format msgid "Ctrl+G Position cursor (Go to)\n" msgstr "Ctrl+G Placera markr\n" #: src/help.c:230 #, no-c-format msgid "Ctrl+H Position cursor at file start\n" msgstr "Ctrl+H Placera markren vid filens brjan\n" #: src/help.c:231 #, no-c-format msgid "Ctrl+J Position cursor at file end\n" msgstr "Ctrl+J Placera markren vid filens slut\n" #: src/help.c:232 #, no-c-format msgid "Ctrl+K Position cursor at selection start\n" msgstr "Ctrl+K Placera markren vid markeringens brjan\n" #: src/help.c:233 #, no-c-format msgid "Ctrl+L Position cursor at selection end\n" msgstr "Ctrl+L Placera markren vid markeringens slut\n" #: src/help.c:234 #, no-c-format msgid "Y,U Move cursor to nearest all-channel zero-crossing\n" msgstr "" "Y,U Flytta markren till nrmaste nollniv fr alla kanaler\n" #: src/help.c:235 #, no-c-format msgid "I,O Move cursor to nearest any-channel zero-crossing\n" msgstr "I,O Flytta markren till nrmaste nollniv fr ngon kanal\n" #: src/help.c:237 #, no-c-format msgid "Ctrl+Q Selection start at cursor\n" msgstr "Ctrl+Q Stt markeringens brjan till markr\n" #: src/help.c:238 #, no-c-format msgid "Ctrl+W Selection end at cursor\n" msgstr "Ctrl+W Stt markeringens slut till markr\n" #: src/help.c:240 #, no-c-format msgid "+,= Zoom in\n" msgstr "+,= Zooma in\n" #: src/help.c:241 #, no-c-format msgid "- Zoom out\n" msgstr "- Zooma ut\n" #: src/help.c:242 #, no-c-format msgid "> Zoom to selection\n" msgstr "> Zooma till markering\n" #: src/help.c:243 #, no-c-format msgid "< Zoom all\n" msgstr "< Zooma ut maximalt\n" #: src/help.c:244 #, no-c-format msgid "Arrow keys Scroll left/right\n" msgstr "Piltangenter Flytta vy vnster/hger\n" #: src/help.c:246 #, fuzzy, no-c-format msgid "Home Move view to file start\n" msgstr "Ctrl+H Placera markren vid filens brjan\n" #: src/help.c:247 #, fuzzy, no-c-format msgid "End Move view to file end\n" msgstr "K,L Flytta markr ett sampel\n" #: src/help.c:248 #, fuzzy, no-c-format msgid "Tab Move view to cursor\n" msgstr "K,L Flytta markr ett sampel\n" #: src/help.c:249 #, fuzzy, no-c-format msgid "Ctrl+Tab Move cursor to center of view\n" msgstr "Ctrl+L Placera markren vid markeringens slut\n" #: src/help.c:251 #, fuzzy, no-c-format msgid "Space Play/Stop\n" msgstr " Spela/Stopp\n" #: src/help.c:252 #, no-c-format msgid "Shift+Space Play all\n" msgstr "" #: src/help.c:253 #, no-c-format msgid ", Play from cursor pos\n" msgstr ", Spela frn markrens position\n" #: src/help.c:254 #, no-c-format msgid ". Stop\n" msgstr ". Stopp\n" #: src/help.c:255 #, no-c-format msgid "/ Play selection\n" msgstr "/ Spela markering\n" #: src/help.c:256 #, no-c-format msgid "H,J Move cursor (and playback) 1/8 of view\n" msgstr "H,J Flytta markr (och uppspelning) 1/8 vy\n" #: src/help.c:257 #, no-c-format msgid "K,L Move cursor one sample\n" msgstr "K,L Flytta markr ett sampel\n" #: src/help.c:258 #, no-c-format msgid "Ctrl+arrow Move cursor (and playback) half second\n" msgstr "Ctrl+pil Flytta markr (och uppspelning) en halv sekund\n" #: src/help.c:259 #, no-c-format msgid "( Play first 3 seconds of selection\n" msgstr "( Spela de frsta 3 sekunderna i markeringen\n" #: src/help.c:260 #, no-c-format msgid ") Play last 3 seconds of selection\n" msgstr ") Spela de sista 3 sekunderna i markeringen\n" #: src/help.c:265 #, no-c-format msgid "" "If you find a bug or flaw in the program that's not mentioned in the BUGS " "file, report the bug in the bug tracker (see contact info) or mail a bug " "report describing the bug to: magnus.hjorth@home.se\n" msgstr "" "Om du hittar ett fel i programmet som inte nmnts i BUGS-filen, maila en " "buggrapport till: magnus.hjorth@home.se\n" #: src/help.c:267 #, no-c-format msgid "" "In case of a crash, please do not send me any core dumps. They are huge and " "completely useless to me. Instead, create a backtrace. Backtraces tell you " "exactly where the program crashed.\n" msgstr "" "Om programmet kraschar, maila inte ngra core-filer till mig. De har jag " "ingen anvndning fr. Skapa istllet en \"backtrace\" som talar om var " "programmet kraschade.\n" #: src/help.c:269 #, no-c-format msgid "How to create a backtrace:\n" msgstr "S hr skapar man en backtrace:\n" #: src/help.c:270 #, no-c-format msgid "1. Enable core dumps: ulimit -c unlimited\n" msgstr "1. Aktivera core-filer: ulimit -c unlimited\n" #: src/help.c:271 #, no-c-format msgid "2. Run the program: mhwaveedit\n" msgstr "2. Kr programmet: mhwaveedit\n" #: src/help.c:272 #, no-c-format msgid "" "3. Make the program crash. You should now get a file named core or core.1234 " "in the directory you're in.\n" msgstr "" "3. Gr s att programmet kraschar. Nr det gr det s ska en fil som heter " "core eller core.nnnn dyka upp i den katalog du r i. \n" #: src/help.c:273 #, no-c-format msgid "4. Run gdb with the program and core file: \n" msgstr "4. Kr gdb med programmet och core-filen:\n" #: src/help.c:274 #, no-c-format msgid " gdb /usr/local/bin/mhwaveedit core | tee backtrace.txt\n" msgstr " gdb /usr/local/bin/mhwaveedit core | tee backtrace.txt\n" #: src/help.c:275 #, no-c-format msgid "5. After gdb has loaded, use the command: bt\n" msgstr "5. Efter att gdb laddats, anvnd kommandot: bt\n" #: src/help.c:276 #, no-c-format msgid "6. Quit gdb with the command: quit\n" msgstr "6. Avsluta gdb med kommandot: quit\n" #: src/help.c:277 #, no-c-format msgid "7. Now you should have a back trace in the file backtrace.txt\n" msgstr "7. Nu ska det finnas en backtrace i filen backtrace.txt\n" #: src/help.c:282 #, no-c-format msgid "" "There are plenty of things you can do if you want to help the development of " "mhWaveEdit. \n" msgstr "" "Det finns mycket du kan gra om du vill hjlpa till med utvecklingen av " "mhWaveEdit. \n" #: src/help.c:284 #, no-c-format msgid "" "First of all, look for bugs and report all bugs you find into the bug " "tracker or through e-mail. Sometimes a bug can get overlooked for a long " "time because nobody reports it, so don't be afraid to report bugs that have " "been there for a few releases. You don't have to provide fixes or very " "detailed information, although it helps of course.\n" msgstr "" "Frst och frmst, leta efter fel och buggar och rapportera alla fel du " "hittar i buggrapporteringssystemet eller via e-mail. Ibland kan en bugg " "finnas lnge utan att upptckas, s tveka inte att rapportera ven om " "problemet funnits i flera versioner tillbaka. Du mste inte ha lsningar " "eller detaljerad information, ven om det underlttar. \n" #: src/help.c:286 #, no-c-format msgid "" "Feature requests are also welcome, report them to the mailing list or to the " "bug tracker.\n" msgstr "" "Frbttringsfrslag och nya ider r ocks vlkomna, skicka dem till " "maillistan eller buggrapporteringssystemet.\n" #: src/help.c:288 #, no-c-format msgid "" "If you speak a language other than English and mhWaveEdit isn't translated " "to your language, you can contribute a translation. To do that, copy the " "template mhwaveedit.pot in the po directory into a new file ll.po, where ll " "is your language code (see http://www.gnu.org/software/gettext/manual/" "html_node/gettext_221.html for a list of language codes). \n" msgstr "" "Om du pratar ngot sprk som mhWaveEdit inte har blivit versatt till nnu " "s kan du bidra med en versttning till det sprket. Fr att gra detta, " "kopiera filen mhwaveedit.pot i po-katalogen till en ny fil ll.po, dr ll r " "en sprkkod (se http://www.gnu.org/software/gettext/manual/html_node/" "gettext_221.html fr en lista med sdana koder.)\n" #: src/help.c:290 #, no-c-format msgid "" "It's possible to edit po-files by hand, but I recommend a program such as " "poEdit (http://www.poedit.org) for editing translations. \n" msgstr "" "Det gr att redigera po-filer fr hand, men jag rekommenderar att du " "anvnder ett program som poEdit (http://www.poedit.org).\n" #: src/help.c:292 #, no-c-format msgid "" "Note that for those translatable strings that look like \"RecordStatus|Paused" "\", you should ignore what's to the left and only translate the string to " "the right (\"Paused\" in this example). This convention is there to make it " "possible to translate the same string to different things depending on " "context. \n" msgstr "" "I de texter som ser ut som \"RecordStatus|Paused\" s ska man ignorera det " "som str till vnster och bara verstta det som str till hger, dvs " "\"Paused\" i detta exempel. Denna konvention anvnds nr samma ord kan " "betyda olika saker beroende p sammanhanget. \n" #: src/help.c:294 #, no-c-format msgid "" "After you've filled in all the translations you want (you don't have to " "translate all the strings), mail in the po file to me (see contact info) and " "I'll add it to the next release. \n" msgstr "" "Efter att du versatt s mycket du vill (du behver inte verstta allt p " "en gng), skicka in po-filen till mig (se Adresser) s lgger jag till den " "till nsta version.\n" #: src/help.c:296 #, no-c-format msgid "" "If a translation is incomplete, you're very welcome to translate the " "remaining untranslated messages and mail them in. Corrections to " "translations are also appreciated, but they may need to be checked with the " "previous translator before including them. \n" msgstr "" "Om en versttning r ofullstndig s fr du grna verstta de terstende " "icke-versatta meddelandena och skicka in dem. Rttelser tas ocks emot, men " "de kan behva godknnas av tidigare versttare om han eller hon gr att " "n.\n" #: src/help.c:302 #, no-c-format msgid "For bug reports, translation updates, patches and PayPal donations:\n" msgstr "" "Fr buggrapporter, uppdaterade versttningar, patchar och PayPal-" "donationer:\n" #: src/help.c:303 #, no-c-format msgid "magnus.hjorth@home.se\n" msgstr "magnus.hjorth@home.se\n" #: src/help.c:305 #, no-c-format msgid "Project page with bug tracker, mailing list membership:\n" msgstr "" "Projektsida med buggrapporteringssystem, mailinglistmedlemskap med mera:\n" #: src/help.c:306 #, no-c-format msgid "http://gna.org/projects/mhwaveedit\n" msgstr "http://gna.org/projects/mhwaveedit\n" #: src/help.c:308 #, no-c-format msgid "Mailing list (you must be a subscriber before you can post messages):\n" msgstr "Maillista (du mste bli medlem innan du postar):\n" #: src/help.c:309 #, no-c-format msgid "mhwaveedit-discuss@gna.org\n" msgstr "mhwaveedit-discuss@gna.org\n" #: src/inifile.c:84 src/inifile.c:91 #, c-format msgid "%s: Expected '=': %s\n" msgstr "%s: Frvntade '=': %s\n" #: src/inifile.c:97 #, c-format msgid "%s: Expected value: %s\n" msgstr "%s: Frvntat vrde: %s\n" #: src/int_box.c:202 #, c-format msgid "Value for %s must be a number between %ld and %ld" msgstr "Vrdet p %s mste vara ett tal mellan %ld och %ld" #: src/ladspacore.c:94 #, c-format msgid "Effect %s contains invalid port %s" msgstr "Effekten %s innehller felaktig port %s" #: src/ladspacore.c:140 #, c-format msgid "Ladspa: Error scanning %s" msgstr "Ladspa: Fel vid genomskning av %s" #: src/ladspacore.c:409 #, c-format msgid "Applying effect '%s'" msgstr "Verkstller effekt '%s'" #: src/ladspadialog.c:87 #, c-format msgid "Value for '%s' must not be below %f" msgstr "Vrdet p '%s' fr inte vara under %f" #: src/ladspadialog.c:94 #, c-format msgid "Value for '%s' must not be above %f" msgstr "Vrdet p '%s' fr inte vara ver %f" #: src/ladspadialog.c:127 #, c-format msgid "" "You have mapped more than one output port to channel '%s'. You can only map " "one output port to each channel." msgstr "" "Du har kopplat mer n en utport till kanal '%s'. Du kan bara koppla en " "utport till varje kanal." #: src/ladspadialog.c:191 #, c-format msgid "Author: %s" msgstr "Skapare: %s" #: src/ladspadialog.c:196 #, c-format msgid "Copyright: %s" msgstr "Copyright: %s" #: src/ladspadialog.c:203 msgid " Input controls " msgstr " Inkontroller " #: src/ladspadialog.c:292 msgid " Output controls " msgstr " Utkontroller " #: src/ladspadialog.c:311 src/recorddialog.c:311 src/recorddialog.c:739 msgid "None" msgstr "Ingen" #: src/ladspadialog.c:319 msgid " Input audio " msgstr " Ingende ljuddata " #: src/ladspadialog.c:319 msgid " Output audio " msgstr " Utgende ljuddata " #: src/ladspadialog.c:350 msgid "Keep data in unmapped output channels" msgstr "Behll nuvarande data i kanaler som ej kopplats till ngon utport" #: src/main.c:166 #, c-format msgid "Syntax: %s [files]\n" msgstr "Anvndning: %s [filer]\n" #: src/main.c:169 msgid "Testing conversion functions:" msgstr "Testar omvandlingsfunktioner:" #: src/main.c:171 msgid "Testing conversion functions finished." msgstr "Test av omvandlingsfunktioner misslyckades." #: src/main.c:190 msgid "Expected driver name after --driver option" msgstr "Man mste skriva namnet p drivrutinen efter --driver-flaggan" #: src/main.c:196 #, c-format msgid "Unknown option '%s'" msgstr "Oknd flagga '%s'" #: src/main.c:340 msgid "" "Could not find home directory. Using current directory as home directory." msgstr "Kunde inte hitta hemkatalog. Anvnder aktuell katalog som hemkatalog." #: src/main.c:368 msgid "Black" msgstr "Svart" #: src/main.c:369 msgid "White" msgstr "Vit" #: src/main.c:370 msgid "Background" msgstr "Bakgrund" #: src/main.c:371 msgid "L Waveform" msgstr "V ljudvg" #: src/main.c:372 msgid "R Waveform" msgstr "H ljudvg" #: src/main.c:373 msgid "Cursor" msgstr "Markr" #: src/main.c:374 msgid "Marks" msgstr "Mrken" #: src/main.c:375 msgid "Selection" msgstr "Markering" #: src/main.c:376 msgid "Progress bar" msgstr "Arbetsvisare" #: src/main.c:377 msgid "Zero-level" msgstr "Nollniv" #: src/main.c:378 #, fuzzy msgid "Buffer position" msgstr "Buffert-overrun!" #: src/main.c:501 #, c-format msgid "Error launching mixer: fork: %s" msgstr "Fel vid start av mixerprogram: fork: %s" #: src/main.c:552 src/main.c:571 msgid "Mono" msgstr "Mono" #: src/main.c:553 msgid "Left" msgstr "Vnster" #: src/main.c:554 msgid "Right" msgstr "Hger" #: src/main.c:556 #, c-format msgid "Ch%d" msgstr "Kanal%d" #: src/main.c:572 msgid "Stereo" msgstr "Stereo" #: src/main.c:574 #, c-format msgid "%d channels" msgstr "%d kanaler" #: src/main.c:1149 msgid "Ignoring extreme old window size/position values\n" msgstr "Ignorerar extrema sparade vrden fr lge/storlek p fnster\n" #: src/mainwindow.c:217 #, c-format msgid "mhWaveEdit: %s (%s): %d Hz, %s" msgstr "mhWaveEdit: %s (%s): %d Hz, %s" #: src/mainwindow.c:300 msgid "Use default settings" msgstr "Anvnd standardinstllningar" #: src/mainwindow.c:304 msgid "Auto-detect from extension" msgstr "Vlj automatiskt" #: src/mainwindow.c:319 msgid "File type: " msgstr "Filtyp: " #: src/mainwindow.c:365 msgid "" "The file has not changed since last save. Press OK if you want to save it " "anyway?" msgstr "" "Filen har inte ndrats sedan den sparades sist. Tryck OK om du vill spara " "den nd." #: src/mainwindow.c:374 msgid "Save File" msgstr "Spara fil" #: src/mainwindow.c:399 #, c-format msgid "Save changes to %s?" msgstr "Spara ndrad fil %s?" #: src/mainwindow.c:792 src/mainwindow.c:796 msgid "Load File" msgstr "Ladda fil" #: src/mainwindow.c:821 msgid "Save selection as ..." msgstr "Spara markering som ..." #: src/mainwindow.c:1116 #, c-format msgid "Chunk %p has opencount=%d\n" msgstr "Chunk %p har opencount=%d\n" #: src/mainwindow.c:1199 #, c-format msgid "" "\n" "Window '%s'\n" msgstr "" "\n" "Fnster '%s'\n" #: src/mainwindow.c:1200 msgid " Current chunk:" msgstr " Aktuell chunk:" #: src/mainwindow.c:1202 msgid " History:" msgstr " Historia:" #: src/mainwindow.c:1257 msgid "There already is only one channel!" msgstr "Det finns redan bara en kanal!" #: src/mainwindow.c:1366 msgid "mhWaveEdit Help" msgstr "mhWaveEdit-hjlp" #: src/mainwindow.c:1465 msgid "About mhWaveEdit" msgstr "Om mhWaveEdit" #: src/mainwindow.c:1477 #, fuzzy msgid "" "Created by Magnus Hjorth (magnus.hjorth@home.se)\n" "Copyright 2002-2018, Magnus Hjorth" msgstr "" "Skapad av Magnus Hjorth (magnus.hjorth@home.se)\n" "Copyright 2002-2007, Magnus Hjorth" #: src/mainwindow.c:1484 #, c-format msgid "Current sound driver: %s" msgstr "Aktuell ljuddrivrutin: %s" #: src/mainwindow.c:1492 #, c-format msgid "Compiled %s %s" msgstr "Kompilerad %s %s" #: src/mainwindow.c:1498 msgid "Uses double-precision math" msgstr "Anvnder dubbelprecision vid berkningar" #: src/mainwindow.c:1505 msgid "" "Distributed under GNU General Public License.\n" "For information, see the file COPYING" msgstr "" "Distribuerad under GNU General Public License.\n" "Fr mer information, se filen COPYING" #: src/mainwindow.c:1669 msgid "Seconds of silence: " msgstr "Sekunder med tystnad: " #: src/mainwindow.c:1669 msgid "Insert Silence" msgstr "Infoga tystnad" #: src/mainwindow.c:1718 msgid "Level: " msgstr "Niv: " #: src/mainwindow.c:1718 msgid "Normalize to..." msgstr "Normalisera till..." #: src/mainwindow.c:1928 msgid "/_File" msgstr "/_Arkiv" #: src/mainwindow.c:1929 msgid "/File/_Open..." msgstr "/Arkiv/_ppna..." #: src/mainwindow.c:1930 msgid "/File/_Save" msgstr "/Arkiv/_Spara" #: src/mainwindow.c:1931 msgid "/File/Save _as..." msgstr "/Arkiv/S_para som..." #: src/mainwindow.c:1932 msgid "/File/Save selection as..." msgstr "/Arkiv/Spara _markering som..." #: src/mainwindow.c:1933 msgid "/_Edit" msgstr "/_Redigera" #: src/mainwindow.c:1934 msgid "/Edit/_Undo" msgstr "/Redigera/_ngra" #: src/mainwindow.c:1935 msgid "/Edit/_Redo" msgstr "/Redigera/_Gr om" #: src/mainwindow.c:1936 msgid "/Edit/sep1" msgstr "/Redigera/sep1" #: src/mainwindow.c:1937 msgid "/Edit/Cu_t" msgstr "/Redigera/Klipp u_t" #: src/mainwindow.c:1938 msgid "/Edit/_Copy" msgstr "/Redigera/_Kopiera" #: src/mainwindow.c:1939 msgid "/Edit/_Paste" msgstr "/Redigera/Klistra _in" #: src/mainwindow.c:1940 msgid "/Edit/Paste _over" msgstr "/Redigera/Klistra _ver" #: src/mainwindow.c:1941 msgid "/Edit/_Mix paste" msgstr "/Redigera/_Mixa in" #: src/mainwindow.c:1942 msgid "/Edit/Insert _silence" msgstr "/Redigera/Infoga _tystnad" #: src/mainwindow.c:1943 msgid "/Edit/Paste to _new" msgstr "/Redigera/Klistra in till _ny" #: src/mainwindow.c:1944 msgid "/Edit/Cr_op" msgstr "/Redigera/Skr ut" #: src/mainwindow.c:1945 msgid "/Edit/_Delete" msgstr "/Redigera/Ta bort" #: src/mainwindow.c:1946 msgid "/Edit/Silence selection" msgstr "/Redigera/Tysta markering" #: src/mainwindow.c:1947 msgid "/Edit/sep2" msgstr "/Redigera/sep2" #: src/mainwindow.c:1948 msgid "/Edit/Select _all" msgstr "/Redigera/Markera _allt" #: src/mainwindow.c:1949 msgid "/Edit/Select none" msgstr "/Redigera/Markera ingenting" #: src/mainwindow.c:1950 msgid "/Edit/sep3" msgstr "/Redigera/sep3" #: src/mainwindow.c:1951 msgid "/Edit/Clear clipboard" msgstr "/Redigera/Rensa urklipp" #: src/mainwindow.c:1952 msgid "/Edit/sep4" msgstr "/Redigera/sep4" #: src/mainwindow.c:1953 msgid "/Edit/Preferences" msgstr "/Redigera/_Instllningar" #: src/mainwindow.c:1954 msgid "/_View" msgstr "/_Visa" #: src/mainwindow.c:1955 msgid "/View/Zoom _in" msgstr "/Visa/Zooma _in" #: src/mainwindow.c:1956 msgid "/View/Zoom _out" msgstr "/Visa/Zooma _ut" #: src/mainwindow.c:1957 msgid "/View/Zoom to _selection" msgstr "/Visa/Zooma till markering" #: src/mainwindow.c:1958 msgid "/View/sep1" msgstr "/Visa/sep1" #: src/mainwindow.c:1959 msgid "/View/Zoom _all" msgstr "/Visa/Zooma ut helt" #: src/mainwindow.c:1960 msgid "/View/sep2" msgstr "/View/sep2" #: src/mainwindow.c:1961 msgid "/View/_Time scale" msgstr "/Visa/_Tidsskala" #: src/mainwindow.c:1962 msgid "/View/_Horizontal zoom" msgstr "/Visa/_Horisontell zoom" #: src/mainwindow.c:1963 msgid "/View/_Vertical zoom" msgstr "/Visa/_Vertikal zoom" #: src/mainwindow.c:1964 msgid "/View/Sp_eed slider" msgstr "/Visa/Hastighetsvljare" #: src/mainwindow.c:1965 #, fuzzy msgid "/View/Slider labels" msgstr "/Visa/Hastighetsvljare" #: src/mainwindow.c:1966 msgid "/View/Buffer position" msgstr "" #: src/mainwindow.c:1967 msgid "/_Cursor" msgstr "/_Markr" #: src/mainwindow.c:1968 msgid "/Cursor/Set selection start" msgstr "/Markr/Stt start p markering" #: src/mainwindow.c:1970 msgid "/Cursor/Set selection end" msgstr "/Markr/Stt slut p markering" #: src/mainwindow.c:1971 msgid "/Cursor/sep1" msgstr "/Markr/sep1" #: src/mainwindow.c:1972 msgid "/Cursor/Move to" msgstr "/Markr/Flytta till" #: src/mainwindow.c:1973 msgid "/Cursor/Move to/Beginning" msgstr "/Markr/Flytta till/Brjan" #: src/mainwindow.c:1975 msgid "/Cursor/Move to/End" msgstr "/Markr/Flytta till/Slutet" #: src/mainwindow.c:1976 msgid "/Cursor/Move to/Selection start" msgstr "/Markr/Flytta till/Markeringens brjan" #: src/mainwindow.c:1978 msgid "/Cursor/Move to/Selection end" msgstr "/Markr/Flytta till/Markeringens slut" #: src/mainwindow.c:1980 msgid "/Cursor/Move" msgstr "/Markr/Flytta" #: src/mainwindow.c:1981 msgid "/Cursor/Move/Left" msgstr "/Markr/Flytta/Vnster" #: src/mainwindow.c:1982 msgid "/Cursor/Move/Right" msgstr "/Markr/Flytta/Hger" #: src/mainwindow.c:1983 msgid "/Cursor/Move/Left sample" msgstr "/Markr/Flytta/Vnster ett sampel" #: src/mainwindow.c:1984 msgid "/Cursor/Move/Right sample" msgstr "/Markr/Flytta/Hger ett sampel" #: src/mainwindow.c:1985 msgid "/Cursor/Find zero-crossing" msgstr "/Markr/G till nollniv" #: src/mainwindow.c:1986 msgid "/Cursor/Find zero-crossing/Left (all channels)" msgstr "/Markr/G till nollniv/Vnster (alla kanaler)" #: src/mainwindow.c:1988 msgid "/Cursor/Find zero-crossing/Right (all channels)" msgstr "/Markr/G till nollniv/Hger (alla kanaler)" #: src/mainwindow.c:1990 msgid "/Cursor/Find zero-crossing/Left (any channel)" msgstr "/Markr/G till nollniv/Vnster (en kanal)" #: src/mainwindow.c:1992 msgid "/Cursor/Find zero-crossing/Right (any channel)" msgstr "/Markr/G till nollniv/Hger (en kanal)" #: src/mainwindow.c:1994 msgid "/Cursor/sep2" msgstr "/Markr/sep2" #: src/mainwindow.c:1995 msgid "/Cursor/Position cursor..." msgstr "/Markr/Placera markr..." #: src/mainwindow.c:1997 msgid "/_Play" msgstr "/S_pela" #: src/mainwindow.c:1998 msgid "/Play/_Play from cursor" msgstr "/Spela/S_pela frn markr" #: src/mainwindow.c:1999 msgid "/Play/Play _all" msgstr "/Spela/Spela allt" #: src/mainwindow.c:2000 msgid "/Play/Play se_lection" msgstr "/Spela/Spela _markering" #: src/mainwindow.c:2001 msgid "/Play/_Stop" msgstr "/Spela/_Stopp" #: src/mainwindow.c:2002 msgid "/Play/sep1" msgstr "/Spela/sep1" #: src/mainwindow.c:2003 msgid "/Play/_Record..." msgstr "/Spela/Spela in..." #: src/mainwindow.c:2004 msgid "/Effec_ts" msgstr "/Effek_ter" #: src/mainwindow.c:2005 msgid "/Effects/Fade _in" msgstr "/Effekter/Fade-in" #: src/mainwindow.c:2006 msgid "/Effects/Fade o_ut" msgstr "/Effekter/Fade-ut" #: src/mainwindow.c:2007 msgid "/Effects/_Normalize" msgstr "/Effekter/Normalisera volym" #: src/mainwindow.c:2008 msgid "/Effects/Normali_ze to..." msgstr "/Effekter/Normalisera till..." #: src/mainwindow.c:2009 msgid "/Effects/_Volume adjust (fade)..." msgstr "/Effekter/Volymjustering..." #: src/mainwindow.c:2010 msgid "/Effects/sep1" msgstr "/Effekter/sep1" #: src/mainwindow.c:2011 msgid "/Effects/Convert sample_rate..." msgstr "/Effekter/Omvandla samplingsfrekvens..." #: src/mainwindow.c:2012 msgid "/Effects/Convert sample _format..." msgstr "/Effekter/Omvandla sampelformat..." #: src/mainwindow.c:2014 msgid "/Effects/B_yte swap" msgstr "/Effekter/Vxla byteordning" #: src/mainwindow.c:2015 msgid "/Effects/sep2" msgstr "/Effekter/sep2" #: src/mainwindow.c:2016 msgid "/Effects/_Mix to mono" msgstr "/Effekter/_Mixa kanaler" #: src/mainwindow.c:2017 msgid "/Effects/Add channe_l" msgstr "/Effekter/_Lgg till kanal" #: src/mainwindow.c:2018 msgid "/Effects/Ma_p channels..." msgstr "/Effekter/_ndra kanaler..." #: src/mainwindow.c:2019 msgid "/Effects/_Combine channels..." msgstr "/Effekter/_Kombinera kanaler..." #: src/mainwindow.c:2020 msgid "/Effects/Add channels from other file..." msgstr "/Effekter/Lgg till kanaler frn annan fil..." #: src/mainwindow.c:2021 msgid "/Effects/sep3" msgstr "/Effekter/sep3" #: src/mainwindow.c:2022 msgid "/Effects/_Speed adjustment..." msgstr "/Effekter/ndra hastighet..." #: src/mainwindow.c:2023 msgid "/Effects/Pipe through program..." msgstr "/Effekter/Filtrera genom program..." #: src/mainwindow.c:2024 msgid "/Effects/sep4" msgstr "/Effekter/sep4" #: src/mainwindow.c:2025 msgid "/Effects/Effects dialog..." msgstr "/Effekter/Fler effekter..." #: src/mainwindow.c:2027 msgid "/Debug" msgstr "/Debug" #: src/mainwindow.c:2029 msgid "/Debug/Dummy effect" msgstr "/Debug/Gr ingenting-effekt" #: src/mainwindow.c:2030 #, fuzzy msgid "/Debug/Dummy effect FP" msgstr "/Debug/Gr ingenting-effekt" #: src/mainwindow.c:2031 msgid "/Debug/Check opencount" msgstr "/Debug/Kolla opencount" #: src/mainwindow.c:2032 msgid "/Debug/Dump chunk info" msgstr "/Debug/Dumpa chunkinformation" #: src/mainwindow.c:2034 msgid "/_Help" msgstr "/_Hjlp" #: src/mainwindow.c:2035 msgid "/Help/_Documentation" msgstr "/Hjlp/_Dokumentation" #: src/mainwindow.c:2036 msgid "/Help/_About" msgstr "/Hjlp/_Om" #: src/mainwindow.c:2040 msgid "/File/sep1" msgstr "/Arkiv/sep1" #: src/mainwindow.c:2041 msgid "/File/_Close" msgstr "/Arkiv/Stng" #: src/mainwindow.c:2042 msgid "/File/sep2" msgstr "/Arkiv/sep2" #: src/mainwindow.c:2043 msgid "/File/_Exit" msgstr "/Arkiv/A_vsluta" #: src/mainwindow.c:2215 msgid "Load a file from disk" msgstr "Ladda in en fil frn disk" #: src/mainwindow.c:2222 msgid "Save the current file to disk" msgstr "Spara aktuell fil till disk" #: src/mainwindow.c:2231 msgid "Undo the last change" msgstr "ngra den senaste ndringen" #: src/mainwindow.c:2239 msgid "Redo the last undo operation" msgstr "Gr om den senast ngrade tgrden" #: src/mainwindow.c:2249 msgid "Cut out the current selection" msgstr "Klipp ut markerat omrde" #: src/mainwindow.c:2257 msgid "Copy the current selection" msgstr "Kopiera markerat omrde" #: src/mainwindow.c:2265 msgid "Paste at cursor position" msgstr "Klistra in vid markren" #: src/mainwindow.c:2273 msgid "Paste, overwriting the data after the cursor position" msgstr "Klistra in, skriv ver vid markren" #: src/mainwindow.c:2283 msgid "Delete the selection" msgstr "Ta bort markeringen" #: src/mainwindow.c:2292 msgid "Set selection start to cursor position" msgstr "Stt start p markeringen till markrpositionen" #: src/mainwindow.c:2301 msgid "Set selection end to cursor position" msgstr "Stt slut p markeringen till markrpositionen" #: src/mainwindow.c:2311 msgid "Play from cursor position" msgstr "Spela frn markrposition" #: src/mainwindow.c:2320 msgid "Play selected area" msgstr "Spela markerat omrde" #: src/mainwindow.c:2329 msgid "Stop playing" msgstr "Stoppa uppspelning" #: src/mainwindow.c:2339 msgid "Loop mode (play over and over)" msgstr "Loopa (spela om och om igen)" #: src/mainwindow.c:2349 msgid "Keep view and playback together" msgstr "" #: src/mainwindow.c:2362 msgid "Auto return to playback start" msgstr "Hoppa automatiskt tillbaka till uppspelningens brjan" #: src/mainwindow.c:2376 src/recorddialog.c:874 msgid "Record" msgstr "Spela in" #: src/mainwindow.c:2385 src/recorddialog.c:983 msgid "Launch mixer" msgstr "ppna mixer" #: src/pipedialog.c:92 msgid "Command line: " msgstr "Kommando: " #: src/pipedialog.c:99 msgid "Send wav header" msgstr "Snd wav-huvud" #: src/pipedialog.c:153 msgid "Process output" msgstr "Kr kommando" #: src/pipedialog.c:178 #, c-format msgid "" "Output from command '%s':\n" "\n" msgstr "" "Frn kommandot '%s':\n" "\n" #: src/pipedialog.c:201 #, c-format msgid "Could not create pipe: %s" msgstr "Kunde inte skapa pipe: %s" #: src/pipedialog.c:216 #, c-format msgid "Error: fork: %s" msgstr "Fel: fork: %s" #: src/pipedialog.c:268 msgid "Should not reach this point!" msgstr "Borde inte n denna punkt!" #: src/pipedialog.c:482 msgid "Command failed without returning any data" msgstr "Kommandot misslyckades utan att returnera ngot data" #: src/pipedialog.c:492 #, c-format msgid "Error: %s" msgstr "Fel: %s" #: src/player.c:294 msgid "The sound format of this file is not supported for playing." msgstr "Ljudformatet i denna fil kan inte spelas upp." #: src/rateconv.c:97 #, c-format msgid "Error initialising sample rate conversion: %s" msgstr "Fel vid uppstart av omvandling av samplingsfrekvens: %s" #: src/rateconv.c:162 #, c-format msgid "Error converting samplerate: %s\n" msgstr "Fel vid omvandling av samplingsfrekvens: %s\n" #: src/rateconv.c:201 #, c-format msgid "Error changing samplerate conversion ratio: %s\n" msgstr "Fel vid ndring at omvandlingsratio: %s\n" #: src/rateconv.c:323 msgid "Unexpected EOF in connection to subprocess" msgstr "Ovntat filslut i uppkoppling mot underprocess" #: src/rateconv.c:327 #, c-format msgid "Error writing to subprocess: %s" msgstr "Fel vid skrivning till underprocess: %s" #: src/rateconv.c:383 src/rateconv.c:405 #, c-format msgid "Error reading from sub process: %s" msgstr "Fel vid lsning frn underprocess: %s" #: src/rateconv.c:413 msgid "SoX closed connection too early!" msgstr "SoX stngde uppkopplingen fr tidigt!" #: src/rateconv.c:599 msgid "(SoX) Simulated analog filtration" msgstr "(SoX) Simulerade analog filtrering" #: src/rateconv.c:605 msgid "(SoX) Polyphase interpolation" msgstr "(SoX) Polyfas-interpolation" #: src/rateconv.c:612 msgid "Sample repeat/skip (low quality)" msgstr "Upprepa/skippa sampel (lg kvalitet)" #: src/rawdialog.c:42 msgid "header size" msgstr "datahuvudets storlek" #: src/rawdialog.c:73 msgid "Unknown file format" msgstr "Oknt filformat" #: src/rawdialog.c:80 #, c-format msgid "" "The format of file '%s' could not be recognized.\n" "\n" "Please specify the sample format below." msgstr "" "Formatet p filen '%s' kunde inte knnas igen.\n" "\n" "Var god ange sampelformat." #: src/rawdialog.c:92 msgid "Header bytes: " msgstr "Datahuvud bytes: " #: src/recorddialog.c:207 src/recorddialog.c:671 src/recorddialog.c:918 msgid "(no limit)" msgstr "(ingen grns)" #: src/recorddialog.c:314 msgid "Mild" msgstr "Mild" #: src/recorddialog.c:316 msgid "Heavy" msgstr "Mycket" #: src/recorddialog.c:430 msgid "Update preset" msgstr "Uppdatera instllning" #: src/recorddialog.c:435 msgid "Add preset" msgstr "Lgg till instllning" #: src/recorddialog.c:514 msgid "Custom format" msgstr "Annat format" #: src/recorddialog.c:552 msgid "" "The sign and endian-ness can usually be left at their defaults, but should " "be changed if you're unable to record or get bad sound." msgstr "" "Tecken och endian-ness kan vanligvis lmnas p sina standardvrden, men ska " "ndras om du inte kan spela in eller fr dligt ljud." #: src/recorddialog.c:566 msgid "Name :" msgstr "Namn: " #: src/recorddialog.c:578 msgid "Presets:" msgstr "Instllningar: " #: src/recorddialog.c:593 msgid "Set format" msgstr "Anvnd detta format" #: src/recorddialog.c:601 msgid "Add/Update preset" msgstr "Lgg till/uppdatera instllning" #: src/recorddialog.c:654 msgid "" "Invalid time value. Time must be specified in the form (HH')MM:SS(.mmmm)" msgstr "Felaktigt tidsvrde. Tid mste anges p formen (TT')MM:SS(.mmmm)" #: src/recorddialog.c:698 src/recorddialog.c:948 msgid "Format not selected" msgstr "Format ej valt" #: src/recorddialog.c:705 msgid "This format is not supported by the input driver!" msgstr "Detta format stds inte av drivrutinen!" #: src/recorddialog.c:710 msgid "Ready for recording" msgstr "Redo fr inspelning" #: src/recorddialog.c:723 msgid "Peak: " msgstr "Topp: " #: src/recorddialog.c:724 msgid "Peak max: " msgstr "Hgsta topp: " #: src/recorddialog.c:725 msgid "RMS: " msgstr "RMS: " #: src/recorddialog.c:726 msgid "Clipping: " msgstr "Klippning: " #: src/recorddialog.c:795 msgid "Resume recording" msgstr "Fortstt inspelning" #: src/recorddialog.c:795 src/recorddialog.c:815 msgid "Pause recording" msgstr "Pausa inspelning" #: src/recorddialog.c:797 msgid "RecordStatus|Paused" msgstr "Pausad" #: src/recorddialog.c:798 src/recorddialog.c:823 msgid "RecordStatus|Recording" msgstr "Spelar in" #: src/recorddialog.c:818 msgid "Finish" msgstr "Slutfr" #: src/recorddialog.c:826 msgid "Overruns: " msgstr "Antal overrun: " #: src/recorddialog.c:829 msgid "Bytes written: " msgstr "Skrivna bytes: " #: src/recorddialog.c:830 msgid "Auto stop in: " msgstr "Tid till auto-stopp: " #: src/recorddialog.c:894 msgid "Recording settings" msgstr "Inspelningsinstllningar" #: src/recorddialog.c:901 msgid "Sample format: " msgstr "Sampelformat: " #: src/recorddialog.c:916 msgid "Time limit: " msgstr "Tidsgrns: " #: src/recorddialog.c:924 msgid "Disable" msgstr "Ta bort" #: src/recorddialog.c:930 msgid "Set" msgstr "Stt" #: src/recorddialog.c:942 msgid "Input levels" msgstr "Ingngsniver" #: src/recorddialog.c:947 msgid "Recording status: " msgstr "Inspelningsstatus: " #: src/recorddialog.c:952 msgid "Time recorded: " msgstr "Inspelad tid: " #: src/recorddialog.c:953 msgid "N/A" msgstr "-" #: src/recorddialog.c:966 msgid "Start recording" msgstr "Starta inspelning" #: src/recorddialog.c:977 msgid "Reset max peaks" msgstr "Nollstll hgsta toppvrden" #: src/sampleratedialog.c:87 msgid "" "(This changes the sample rate of \n" "the entire file, not just the selection)" msgstr "" "(detta ndrar samplingfrekvensen p hela filen, inte bara markerat omrde)" #: src/sampleratedialog.c:92 msgid "New samplerate: " msgstr "Ny samplingsfrekvens: " #: src/sampleratedialog.c:99 msgid "Method: " msgstr "Metod: " #: src/samplesizedialog.c:38 msgid "File already has the selected sample format" msgstr "" #: src/samplesizedialog.c:87 msgid "" "(This changes the sample type of the entire file, not just the selection)" msgstr "(Detta ndrar sampelformatet p hela filen, inte bara markerat omrde)" #: src/samplesizedialog.c:99 msgid "Don't actually change the data (for repairing bad files etc)" msgstr "ndra inte datat (fr att reparera felaktiga filer)" #: src/sound-alsalib.c:73 msgid "ALSA Preferences" msgstr "ALSA-instllningar" #: src/sound-alsalib.c:81 msgid "Playback device: " msgstr "Uppspelningsenhet: " #: src/sound-alsalib.c:85 msgid "Recording device: " msgstr "Inspelningsenhet: " #: src/sound-alsalib.c:91 msgid "Event driven I/O" msgstr "Hndelsedriven I/O" #: src/sound-alsalib.c:123 #, c-format msgid "Error opening ALSA device '%s' for recording: %s" msgstr "Fel vid ppnande av ALSA-enhet '%s' fr inspelning: %s" #: src/sound-alsalib.c:125 #, c-format msgid "Error opening ALSA device '%s' for playback: %s" msgstr "Fel vid ppnande av ALSA-enhet '%s' fr uppspelning: %s" #: src/sound-alsalib.c:273 msgid "snd_pcm_hw_params_set_access failed" msgstr "snd_pcm_hw_param_set_access misslyckades" #: src/sound-alsalib.c:278 msgid "snd_pcm_hw_params_set_format failed" msgstr "snd_pcm_hw_params_set_format misslyckades" #: src/sound-alsalib.c:283 msgid "snd_pcm_hw_params_set_channels failed" msgstr "snd_pcm_hw_params_set_channels misslyckades" #: src/sound-alsalib.c:288 msgid "snd_pcm_hw_params_set_rate failed" msgstr "snd_pcm_hw_params_set_rate misslyckades" #: src/sound-alsalib.c:293 #, fuzzy msgid "snd_pcm_hw_params_set_buffer_size_last failed" msgstr "snd_pcm_hw_params_set_format misslyckades" #: src/sound-alsalib.c:436 src/sound-alsalib.c:492 msgid "" msgstr "" #: src/sound-alsalib.c:536 msgid "" msgstr "" #: src/sound.c:167 msgid "SDL (output only)" msgstr "SDL (endast uppspelning)" #: src/sound.c:209 msgid "Dummy (no sound)" msgstr "Dummy (inget ljud)" #: src/sound.c:334 #, c-format msgid "" "Invalid driver name: %s\n" "Using '%s' driver instead" msgstr "" "Felaktigt drivrutinsnamn: %s\n" "Anvnder drivrutinen \"%s\" i stllet" #: src/sound-esound.c:59 #, c-format msgid "Couldn't connect to ESD daemon: %s" msgstr "Kunde inte koppla upp mot ESD-daemon: %s" #: src/sound-esound.c:114 msgid "EsounD: Unable to open playback stream" msgstr "EsounD: Kunde inte ppna uppspelningsstrm" #: src/sound-esound.c:130 msgid "EsounD: Unable to open recording stream" msgstr "EsounD: Kunde inte ppna inspelningsstrm" #: src/sound-esound.c:145 src/sound-esound.c:217 msgid "EsounD driver: select" msgstr "EsounD-drivrutin: select" #: src/sound-esound.c:157 msgid "EsounD driver: write" msgstr "EsounD-drivrutin: write" #: src/sound-esound.c:221 msgid "Esound connection closed by server" msgstr "Esound-uppkoppling stngd av server" #: src/sound-esound.c:227 msgid "EsounD driver: read" msgstr "EsounD-drivrutin: read" #: src/sound-esound.c:241 msgid "jump delay" msgstr "hoppfrdrjning" #: src/sound-esound.c:255 msgid "ESD preferences" msgstr "ESD-instllningar" #: src/sound-esound.c:263 msgid "" "If the cursor starts running too early when jumping, this delay should be " "increased." msgstr "" "Om markren brjar rulla fr tidigt nr man hoppar, ska denna frdrjning " "kas." #: src/sound-esound.c:269 msgid "Jump delay:" msgstr "Hoppfrdrjning:" #: src/sound-esound.c:278 msgid "" "Selecting the ESD host to connect to is done through the ESPEAKER " "environment variable." msgstr "Val av ESD-server att ansluta till grs genom miljvariabeln ESPEAKER." #: src/sound-jack.c:117 msgid "Invalid number of input ports." msgstr "Felaktigt antal inportar." #: src/sound-jack.c:121 msgid "Invalid number of output ports." msgstr "Felaktigt antal utportar." #: src/sound-jack.c:130 msgid "The client name change won't take effect until you restart the program." msgstr "" "ndringen av klientnamn kommer inte genomfras frrn du startat om " "programmet." #: src/sound-jack.c:187 msgid " Input ports " msgstr " Inportar " #: src/sound-jack.c:188 msgid " Output ports " msgstr " Utportar " #: src/sound-jack.c:197 msgid "Jack Preferences" msgstr "Jack-instllningar" #: src/sound-jack.c:206 msgid "Client name: " msgstr "Klientnamn: " #: src/sound-jack.c:223 msgid "Number of ports (0-8): " msgstr "Antal portar (0-8): " #: src/sound-jack.c:231 #, c-format msgid "Port #%d" msgstr "Port #%d" #: src/sound-jack.c:244 msgid "Automatically connect input ports on startup" msgstr "Anslut inportar automatiskt vid uppstart" #: src/sound-jack.c:250 msgid "Automatically connect output ports on startup" msgstr "Anslut utportar automatiskt vid uppstart" #: src/sound-jack.c:402 msgid "Over/underrun in JACK driver" msgstr "Over/underrun i JACK-drivrutin" #: src/sound-jack.c:417 msgid "jack_get_ports returned NULL" msgstr "jack_get_ports returnerade NULL" #: src/sound-jack.c:433 #, c-format msgid "Connection from %s to %s failed: %s" msgstr "Anslutning frn %s till %s misslyckades: %s" #: src/sound-jack.c:480 msgid "Could not connect to the JACK server." msgstr "Kunde inte ansluta till JACK-servern." #: src/sound-jack.c:494 msgid "Activation failed!" msgstr "Aktivering misslyckades!" #: src/sound-jack.c:825 #, c-format msgid "" "With JACK, the only supported recording format is Floating-point, single " "precision, %d Hz" msgstr "" "Med JACK r det enda inspelningsformat som stds, flyttal, normal precision, " "%d Hz" #: src/sound-oss.c:96 #, c-format msgid "Could not open '%s': %s" msgstr "Kunde inte ppna '%s': %s" #: src/sound-oss.c:109 #, c-format msgid "Error in sound driver: ioctl failed: %s" msgstr "Fel i ljuddrivrutin: ioctl misslyckades: %s" #: src/sound-oss.c:216 #, c-format msgid "Error in sound driver: write failed: %s" msgstr "Fel i ljuddrivrutin: write misslyckades: %s" #: src/sound-oss.c:229 #, c-format msgid "Error in sound driver: read failed: %s" msgstr "Fel i ljuddrivrutin: read misslyckades: %s" #: src/sound-oss.c:253 src/sound-oss.c:385 #, c-format msgid "Error in sound driver: select failed: %s" msgstr "Fel i ljuddrivrutin: select misslyckades: %s" #: src/sound-oss.c:440 msgid "OSS preferences" msgstr "OSS-instllningar" #: src/sound-oss.c:450 msgid "Playback device file:" msgstr "Device-fil fr uppspelning: " #: src/sound-oss.c:459 msgid "Recording device file:" msgstr "Device-fil fr inspelning: " #: src/sound-oss.c:465 msgid "Avoid select calls (try this if recording locks up)" msgstr "Lt bli select-anrop (prova detta om inspelningen lser sig)" #: src/sound-portaudio.c:61 msgid "sound-portaudio: No output devices available!" msgstr "sound-portaudio: Inga utenheter tillgngliga!" #: src/sound-portaudio.c:63 msgid "sound-portaudio: No input devices available!" msgstr "sound-portaudio: Inga inenheter tillgngliga!" #: src/sound-portaudio.c:191 src/sound-portaudio.c:278 #, c-format msgid "Pa_OpenStream failed: %s\n" msgstr "Pa_OpenStream misslyckades: %s\n" #: src/sound-portaudio.c:252 msgid "Buffer overrun!" msgstr "Buffert-overrun!" #: src/sound-sdl.c:38 #, c-format msgid "Could not initialize SDL: %s" msgstr "Kunde inte initiera SDL: %s" #: src/sound-sdl.c:89 #, c-format msgid "SDL: Couldn't open audio: %s" msgstr "SDL: Kunde inte ppna ljuduppspelning: %s" #: src/sound-sun.c:72 #, c-format msgid "SunAudio: Couldn't open %s" msgstr "SunAudio: Kunde inte ppna fil %s" #: src/sound-sun.c:159 msgid "SunAudio: Error writing to sound device" msgstr "SunAudio: Fel vid skrivning till ljudenhet" #: src/sound-sun.c:241 msgid "SunAudio: Error reading from sound device" msgstr "SunAudio: Fel vid lsning frn ljudenhet" #: src/soxdialog.c:54 msgid "Echo" msgstr "Eko" #: src/soxdialog.c:55 msgid "Echo sequence" msgstr "Ekosekvens" #: src/soxdialog.c:56 msgid "Reverb" msgstr "Reverb" #: src/soxdialog.c:57 msgid "Chorus" msgstr "Chorus" #: src/soxdialog.c:58 msgid "Flanger" msgstr "Flanger" #: src/soxdialog.c:59 msgid "Phaser" msgstr "Phaser" #: src/soxdialog.c:60 msgid "Compress/Expand" msgstr "Komprimera/Expandera" #: src/soxdialog.c:61 msgid "Pitch adjust" msgstr "Justera tonlge" #: src/soxdialog.c:62 msgid "Time stretch" msgstr "Tidsstrckning" #: src/soxdialog.c:63 msgid "DC Shift" msgstr "DC-skift" #: src/soxdialog.c:64 msgid "Masking noise" msgstr "Maskeringsbrus" #: src/soxdialog.c:65 msgid "Reverse" msgstr "Baklnges" #: src/soxdialog.c:66 msgid "Earwax" msgstr "Earwax" #: src/soxdialog.c:67 msgid "Vibro" msgstr "Vibro" #: src/soxdialog.c:68 msgid "Lowpass filter (single-pole)" msgstr "Lgpassfilter (enkelpol)" #: src/soxdialog.c:69 msgid "Highpass filter (single-pole)" msgstr "Hgpassfilter (enkelpol)" #: src/soxdialog.c:70 msgid "Bandpass filter" msgstr "Bandpassfilter" #: src/soxdialog.c:71 msgid "Butterworth lowpass filter" msgstr "Butterworth lgpassfilter" #: src/soxdialog.c:72 msgid "Butterworth highpass filter" msgstr "Butterworth hgpassfilter" #: src/soxdialog.c:73 msgid "Butterworth bandpass filter" msgstr "Butterworth bandpassfilter" #: src/soxdialog.c:74 msgid "Butterworth bandreject filter" msgstr "Butterworth bandstopp filter" #: src/soxdialog.c:75 msgid "Sinc-windowed filter" msgstr "Sinc-fnstrat filter" #: src/soxdialog.c:312 msgid "Frequency: " msgstr "Frekvens: " #: src/soxdialog.c:317 src/soxdialog.c:324 src/soxdialog.c:483 #: src/soxdialog.c:485 msgid "Hz" msgstr "Hz" #: src/soxdialog.c:327 msgid "Noise mode" msgstr "Brusig metod" #: src/soxdialog.c:387 msgid "Reverb time: " msgstr "Reverbtid: " #: src/soxdialog.c:392 msgid "ms" msgstr "ms" #: src/soxdialog.c:397 msgid "Delay (ms) " msgstr "Frdrjning (ms) " #: src/soxdialog.c:400 msgid "Decay " msgstr "Decay " #: src/soxdialog.c:404 msgid "Speed (Hz) " msgstr "Hastighet (Hz) " #: src/soxdialog.c:408 msgid "Depth (ms) " msgstr "Djup (ms) " #: src/soxdialog.c:412 msgid "Modulation " msgstr "Modulering " #: src/soxdialog.c:415 msgid "Modulation|Sinusoidal" msgstr "Sinusoid" #: src/soxdialog.c:416 msgid "Modulation|Triangular" msgstr "Triangulr" #: src/soxdialog.c:429 msgid "(Lines with delay=0 will be ignored.)" msgstr "(Rader med delay=0 kommer att ignoreras)" #: src/soxdialog.c:448 src/soxdialog.c:450 src/soxdialog.c:454 #: src/soxdialog.c:456 src/soxdialog.c:458 msgid "Input gain: " msgstr "Infrstrkning: " #: src/soxdialog.c:452 msgid "Output gain: " msgstr "Utfrstrkning: " #: src/soxdialog.c:464 msgid "Width: " msgstr "Bredd: " #: src/soxdialog.c:470 src/soxdialog.c:472 msgid "Bandwidth: " msgstr "Bandbredd: " #: src/soxdialog.c:481 msgid "Filter type: " msgstr "Filtertyp: " #: src/soxdialog.c:482 msgid "Low 6dB corner: " msgstr "Lgt 6dB-hrn: " #: src/soxdialog.c:484 msgid "High 6db corner: " msgstr "Hgt 6dB-hrn: " #: src/soxdialog.c:486 msgid "Window length: " msgstr "Fnsterlngd: " #: src/soxdialog.c:488 msgid "Beta" msgstr "Beta" #: src/soxdialog.c:491 msgid "Lowpass" msgstr "Lgpass" #: src/soxdialog.c:492 msgid "Highpass" msgstr "Hgpass" #: src/soxdialog.c:493 msgid "Bandpass" msgstr "Bandpass" #: src/soxdialog.c:526 msgid "Attack integration time: " msgstr "Attack integrationstid: " #: src/soxdialog.c:530 src/soxdialog.c:535 src/soxdialog.c:565 msgid " seconds" msgstr " sekunder" #: src/soxdialog.c:531 msgid "Decay integration time: " msgstr "Decay integrationstid: " #: src/soxdialog.c:538 msgid "Input level (dB)" msgstr "Ingngsniv (dB)" #: src/soxdialog.c:539 msgid "Output level (dB)" msgstr "Utgngsniv (dB)" #: src/soxdialog.c:552 msgid "Post-processing gain: " msgstr "Efterbearbetningsfrstrkning: " #: src/soxdialog.c:556 msgid " dB" msgstr " dB" #: src/soxdialog.c:557 msgid "Initial volume: " msgstr "Startvolym: " #: src/soxdialog.c:561 msgid "Delay time: " msgstr "Frdrjning: " #: src/soxdialog.c:570 msgid "Shift amount: " msgstr "Skiftmngd: " #: src/soxdialog.c:574 msgid "Peak limiter" msgstr "Toppbegrnsning" #: src/soxdialog.c:578 msgid "Limiter gain: " msgstr "Begrnsarens frstrkning: " #: src/soxdialog.c:591 msgid "Amount: " msgstr "Mngd: " #: src/soxdialog.c:592 msgid " cents" msgstr " cent" #: src/soxdialog.c:593 msgid "Window width: " msgstr "Fnsterbredd: " #: src/soxdialog.c:594 src/soxdialog.c:625 msgid " ms" msgstr " ms" #: src/soxdialog.c:595 msgid "Interpolation: " msgstr "Interpolering: " #: src/soxdialog.c:596 msgid "Fade: " msgstr "Fade: " #: src/soxdialog.c:605 msgid "Interpolation|Cubic" msgstr "Kubisk" #: src/soxdialog.c:606 msgid "Interpolation|Linear" msgstr "Linjr" #: src/soxdialog.c:612 msgid "Fade|Cos" msgstr "Cos" #: src/soxdialog.c:613 msgid "Fade|Hamming" msgstr "Hamming" #: src/soxdialog.c:614 msgid "Fade|Linear" msgstr "Linjr" #: src/soxdialog.c:615 msgid "Fade|Trapezoid" msgstr "Trapezoid" #: src/soxdialog.c:623 msgid "Factor: " msgstr "Faktor: " #: src/soxdialog.c:624 msgid "Window size: " msgstr "Fnsterstorlek: " #: src/soxdialog.c:636 msgid "Speed: " msgstr "Hastighet: " #: src/soxdialog.c:637 msgid " Hz" msgstr " Hz" #: src/soxdialog.c:638 msgid "Depth: " msgstr "Djup: " #: src/soxdialog.c:649 msgid "This effect has no options." msgstr "Denna effekt har inga alternativ." #: src/soxdialog.c:723 msgid "Error creating pipe" msgstr "Fel vid skapande av pipe" #: src/soxdialog.c:730 msgid "Couldn't fork" msgstr "Kunde inte gra fork" #: src/soxdialog.c:745 #, c-format msgid "Error running 'sox -h': %s\n" msgstr "Fel vid krning av 'sox -h': %s\n" #: src/soxdialog.c:747 msgid "Should not reach this point" msgstr "Borde inte n denna punkt" #: src/soxdialog.c:762 msgid "Error reading sox output" msgstr "Fel vid lsning av utdata frn sox" #: src/soxdialog.c:794 msgid "Unable to detect supported SoX effects" msgstr "Kunde inte detektera stdda SoX-effekter" #: src/soxdialog.c:832 msgid "Sox support couldn't be initialized" msgstr "Sox-std kunde inte initieras" #: src/speeddialog.c:58 msgid "Speed:" msgstr "Hastighet:" #: src/statusbar.c:72 msgid "(no file loaded)" msgstr "(ingen fil inladdad)" #: src/statusbar.c:235 msgid "Cursor: running" msgstr "Markr: spelar" #: src/statusbar.c:237 msgid "Cursor: " msgstr "Markr: " #: src/statusbar.c:260 #, c-format msgid "View: [ %s - %s ]" msgstr "Vy: [ %s - %s ]" #: src/statusbar.c:281 #, c-format msgid "Selection: %s+%s" msgstr "Markering: %s+%s" #: src/statusbar.c:304 msgid "Processing data" msgstr "Bearbetar data" #: src/statusbar.c:306 #, c-format msgid "%s... (Press ESC to cancel)" msgstr "%s... (Tryck ESC fr att avbryta)" #: src/um.c:51 msgid "mhWaveEdit: " msgstr "mhWaveEdit: " #: src/um.c:64 #, c-format msgid "mhWaveEdit: %s: %s\n" msgstr "mhWaveEdit: %s: %s\n" #: src/um.c:97 msgid "Message" msgstr "Meddelande" #: src/um.c:117 msgid "Yes" msgstr "Ja" #: src/um.c:125 msgid "No" msgstr "Nej" #: src/um.c:318 msgid "Input" msgstr "Inmatning" #: src/um.c:407 msgid "Choice" msgstr "Val" #: src/volumedialog.c:71 msgid "Calculating peak volume..." msgstr "Berknar toppvolym..." #: src/volumedialog.c:87 msgid "Start:" msgstr "Start:" #: src/volumedialog.c:90 msgid "End:" msgstr "Slut:" #: src/volumedialog.c:109 msgid "Find top volume" msgstr "Berkna toppvolym" #: src/document.c:230 #, c-format msgid "untitled #%d" msgstr "namnls #%d" #: src/document.c:282 msgid "" "Loading and then saving files with 'lossy' formats (like mp3 and ogg) leads " "to a quality loss, also for the unmodified parts of the file." msgstr "" "Om man laddar in och sedan sparar filer i icke frlustfria format (som mp3 " "eller ogg) tappar man lite i kvalitet, ven fr de delar av filen som inte " "redigerats." #: src/session.c:87 msgid "Error opening session directory" msgstr "Fel vid ppning av sessionskatalog" #: src/session.c:104 src/session.c:164 #, c-format msgid "%s: Wrong file type" msgstr "%s: Fel filtyp" #: src/session.c:238 msgid "Could not create session file" msgstr "Kunde inte skapa sessionsfil" #: src/session.c:280 msgid "" "The files that belonged to the crashed session have been recovered. Any " "files that are not saved will be removed permanently.\n" "\n" "(This notice is only shown once)" msgstr "" "Filerna som tillhrde den kraschade sessionen har terstllts. De filer som " "inte sparas kommer att raderas.\n" "\n" "(Detta meddelande visas bara en gng)" #: src/session.c:380 msgid "Suspended" msgstr "Sparad" #: src/session.c:380 src/session.c:381 msgid "Crash" msgstr "Krasch" #: src/session.c:381 msgid "Left files" msgstr "verblivna filer" #: src/session.c:391 #, c-format msgid "%s on %s(%d files, %ld bytes)" msgstr "%s, %s(%d filer, %ld byte)" #: src/session.c:409 msgid "Sessions" msgstr "Sessioner" #: src/session.c:419 msgid "" "Earlier sessions were found. Choose one to resume or start a new session." msgstr "" "Data frn tidigare sessioner hittades. Vlj en session att terstlla eller " "pbrja en ny session." #: src/session.c:439 msgid "Resume selected" msgstr "terstll" #: src/session.c:449 msgid "Delete selected" msgstr "Ta bort markerat" #: src/session.c:456 msgid "Start new session" msgstr "Ny session" #: src/session.c:462 msgid "Exit" msgstr "Avsluta" #: src/mapchannelsdialog.c:116 msgid "This effect applies to the whole file, not just the selection" msgstr "Effekten pverkar hela filen, inte bara markerat omrde" #: src/mapchannelsdialog.c:123 msgid "Output channels: " msgstr "Antal utkanaler: " #: src/mapchannelsdialog.c:130 msgid "Map" msgstr "Koppling" #: src/mapchannelsdialog.c:137 msgid "Source" msgstr "Inkanal" #: src/mapchannelsdialog.c:139 msgid "Destination" msgstr "Utkanal" #: src/sandwichdialog.c:107 msgid "Align beginning of files" msgstr "Brja samtidigt" #: src/sandwichdialog.c:110 msgid "Align end of files" msgstr "Sluta samtidigt" #: src/sandwichdialog.c:113 msgid "Align at marker: " msgstr "Gemensamt mrke: " #: src/sandwichdialog.c:126 msgid "Add channels from: " msgstr "Lgg till kanaler frn: " #: src/sandwichdialog.c:130 msgid "Alignment" msgstr "Positionering" #~ msgid "double" #~ msgstr "dubbel" #~ msgid "float" #~ msgstr "flyttal" #~ msgid "mhWaveEdit: %s (%s): %d Hz, %d bit" #~ msgstr "mhWaveEdit: %s (%s): %d Hz, %d bitar" #~ msgid "Follow cursor while playing" #~ msgstr "Flj markren under spelning" #~ msgid "Removing channel" #~ msgstr "Tar bort kanal" #~ msgid "Mapping channels" #~ msgstr "Flyttar kanaler" #~ msgid "Removing channels" #~ msgstr "Tar bort kanaler" #~ msgid "Adding channels" #~ msgstr "Lgger till kanaler" #~ msgid "Choose a sample format" #~ msgstr "Vlj ett sampelformat" #~ msgid "%d-bit" #~ msgstr "%d bitar" #~ msgid "%s (%s %s %d Hz)" #~ msgstr "%s (%s %s %d Hz)" #~ msgid "%s %s %d Hz" #~ msgstr "%s %s %d Hz" #~ msgid "Other format..." #~ msgstr "Annat format..." #~ msgid "" #~ "To add this format to the presets, enter a name below. Otherwise, leave " #~ "it blank." #~ msgstr "" #~ "Fr att lgga till detta format till de frinstllda, skriv in ett namn " #~ "nedan. Annars, lmna det tomt. " #~ msgid "Sound device file:" #~ msgstr "Ljudenhets-fil:" #~ msgid "" #~ "Environment variable LADSPA_PATH not set.\n" #~ "LADSPA support is disabled." #~ msgstr "" #~ "Miljvariabeln LADSPA_PATH har inte satts.\n" #~ "Std fr LADSPA har drfr stngts av." #~ msgid "8-bit wav-files must be in unsigned format!" #~ msgstr "8-bitars wavfiler mste ha sampelformat utan tecken!" #~ msgid "16/24/32-bit wav-files must be in signed format!" #~ msgstr "16/24/32-bitars wavfiler mste ha sampelformat med tecken!" #~ msgid "wav files must be in little endian format!" #~ msgstr "wav-filer mste ha little-endian sampleformat!" #~ msgid "/Debug/Mark as modified" #~ msgstr "/Debug/Mrk som ndrad" #~ msgid "[B] Convert samplerate" #~ msgstr "[B] Omvandla samplingsfrekvens" #~ msgid "[B] Map channels" #~ msgstr "[B] ndra kanaler" #~ msgid "[B] Speed" #~ msgstr "[B] Hastighet" #~ msgid "Channel %d" #~ msgstr "Kanal %d" #~ msgid "/Effects/Sp_lit channel..." #~ msgstr "/Effekter/De_la kanal..." #~ msgid "SoX only supports 8, 16 and 32-bit sample sizes" #~ msgstr "SoX stder endast 8, 16 och 32-bitars sampelstorlekar" #~ msgid "This will clear the entire undo buffer!" #~ msgstr "Detta kommer att tmma hela ngra-bufferten!" #~ msgid "This will clear the undo buffer up to the last save" #~ msgstr "Detta kommer att tmma ngra-bufferten bort till senaste sparningen" #~ msgid "/Edit/Clear undo buffer" #~ msgstr "/Redigera/Rensa ngra-buffert" #~ msgid "Conversion method: " #~ msgstr "Omvandlingsmetod: " #~ msgid "mhWaveEdit: Couldn't open %s: %s\n" #~ msgstr "mhWaveEdit: Kunde inte ppna %s: %s\n" mhwaveedit-1.4.24/po/zh_CN.gmo000066400000000000000000000775661334022513400161040ustar00rootroot00000000000000 *.* ** +++ .+:+K+c+ u++ + ++++++,$, >,L,],d,v,},, ,, ,,,,--/- >-%J-Jp-I- .. ".V-....-./..,/ [/h/x//////0"0<0W0q0 0 000000 1 1131E1Y1k1}11 1 11 1 1 1 1 2 2 2 #2-2C2"W2z222222 3/3M3c3w3!3 3 3 3 334 4 )454 D4 P4 [4 f4s44444 4 4455!515J5a5s5 5 5555555 5 5 5 5566'606 96D6 J6U6j6 6$666667 7)7 27>7 C7 N7Y7_7p7 77777 777 8 88"#8F8)M8w8888!888 99)9IG9%9999::,:2:K:R:[:k:{: :::::: : ;; ';4; <;H;P;j;S~;<;I<Y<"a<<<<<<< </ =;= P=q=-====> &>0>@>*E>p>>>> > >>>>> ? %?1? 7?E?U?\?s?? ??? ??1??@ @#@ 4@!A@c@ r@|@@@1@@@(A 9A%EA0kAA AA AAAA A B B#B9BAB`BhBxB |BBBBBBBBB BBCC C$C+CX KXUX \XiX qX ~X X X X X X X X X X X YY 0Y =YJY QY^YeYlY qY{YYYYYY Z(Z 7ZCZ?aZDZZZ [D[ U[b[t[[[[ [[[ [ [[ [[ [[\"\5\=\E\L\ _\l\|\ \ \\\\ \\ \ ] ] ]#] 4] ?] J]U]]]e]m] u]]]]]] ] ]]^'^7^K^ b^p^^^^^^^^ ^ ^ ^ ___ _ +_6_G_X_ o_ }____ _ _____ `` ` '` 2` =` H` S` ^` i` t` ``` `` ` `` ``` aa=aVaiaaaaa aa6a6a0b 4bAb Tb_bobbb bbbb bbbcc .c8;ctc cccc ccc? dMdmdddddddd dee&e9eIe`eve}eeee ee eeeefYf8wfKffg#g*gAg^gug gg'ggg g#h!?hahthh hhh*hh i i i 'i4i;iNidizi iiiiiiii j j)j0j 7jDj&Kjrjjjj jj jj j jj1k-6kdksk$k1k kkk llll9.l9hl lllll ll mmm m'm7mLmSm Zmgmnmum |m m mmmmm mmmn!n;n BnAMnnn nnnn no0o Oo \oio yo oooooo o oo pp p ,p 9pCp JpTp]p |p pp p ppp pppq q $q1qAqEq0Uqq qqq qqqq rr$r+r;rMrTr$[r$rrr"rrs".s Qs[sHnsss ss sss t t #t -t :tDtwttYttuKuUupUvGvw{.w*ww<w'1xYxix yx{xyy/yBy\yryy yy$yyy4y41zfzzzzzzz{ {{#{3{C{G{Q{$3| X| b|%m||9| | | |+|)}.=}Fl} } }} } } } ~*~G~]~v~~~~~ ~~~ " 1 ; ESW h$eH 2L{\vfSD 3"hX Q<;FA"Gj5bUbG 08klmn1uv2}aPx5  T!#P?-4cp=9WXYZfudq,t/H7z#g>:Rly[N90Mz~(F r]Q\Oi(s*o'?6&;%Sc+ABi,mNDCV`& wRenjoKE @|L^@WJK`>r|%1}s$y3k[]h.gI .x4<'Vw)!7^{):_TM-C+pId=~qO/  *B8JUa6ZYEt_ Test results (1 time unit = %f usec/sample) Window '%s' Current chunk: History: and: Advanced settings Dithering Driver options External applications Fallback format Input audio Input controls Input ports Main window Output audio Output controls Output ports Playback settings Rate conversions Temporary file directories Temporary file settings Time format Variable speed View Window contents cents ms seconds%d channels%s is not a valid wav file%s kbit/s%s... (Press ESC to cancel)%s: Expected '=': %s %s: Expected value: %s %s: Wrong file type'%s' is not a number!(H')MM:SS.mmmm(H')MM:SS.t(Lines with delay=0 will be ignored.)(This changes the sample rate of the entire file, not just the selection)(This changes the sample type of the entire file, not just the selection)(expected) (no file loaded)(no limit)(use a negative number to place the cursor before instead of after the selected point)/Cursor/Find zero-crossing/Cursor/Find zero-crossing/Left (all channels)/Cursor/Find zero-crossing/Left (any channel)/Cursor/Find zero-crossing/Right (all channels)/Cursor/Find zero-crossing/Right (any channel)/Cursor/Move/Cursor/Move to/Cursor/Move to/Beginning/Cursor/Move to/End/Cursor/Move to/Selection end/Cursor/Move to/Selection start/Cursor/Move/Left/Cursor/Move/Left sample/Cursor/Move/Right/Cursor/Move/Right sample/Cursor/Position cursor.../Cursor/Set selection end/Cursor/Set selection start/Cursor/sep1/Cursor/sep2/Debug/Debug/Check opencount/Debug/Dummy effect/Debug/Dump chunk info/Edit/Clear clipboard/Edit/Cr_op/Edit/Cu_t/Edit/Insert _silence/Edit/Paste _over/Edit/Paste to _new/Edit/Preferences/Edit/Select _all/Edit/Select none/Edit/Silence selection/Edit/_Copy/Edit/_Delete/Edit/_Mix paste/Edit/_Paste/Edit/_Redo/Edit/_Undo/Edit/sep1/Edit/sep2/Edit/sep3/Edit/sep4/Effec_ts/Effects/Add channe_l/Effects/B_yte swap/Effects/Convert sample _format.../Effects/Convert sample_rate.../Effects/Effects dialog.../Effects/Fade _in/Effects/Fade o_ut/Effects/Ma_p channels.../Effects/Normali_ze to.../Effects/Pipe through program.../Effects/_Combine channels.../Effects/_Mix to mono/Effects/_Normalize/Effects/_Speed adjustment.../Effects/_Volume adjust (fade).../Effects/sep1/Effects/sep2/Effects/sep3/Effects/sep4/File/Save _as.../File/Save selection as.../File/_Close/File/_Exit/File/_Open.../File/_Save/File/sep1/File/sep2/Help/_About/Help/_Documentation/Play/Play _all/Play/Play se_lection/Play/_Play from cursor/Play/_Record.../Play/_Stop/Play/sep1/View/Sp_eed slider/View/Zoom _all/View/Zoom _in/View/Zoom _out/View/Zoom to _selection/View/_Horizontal zoom/View/_Time scale/View/_Vertical zoom/View/sep1/View/sep2/_Cursor/_Edit/_File/_Help/_Play/_View16 bit PCM24 bit PCM32 bit PCM8 bit PCMALSA PreferencesAbout mhWaveEditAdjusting speedAdvancedAmount: AmplifyingApplyApply to: Applying effect '%s'Attack integration time: Author: %sAuto dete_ct driver on each start-upAuto return to playback startAuto stop in: Auto-_reset speedAuto-detect from extensionAverage bitrateBackgroundBandpassBandwidth: BetaBig endianBig-endianBlackBrowse directoryBuffer overrun!Bug reportingBytes written: Calculating peak levelCalculating peak volume...CancelChannels: ChoiceChunk %p has opencount=%d Client name: Clipping: CloseClose dialog after applying effectColorsCommand failed without returning any dataCommand line: Compiled %s %sConstant bitrateContactConversion test failed, between: Converting samplerateCopy the current selectionCopyright: %sCould not create pipe: %sCould not create session fileCould not find home directory. Using current directory as home directory.Could not get file position in %s: %sCould not open %s: %sCould not read from %s: %sCould not remove '%s': %sCould not seek in %s: %sCouldn't open %sCrashCurrent sound driver: %sCursorCursor: Cursor: runningCustom argumentCustom argument: Custom formatCustomize co_lors...Cut out the current selectionDecay Decay integration time: DecodingDelay (ms) Delay time: Delete the selectionDepth (ms) Depth: DestinationDisableDisk editing _threshold: Display t_imes as: Distributed under GNU General Public License. For information, see the file COPYINGDon't actually change the data (for repairing bad files etc)Earlier sessions were found. Choose one to resume or start a new session.EditingEffect %s contains invalid port %sEffectsEnable _dithering for editingEnable _variable speed playbackEnable dithering for _playbackEncoding type: End:Endianness: Error changing samplerate conversion ratio: %s Error closing %s: %sError converting samplerate: %s Error creating link to '%s': %sError initialising sample rate conversion: %sError launching mixer: fork: %sError reading %s: %sError reading from %s: %sError seeking in %s: %sError: %sError: fork: %sExitExpected driver name after --driver optionExtreme (higher quality)Factor: Fade: Fade|CosFade|HammingFade|LinearFade|TrapezoidFailed to open '%s'!Failed to write to '%s'!File already exists. Overwrite?File formatsFile type: FilesFilter type: Find top volumeFinishFloating-point, doubleFloating-point, singleFormat not selectedFrequency: GeneralHeavyHelping outHighpassIgnoring extreme old window size/position values Initial volume: InputInput gain: Input level (dB)Input levelsInsane (highest possible quality)Insert SilenceInterfaceInterpolation: Interpolation|CubicInterpolation|LinearInvalid driver name: %s Using '%s' driver insteadInvalid sample format or number of channels for this file formatJack PreferencesJump delay:Keep data in unmapped output channelsKeep main _window in front after applying effectKeyboard shortcutsL WaveformLadspa: Error scanning %sLaunch mixerLeftLevel: Limiter gain: Little endianLittle-endianLoad FileLoad a file from diskLoadingLoop mode (play over and over)LowpassMP3 PreferencesMapMap channelsMarksMessageMethod: Mi_xer utility: Microsoft WAV formatMildMixingMixing channelsModulation Modulation|SinusoidalModulation|TriangularMonoN/AName :New samplerate: NoNo errors detected!No file with that name!Noise modeNoneNormalize to...Number of ports (0-8): Number of recent files in File menu: OKOgg VorbisOn this system, libsndfile is required to save floating-point wav files.OtherOutput _buffer size:Output channels: Output from command '%s': Output gain: Output level (dB)Overruns: Paste at cursor positionPaste, overwriting the data after the cursor positionPause recordingPeak limiterPeak max: Peak: Place cursor Play from cursor positionPlay selected areaPlaybackPlayback device: PlayingPort #%dPosition cursorPost-processing gain: PreferencesPreparing tests..Process outputProcessing dataProgress barQualityQuality: R WaveformRange test failed for format: Raw PCM dataReady for recordingRecordRecordStatus|PausedRecordStatus|RecordingRecordingRecording device: Recording settingsRecording status: Redo the last undo operationReset max peaksResume recordingResume selectedReverb time: RightRunning tests..Sample format to try when the sound file's format isn't supported.Sample format: Sample rate: Sample type: Sample viewSave FileSave changes to %s?Save selection as ...Save the current file to diskSavingSeconds of silence: SelectionSelection: %s+%sSend wav headerSessionsSetSet selection end to cursor positionSet selection start to cursor positionShift amount: Should not reach this point!Show _horizontal zoom slider by defaultShow _speed slider by defaultShow _time scale by defaultShow _vertical zoom slider by defaultSignedSignedness: Some of the settings you have changed will not be activated until you restart the programSoundSourceSpeed (Hz) Speed effect: Speed:Standard (high quality)Start new sessionStart recordingStart:StereoStop playingSuspendedSyntax: %s [files] Testing conversion functions finished.Testing conversion functions:The file %s does not exist!The file %s is a compressed wav file. This program can only work with uncompressed wav files.The file %s is not a regular file!The file %s may be destroyed since the saving failed. Try to free up some disk space and save again. If you exit now the file's contents could be in a bad state. The file has not changed since last save. Press OK if you want to save it anyway?The file name '%s' has an extension unknown to the program. Please specify in which format this file should be saved.The files that belonged to the crashed session have been recovered. Any files that are not saved will be removed permanently. (This notice is only shown once)The format of file '%s' could not be recognized. Please specify the sample format below.The mixed result was clipped %d times.The sign and endian-ness can usually be left at their defaults, but should be changed if you're unable to record or get bad sound.The sound format of this file is not supported for playing.There already is only one channel!This effect applies to the whole file, not just the selectionThis format is not supported by the input driver!Time limit: Time recorded: TimeDisplay|SamplesTo avoid rounding errors when applying more than one effect on the same data, floating-point temporary files can be used. However, this will increase disk and CPU usage.Unable to write data to %sUndo the last changeUnexpected end of fileUnexpected end of file reading from %sUnknown file formatUnknown file typeUnknown option '%s'UnsignedUse default settingsUse fast and noisy methodUse this setting by defaultUses double-precision mathValue for %s must be a number between %ld and %ldValue for '%s' must be a number between %f and %fValue for '%s' must not be above %fValue for '%s' must not be below %fVariable bitrate (default)Varispeed: View _quality:View: [ %s - %s ]Warning: Unexpected error: %sWhiteWidth: Window length: Window size: Window width: YesYou are saving a wav file larger than 2048MB. Such large files are non-standard and may not be readable by all programs. (this warning will not be displayed again)You have mapped more than one output port to channel '%s'. You can only map one output port to each channel.You have no open file to apply the effect to!Zero-level_Add_Auto-start playback when jumping to mark_Browse..._Byte-swap output (try this if playback sounds horrible)_Cancel_Close_Down_Draw waveform a second time with improved quality_Driver:_Keep cursor in center of view when following playback_Keep sound driver opened (to avoid start/stop clicks)_OK_Preview_Remember window sizes/positions_Remove_Settings_Up_Update cursor information while playing_Use floating-point temporary filesafter beginning of fileafter current cursor positionafter end of fileafter selection endafter selection startbytesmhWaveEdit HelpmhWaveEdit: mhWaveEdit: %s (%s): %d Hz, %smhWaveEdit: %s: %s msnumber of recent filesputenv failed!sample ratesamplessamples/pixelsecondsunsetenv failed!untitled #%dProject-Id-Version: mhwaveedit Report-Msgid-Bugs-To: POT-Creation-Date: 2018-08-25 11:56+0200 PO-Revision-Date: 2007-07-11 21:36+0800 Last-Translator: lon Language-Team: LONCHINA 简体中文 Language: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: KBabel 1.11.4 测试结果 (1时间单位 = %f 秒/取样) 窗口 '%s' 当前块:历史:和:高级设置抖动 驱动设置外部程序撤退格式输入音频输入控制输入端口主窗口输出音频输出控制输出端口回放设置速率转换临时文件目录临时文件设置时间格式改变速率视图窗口内容美分毫秒 秒%d 声道%s 不是有效的 WAV 文件%s 千比特/秒 (kbit/s)%s... (按 ESC 取消)%s: 期望 '=': %s %s: 期望值: %s %s:错误文件类型'%s' 不是一个数字!(H')MM:SS.mmmm(H')MM:SS.t(行数显示=0 将被忽略)(整个文件此声道的取样率 不一定正好是选择的)(整个文件此声道的取样类型,不一定正好是选择的)(期望)(没有文件载入)(无限制)(用一个负数定位光标代替之后选择点前面位置的点)查找交零左(全部声道)左(任一声道)右(全部声道)右(任一声道)移动移动到开头结束选择结束选择开始左左取样右右取样光标位置...设为选择结束设为选择开始分离1分离2调试检查打开计数虚拟特效转储块信息清除剪切板栽剪(_O)剪切(_T)插入静音(_S)覆盖粘贴(_O)粘贴到新文件(_N)首选项选择全部(_A)无选择静音选择复制(_C)删除(_D)混合粘贴(_M)粘贴(_P)重做(_R)撤消(_U)分离1分离2分离3分离4特效(_T)添加声道(_L)字节交换(_Y)转换取样格式...(_F)变换取样速率...(_R)特效对话框...淡入(_I)淡出(_U)映射声道...(_P)标准化为...(_Z)管道程序...合并声道...(_C)混合成单声道(_M)标准化(_N)速率调整(_S)音量调整(淡入)...(_V)分离1分离2分离3分离4另保存...(_A)选择另存为...关闭(_C)退出(_E)打开...(_O)保存(_S)分离1分离2关于(_A)文档(_D)播放全部(_A)播放已选(_L)从光标处播放(_P)录音...(_R)停止(_S)分离1速率滑块(_E)缩放全部(_A)放大(_I)缩小(_O)缩放选择(_S)水平缩放(_H)时间标尺(_T)垂直缩放(_V)分离1分离2光标(_C)编辑(_E)文件(_F)帮助(_H)播放(_P)视图(_V)16 bit PCM24 bit PCM32 bit PCM8 bit PCMALSA 首选项关于 mhWaveEdit调整速率高级合计:正在放大应用应用到:应用特效 '%s'增益积分时间:作者:%s启动时自动检测驱动(_C)自动返回启动回放自动停止在:自动恢复速率(R)自动检测扩展名平均位速率背景带通带宽:BetaBig-endian字节序(以高位结束一种存储方式)Big-endian字节序(以高位结束一种存储方式)黑浏览目录缓冲器超限!Bug 报告字节写入:计算峰值电平计算峰值音量...取消声道:选择块 %p 打开计数=%d 客户名称:限幅:关闭关闭会话在应用特效后颜色命令失败没有返回数据命令行:编译于 %s %s 中文化:李红昆 固定位速率联系人转换测试失败,介于:转换取样率复制当前选择版权:%s无法创建管道:%s无法创建会话文件没有找到个人目录。使用当前目录为个人目录。无法获得文件位置 %s: %s无法打开 %s: %s无法读取 %s: %s不能删除 '%s': %s无法查找 %s: %s无法打开 %s崩溃当前声音驱动:%s光标光标:光标:正在运行自定义参数自定义变量:自定义格式自定义颜色...(_L)剪切出当前选择延迟衰减积分时间:译码延迟(毫秒):延迟时间:删除选择深度(毫秒)深度:目标禁用磁盘编辑阈值:显示时间为(_I):发布在 GNU General Public License 协议下。 关于信息,查看文件 COPYING 。无法真正的改变这数据(如修复损坏文件等)发现以前的会话。选择一个再继续或开始一个新的会话。编辑特效 %s 包含非法窗口 %s特效允许编辑抖动(_D)允许改变速率回放(_V)允许回放抖动(_P)编码类型:结束:字节排序:改变取样率转换比例错误:%s 结束错误:%s: %s转换取样率错误: %s 创建链结到 '%s': %s 错误初始化取样率转换错误:%s启用混音错误:派生: %s读取错误 %s %s读取错误 %s: %s查找错误在 %s: %s错误: %s错误:派生: %s退出期望驱动名称于 --驱动设置之后最大程度(高品质)系数:淡入:余弦加重平衡线性不规则四边形打开 '%s' 失败!写入 '%s' 错误!文件已存在。覆盖吗?文件格式文件类型:文件过滤器类型:查找峰值音量完成浮点,双精度浮点,单精度格式没有选择频率:常规强硬更多帮助高通忽略极旧的窗口大小/位置值 初始音量:输入输入增益:输入电平(dB)输入电平疯狂(可能最高品质)插入静音界面内插:三次曲线线性非法驱动名: %s 使用 '%s' 驱动代替。非法的取样格式或文件格式声道数Jack 首选项跳跃延迟:保持数据在非映射输出声道应用特效之后保持主窗口常居顶端(_W)快捷键L 波形Ladspa:扫描错误 %s启动混音左电平限制增益:Little-endian字节序(以低位结束一种存储方式)Little-endian字节序(以低位结束一种存储方式)装入文件从磁盘装入文件载入循环模式(反复播放)低通MP3首选项映射映射声道标记消息方法:混音程序:Microsoft WAV format柔和混合混合声道调音正弦三角单声道不可用名称:新建取样率:否没有检测出错误!没有那名字的文件!杂讯模式无标准化为...端口数字(0-8)文件菜单中最近文件数:确定Ogg Vorbis在这个系统, libsndfile 必需保存为浮点 WAV 文件。其它输出缓冲区大小:输出声道输出格式命令 '%s': 输出增益:输出电平(dB)超限:粘贴在当前光标位置粘贴,覆盖当前光标位置之后的数据暂停录音峰值限制最大峰值:峰值:定位光标从光标位置播放播放选择区域回放回放设备:播放端口 #%d定位光标后期处理增益:首选项准备测试...进程输出处理数据进度栏品质质量:R 波形范围检验失败的格式:Raw PCM data录音就绪录音已暂停正在录音录音录音设备:录音设置录音状态:重做最后撤消的改变重置最大峰值继续录音继续选择余响时间:右运行测试...声音文件格式不支持时测试取样格式取样格式:取样率:取样类型:视图保存文件保存更改到 %s ?选择另存为...保存当前文件到磁盘保存静音秒数:选择选择: %s+%s发送 wav 标题会话设置光标位置从选择的位置结束光标位置从选择的位置开始转换合计:将无法达到这个点!显示默认水平缩放滑块(_H)显示默认速率滑块(_S)显示默认时间刻度(_T)显示默认垂直缩放滑块(_V)有符号有符号类型:您更改了的一些设置不会被激活直到重新启动应用程序声音源速率(Hz)速率特效:速率:标准(高品质)开始新的会话开始录音开始:立体声停止播放已挂起语法: %s [文件] 测试转换功能完成。测试转换功能:文件 %s 不存在!文件 %s 是一个压缩的 WAV 文件。此程序只能打开未压缩的 WAV 文件。文件 %s 不是正常文件!文件 %s 自从保存失败可能已损坏。尝试释放一些磁盘空间再次保存,如果现在退出文件内容可能处于损坏状态。自上次保存文件没有改变。如果您硬要保存它请按确定?文件名 %s 对于程序是未知扩展名。请指定此文件应保存的格式。文件属于已恢复的崩溃会话。任何文件都没有保存将永久删除。 (此信息只显示一次)文件 '%s' 的格式无法确定。 请在下面指定取样格式。混合过程限幅 %d 时间。符号和字节存储次序通常为上面(#左边)默认值,但是您如果无法录音或音质很次时将改变它。不支持此类声音格式文件的播放那早就是一个声道了!此特效应用到整个文件,不一定正好是选择的输入驱动程序不支持此格式!时间限制:时间录音:时间|取样当使用更多特效时为避免舍入错误,使用浮点临时文件。然而,这将增加磁盘和CPU的使用量。无法写入数据到 %s撤消最后改变文件意外结束读取 %s 时意外终止未知的文件格式未知文件类型未知设置 '%s'无符号使用默认设置使用快速而且有噪音的方法使用默认设置使用双精度%s 数值必需是一个 %ld 和 %ld 之间的数字'%s' 数值必需是一个 %f 和 %f 之间的数字'%s' 数值必需高于 %f'%s' 数值必需低于 %f可变位速率(默认)调整速率:视图品质:视图: [ %s - %s ]警告:意外错误:%s白宽度:窗口长度:窗口大小:窗口宽度:是您正在保存大于2048MB的 WAV 文件。这样大的文件并无标准并且可能所有的程序都无法读取它。 (此警告不会再次显示)声道 '%s' 使用太多输出端口映射。每个声道只能有一个映射。您没有文件可应用这特效!零电平添加(_A)跳到标记时自动启动回放(_A)浏览....(_B)字节交换输出(如果回放声音难听尝试它)(_B)取消(_C)关闭(_C)向下(_D)绘制每一秒的波形以提高品质(_D)驱动程序(_D):再次回放时保持光标在视图中心(_K)保持声音驱动程序打开着(避免开启/关闭的卡嗒声)(_K)确定(_O)预览(_P)记住窗口大小和位置(_R)删除(_R)设置(_S)向上(_U)播放时更新光标信息(_U)使用浮点临时文件(_U)在文件开头之后当前光标位置之后在文件结束之后选择结束之后先择开始之后字节mhWaveEdit 帮助mhWaveEdit: mhWaveEdit: %s (%s): %d Hz, %smhWaveEdit: %s: %s 毫秒最近文件数putenv failed!取样率取样率取样/像素秒unsetenv failed!无标题 #%dmhwaveedit-1.4.24/po/zh_CN.po000066400000000000000000002465031334022513400157250ustar00rootroot00000000000000# translation of mhwaveedit.po to LONCHINA 简体中文 # Copyright (C) YEAR Magnus Hjorth # This file is distributed under the same license as the PACKAGE package. # # lon , 2007. msgid "" msgstr "" "Project-Id-Version: mhwaveedit\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-08-25 11:56+0200\n" "PO-Revision-Date: 2007-07-11 21:36+0800\n" "Last-Translator: lon \n" "Language-Team: LONCHINA 简体中文\n" "Language: \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/chunk.c:199 msgid "Converting samplerate" msgstr "转换取样率" #: src/chunk.c:226 msgid "Adjusting speed" msgstr "调整速率" #: src/chunk.c:703 msgid "Mixing" msgstr "混合" #: src/chunk.c:758 #, c-format msgid "The mixed result was clipped %d times." msgstr "混合过程限幅 %d 时间。" #: src/chunk.c:822 #, fuzzy msgid "Combining channels" msgstr "[B] 合并声道" #: src/chunk.c:1083 msgid "Mixing channels" msgstr "混合声道" #: src/chunk.c:1471 msgid "Calculating peak level" msgstr "计算峰值电平" #: src/chunk.c:1542 src/chunk.c:1552 src/chunk.c:1590 src/chunk.c:1600 #, fuzzy msgid "Finding zero-crossing" msgstr "查找交零" #: src/chunk.c:1628 #, c-format msgid "Amplifying (by %3.1f%% / %+.1fdB)" msgstr "" #: src/chunk.c:1669 msgid "Amplifying" msgstr "正在放大" #: src/chunk.c:1867 #, fuzzy, c-format msgid "The input was clipped %d times during processing." msgstr "混合过程限幅 %d 时间。" #: src/configdialog.c:65 msgid "number of recent files" msgstr "最近文件数" #: src/configdialog.c:66 #, fuzzy msgid "maximum vertical zoom" msgstr "垂直缩放(_V)" #: src/configdialog.c:80 msgid "" "Some of the settings you have changed will not be activated until you " "restart the program" msgstr "您更改了的一些设置不会被激活直到重新启动应用程序" #: src/configdialog.c:292 msgid "Colors" msgstr "颜色" #: src/configdialog.c:329 msgid "_Preview" msgstr "预览(_P)" #: src/configdialog.c:336 src/configdialog.c:1204 msgid "_OK" msgstr "确定(_O)" #: src/configdialog.c:353 msgid "_Cancel" msgstr "取消(_C)" #: src/configdialog.c:430 msgid "Browse directory" msgstr "浏览目录" #: src/configdialog.c:480 msgid "Preferences" msgstr "首选项" #: src/configdialog.c:539 msgid "Show _time scale by default" msgstr "显示默认时间刻度(_T)" #: src/configdialog.c:549 msgid "Show _horizontal zoom slider by default" msgstr "显示默认水平缩放滑块(_H)" #: src/configdialog.c:559 msgid "Show _vertical zoom slider by default" msgstr "显示默认垂直缩放滑块(_V)" #: src/configdialog.c:569 msgid "Show _speed slider by default" msgstr "显示默认速率滑块(_S)" #: src/configdialog.c:579 #, fuzzy msgid "Show slider l_abels by default" msgstr "显示默认速率滑块(_S)" #: src/configdialog.c:589 #, fuzzy msgid "Show playback buffer positio_n by default" msgstr "显示默认速率滑块(_S)" #: src/configdialog.c:598 msgid "_Settings" msgstr "设置(_S)" #: src/configdialog.c:608 msgid "_Keep sound driver opened (to avoid start/stop clicks)" msgstr "保持声音驱动程序打开着(避免开启/关闭的卡嗒声)(_K)" #: src/configdialog.c:617 msgid "_Byte-swap output (try this if playback sounds horrible)" msgstr "字节交换输出(如果回放声音难听尝试它)(_B)" #: src/configdialog.c:626 msgid "Play _mono files as stereo" msgstr "" #: src/configdialog.c:634 msgid "_Update cursor information while playing" msgstr "播放时更新光标信息(_U)" #: src/configdialog.c:642 msgid "_Keep cursor in center of view when following playback" msgstr "再次回放时保持光标在视图中心(_K)" #: src/configdialog.c:652 msgid "_Auto-start playback when jumping to mark" msgstr "跳到标记时自动启动回放(_A)" #: src/configdialog.c:660 msgid "Enable _variable speed playback" msgstr "允许改变速率回放(_V)" #: src/configdialog.c:669 msgid "Auto-_reset speed" msgstr "自动恢复速率(R)" #: src/configdialog.c:676 msgid "Use fast and noisy method" msgstr "使用快速而且有噪音的方法" #: src/configdialog.c:684 msgid "(H')MM:SS.t" msgstr "(H')MM:SS.t" #: src/configdialog.c:685 msgid "(H')MM:SS.mmmm" msgstr "(H')MM:SS.mmmm" #: src/configdialog.c:686 msgid "TimeDisplay|Samples" msgstr "时间|取样" #: src/configdialog.c:687 #, fuzzy msgid "Time Code 24fps" msgstr "时间录音:" #: src/configdialog.c:688 msgid "Time Code 25fps (PAL)" msgstr "" #: src/configdialog.c:689 msgid "Time Code 29.97fps (NTSC)" msgstr "" #: src/configdialog.c:690 #, fuzzy msgid "Time Code 30fps" msgstr "时间录音:" #: src/configdialog.c:703 msgid "_Remember window sizes/positions" msgstr "记住窗口大小和位置(_R)" #: src/configdialog.c:712 msgid "_Draw waveform a second time with improved quality" msgstr "绘制每一秒的波形以提高品质(_D)" #: src/configdialog.c:742 msgid "_Remove" msgstr "删除(_R)" #: src/configdialog.c:750 msgid "_Add" msgstr "添加(_A)" #: src/configdialog.c:757 msgid "_Browse..." msgstr "浏览....(_B)" #: src/configdialog.c:764 msgid "_Up" msgstr "向上(_U)" #: src/configdialog.c:772 msgid "_Down" msgstr "向下(_D)" #: src/configdialog.c:788 msgid "Keep main _window in front after applying effect" msgstr "应用特效之后保持主窗口常居顶端(_W)" #: src/configdialog.c:804 msgid "_Use floating-point temporary files" msgstr "使用浮点临时文件(_U)" #: src/configdialog.c:813 msgid "Enable _dithering for editing" msgstr "允许编辑抖动(_D)" #: src/configdialog.c:821 msgid "Enable dithering for _playback" msgstr "允许回放抖动(_P)" #: src/configdialog.c:829 msgid "Auto dete_ct driver on each start-up" msgstr "启动时自动检测驱动(_C)" #: src/configdialog.c:842 msgid "Direct access" msgstr "" #: src/configdialog.c:843 msgid "Decompress" msgstr "" #: src/configdialog.c:844 #, fuzzy msgid "Bypass" msgstr "带通" #: src/configdialog.c:855 msgid "Biased" msgstr "" #: src/configdialog.c:856 msgid "Pure-Scaled" msgstr "" #: src/configdialog.c:873 msgid "Interface" msgstr "界面" #: src/configdialog.c:874 msgid " Main window " msgstr "主窗口" #: src/configdialog.c:885 msgid "Number of recent files in File menu: " msgstr "文件菜单中最近文件数:" #: src/configdialog.c:890 msgid " View " msgstr "视图" #: src/configdialog.c:901 msgid "Customize co_lors..." msgstr "自定义颜色...(_L)" #: src/configdialog.c:908 msgid " Window contents " msgstr "窗口内容" #: src/configdialog.c:925 #, fuzzy msgid "Vertical zoom limit: " msgstr "垂直缩放(_V)" #: src/configdialog.c:929 msgid "x" msgstr "" #: src/configdialog.c:935 msgid "Sound" msgstr "声音" #: src/configdialog.c:936 msgid " Driver options " msgstr "驱动设置" #: src/configdialog.c:944 msgid "_Driver:" msgstr "驱动程序(_D):" #: src/configdialog.c:961 msgid " Fallback format " msgstr "撤退格式" #: src/configdialog.c:966 msgid "Sample format to try when the sound file's format isn't supported." msgstr "声音文件格式不支持时测试取样格式" #: src/configdialog.c:978 msgid "Playback" msgstr "回放" #: src/configdialog.c:980 msgid " Playback settings " msgstr "回放设置" #: src/configdialog.c:992 msgid " Variable speed " msgstr "改变速率" #: src/configdialog.c:1007 src/help.c:38 msgid "Files" msgstr "文件" #: src/configdialog.c:1009 msgid " Temporary file directories " msgstr "临时文件目录" #: src/configdialog.c:1035 msgid " Temporary file settings " msgstr "临时文件设置" #: src/configdialog.c:1040 msgid "" "To avoid rounding errors when applying more than one effect on the same " "data, floating-point temporary files can be used. However, this will " "increase disk and CPU usage." msgstr "" "当使用更多特效时为避免舍入错误,使用浮点临时文件。然而,这将增加磁盘和CPU的使" "用量。" #: src/configdialog.c:1048 msgid "" "Some versions of libsndfile supports accessing Ogg files without " "decompressing to a temporary file." msgstr "" #: src/configdialog.c:1062 src/help.c:36 msgid "Quality" msgstr "品质" #: src/configdialog.c:1064 msgid " Rate conversions " msgstr "速率转换" #: src/configdialog.c:1071 msgid "Varispeed: " msgstr "调整速率:" #: src/configdialog.c:1072 msgid "Speed effect: " msgstr "速率特效:" #: src/configdialog.c:1079 msgid " Dithering " msgstr "抖动 " #: src/configdialog.c:1090 #, fuzzy msgid " Sample conversion " msgstr "速率转换" #: src/configdialog.c:1097 msgid "Normalization mode: " msgstr "" #: src/configdialog.c:1104 msgid "Other" msgstr "其它" #: src/configdialog.c:1106 msgid " Time format " msgstr "时间格式" #: src/configdialog.c:1115 msgid "Display t_imes as: " msgstr "显示时间为(_I):" #: src/configdialog.c:1126 #, fuzzy msgid "Times_cale format: " msgstr "时间格式" #: src/configdialog.c:1137 msgid " External applications " msgstr "外部程序" #: src/configdialog.c:1145 msgid "Mi_xer utility: " msgstr "混音程序:" #: src/configdialog.c:1155 msgid "Advanced" msgstr "高级" #: src/configdialog.c:1156 msgid " Advanced settings " msgstr "高级设置" #: src/configdialog.c:1164 msgid "Disk editing _threshold: " msgstr "磁盘编辑阈值:" #: src/configdialog.c:1175 msgid "View _quality:" msgstr "视图品质:" #: src/configdialog.c:1181 msgid "samples/pixel" msgstr "取样/像素" #: src/configdialog.c:1187 msgid "Output _buffer size:" msgstr "输出缓冲区大小:" #: src/configdialog.c:1193 msgid "bytes" msgstr "字节" #: src/configdialog.c:1218 msgid "_Close" msgstr "关闭(_C)" #: src/dataformat.c:886 #, fuzzy, c-format msgid "Floating-point (single %s)\n" msgstr "浮点(单精度)" #: src/dataformat.c:886 src/dataformat.c:888 src/dataformat.c:892 msgid "Big-endian" msgstr "Big-endian字节序(以高位结束一种存储方式)" #: src/dataformat.c:886 src/dataformat.c:888 src/dataformat.c:892 msgid "Little-endian" msgstr "Little-endian字节序(以低位结束一种存储方式)" #: src/dataformat.c:888 #, fuzzy, c-format msgid "Floating-point (double %s)\n" msgstr "浮点(双精度)" #: src/dataformat.c:890 #, fuzzy, c-format msgid "PCM, %d(%d) bit, %s %s\n" msgstr "PCM, %d bit, %s %s\n" #: src/dataformat.c:891 src/formatselector.c:77 msgid "Signed" msgstr "有符号" #: src/dataformat.c:891 src/formatselector.c:76 msgid "Unsigned" msgstr "无符号" #: src/dataformat.c:952 #, fuzzy msgid " Testing ranges..." msgstr "测试范围...." #: src/dataformat.c:976 msgid "Range test failed for format: " msgstr "范围检验失败的格式:" #: src/dataformat.c:990 #, fuzzy msgid " Testing all conversions.." msgstr "测试全部转换..." #: src/dataformat.c:1032 msgid "(expected) " msgstr "(期望)" #: src/dataformat.c:1033 msgid "Conversion test failed, between: " msgstr "转换测试失败,介于:" #: src/dataformat.c:1035 msgid " and: " msgstr "和:" #: src/dataformat.c:1112 msgid "No errors detected!" msgstr "没有检测出错误!" #: src/dataformat.c:1146 msgid "Preparing tests.." msgstr "准备测试..." #: src/dataformat.c:1154 msgid "Running tests.." msgstr "运行测试..." #: src/dataformat.c:1196 #, c-format msgid "" "\n" "\n" "Test results (1 time unit = %f usec/sample)\n" msgstr "" "\n" "\n" "测试结果 (1时间单位 = %f 秒/取样)\n" #: src/datasource.c:366 #, c-format msgid "Couldn't open %s" msgstr "无法打开 %s" #: src/datasource.c:497 msgid "Unexpected end of file" msgstr "文件意外结束" #: src/datasource.c:498 #, c-format msgid "Error reading %s: %s" msgstr "读取错误 %s %s" #: src/datasource.c:515 #, c-format msgid "Error seeking in %s: %s" msgstr "查找错误在 %s: %s" #: src/effectbrowser.c:99 msgid "Built-in" msgstr "" #: src/effectbrowser.c:102 #, fuzzy msgid "Volume adjust/fade" msgstr "[B] 音量调整/淡入" #: src/effectbrowser.c:104 #, fuzzy msgid "Convert samplerate" msgstr "转换取样率" #: src/effectbrowser.c:106 #, fuzzy msgid "Convert sample format" msgstr "[B] 转换取样格式" #: src/effectbrowser.c:108 msgid "Map channels" msgstr "映射声道" #: src/effectbrowser.c:110 #, fuzzy msgid "Combine channels" msgstr "[B] 合并声道" #: src/effectbrowser.c:113 msgid "Add channels from other file" msgstr "" #: src/effectbrowser.c:114 #, fuzzy msgid "Speed" msgstr "速率:" #: src/effectbrowser.c:115 #, fuzzy msgid "Pipe through program" msgstr "[B] 管道程序" #: src/effectbrowser.c:250 msgid "You have no open file to apply the effect to!" msgstr "您没有文件可应用这特效!" #: src/effectbrowser.c:275 #, fuzzy msgid "This effect could not be loaded." msgstr "该特效没有选项。" #: src/effectbrowser.c:582 msgid "/Move Up" msgstr "" #: src/effectbrowser.c:583 msgid "/Move Down" msgstr "" #: src/effectbrowser.c:584 msgid "/Move to Top" msgstr "" #: src/effectbrowser.c:585 msgid "/Move to Bottom" msgstr "" #: src/effectbrowser.c:587 msgid "/Sort by Name" msgstr "" #: src/effectbrowser.c:588 msgid "/Sort by Type" msgstr "" #: src/effectbrowser.c:589 msgid "/Sort by Location" msgstr "" #: src/effectbrowser.c:590 msgid "/Sort by Author" msgstr "" #: src/effectbrowser.c:592 msgid "/Restore Order" msgstr "" #: src/effectbrowser.c:593 msgid "/Rebuild Effect List" msgstr "" #: src/effectbrowser.c:744 msgid "Top" msgstr "" #: src/effectbrowser.c:751 #, fuzzy msgid "Up" msgstr "向上(_U)" #: src/effectbrowser.c:758 #, fuzzy msgid "Down" msgstr "向下(_D)" #: src/effectbrowser.c:765 msgid "Bottom" msgstr "" #: src/effectbrowser.c:793 msgid "Close dialog after applying effect" msgstr "关闭会话在应用特效后" #: src/effectbrowser.c:800 src/gotodialog.c:154 msgid "Apply" msgstr "应用" #: src/effectbrowser.c:808 src/gotodialog.c:159 src/mainwindow.c:1438 #: src/pipedialog.c:165 src/recorddialog.c:610 src/recorddialog.c:987 #: src/sound-esound.c:290 src/sound-jack.c:264 src/sound-oss.c:479 msgid "Close" msgstr "关闭" #: src/effectbrowser.c:830 src/help.c:35 msgid "Effects" msgstr "特效" #: src/effectbrowser.c:892 msgid "Apply to: " msgstr "应用到:" #: src/filetypes.c:103 msgid "putenv failed!" msgstr "putenv failed!" #: src/filetypes.c:113 msgid "unsetenv failed!" msgstr "unsetenv failed!" #: src/filetypes.c:155 msgid "Microsoft WAV format" msgstr "Microsoft WAV format" #: src/filetypes.c:181 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: src/filetypes.c:188 msgid "Raw PCM data" msgstr "Raw PCM data" #: src/filetypes.c:190 msgid "Open with MPlayer" msgstr "" #: src/filetypes.c:275 #, c-format msgid "The file %s does not exist!" msgstr "文件 %s 不存在!" #: src/filetypes.c:282 #, c-format msgid "The file %s is not a regular file!" msgstr "文件 %s 不是正常文件!" #: src/filetypes.c:294 msgid "Loading" msgstr "载入" #: src/filetypes.c:333 #, c-format msgid "" "The file name '%s' has an extension unknown to the program. Please specify " "in which format this file should be saved." msgstr "文件名 %s 对于程序是未知扩展名。请指定此文件应保存的格式。" #: src/filetypes.c:338 msgid "Unknown file type" msgstr "未知文件类型" #: src/filetypes.c:389 msgid "Saving" msgstr "保存" #: src/filetypes.c:393 #, c-format msgid "" "The file %s may be destroyed since the saving failed. Try to free up some " "disk space and save again. If you exit now the file's contents could be in a " "bad state. " msgstr "" "文件 %s 自从保存失败可能已损坏。尝试释放一些磁盘空间再次保存,如果现在退出文" "件内容可能处于损坏状态。" #: src/filetypes.c:457 #, c-format msgid "%s is not a valid wav file" msgstr "%s 不是有效的 WAV 文件" #: src/filetypes.c:472 #, c-format msgid "" "The file %s is a compressed wav file. This program can only work with " "uncompressed wav files." msgstr "文件 %s 是一个压缩的 WAV 文件。此程序只能打开未压缩的 WAV 文件。" #: src/filetypes.c:593 msgid "" "On this system, libsndfile is required to save floating-point wav files." msgstr "在这个系统, libsndfile 必需保存为浮点 WAV 文件。" #: src/filetypes.c:616 msgid "" "You are saving a wav file larger than 2048MB. Such large files are non-" "standard and may not be readable by all programs.\n" "\n" " (this warning will not be displayed again)" msgstr "" "您正在保存大于2048MB的 WAV 文件。这样大的文件并无标准并且可能所有的程序都无法" "读取它。\n" "\n" "(此警告不会再次显示)" #: src/filetypes.c:732 src/filetypes.c:877 #, c-format msgid "Failed to open '%s'!" msgstr "打开 '%s' 失败!" #: src/filetypes.c:849 msgid "Invalid sample format or number of channels for this file format" msgstr "非法的取样格式或文件格式声道数" #: src/filetypes.c:943 #, c-format msgid "Failed to write to '%s'!" msgstr "写入 '%s' 错误!" #: src/filetypes.c:1028 msgid "Decoding" msgstr "译码" #: src/filetypes.c:1149 msgid "Variable bitrate (default)" msgstr "可变位速率(默认)" #: src/filetypes.c:1150 msgid "Average bitrate" msgstr "平均位速率" #: src/filetypes.c:1151 msgid "Constant bitrate" msgstr "固定位速率" #: src/filetypes.c:1152 msgid "Custom argument" msgstr "自定义参数" #: src/filetypes.c:1156 msgid "Standard (high quality)" msgstr "标准(高品质)" #: src/filetypes.c:1157 msgid "Extreme (higher quality)" msgstr "最大程度(高品质)" #: src/filetypes.c:1158 msgid "Insane (highest possible quality)" msgstr "疯狂(可能最高品质)" #: src/filetypes.c:1176 #, c-format msgid "%s kbit/s" msgstr "%s 千比特/秒 (kbit/s)" #: src/filetypes.c:1205 msgid "MP3 Preferences" msgstr "MP3首选项" #: src/filetypes.c:1216 msgid "Encoding type: " msgstr "编码类型:" #: src/filetypes.c:1229 msgid "Quality: " msgstr "质量:" #: src/filetypes.c:1238 msgid "Custom argument: " msgstr "自定义变量:" #: src/filetypes.c:1244 msgid "Use this setting by default" msgstr "使用默认设置" #: src/filetypes.c:1249 src/gotodialog.c:146 src/mainwindow.c:1509 #: src/rawdialog.c:101 src/sound-alsalib.c:98 src/sound-esound.c:286 #: src/sound-jack.c:260 src/sound-oss.c:475 src/um.c:109 src/um.c:142 #: src/um.c:341 src/um.c:449 msgid "OK" msgstr "确定" #: src/filetypes.c:1257 src/rawdialog.c:107 src/sound-alsalib.c:102 #: src/um.c:133 src/um.c:150 src/um.c:347 src/um.c:458 msgid "Cancel" msgstr "取消" #: src/float_box.c:184 src/int_box.c:184 #, c-format msgid "'%s' is not a number!" msgstr "'%s' 不是一个数字!" #: src/float_box.c:202 #, c-format msgid "Value for '%s' must be a number between %f and %f" msgstr "'%s' 数值必需是一个 %f 和 %f 之间的数字" #: src/formatselector.c:60 msgid "Sample type: " msgstr "取样类型:" #: src/formatselector.c:62 msgid "8 bit PCM" msgstr "8 bit PCM" #: src/formatselector.c:63 msgid "16 bit PCM" msgstr "16 bit PCM" #: src/formatselector.c:64 msgid "24 bit PCM" msgstr "24 bit PCM" #: src/formatselector.c:65 msgid "32 bit PCM" msgstr "32 bit PCM" #: src/formatselector.c:66 msgid "Floating-point, single" msgstr "浮点,单精度" #: src/formatselector.c:67 msgid "Floating-point, double" msgstr "浮点,双精度" #: src/formatselector.c:74 msgid "Signedness: " msgstr "有符号类型:" #: src/formatselector.c:82 msgid "Endianness: " msgstr "字节排序:" #: src/formatselector.c:84 msgid "Little endian" msgstr "Little-endian字节序(以低位结束一种存储方式)" #: src/formatselector.c:85 msgid "Big endian" msgstr "Big-endian字节序(以高位结束一种存储方式)" #: src/formatselector.c:90 msgid "Alignment:" msgstr "" #: src/formatselector.c:92 msgid "Packed" msgstr "" #: src/formatselector.c:93 #, fuzzy msgid "Top bytes" msgstr "字节" #: src/formatselector.c:94 msgid "Bottom bytes" msgstr "" #: src/formatselector.c:130 msgid "Channels: " msgstr "声道:" #: src/formatselector.c:139 msgid "Sample rate: " msgstr "取样率:" #: src/formatselector.c:226 msgid "sample rate" msgstr "取样率" #: src/gotodialog.c:102 msgid "Place cursor " msgstr "定位光标" #: src/gotodialog.c:107 src/sound-esound.c:274 msgid "seconds" msgstr "秒" #: src/gotodialog.c:111 src/soxdialog.c:487 msgid "samples" msgstr "取样率" #: src/gotodialog.c:115 msgid "after beginning of file" msgstr "在文件开头之后" #: src/gotodialog.c:120 msgid "after end of file" msgstr "在文件结束之后" #: src/gotodialog.c:125 msgid "after current cursor position" msgstr "当前光标位置之后" #: src/gotodialog.c:130 msgid "after selection start" msgstr "先择开始之后" #: src/gotodialog.c:135 msgid "after selection end" msgstr "选择结束之后" #: src/gotodialog.c:139 msgid "" "(use a negative number to place the cursor before instead of after the " "selected point)" msgstr "(用一个负数定位光标代替之后选择点前面位置的点)" #: src/gotodialog.c:178 msgid "Position cursor" msgstr "定位光标" #: src/gtkfiles.c:48 #, c-format msgid "Could not open %s: %s" msgstr "无法打开 %s: %s" #: src/gtkfiles.c:53 #, c-format msgid "Warning: Unexpected error: %s" msgstr "警告:意外错误:%s" #: src/gtkfiles.c:110 src/gtkfiles.c:125 #, c-format msgid "Error closing %s: %s" msgstr "结束错误:%s: %s" #: src/gtkfiles.c:140 #, c-format msgid "Could not seek in %s: %s" msgstr "无法查找 %s: %s" #: src/gtkfiles.c:159 src/gtkfiles.c:204 #, c-format msgid "Could not read from %s: %s" msgstr "无法读取 %s: %s" #: src/gtkfiles.c:178 #, c-format msgid "Unexpected end of file reading from %s" msgstr "读取 %s 时意外终止" #: src/gtkfiles.c:196 #, c-format msgid "Unable to write data to %s" msgstr "无法写入数据到 %s" #: src/gtkfiles.c:262 #, c-format msgid "Could not get file position in %s: %s" msgstr "无法获得文件位置 %s: %s" #: src/gtkfiles.c:313 src/gtkfiles.c:473 msgid "File already exists. Overwrite?" msgstr "文件已存在。覆盖吗?" #: src/gtkfiles.c:321 msgid "No file with that name!" msgstr "没有那名字的文件!" #: src/gtkfiles.c:705 #, c-format msgid "Error reading from %s: %s" msgstr "读取错误 %s: %s" #: src/gtkfiles.c:737 #, c-format msgid "Could not remove '%s': %s" msgstr "不能删除 '%s': %s" #: src/gtkfiles.c:757 #, c-format msgid "Error creating link to '%s': %s" msgstr "创建链结到 '%s': %s 错误" #: src/help.c:30 msgid "General" msgstr "常规" #: src/help.c:31 msgid "Sample view" msgstr "视图" #: src/help.c:32 msgid "Playing" msgstr "播放" #: src/help.c:33 msgid "Recording" msgstr "录音" #: src/help.c:34 msgid "Editing" msgstr "编辑" #: src/help.c:37 msgid "File formats" msgstr "文件格式" #: src/help.c:39 msgid "Keyboard shortcuts" msgstr "快捷键" #: src/help.c:40 msgid "Bug reporting" msgstr "Bug 报告" #: src/help.c:41 msgid "Helping out" msgstr "更多帮助" #: src/help.c:42 msgid "Contact" msgstr "联系人" #: src/help.c:47 #, no-c-format msgid "" "mhWaveEdit is a graphical program for editing sound files. It is completely " "free (GPL).\n" msgstr "" #: src/help.c:49 #, no-c-format msgid "You can find the latest release of mhWaveEdit at:\n" msgstr "" #: src/help.c:50 #, no-c-format msgid "http://gna.org/projects/mhwaveedit/\n" msgstr "" #: src/help.c:55 #, no-c-format msgid "" "The area where you 'see' the contents of the file you are editing, is called " "the 'sample view'. \n" msgstr "" #: src/help.c:57 #, no-c-format msgid "" "In the sample view there is a grey vertical bar called the 'cursor'. The " "cursor follows the sound wave when you play the sound. You can position the " "cursor by clicking with the right (2:nd) mouse button. If you do this while " "you're playing a file, the playing will continue from the new cursor " "position. You can also position the cursor more exact by using the 'Position " "Cursor...' command on the Edit menu.\n" msgstr "" #: src/help.c:59 #, no-c-format msgid "" "You can place marks in your file by holding down Ctrl and pressing a number " "from 0 to 9. This will place a mark (green vertical bar) with the same " "number at the current cursor position. You can later make the cursor go to " "that position again by just pressing the number. Setting and jumping to " "marks can be done while playing. To remove a mark, jump to the mark and set " "it again.\n" msgstr "" #: src/help.c:64 #, no-c-format msgid "" "Playing a file is simple, just load the file and press the play button. The " "green play button plays from the current position. The yellow play button " "plays the current selection, or the entire file if nothing is selected. Stop " "the playback with the stop button (with the red square). \n" msgstr "" #: src/help.c:66 #, no-c-format msgid "" "The playback speed can be varied by adjusting the slider to the far right. \n" msgstr "" #: src/help.c:68 #, no-c-format msgid "You can do normal editing while the file is playing.\n" msgstr "" #: src/help.c:73 #, no-c-format msgid "" "Recording is done with 'Record...' on the Play menu, or the Record button " "(the red circle). A dialog box will pop up where you can select what format " "you want to record in. After selecting the format, meters and numbers will " "appear showing info about the volume level of the sound input. \n" msgstr "" #: src/help.c:75 #, no-c-format msgid "" "When you want to start recording, press the \"Start recording\" button. When " "you've recorded everything you wanted to, press the Finish button and the " "record dialog will disappear and newly recorded sound will show up in a new " "window.\n" msgstr "" #: src/help.c:77 #, no-c-format msgid "" "Currently it is impossible to play and record at the same time, so the " "playback will stop when you record.\n" msgstr "" #: src/help.c:82 #, no-c-format msgid "" "You make selections by dragging the mouse over the sample view. You can hear " "what you've currently selected by clicking on the \"play selection\" button " "(the button with the yellow arrow) or by selecting 'Play selection' from the " "Play menu.\n" msgstr "" #: src/help.c:84 #, no-c-format msgid "" "You can use the cursor to refine the selection. Use the 'Selection start at " "cursor' and 'Selection end at cursor' buttons to move the selection starting " "point or the selection end point to the current cursor position. You can " "also drag the selection endpoints using the mouse.\n" msgstr "" #: src/help.c:86 #, no-c-format msgid "The 'Cut' and 'Copy' functions work like in any other software. \n" msgstr "" #: src/help.c:88 #, no-c-format msgid "" "The 'Paste' function insert the clipboard contents at the cursor position. " "The 'Paste over' function works like 'Paste', except that it overwrites the " "data after the insert position. \n" msgstr "" #: src/help.c:90 #, fuzzy, no-c-format msgid "" "The 'Paste mix' function combines the clipboard data with the data at the " "cursor position.\n" msgstr "粘贴,覆盖当前光标位置之后的数据" #: src/help.c:92 #, no-c-format msgid "" "The 'Paste as new' function opens a new window and puts the clipboard " "contents into it. \n" msgstr "" #: src/help.c:94 #, no-c-format msgid "" "The 'Crop' function deletes all parts of the file that are not selected.\n" msgstr "" #: src/help.c:96 #, no-c-format msgid "" "The 'Silence selection' function replaces the selected part with silence. To " "avoid clicks, the silent part is a line that meets the wave at the " "endpoints.\n" msgstr "" #: src/help.c:98 #, no-c-format msgid "" "All editing functions work non-destructively, that is, the file you're " "editing isn't actually changed until you save it (the effects also work this " "way).\n" msgstr "" #: src/help.c:104 #, no-c-format msgid "" "mhWaveEdit has a few simple effects, which are available from the 'Effects' " "menu. \n" msgstr "" #: src/help.c:106 #, no-c-format msgid " * Fade in/out\n" msgstr "" #: src/help.c:108 #, no-c-format msgid " This creates a linear fade in or fade out effect.\n" msgstr "" #: src/help.c:110 #, fuzzy, no-c-format msgid " * Normalize, Normalize to...\n" msgstr "标准化为..." #: src/help.c:112 #, no-c-format msgid "" " This amplifies the sound as much as possible without getting clipping " "distortion. The \"Normalize to...\" item lets you specify which level to " "normalize to.\n" msgstr "" #: src/help.c:114 #, fuzzy, no-c-format msgid " * Volume adjust/fade...\n" msgstr "[B] 音量调整/淡入" #: src/help.c:116 #, no-c-format msgid "" " This effect lets you select a starting volume and a ending volume and " "amplifies the selection fading from the starting volume to the ending " "volume.\n" msgstr "" #: src/help.c:118 #, no-c-format msgid "" " Note that volumes above 100% may cause sound distortion. Use the 'Find " "top volume' to find out the maximum amplification possible without " "distortion. (You can use this for normalizing samples.) \n" msgstr "" #: src/help.c:120 #, no-c-format msgid "" " By setting starting volume and ending volume to the same value you get a " "simple amplification of the sound. \n" msgstr "" #: src/help.c:122 #, fuzzy, no-c-format msgid " * Convert samplerate...\n" msgstr "转换取样率" #: src/help.c:124 #, no-c-format msgid "" " This converts the samplerate of the entire file to one you specify. There " "are different methods for doing this, usually the one in the top has the " "best quality but can take longer than the other methode.\n" msgstr "" #: src/help.c:126 #, fuzzy, no-c-format msgid " * Convert sample format...\n" msgstr "[B] 转换取样格式" #: src/help.c:128 #, fuzzy, no-c-format msgid " This converts the sample format of the entire file.\n" msgstr "" "(整个文件此声道的取样率\n" "不一定正好是选择的)" #: src/help.c:130 #, no-c-format msgid "" " The 'Don't actually change the data' option can be used if the program " "was wrong about the file's format.\n" msgstr "" #: src/help.c:132 #, no-c-format msgid " * Byte swap\n" msgstr "" #: src/help.c:134 #, no-c-format msgid "" " This \"byte swaps\" the selected part. It can be used to repair damaged " "files where the byte order is wrong. Note that if the sound looks alright " "but plays wrong, you should not use this option, instead you should use the " "\"byte-swap output\" option in the Preferences dialog.\n" msgstr "" #: src/help.c:136 #, fuzzy, no-c-format msgid " * Mix to mono\n" msgstr "混合成单声道(_M)" #: src/help.c:138 #, no-c-format msgid " This mixes all channels of the file together to a mono sound.\n" msgstr "" #: src/help.c:140 #, fuzzy, no-c-format msgid " * Add channel\n" msgstr "%d 声道" #: src/help.c:142 #, no-c-format msgid "" " This copies the first channel to a new channel in the sound, converting " "mono to stereo etc.\n" msgstr "" #: src/help.c:144 #, fuzzy, no-c-format msgid " * Map channels...\n" msgstr "映射声道" #: src/help.c:145 #, no-c-format msgid " \n" msgstr "" #: src/help.c:146 #, no-c-format msgid "" " With this effect, you can change the number of channels in the file. You " "can also rearrange and add (i.e. mix) channels.\n" msgstr "" #: src/help.c:148 #, fuzzy, no-c-format msgid " * Combine channels...\n" msgstr "[B] 合并声道" #: src/help.c:150 #, no-c-format msgid "" " This effect lets you create a new sound by a linear combination of the " "old channels. This means you can do channel mixing / swapping / balance / " "panning / amplification etc. by entering different values. For example, to " "swap the left and right channel, you select that the new Channel 1 should be " "0% of the old Channel 1 and 100% of the old Channel 2, and the new Channel 2 " "should be 100% of the old Channel 1 and 0% of the old Channel 2 \n" msgstr "" #: src/help.c:152 #, fuzzy, no-c-format msgid " * Speed adjustment...\n" msgstr "速率调整(_S)" #: src/help.c:154 #, no-c-format msgid "" " This effect changes the speed of the selection. The tone will change as " "well.\n" msgstr "" #: src/help.c:155 #, fuzzy, no-c-format msgid " * Pipe through program...\n" msgstr "[B] 管道程序" #: src/help.c:156 #, no-c-format msgid " \n" msgstr "" #: src/help.c:157 #, no-c-format msgid "" " This effect is for advanced users wanting to pipe raw audio data through " "an external program. The output of the program is read back and replaces the " "processed part. \n" msgstr "" #: src/help.c:159 #, no-c-format msgid "" "mhWaveEdit supports LADSPA effects and can also make use of most of the SoX " "utility's effects. To find the LADSPA plugins the environment variable " "LADSPA_PATH must be properly set up. \n" msgstr "" #: src/help.c:161 #, no-c-format msgid "" "All supported effects can be found by choosing the 'Effects...' menu item. " "The effects are listed with names beginning with [B] for builtin effects, " "[L] for LADSPA effects, and [S] for SoX effects.\n" msgstr "" #: src/help.c:167 #, no-c-format msgid "Some notes on sound quality.\n" msgstr "" #: src/help.c:169 #, no-c-format msgid "" "The general rule when doing audio editing/processing is to not manipulate " "the data more than necessary and keep an original copy whenever you're " "processing your important files. \n" msgstr "" #: src/help.c:171 #, no-c-format msgid "" "Cut, copy and paste operations move the data around without modifying it, so " "these don't degrade the sound quality. Because of level differences, you may " "get a \"step\" at the start and end of the inserted part, which can cause a " "small clicking sound. \n" msgstr "" #: src/help.c:173 #, no-c-format msgid "" "The mix paste function doesn't decrease quality, unless the peaks become too " "high and you get clipping. In that case you will get a warning message.\n" msgstr "" #: src/help.c:175 #, no-c-format msgid "" "Sound data is normally stored as integer values. Therefore, whenever you " "normalize, adjust volume, decrease sample size or filter a sound, the result " "must be rounded. If you use 24 or 32 bit sample sizes, this is not really a " "problem, but if you use 8 or 16 bits sample size, this rounding causes a " "decrease in quality. \n" msgstr "" #: src/help.c:177 #, no-c-format msgid "" "The quality decrease that the rounding causes can be masked by adding a " "small amount of noise before rounding. This is called \"dithering\". " "mhWaveEdit supports basic dithering and it's enabled by default.\n" msgstr "" #: src/help.c:179 #, no-c-format msgid "" "By default, mhWaveEdit uses floating-point temporary files for storing " "processed results to avoid rounding until the file is saved.\n" msgstr "" #: src/help.c:184 #, no-c-format msgid "" "Even if mhWaveEdit was originally built for editing wav files, it's also " "possible to load and save in a few other formats. mhWaveEdit always supports " "wav and raw files, but if it's compiled with the libsndfile library, " "mhWaveEdit supports a couple of other formats as well. \n" msgstr "" #: src/help.c:186 #, no-c-format msgid "" "To save a file with a different file format, use \"Save as...\" and choose a " "format in the file type selection box. \n" msgstr "" #: src/help.c:188 #, no-c-format msgid "" "mhWaveEdit has basic support for mp3 and ogg formats. For this to work you " "need to have LAME installed for mp3 support, and OggDec/OggEnc for Ogg " "support. If you have these programs, you can open and save mp3/ogg files " "just like any other file format.\n" msgstr "" #: src/help.c:190 #, no-c-format msgid "" "If mplayer is installed, mhwaveedit can open all formats that it supports, " "for example the soundtrack of a video file. Since mplayer is only a player, " "these files can not be saved back after editing, you have to save the file " "into a supported format.\n" msgstr "" #: src/help.c:195 #, no-c-format msgid "" "mhWaveEdit creates a directory ~/.mhwaveedit where it stores configuration " "information. \n" msgstr "" #: src/help.c:197 #, no-c-format msgid "" "The configuration file is called config. It can be hand edited, but the " "easiest way is through 'Preferences' on the Edit menu.\n" msgstr "" #: src/help.c:199 #, no-c-format msgid "" "Each mhwaveedit process creates a session file in the .mhwaveedit directory " "called mhwaveedit-session---, where is the " "session ID number and is a character code showing the state of the " "session ('r' for running sessions). \n" msgstr "" #: src/help.c:201 #, no-c-format msgid "" "Temporary files are by default also stored in the ~/.mhwaveedit directory. " "Which directories to use can be set through the preferences dialog. To get " "the best performance, you should have one temporary directory for each local " "filesystem. The temporary files have names of the form \"mhwaveedit-temp-" "-nnnn-\". Do NOT open or remove temporary files with the same " "pid number as a currently running mhWaveEdit.\n" msgstr "" #: src/help.c:203 #, no-c-format msgid "" "mhWaveEdit checks on startup for leftover temporary files and lets the user " "open them. After opening a crashed session, the files can be saved or thrown " "away.\n" msgstr "" #: src/help.c:208 #, no-c-format msgid "F1 Help\n" msgstr "" #: src/help.c:209 #, no-c-format msgid "F12 Record\n" msgstr "" #: src/help.c:211 #, no-c-format msgid "Ctrl+(number) Set mark\n" msgstr "" #: src/help.c:212 #, no-c-format msgid "(number) Goto mark\n" msgstr "" #: src/help.c:214 #, fuzzy, no-c-format msgid "Ctrl+P Preferences\n" msgstr "MP3首选项" #: src/help.c:215 #, no-c-format msgid "Ctrl+E Effects\n" msgstr "" #: src/help.c:217 #, no-c-format msgid "Ctrl+O Open file\n" msgstr "" #: src/help.c:218 #, no-c-format msgid "Ctrl+S Save file\n" msgstr "" #: src/help.c:219 #, fuzzy, no-c-format msgid "Ctrl+U Save selection as\n" msgstr "选择另存为..." #: src/help.c:221 #, no-c-format msgid "Ctrl+C Copy\n" msgstr "" #: src/help.c:222 #, no-c-format msgid "Ctrl+X Cut\n" msgstr "" #: src/help.c:223 #, no-c-format msgid "Ctrl+D Delete\n" msgstr "" #: src/help.c:224 #, fuzzy, no-c-format msgid "Delete Delete\n" msgstr "删除选择" #: src/help.c:225 #, no-c-format msgid "Ctrl+V Paste\n" msgstr "" #: src/help.c:226 #, no-c-format msgid "Ctrl+Z Undo\n" msgstr "" #: src/help.c:227 #, no-c-format msgid "Ctrl+A Select all\n" msgstr "" #: src/help.c:229 #, no-c-format msgid "Ctrl+G Position cursor (Go to)\n" msgstr "" #: src/help.c:230 #, no-c-format msgid "Ctrl+H Position cursor at file start\n" msgstr "" #: src/help.c:231 #, no-c-format msgid "Ctrl+J Position cursor at file end\n" msgstr "" #: src/help.c:232 #, fuzzy, no-c-format msgid "Ctrl+K Position cursor at selection start\n" msgstr "设为选择开始" #: src/help.c:233 #, no-c-format msgid "Ctrl+L Position cursor at selection end\n" msgstr "" #: src/help.c:234 #, no-c-format msgid "Y,U Move cursor to nearest all-channel zero-crossing\n" msgstr "" #: src/help.c:235 #, no-c-format msgid "I,O Move cursor to nearest any-channel zero-crossing\n" msgstr "" #: src/help.c:237 #, fuzzy, no-c-format msgid "Ctrl+Q Selection start at cursor\n" msgstr "光标位置从选择的位置开始" #: src/help.c:238 #, fuzzy, no-c-format msgid "Ctrl+W Selection end at cursor\n" msgstr "光标位置从选择的位置结束" #: src/help.c:240 #, no-c-format msgid "+,= Zoom in\n" msgstr "" #: src/help.c:241 #, no-c-format msgid "- Zoom out\n" msgstr "" #: src/help.c:242 #, fuzzy, no-c-format msgid "> Zoom to selection\n" msgstr "缩放选择(_S)" #: src/help.c:243 #, no-c-format msgid "< Zoom all\n" msgstr "" #: src/help.c:244 #, no-c-format msgid "Arrow keys Scroll left/right\n" msgstr "" #: src/help.c:246 #, no-c-format msgid "Home Move view to file start\n" msgstr "" #: src/help.c:247 #, no-c-format msgid "End Move view to file end\n" msgstr "" #: src/help.c:248 #, fuzzy, no-c-format msgid "Tab Move view to cursor\n" msgstr "从光标位置播放" #: src/help.c:249 #, no-c-format msgid "Ctrl+Tab Move cursor to center of view\n" msgstr "" #: src/help.c:251 #, fuzzy, no-c-format msgid "Space Play/Stop\n" msgstr "播放已选(_L)" #: src/help.c:252 #, no-c-format msgid "Shift+Space Play all\n" msgstr "" #: src/help.c:253 #, fuzzy, no-c-format msgid ", Play from cursor pos\n" msgstr "从光标位置播放" #: src/help.c:254 #, no-c-format msgid ". Stop\n" msgstr "" #: src/help.c:255 #, fuzzy, no-c-format msgid "/ Play selection\n" msgstr "播放已选(_L)" #: src/help.c:256 #, no-c-format msgid "H,J Move cursor (and playback) 1/8 of view\n" msgstr "" #: src/help.c:257 #, no-c-format msgid "K,L Move cursor one sample\n" msgstr "" #: src/help.c:258 #, no-c-format msgid "Ctrl+arrow Move cursor (and playback) half second\n" msgstr "" #: src/help.c:259 #, no-c-format msgid "( Play first 3 seconds of selection\n" msgstr "" #: src/help.c:260 #, no-c-format msgid ") Play last 3 seconds of selection\n" msgstr "" #: src/help.c:265 #, no-c-format msgid "" "If you find a bug or flaw in the program that's not mentioned in the BUGS " "file, report the bug in the bug tracker (see contact info) or mail a bug " "report describing the bug to: magnus.hjorth@home.se\n" msgstr "" #: src/help.c:267 #, no-c-format msgid "" "In case of a crash, please do not send me any core dumps. They are huge and " "completely useless to me. Instead, create a backtrace. Backtraces tell you " "exactly where the program crashed.\n" msgstr "" #: src/help.c:269 #, no-c-format msgid "How to create a backtrace:\n" msgstr "" #: src/help.c:270 #, no-c-format msgid "1. Enable core dumps: ulimit -c unlimited\n" msgstr "" #: src/help.c:271 #, no-c-format msgid "2. Run the program: mhwaveedit\n" msgstr "" #: src/help.c:272 #, no-c-format msgid "" "3. Make the program crash. You should now get a file named core or core.1234 " "in the directory you're in.\n" msgstr "" #: src/help.c:273 #, no-c-format msgid "4. Run gdb with the program and core file: \n" msgstr "" #: src/help.c:274 #, no-c-format msgid " gdb /usr/local/bin/mhwaveedit core | tee backtrace.txt\n" msgstr "" #: src/help.c:275 #, no-c-format msgid "5. After gdb has loaded, use the command: bt\n" msgstr "" #: src/help.c:276 #, no-c-format msgid "6. Quit gdb with the command: quit\n" msgstr "" #: src/help.c:277 #, no-c-format msgid "7. Now you should have a back trace in the file backtrace.txt\n" msgstr "" #: src/help.c:282 #, no-c-format msgid "" "There are plenty of things you can do if you want to help the development of " "mhWaveEdit. \n" msgstr "" #: src/help.c:284 #, no-c-format msgid "" "First of all, look for bugs and report all bugs you find into the bug " "tracker or through e-mail. Sometimes a bug can get overlooked for a long " "time because nobody reports it, so don't be afraid to report bugs that have " "been there for a few releases. You don't have to provide fixes or very " "detailed information, although it helps of course.\n" msgstr "" #: src/help.c:286 #, no-c-format msgid "" "Feature requests are also welcome, report them to the mailing list or to the " "bug tracker.\n" msgstr "" #: src/help.c:288 #, no-c-format msgid "" "If you speak a language other than English and mhWaveEdit isn't translated " "to your language, you can contribute a translation. To do that, copy the " "template mhwaveedit.pot in the po directory into a new file ll.po, where ll " "is your language code (see http://www.gnu.org/software/gettext/manual/" "html_node/gettext_221.html for a list of language codes). \n" msgstr "" #: src/help.c:290 #, no-c-format msgid "" "It's possible to edit po-files by hand, but I recommend a program such as " "poEdit (http://www.poedit.org) for editing translations. \n" msgstr "" #: src/help.c:292 #, no-c-format msgid "" "Note that for those translatable strings that look like \"RecordStatus|Paused" "\", you should ignore what's to the left and only translate the string to " "the right (\"Paused\" in this example). This convention is there to make it " "possible to translate the same string to different things depending on " "context. \n" msgstr "" #: src/help.c:294 #, no-c-format msgid "" "After you've filled in all the translations you want (you don't have to " "translate all the strings), mail in the po file to me (see contact info) and " "I'll add it to the next release. \n" msgstr "" #: src/help.c:296 #, no-c-format msgid "" "If a translation is incomplete, you're very welcome to translate the " "remaining untranslated messages and mail them in. Corrections to " "translations are also appreciated, but they may need to be checked with the " "previous translator before including them. \n" msgstr "" #: src/help.c:302 #, no-c-format msgid "For bug reports, translation updates, patches and PayPal donations:\n" msgstr "" #: src/help.c:303 #, no-c-format msgid "magnus.hjorth@home.se\n" msgstr "" #: src/help.c:305 #, no-c-format msgid "Project page with bug tracker, mailing list membership:\n" msgstr "" #: src/help.c:306 #, no-c-format msgid "http://gna.org/projects/mhwaveedit\n" msgstr "" #: src/help.c:308 #, no-c-format msgid "Mailing list (you must be a subscriber before you can post messages):\n" msgstr "" #: src/help.c:309 #, no-c-format msgid "mhwaveedit-discuss@gna.org\n" msgstr "" #: src/inifile.c:84 src/inifile.c:91 #, c-format msgid "%s: Expected '=': %s\n" msgstr "%s: 期望 '=': %s\n" #: src/inifile.c:97 #, c-format msgid "%s: Expected value: %s\n" msgstr "%s: 期望值: %s\n" #: src/int_box.c:202 #, c-format msgid "Value for %s must be a number between %ld and %ld" msgstr "%s 数值必需是一个 %ld 和 %ld 之间的数字" #: src/ladspacore.c:94 #, c-format msgid "Effect %s contains invalid port %s" msgstr "特效 %s 包含非法窗口 %s" #: src/ladspacore.c:140 #, c-format msgid "Ladspa: Error scanning %s" msgstr "Ladspa:扫描错误 %s" #: src/ladspacore.c:409 #, c-format msgid "Applying effect '%s'" msgstr "应用特效 '%s'" #: src/ladspadialog.c:87 #, c-format msgid "Value for '%s' must not be below %f" msgstr "'%s' 数值必需低于 %f" #: src/ladspadialog.c:94 #, c-format msgid "Value for '%s' must not be above %f" msgstr "'%s' 数值必需高于 %f" #: src/ladspadialog.c:127 #, c-format msgid "" "You have mapped more than one output port to channel '%s'. You can only map " "one output port to each channel." msgstr "声道 '%s' 使用太多输出端口映射。每个声道只能有一个映射。" #: src/ladspadialog.c:191 #, c-format msgid "Author: %s" msgstr "作者:%s" #: src/ladspadialog.c:196 #, c-format msgid "Copyright: %s" msgstr "版权:%s" #: src/ladspadialog.c:203 msgid " Input controls " msgstr "输入控制" #: src/ladspadialog.c:292 msgid " Output controls " msgstr "输出控制" #: src/ladspadialog.c:311 src/recorddialog.c:311 src/recorddialog.c:739 msgid "None" msgstr "无" #: src/ladspadialog.c:319 msgid " Input audio " msgstr "输入音频" #: src/ladspadialog.c:319 msgid " Output audio " msgstr "输出音频" #: src/ladspadialog.c:350 msgid "Keep data in unmapped output channels" msgstr "保持数据在非映射输出声道" #: src/main.c:166 #, c-format msgid "Syntax: %s [files]\n" msgstr "语法: %s [文件]\n" #: src/main.c:169 msgid "Testing conversion functions:" msgstr "测试转换功能:" #: src/main.c:171 msgid "Testing conversion functions finished." msgstr "测试转换功能完成。" #: src/main.c:190 msgid "Expected driver name after --driver option" msgstr "期望驱动名称于 --驱动设置之后" #: src/main.c:196 #, c-format msgid "Unknown option '%s'" msgstr "未知设置 '%s'" #: src/main.c:340 msgid "" "Could not find home directory. Using current directory as home directory." msgstr "没有找到个人目录。使用当前目录为个人目录。" #: src/main.c:368 msgid "Black" msgstr "黑" #: src/main.c:369 msgid "White" msgstr "白" #: src/main.c:370 msgid "Background" msgstr "背景" #: src/main.c:371 msgid "L Waveform" msgstr "L 波形" #: src/main.c:372 msgid "R Waveform" msgstr "R 波形" #: src/main.c:373 msgid "Cursor" msgstr "光标" #: src/main.c:374 msgid "Marks" msgstr "标记" #: src/main.c:375 msgid "Selection" msgstr "选择" #: src/main.c:376 msgid "Progress bar" msgstr "进度栏" #: src/main.c:377 msgid "Zero-level" msgstr "零电平" #: src/main.c:378 #, fuzzy msgid "Buffer position" msgstr "缓冲器超限!" #: src/main.c:501 #, c-format msgid "Error launching mixer: fork: %s" msgstr "启用混音错误:派生: %s" #: src/main.c:552 src/main.c:571 msgid "Mono" msgstr "单声道" #: src/main.c:553 msgid "Left" msgstr "左" #: src/main.c:554 msgid "Right" msgstr "右" #: src/main.c:556 #, c-format msgid "Ch%d" msgstr "" #: src/main.c:572 msgid "Stereo" msgstr "立体声" #: src/main.c:574 #, c-format msgid "%d channels" msgstr "%d 声道" #: src/main.c:1149 msgid "Ignoring extreme old window size/position values\n" msgstr "忽略极旧的窗口大小/位置值\n" #: src/mainwindow.c:217 #, c-format msgid "mhWaveEdit: %s (%s): %d Hz, %s" msgstr "mhWaveEdit: %s (%s): %d Hz, %s" #: src/mainwindow.c:300 msgid "Use default settings" msgstr "使用默认设置" #: src/mainwindow.c:304 msgid "Auto-detect from extension" msgstr "自动检测扩展名" #: src/mainwindow.c:319 msgid "File type: " msgstr "文件类型:" #: src/mainwindow.c:365 msgid "" "The file has not changed since last save. Press OK if you want to save it " "anyway?" msgstr "自上次保存文件没有改变。如果您硬要保存它请按确定?" #: src/mainwindow.c:374 msgid "Save File" msgstr "保存文件" #: src/mainwindow.c:399 #, c-format msgid "Save changes to %s?" msgstr "保存更改到 %s ?" #: src/mainwindow.c:792 src/mainwindow.c:796 msgid "Load File" msgstr "装入文件" #: src/mainwindow.c:821 msgid "Save selection as ..." msgstr "选择另存为..." #: src/mainwindow.c:1116 #, c-format msgid "Chunk %p has opencount=%d\n" msgstr "块 %p 打开计数=%d\n" #: src/mainwindow.c:1199 #, c-format msgid "" "\n" "Window '%s'\n" msgstr "" "\n" "窗口 '%s'\n" #: src/mainwindow.c:1200 msgid " Current chunk:" msgstr "当前块:" #: src/mainwindow.c:1202 msgid " History:" msgstr "历史:" #: src/mainwindow.c:1257 msgid "There already is only one channel!" msgstr "那早就是一个声道了!" #: src/mainwindow.c:1366 msgid "mhWaveEdit Help" msgstr "mhWaveEdit 帮助" #: src/mainwindow.c:1465 msgid "About mhWaveEdit" msgstr "关于 mhWaveEdit" #: src/mainwindow.c:1477 #, fuzzy msgid "" "Created by Magnus Hjorth (magnus.hjorth@home.se)\n" "Copyright 2002-2018, Magnus Hjorth" msgstr "" "由 Magnus Hjorth (magnus.hjorth@home.se) 创建\n" "版权所有 2002-2007, Magnus Hjorth" # #: src/mainwindow.c:1260 # msgid "" # "Created by Magnus Hjorth (magnus.hjorth@home.se)\n" # "Copyright 2002-2006, Magnus Hjorth" # msgstr "" # "由 Magnus Hjorth (magnus.hjorth@home.se) 创建\n" # "版权所有 2002-2006, Magnus Hjorth" #: src/mainwindow.c:1484 #, c-format msgid "Current sound driver: %s" msgstr "当前声音驱动:%s" #: src/mainwindow.c:1492 #, c-format msgid "Compiled %s %s" msgstr "" "编译于 %s %s\n" "中文化:李红昆 " #: src/mainwindow.c:1498 msgid "Uses double-precision math" msgstr "使用双精度" #: src/mainwindow.c:1505 msgid "" "Distributed under GNU General Public License.\n" "For information, see the file COPYING" msgstr "" "发布在 GNU General Public License 协议下。\n" "关于信息,查看文件 COPYING 。" #: src/mainwindow.c:1669 msgid "Seconds of silence: " msgstr "静音秒数:" #: src/mainwindow.c:1669 msgid "Insert Silence" msgstr "插入静音" #: src/mainwindow.c:1718 msgid "Level: " msgstr "电平" #: src/mainwindow.c:1718 msgid "Normalize to..." msgstr "标准化为..." #: src/mainwindow.c:1928 msgid "/_File" msgstr "文件(_F)" #: src/mainwindow.c:1929 msgid "/File/_Open..." msgstr "打开...(_O)" #: src/mainwindow.c:1930 msgid "/File/_Save" msgstr "保存(_S)" #: src/mainwindow.c:1931 msgid "/File/Save _as..." msgstr "另保存...(_A)" #: src/mainwindow.c:1932 msgid "/File/Save selection as..." msgstr "选择另存为..." #: src/mainwindow.c:1933 msgid "/_Edit" msgstr "编辑(_E)" #: src/mainwindow.c:1934 msgid "/Edit/_Undo" msgstr "撤消(_U)" #: src/mainwindow.c:1935 msgid "/Edit/_Redo" msgstr "重做(_R)" #: src/mainwindow.c:1936 msgid "/Edit/sep1" msgstr "分离1" #: src/mainwindow.c:1937 msgid "/Edit/Cu_t" msgstr "剪切(_T)" #: src/mainwindow.c:1938 msgid "/Edit/_Copy" msgstr "复制(_C)" #: src/mainwindow.c:1939 msgid "/Edit/_Paste" msgstr "粘贴(_P)" #: src/mainwindow.c:1940 msgid "/Edit/Paste _over" msgstr "覆盖粘贴(_O)" #: src/mainwindow.c:1941 msgid "/Edit/_Mix paste" msgstr "混合粘贴(_M)" #: src/mainwindow.c:1942 msgid "/Edit/Insert _silence" msgstr "插入静音(_S)" #: src/mainwindow.c:1943 msgid "/Edit/Paste to _new" msgstr "粘贴到新文件(_N)" #: src/mainwindow.c:1944 msgid "/Edit/Cr_op" msgstr "栽剪(_O)" #: src/mainwindow.c:1945 msgid "/Edit/_Delete" msgstr "删除(_D)" #: src/mainwindow.c:1946 msgid "/Edit/Silence selection" msgstr "静音选择" #: src/mainwindow.c:1947 msgid "/Edit/sep2" msgstr "分离2" #: src/mainwindow.c:1948 msgid "/Edit/Select _all" msgstr "选择全部(_A)" # ============================================================# #: src/mainwindow.c:1949 msgid "/Edit/Select none" msgstr "无选择" #: src/mainwindow.c:1950 msgid "/Edit/sep3" msgstr "分离3" #: src/mainwindow.c:1951 msgid "/Edit/Clear clipboard" msgstr "清除剪切板" #: src/mainwindow.c:1952 msgid "/Edit/sep4" msgstr "分离4" #: src/mainwindow.c:1953 msgid "/Edit/Preferences" msgstr "首选项" #: src/mainwindow.c:1954 msgid "/_View" msgstr "视图(_V)" #: src/mainwindow.c:1955 msgid "/View/Zoom _in" msgstr "放大(_I)" #: src/mainwindow.c:1956 msgid "/View/Zoom _out" msgstr "缩小(_O)" #: src/mainwindow.c:1957 msgid "/View/Zoom to _selection" msgstr "缩放选择(_S)" #: src/mainwindow.c:1958 msgid "/View/sep1" msgstr "分离1" #: src/mainwindow.c:1959 msgid "/View/Zoom _all" msgstr "缩放全部(_A)" #: src/mainwindow.c:1960 msgid "/View/sep2" msgstr "分离2" #: src/mainwindow.c:1961 msgid "/View/_Time scale" msgstr "时间标尺(_T)" #: src/mainwindow.c:1962 msgid "/View/_Horizontal zoom" msgstr "水平缩放(_H)" #: src/mainwindow.c:1963 msgid "/View/_Vertical zoom" msgstr "垂直缩放(_V)" #: src/mainwindow.c:1964 msgid "/View/Sp_eed slider" msgstr "速率滑块(_E)" #: src/mainwindow.c:1965 #, fuzzy msgid "/View/Slider labels" msgstr "速率滑块(_E)" #: src/mainwindow.c:1966 msgid "/View/Buffer position" msgstr "" #: src/mainwindow.c:1967 msgid "/_Cursor" msgstr "光标(_C)" #: src/mainwindow.c:1968 msgid "/Cursor/Set selection start" msgstr "设为选择开始" #: src/mainwindow.c:1970 msgid "/Cursor/Set selection end" msgstr "设为选择结束" #: src/mainwindow.c:1971 msgid "/Cursor/sep1" msgstr "分离1" #: src/mainwindow.c:1972 msgid "/Cursor/Move to" msgstr "移动到" #: src/mainwindow.c:1973 msgid "/Cursor/Move to/Beginning" msgstr "开头" #: src/mainwindow.c:1975 msgid "/Cursor/Move to/End" msgstr "结束" #: src/mainwindow.c:1976 msgid "/Cursor/Move to/Selection start" msgstr "选择开始" #: src/mainwindow.c:1978 msgid "/Cursor/Move to/Selection end" msgstr "选择结束" #: src/mainwindow.c:1980 msgid "/Cursor/Move" msgstr "移动" #: src/mainwindow.c:1981 msgid "/Cursor/Move/Left" msgstr "左" #: src/mainwindow.c:1982 msgid "/Cursor/Move/Right" msgstr "右" #: src/mainwindow.c:1983 msgid "/Cursor/Move/Left sample" msgstr "左取样" #: src/mainwindow.c:1984 msgid "/Cursor/Move/Right sample" msgstr "右取样" #: src/mainwindow.c:1985 msgid "/Cursor/Find zero-crossing" msgstr "查找交零" #: src/mainwindow.c:1986 msgid "/Cursor/Find zero-crossing/Left (all channels)" msgstr "左(全部声道)" #: src/mainwindow.c:1988 msgid "/Cursor/Find zero-crossing/Right (all channels)" msgstr "右(全部声道)" #: src/mainwindow.c:1990 msgid "/Cursor/Find zero-crossing/Left (any channel)" msgstr "左(任一声道)" #: src/mainwindow.c:1992 msgid "/Cursor/Find zero-crossing/Right (any channel)" msgstr "右(任一声道)" # #: src/mainwindow.c:1578 # msgid "/Cursor/Move to/beginning" # msgstr "/光标/移动到/开头" # #: src/mainwindow.c:1580 # msgid "/Cursor/Move to/end" # msgstr "/光标/移动到/结束" # #: src/mainwindow.c:1581 # msgid "/Cursor/Move to/selection start" # msgstr "/光标/移动到/选择开始" # #: src/mainwindow.c:1583 # msgid "/Cursor/Move to/selection end" # msgstr "/光标/移动到/选择结束" #: src/mainwindow.c:1994 msgid "/Cursor/sep2" msgstr "分离2" #: src/mainwindow.c:1995 msgid "/Cursor/Position cursor..." msgstr "光标位置..." #: src/mainwindow.c:1997 msgid "/_Play" msgstr "播放(_P)" #: src/mainwindow.c:1998 msgid "/Play/_Play from cursor" msgstr "从光标处播放(_P)" #: src/mainwindow.c:1999 msgid "/Play/Play _all" msgstr "播放全部(_A)" #: src/mainwindow.c:2000 msgid "/Play/Play se_lection" msgstr "播放已选(_L)" #: src/mainwindow.c:2001 msgid "/Play/_Stop" msgstr "停止(_S)" #: src/mainwindow.c:2002 msgid "/Play/sep1" msgstr "分离1" #: src/mainwindow.c:2003 msgid "/Play/_Record..." msgstr "录音...(_R)" #: src/mainwindow.c:2004 msgid "/Effec_ts" msgstr "特效(_T)" #: src/mainwindow.c:2005 msgid "/Effects/Fade _in" msgstr "淡入(_I)" #: src/mainwindow.c:2006 msgid "/Effects/Fade o_ut" msgstr "淡出(_U)" #: src/mainwindow.c:2007 msgid "/Effects/_Normalize" msgstr "标准化(_N)" #: src/mainwindow.c:2008 msgid "/Effects/Normali_ze to..." msgstr "标准化为...(_Z)" #: src/mainwindow.c:2009 msgid "/Effects/_Volume adjust (fade)..." msgstr "音量调整(淡入)...(_V)" #: src/mainwindow.c:2010 msgid "/Effects/sep1" msgstr "分离1" #: src/mainwindow.c:2011 msgid "/Effects/Convert sample_rate..." msgstr "变换取样速率...(_R)" #: src/mainwindow.c:2012 msgid "/Effects/Convert sample _format..." msgstr "转换取样格式...(_F)" #: src/mainwindow.c:2014 msgid "/Effects/B_yte swap" msgstr "字节交换(_Y)" #: src/mainwindow.c:2015 msgid "/Effects/sep2" msgstr "分离2" #: src/mainwindow.c:2016 msgid "/Effects/_Mix to mono" msgstr "混合成单声道(_M)" #: src/mainwindow.c:2017 msgid "/Effects/Add channe_l" msgstr "添加声道(_L)" #: src/mainwindow.c:2018 msgid "/Effects/Ma_p channels..." msgstr "映射声道...(_P)" #: src/mainwindow.c:2019 msgid "/Effects/_Combine channels..." msgstr "合并声道...(_C)" #: src/mainwindow.c:2020 #, fuzzy msgid "/Effects/Add channels from other file..." msgstr "添加声道(_L)" #: src/mainwindow.c:2021 msgid "/Effects/sep3" msgstr "分离3" #: src/mainwindow.c:2022 msgid "/Effects/_Speed adjustment..." msgstr "速率调整(_S)" #: src/mainwindow.c:2023 msgid "/Effects/Pipe through program..." msgstr "管道程序..." #: src/mainwindow.c:2024 msgid "/Effects/sep4" msgstr "分离4" #: src/mainwindow.c:2025 msgid "/Effects/Effects dialog..." msgstr "特效对话框..." #: src/mainwindow.c:2027 msgid "/Debug" msgstr "调试" #: src/mainwindow.c:2029 msgid "/Debug/Dummy effect" msgstr "虚拟特效" #: src/mainwindow.c:2030 #, fuzzy msgid "/Debug/Dummy effect FP" msgstr "虚拟特效" #: src/mainwindow.c:2031 msgid "/Debug/Check opencount" msgstr "检查打开计数" #: src/mainwindow.c:2032 msgid "/Debug/Dump chunk info" msgstr "转储块信息" #: src/mainwindow.c:2034 msgid "/_Help" msgstr "帮助(_H)" #: src/mainwindow.c:2035 msgid "/Help/_Documentation" msgstr "文档(_D)" #: src/mainwindow.c:2036 msgid "/Help/_About" msgstr "关于(_A)" #: src/mainwindow.c:2040 msgid "/File/sep1" msgstr "分离1" #: src/mainwindow.c:2041 msgid "/File/_Close" msgstr "关闭(_C)" #: src/mainwindow.c:2042 msgid "/File/sep2" msgstr "分离2" #: src/mainwindow.c:2043 msgid "/File/_Exit" msgstr "退出(_E)" #: src/mainwindow.c:2215 msgid "Load a file from disk" msgstr "从磁盘装入文件" #: src/mainwindow.c:2222 msgid "Save the current file to disk" msgstr "保存当前文件到磁盘" #: src/mainwindow.c:2231 msgid "Undo the last change" msgstr "撤消最后改变" #: src/mainwindow.c:2239 msgid "Redo the last undo operation" msgstr "重做最后撤消的改变" #: src/mainwindow.c:2249 msgid "Cut out the current selection" msgstr "剪切出当前选择" #: src/mainwindow.c:2257 msgid "Copy the current selection" msgstr "复制当前选择" #: src/mainwindow.c:2265 msgid "Paste at cursor position" msgstr "粘贴在当前光标位置" #: src/mainwindow.c:2273 msgid "Paste, overwriting the data after the cursor position" msgstr "粘贴,覆盖当前光标位置之后的数据" #: src/mainwindow.c:2283 msgid "Delete the selection" msgstr "删除选择" #: src/mainwindow.c:2292 msgid "Set selection start to cursor position" msgstr "光标位置从选择的位置开始" #: src/mainwindow.c:2301 msgid "Set selection end to cursor position" msgstr "光标位置从选择的位置结束" #: src/mainwindow.c:2311 msgid "Play from cursor position" msgstr "从光标位置播放" #: src/mainwindow.c:2320 msgid "Play selected area" msgstr "播放选择区域" #: src/mainwindow.c:2329 msgid "Stop playing" msgstr "停止播放" #: src/mainwindow.c:2339 msgid "Loop mode (play over and over)" msgstr "循环模式(反复播放)" #: src/mainwindow.c:2349 msgid "Keep view and playback together" msgstr "" #: src/mainwindow.c:2362 msgid "Auto return to playback start" msgstr "自动返回启动回放" #: src/mainwindow.c:2376 src/recorddialog.c:874 msgid "Record" msgstr "录音" #: src/mainwindow.c:2385 src/recorddialog.c:983 msgid "Launch mixer" msgstr "启动混音" #: src/pipedialog.c:92 msgid "Command line: " msgstr "命令行:" #: src/pipedialog.c:99 msgid "Send wav header" msgstr "发送 wav 标题" #: src/pipedialog.c:153 msgid "Process output" msgstr "进程输出" #: src/pipedialog.c:178 #, c-format msgid "" "Output from command '%s':\n" "\n" msgstr "" "输出格式命令 '%s':\n" "\n" #: src/pipedialog.c:201 #, c-format msgid "Could not create pipe: %s" msgstr "无法创建管道:%s" #: src/pipedialog.c:216 #, c-format msgid "Error: fork: %s" msgstr "错误:派生: %s" #: src/pipedialog.c:268 msgid "Should not reach this point!" msgstr "将无法达到这个点!" #: src/pipedialog.c:482 msgid "Command failed without returning any data" msgstr "命令失败没有返回数据" #: src/pipedialog.c:492 #, c-format msgid "Error: %s" msgstr "错误: %s" #: src/player.c:294 msgid "The sound format of this file is not supported for playing." msgstr "不支持此类声音格式文件的播放" #: src/rateconv.c:97 #, c-format msgid "Error initialising sample rate conversion: %s" msgstr "初始化取样率转换错误:%s" #: src/rateconv.c:162 #, c-format msgid "Error converting samplerate: %s\n" msgstr "转换取样率错误: %s\n" #: src/rateconv.c:201 #, c-format msgid "Error changing samplerate conversion ratio: %s\n" msgstr "改变取样率转换比例错误:%s\n" #: src/rateconv.c:323 msgid "Unexpected EOF in connection to subprocess" msgstr "" #: src/rateconv.c:327 #, c-format msgid "Error writing to subprocess: %s" msgstr "" #: src/rateconv.c:383 src/rateconv.c:405 #, c-format msgid "Error reading from sub process: %s" msgstr "" #: src/rateconv.c:413 msgid "SoX closed connection too early!" msgstr "" #: src/rateconv.c:599 msgid "(SoX) Simulated analog filtration" msgstr "" #: src/rateconv.c:605 msgid "(SoX) Polyphase interpolation" msgstr "" #: src/rateconv.c:612 msgid "Sample repeat/skip (low quality)" msgstr "" #: src/rawdialog.c:42 msgid "header size" msgstr "" #: src/rawdialog.c:73 msgid "Unknown file format" msgstr "未知的文件格式" #: src/rawdialog.c:80 #, c-format msgid "" "The format of file '%s' could not be recognized.\n" "\n" "Please specify the sample format below." msgstr "" "文件 '%s' 的格式无法确定。\n" "\n" "请在下面指定取样格式。" #: src/rawdialog.c:92 msgid "Header bytes: " msgstr "" #: src/recorddialog.c:207 src/recorddialog.c:671 src/recorddialog.c:918 msgid "(no limit)" msgstr "(无限制)" #: src/recorddialog.c:314 msgid "Mild" msgstr "柔和" #: src/recorddialog.c:316 msgid "Heavy" msgstr "强硬" #: src/recorddialog.c:430 msgid "Update preset" msgstr "" #: src/recorddialog.c:435 msgid "Add preset" msgstr "" #: src/recorddialog.c:514 msgid "Custom format" msgstr "自定义格式" #: src/recorddialog.c:552 msgid "" "The sign and endian-ness can usually be left at their defaults, but should " "be changed if you're unable to record or get bad sound." msgstr "" "符号和字节存储次序通常为上面(#左边)默认值,但是您如果无法录音或音质很次时将改" "变它。" #: src/recorddialog.c:566 msgid "Name :" msgstr "名称:" #: src/recorddialog.c:578 msgid "Presets:" msgstr "" #: src/recorddialog.c:593 #, fuzzy msgid "Set format" msgstr "文件格式" #: src/recorddialog.c:601 msgid "Add/Update preset" msgstr "" #: src/recorddialog.c:654 msgid "" "Invalid time value. Time must be specified in the form (HH')MM:SS(.mmmm)" msgstr "" #: src/recorddialog.c:698 src/recorddialog.c:948 msgid "Format not selected" msgstr "格式没有选择" #: src/recorddialog.c:705 msgid "This format is not supported by the input driver!" msgstr "输入驱动程序不支持此格式!" #: src/recorddialog.c:710 msgid "Ready for recording" msgstr "录音就绪" #: src/recorddialog.c:723 msgid "Peak: " msgstr "峰值:" #: src/recorddialog.c:724 msgid "Peak max: " msgstr "最大峰值:" #: src/recorddialog.c:725 msgid "RMS: " msgstr "" #: src/recorddialog.c:726 msgid "Clipping: " msgstr "限幅:" #: src/recorddialog.c:795 msgid "Resume recording" msgstr "继续录音" #: src/recorddialog.c:795 src/recorddialog.c:815 msgid "Pause recording" msgstr "暂停录音" #: src/recorddialog.c:797 msgid "RecordStatus|Paused" msgstr "已暂停" #: src/recorddialog.c:798 src/recorddialog.c:823 msgid "RecordStatus|Recording" msgstr "正在录音" #: src/recorddialog.c:818 msgid "Finish" msgstr "完成" #: src/recorddialog.c:826 msgid "Overruns: " msgstr "超限:" #: src/recorddialog.c:829 msgid "Bytes written: " msgstr "字节写入:" #: src/recorddialog.c:830 msgid "Auto stop in: " msgstr "自动停止在:" #: src/recorddialog.c:894 msgid "Recording settings" msgstr "录音设置" #: src/recorddialog.c:901 msgid "Sample format: " msgstr "取样格式:" #: src/recorddialog.c:916 msgid "Time limit: " msgstr "时间限制:" #: src/recorddialog.c:924 msgid "Disable" msgstr "禁用" #: src/recorddialog.c:930 msgid "Set" msgstr "设置" #: src/recorddialog.c:942 msgid "Input levels" msgstr "输入电平" #: src/recorddialog.c:947 msgid "Recording status: " msgstr "录音状态:" #: src/recorddialog.c:952 msgid "Time recorded: " msgstr "时间录音:" #: src/recorddialog.c:953 msgid "N/A" msgstr "不可用" #: src/recorddialog.c:966 msgid "Start recording" msgstr "开始录音" #: src/recorddialog.c:977 msgid "Reset max peaks" msgstr "重置最大峰值" #: src/sampleratedialog.c:87 msgid "" "(This changes the sample rate of \n" "the entire file, not just the selection)" msgstr "" "(整个文件此声道的取样率\n" "不一定正好是选择的)" #: src/sampleratedialog.c:92 msgid "New samplerate: " msgstr "新建取样率:" #: src/sampleratedialog.c:99 msgid "Method: " msgstr "方法:" #: src/samplesizedialog.c:38 msgid "File already has the selected sample format" msgstr "" #: src/samplesizedialog.c:87 msgid "" "(This changes the sample type of the entire file, not just the selection)" msgstr "(整个文件此声道的取样类型,不一定正好是选择的)" #: src/samplesizedialog.c:99 msgid "Don't actually change the data (for repairing bad files etc)" msgstr "无法真正的改变这数据(如修复损坏文件等)" #: src/sound-alsalib.c:73 msgid "ALSA Preferences" msgstr "ALSA 首选项" #: src/sound-alsalib.c:81 msgid "Playback device: " msgstr "回放设备:" #: src/sound-alsalib.c:85 msgid "Recording device: " msgstr "录音设备:" #: src/sound-alsalib.c:91 msgid "Event driven I/O" msgstr "" #: src/sound-alsalib.c:123 #, c-format msgid "Error opening ALSA device '%s' for recording: %s" msgstr "" #: src/sound-alsalib.c:125 #, c-format msgid "Error opening ALSA device '%s' for playback: %s" msgstr "" #: src/sound-alsalib.c:273 msgid "snd_pcm_hw_params_set_access failed" msgstr "" #: src/sound-alsalib.c:278 msgid "snd_pcm_hw_params_set_format failed" msgstr "" #: src/sound-alsalib.c:283 msgid "snd_pcm_hw_params_set_channels failed" msgstr "" #: src/sound-alsalib.c:288 msgid "snd_pcm_hw_params_set_rate failed" msgstr "" #: src/sound-alsalib.c:293 msgid "snd_pcm_hw_params_set_buffer_size_last failed" msgstr "" #: src/sound-alsalib.c:436 src/sound-alsalib.c:492 msgid "" msgstr "" #: src/sound-alsalib.c:536 msgid "" msgstr "" #: src/sound.c:167 msgid "SDL (output only)" msgstr "" #: src/sound.c:209 msgid "Dummy (no sound)" msgstr "" #: src/sound.c:334 #, c-format msgid "" "Invalid driver name: %s\n" "Using '%s' driver instead" msgstr "" "非法驱动名: %s\n" "使用 '%s' 驱动代替。" #: src/sound-esound.c:59 #, c-format msgid "Couldn't connect to ESD daemon: %s" msgstr "" #: src/sound-esound.c:114 msgid "EsounD: Unable to open playback stream" msgstr "" #: src/sound-esound.c:130 msgid "EsounD: Unable to open recording stream" msgstr "" #: src/sound-esound.c:145 src/sound-esound.c:217 msgid "EsounD driver: select" msgstr "" #: src/sound-esound.c:157 msgid "EsounD driver: write" msgstr "" #: src/sound-esound.c:221 msgid "Esound connection closed by server" msgstr "" #: src/sound-esound.c:227 msgid "EsounD driver: read" msgstr "" #: src/sound-esound.c:241 msgid "jump delay" msgstr "" #: src/sound-esound.c:255 msgid "ESD preferences" msgstr "" #: src/sound-esound.c:263 #, fuzzy msgid "" "If the cursor starts running too early when jumping, this delay should be " "increased." msgstr "正在运行." #: src/sound-esound.c:269 msgid "Jump delay:" msgstr "跳跃延迟:" #: src/sound-esound.c:278 msgid "" "Selecting the ESD host to connect to is done through the ESPEAKER " "environment variable." msgstr "" #: src/sound-jack.c:117 msgid "Invalid number of input ports." msgstr "" #: src/sound-jack.c:121 msgid "Invalid number of output ports." msgstr "" #: src/sound-jack.c:130 msgid "The client name change won't take effect until you restart the program." msgstr "" #: src/sound-jack.c:187 msgid " Input ports " msgstr "输入端口" #: src/sound-jack.c:188 msgid " Output ports " msgstr "输出端口" #: src/sound-jack.c:197 msgid "Jack Preferences" msgstr "Jack 首选项" #: src/sound-jack.c:206 msgid "Client name: " msgstr "客户名称:" #: src/sound-jack.c:223 msgid "Number of ports (0-8): " msgstr "端口数字(0-8)" #: src/sound-jack.c:231 #, c-format msgid "Port #%d" msgstr "端口 #%d" #: src/sound-jack.c:244 msgid "Automatically connect input ports on startup" msgstr "" #: src/sound-jack.c:250 msgid "Automatically connect output ports on startup" msgstr "" #: src/sound-jack.c:402 msgid "Over/underrun in JACK driver" msgstr "" #: src/sound-jack.c:417 msgid "jack_get_ports returned NULL" msgstr "" #: src/sound-jack.c:433 #, c-format msgid "Connection from %s to %s failed: %s" msgstr "" #: src/sound-jack.c:480 msgid "Could not connect to the JACK server." msgstr "" #: src/sound-jack.c:494 msgid "Activation failed!" msgstr "" #: src/sound-jack.c:825 #, c-format msgid "" "With JACK, the only supported recording format is Floating-point, single " "precision, %d Hz" msgstr "" #: src/sound-oss.c:96 #, c-format msgid "Could not open '%s': %s" msgstr "" #: src/sound-oss.c:109 #, c-format msgid "Error in sound driver: ioctl failed: %s" msgstr "" #: src/sound-oss.c:216 #, c-format msgid "Error in sound driver: write failed: %s" msgstr "" #: src/sound-oss.c:229 #, c-format msgid "Error in sound driver: read failed: %s" msgstr "" #: src/sound-oss.c:253 src/sound-oss.c:385 #, c-format msgid "Error in sound driver: select failed: %s" msgstr "" #: src/sound-oss.c:440 msgid "OSS preferences" msgstr "" #: src/sound-oss.c:450 #, fuzzy msgid "Playback device file:" msgstr "回放设备:" #: src/sound-oss.c:459 #, fuzzy msgid "Recording device file:" msgstr "录音设备:" #: src/sound-oss.c:465 #, fuzzy msgid "Avoid select calls (try this if recording locks up)" msgstr "选择 测试 向上" #: src/sound-portaudio.c:61 #, fuzzy msgid "sound-portaudio: No output devices available!" msgstr "无 输出 可用!" #: src/sound-portaudio.c:63 #, fuzzy msgid "sound-portaudio: No input devices available!" msgstr "无 可用!" #: src/sound-portaudio.c:191 src/sound-portaudio.c:278 #, fuzzy, c-format msgid "Pa_OpenStream failed: %s\n" msgstr "失败 秒 n" #: src/sound-portaudio.c:252 msgid "Buffer overrun!" msgstr "缓冲器超限!" #: src/sound-sdl.c:38 #, c-format msgid "Could not initialize SDL: %s" msgstr "" #: src/sound-sdl.c:89 #, c-format msgid "SDL: Couldn't open audio: %s" msgstr "" #: src/sound-sun.c:72 #, c-format msgid "SunAudio: Couldn't open %s" msgstr "" #: src/sound-sun.c:159 msgid "SunAudio: Error writing to sound device" msgstr "" #: src/sound-sun.c:241 msgid "SunAudio: Error reading from sound device" msgstr "" #: src/soxdialog.c:54 msgid "Echo" msgstr "" #: src/soxdialog.c:55 msgid "Echo sequence" msgstr "" #: src/soxdialog.c:56 #, fuzzy msgid "Reverb" msgstr "余响时间:" #: src/soxdialog.c:57 #, fuzzy msgid "Chorus" msgstr "颜色" #: src/soxdialog.c:58 msgid "Flanger" msgstr "" #: src/soxdialog.c:59 msgid "Phaser" msgstr "" #: src/soxdialog.c:60 msgid "Compress/Expand" msgstr "" #: src/soxdialog.c:61 msgid "Pitch adjust" msgstr "" #: src/soxdialog.c:62 msgid "Time stretch" msgstr "" #: src/soxdialog.c:63 msgid "DC Shift" msgstr "" #: src/soxdialog.c:64 msgid "Masking noise" msgstr "" #: src/soxdialog.c:65 #, fuzzy msgid "Reverse" msgstr "余响时间:" #: src/soxdialog.c:66 msgid "Earwax" msgstr "" #: src/soxdialog.c:67 msgid "Vibro" msgstr "" #: src/soxdialog.c:68 msgid "Lowpass filter (single-pole)" msgstr "" #: src/soxdialog.c:69 msgid "Highpass filter (single-pole)" msgstr "" #: src/soxdialog.c:70 #, fuzzy msgid "Bandpass filter" msgstr "带通" #: src/soxdialog.c:71 msgid "Butterworth lowpass filter" msgstr "" #: src/soxdialog.c:72 msgid "Butterworth highpass filter" msgstr "" #: src/soxdialog.c:73 msgid "Butterworth bandpass filter" msgstr "" #: src/soxdialog.c:74 msgid "Butterworth bandreject filter" msgstr "" #: src/soxdialog.c:75 msgid "Sinc-windowed filter" msgstr "" #: src/soxdialog.c:312 msgid "Frequency: " msgstr "频率:" #: src/soxdialog.c:317 src/soxdialog.c:324 src/soxdialog.c:483 #: src/soxdialog.c:485 msgid "Hz" msgstr "" #: src/soxdialog.c:327 msgid "Noise mode" msgstr "杂讯模式" #: src/soxdialog.c:387 msgid "Reverb time: " msgstr "余响时间:" #: src/soxdialog.c:392 msgid "ms" msgstr "毫秒" #: src/soxdialog.c:397 msgid "Delay (ms) " msgstr "延迟(毫秒):" #: src/soxdialog.c:400 msgid "Decay " msgstr "延迟" #: src/soxdialog.c:404 msgid "Speed (Hz) " msgstr "速率(Hz)" #: src/soxdialog.c:408 msgid "Depth (ms) " msgstr "深度(毫秒)" #: src/soxdialog.c:412 msgid "Modulation " msgstr "调音" #: src/soxdialog.c:415 msgid "Modulation|Sinusoidal" msgstr "正弦" #: src/soxdialog.c:416 msgid "Modulation|Triangular" msgstr "三角" #: src/soxdialog.c:429 msgid "(Lines with delay=0 will be ignored.)" msgstr "(行数显示=0 将被忽略)" #: src/soxdialog.c:448 src/soxdialog.c:450 src/soxdialog.c:454 #: src/soxdialog.c:456 src/soxdialog.c:458 msgid "Input gain: " msgstr "输入增益:" #: src/soxdialog.c:452 msgid "Output gain: " msgstr "输出增益:" #: src/soxdialog.c:464 msgid "Width: " msgstr "宽度:" #: src/soxdialog.c:470 src/soxdialog.c:472 msgid "Bandwidth: " msgstr "带宽:" #: src/soxdialog.c:481 msgid "Filter type: " msgstr "过滤器类型:" #: src/soxdialog.c:482 #, fuzzy msgid "Low 6dB corner: " msgstr "低 " #: src/soxdialog.c:484 #, fuzzy msgid "High 6db corner: " msgstr "高 " #: src/soxdialog.c:486 msgid "Window length: " msgstr "窗口长度:" #: src/soxdialog.c:488 msgid "Beta" msgstr "Beta" #: src/soxdialog.c:491 msgid "Lowpass" msgstr "低通" #: src/soxdialog.c:492 msgid "Highpass" msgstr "高通" #: src/soxdialog.c:493 msgid "Bandpass" msgstr "带通" #: src/soxdialog.c:526 msgid "Attack integration time: " msgstr "增益积分时间:" #: src/soxdialog.c:530 src/soxdialog.c:535 src/soxdialog.c:565 msgid " seconds" msgstr " 秒" #: src/soxdialog.c:531 msgid "Decay integration time: " msgstr "衰减积分时间:" #: src/soxdialog.c:538 msgid "Input level (dB)" msgstr "输入电平(dB)" #: src/soxdialog.c:539 msgid "Output level (dB)" msgstr "输出电平(dB)" #: src/soxdialog.c:552 msgid "Post-processing gain: " msgstr "后期处理增益:" #: src/soxdialog.c:556 msgid " dB" msgstr "" #: src/soxdialog.c:557 msgid "Initial volume: " msgstr "初始音量:" #: src/soxdialog.c:561 msgid "Delay time: " msgstr "延迟时间:" #: src/soxdialog.c:570 msgid "Shift amount: " msgstr "转换合计:" #: src/soxdialog.c:574 msgid "Peak limiter" msgstr "峰值限制" #: src/soxdialog.c:578 msgid "Limiter gain: " msgstr "限制增益:" #: src/soxdialog.c:591 msgid "Amount: " msgstr "合计:" #: src/soxdialog.c:592 msgid " cents" msgstr "美分" #: src/soxdialog.c:593 msgid "Window width: " msgstr "窗口宽度:" #: src/soxdialog.c:594 src/soxdialog.c:625 msgid " ms" msgstr "毫秒" #: src/soxdialog.c:595 msgid "Interpolation: " msgstr "内插:" #: src/soxdialog.c:596 msgid "Fade: " msgstr "淡入:" #: src/soxdialog.c:605 msgid "Interpolation|Cubic" msgstr "三次曲线" #: src/soxdialog.c:606 msgid "Interpolation|Linear" msgstr "线性" #: src/soxdialog.c:612 msgid "Fade|Cos" msgstr "余弦" #: src/soxdialog.c:613 msgid "Fade|Hamming" msgstr "加重平衡" #: src/soxdialog.c:614 msgid "Fade|Linear" msgstr "线性" #: src/soxdialog.c:615 msgid "Fade|Trapezoid" msgstr "不规则四边形" #: src/soxdialog.c:623 msgid "Factor: " msgstr "系数:" #: src/soxdialog.c:624 msgid "Window size: " msgstr "窗口大小:" #: src/soxdialog.c:636 #, fuzzy msgid "Speed: " msgstr "速度 " #: src/soxdialog.c:637 msgid " Hz" msgstr "" #: src/soxdialog.c:638 msgid "Depth: " msgstr "深度:" #: src/soxdialog.c:649 #, fuzzy msgid "This effect has no options." msgstr "该特效没有选项。" #: src/soxdialog.c:723 msgid "Error creating pipe" msgstr "" #: src/soxdialog.c:730 msgid "Couldn't fork" msgstr "" #: src/soxdialog.c:745 #, c-format msgid "Error running 'sox -h': %s\n" msgstr "" #: src/soxdialog.c:747 msgid "Should not reach this point" msgstr "" #: src/soxdialog.c:762 msgid "Error reading sox output" msgstr "" #: src/soxdialog.c:794 msgid "Unable to detect supported SoX effects" msgstr "" #: src/soxdialog.c:832 msgid "Sox support couldn't be initialized" msgstr "" #: src/speeddialog.c:58 msgid "Speed:" msgstr "速率:" #: src/statusbar.c:72 msgid "(no file loaded)" msgstr "(没有文件载入)" #: src/statusbar.c:235 msgid "Cursor: running" msgstr "光标:正在运行" #: src/statusbar.c:237 msgid "Cursor: " msgstr "光标:" #: src/statusbar.c:260 #, c-format msgid "View: [ %s - %s ]" msgstr "视图: [ %s - %s ]" #: src/statusbar.c:281 #, c-format msgid "Selection: %s+%s" msgstr "选择: %s+%s" #: src/statusbar.c:304 msgid "Processing data" msgstr "处理数据" #: src/statusbar.c:306 #, c-format msgid "%s... (Press ESC to cancel)" msgstr "%s... (按 ESC 取消)" #: src/um.c:51 msgid "mhWaveEdit: " msgstr "mhWaveEdit: " #: src/um.c:64 #, c-format msgid "mhWaveEdit: %s: %s\n" msgstr "mhWaveEdit: %s: %s\n" #: src/um.c:97 msgid "Message" msgstr "消息" #: src/um.c:117 msgid "Yes" msgstr "是" #: src/um.c:125 msgid "No" msgstr "否" #: src/um.c:318 msgid "Input" msgstr "输入" #: src/um.c:407 msgid "Choice" msgstr "选择" #: src/volumedialog.c:71 msgid "Calculating peak volume..." msgstr "计算峰值音量..." #: src/volumedialog.c:87 msgid "Start:" msgstr "开始:" #: src/volumedialog.c:90 msgid "End:" msgstr "结束:" #: src/volumedialog.c:109 msgid "Find top volume" msgstr "查找峰值音量" #: src/document.c:230 #, c-format msgid "untitled #%d" msgstr "无标题 #%d" #: src/document.c:282 msgid "" "Loading and then saving files with 'lossy' formats (like mp3 and ogg) leads " "to a quality loss, also for the unmodified parts of the file." msgstr "" #: src/session.c:87 msgid "Error opening session directory" msgstr "" #: src/session.c:104 src/session.c:164 #, c-format msgid "%s: Wrong file type" msgstr "%s:错误文件类型" #: src/session.c:238 msgid "Could not create session file" msgstr "无法创建会话文件" #: src/session.c:280 msgid "" "The files that belonged to the crashed session have been recovered. Any " "files that are not saved will be removed permanently.\n" "\n" "(This notice is only shown once)" msgstr "" "文件属于已恢复的崩溃会话。任何文件都没有保存将永久删除。\n" "\n" "(此信息只显示一次)" #: src/session.c:380 msgid "Suspended" msgstr "已挂起" #: src/session.c:380 src/session.c:381 msgid "Crash" msgstr "崩溃" #: src/session.c:381 msgid "Left files" msgstr "" #: src/session.c:391 #, c-format msgid "%s on %s(%d files, %ld bytes)" msgstr "" #: src/session.c:409 msgid "Sessions" msgstr "会话" #: src/session.c:419 msgid "" "Earlier sessions were found. Choose one to resume or start a new session." msgstr "发现以前的会话。选择一个再继续或开始一个新的会话。" #: src/session.c:439 msgid "Resume selected" msgstr "继续选择" #: src/session.c:449 #, fuzzy msgid "Delete selected" msgstr "删除选择" #: src/session.c:456 msgid "Start new session" msgstr "开始新的会话" #: src/session.c:462 msgid "Exit" msgstr "退出" #: src/mapchannelsdialog.c:116 msgid "This effect applies to the whole file, not just the selection" msgstr "此特效应用到整个文件,不一定正好是选择的" #: src/mapchannelsdialog.c:123 msgid "Output channels: " msgstr "输出声道" #: src/mapchannelsdialog.c:130 msgid "Map" msgstr "映射" #: src/mapchannelsdialog.c:137 msgid "Source" msgstr "源" #: src/mapchannelsdialog.c:139 msgid "Destination" msgstr "目标" #: src/sandwichdialog.c:107 #, fuzzy msgid "Align beginning of files" msgstr "在文件开头之后" #: src/sandwichdialog.c:110 #, fuzzy msgid "Align end of files" msgstr "在文件结束之后" #: src/sandwichdialog.c:113 #, fuzzy msgid "Align at marker: " msgstr "客户名称:" #: src/sandwichdialog.c:126 #, fuzzy msgid "Add channels from: " msgstr "添加声道" #: src/sandwichdialog.c:130 msgid "Alignment" msgstr "" #~ msgid "double" #~ msgstr "双精度" #~ msgid "float" #~ msgstr "浮点" #~ msgid "mhWaveEdit: %s (%s): %d Hz, %d bit" #~ msgstr "mhWaveEdit: %s (%s): %d Hz, %d bit" #~ msgid "Follow cursor while playing" #~ msgstr "播放时光标跟随" #~ msgid "Removing channel" #~ msgstr "删除声道" #, fuzzy #~ msgid "Mapping channels" #~ msgstr "映射声道" #~ msgid "Removing channels" #~ msgstr "删除声道" #~ msgid "Choose a sample format" #~ msgstr "选择一个取样格式" #~ msgid "%d-bit" #~ msgstr "%d-bit" #~ msgid "%s (%s %s %d Hz)" #~ msgstr "%s (%s %s %d Hz)" #~ msgid "%s %s %d Hz" #~ msgstr "%s %s %d Hz" #~ msgid "Other format..." #~ msgstr "其它格式..." #~ msgid "" #~ "To add this format to the presets, enter a name below. Otherwise, leave " #~ "it blank." #~ msgstr "添加预置格式,在下面输入一个名称。否则,离开返回。" #, fuzzy #~ msgid "Sound device file:" #~ msgstr "声音 文件:" #~ msgid "" #~ "Environment variable LADSPA_PATH not set.\n" #~ "LADSPA support is disabled." #~ msgstr "" #~ "环境变量 LADSPA_PATH 没有设置。\n" #~ "LADSPA 支持不可用。" #~ msgid "8-bit wav-files must be in unsigned format!" #~ msgstr "8-bit WAV 文件必需在无符号格式中!" #~ msgid "16/24/32-bit wav-files must be in signed format!" #~ msgstr "16/24/32-bit AV 文件必需在有符号格式中!" #~ msgid "wav files must be in little endian format!" #~ msgstr "WAV 文件必需在 Little-endian 字节序格式(以低位结束一种存储方式)!" #~ msgid "/Debug/Mark as modified" #~ msgstr "标记修改" #~ msgid "[B] Convert samplerate" #~ msgstr "[B] 转换取样率" #~ msgid "[B] Speed" #~ msgstr "[B] 速率" #~ msgid "Channel %d" #~ msgstr "声道 %d" #~ msgid "/Effects/_Mix channels..." #~ msgstr "混合声道...(_M)" #~ msgid "/Effects/Sp_lit channel..." #~ msgstr "分离声道...(_L)" #~ msgid "lastNormLevel" #~ msgstr "最后基准电平" mhwaveedit-1.4.24/share/000077500000000000000000000000001334022513400150365ustar00rootroot00000000000000mhwaveedit-1.4.24/share/Makefile.am000066400000000000000000000002041334022513400170660ustar00rootroot00000000000000nobase_data_DATA = applications/mhwaveedit.desktop icons/hicolor/32x32/apps/mhwaveedit.png icons/hicolor/64x64/apps/mhwaveedit.png mhwaveedit-1.4.24/share/Makefile.in000066400000000000000000000360031334022513400171050ustar00rootroot00000000000000# Makefile.in generated by automake 1.15.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2017 Free Software Foundation, Inc. # This Makefile.in 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. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = share ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gtk.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/m4/sdl.m4 $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(datadir)" DATA = $(nobase_data_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALSALIB_LIBS = @ALSALIB_LIBS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ARTSC_CFLAGS = @ARTSC_CFLAGS@ ARTSC_CONFIG = @ARTSC_CONFIG@ ARTSC_LIBS = @ARTSC_LIBS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ESOUND_CFLAGS = @ESOUND_CFLAGS@ ESOUND_LIBS = @ESOUND_LIBS@ EXEEXT = @EXEEXT@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GTHREAD_CFLAGS = @GTHREAD_CFLAGS@ GTHREAD_LIBS = @GTHREAD_LIBS@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSAMPLERATE_CFLAGS = @LIBSAMPLERATE_CFLAGS@ LIBSAMPLERATE_LIBS = @LIBSAMPLERATE_LIBS@ LN_S = @LN_S@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PORTAUDIO_LIBS = @PORTAUDIO_LIBS@ POSUB = @POSUB@ POW_LIB = @POW_LIB@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ SNDFILE_LIBS = @SNDFILE_LIBS@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ nobase_data_DATA = applications/mhwaveedit.desktop icons/hicolor/32x32/apps/mhwaveedit.png icons/hicolor/64x64/apps/mhwaveedit.png all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu share/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu share/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-nobase_dataDATA: $(nobase_data_DATA) @$(NORMAL_INSTALL) @list='$(nobase_data_DATA)'; test -n "$(datadir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(datadir)'"; \ $(MKDIR_P) "$(DESTDIR)$(datadir)" || exit 1; \ fi; \ $(am__nobase_list) | while read dir files; do \ xfiles=; for file in $$files; do \ if test -f "$$file"; then xfiles="$$xfiles $$file"; \ else xfiles="$$xfiles $(srcdir)/$$file"; fi; done; \ test -z "$$xfiles" || { \ test "x$$dir" = x. || { \ echo " $(MKDIR_P) '$(DESTDIR)$(datadir)/$$dir'"; \ $(MKDIR_P) "$(DESTDIR)$(datadir)/$$dir"; }; \ echo " $(INSTALL_DATA) $$xfiles '$(DESTDIR)$(datadir)/$$dir'"; \ $(INSTALL_DATA) $$xfiles "$(DESTDIR)$(datadir)/$$dir" || exit $$?; }; \ done uninstall-nobase_dataDATA: @$(NORMAL_UNINSTALL) @list='$(nobase_data_DATA)'; test -n "$(datadir)" || list=; \ $(am__nobase_strip_setup); files=`$(am__nobase_strip)`; \ dir='$(DESTDIR)$(datadir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: for dir in "$(DESTDIR)$(datadir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-nobase_dataDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-nobase_dataDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic cscopelist-am \ ctags-am distclean distclean-generic distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-nobase_dataDATA \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic pdf pdf-am ps ps-am tags-am uninstall \ uninstall-am uninstall-nobase_dataDATA .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: mhwaveedit-1.4.24/share/applications/000077500000000000000000000000001334022513400175245ustar00rootroot00000000000000mhwaveedit-1.4.24/share/applications/mhwaveedit.desktop000066400000000000000000000005241334022513400232550ustar00rootroot00000000000000[Desktop Entry] Type=Application Name=mhWaveEdit GenericName=Sound file editor GenericName[fr]=Éditeur de fichier-son Comment=Record, play, edit and convert sound files Comment[fr]=Enregistre, joue, édite et convertit des fichiers-son Icon=mhwaveedit Exec=mhwaveedit Terminal=false Categories=AudioVideo;Audio;AudioVideoEditing;Recorder; mhwaveedit-1.4.24/share/icons/000077500000000000000000000000001334022513400161515ustar00rootroot00000000000000mhwaveedit-1.4.24/share/icons/hicolor/000077500000000000000000000000001334022513400176105ustar00rootroot00000000000000mhwaveedit-1.4.24/share/icons/hicolor/32x32/000077500000000000000000000000001334022513400203715ustar00rootroot00000000000000mhwaveedit-1.4.24/share/icons/hicolor/32x32/apps/000077500000000000000000000000001334022513400213345ustar00rootroot00000000000000mhwaveedit-1.4.24/share/icons/hicolor/32x32/apps/mhwaveedit.png000066400000000000000000000021241334022513400241760ustar00rootroot00000000000000PNG  IHDR szzbKGD pHYs  tIME J%IDATXŗ_h[u?JSd܋/> nB\u>T>MG@+)Pԭi\גO}[P"T'؃T6OJ͟&!{߽Ir|;|w(I lM +@{s,-Ēa_>^G)NupIb }d-N匤Phw.~jp6ĬM+ {pP)}bV1D:&Ԃ7K1N؄,sJIh9N}[¼>.N{DC1?0n}./ǀ7i?ئI3v^&]zNh?eafZny˕Po!x%7?ݥtY]1ϣ_|: m WԾtDP(G-%s:][s N&zd/J+a[\bWs-LjmB~+W9bLOy-{WI<@kMdsH ,S-œa$.Ċ4=CeJeu<{c\>@>``k;Půտ5*Pui`8 T@¤Ar@5~k:?9++deˋ8X1E.šLq>.oS2`?NeAdƻ|BP==old [$VAV|gf޾ @hneIg/-U7kekʂbEGgI[L' t۪.+ZpJ'[üI XH@f7 kYUdհj"RGK\pt',*-x5;HA$ukYZٓ>kUIpfu:br3IENDB`mhwaveedit-1.4.24/share/icons/hicolor/64x64/000077500000000000000000000000001334022513400204035ustar00rootroot00000000000000mhwaveedit-1.4.24/share/icons/hicolor/64x64/apps/000077500000000000000000000000001334022513400213465ustar00rootroot00000000000000mhwaveedit-1.4.24/share/icons/hicolor/64x64/apps/mhwaveedit.png000066400000000000000000000030571334022513400242160ustar00rootroot00000000000000PNG  IHDR@@iqbKGDRq pHYs  tIME9E(IDATx[]LUfX҄VCmP_ʃ61Ě$I!XM֨`[b,[ܴjPMh+!Őh>Yaʟav}ؽÝ;wfhlas{9gg)0D8\Q<r<r1ox~.ԁ߻}۔o78n.\c3 {smŬ)At-(,-ϨXd xb1@EN6:`TpC} d/|Mxz{ Lb)ԶgX5fY]@PyЃ7N΍Hp.!N;mzWaSrl1@@O#Aqz= &Ƌbbb\eӻ,x=o0_T̲V/SPW} *+oFg4]Wғ##Hn%^Sϛ+1`lB=9Mˑew%@زTS ?(_C|7تܱ܊s_cҽ8{[a=p&M`jNH[#-T$`ta?e| rf\Om.-d;,`_.f|000FWs-'8 HͥشK ~@bPnIH/mL'@H9 N)7_ -2&k HL5x΅:PJF=YCˎcJ诩` 6)xVS# "LG~d-k%}<&W69j.ʿpE[ WM)"SN`솧@k!ٽ[:E>^L Y[wg'NյtK `f0}/;hF5-Y]H̔Z~LO.2ВhȅkZd=mcQ1?b xVcUގHoriIuɉ =՜0_݄ꦵ8xUEA Q]fUފ "U fOQx'< )q`og'RQ<7:,tpoW5~Fh߷=)eybQ^ D; uL"67,dluL^ #e3V2K%yq<'J"V y6S2%{xXo^֕72:})FtE5ާ:9(k*Bf:aі޿o]EN}X "vS0)0c `gO_{{Ǖ`zM]Η^׭'9rN*cz {iA9K19v/Nw W,ۊIENDB`mhwaveedit-1.4.24/src/000077500000000000000000000000001334022513400145235ustar00rootroot00000000000000mhwaveedit-1.4.24/src/Makefile.am000066400000000000000000000027101334022513400165570ustar00rootroot00000000000000bin_PROGRAMS = mhwaveedit mhwaveedit_SOURCES = chunk.c int_box.c sound.c speeddialog.c \ chunkview.c main.c um.c \ effectdialog.c mainwindow.c ringbuf.c \ volumedialog.c float_box.c player.c \ sampleratedialog.c gtkfiles.c samplesizedialog.c \ formatselector.c recorddialog.c vu_meter.c inifile.c \ configdialog.c combinechannelsdialog.c rawdialog.c \ gotodialog.c pipedialog.c historybox.c viewcache.c \ filetypes.c datasource.c statusbar.c effectbrowser.c \ soxdialog.c help.c ladspacore.c ladspadialog.c \ tempfile.c listobject.c documentlist.c combo.c \ rateconv.c dataformat.c rateest.c document.c \ session.c mapchannelsdialog.c mainloop.c \ recordformatcombo.c sandwichdialog.c bitmap.c INCLUDES = @GTK_CFLAGS@ @SDL_CFLAGS@ @SNDFILE_CFLAGS@ @JACK_CFLAGS@ \ @ESOUND_CFLAGS@ @LIBSAMPLERATE_CFLAGS@ @ARTSC_CFLAGS@ \ @GTHREAD_CFLAGS@ @PULSE_CFLAGS@ LDADD = @GTK_LIBS@ @SDL_LIBS@ @PORTAUDIO_LIBS@ @SNDFILE_LIBS@ @ALSALIB_LIBS@ \ @JACK_LIBS@ @ESOUND_LIBS@ @LIBSAMPLERATE_LIBS@ @ARTSC_LIBS@ \ @GTHREAD_LIBS@ @PULSE_LIBS@ localedir = $(datadir)/locale AM_CPPFLAGS = -DLOCALEDIR=\"$(localedir)\" CLEANFILES = *~ core core.* #*# DISTCLEANFILES = .deps/*.P mhwaveedit-1.4.24/src/Makefile.in000066400000000000000000000607041334022513400165770ustar00rootroot00000000000000# Makefile.in generated by automake 1.15.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2017 Free Software Foundation, Inc. # This Makefile.in 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. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ bin_PROGRAMS = mhwaveedit$(EXEEXT) subdir = src ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gtk.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/m4/sdl.m4 $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" PROGRAMS = $(bin_PROGRAMS) am_mhwaveedit_OBJECTS = chunk.$(OBJEXT) int_box.$(OBJEXT) \ sound.$(OBJEXT) speeddialog.$(OBJEXT) chunkview.$(OBJEXT) \ main.$(OBJEXT) um.$(OBJEXT) effectdialog.$(OBJEXT) \ mainwindow.$(OBJEXT) ringbuf.$(OBJEXT) volumedialog.$(OBJEXT) \ float_box.$(OBJEXT) player.$(OBJEXT) \ sampleratedialog.$(OBJEXT) gtkfiles.$(OBJEXT) \ samplesizedialog.$(OBJEXT) formatselector.$(OBJEXT) \ recorddialog.$(OBJEXT) vu_meter.$(OBJEXT) inifile.$(OBJEXT) \ configdialog.$(OBJEXT) combinechannelsdialog.$(OBJEXT) \ rawdialog.$(OBJEXT) gotodialog.$(OBJEXT) pipedialog.$(OBJEXT) \ historybox.$(OBJEXT) viewcache.$(OBJEXT) filetypes.$(OBJEXT) \ datasource.$(OBJEXT) statusbar.$(OBJEXT) \ effectbrowser.$(OBJEXT) soxdialog.$(OBJEXT) help.$(OBJEXT) \ ladspacore.$(OBJEXT) ladspadialog.$(OBJEXT) tempfile.$(OBJEXT) \ listobject.$(OBJEXT) documentlist.$(OBJEXT) combo.$(OBJEXT) \ rateconv.$(OBJEXT) dataformat.$(OBJEXT) rateest.$(OBJEXT) \ document.$(OBJEXT) session.$(OBJEXT) \ mapchannelsdialog.$(OBJEXT) mainloop.$(OBJEXT) \ recordformatcombo.$(OBJEXT) sandwichdialog.$(OBJEXT) \ bitmap.$(OBJEXT) mhwaveedit_OBJECTS = $(am_mhwaveedit_OBJECTS) mhwaveedit_LDADD = $(LDADD) mhwaveedit_DEPENDENCIES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(mhwaveedit_SOURCES) DIST_SOURCES = $(mhwaveedit_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALSALIB_LIBS = @ALSALIB_LIBS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ARTSC_CFLAGS = @ARTSC_CFLAGS@ ARTSC_CONFIG = @ARTSC_CONFIG@ ARTSC_LIBS = @ARTSC_LIBS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ESOUND_CFLAGS = @ESOUND_CFLAGS@ ESOUND_LIBS = @ESOUND_LIBS@ EXEEXT = @EXEEXT@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GTHREAD_CFLAGS = @GTHREAD_CFLAGS@ GTHREAD_LIBS = @GTHREAD_LIBS@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSAMPLERATE_CFLAGS = @LIBSAMPLERATE_CFLAGS@ LIBSAMPLERATE_LIBS = @LIBSAMPLERATE_LIBS@ LN_S = @LN_S@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PORTAUDIO_LIBS = @PORTAUDIO_LIBS@ POSUB = @POSUB@ POW_LIB = @POW_LIB@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ SNDFILE_LIBS = @SNDFILE_LIBS@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = $(datadir)/locale localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ mhwaveedit_SOURCES = chunk.c int_box.c sound.c speeddialog.c \ chunkview.c main.c um.c \ effectdialog.c mainwindow.c ringbuf.c \ volumedialog.c float_box.c player.c \ sampleratedialog.c gtkfiles.c samplesizedialog.c \ formatselector.c recorddialog.c vu_meter.c inifile.c \ configdialog.c combinechannelsdialog.c rawdialog.c \ gotodialog.c pipedialog.c historybox.c viewcache.c \ filetypes.c datasource.c statusbar.c effectbrowser.c \ soxdialog.c help.c ladspacore.c ladspadialog.c \ tempfile.c listobject.c documentlist.c combo.c \ rateconv.c dataformat.c rateest.c document.c \ session.c mapchannelsdialog.c mainloop.c \ recordformatcombo.c sandwichdialog.c bitmap.c INCLUDES = @GTK_CFLAGS@ @SDL_CFLAGS@ @SNDFILE_CFLAGS@ @JACK_CFLAGS@ \ @ESOUND_CFLAGS@ @LIBSAMPLERATE_CFLAGS@ @ARTSC_CFLAGS@ \ @GTHREAD_CFLAGS@ @PULSE_CFLAGS@ LDADD = @GTK_LIBS@ @SDL_LIBS@ @PORTAUDIO_LIBS@ @SNDFILE_LIBS@ @ALSALIB_LIBS@ \ @JACK_LIBS@ @ESOUND_LIBS@ @LIBSAMPLERATE_LIBS@ @ARTSC_LIBS@ \ @GTHREAD_LIBS@ @PULSE_LIBS@ AM_CPPFLAGS = -DLOCALEDIR=\"$(localedir)\" CLEANFILES = *~ core core.* #*# DISTCLEANFILES = .deps/*.P all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) mhwaveedit$(EXEEXT): $(mhwaveedit_OBJECTS) $(mhwaveedit_DEPENDENCIES) $(EXTRA_mhwaveedit_DEPENDENCIES) @rm -f mhwaveedit$(EXEEXT) $(AM_V_CCLD)$(LINK) $(mhwaveedit_OBJECTS) $(mhwaveedit_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bitmap.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chunk.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chunkview.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/combinechannelsdialog.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/combo.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/configdialog.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dataformat.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/datasource.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/document.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/documentlist.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/effectbrowser.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/effectdialog.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/filetypes.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/float_box.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/formatselector.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gotodialog.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gtkfiles.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/help.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/historybox.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/inifile.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/int_box.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ladspacore.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ladspadialog.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/listobject.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mainloop.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mainwindow.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mapchannelsdialog.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pipedialog.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/player.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rateconv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rateest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rawdialog.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/recorddialog.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/recordformatcombo.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ringbuf.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sampleratedialog.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/samplesizedialog.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sandwichdialog.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/session.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sound.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soxdialog.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/speeddialog.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/statusbar.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tempfile.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/um.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/viewcache.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/volumedialog.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vu_meter.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) installdirs: for dir in "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ clean-binPROGRAMS clean-generic cscopelist-am ctags ctags-am \ distclean distclean-compile distclean-generic distclean-tags \ distdir dvi dvi-am html html-am info info-am install \ install-am install-binPROGRAMS install-data install-data-am \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic pdf pdf-am \ ps ps-am tags tags-am uninstall uninstall-am \ uninstall-binPROGRAMS .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: mhwaveedit-1.4.24/src/bitmap.c000066400000000000000000000107311334022513400161450ustar00rootroot00000000000000/* * Copyright (C) 2010, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include #include "bitmap.h" #include "main.h" #include static GtkWidgetClass *parent_class; static void bitmap_style_set(GtkWidget *widget, GtkStyle *previous_style) { BITMAP(widget)->update_gc = TRUE; if (parent_class->style_set != NULL) parent_class->style_set(widget,previous_style); } static gboolean bitmap_expose(GtkWidget *widget, GdkEventExpose *event) { Bitmap *b = BITMAP(widget); GdkColor cb,cf,c; gint af,ab; gint allx,ally,allw,allh,ox,oy; g_assert(b->bmp != NULL); if (b->gc == NULL) { b->gc = gdk_gc_new(widget->window); b->update_gc = TRUE; } if (b->update_gc) { if (b->color_mode == 0) { gdk_gc_set_rgb_fg_color(b->gc, &b->clr); } else { cb = widget->style->bg[0]; cf = widget->style->fg[0]; af = b->alpha; ab = 256-af; c.pixel = 0; c.red = (cf.red*af + cb.red*ab) >> 8; c.green = (cf.green*af + cb.red*ab) >> 8; c.blue = (cf.blue*af + cb.blue*ab) >> 8; gdk_gc_set_rgb_fg_color(b->gc, &c); } gdk_gc_set_fill(b->gc, GDK_STIPPLED); gdk_gc_set_stipple(b->gc, b->bmp); b->update_gc = FALSE; } ox = allx = widget->allocation.x; oy = ally = widget->allocation.y; allw = widget->allocation.width; allh = widget->allocation.height; if (allw != b->bmpw) ox += (allw-b->bmpw) / 2; if (allh != b->bmph) oy += (allh-b->bmph) / 2; gdk_gc_set_ts_origin(b->gc, ox, oy); gdk_draw_rectangle(widget->window, b->gc, TRUE, ox, oy, b->bmpw, b->bmph); if (parent_class->expose_event != NULL) return parent_class->expose_event(widget,event); return FALSE; } static void bitmap_destroy(GtkObject *object) { Bitmap *b = BITMAP(object); if (b->gc != NULL) { gdk_gc_unref(b->gc); b->gc = NULL; } if (b->bmp != NULL) { gdk_bitmap_unref(b->bmp); b->bmp = NULL; } if (GTK_OBJECT_CLASS(parent_class)->destroy != NULL) GTK_OBJECT_CLASS(parent_class)->destroy(object); } static void bitmap_class_init(GtkObjectClass *klass) { GtkWidgetClass *wc = GTK_WIDGET_CLASS(klass); GtkObjectClass *oc = GTK_OBJECT_CLASS(klass); parent_class = gtk_type_class(gtk_widget_get_type()); wc->style_set = bitmap_style_set; wc->expose_event = bitmap_expose; oc->destroy = bitmap_destroy; } static void bitmap_init(GtkObject *obj) { Bitmap *b = BITMAP(obj); gtk_widget_set_has_window(GTK_WIDGET(obj),FALSE); b->gc = NULL; b->bmp = NULL; b->color_mode = 0; memset(&(b->clr), 0, sizeof(b->clr)); b->alpha = 1.0; } GtkType bitmap_get_type(void) { static GtkType id = 0; if (!id) { GtkTypeInfo info = { "Bitmap", sizeof(Bitmap), sizeof(BitmapClass), (GtkClassInitFunc)bitmap_class_init, (GtkObjectInitFunc)bitmap_init }; id = gtk_type_unique(gtk_widget_get_type(),&info); } return id; } GtkWidget *bitmap_new_from_data(unsigned char *data, int width, int height) { Bitmap *b; GtkWidget *w; gpointer p; p = gtk_type_new(bitmap_get_type()); w = p; b = p; b->bmp = gdk_bitmap_create_from_data(NULL,(const gchar *)data,width,height); w->requisition.width = width; w->requisition.height = height; b->bmpw = width; b->bmph = height; return GTK_WIDGET(b); } void bitmap_set_color(Bitmap *bmp, GdkColor *clr) { memcpy(&bmp->clr, clr, sizeof(bmp->clr)); bmp->color_mode = 0; gtk_widget_queue_draw(GTK_WIDGET(bmp)); } void bitmap_set_fg(Bitmap *bmp, gfloat alpha) { bmp->alpha = (gint)(alpha * 256.0); bmp->color_mode = 1; gtk_widget_queue_draw(GTK_WIDGET(bmp)); } mhwaveedit-1.4.24/src/bitmap.h000066400000000000000000000036551334022513400161610ustar00rootroot00000000000000/* * Copyright (C) 2010, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ /* Simple widget to display an xbm bitmap. * Supports two color modes (default is black color): * Constant color - set using bitmap_set_color * Themed - interpolated between the current theme's fg and bg colors * Set using bitmap_set_fg (alpha=0.0 gives bg color, 1.0 gives fg color). * In both modes the bitmap has transparent background. */ #ifndef BITMAP_H_INCLUDED #define BITMAP_H_INCLUDED #include #define BITMAP(obj) GTK_CHECK_CAST(obj,bitmap_get_type(),Bitmap) #define BITMAP_CLASS(klass) GTK_CHECK_CLASS_CAST(klass,bitmap_get_type(),BitmapClass) #define IS_BITMAP(obj) GTK_CHECK_TYPE(obj,bitmap_get_type()) typedef struct { GtkWidget wid; GdkGC *gc; gboolean update_gc; GdkBitmap *bmp; gint bmpw, bmph; gint color_mode; /* 0=fixed, 1=between fg/bg */ GdkColor clr; gint alpha; /* 0..256 */ } Bitmap; typedef struct { GtkWidgetClass klass; } BitmapClass; GtkType bitmap_get_type(void); GtkWidget *bitmap_new_from_data(unsigned char *data, int width, int height); void bitmap_set_color(Bitmap *bmp, GdkColor *clr); void bitmap_set_fg(Bitmap *bmp, gfloat alpha); #endif mhwaveedit-1.4.24/src/button_bounce.xpm000066400000000000000000000014141334022513400201170ustar00rootroot00000000000000/* XPM */ static char * button_bounce_xpm[] = { "20 20 16 1", " c None", ". c #000000", "+ c #60D33C", "@ c #090909", "# c #111111", "$ c #FCFCFC", "% c #1A1A1A", "& c #191921", "* c #FFFFFF", "= c #2C2C2C", "- c #F9F9F9", "; c #353535", "> c #3D3D3D", ", c #464646", "' c #4F4F4F", ") c #585858", " ", " ", " ", " ................. ", " .++...........+.. ", " .++............+. ", " .++@@@@@@@@@@@+@. ", " .++###$########+. ", " .++%%$$%%%%%%%+&. ", " .++%*********%%+. ", " .++=.--......=+=. ", " .++;;.-.;;;;;;;+. ", " .++>>>.>>>>>>>+>. ", " .++,,,,,,,,,,,,+. ", " .++'''''''''''+'. ", " .++))))))))))))+. ", " ................. ", " ", " ", " "}; mhwaveedit-1.4.24/src/button_copy.xpm000066400000000000000000000031031334022513400176130ustar00rootroot00000000000000/* XPM */ static char * button_copy_xpm[] = { "20 20 71 1", " c None", ". c #000000", "+ c #666666", "@ c #676767", "# c #6B6B6B", "$ c #6E6E6E", "% c #707070", "& c #717171", "* c #727272", "= c #6F6F6F", "- c #737373", "; c #767676", "> c #787878", ", c #7A7A7A", "' c #828282", ") c #838383", "! c #9A9A9A", "~ c #9F9F9F", "{ c #A3A3A3", "] c #A7A7A7", "^ c #AAAAAA", "/ c #ADADAD", "( c #AFAFAF", "_ c #B0B0B0", ": c #8B8B8B", "< c #8C8C8C", "[ c #A0A0A0", "} c #A5A5A5", "| c #AEAEAE", "1 c #B2B2B2", "2 c #B4B4B4", "3 c #B7B7B7", "4 c #B8B8B8", "5 c #949494", "6 c #A6A6A6", "7 c #ABABAB", "8 c #B5B5B5", "9 c #B9B9B9", "0 c #BCBCBC", "a c #BEBEBE", "b c #C0C0C0", "c c #9C9C9C", "d c #9D9D9D", "e c #B1B1B1", "f c #BBBBBB", "g c #C3C3C3", "h c #C6C6C6", "i c #C7C7C7", "j c #C8C8C8", "k c #C2C2C2", "l c #CACACA", "m c #CDCDCD", "n c #CFCFCF", "o c #D0D0D0", "p c #D1D1D1", "q c #D4D4D4", "r c #D7D7D7", "s c #D2D2D2", "t c #DCDCDC", "u c #DEDEDE", "v c #DFDFDF", "w c #DDDDDD", "x c #E2E2E2", "y c #E6E6E6", "z c #E7E7E7", "A c #E8E8E8", "B c #EDEDED", "C c #EFEFEF", "D c #F3F3F3", "E c #F7F7F7", "F c #FFFFFF", " ", " ............ ", " .+++@#$%&*&. ", " .++#=-;>,,,. ", " ............')'. ", " .!~{]^/(___.:<:. ", " .[}^|123444.555. ", " .67_890abbb.cdc. ", " .7e3fbghiji.}6}. ", " ._30khlmnon./|/. ", " .8fkimpqrrr.838. ", " .9bhmsrtuvu.0b0. ", " .0glprwxyzy.bjb. ", " .ahmqtxABCB.0b0. ", " .binruyBDED..... ", " .bjorvzCEFE. ", " .binruyBDED. ", " ............ ", " ", " "}; mhwaveedit-1.4.24/src/button_cursorend.xpm000066400000000000000000000015321334022513400206510ustar00rootroot00000000000000/* XPM */ static char * button_cursorend_xpm[] = { "20 20 21 1", " c None", ". c #9A6B2B", "+ c #777777", "@ c #000000", "# c #A4732D", "$ c #0E0E0E", "% c #AE7A30", "& c #0000FF", "* c #1C1C1C", "= c #B78132", "- c #2A2A2A", "; c #C18835", "> c #393939", ", c #CB8F38", "' c #474747", ") c #D4963A", "! c #555555", "~ c #DE9D3D", "{ c #636363", "] c #E7A53F", "^ c #727272", " ", " ", " ", " ", " .......+@@@@@@@@ ", " .......+@@@@@@@@ ", " .......+@@@@@@@@ ", " #######+$$$$$$$$ ", " %%&%%%%&****&*** ", " &=&&&&&+&&-&-&&& ", " ;&;;&;;+>>&>>&&> ", " ,,,,,,,+'''''''' ", " )))))))+!!!!!!!! ", " ~~~~~~~+{{{{{{{{ ", " ]]]]]]]+^^^^^^^^ ", " ]]]]]]]+^^^^^^^^ ", " ", " ", " ", " "}; mhwaveedit-1.4.24/src/button_cursorstart.xpm000066400000000000000000000015531334022513400212430ustar00rootroot00000000000000/* XPM */ static char * button_cursorstart_xpm[] = { "20 20 22 1", " c None", ". c #000000", "+ c #777777", "@ c #996B2B", "# c #A2712D", "$ c #0E0E0E", "% c #AB772F", "& c #1C1C1C", "* c #0000FF", "= c #B37D31", "- c #2A2A2A", "; c #BC8434", "> c #393939", ", c #C48A36", "' c #474747", ") c #CD9138", "! c #555555", "~ c #D5973A", "{ c #636363", "] c #DE9E3C", "^ c #727272", "/ c #E7A53E", " ", " ", " ", " ", " .......+@@@@@@@@ ", " .......+@@@@@@@@ ", " .......+######## ", " $$$$$$$+%%%%%%%% ", " &&*&&&&*====*=== ", " *-*****+**;*;*** ", " >*>>*>>+,,*,,**, ", " '''''''+)))))))) ", " !!!!!!!+~~~~~~~~ ", " {{{{{{{+]]]]]]]] ", " ^^^^^^^+//////// ", " ^^^^^^^+//////// ", " ", " ", " ", " "}; mhwaveedit-1.4.24/src/button_cut.xpm000066400000000000000000000011241334022513400174350ustar00rootroot00000000000000/* XPM */ static char * button_cut_xpm[] = { "20 20 4 1", " c None", ". c #000000", "+ c #FFFFFF", "@ c #7B93D3", " ", " . . ", " .+. .+. ", " .++. .++. ", " .++. .++. ", " .++. .++. ", " .++..++. ", " .++++. ", " .++. ", " .++++. ", " .++..++. ", " ...@@. .@@... ", " ..@@@@@. .@@@@@. ", " .@@.@@. .@@.@@. ", " .@...@. .@...@. ", " .@@.@@. .@@.@@. ", " .@@@@@. .@@@@. ", " ..... .... ", " ", " "}; mhwaveedit-1.4.24/src/button_delete.xpm000066400000000000000000000061751334022513400201170ustar00rootroot00000000000000/* XPM */ static char * button_delete_xpm[] = { "20 20 141 2", " c None", ". c #E51B1B", "+ c #D21818", "@ c #CF1818", "# c #730D0D", "$ c #0E0101", "% c #000000", "& c #040000", "* c #230404", "= c #830F0F", "- c #DE2626", "; c #DF2424", "> c #C55B5B", ", c #AA9E9E", "' c #AAAAAA", ") c #ADADAD", "! c #AFAFAF", "~ c #B0B0B0", "{ c #B1ADAD", "] c #BB8F8F", "^ c #9B1212", "/ c #130202", "( c #C35A5A", "_ c #E02424", ": c #E02525", "< c #CB6060", "[ c #B5A8A8", "} c #B4B4B4", "| c #B7B7B7", "1 c #B8B6B6", "2 c #BF9C9C", "3 c #D74848", "4 c #D41919", "5 c #A99D9D", "6 c #C95E5E", "7 c #E12525", "8 c #CF6767", "9 c #BEB3B3", "0 c #BEBBBB", "a c #C6A3A3", "b c #D75656", "c c #E22626", "d c #BF1616", "e c #ABABAB", "f c #B4A7A7", "g c #D06161", "h c #E22525", "i c #E12929", "j c #D46E6E", "k c #CE9898", "l c #DC4A4A", "m c #E32323", "n c #E03737", "o c #550A0A", "p c #C0ACAC", "q c #D75D5D", "r c #E22929", "s c #E32727", "t c #E13636", "u c #E42222", "v c #E03F3F", "w c #D69090", "x c #080000", "y c #B5B5B5", "z c #BBBBBB", "A c #C2C0C0", "B c #CBAFAF", "C c #DE4D4D", "D c #E41D1D", "E c #E24242", "F c #DAA4A4", "G c #D7D1D1", "H c #B9B9B9", "I c #C0C0C0", "J c #C6C3C3", "K c #D2A3A3", "L c #E13B3B", "M c #E41F1F", "N c #E26B6B", "O c #DFD2D2", "P c #DEDEDE", "Q c #BCBCBC", "R c #C3C1C1", "S c #CEABAB", "T c #DF4C4C", "U c #E42121", "V c #E43030", "W c #E42525", "X c #E53232", "Y c #E6A9A9", "Z c #E5E4E4", "` c #BFB9B9", " . c #CC9F9F", ".. c #DC5858", "+. c #E42323", "@. c #E34242", "#. c #E39393", "$. c #E55353", "%. c #E52424", "&. c #E86C6C", "*. c #ECD8D8", "=. c #CC8787", "-. c #DE4040", ";. c #E32424", ">. c #E23737", ",. c #E09999", "'. c #E5DDDD", "). c #EAA7A7", "!. c #E63838", "~. c #E62F2F", "{. c #EC8D8D", "]. c #0A0101", "^. c #580A0A", "/. c #DF3333", "(. c #E32222", "_. c #E04242", ":. c #DB9696", "<. c #DFD8D8", "[. c #E7E7E7", "}. c #EEDFDF", "|. c #EC7373", "1. c #E62525", "2. c #E73B3B", "3. c #420707", "4. c #C61717", "5. c #E32020", "6. c #DA5555", "7. c #D3A8A8", "8. c #E6E6E6", "9. c #ECEBEB", "0. c #EFC3C3", "a. c #E84545", "b. c #E52323", "c. c #9F1212", "d. c #DE1A1A", "e. c #9D1212", "f. c #1F0303", "g. c #010000", "h. c #060000", "i. c #5F0B0B", "j. c #D01818", " . . ", " . . . ", " . . . ", " . + @ # $ % % % % % % & * . . . ", " = - ; > , ' ) ! ~ { ] ^ . . ", " / ( _ : < [ } | 1 2 3 4 . ", " % 5 6 7 7 8 9 0 a b c d ", " % e f g h i j k l m n o ", " % ~ | p q r s t u v w x ", " % y z A B C D . E F G % ", " % H I J K L . M N O P % ", " % Q R S T U V W X Y Z % ", " % ` ...+.@.#.$.%.&.*.% ", " x =.-.;.>.,.'.).!.~.{.]. ", " ^./.(._.:.<.[.}.|.1.2.3. ", " 4.5.6.7.G P 8.9.0.a.b.c. ", " . d.e.f.g.% % % % h.i.j.4 . ", " . . . . . . ", " . . . ", " "}; mhwaveedit-1.4.24/src/button_follow.xpm000066400000000000000000000013561334022513400201530ustar00rootroot00000000000000/* XPM */ static char * button_follow_xpm[] = { "20 20 14 1", " c None", ". c #000000", "+ c #FFFFFF", "@ c #60D33C", "# c #090909", "$ c #111111", "% c #1B1B1B", "& c #0000FF", "* c #2C2C2C", "= c #2D2D2D", "- c #353535", "; c #3E3E3E", "> c #474747", ", c #505050", " ", " ", " ", " .................. ", " .++++++++++++++++. ", " .+......@@......+. ", " .+######@@######+. ", " .+$$$+$$@@$$+$$$+. ", " .+%&%++%@@%++%&%+. ", " .+++++++@@+++++++. ", " .+&**++=@@*++**&+. ", " .+---+--@@--+---+. ", " .+;;;;;;@@;;;;;;+. ", " .+>>>>>>@@>>>>>>+. ", " .+,,,,,,@@,,,,,,+. ", " .++++++++++++++++. ", " .................. ", " ", " ", " "}; mhwaveedit-1.4.24/src/button_loop.xpm000066400000000000000000000013731334022513400176210ustar00rootroot00000000000000/* XPM */ static char * button_loop_xpm[] = { "20 20 15 1", " c None", ". c #000000", "+ c #1DB917", "@ c #1DBD18", "# c #1FC119", "$ c #20C519", "% c #21C91A", "& c #22CD1B", "* c #23D11B", "= c #24D51C", "- c #25D91D", "; c #26DD1D", "> c #27E11E", ", c #28E51F", "' c #29E91F", " ", " ", " ", " ........ ", " ...+++@#$... ", " ..++++@#$%&*.. ", " ..++++@#$%&*=-.. ", " .++++@....*=-;>. ", " .+++... ...;>,. ", " .++@... .>,'. ", " .+@#.%......,''. ", " .@#$%&*..;>,'''. ", " ..$%&*=-.>,'''.. ", " ..&*=-..,'''.. ", " ...-........ ", " ... ", " ", " ", " ", " "}; mhwaveedit-1.4.24/src/button_mixer.xpm000066400000000000000000000014701334022513400177720ustar00rootroot00000000000000/* XPM */ static char * button_mixer_xpm[] = { "20 20 19 1", " c None", ". c #FFFFFF", "+ c #000000", "@ c #0E0E0E", "# c #0C0C0C", "$ c #1C1C1C", "% c #191919", "& c #2A2A2A", "* c #262626", "= c #393939", "- c #323232", "; c #474747", "> c #3F3F3F", ", c #555555", "' c #4B4B4B", ") c #636363", "! c #585858", "~ c #727272", "{ c #656565", " ", " ", " ", " ", " .... .... ", " .++. .++. ", " .++. .++. ", " .@@. ...##... ", " .$$. .%%%%%%. ", " .&&. ...**... ", " .==. .--. ", " ...;;... .>>. ", " .,,,,,,. .''. ", " ...))... .!!. ", " .~~. .{{. ", " .~~. .~~. ", " .... .... ", " ", " ", " "}; mhwaveedit-1.4.24/src/button_open.xpm000066400000000000000000000020301334022513400176000ustar00rootroot00000000000000/* XPM */ static char * button_open_xpm[] = { "20 20 34 1", " c None", ". c #000000", "+ c #FFFFFF", "@ c #E2BE44", "# c #E3C150", "$ c #E5C45B", "% c #E6C764", "& c #E7C96C", "* c #E7CA70", "= c #E8CB72", "- c #E3C04E", "; c #E6C867", "> c #E9CE7B", ", c #E9CF81", "' c #EAD083", ") c #895E2A", "! c #E1BD40", "~ c #E2BE48", "{ c #E4C356", "] c #E9CF7F", "^ c #EAD28A", "/ c #EBD491", "( c #ECD594", "_ c #E3C04D", ": c #E5C45C", "< c #ECD697", "[ c #EDD9A1", "} c #EEDBA5", "| c #E5C660", "1 c #EFDEAF", "2 c #F0E1B7", "3 c #E4C151", "4 c #E6C662", "5 c #F1E7C8", " ", " ", " ........... ", " .+++++++++. ", " .+++++++++. ", " .+++++++++. ", " ...........+. ", " .@#$%&*=*&.+... ", " ...-$;=>,',>.+.). ", " .!~{%=]^/(/^...). ", " .!_:&>^<[}[<.)). ", " .!#|*,/[121[/.). ", " .34='(}252}(.). ", " .#|*,/[121[/.. ", " ._:&>^<[}[<^.. ", " ............ ", " ", " ", " ", " "}; mhwaveedit-1.4.24/src/button_paste.xpm000066400000000000000000000026201334022513400177600ustar00rootroot00000000000000/* XPM */ static char * button_paste_xpm[] = { "20 20 59 1", " c None", ". c #000000", "+ c #B5B5B5", "@ c #BBBBBB", "# c #C2C2C2", "$ c #C7C7C7", "% c #CDCDCD", "& c #D1D1D1", "* c #D4D4D4", "= c #D7D7D7", "- c #B9B9B9", "; c #C0C0C0", "> c #C6C6C6", ", c #D2D2D2", "' c #DCDCDC", ") c #DEDEDE", "! c #DFDFDF", "~ c #BCBCBC", "{ c #C3C3C3", "] c #CACACA", "^ c #DDDDDD", "/ c #E2E2E2", "( c #E6E6E6", "_ c #E7E7E7", ": c #BEBEBE", "< c #E8E8E8", "[ c #EDEDED", "} c #EFEFEF", "| c #CFCFCF", "1 c #F3F3F3", "2 c #F7F7F7", "3 c #C8C8C8", "4 c #D0D0D0", "5 c #FFFFFF", "6 c #484848", "7 c #4B4B4B", "8 c #4C4C4C", "9 c #515151", "0 c #585858", "a c #5C5C5C", "b c #5D5D5D", "c c #575757", "d c #606060", "e c #686868", "f c #6D6D6D", "g c #6F6F6F", "h c #636363", "i c #787878", "j c #7E7E7E", "k c #808080", "l c #7C7C7C", "m c #878787", "n c #8F8F8F", "o c #919191", "p c #949494", "q c #9F9F9F", "r c #A3A3A3", "s c #ADADAD", "t c #B4B4B4", " .+@#$%&*===. ", " .-;>%,=')!). ", " .~{]&=^/(_(. ", " .:>%*'/<[}[. ", " .;$|=)([121. ", " .;34=!_}252. ", " .;$|=)([121. ", " ............ ", " ", "......... .........", ".6666787. .6666787.", ".6690aba. .6690aba.", ".7cdefgf. .7cdefgf.", ".chgijkj. .chgijkj.", ".dglmnon. .dglmnon.", ".eimpqrq. .eimpqrq.", ".fjnqsts. .fjnqsts.", ".gkort>t. .gkort>t.", ".fjnqsts. .fjnqsts.", "......... ........."}; mhwaveedit-1.4.24/src/button_pasteover.xpm000066400000000000000000000031461334022513400206600ustar00rootroot00000000000000/* XPM */ static char * button_pasteover_xpm[] = { "20 20 73 1", " c None", ". c #000000", "+ c #9A9A9A", "@ c #9F9F9F", "# c #A3A3A3", "$ c #A7A7A7", "% c #AAAAAA", "& c #ADADAD", "* c #AFAFAF", "= c #B0B0B0", "- c #A0A0A0", "; c #A5A5A5", "> c #AEAEAE", ", c #B2B2B2", "' c #B4B4B4", ") c #B7B7B7", "! c #B8B8B8", "~ c #A6A6A6", "{ c #ABABAB", "] c #B5B5B5", "^ c #B9B9B9", "/ c #BCBCBC", "( c #BEBEBE", "_ c #C0C0C0", ": c #B1B1B1", "< c #BBBBBB", "[ c #C3C3C3", "} c #C6C6C6", "| c #C7C7C7", "1 c #C8C8C8", "2 c #C2C2C2", "3 c #CACACA", "4 c #CDCDCD", "5 c #CFCFCF", "6 c #D0D0D0", "7 c #D1D1D1", "8 c #D4D4D4", "9 c #D7D7D7", "0 c #D2D2D2", "a c #DCDCDC", "b c #DEDEDE", "c c #DFDFDF", "d c #DDDDDD", "e c #E2E2E2", "f c #E6E6E6", "g c #E7E7E7", "h c #484848", "i c #4B4B4B", "j c #4C4C4C", "k c #E8E8E8", "l c #EDEDED", "m c #EFEFEF", "n c #515151", "o c #585858", "p c #5C5C5C", "q c #5D5D5D", "r c #F3F3F3", "s c #F7F7F7", "t c #575757", "u c #606060", "v c #686868", "w c #6D6D6D", "x c #6F6F6F", "y c #FFFFFF", "z c #636363", "A c #787878", "B c #7E7E7E", "C c #808080", "D c #7C7C7C", "E c #878787", "F c #8F8F8F", "G c #919191", "H c #949494", " ", " ............", " .+@#$%&*===.", " .-;%>,')!!!.", " .~{=]^/(___.", " .{:)<_[}|1|.", " .=)/2}34565.", " .]<2|478999.", " .^_}409abcb.", "........./[379defgf.", ".hhhhiji.(}48aeklml.", ".hhnopqp._|59bflrsr.", ".ituvwxw._169cgmsys.", ".tzxABCB._|59bflrsr.", ".uxDEFGF............", ".vAEH@#@. .vAEH@#@.", ".wBF@&'&. .wBF@&'&.", ".xCG#'}'. .xCG#'}'.", ".wBF@&'&. .wBF@&'&.", "......... ........."}; mhwaveedit-1.4.24/src/button_play.xpm000066400000000000000000000013351334022513400176130ustar00rootroot00000000000000/* XPM */ static char * button_play_xpm[] = { "20 20 13 1", " c None", ". c #000000", "+ c #1DB917", "@ c #28BE22", "# c #32C12B", "$ c #35C22E", "% c #39C432", "& c #47C93E", "* c #4CCA44", "= c #5ACF51", "- c #64D25B", "; c #1FBA1A", "> c #7DDA73", " ", " ", " ... ", " .+.. ", " .++.. ", " .+++.. ", " .++++.. ", " .++@#$.. ", " .+@%&*&.. ", " .+#&=-=&. ", " .;$*->-.. ", " .+#&=-.. ", " .+@%&.. ", " .++@.. ", " .++.. ", " .+.. ", " ... ", " ", " ", " "}; mhwaveedit-1.4.24/src/button_playselection.xpm000066400000000000000000000014231334022513400215170ustar00rootroot00000000000000/* XPM */ static char * button_playselection_xpm[] = { "20 20 16 1", " c None", ". c #000000", "+ c #FCDF0F", "@ c #FBE022", "# c #FAE02F", "$ c #FAE02B", "% c #F9E142", "& c #F9E252", "* c #F8E258", "= c #F8E35E", "- c #F7E473", "; c #F7E57C", "> c #F6E791", ", c #F5E89F", "' c #FAE133", ") c #F4ECC2", " ", " ", " ... ", " .+.. ", " .++.. ", " .+++.. ", " .++@#.. ", " .+$%&*.. ", " .@%=-;-.. ", " .#&->,>-. ", " .'*;,),.. ", " .#&->,.. ", " .@%=-.. ", " .+$%.. ", " .++.. ", " .+.. ", " ... ", " ", " ", " "}; mhwaveedit-1.4.24/src/button_record.xpm000066400000000000000000000015101334022513400201170ustar00rootroot00000000000000/* XPM */ static char * button_record_xpm[] = { "20 20 20 1", " c None", ". c #000000", "+ c #E34949", "@ c #E54E4E", "# c #DF3B3B", "$ c #DA2929", "% c #E65353", "& c #EB6666", "* c #ED6E6E", "= c #D82222", "- c #F28282", "; c #F69090", "> c #DB2C2C", ", c #D21111", "' c #FFB5B5", ") c #DC3030", "! c #D31414", "~ c #D00909", "{ c #CE0202", "] c #CE0303", " ", " ", " ", " ", " ....... ", " ..+@+#$.. ", " ..%&*&%#=.. ", " .+&-;-&+>,. ", " .@*;';*@)!. ", " .+&-;-&+>,. ", " .#%&*&%#=~. ", " .$#+@+#$!{. ", " ..=>)>=!].. ", " ..,!,~{.. ", " ....... ", " ", " ", " ", " ", " "}; mhwaveedit-1.4.24/src/button_redo.xpm000066400000000000000000000030521334022513400175750ustar00rootroot00000000000000/* XPM */ static char *button_redo_xpm[] = { "20 20 40 2", " c None", "01 c #000000", "02 c #26BA21", "03 c #23BA1E", "04 c #1FBA1A", "05 c #1DB917", "06 c #32BB2C", "07 c #30BB2A", "08 c #2DBB28", "09 c #2ABB24", "0A c #21BA1C", "0B c #3ABC35", "0C c #39BC34", "0D c #37BC32", "0E c #34BB2F", "0F c #30BB2B", "10 c #2CBB27", "11 c #27BA22", "12 c #22BA1D", "13 c #42BC3D", "14 c #40BC3B", "15 c #3EBC39", "16 c #4ABD45", "17 c #49BD44", "18 c #47BD42", "19 c #51BE4C", "1A c #58BE53", "1B c #59BE54", "1C c #5FBF5B", "1D c #61BF5C", "1E c #28BA23", "1F c #66BF62", "20 c #68BF64", "21 c #2ABB25", "22 c #6DC068", "23 c #70C06C", "24 c #2BBB26", "25 c #24BA1F", "26 c #77C073", "27 c #1DBA18", " ", " ", " 010101010101 ", " 01010105040302010101 ", " 010105050A02090807060101 ", " 010105051211100F0E0D0C0B0101 ", " 0105050A11010101011514131301 ", " 01010504020101 01011817160101 ", " 010505030101 010119191901 ", " 0105040201 011A1B1A01 ", " 01050A1E01 011C1D1C01 ", " 0105032101 01011F201F0101 ", " 0105252401 01011F2223221F0101", " 0127251001 01012326230101 ", " 0101010101 0101230101 ", " 010101 ", " ", " ", " ", " " }; mhwaveedit-1.4.24/src/button_save.xpm000066400000000000000000000026001334022513400176000ustar00rootroot00000000000000/* XPM */ static char * button_save_xpm[] = { "20 20 58 1", " c None", ". c #000000", "+ c #4252ED", "@ c #C8C8C8", "# c #D2D2D2", "$ c #DEDEDE", "% c #E4E4E4", "& c #6D7DE9", "* c #7180E9", "= c #D5D5D5", "- c #7685E8", "; c #7887E8", "> c #7281E9", ", c #7F8CE7", "' c #4455EC", ") c #4A5BEC", "! c #5060EB", "~ c #5566EB", "{ c #5B6BEA", "] c #6070EA", "^ c #6574EA", "/ c #6978E9", "( c #6B7BE9", "_ c #6C7CE9", ": c #4253EC", "< c #4858EC", "[ c #4D5EEC", "} c #5263EB", "| c #5768EB", "1 c #5C6CEA", "2 c #6373EA", "3 c #6575EA", "4 c #6676EA", "5 c #E6E6E6", "6 c #EAEAEA", "7 c #EEEEEE", "8 c #F2F2F2", "9 c #F6F6F6", "0 c #F9F9F9", "a c #FBFBFB", "b c #5F6FEA", "c c #E7E7E7", "d c #EBEBEB", "e c #EFEFEF", "f c #F3F3F3", "g c #F7F7F7", "h c #FFFFFF", "i c #5A6AEB", "j c #596AEB", "k c #5464EB", "l c #5364EB", "m c #E5E5E5", "n c #E9E9E9", "o c #EDEDED", "p c #F0F0F0", "q c #4758EC", "r c #E2E2E2", "s c #E8E8E8", " ", " ", " .............. ", " .++.@@#$%$.&*.. ", " .++.@@=..%.*-;.. ", " .++.@@#..$.>;,;. ", " .++.@@@#=#.*-;-. ", " .++........&*>*. ", " .+++')!~{]^/(_(. ", " .+++:<[}|1]2343. ", " .++567890a098]b. ", " .++cdefgahagfij. ", " .++567890a098kl. ", " .++mnopf9g9fp[[. ", " .++%cd7p8f8p7qq. ", " .++rmsdo7e7od++. ", " .++++++++++++++. ", " ................ ", " ", " "}; mhwaveedit-1.4.24/src/button_stop.xpm000066400000000000000000000012601334022513400176300ustar00rootroot00000000000000/* XPM */ static char * button_stop_xpm[] = { "20 20 10 1", " c None", ". c #000000", "+ c #9A0F0F", "@ c #A50F0F", "# c #B00F0F", "$ c #BA0E0E", "% c #C50E0E", "& c #CF0E0E", "* c #DA0D0D", "= c #E50D0D", " ", " ", " ", " ", " ............ ", " .++++++++++. ", " .@@@@@@@@@@. ", " .##########. ", " .$$$$$$$$$$. ", " .%%%%%%%%%%. ", " .&&&&&&&&&&. ", " .**********. ", " .==========. ", " .==========. ", " .==========. ", " ............ ", " ", " ", " ", " "}; mhwaveedit-1.4.24/src/button_undo.xpm000066400000000000000000000021621334022513400176120ustar00rootroot00000000000000/* XPM */ static char * button_undo_xpm[] = { "20 20 40 1", " c None", ". c #000000", "+ c #26BA21", "@ c #23BA1E", "# c #1FBA1A", "$ c #1DB917", "% c #32BB2C", "& c #30BB2A", "* c #2DBB28", "= c #2ABB24", "- c #21BA1C", "; c #3ABC35", "> c #39BC34", ", c #37BC32", "' c #34BB2F", ") c #30BB2B", "! c #2CBB27", "~ c #27BA22", "{ c #22BA1D", "] c #42BC3D", "^ c #40BC3B", "/ c #3EBC39", "( c #4ABD45", "_ c #49BD44", ": c #47BD42", "< c #51BE4C", "[ c #58BE53", "} c #59BE54", "| c #5FBF5B", "1 c #61BF5C", "2 c #28BA23", "3 c #66BF62", "4 c #68BF64", "5 c #2ABB25", "6 c #6DC068", "7 c #70C06C", "8 c #2BBB26", "9 c #24BA1F", "0 c #77C073", "a c #1DBA18", " ", " ", " ...... ", " ...+@#$... ", " ..%&*=+-$$.. ", " ..;>,')!~{$$.. ", " .]]^/....~-$$. ", " ..(_:.. ..+#$.. ", " .<<<.. ..@$$. ", " .[}[. .+#$. ", " .|1|. .2-$. ", " ..343.. .5@$. ", "..36763.. .89$. ", " ..707.. .!9a. ", " ..7.. ..... ", " ... ", " ", " ", " ", " "}; mhwaveedit-1.4.24/src/chunk.c000066400000000000000000001505221334022513400160040ustar00rootroot00000000000000/* * Copyright (C) 2002 2003 2004 2005 2006 2007 2008 2009 2011, Magnus Hjorth * Copyright (C) 2012, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include #include #include #include #include #include #include #include #include "gtkfiles.h" #include "um.h" #include "chunk.h" #include "inifile.h" #include "main.h" #include "ringbuf.h" #include "rawdialog.h" #include "tempfile.h" #include "rateconv.h" #include "gettext.h" gboolean chunk_filter_use_floating_tempfiles; static GtkObjectClass *parent_class; static GList *chunks = NULL; guint chunk_alive_count(void) { return g_list_length ( chunks ); } static void chunk_destroy(GtkObject *object) { Chunk *c; GList *l; DataPart *dp; /* printf("chunk_destroy: %p\n",object); */ c=CHUNK(object); g_assert(c->opencount == 0); if (c->parts) { for (l=c->parts; l!=NULL; l=l->next) { dp = (DataPart *)l->data; gtk_object_unref(GTK_OBJECT(dp->ds)); g_free(dp); } g_list_free(c->parts); } c->parts = NULL; parent_class->destroy(object); chunks = g_list_remove ( chunks, object ); } static void chunk_class_init(GtkObjectClass *klass) { parent_class = gtk_type_class(gtk_object_get_type()); klass->destroy = chunk_destroy; } static void chunk_init(Chunk *object) { /* printf("chunk_init: %p\n",object); */ object->format.type = DATAFORMAT_PCM; object->format.samplerate=44100; object->format.samplesize=2; object->format.packing=0; object->format.channels=2; object->format.sign=1; object->format.bigendian = IS_BIGENDIAN; object->format.samplebytes=4; object->length=0; object->size=0; object->parts = 0; chunks = g_list_append( chunks, object ); } GtkType chunk_get_type(void) { static GtkType id=0; if (!id) { GtkTypeInfo info = { "Chunk", sizeof(Chunk), sizeof(ChunkClass), (GtkClassInitFunc) chunk_class_init, (GtkObjectInitFunc) chunk_init }; id=gtk_type_unique(gtk_object_get_type(),&info); } return id; } static Chunk *chunk_new(void) { return gtk_type_new(chunk_get_type()); } Chunk *chunk_new_silent(Dataformat *format, gfloat seconds) { return chunk_new_from_datasource( datasource_new_silent(format, seconds * format->samplerate)); } static void chunk_calc_length(Chunk *c) { GList *l; DataPart *dp; off_t len=0; for(l=c->parts; l!=NULL; l=l->next) { dp = (DataPart *)l->data; len += dp->length; } c->length = len; c->size = len*c->format.samplebytes; } static rateconv *conv; static const gchar *conv_driver; static guint32 conv_outrate; static int conv_dither_mode; static gboolean chunk_convert_samplerate_proc(void *in, guint sample_size, chunk_writeout_func out_func, WriteoutID id, Dataformat *informat, Dataformat *outformat) { guint i=0; gchar *p = (gchar *)in; gint j,k; gchar buf[4096]; if (conv == NULL) conv = rateconv_new(FALSE,conv_driver,informat, conv_outrate,conv_dither_mode,FALSE); if (conv == NULL) return TRUE; if (sample_size == 0) rateconv_write(conv,NULL,0); while (1) { if (sample_size > 0) { /*puts("chunk_convert_samplerate_proc: Calling rateconv_write.."); */ j = rateconv_write(conv,p+i,sample_size-i); /* printf("rateconv_write: tried=%d, got=%d\n",(int)sample_size-i, j); */ if (j == -1) return TRUE; i += j; if (i == sample_size) return FALSE; } /* puts("chunk_convert_samplerate_proc: calling rateconv_read..."); */ k = rateconv_read(conv,buf,sizeof(buf)); /* printf("rateconv_read: tried=%d, got=%d\n",(int)sizeof(buf),k); */ if (k == -1) return TRUE; if (k == 0 && sample_size == 0) return FALSE; if (k>0 && out_func(id,buf,k)) return TRUE; } } Chunk *chunk_convert_samplerate(Chunk *chunk, gint samplerate, const gchar *rateconv_driver, int dither_mode, StatusBar *bar) { Chunk *c; Dataformat fmt; /*puts("chunk_convert_samplerate: calling rateconv_new");*/ conv = NULL; conv_driver = rateconv_driver; conv_outrate = samplerate; conv_dither_mode = dither_mode; memcpy(&fmt,&(chunk->format),sizeof(Dataformat)); fmt.samplerate = samplerate; /* puts("chunk_convert_samplerate: calling chunk_filter"); */ c = chunk_filter_tofmt(chunk,chunk_convert_samplerate_proc, chunk_convert_samplerate_proc, CHUNK_FILTER_MANY, rateconv_prefers_float(rateconv_driver),&fmt, dither_mode, bar, _("Converting samplerate")); /* puts("chunk_convert_samplerate: calling rateconv_destroy"); */ if (conv != NULL) { rateconv_destroy(conv); conv = NULL; } return c; } Chunk *chunk_convert_speed(Chunk *chunk, gfloat speed_factor, int dither_mode, StatusBar *bar) { guint32 target_samplerate; Chunk *c; int i; target_samplerate = (guint32)(((float)chunk->format.samplerate) / speed_factor); conv_outrate = target_samplerate; i = inifile_get_guint32("speedConv",0); if (i >= rateconv_driver_count(FALSE)) i=0; conv_driver = rateconv_driver_id(FALSE,i); conv = NULL; c = chunk_filter_tofmt(chunk,chunk_convert_samplerate_proc, chunk_convert_samplerate_proc,CHUNK_FILTER_MANY, FALSE,&(chunk->format),dither_mode, bar,_("Adjusting speed")); if (conv != NULL) rateconv_destroy(conv); return c; } Chunk *chunk_convert_sampletype(Chunk *chunk, Dataformat *newtype) { GList *l; Datasource *ds; Chunk *r=NULL,*c,*c2; DataPart *dp; Dataformat newformat; g_assert(!dataformat_samples_equal(&(chunk->format),newtype)); memcpy(&newformat,newtype,sizeof(Dataformat)); newformat.samplerate = chunk->format.samplerate; newformat.channels = chunk->format.channels; for (l=chunk->parts; l!=NULL; l=l->next) { dp = (DataPart *)(l->data); ds = datasource_convert(dp->ds,&newformat); g_assert(ds != NULL); c2 = chunk_new_from_datasource(ds); c = chunk_get_part(c2,dp->position,dp->length); gtk_object_sink(GTK_OBJECT(c2)); if (r != NULL) { c2 = r; r = chunk_append(c2,c); gtk_object_sink(GTK_OBJECT(c2)); gtk_object_sink(GTK_OBJECT(c)); } else r = c; } return r; } static Chunk *chunk_ds_remap(Chunk *chunk, int new_channels, int *map) { GList *l; DataPart *dp; Datasource *new_ds; Chunk *new_chunk,*new_chunk_part; Chunk *res = NULL, *c; for (l=chunk->parts; l!=NULL; l=l->next) { dp = (DataPart *)l->data; new_ds = datasource_channel_map(dp->ds,new_channels,map); new_chunk = chunk_new_from_datasource(new_ds); new_chunk_part = chunk_get_part(new_chunk,dp->position,dp->length); gtk_object_sink(GTK_OBJECT(new_chunk)); if (res == NULL) { res = new_chunk_part; } else { c = chunk_append(res,new_chunk_part); gtk_object_sink(GTK_OBJECT(res)); gtk_object_sink(GTK_OBJECT(new_chunk_part)); res = c; } } g_free(map); return res; } Chunk *chunk_remove_channel(Chunk *chunk, gint channel, StatusBar *bar) { int *map,i,new_chans; new_chans = chunk->format.channels - 1; map = g_malloc(new_chans * sizeof(int)); for (i=0; i= channel) map[i]=i+1; else map[i]=i; } return chunk_ds_remap(chunk, new_chans, map); } gboolean chunk_dump(Chunk *chunk, EFILE *file, gboolean bigendian, int dither_mode, StatusBar *bar) { GList *l; DataPart *dp; off_t clipcount = 0; l = chunk->parts; while (l) { dp = (DataPart *)l->data; if (datasource_dump(dp->ds,dp->position,dp->length,file, dither_mode,bar,&clipcount)) return TRUE; l = l->next; } return clipwarn(clipcount,TRUE); } static gboolean has_fake_pcm(Chunk *c) { GList *l; DataPart *part; for (l=c->parts; l!=NULL; l=l->next) { part = (DataPart *)(l->data); if (part->ds->type == DATASOURCE_CONVERT) return TRUE; } return FALSE; } /* Allmn funktion fr stegvis bearbetning av en Chunk. * Funktionen lser steg fr steg av chunken och anropar proc. * Efter allt data skickats in kommer eof_proc (om != NULL) att anropas med * samplesize=0. */ Chunk *chunk_filter(Chunk *chunk, chunk_filter_proc proc, chunk_filter_proc eof_proc, gint amount, gboolean must_convert, int dither_mode, StatusBar *bar, gchar *title) { return chunk_filter_tofmt(chunk,(chunk_filter_tofmt_proc)proc, (chunk_filter_tofmt_proc)eof_proc,amount, must_convert,&(chunk->format),dither_mode, bar,title); } struct convert_back { TempFile tmp; Dataformat *tofmt; gchar buf[16384]; int dither_mode; off_t *clipcount; }; static gboolean convert_back_write(WriteoutID id, gpointer data, guint length) { struct convert_back *cbp = (struct convert_back *)id; guint i; i = length / sizeof(sample_t); convert_array(data,&dataformat_sample_t,cbp->buf,cbp->tofmt,i, cbp->dither_mode, cbp->clipcount); return tempfile_write(cbp->tmp,cbp->buf,i*cbp->tofmt->samplesize); } Chunk *chunk_filter_tofmt(Chunk *chunk, chunk_filter_tofmt_proc proc, chunk_filter_tofmt_proc eof_proc, gint amount, gboolean must_convert, Dataformat *tofmt, int dither_mode, StatusBar *bar, gchar *title) { /* This code has to keep track of five different sample formats: * 1) The Chunk's native format (chunk->format) * 2) The processing function's input format (informat) * 3) The processing function's output format (outformat) * 4) The output temporary file's format (outformat or tofmt) * 5) The output Chunk's native format (tofmt) * * These modes are possible: * * 1) Native format all the way * if must_convert == FALSE and no FP data in chunk * convert = FALSE, convert_back = FALSE, * formats (1)=(2)=(3), (4)=(5) * * 2) FP processing with FP tempfiles * if must_convert == TRUE || FP data in chunk * convert = TRUE, convert_back = FALSE * formats (2)=(3)=floating point version of (1) * format (4)=floating point version of (5) * * 3) FP processing with native tempfiles * (this mode is only used if the "use FP tempfiles option" is * disabled, could cause quality loss) * if (must_convert == TRUE || FP data in chunk) && * !chunk_filter_use_floating_tempfiles, * convert = TRUE, convert_back = TRUE * formats (2)=(3)=floating point version of (1), (4)=(5) */ guint proc_size,single_size,full_size; gchar buf[8192]; off_t samplepos=0, samplesleft=chunk->length; guint u, x; gboolean convert, convert_back; Dataformat informat,outformat; ChunkHandle *ch; TempFile tmp; Chunk *ds,*r; struct convert_back *cbp = NULL; off_t clipcount = 0; /* Force processing in floating-point if any of the Datasources has * faked pcm data */ convert = must_convert || has_fake_pcm(chunk); convert_back = convert && !chunk_filter_use_floating_tempfiles; if (convert) { memcpy(&informat,&dataformat_sample_t,sizeof(Dataformat)); memcpy(&outformat,&dataformat_sample_t,sizeof(Dataformat)); informat.channels = chunk->format.channels; outformat.channels = tofmt->channels; informat.samplebytes = informat.samplesize * informat.channels; outformat.samplebytes = outformat.samplesize * outformat.channels; informat.samplerate = chunk->format.samplerate; outformat.samplerate = tofmt->samplerate; } else { memcpy(&informat,&(chunk->format),sizeof(Dataformat)); memcpy(&outformat,tofmt,sizeof(Dataformat)); } single_size = informat.samplesize; full_size = informat.samplebytes; if (amount == CHUNK_FILTER_FULL) proc_size = full_size; else if (amount == CHUNK_FILTER_ONE) proc_size = single_size; else proc_size = 0; /* Set this later for CHUNK_FILTER_MANY */ ch = chunk_open(chunk); if (ch == NULL) return NULL; tmp = tempfile_init(convert_back ? tofmt : &outformat,FALSE); if (convert_back) { cbp = g_malloc(sizeof(*cbp)); cbp->tmp = tmp; cbp->tofmt = tofmt; cbp->dither_mode = dither_mode; cbp->clipcount = &clipcount; } status_bar_begin_progress(bar,samplesleft,title); while (samplesleft > 0) { if (convert) u = chunk_read_array_fp(ch,samplepos, MIN(sizeof(buf)/full_size,samplesleft), (sample_t *)buf,dither_mode, &clipcount) * full_size; else u = chunk_read_array(ch,samplepos, MIN(sizeof(buf),samplesleft*full_size),buf, dither_mode,&clipcount); if (!u) { chunk_close(ch); tempfile_abort(tmp); if (cbp != NULL) g_free(cbp); status_bar_end_progress(bar); return NULL; } if (amount == CHUNK_FILTER_MANY) proc_size = u; for (x=0; xformat),tofmt)) { r = chunk_convert_sampletype(ds,tofmt); gtk_object_sink(GTK_OBJECT(ds)); return r; } else return ds; } /* Allmn funktion fr stegvis avlsning av en Chunk. proc kommer att anropas * en gng fr varje sampling i chunken */ gboolean chunk_parse(Chunk *chunk, chunk_parse_proc proc, gboolean allchannels, gboolean convert, int dither_mode, StatusBar *bar, gchar *title, off_t samplepos, gboolean reverse) { guint single_size,full_size,proc_size; gchar buf[4096],*c=NULL,*d; off_t samplesleft; off_t readpos; off_t readsamples; guint u; gint x; ChunkHandle *ch; off_t clipcount = 0; if(reverse) { samplesleft = samplepos; } else { samplesleft = chunk->length - samplepos; } if (convert) single_size = sizeof(sample_t); else single_size = chunk->format.samplesize; full_size = single_size * chunk->format.channels; if (allchannels) proc_size = full_size; else proc_size = single_size; readsamples = sizeof(buf) / full_size; if(samplesleft < readsamples) { readsamples = samplesleft; } ch = chunk_open(chunk); if (ch == NULL) { g_free(c); return TRUE; } status_bar_begin_progress( bar, chunk->length, title); while (samplesleft > 0) { if(reverse) { readpos = samplepos - readsamples; } else { readpos = samplepos; } if (convert) { u = chunk_read_array_fp(ch,readpos, readsamples, (sample_t *)buf,dither_mode,&clipcount); u = u * full_size; } else { u = chunk_read_array(ch,readpos,readsamples * full_size, buf,dither_mode,&clipcount); } g_assert((u / full_size) == readsamples); if (!u) { chunk_close(ch); g_free(c); status_bar_end_progress(bar); return TRUE; } d = buf; if(reverse) { x = u - proc_size; } else { x = 0; } while((x >= 0) && (x < u)) { if (proc(d+x,proc_size,chunk)) { chunk_close(ch); g_free(c); status_bar_end_progress(bar); return TRUE; } if(reverse) { x -= proc_size; } else { x += proc_size; } } samplesleft -= readsamples; if(reverse) { samplepos -= readsamples; if(samplepos < 0) { readsamples = readsamples + samplepos; samplepos = 0; } } else { samplepos += readsamples; } if(samplesleft < readsamples) { readsamples = samplesleft; } if (status_bar_progress(bar, u / full_size)) { chunk_close(ch); g_free(c); status_bar_end_progress(bar); return TRUE; } } chunk_close(ch); g_free(c); status_bar_end_progress(bar); clipwarn(clipcount,FALSE); return FALSE; } Chunk *chunk_onechannel(Chunk *chunk, int dither_mode, StatusBar *bar) { gboolean *map; int i; Chunk *r; map = g_malloc(chunk->format.channels * 1 * sizeof(gboolean)); for (i=0; iformat.channels; i++) map[i] = TRUE; r = chunk_remap_channels(chunk,1,map,dither_mode,bar); g_free(map); return r; } Chunk *chunk_copy_channel(Chunk *chunk, gint channel, int dither_mode, StatusBar *bar) { int i,new_chans; int *map; new_chans = chunk->format.channels + 1; map = g_malloc(new_chans * sizeof(int)); for (i=0; iformat)); /* Number of channels */ chn = c1->format.channels; /* Number of multi-channel samples to mix */ mixlen = MIN(c1->length, c2->length); memcpy(&format,&(c1->format),sizeof(Dataformat)); format.type = DATAFORMAT_FLOAT; format.samplesize = sizeof(sample_t); format.bigendian = dataformat_sample_t.bigendian; format.samplebytes = format.samplesize * format.channels; /* Prepare for processing */ ch1 = chunk_open(c1); if ( ch1 == NULL ) return NULL; ch2 = chunk_open(c2); if ( ch2 == NULL ) { chunk_close(ch1); return NULL; } tmp = tempfile_init(&format,FALSE); status_bar_begin_progress(bar, mixlen, _("Mixing")); for (u=0; u pmax) { clipcount ++; s = pmax; } else if (s < -1.0) { clipcount ++; s = -1.0; } buf3[i] = s; } /* Write buf3 directly */ if (tempfile_write(tmp,buf3,x*chn*sizeof(sample_t)) || status_bar_progress(bar,x)) { tempfile_abort(tmp); chunk_close(ch1); chunk_close(ch2); status_bar_end_progress(bar); return NULL; } } /* Finish processing */ chunk_close(ch1); chunk_close(ch2); m = tempfile_finished(tmp); status_bar_end_progress(bar); if (!m) return NULL; /* Fake the original pcm format */ if (!dataformat_equal(&(c1->format),&(m->format))) { c = chunk_convert_sampletype(m,&(c1->format)); g_assert(c != NULL); gtk_object_sink(GTK_OBJECT(m)); m = c; } /* Warn if clipping occured */ if (clipcount > 0) { if (clipcount > 1000000000) clipcount = 1000000000; str = g_strdup_printf(_("The mixed result was clipped %d times."), (int)clipcount); user_warning(str); g_free(str); } /* We may need to append some unmixed data at the end */ if (c1->length == c2->length) return m; if (c1->length > mixlen) c = chunk_get_part(c1,mixlen,c1->length-mixlen); else c = chunk_get_part(c2,mixlen,c2->length-mixlen); d = chunk_append(m,c); gtk_object_sink(GTK_OBJECT(m)); gtk_object_sink(GTK_OBJECT(c)); return d; #undef BUFLEN } static void sandwich_copy(char *dest_buf, int dest_offset, int dest_item_size, char *source_buf, int source_item_size, int items) { int i; for (i=0; iformat),&(c2->format)) && c1->format.samplerate == c2->format.samplerate); /* Number of channels */ chn1 = c1->format.channels; chn2 = c2->format.channels; /* Number of multi-channel samples to mix */ g_assert(c1->length == c2->length); mixlen = c1->length; memcpy(&format,&(c1->format),sizeof(Dataformat)); format.channels = chn1+chn2; format.samplebytes = format.samplesize * format.channels; /* Prepare for processing */ ch1 = chunk_open(c1); if ( ch1 == NULL ) return NULL; ch2 = chunk_open(c2); if ( ch2 == NULL ) { chunk_close(ch1); return NULL; } tmp = tempfile_init(&format,FALSE); status_bar_begin_progress(bar, mixlen, _("Combining channels")); buf1 = g_malloc(BUFLEN*c1->format.samplebytes); buf2 = g_malloc(BUFLEN*c2->format.samplebytes); outbuf = g_malloc(BUFLEN*format.samplebytes); for (u=0; u (mixlen-u)) x = ((guint)(mixlen-u)); x1 = chunk_read_array(ch1,u,x*c1->format.samplebytes,buf1, dither_mode,&clipcount); x2 = chunk_read_array(ch2,u,x*c2->format.samplebytes, buf2,dither_mode,&clipcount); if (x1 == 0 || x2 == 0) { tempfile_abort(tmp); chunk_close(ch1); chunk_close(ch2); status_bar_end_progress(bar); g_free(buf1); g_free(buf2); g_free(outbuf); return NULL; } g_assert(x1 == x*c1->format.samplebytes && x2 == x*c2->format.samplebytes); /* Combine the data from buf1,buf2 into outbuf */ sandwich_copy(outbuf,0,format.samplebytes, buf1,c1->format.samplebytes, x); sandwich_copy(outbuf,c1->format.samplebytes,format.samplebytes, buf2,c2->format.samplebytes, x); /* Write outbuf */ if (tempfile_write(tmp,outbuf,x*format.samplebytes) || status_bar_progress(bar,x)) { tempfile_abort(tmp); chunk_close(ch1); chunk_close(ch2); status_bar_end_progress(bar); g_free(buf1); g_free(buf2); g_free(outbuf); return NULL; } } /* Finish processing */ chunk_close(ch1); chunk_close(ch2); m = tempfile_finished(tmp); status_bar_end_progress(bar); g_free(buf1); g_free(buf2); g_free(outbuf); if (!m) return NULL; /* Warn if clipping occured */ clipwarn(clipcount,FALSE); return m; #undef BUFLEN } Chunk *chunk_sandwich(Chunk *c1, Chunk *c2, off_t c1_align_point, off_t c2_align_point, off_t *align_point_out, int dither_mode, StatusBar *bar) { Chunk *before, *mainpart_c1, *mainpart_c2, *mainpart_sw, *after; Chunk *c,*d,*c1_remap,*c2_remap; int *map1,*map2,outchans,i; int mp_c1_maxlen,mp_c2_maxlen,mp_c1_offset,mp_c2_offset,mp_len; off_t offset; offset = c2_align_point-c1_align_point; outchans = c1->format.channels + c2->format.channels; map1 = g_malloc(outchans * sizeof(map1[0])); map2 = g_malloc(outchans * sizeof(map2[0])); for (i=0; iformat.channels; i++) { map1[i]=i; map2[i]=-1; } for (; iformat.channels); } c1_remap = chunk_ds_remap(c1,outchans,map1); c2_remap = chunk_ds_remap(c2,outchans,map2); /* g_free(map1); g_free(map2); Done already by chunk_ds_remap */ if (offset == 0) { before = NULL; mp_c1_maxlen = c1->length; mp_c1_offset = 0; mp_c2_maxlen = c2->length; mp_c2_offset = 0; *align_point_out = c1_align_point; } else if (offset > 0) { before = chunk_get_part(c2_remap, 0, offset); mp_c1_maxlen = c1->length; mp_c1_offset = 0; mp_c2_maxlen = c2->length - offset; mp_c2_offset = offset; *align_point_out = c2_align_point; } else { before = chunk_get_part(c1_remap, 0, -offset); mp_c1_maxlen = c1->length+offset; mp_c1_offset = -offset; mp_c2_maxlen = c2->length; mp_c2_offset = 0; *align_point_out = c1_align_point; } mp_len = MIN(mp_c1_maxlen, mp_c2_maxlen); if (mp_len > 0) { mainpart_c1 = chunk_get_part(c1, mp_c1_offset, mp_len); mainpart_c2 = chunk_get_part(c2, mp_c2_offset, mp_len); } else mainpart_c1 = mainpart_c2 = NULL; if (mp_len < mp_c1_maxlen) { after = chunk_get_part(c1_remap, mp_c1_offset+mp_len, mp_c1_maxlen-mp_len); } else if (mp_len < mp_c2_maxlen) { after = chunk_get_part(c2_remap, mp_c2_offset+mp_len, mp_c2_maxlen-mp_len); } else { after = NULL; } /* Floating refs: c1_remap,c2_remap,before,after,mainpart_c1,mainpart_c2 */ gtk_object_sink(GTK_OBJECT(c1_remap)); gtk_object_sink(GTK_OBJECT(c2_remap)); if (mp_len > 0) { mainpart_sw = chunk_sandwich_main(mainpart_c1, mainpart_c2, dither_mode, bar); gtk_object_sink(GTK_OBJECT(mainpart_c1)); gtk_object_sink(GTK_OBJECT(mainpart_c2)); if (mainpart_sw == NULL) { if (before != NULL) gtk_object_sink(GTK_OBJECT(before)); if (after != NULL) gtk_object_sink(GTK_OBJECT(after)); return NULL; } } else mainpart_sw = NULL; /* Floating refs: before,after,mainpart_sw */ c = before; if (mainpart_sw != NULL) { if (c != NULL) { d = chunk_append(c,mainpart_sw); gtk_object_sink(GTK_OBJECT(c)); gtk_object_sink(GTK_OBJECT(mainpart_sw)); c = d; } else c = mainpart_sw; } if (after != NULL) { if (c != NULL) { d = chunk_append(c,after); gtk_object_sink(GTK_OBJECT(c)); gtk_object_sink(GTK_OBJECT(after)); c = d; } else c = after; } return c; } static struct { sample_t *buf; int bufsize; /* (outchannels x (inchannels+1))-matrix */ /* Each row has a list of input channel numbers, ending with -1 */ int *map; } chunk_remap_channels_data; static gboolean chunk_remap_channels_mixmode_proc(void *in, guint sample_size, chunk_writeout_func out_func, WriteoutID id, Dataformat *informat, Dataformat *outformat) { int samps,i,j,k,l; sample_t *iptr, *optr, s; samps = sample_size / informat->samplebytes; /* Make sure we have room in the buffer */ if (samps * outformat->samplebytes > chunk_remap_channels_data.bufsize) { g_free(chunk_remap_channels_data.buf); chunk_remap_channels_data.buf = g_malloc(samps*outformat->samplebytes); chunk_remap_channels_data.bufsize = samps*outformat->samplebytes; } /* Process data */ iptr = (sample_t *)in; optr = chunk_remap_channels_data.buf; for (i=0; ichannels; j++) { s = 0.0; for (k=(j*(informat->channels+1)); 1; k++) { l = chunk_remap_channels_data.map[k]; if (l < 0) break; s += iptr[l]; } optr[j] = s; } iptr += informat->channels; optr += outformat->channels; } return out_func(id, chunk_remap_channels_data.buf, samps*outformat->samplebytes); } Chunk *chunk_remap_channels(Chunk *chunk, int channels_out, gboolean *map, int dither_mode, StatusBar *bar) { gboolean mixmode; int i,j,k; int channels_in = chunk->format.channels; Dataformat tofmt; Chunk *r; int *bigmap,*smallmap; memcpy(&tofmt,&(chunk->format),sizeof(Dataformat)); tofmt.channels = channels_out; tofmt.samplebytes = tofmt.channels * tofmt.samplesize; chunk_remap_channels_data.buf = NULL; chunk_remap_channels_data.bufsize = 0; /* Generate the maps */ mixmode = FALSE; bigmap = g_malloc((channels_in+1)*channels_out*sizeof(int)); smallmap = g_malloc(channels_out*sizeof(int)); for (i=0; i 1) mixmode = TRUE; } if (mixmode) { chunk_remap_channels_data.map = bigmap; g_free(smallmap); r = chunk_filter_tofmt(chunk,chunk_remap_channels_mixmode_proc, NULL,CHUNK_FILTER_MANY,TRUE,&tofmt, dither_mode,bar,_("Mixing channels")); g_free(chunk_remap_channels_data.buf); g_free(chunk_remap_channels_data.map); } else { g_free(bigmap); r = chunk_ds_remap(chunk,channels_out,smallmap); } return r; } void chunk_foreach(GFunc func, gpointer user_data) { g_list_foreach(chunks,func,user_data); } Chunk *chunk_new_from_datasource(Datasource *ds) { Chunk *c; DataPart *dp; if (ds==NULL) return NULL; dp = g_malloc(sizeof(*dp)); dp->ds = ds; dp->position = 0; dp->length = ds->length; gtk_object_ref(GTK_OBJECT(ds)); gtk_object_sink(GTK_OBJECT(ds)); c = chunk_new(); memcpy(&(c->format),&(ds->format),sizeof(Dataformat)); c->length = ds->length; c->size = c->length * c->format.samplebytes; c->parts = g_list_append(NULL,dp); /* printf("chunk_new_from_datasource(%p) -> %p\n",ds,c); */ return c; } ChunkHandle *chunk_open(Chunk *chunk) { GList *l; DataPart *dp; for (l=chunk->parts;l!=NULL;l=l->next) { dp = (DataPart *)l->data; if (datasource_open(dp->ds)) { for (l=l->prev;l!=NULL;l=l->prev) { dp = (DataPart *)l->data; datasource_close(dp->ds); } return NULL; } } chunk->opencount ++; return chunk; } void chunk_close(ChunkHandle *handle) { GList *l; DataPart *dp; g_assert(handle->opencount > 0); for (l=handle->parts;l!=NULL;l=l->next) { dp = (DataPart *)l->data; datasource_close(dp->ds); } handle->opencount --; } gboolean chunk_read(ChunkHandle *handle, off_t sampleno, void *buffer, int dither_mode) { GList *l; DataPart *dp; for (l=handle->parts;l!=NULL;l=l->next) { dp = (DataPart *)l->data; if (dp->length > sampleno) return datasource_read(dp->ds,sampleno,buffer,dither_mode); else sampleno -= dp->length; } g_assert_not_reached(); return TRUE; } gboolean chunk_read_fp(ChunkHandle *handle, off_t sampleno, sample_t *buffer, int dither_mode) { GList *l; DataPart *dp; for (l=handle->parts;l!=NULL;l=l->next) { dp = (DataPart *)l->data; if (dp->length > sampleno) return datasource_read_fp(dp->ds,dp->position+sampleno,buffer, dither_mode); else sampleno -= dp->length; } g_assert_not_reached(); return TRUE; } guint chunk_read_array(ChunkHandle *handle, off_t sampleno, guint size, void *buffer, int dither_mode, off_t *clipcount) { GList *l; DataPart *dp; guint r=0,i,j; guint sb = handle->format.samplebytes; off_t o; /* Loop until we have collected enough data or reached EOF * The condition size >= sb handles the case size is not an even * multiple of the number of sample bytes (24-bit data usually) */ for (l=handle->parts; l!=NULL && size>=sb; l=l->next) { dp = (DataPart *)l->data; if (dp->length > sampleno) { /* Calculate required size if it's larger than we need. */ o = dp->length - sampleno; o *= (off_t)sb; if (o < (off_t)size) j = (guint)o; else j = size; /* Read data. */ i = datasource_read_array(dp->ds, dp->position + sampleno, j,buffer,dither_mode,clipcount); if (i == 0) return 0; r+=i; sampleno = 0; size -= i; buffer = ((gchar *)buffer) + i; } else sampleno -= dp->length; } return r; } guint chunk_read_array_fp(ChunkHandle *handle, off_t sampleno, guint samples, sample_t *buffer, int dither_mode, off_t *clipcount) { GList *l; DataPart *dp; guint r=0,i,j; off_t o; g_assert(sampleno < handle->length); for (l=handle->parts;l!=NULL;l=l->next) { dp = (DataPart *)l->data; if (dp->length > sampleno) { o = dp->length-sampleno; if (o < (off_t)samples) j = (guint)o; else j = samples; i = datasource_read_array_fp(dp->ds, dp->position+sampleno, j,buffer,dither_mode,clipcount); g_assert(i <= samples); g_assert(i <= dp->length - sampleno); if (i==0) return 0; r += i; buffer += i*handle->format.channels; samples -= i; sampleno = 0; if (samples == 0 || l->next==NULL) return r; } else sampleno -= dp->length; } return r; } static DataPart *datapart_list_copy(GList *src, GList **dest) { DataPart *old,*new; old = src->data; new = g_malloc(sizeof(DataPart)); new->ds = old->ds; new->position = old->position; new->length = old->length; gtk_object_ref(GTK_OBJECT(old->ds)); (*dest) = g_list_append((*dest),new); return new; } Chunk *chunk_append(Chunk *first, Chunk *second) { Chunk *c; GList *nl=NULL,*l; off_t len=0; DataPart *dp; g_assert(chunk_format_equal(first,second)); for (l=first->parts; l!=NULL; l=l->next) { dp = datapart_list_copy(l,&nl); len += dp->length; } for (l=second->parts; l!=NULL; l=l->next) { dp = datapart_list_copy(l,&nl); len += dp->length; } c = chunk_new(); memcpy(&(c->format),&(first->format),sizeof(Dataformat)); c->parts = nl; c->length = len; c->size = len * c->format.samplebytes; return c; } Chunk *chunk_insert(Chunk *chunk, Chunk *part, off_t sampleno) { GList *nl=NULL,*l,*m; DataPart *dp; Chunk *c; g_assert(sampleno <= chunk->length); g_assert(chunk_format_equal(chunk,part)); if (sampleno == chunk->length) return chunk_append(chunk,part); /* Get beginning */ for (l=chunk->parts; sampleno>0; l=l->next) { dp = datapart_list_copy(l,&nl); if (sampleno < dp->length) { dp->length = sampleno; break; } sampleno -= dp->length; } /* Add the inserted part */ for (m=part->parts; m!=NULL; m=m->next) datapart_list_copy(m,&nl); /* Add the rest */ for (; l!=NULL; l=l->next) { dp = datapart_list_copy(l,&nl); dp->position += sampleno; dp->length -= sampleno; sampleno = 0; } /* Create the chunk */ c = chunk_new(); memcpy(&(c->format),&(chunk->format),sizeof(Dataformat)); c->parts = nl; c->length = chunk->length + part->length; c->size = chunk->size + part->size; return c; } Chunk *chunk_get_part(Chunk *chunk, off_t start, off_t length) { GList *l,*nl=NULL; DataPart *dp; Chunk *c; l=chunk->parts; /* Skip beginning parts */ while (1) { dp = (DataPart *)l->data; if (start < dp->length) break; start -= dp->length; l=l->next; } while (length>0 && l!=NULL) { dp = datapart_list_copy(l,&nl); dp->position += start; dp->length -= start; start = 0; if (dp->length > length) dp->length=length; length -= dp->length; l=l->next; } c = chunk_new(); memcpy(&(c->format),&(chunk->format),sizeof(Dataformat)); c->parts = nl; chunk_calc_length(c); return c; } Chunk *chunk_remove_part(Chunk *chunk, off_t start, off_t length) { GList *nl=NULL,*l; DataPart *dp; Chunk *c; /* Copy beginning parts */ l=chunk->parts; while (start>0) { dp = datapart_list_copy(l,&nl); if (start < dp->length) { dp->length = start; break; } start -= dp->length; l=l->next; } /* Skip parts */ length += start; while (length>0 && l!=NULL) { dp = (DataPart *)l->data; if (dp->length > length) break; length -= dp->length; l=l->next; } /* Copy remaining parts */ for (;l!=NULL;l=l->next) { dp = datapart_list_copy(l,&nl); dp->position += length; dp->length -= length; length = 0; } c = chunk_new(); memcpy(&(c->format),&(chunk->format),sizeof(Dataformat)); c->parts = nl; chunk_calc_length(c); return c; } Chunk *chunk_replace_part(Chunk *chunk, off_t start, off_t length, Chunk *new) { Chunk *c; GList *nl=NULL,*l; DataPart *dp; guint i; g_assert(dataformat_equal(&(chunk->format),&(new->format))); for (l=new->parts; l!=NULL; l=l->next) datapart_list_copy(l,&nl); c = chunk_remove_part(chunk,start,length); for (l=c->parts,i=0; start>0; l=l->next,i++) { dp = (DataPart *)l->data; g_assert(dp->length <= start); start -= dp->length; } for (l=nl; l!=NULL; l=l->next,i++) c->parts = g_list_insert(c->parts, l->data, i); g_list_free(nl); c->length += new->length; c->size = c->length * c->format.samplebytes; return c; } Chunk *chunk_clone_df(Chunk *chunk, Dataformat *format) { Chunk *c; GList *l,*nl=NULL; DataPart *dp,*ndp; for (l=chunk->parts; l!=NULL; l=l->next) { dp = (DataPart *)l->data; ndp = g_malloc(sizeof(*ndp)); ndp->ds = dp->ds; if (!dataformat_equal(format,&(chunk->format))) ndp->ds = datasource_clone_df(ndp->ds, format); gtk_object_ref(GTK_OBJECT(ndp->ds)); gtk_object_sink(GTK_OBJECT(ndp->ds)); ndp->position = dp->position; ndp->length = (dp->length * dp->ds->format.samplebytes) / ndp->ds->format.samplebytes; nl = g_list_append(nl,ndp); } c = chunk_new(); memcpy(&(c->format),format,sizeof(Dataformat)); c->parts = nl; chunk_calc_length(c); return c; } static sample_t chunk_peak_level_max; static gboolean chunk_peak_level_proc(void *sample, gint sample_size, Chunk *chunk) { sample_t s; s = (sample_t)fabs((double)(*((sample_t *)sample))); if (s > chunk_peak_level_max) { chunk_peak_level_max = s; if (s == 1.0 && chunk->format.type == DATAFORMAT_PCM) return TRUE; } return FALSE; } sample_t chunk_peak_level(Chunk *c, StatusBar *bar) { chunk_peak_level_max = 0.0; if (chunk_parse(c,chunk_peak_level_proc,FALSE,TRUE,DITHER_NONE,bar, _("Calculating peak level"),0,FALSE)) return -1.0; return chunk_peak_level_max; } /* BEGIN zero-crossing search added by Forest Bond */ static off_t chunk_zero_crossing_seen_samples; static sample_t *chunk_zero_crossing_saved_sample = NULL; static gboolean chunk_signal_crossed_zero(sample_t prev, sample_t current) { if((current >= 0.0) && (prev <= 0.0)) { return TRUE; } else if((current <= 0.0) && (prev >= 0.0)) { return TRUE; } return FALSE; } static void chunk_zero_crossing_init(gint sample_size) { if(chunk_zero_crossing_saved_sample != NULL) { g_free(chunk_zero_crossing_saved_sample); chunk_zero_crossing_saved_sample = NULL; } chunk_zero_crossing_saved_sample = g_malloc(sample_size); } static void chunk_zero_crossing_cleanup() { if(chunk_zero_crossing_saved_sample != NULL) { g_free(chunk_zero_crossing_saved_sample); chunk_zero_crossing_saved_sample = NULL; } } static void chunk_zero_crossing_save_sample(sample_t *sample, gint sample_size) { memcpy(chunk_zero_crossing_saved_sample, sample, sample_size); } static gboolean chunk_zero_crossing_any_proc(void *sample, gint sample_size, Chunk *chunk) { sample_t *start = (sample_t *)sample; sample_t *end = start + (sample_size/sizeof(sample_t)); sample_t *current = start; sample_t *prev = chunk_zero_crossing_saved_sample; if(chunk_zero_crossing_seen_samples < 1) { chunk_zero_crossing_init(sample_size); chunk_zero_crossing_save_sample(start, sample_size); chunk_zero_crossing_seen_samples++; return FALSE; } while(current < end) { if(chunk_signal_crossed_zero(*prev, *current)) { return TRUE; } current++; prev++; } chunk_zero_crossing_save_sample(start, sample_size); chunk_zero_crossing_seen_samples++; return FALSE; } off_t chunk_zero_crossing_any_forward(Chunk *c, StatusBar *bar,off_t samplepos) { chunk_zero_crossing_seen_samples = 0; chunk_parse(c,chunk_zero_crossing_any_proc,TRUE,TRUE,DITHER_NONE,bar, _("Finding zero-crossing"), samplepos, FALSE); chunk_zero_crossing_cleanup(); return samplepos + chunk_zero_crossing_seen_samples; } off_t chunk_zero_crossing_any_reverse(Chunk *c, StatusBar *bar,off_t samplepos) { chunk_zero_crossing_seen_samples = 0; chunk_parse(c,chunk_zero_crossing_any_proc,TRUE,TRUE,DITHER_NONE,bar, _("Finding zero-crossing"), samplepos, TRUE); chunk_zero_crossing_cleanup(); return samplepos - chunk_zero_crossing_seen_samples; } static gboolean chunk_zero_crossing_all_proc(void *sample, gint sample_size, Chunk *chunk) { sample_t *start = (sample_t *)sample; sample_t *end = start + (sample_size/sizeof(sample_t)); sample_t *current = start; sample_t *prev = chunk_zero_crossing_saved_sample; if(chunk_zero_crossing_seen_samples < 1) { chunk_zero_crossing_init(sample_size); chunk_zero_crossing_save_sample(start, sample_size); chunk_zero_crossing_seen_samples++; return FALSE; } while(current < end) { if(! chunk_signal_crossed_zero(*prev, *current)) { chunk_zero_crossing_save_sample(start, sample_size); chunk_zero_crossing_seen_samples++; return FALSE; } current++; prev++; } return TRUE; } off_t chunk_zero_crossing_all_forward(Chunk *c, StatusBar *bar,off_t samplepos) { chunk_zero_crossing_seen_samples = 0; chunk_parse(c,chunk_zero_crossing_all_proc,TRUE,TRUE,DITHER_NONE,bar, _("Finding zero-crossing"), samplepos, FALSE); chunk_zero_crossing_cleanup(); return samplepos + chunk_zero_crossing_seen_samples; } off_t chunk_zero_crossing_all_reverse(Chunk *c, StatusBar *bar,off_t samplepos) { chunk_zero_crossing_seen_samples = 0; chunk_parse(c,chunk_zero_crossing_all_proc,TRUE,TRUE,DITHER_NONE,bar, _("Finding zero-crossing"), samplepos, TRUE); chunk_zero_crossing_cleanup(); return samplepos - chunk_zero_crossing_seen_samples; } /* END zero-crossing search */ static sample_t chunk_amplify_factor; static gboolean chunk_amplify_proc(void *in, guint sample_size, chunk_writeout_func out_func, WriteoutID id, Dataformat *format) { sample_t *sp,*ep; sp = ((sample_t *)in); ep = (sample_t *)(((gchar *)in)+sample_size); for (; spchannels*sizeof(sample_t)) { factor = ramp_start + (ramp_diff * ((sample_t)samples_done / (sample_t)samples_total)); for (i=0; ichannels; i++) { *sp *= factor; sp++; } samples_done ++; } return out_func(id,in,sample_size); } Chunk *chunk_volume_ramp(Chunk *c, sample_t start_factor, sample_t end_factor, int dither_mode, StatusBar *bar) { if (start_factor == end_factor) return chunk_amplify(c,start_factor,dither_mode,bar); ramp_start = start_factor; ramp_diff = end_factor - start_factor; samples_done = 0; samples_total = c->length; return chunk_filter(c,volume_ramp_proc,NULL,CHUNK_FILTER_MANY,TRUE, dither_mode, bar, _("Amplifying")); } Chunk *chunk_new_with_ramp(Dataformat *format, off_t length, sample_t *startvals, sample_t *endvals, int dither_mode, StatusBar *bar) { #define BUF_LENGTH 512 int i,k; sample_t diffval[8], *sbuf; sample_t slength = (sample_t)length; TempFile tf; off_t ctr = 0; int channels = format->channels; int bufctr; Dataformat fmt; Chunk *r,*q; g_assert(channels <= 8); for (i=0; isamplerate; fmt.samplebytes = fmt.channels * fmt.samplesize; tf = tempfile_init(&fmt,FALSE); if (tf == NULL) return NULL; status_bar_begin_progress(bar,length,NULL); sbuf = g_malloc(BUF_LENGTH*sizeof(sample_t)); /* Output data */ while (ctr < length) { bufctr = BUF_LENGTH / channels; if ((length-ctr) < (off_t)bufctr) bufctr = (guint)(length-ctr); for (i=0; iformat),format)) { q = chunk_convert_sampletype(r,format); gtk_object_sink(GTK_OBJECT(r)); return q; } else return r; #undef BUF_LENGTH } Chunk *chunk_interpolate_endpoints(Chunk *chunk, gboolean falldown_mode, int dither_mode, StatusBar *bar) { int i; Chunk *start,*mid,*end,*c,*d; ChunkHandle *ch; sample_t startval[8],endval[8],zeroval[8]; off_t length = chunk->length; /* get the endpoint values */ ch = chunk_open(chunk); if (ch == NULL) return NULL; if (chunk_read_fp(ch,0,startval,dither_mode) || chunk_read_fp(ch,length-1,endval,dither_mode)) { chunk_close(ch); return NULL; } chunk_close(ch); memset(zeroval,0,sizeof(zeroval)); /* Length of 0.1 s in samples */ i = chunk->format.samplerate / 10; if (i < 1) i=1; if (!falldown_mode || chunk->length <= 2*i) { return chunk_new_with_ramp(&(chunk->format),chunk->length,startval, endval,dither_mode,bar); } else { start = chunk_new_with_ramp(&(chunk->format),i,startval,zeroval, dither_mode,bar); if (start == NULL) return NULL; end = chunk_new_with_ramp(&(chunk->format),i,zeroval,endval, dither_mode,bar); if (end == NULL) { gtk_object_sink(GTK_OBJECT(start)); return NULL; } mid = chunk_new_empty(&(chunk->format),chunk->length-2*i); g_assert(mid != NULL); c = chunk_append(start,mid); d = chunk_append(c,end); gtk_object_sink(GTK_OBJECT(start)); gtk_object_sink(GTK_OBJECT(mid)); gtk_object_sink(GTK_OBJECT(end)); gtk_object_sink(GTK_OBJECT(c)); return d; } } Chunk *chunk_byteswap(Chunk *chunk) { Chunk *c,*d; Dataformat fmt; memcpy(&fmt,&(chunk->format),sizeof(Dataformat)); fmt.bigendian = !fmt.bigendian; c = chunk_clone_df(chunk,&fmt); d = chunk_convert(c,&(chunk->format),DITHER_UNSPEC,NULL); gtk_object_sink(GTK_OBJECT(c)); return d; } Chunk *chunk_convert_channels(Chunk *chunk, guint new_channels) { int *map; int i; g_assert(chunk->format.channels != new_channels); map = g_malloc(new_channels * sizeof(int)); for (i=0; iformat.channels==1 && new_channels > 1) map[1] = 0; return chunk_ds_remap(chunk,new_channels,map); } Chunk *chunk_convert(Chunk *chunk, Dataformat *new_format, int dither_mode, StatusBar *bar) { Chunk *c=NULL,*d; const gchar *conv_driver; if (new_format->samplerate != chunk->format.samplerate) { conv_driver = inifile_get("RateconvDefault",NULL); if (conv_driver == NULL || rateconv_driver_index(FALSE,conv_driver)==-1) conv_driver = rateconv_driver_id(FALSE,0); if (new_format->channels < chunk->format.channels) { /* First decrease channels, then convert rate */ d = chunk_convert_channels(chunk,new_format->channels); if (d == NULL) return NULL; c = chunk_convert_samplerate(d,new_format->samplerate, conv_driver,dither_mode,bar); gtk_object_sink(GTK_OBJECT(d)); if (c == NULL) return NULL; } else if (new_format->channels > chunk->format.channels) { /* First convert rate, then increase channels */ d = chunk_convert_samplerate(chunk,new_format->samplerate, conv_driver,dither_mode,bar); if (d == NULL) return NULL; c = chunk_convert_channels(d,new_format->channels); gtk_object_sink(GTK_OBJECT(d)); if (c == NULL) return NULL; } else { /* Just convert rate */ c = chunk_convert_samplerate(chunk,new_format->samplerate, conv_driver,dither_mode,bar); if (c == NULL) return NULL; } } else if (new_format->channels != chunk->format.channels) { /* Just convert channels */ c = chunk_convert_channels(chunk,new_format->channels); if (c == NULL) return NULL; } /* Sample format conversion */ if (c == NULL) d = chunk; else d = c; if (dataformat_equal(&(d->format),new_format)) return d; d = chunk_convert_sampletype(d,new_format); if (c != NULL) gtk_object_sink(GTK_OBJECT(c)); return d; } gboolean clipwarn(off_t clipcount, gboolean maycancel) { gboolean b = FALSE; gchar *c; if (clipcount > 0) { if (clipcount > 1000000000) clipcount = 1000000000; c = g_strdup_printf(_("The input was clipped %d times during " "processing."),(int)clipcount); if (maycancel) b = (user_message(c,UM_OKCANCEL) != MR_OK); else user_warning(c); g_free(c); } return b; } mhwaveedit-1.4.24/src/chunk.h000066400000000000000000000376651334022513400160250ustar00rootroot00000000000000/* * Copyright (C) 2002 2003 2004 2005 2006 2007 2008 2009 2011, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ /* Chunk objects represent a segment of (PCM) audio data. The Chunks gets its * data from one or many Datasource objects. * * The Datasources that constitute the Chunk's data must all have the same * format as the Chunk. * * The Chunks are never modified after they are created, instead all functions * that modify a chunk return a new chunk with the changes, while the original * chunk and its data remains intact. */ #ifndef CHUNK_H_INCLUDED #define CHUNK_H_INCLUDED #include #include #ifdef HAVE_LIBSNDFILE #include #endif #include "datasource.h" #include "statusbar.h" #include "gtkfiles.h" #define CHUNK(obj) GTK_CHECK_CAST(obj,chunk_get_type(),Chunk) #define CHUNK_CLASS(class) GTK_CHECK_CLASS_CAST(class,chunk_get_type(),ChunkClass) #define IS_CHUNK(obj) GTK_CHECK_TYPE(obj,chunk_get_type()) typedef struct _Chunk { GtkObject object; Dataformat format; GList *parts; /* All items should be of type DataPart */ /* These must match the sum of the parts */ off_t length; /*Number of samples */ off_t size; /* Number of bytes (should always be * length*format.samplesize*format.channels) */ guint opencount; /* For detecting missing chunk_close calls */ } Chunk; typedef struct _ChunkClass { GtkObjectClass parent; } ChunkClass; typedef struct { Datasource *ds; off_t position; off_t length; } DataPart; /* Data structure used for chunk_open,chunk_read etc. */ typedef Chunk ChunkHandle; typedef gpointer WriteoutID; /* Function for outputting processed data * * data - The data to output * length - Length of the data (must be multiples of sample size) * * return value - TRUE on failure, FALSE on success */ typedef gboolean (*chunk_writeout_func)(WriteoutID id, gpointer data, guint length); /* Type for use as callback function for chunk_filter. * * NOTE: These callback functions should not call any other chunk functions * except the chunk_sample_get/put-functions... * * in - Buffer of input data * sample_size - The size of the in buffer (0 means EOF) * out - Function to call for outputting data. If a out function call fails, * this function should fail as well. * id - Parameter to send with every call to out. * format - Format of input and output data. * * return value - TRUE on failure, FALSE on success */ typedef gboolean (*chunk_filter_proc)(void *in, guint sample_size, chunk_writeout_func out_func, WriteoutID id, Dataformat *format); typedef gboolean (*chunk_filter_tofmt_proc)(void *in, guint sample_size, chunk_writeout_func out_func, WriteoutID id, Dataformat *informat, Dataformat *outformat); /* Type for use as callback function for chunk_parse. sample - Buffer of input data sample_size - The size of the in buffer (0 means EOF) chunk - The chunk being processed. return value - Return FALSE to continue parsing, otherwise parsing stops. */ typedef gboolean (*chunk_parse_proc)(void *sample,gint sample_size, Chunk *chunk); /* Flag that decides whether tempfiles created using chunk_filter * should be floating-point if the processing function outputs * floating-point data. If not, the data will be converted back and * written in the original Chunk's format. */ extern gboolean chunk_filter_use_floating_tempfiles; /* ------------------------------ FUNCTIONS --------------------------------- */ /* Note: All functions that return gboolean values return FALSE on success. */ /* If any function fails, it will display an error message box before it * returns.*/ /* ------ Creation functions ------ */ GtkType chunk_get_type(void); Chunk *chunk_new_from_datasource(Datasource *ds); /** Returns a new chunk with the same data as this chunk but assumed to be in a * different sample format. */ Chunk *chunk_clone_df(Chunk *chunk, Dataformat *format); /* Creates a silent chunk format - The data format of the chunk. num_samples - The length of the chunk. */ #define chunk_new_empty(format,num_samples) chunk_new_from_datasource(datasource_new_silent(format,num_samples)) /* Same as chunk_new_empty but you specify length as number of seconds instead * of samples. */ Chunk *chunk_new_silent(Dataformat *format, gfloat seconds); /* The number of chunk objects currently in existence */ guint chunk_alive_count(void); /* ------ Saving functions ------ */ /* Save a chunk's data into a file. chunk - The chunk to save. file - An opened file handle to save the data into. bigendian - TRUE if dumped PCM data should be big-endian. bar - Status bar to display progress. Must already be in progress mode. */ gboolean chunk_dump(Chunk *chunk, EFILE *file, gboolean bigendian, int dither_mode, StatusBar *bar); /* ------ Chunk reading functions. ------ */ /* Open a chunk for reading. Returns a ChunkHandle that can be used with * chunk_read and chunk_read_array. The ChunkHandle must be released using * chunk_close. */ ChunkHandle *chunk_open(Chunk *chunk); /* Read a raw multi-channel sample from the chunk. handle - ChunkHandle returned by chunk_open. sampleno - The sample to read. buffer - The buffer to read into. Must be at least chunk->samplebytes bytes long. */ gboolean chunk_read(ChunkHandle *handle, off_t sampleno, void *buffer, int dither_mode); /* Read a floating-point multi-channel sample from the chunk handle - ChunkHandle returned by chunk_open. sampleno - The sample to read. buffer - The buffer to read into. Must be at least channels * sizeof(sample_t) bytes long. */ gboolean chunk_read_fp(ChunkHandle *handle, off_t sampleno, sample_t *buffer, int dither_mode); /* Read an entire array of samples from the chunk. handle - ChunkHandle returned by chunk_open sampleno - The first sample to read. size - The number of bytes to read. Will be rounded down to whole sample. buffer - The buffer to read into return value - The number of bytes read (0 for error) */ guint chunk_read_array(ChunkHandle *handle, off_t sampleno, guint size, void *buffer, int dither_mode, off_t *clipcount); /* Read an entire array of floating-point samples from the chunk. handle - ChunkHandle returned by chunk_open sampleno - The first sample to read. samples - The number of multi-channel samples to read buffer - The buffer to read into return value - The number of multi-channel samples read (0 for error) */ guint chunk_read_array_fp(ChunkHandle *handle, off_t sampleno, guint samples, sample_t *buffer, int dither_mode, off_t *clipcount); /* Frees the resources used by a ChunkHandle. All handles should be freed when * they're no longer in use. */ void chunk_close(ChunkHandle *handle); /* ------ Chunk effects and utility functions ------- */ /* All these functions return a new (temporary) chunk on success and NULL on * failure */ /* Creates a new chunk with the original chunks data converted into a different * sample rate possibly using interpolation. */ Chunk *chunk_convert_samplerate(Chunk *chunk, gint samplerate, const gchar *rateconv_driver, int dither_mode, StatusBar *bar); Chunk *chunk_convert_speed(Chunk *chunk, gfloat speed_factor, int dither_mode, StatusBar *bar); /* Creates a new chunk with the original chunk's data converted into a * different sample format (samplerate and channels are unchanged) */ Chunk *chunk_convert_sampletype(Chunk *chunk, Dataformat *newtype); /* Converts the chunk to any format. */ Chunk *chunk_convert(Chunk *chunk, Dataformat *new_format, int dither_mode, StatusBar *bar); Chunk *chunk_byteswap(Chunk *chunk); /* Creates a new chunk with the original chunk's data but with one channel * removed. */ Chunk *chunk_remove_channel(Chunk *chunk, gint channel, StatusBar *bar); /* Creates a new chunk with the original chunk's data but with an extra channel * inserted containing a copy of another channel's data. */ Chunk *chunk_copy_channel(Chunk *chunk, gint channel, int dither_mode, StatusBar *bar); /* Creates a new chunk with the original chunk's data mixed into one channel. */ Chunk *chunk_onechannel(Chunk *chunk, int dither_mode, StatusBar *bar); /* Creates a new Chunk with the original chunk's data, but with the * last channels removed or silent channels added so the channel count * becomes new_channels */ Chunk *chunk_convert_channels(Chunk *chunk, guint new_channels); /* Creates a new Chunk with a mix of the original chunk's channels. * channels_out determines the number of output channels * map is a (chunk->channels x channels_out)-matrix; * If map[src*channels_out + dst], then channel from chunk will be * copied into channel of the result. Output channels with no assigned * inputs will be silent, output channels with more than one assigned input * will be mixed. */ Chunk *chunk_remap_channels(Chunk *chunk, int channels_out, gboolean *map, int dither_mode, StatusBar *bar); /* Creates a new chunk containing a mix of two chunk's data. The chunks must * have the same format but need not be of the same length. */ Chunk *chunk_mix(Chunk *c1, Chunk *c2, int dither_mode, StatusBar *bar); /* Creates a new Chunk with a channel count of the sum of c1 and c2:s channel * counts, having the data from Chunk c1 in the first channels, and * the data from Chunk c2 in the following channels. * * The data is aligned in time, so that the sample in c1 at * c1_align_point coincides with the sample in c2 at * c2_align_point. The point in the resulting chunk where this sample * exists is stored in *align_point_out. */ Chunk *chunk_sandwich(Chunk *c1, Chunk *c2, off_t c1_align_point, off_t c2_align_point, off_t *align_point_out, int dither_mode, StatusBar *bar); off_t chunk_zero_crossing_any_forward( Chunk *c, StatusBar *bar, off_t cursorpos); off_t chunk_zero_crossing_any_reverse( Chunk *c, StatusBar *bar, off_t cursorpos); off_t chunk_zero_crossing_all_forward( Chunk *c, StatusBar *bar, off_t cursorpos); off_t chunk_zero_crossing_all_reverse( Chunk *c, StatusBar *bar, off_t cursorpos); /* Returns the maximum absolute value of all the samples in the chunk. * Returns negative value if anything failed. */ sample_t chunk_peak_level(Chunk *c, StatusBar *bar); /* Returns a new chunk with all samples of the chunk c multiplied by a * factor. */ Chunk *chunk_amplify(Chunk *c, sample_t factor, int dither_mode, StatusBar *bar); /* Creates a new chunk with all samples of the chunk c multiplied by a factor * varying from start_factor to end_factor */ Chunk *chunk_volume_ramp(Chunk *c, sample_t start_factor, sample_t end_factor, int dither_mode, StatusBar *bar); /* Create a new chunk consisting of one chunk's data followed by another * chunk's data. Always succeeds. */ Chunk *chunk_append(Chunk *first, Chunk *second); /* Create a new chunk of the same length and format as the input chunk, * consisting of a linear interpolation between the input chunk's two * endpoints. Returns NULL on failure. * * If falldown_mode is TRUE and the chunk is long, the endpoints will *be ramped down to zero and the middle part will be constant zero. */ Chunk *chunk_interpolate_endpoints(Chunk *chunk, gboolean falldown_mode, int dither_mode, StatusBar *bar); /* Creates a new chunk with the original chunk's data and another chunk's data * inserted at a certain offset (offset must be at an even sample) */ Chunk *chunk_insert(Chunk *chunk, Chunk *part, off_t position); /* Returns a chunk containing a part of the original chunk's data */ Chunk *chunk_get_part(Chunk *chunk, off_t start, off_t length); /* These functions return a new chunk where a part of the original chunk's * data has been removed or replaced by the data of another chunk. */ Chunk *chunk_remove_part(Chunk *chunk, off_t start, off_t length); Chunk *chunk_replace_part(Chunk *chunk, off_t start, off_t length, Chunk *new); /* ------ Processing functions ------ */ /* Pipe a chunk's contents through a callback function and create a new chunk * with the output. * * chunk - The chunk to process * proc - The callback function (see declaration of chunk_filter_proc above) * eof_proc - If this argument is non-NULL, when all data has been filtered * through proc, this function will be called with sample_size==0 to produce * the last data. This argument is usually either NULL or the same as proc. * amount - How much should be sent each time. One of: * CHUNK_FILTER_ONE - One sample value at a time * CHUNK_FILTER_FULL - One multichannel sample at a time * CHUNK_FILTER_MANY - Many multichannel samples at a time. The callback * function can determine the exact amount by looking at the * sample_size parameter. * * must_convert - If TRUE the in and out buffer will always be in * sample_t format instead of the chunk's native sample format. * bar - Status bar to display progress in * title - Title to display in status bar. * returns - The output or NULL on failure. */ #define CHUNK_FILTER_ONE 0 #define CHUNK_FILTER_FULL 1 #define CHUNK_FILTER_MANY 2 Chunk *chunk_filter(Chunk *chunk, chunk_filter_proc proc, chunk_filter_proc eof_proc, gint amount, gboolean must_convert, int dither_mode, StatusBar *bar, gchar *title); Chunk *chunk_filter_tofmt(Chunk *chunk, chunk_filter_tofmt_proc proc, chunk_filter_tofmt_proc eof_proc, gint amount, gboolean must_convert, Dataformat *tofmt, int dither_mode, StatusBar *bar, gchar *title); /* Send a chunk's contents one sample at a time to a callback function. * * chunk - The chunk to process. * proc - The callback function (see definition of chunk_parse_proc above). * allchannels - If TRUE the samples will be sent with all channels' data at * the same time, if FALSE one channel at a time will be sent. * convert - If TRUE the samples will be sent as sample_t (floating point) * values, otherwise they will be sent in raw format. * samplepos - The location within the chunk that parsing should start at. * reverse - If TRUE, parsing will move backward through the chunk; if FALSE * parsing will move forward through the chunk. * * returns - FALSE on success, TRUE if proc returned TRUE or a read error * occured. */ gboolean chunk_parse(Chunk *chunk, chunk_parse_proc proc, gboolean allchannels, gboolean convert, int dither_mode, StatusBar *bar, gchar *title, off_t samplepos, gboolean reverse); /* ------ Miscellaneous chunk functions ------ */ /* Determines whether the format parameters of two chunks are the same. * To return TRUE, the chunks must have the same samplerate, samplesize, * channels and sign. */ #define chunk_format_equal(c1,c2) dataformat_equal(&(c1->format),&(c2->format)) #define chunk_get_time(c,s,t) get_time((c)->format.samplerate,s,s,t,default_time_mode) /* Calls func for each existing chunk. */ void chunk_foreach(GFunc func, gpointer user_data); gboolean clipwarn(off_t clipcount, gboolean maycancel); #endif mhwaveedit-1.4.24/src/chunkview.c000066400000000000000000000715741334022513400167100ustar00rootroot00000000000000/* * Copyright (C) 2002 2003 2004 2005 2007 2008 2009 2010, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include #include #include "chunkview.h" #include "main.h" #include "inifile.h" #include "player.h" #include "mainloop.h" static GtkObjectClass *parent_class; static guint font_height=0,font_width=0; enum { VIEW_CHANGED_SIGNAL, SELECTION_CHANGED_SIGNAL, CURSOR_CHANGED_SIGNAL, CHUNK_CHANGED_SIGNAL, DOUBLE_CLICK_SIGNAL, LAST_SIGNAL }; static guint chunk_view_signals[LAST_SIGNAL] = { 0 }; static void chunk_view_update_image(ChunkView *view, guint xs, guint xe); static void chunk_view_redraw_samples(ChunkView *cv, off_t start, off_t end); static gint calc_x(ChunkView *cv, off_t sample, off_t width); static int chunk_view_autoscroll(gpointer timesource, GTimeVal *current_time, gpointer user_data); static void chunk_view_changed(Document *d, gpointer user_data) { ChunkView *cv = CHUNKVIEW(user_data); if (cv->image != NULL) chunk_view_update_image(cv,0,cv->image_width-1); gtk_widget_queue_draw(GTK_WIDGET(cv)); } static void chunk_view_selection_changed(Document *d, gpointer user_data) { off_t os,oe,ns,ne; ChunkView *cv = CHUNKVIEW(user_data); /* Calculate the user-visible part of the old selection */ os = MAX(d->viewstart, d->old_selstart); oe = MIN(d->viewend, d->old_selend); /* Calculate user-visible part of the new selection */ ns = MAX(d->viewstart, d->selstart); ne = MIN(d->viewend, d->selend); /* Different cases: * 1. Neither the old nor the new selection is in view. * 2. The old selection wasn't in view but the new is.. * 3. The new selection is in view but the old wasn't.. * 4. Both are in view and overlap * 5. Both are in view and don't overlap */ if (os >= oe && ns >= ne) { /* Case 1 - Do nothing */ } else if (os >= oe) { /* Case 2 - Draw the entire new sel. */ chunk_view_redraw_samples(cv,ns,ne); } else if (ns >= ne) { /* Case 3 - Redraw the old sel. */ chunk_view_redraw_samples(cv,os,oe); } else if ((ns >= os && ns < oe) || (os >= ns && os < ne)) { /* Case 4 - Redraw the changes on both sides */ if (os != ns) chunk_view_redraw_samples(cv,MIN(os,ns),MAX(os,ns)); if (oe != ne) chunk_view_redraw_samples(cv,MIN(oe,ne),MAX(oe,ne)); } else { /* Case 5 - Redraw both selections */ chunk_view_redraw_samples(cv,os,oe); chunk_view_redraw_samples(cv,ns,ne); } } static void chunk_view_cursor_changed(Document *d, gboolean rolling, gpointer user_data) { ChunkView *cv = CHUNKVIEW(user_data); off_t pos[4]; int npos,pix[4],npix,i,p,j, w=GTK_WIDGET(cv)->allocation.width; npos = 0; pos[npos++] = d->old_cursorpos; pos[npos++] = d->cursorpos; if (cv->show_bufpos) { pos[npos++] = d->old_playbufpos; pos[npos++] = d->playbufpos; } npix = npos; for (i=0; i 0 && pix[0] == pix[1]) { pix[0] = pix[2]; pix[1] = pix[3]; npix -= 2; } for (i=0; i -1 && pix[i] < w) gtk_widget_queue_draw_area(GTK_WIDGET(cv),pix[i],0,1, cv->image_height); } } static void chunk_view_destroy (GtkObject *object) { ChunkView *cv = CHUNKVIEW(object); if (cv->image) { gdk_pixmap_unref(cv->image); cv->image = NULL; } if (cv->doc != NULL) { gtk_signal_disconnect_by_data(GTK_OBJECT(cv->doc),cv); gtk_object_unref(GTK_OBJECT(cv->doc)); } cv->doc = NULL; parent_class->destroy(object); if (cv->cache) view_cache_free(cv->cache); cv->cache = NULL; } static gint calc_x(ChunkView *cv, off_t sample, off_t width) { Document *d = cv->doc; gfloat f,g; if (sample < d->viewstart) return -1; if (sample > d->viewend ) return width; else { f = sample - d->viewstart; g = d->viewend - d->viewstart; return width * (f/g); } } static gint calc_x_noclamp(ChunkView *cv, off_t sample, off_t width) { Document *d = cv->doc; gfloat f,g; f = sample - d->viewstart; g = d->viewend - d->viewstart; return width * (f/g); } static void chunk_view_update_image_main(ChunkView *cv, GdkDrawable *image, guint xs, guint xe) { int i,j,y; gint w,h; GtkWidget *wid = GTK_WIDGET(cv); Document *d = cv->doc; w = wid->allocation.width; h = wid->allocation.height; if (cv->timescale) h-=font_height; if (xe < xs) return; /* Svart bakgrund */ gdk_draw_rectangle( image, get_gc(BACKGROUND,wid), TRUE, xs, 0, 1+xe-xs,h); /* Om det inte finns ngon sampling laddad, stanna hr. */ if (d == NULL || d->chunk->length == 0) return; /* Rita ut markeringen med speciell frg */ if (d->selstart != d->selend && d->selstart < d->viewend && d->selend > d->viewstart) { if (d->selstart > d->viewstart) i = calc_x( cv, d->selstart, w ); else i = 0; if (i < xs) i=xs; if (i <= xe) { if (d->selend < d->viewend) j = calc_x( cv, d->selend, w ); else j = xe; if (j > xe) j = xe; if (j >= xs) { gdk_draw_rectangle( image, get_gc(SELECTION,wid),TRUE, i, 0, 1+j-i, h ); } } // printf("i = %d, j = %d\n",i,j); } /* Rita gra streck */ j = h/d->chunk->format.channels; for (i=0; ichunk->format.channels; i++) { y = j/2 + i*j; gdk_draw_line(image,get_gc(BARS,wid),xs,y,xe,y); } /* Drawing one pixel to the left of xs is a workaround. Some part of the * code seems to draw one pixel wrong to the left. */ view_cache_draw_part(cv->cache, image, (xs==0)?0:xs-1, xe, h, GTK_WIDGET(cv), cv->scale_factor); } static void chunk_view_update_image(ChunkView *cv, guint xs, guint xe) { #if GTK_MAJOR_VERSION < 2 GtkWidget *wid = GTK_WIDGET(cv); gint w,h; /* printf("chunk_view_update_image: %d->%d\n",xs,xe); */ /* gint cx,v1,v2,pv1,pv2; */ /* Skapa pixmap */ w = wid->allocation.width; h = wid->allocation.height; if (cv->timescale) h-=font_height; if (cv->image!=NULL && (w != cv->image_width || h != cv->image_height)) { gdk_pixmap_unref(cv->image); cv->image = NULL; } if (cv->image == NULL) { cv->image = gdk_pixmap_new(wid->window, w, h, -1); cv->image_width = w; cv->image_height = h; xs = 0; xe = w-1; } chunk_view_update_image_main(cv,cv->image,xs,xe); #endif } struct draw_mark_data { ChunkView *view; GdkEventExpose *event; }; static void draw_mark(gchar *label, off_t position, gpointer user_data) { struct draw_mark_data *dd = (struct draw_mark_data *)user_data; ChunkView *cv = dd->view; GdkEventExpose *event = dd->event; GtkWidget *widget = GTK_WIDGET(cv); Document *d = cv->doc; guint i; if ( position >= d->viewstart && position <= d->viewend ) { i = calc_x( cv, position, widget->allocation.width ); if (event->area.x <= i+10 && event->area.x+event->area.width > i) { gdk_draw_line( widget->window, get_gc(MARK,widget), i, event->area.y, i, event->area.y+event->area.height-1); /* Render the text */ gdk_gc_set_foreground(widget->style->fg_gc[0],get_color(MARK)); gtk_draw_string( widget->style, widget->window, GTK_STATE_NORMAL, i+2, font_height+2, label ); gdk_gc_set_foreground(widget->style->fg_gc[0],get_color(BLACK)); /* gdk_draw_text( widget->window, widget->style->font, gc_mark(widget), i+2, 12, (gchar *)key, strlen(key) ); */ } } } static void draw_time_bars(ChunkView *view, GdkEventExpose *event, off_t *points, int npoints, off_t *ignpoints, int nignpoints, gboolean small, gint text) { char buf[32]; gint c,i,j; #if GTK_MAJOR_VERSION == 2 PangoLayout *pl; #endif GtkWidget *widget = GTK_WIDGET(view); Document *d = view->doc; char *s; int ignctr = 0; for (c=0; callocation.width); /* printf("draw_time_bars: f=%f, h=%f\n",f,h); */ gdk_draw_line( widget->window, widget->style->white_gc, j, widget->allocation.height-font_height-(small?3:7), j, widget->allocation.height-font_height); if (text >= 0) { if (text > 0) s = get_time_tail(view->doc->chunk->format.samplerate, points[c], d->chunk->length, buf, default_timescale_mode); else s = get_time_head(d->chunk->format.samplerate, points[c], d->chunk->length, buf, default_timescale_mode); if (s == NULL) continue; #if GTK_MAJOR_VERSION == 1 i = gdk_string_width( widget->style->font, buf ) / 2; gtk_draw_string( widget->style, widget->window, GTK_STATE_NORMAL, j-i, widget->allocation.height-1, buf ); #else /* puts(buf); */ pl = gtk_widget_create_pango_layout( widget, buf ); pango_layout_get_pixel_size(pl, &i, NULL); gdk_draw_layout( widget->window, widget->style->fg_gc[GTK_STATE_NORMAL], j-i/2, widget->allocation.height-font_height, pl); g_object_unref(G_OBJECT(pl)); #endif } } } static void draw_timescale(ChunkView *view, GdkEventExpose *event, gboolean text) { GtkWidget *widget = GTK_WIDGET(view); Document *d = view->doc; guint i; off_t *points,*midpoints,*minorpoints; int npoints,nmidpoints,nminorpoints; guint midtext,minortext; if (text) gdk_window_clear_area(widget->window, event->area.x, view->image_height,event->area.width, font_height); /* Draw the horizontal line */ i = widget->allocation.height-font_height; gdk_draw_line( widget->window, widget->style->white_gc, event->area.x, i, event->area.x+event->area.width-1, i); /* pixels/sec */ /* We want at least font_width pixels/major point * and 8 pixels/minor point*/ npoints = widget->allocation.width / font_width + 1; if (npoints < 3) npoints = 3; nmidpoints = npoints; nminorpoints = widget->allocation.width / 8 + 1; if (nminorpoints < npoints) nminorpoints = npoints; points = g_malloc(npoints * sizeof(off_t)); midpoints = g_malloc(nmidpoints * sizeof(off_t)); minorpoints = g_malloc(nminorpoints * sizeof(off_t)); minortext = find_timescale_points(d->chunk->format.samplerate, d->viewstart, d->viewend, points, &npoints, midpoints, &nmidpoints, minorpoints, &nminorpoints, default_timescale_mode); /* printf("npoints: %d, pixels/point: %d\n",npoints, widget->allocation.width / npoints); printf("nmidpoints: %d, pixels/midpoint: %d\n",nmidpoints, (nmidpoints > 0) ? widget->allocation.width / nmidpoints : 0); printf("nminorpoints: %d, pixels/minorpoint: %d\n",nminorpoints, (nminorpoints > 0) ? widget->allocation.width / nminorpoints : 0); printf("font_width: %d\n",font_width); */ midtext = minortext; if (nminorpoints > 0 && (widget->allocation.width / nminorpoints) < font_width) minortext = -1; else midtext = -1; draw_time_bars(view,event,points,npoints,NULL,0,FALSE,text ? 0 : -1); if (midtext >= 0) { draw_time_bars(view,event,midpoints,nmidpoints,points,npoints,FALSE, text ? midtext : -1); } draw_time_bars(view,event,minorpoints,nminorpoints,points,npoints,TRUE, text ? minortext : -1); g_free(points); g_free(minorpoints); } static gint chunk_view_expose(GtkWidget *widget, GdkEventExpose *event) { ChunkView *cv = CHUNKVIEW(widget); Document *d = cv->doc; guint i; struct draw_mark_data dd; gboolean expose_timescale=FALSE, expose_text=FALSE; /* printf("Expose: (%d,%d)+(%d,%d)\n",event->area.x,event->area.y, event->area.width,event->area.height); */ #if GTK_MAJOR_VERSION < 2 /* This call creates the pixmap if it doesn't exist, * otherwise does nothing (because xewindow, get_gc(BLACK,widget), cv->image, event->area.x, event->area.y, event->area.x, event->area.y, event->area.width, event->area.height ); #else chunk_view_update_image_main( cv, widget->window, event->area.x, event->area.x + event->area.width - 1 ); #endif if (d == NULL) return FALSE; /* Determine if the time scale or text/bars at the bottom needs * redrawing */ if (cv->timescale) if (event->area.y+event->area.height > cv->image_height-7) { expose_timescale=TRUE; if (event->area.y+event->area.height > cv->image_height) { expose_text = TRUE; event->area.height = cv->image_height-event->area.y; } } /* Draw playback indicator */ if ( (cv->show_bufpos) && d->playbufpos >= d->viewstart && d->playbufpos <= d->viewend ) { i = calc_x( cv, d->playbufpos, widget->allocation.width ); if (event->area.x <= i && event->area.x+event->area.width > i) { gdk_draw_line( widget->window, get_gc(BUFPOS,widget), i, event->area.y, i, event->area.y+event->area.height-1 ); } } /* Draw the marks */ dd.view = cv; dd.event = event; document_foreach_mark( d, draw_mark, &dd ); /* Draw the cursor */ if ( d->cursorpos >= d->viewstart && d->cursorpos <= d->viewend ) { i = calc_x( cv, d->cursorpos, widget->allocation.width ); if (event->area.x <= i && event->area.x+event->area.width > i) { gdk_draw_line( widget->window, get_gc(CURSOR,widget), i, event->area.y, i, event->area.y+event->area.height-1 ); } } /* Draw the time scale */ if (d->chunk && cv->timescale && expose_timescale) draw_timescale( cv, event, expose_text ); return FALSE; } static void chunk_view_size_request(GtkWidget *widget, GtkRequisition *req) { req->width = 300; req->height = 50; } static void chunk_view_size_allocate(GtkWidget *widget, GtkAllocation *all) { ChunkView *cv = CHUNKVIEW(widget); Document *d = cv->doc; GTK_WIDGET_CLASS(parent_class)->size_allocate(widget,all); if (cv->image == NULL) { /* Hack */ cv->image_width = all->width; cv->image_height = all->height; if (cv->timescale) cv->image_height -= font_height; } if (d == NULL) return; /* Call view_cache_update to make sure the view cache knows the new * size. */ view_cache_update(cv->cache,d->chunk,d->viewstart,d->viewend, widget->allocation.width,NULL,NULL); } static off_t calc_sample(ChunkView *cv, gfloat x, gfloat xmax) { return cv->doc->viewstart + (x/xmax) * (cv->doc->viewend-cv->doc->viewstart); } static gboolean dragmode = FALSE; static off_t dragstart; static off_t dragend; static gboolean autoscroll = FALSE; static gpointer autoscroll_source = NULL; static ChunkView *autoscroll_view; static gfloat autoscroll_amount; static GTimeVal autoscroll_start; static gint scroll_wheel(GtkWidget *widget, gdouble mouse_x, int direction) { ChunkView *cv = CHUNKVIEW(widget); Document *d = cv->doc; gfloat zf; off_t ui1,ui2; if (d == NULL) return FALSE; dragstart = dragend = calc_sample( cv, mouse_x, (gfloat)widget->allocation.width); if (direction == -1) // Scroll wheel down { if (d->viewend - d->viewstart == widget->allocation.width) return FALSE; zf = 1.0/1.4; } else if (d->viewend - d->viewstart < 2) zf = 4.0; // Special case to avoid locking in maximum zoom else zf = 1.4; // Scroll wheel up ui1 = dragstart-(off_t)((gfloat)(dragstart-d->viewstart))*zf; ui2 = dragstart+(off_t)((gfloat)(d->viewend-dragstart))*zf; if (ui1 < 0) ui1 = 0; if (ui2 < dragstart || ui2 > d->chunk->length) ui2 = d->chunk->length; if (ui2 == ui1) { if (ui2 < d->chunk->length) ui2++; else if (ui1 > 0) ui1--; } document_set_view(d,ui1,ui2); return FALSE; } #if GTK_MAJOR_VERSION == 2 static gint chunk_view_scrollwheel(GtkWidget *widget, GdkEventScroll *event) { if (event->direction == GDK_SCROLL_DOWN) return scroll_wheel(widget, event->x, -1); else return scroll_wheel(widget, event->x, 1); } #endif static gint chunk_view_button_press(GtkWidget *widget, GdkEventButton *event) { ChunkView *cv = CHUNKVIEW(widget); gdouble sp,ep; off_t o; Document *d = cv->doc; if (d == NULL) return FALSE; if (event->type == GDK_2BUTTON_PRESS && event->button == 1) { o = calc_sample(cv,event->x,(gfloat)widget->allocation.width); gtk_signal_emit(GTK_OBJECT(cv), chunk_view_signals[DOUBLE_CLICK_SIGNAL],&o); return FALSE; } dragstart = dragend = calc_sample( cv, event->x, (gfloat)widget->allocation.width); /* Snap to sel start/end */ sp = (gdouble)calc_x(cv,d->selstart,widget->allocation.width); ep = (gdouble)calc_x(cv,d->selend,widget->allocation.width); if (fabs(event->x - sp) < 3.0) dragstart = dragend = d->selstart; else if (fabs(event->x - ep) < 3.0) dragstart = dragend = d->selend; if ((event->state & GDK_SHIFT_MASK) != 0 && d->selend != d->selstart) { dragmode = TRUE; /* The right selection endpoint is nearest to dragstart * <=> dragstart > (selstart+selend)/2 * <=> 2*dragstart > selstart+selend * <=> dragstart+dragstart > selstart+selend * <=> dragstart-selend > selstart-dragstart * This should be overflow-safe for large values */ if ((event->button == 1 && dragstart-d->selend > d->selstart-dragstart) || (event->button != 1 && dragstart-d->selend < d->selstart-dragstart) ) { /* Drag right endpoint */ dragstart = d->selstart; } else { /* Drag left endpoint */ dragstart = d->selend; } document_set_selection( d, dragstart, dragend ); } else if (event->button == 1 || event->button == 2) { dragmode = TRUE; if (d->selend != d->selstart) { if (d->selstart >= d->viewstart && dragstart == d->selstart){ dragstart = d->selend; dragend = d->selstart; return FALSE; } else if (d->selend <= d->viewend && dragstart == d->selend) { dragstart = d->selstart; dragend = d->selend; return FALSE; } } document_set_selection( d, dragstart, dragend ); } else if (event->button == 3) { document_set_cursor(d,dragstart); } else if (event->button == 4 || event->button == 5) { if (event->button == 5) scroll_wheel(widget, event->x, -1); else scroll_wheel(widget, event->x, 1); } return FALSE; } static gint chunk_view_motion_notify(GtkWidget *widget, GdkEventMotion *event) { gint x1,x2; static GdkCursor *arrows=NULL; ChunkView *cv = CHUNKVIEW(widget); Document *d = cv->doc; if (d == NULL) return FALSE; if (dragmode) { if (event->x < widget->allocation.width) dragend = calc_sample ( cv, (event->x > 0.0) ? event->x : 0.0, (gfloat)widget->allocation.width ); else dragend = d->viewend; document_set_selection ( d, dragstart, dragend ); if (event->x < 0.0 || event->x > widget->allocation.width) { if (!autoscroll) { autoscroll = TRUE; autoscroll_view = cv; g_get_current_time(&autoscroll_start); } if (event->x < 0.0) autoscroll_amount = event->x; else autoscroll_amount = event->x - widget->allocation.width; chunk_view_autoscroll(NULL,&autoscroll_start,NULL); } else { autoscroll = FALSE; } } else if (d->selstart != d->selend) { if (d->selstart >= d->viewstart) x1 = calc_x(cv,d->selstart,widget->allocation.width); else x1 = -500; if (d->selend <= d->viewend) x2 = calc_x(cv,d->selend,widget->allocation.width); else x2 = -500; if (fabs(event->x-(double)x1)<3.0 || fabs(event->x-(double)x2)<3.0) { if (arrows == NULL) arrows = gdk_cursor_new(GDK_SB_H_DOUBLE_ARROW); gdk_window_set_cursor(widget->window,arrows); } else { gdk_window_set_cursor(widget->window,NULL); } } return FALSE; } #define FLOAT(x) ((gfloat)(x)) static int chunk_view_autoscroll(gpointer timesource, GTimeVal *current_time, gpointer user_data) { GTimeVal diff,new_time; gfloat smp; off_t ismp; /* puts("chunk_view_autoscroll"); */ g_assert(timesource == NULL || timesource == autoscroll_source); if (!autoscroll) return 0; timeval_subtract(&diff,current_time,&autoscroll_start); /* printf("diff: %d,%d\n",diff.tv_sec,diff.tv_usec); */ if (diff.tv_sec > 0 || diff.tv_usec > 10000) { memcpy(&autoscroll_start,current_time,sizeof(autoscroll_start)); /* Convert diff -> smp */ smp = 0.2 * FLOAT(diff.tv_usec/10000 + diff.tv_sec*100) * autoscroll_amount * FLOAT(autoscroll_view->doc->viewend-autoscroll_view->doc->viewstart)/ FLOAT(GTK_WIDGET(autoscroll_view)->allocation.width); /* Convert smp->ismp, update view and selection */ if (smp < 0.0) { ismp = (off_t)(-smp); if (ismp > dragend) { ismp = dragend; autoscroll = FALSE; } dragend -= ismp; document_set_selection(autoscroll_view->doc,dragend,dragstart); document_set_view(autoscroll_view->doc, dragend, autoscroll_view->doc->viewend-ismp); } else { ismp = (off_t)smp; if (dragend+ismp > autoscroll_view->doc->chunk->length) { ismp = autoscroll_view->doc->chunk->length - dragend; autoscroll = FALSE; } dragend += ismp; document_set_selection(autoscroll_view->doc,dragstart,dragend); document_set_view(autoscroll_view->doc, autoscroll_view->doc->viewstart+ismp, dragend); } } if (autoscroll) { memcpy(&new_time,current_time,sizeof(new_time)); new_time.tv_usec = ((new_time.tv_usec / 25000) + 1) * 25000; if (new_time.tv_usec >= 1000000) { new_time.tv_sec += 1; new_time.tv_usec -= 1000000; } if (autoscroll_source == NULL) autoscroll_source = mainloop_time_source_add(&new_time,chunk_view_autoscroll, NULL); else mainloop_time_source_restart(autoscroll_source,&new_time); } return 0; } static gint chunk_view_button_release(GtkWidget *widget, GdkEventButton *event) { ChunkView *cv = CHUNKVIEW(widget); if (event->button == 2 && cv->doc != NULL) { document_play_selection(cv->doc,FALSE,1.0); } autoscroll = FALSE; dragmode = FALSE; return FALSE; } static void chunk_view_class_init(GtkObjectClass *klass) { GtkWidgetClass *wc = GTK_WIDGET_CLASS(klass); ChunkViewClass *cvc = CHUNKVIEW_CLASS(klass); parent_class = gtk_type_class( gtk_drawing_area_get_type() ); klass->destroy = chunk_view_destroy; wc->expose_event = chunk_view_expose; wc->size_request = chunk_view_size_request; wc->size_allocate = chunk_view_size_allocate; wc->button_press_event = chunk_view_button_press; wc->motion_notify_event = chunk_view_motion_notify; wc->button_release_event = chunk_view_button_release; #if GTK_MAJOR_VERSION == 2 wc->scroll_event = chunk_view_scrollwheel; #endif cvc->double_click = NULL; chunk_view_signals[DOUBLE_CLICK_SIGNAL] = gtk_signal_new("double-click", GTK_RUN_FIRST, GTK_CLASS_TYPE(klass), GTK_SIGNAL_OFFSET(ChunkViewClass,double_click), gtk_marshal_NONE__POINTER, GTK_TYPE_NONE, 1, GTK_TYPE_POINTER ); gtk_object_class_add_signals(klass,chunk_view_signals,LAST_SIGNAL); } static void chunk_view_init(GtkObject *obj) { ChunkView *cv; cv = CHUNKVIEW(obj); cv->doc = NULL; cv->image = NULL; cv->timescale = TRUE; cv->scale_factor = 1.0; cv->cache = view_cache_new(); gtk_widget_add_events( GTK_WIDGET(obj), GDK_BUTTON_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK ); if (!font_height) { #if GTK_MAJOR_VERSION == 1 font_height = gdk_string_height( GTK_WIDGET(obj)->style->font, "0123456789")+3; font_width = gdk_string_width( GTK_WIDGET(obj)->style->font, "0123456789")+3; #else PangoLayout *pl; pl = gtk_widget_create_pango_layout( GTK_WIDGET(obj), "0123456789" ); pango_layout_get_pixel_size(pl, (gint *)&font_width, (gint *)&font_height); g_object_unref(pl); #endif } } GtkType chunk_view_get_type(void) { static GtkType id = 0; if (!id) { GtkTypeInfo info = { "ChunkView", sizeof(ChunkView), sizeof(ChunkViewClass), (GtkClassInitFunc) chunk_view_class_init, (GtkObjectInitFunc) chunk_view_init }; id = gtk_type_unique( gtk_drawing_area_get_type(), &info ); } return id; } GtkWidget *chunk_view_new(void) { return GTK_WIDGET(gtk_type_new(chunk_view_get_type())); } void chunk_view_set_document(ChunkView *cv, Document *doc) { if (cv->doc == doc) return; if (cv->doc != NULL) { gtk_signal_disconnect_by_data(GTK_OBJECT(cv->doc),cv); gtk_object_unref(GTK_OBJECT(cv->doc)); } cv->doc = doc; if (doc != NULL) { gtk_object_ref(GTK_OBJECT(doc)); gtk_object_sink(GTK_OBJECT(doc)); gtk_signal_connect(GTK_OBJECT(doc),"view_changed", GTK_SIGNAL_FUNC(chunk_view_changed),cv); gtk_signal_connect(GTK_OBJECT(doc),"state_changed", GTK_SIGNAL_FUNC(chunk_view_changed),cv); gtk_signal_connect(GTK_OBJECT(doc),"selection_changed", GTK_SIGNAL_FUNC(chunk_view_selection_changed),cv); gtk_signal_connect(GTK_OBJECT(doc),"cursor_changed", GTK_SIGNAL_FUNC(chunk_view_cursor_changed),cv); } chunk_view_changed(cv->doc,cv); } static void chunk_view_redraw_samples(ChunkView *cv, off_t start, off_t end) { guint startpix,endpix; startpix = calc_x(cv,start,GTK_WIDGET(cv)->allocation.width); endpix = calc_x(cv,end,GTK_WIDGET(cv)->allocation.width); if (cv->image) chunk_view_update_image(cv,startpix,endpix); /* printf("Calling queue_draw on: (%d,%d)+(%d,%d)\n",startpix,0, 1+endpix-startpix,GTK_WIDGET(cv)->allocation.height- (cv->timescale?font_height:0)); */ gtk_widget_queue_draw_area(GTK_WIDGET(cv),startpix,0,1+endpix-startpix, GTK_WIDGET(cv)->allocation.height- (cv->timescale?font_height:0)); } void chunk_view_set_timescale(ChunkView *cv, gboolean scale_visible) { if (cv->timescale == scale_visible) return; cv->timescale = scale_visible; chunk_view_changed(cv->doc,cv); } gboolean chunk_view_update_cache(ChunkView *view) { gboolean b; gint i,j; b = view_cache_update(view->cache, view->doc->chunk, view->doc->viewstart, view->doc->viewend, view->image_width, &i, &j); if (!b && view->need_redraw_left != -1) { gtk_widget_queue_draw_area(GTK_WIDGET(view), view->need_redraw_left, 0,view->need_redraw_right- view->need_redraw_left, view->image_height); view->need_redraw_left = -1; } if (b && i!=j) { if (view->need_redraw_left == -1) { view->need_redraw_left = i; view->need_redraw_right = j; } else { if (i < view->need_redraw_left) view->need_redraw_left=i; if (j > view->need_redraw_right) view->need_redraw_right=j; } chunk_view_update_image(view,i,j); /* Repaint after 20 pixels have been updated or once per second * or we're just finished. */ if (view->need_redraw_right-view->need_redraw_left > 20 || (view->last_redraw_time != time(0)) || view_cache_uptodate(view->cache)) { gtk_widget_queue_draw_area(GTK_WIDGET(view), view->need_redraw_left, 0,view->need_redraw_right- view->need_redraw_left, view->image_height); view->last_redraw_time = time(0); view->need_redraw_left = -1; } } return b; } void chunk_view_force_repaint(ChunkView *cv) { chunk_view_changed(cv->doc,cv); } void chunk_view_set_scale(ChunkView *cv, gfloat scale) { cv->scale_factor = scale; chunk_view_changed(cv->doc,cv); } mhwaveedit-1.4.24/src/chunkview.h000066400000000000000000000057231334022513400167060ustar00rootroot00000000000000/* * Copyright (C) 2002 2003 2004, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ /* ChunkView is a graphical component that gives a view of the data inside a * chunk object. */ #ifndef CHUNKVIEW_H_INCLUDED #define CHUNKVIEW_H_INCLUDED #include #include "chunk.h" #include "document.h" #include "viewcache.h" #define CHUNKVIEW(obj) GTK_CHECK_CAST (obj, chunk_view_get_type(), ChunkView) #define CHUNKVIEW_CLASS(klass) GTK_CHECK_CLASS_CAST(klass,chunk_view_get_type(),ChunkViewClass) #define IS_CHUNKVIEW(obj) GTK_CHECK_TYPE (obj,chunk_view_get_type()) typedef struct _ChunkView { /* PRIVATE MEMBERS - Keep out! */ GtkDrawingArea parent; /* Image used for double-buffering the sample view. Only used under GTK2, * however the image_width/image_height variables are used at various * places so they are kept updated (ugly solution) */ GdkPixmap *image; guint image_width,image_height; ViewCache *cache; int last_redraw_time,need_redraw_left,need_redraw_right; gfloat scale_factor; /* Vertical scaling factor (default: 1.0) */ /* READ-ONLY PUBLIC MEMBERS */ /* To change these, use the public functions below. */ Document *doc; gboolean timescale; /* Time scale visible flag */ gboolean show_bufpos; } ChunkView; typedef struct _ChunkViewClass { GtkDrawingAreaClass parent_class; /* SIGNALS */ /* Emitted when the user double-clicked somewhere in the view */ /* The off_t pointer is because off_t values aren't directly supported by * the GTK (1.2) type system */ void (*double_click)(ChunkView *view, off_t *sample); } ChunkViewClass; GtkType chunk_view_get_type(void); /* Creates a new ChunkView */ GtkWidget *chunk_view_new(void); void chunk_view_set_document(ChunkView *cv, Document *d); /* Selects whether a time scale should be drawn at the bottom of the view. */ void chunk_view_set_timescale(ChunkView *cv, gboolean scale_visible); /* This is called when the caches should progress. */ gboolean chunk_view_update_cache(ChunkView *cv); void chunk_view_force_repaint(ChunkView *cv); void chunk_view_use_backing_pixmap(ChunkView *cv, gboolean use_pixmap); void chunk_view_set_scale(ChunkView *cv, gfloat scale); #endif mhwaveedit-1.4.24/src/combinechannelsdialog.c000066400000000000000000000120041334022513400211740ustar00rootroot00000000000000/* * Copyright (C) 2002 2003 2004 2005, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include #include "mainwindow.h" #include "combinechannelsdialog.h" #include "effectbrowser.h" #include "main.h" static GtkObjectClass *parent_class; static sample_t *combination_matrix; static sample_t *samples = NULL; static gboolean combine_channels_dialog_apply_proc(void *in, guint sample_size, chunk_writeout_func out_func, WriteoutID id, Dataformat *format) { sample_t *s = (sample_t *)in, d; guint i,j,chn=format->channels; if (!samples) samples = g_malloc(sample_size); for (i=0; ieb)->dl->selected; CombineChannelsDialog *ccd = COMBINE_CHANNELS_DIALOG(ed); g_assert(ccd->channels == d->chunk->format.channels); for (i=0; ichannels*ccd->channels; i++) if (floatbox_check(ccd->combination_matrix[i])) return TRUE; combination_matrix =g_malloc(ccd->channels*ccd->channels*sizeof(sample_t)); for (i=0; ichannels*ccd->channels; i++) combination_matrix[i] = ccd->combination_matrix[i]->val / 100.0; b = document_apply(d,combine_channels_dialog_apply_proc,NULL, CHUNK_FILTER_FULL,TRUE,NULL); g_free(samples); samples = NULL; g_free(combination_matrix); return b; } static void combine_channels_dialog_target_changed(EffectDialog *ed) { CombineChannelsDialog *ccd = COMBINE_CHANNELS_DIALOG(ed); if (ccd->channels != EFFECT_BROWSER(ed->eb)->dl->format.channels) effect_browser_invalidate_effect(EFFECT_BROWSER(ed->eb),"combine", 'B'); } static void combine_channels_setup(EffectDialog *ed) { int i,j; GtkWidget *a,*b,*c; guint channels = EFFECT_BROWSER(ed->eb)->dl->format.channels; CombineChannelsDialog *ccd = COMBINE_CHANNELS_DIALOG(ed); ccd->channels = channels; ccd->combination_matrix = g_malloc(channels*channels*sizeof(Floatbox *)); for (i=0; icombination_matrix[i] = FLOATBOX(floatbox_new( (i%(channels+1)==0) ? 100.0 : 0.0 )); for (i=0; ichannels; i++) { a=gtk_frame_new(channel_name(i,channels)); gtk_container_set_border_width(GTK_CONTAINER(a),3); gtk_box_pack_start(GTK_BOX(ed->input_area),a,FALSE,FALSE,0); gtk_widget_show(a); b = gtk_table_new(channels,3,FALSE); gtk_container_add(GTK_CONTAINER(a),b); gtk_widget_show(b); for (j=0; jcombination_matrix[i*channels+j]); gtk_table_attach(GTK_TABLE(b),c,1,2,j,j+1,GTK_FILL,0,3,3); gtk_widget_show(c); c = gtk_label_new("%"); gtk_table_attach(GTK_TABLE(b),c,2,3,j,j+1,GTK_FILL,0,0,3); gtk_widget_show(c); } } } static void combine_channels_destroy(GtkObject *obj) { CombineChannelsDialog *ccd = COMBINE_CHANNELS_DIALOG(obj); g_free(ccd->combination_matrix); ccd->combination_matrix = NULL; parent_class->destroy(obj); } static void combine_channels_dialog_class_init(EffectDialogClass *klass) { parent_class = gtk_type_class(effect_dialog_get_type()); klass->apply = combine_channels_dialog_apply; klass->setup = combine_channels_setup; klass->target_changed = combine_channels_dialog_target_changed; GTK_OBJECT_CLASS(klass)->destroy = combine_channels_destroy; } static void combine_channels_dialog_init(CombineChannelsDialog *obj) { } GtkType combine_channels_dialog_get_type(void) { static GtkType id = 0; if (!id) { GtkTypeInfo info = { "CombineChannelsDialog", sizeof(CombineChannelsDialog), sizeof(CombineChannelsDialogClass), (GtkClassInitFunc)combine_channels_dialog_class_init, (GtkObjectInitFunc)combine_channels_dialog_init }; id = gtk_type_unique(effect_dialog_get_type(),&info); } return id; } mhwaveedit-1.4.24/src/combinechannelsdialog.h000066400000000000000000000030351334022513400212050ustar00rootroot00000000000000/* * Copyright (C) 2002 2003 2004, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #ifndef COMBINECHANNELSDIALOG_H_INCLUDED #define COMBINECHANNELSDIALOG_H_INCLUDED #include #include "effectdialog.h" #include "float_box.h" #define COMBINE_CHANNELS_DIALOG(obj) GTK_CHECK_CAST(obj,combine_channels_dialog_get_type(),CombineChannelsDialog) #define COMBINE_CHANNELS_DIALOG_CLASS(klass) GTK_CHECK_CLASS_CAST(klass,combine_channels_dialog_get_type(),CombineChannelsDialogClass) #define IS_COMBINE_CHANNELS_DIALOG(obj) GTK_CHECK_TYPE(obj,combine_channels_dialog_get_type()) typedef struct { EffectDialog ed; guint channels; Floatbox **combination_matrix; } CombineChannelsDialog; typedef struct { EffectDialogClass edc; } CombineChannelsDialogClass; GtkType combine_channels_dialog_get_type(); #endif mhwaveedit-1.4.24/src/combo.c000066400000000000000000000214571334022513400157770ustar00rootroot00000000000000/* * Copyright (C) 2004 2006 2009, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include #include "combo.h" enum { CHANGED_SIGNAL, LAST_SIGNAL }; static guint combo_signals[LAST_SIGNAL] = { 0 }; static gboolean updating_flag = FALSE; static GtkObjectClass *parent_class; static void combo_size_request(GtkWidget *widget, GtkRequisition *req) { Combo *obj = COMBO(widget); GTK_WIDGET_CLASS(parent_class)->size_request(widget,req); if (obj->max_request_width >= 0 && req->width > obj->max_request_width) req->width = obj->max_request_width; } #ifdef COMBO_OLDSCHOOL static void combo_class_init(GtkObjectClass *klass) { parent_class = gtk_type_class(COMBO_PARENT_TYPE_FUNC()); COMBO_CLASS(klass)->selection_changed = NULL; combo_signals[CHANGED_SIGNAL] = gtk_signal_new("selection_changed",GTK_RUN_LAST, GTK_CLASS_TYPE(klass), GTK_SIGNAL_OFFSET(ComboClass,selection_changed), gtk_marshal_NONE__NONE,GTK_TYPE_NONE,0); gtk_object_class_add_signals(klass,combo_signals,LAST_SIGNAL); GTK_WIDGET_CLASS(klass)->size_request = combo_size_request; } static void hide_popup(GtkWidget *widget, Combo *combo) { int i = combo->next_chosen_index; if (i >= 0) { combo->next_chosen_index = -1; combo_set_selection(combo,i); } } static void list_select_child(GtkList *list, GtkWidget *child, gpointer user_data) { Combo *combo = COMBO(user_data); int idx; if (updating_flag) return; idx = gtk_list_child_position(list,child); if (GTK_WIDGET_VISIBLE(GTK_COMBO(combo)->popwin)) { combo->next_chosen_index = idx; return; } combo->chosen_index = idx; gtk_signal_emit(GTK_OBJECT(combo),combo_signals[CHANGED_SIGNAL]); } static gboolean list_motion_notify(GtkWidget *widget, GdkEventMotion *event, gpointer user_data) { gint mx,my; gint wx,wy,ww,wh; gdk_window_get_root_origin(widget->window,&wx,&wy); gdk_window_get_size(widget->window,&ww,&wh); mx = (gint) (event->x_root); my = (gint) (event->y_root); /*printf("mouse: <%d,%d>, window: <%d,%d>+<%d,%d>\n",mx,my,wx,wy,ww,wh);*/ if (mx < wx || mx > wx+ww || my < wy || my > wy+wh) gtk_signal_emit_stop_by_name(GTK_OBJECT(widget), "motion-notify-event"); return FALSE; } static void combo_init(GtkObject *obj) { GtkCombo *cbo = GTK_COMBO(obj); COMBO(obj)->chosen_index = 0; COMBO(obj)->next_chosen_index = -1; COMBO(obj)->max_request_width = -1; gtk_editable_set_editable(GTK_EDITABLE(cbo->entry),FALSE); gtk_signal_connect(GTK_OBJECT(cbo->list),"select_child",list_select_child, obj); gtk_signal_connect(GTK_OBJECT(cbo->list),"motion-notify-event", GTK_SIGNAL_FUNC(list_motion_notify),obj); gtk_signal_connect_after(GTK_OBJECT(GTK_COMBO(cbo)->popwin),"hide", GTK_SIGNAL_FUNC(hide_popup),cbo); } void combo_set_items(Combo *combo, GList *item_strings, int default_index) { updating_flag = TRUE; gtk_combo_set_popdown_strings(GTK_COMBO(combo),item_strings); if (default_index < g_list_length(item_strings) && default_index >= 0) { gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(combo)->entry), (gchar *)g_list_nth_data(item_strings, default_index)); combo->chosen_index = default_index; } else combo->chosen_index = 0; updating_flag = FALSE; gtk_signal_emit(GTK_OBJECT(combo),combo_signals[CHANGED_SIGNAL]); } void combo_set_selection(Combo *combo, int item_index) { gtk_list_select_item(GTK_LIST(GTK_COMBO(combo)->list),item_index); } int combo_selected_index(Combo *combo) { return combo->chosen_index; } char *combo_selected_string(Combo *combo) { return g_strdup(gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(combo)->entry))); } void combo_remove_item(Combo *combo, int item_index) { g_assert(item_index != combo->chosen_index); gtk_list_clear_items(GTK_LIST(GTK_COMBO(combo)->list),item_index, item_index+1); if (item_index < combo->chosen_index) combo->chosen_index--; } #else static void combo_destroy(GtkObject *obj) { Combo *combo = COMBO(obj); if (combo->strings) { g_list_foreach(combo->strings, (GFunc)g_free, NULL); g_list_free(combo->strings); combo->strings = NULL; } parent_class->destroy(obj); } static void combo_changed(GtkComboBox *combo) { if (!updating_flag) gtk_signal_emit(GTK_OBJECT(combo),combo_signals[CHANGED_SIGNAL]); if (GTK_COMBO_BOX_CLASS(parent_class)->changed) GTK_COMBO_BOX_CLASS(parent_class)->changed(combo); } static void combo_class_init(GtkObjectClass *klass) { parent_class = gtk_type_class(COMBO_PARENT_TYPE_FUNC()); klass->destroy = combo_destroy; GTK_COMBO_BOX_CLASS(klass)->changed = combo_changed; COMBO_CLASS(klass)->selection_changed = NULL; GTK_WIDGET_CLASS(klass)->size_request = combo_size_request; combo_signals[CHANGED_SIGNAL] = gtk_signal_new("selection_changed",GTK_RUN_LAST, GTK_CLASS_TYPE(klass), GTK_SIGNAL_OFFSET(ComboClass,selection_changed), gtk_marshal_NONE__NONE,GTK_TYPE_NONE,0); gtk_object_class_add_signals(klass,combo_signals,LAST_SIGNAL); } static void combo_init(GtkObject *obj) { /* Most of this was taken from the code for gtk_combo_box_new_text in * GTK+ 2.4.13 */ GtkWidget *combo_box = GTK_WIDGET(obj); GtkCellRenderer *cell; GtkListStore *store; store = gtk_list_store_new (1, G_TYPE_STRING); gtk_combo_box_set_model (GTK_COMBO_BOX(combo_box),GTK_TREE_MODEL (store)); g_object_unref (store); cell = gtk_cell_renderer_text_new (); gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo_box), cell, TRUE); gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combo_box), cell, "text", 0, NULL); COMBO(obj)->strings = NULL; COMBO(obj)->max_request_width = -1; } void combo_set_items(Combo *combo, GList *item_strings, int default_index) { GList *l; gchar *c; int len; updating_flag = TRUE; for (l=combo->strings; l!=NULL; l=l->next) { g_free(l->data); gtk_combo_box_remove_text(GTK_COMBO_BOX(combo),0); } g_list_free(combo->strings); combo->strings = NULL; for (l=item_strings,len=0; l!=NULL; l=l->next,len++) { c = (gchar *)l->data; gtk_combo_box_append_text(GTK_COMBO_BOX(combo),c); combo->strings = g_list_append(combo->strings,g_strdup(c)); } if (default_index >= len || default_index < 0) default_index = 0; gtk_combo_box_set_active(GTK_COMBO_BOX(combo),default_index); updating_flag = FALSE; gtk_signal_emit(GTK_OBJECT(combo),combo_signals[CHANGED_SIGNAL]); } void combo_set_selection(Combo *combo, int item_index) { gtk_combo_box_set_active(GTK_COMBO_BOX(combo),item_index); } int combo_selected_index(Combo *combo) { return gtk_combo_box_get_active(GTK_COMBO_BOX(combo)); } char *combo_selected_string(Combo *combo) { int i; char *c; i = combo_selected_index(combo); /* j = g_list_length(combo->strings); printf("combo_selected_string: i=%d, len=%d\n",i,j); */ c = g_strdup(g_list_nth_data(combo->strings,i)); /* printf(" c=%s\n",c); */ return c; } void combo_remove_item(Combo *combo, int item_index) { int i; gchar *c; i = combo_selected_index(combo); g_assert(i != item_index); gtk_combo_box_remove_text(GTK_COMBO_BOX(combo),item_index); c = (gchar *)g_list_nth_data(combo->strings,item_index); /* printf("Removing: selected_index %d, string %s\n",i,c); */ combo->strings = g_list_remove(combo->strings,c); g_free(c); } #endif GtkType combo_get_type(void) { static GtkType id = 0; if (!id) { GtkTypeInfo info = { "Combo", sizeof(Combo), sizeof(ComboClass), (GtkClassInitFunc)combo_class_init, (GtkObjectInitFunc)combo_init }; id = gtk_type_unique(COMBO_PARENT_TYPE_FUNC(),&info); } return id; } GtkWidget *combo_new(void) { return (GtkWidget *)gtk_type_new(combo_get_type()); } void combo_set_max_request_width(Combo *c, int width) { c->max_request_width = width; } mhwaveedit-1.4.24/src/combo.h000066400000000000000000000050471334022513400160010ustar00rootroot00000000000000/* * Copyright (C) 2002 2003 2004 2009, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ /* This is a dropdown read-only combo box with text items. Under GTK 1.2-2.2 * this is done as a subclass of GtkCombo with some extra trickery and under * 2.4 and later it's a simple subclass of GtkComboBox. */ #ifndef COMBO_H_INCLUDED #define COMBO_H_INCLUDED #include "main.h" #define COMBO(obj) GTK_CHECK_CAST(obj,combo_get_type(),Combo) #define COMBO_CLASS(klass) GTK_CHECK_CLASS_CAST(klass,combo_get_type(),ComboClass) #define IS_COMBO(obj) GTK_CHECK_TYPE(obj,combo_get_type()) #if (GTK_MAJOR_VERSION == 1) || (GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION < 4) #define COMBO_OLDSCHOOL #define COMBO_PARENT_TYPE GtkCombo #define COMBO_PARENT_CLASS GtkComboClass #define COMBO_PARENT_TYPE_FUNC gtk_combo_get_type #else #define COMBO_PARENT_TYPE GtkComboBox #define COMBO_PARENT_CLASS GtkComboBoxClass #define COMBO_PARENT_TYPE_FUNC gtk_combo_box_get_type #endif typedef struct { COMBO_PARENT_TYPE parent; #ifdef COMBO_OLDSCHOOL int chosen_index, next_chosen_index; #else /* Until GTK+ 2.6 comes out with the gtk_combo_box_get_active_text function, this will have to make do. */ GList *strings; #endif int max_request_width; } Combo; typedef struct { COMBO_PARENT_CLASS parent_class; void (*selection_changed)(Combo *obj); } ComboClass; GtkType combo_get_type(void); GtkWidget *combo_new(void); void combo_set_items(Combo *combo, GList *item_strings, int default_index); void combo_set_selection(Combo *combo, int item_index); /* The removed item must not be currently selected */ void combo_remove_item(Combo *combo, int item_index); int combo_selected_index(Combo *combo); /* Result must be freed by caller */ char *combo_selected_string(Combo *combo); void combo_set_max_request_width(Combo *c, int w); #endif mhwaveedit-1.4.24/src/configdialog.c000066400000000000000000001372611334022513400173260ustar00rootroot00000000000000/* * Copyright (C) 2002 2003 2004 2005 2008 2009 2010 2011 2012, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include #include #include #include "sound.h" #include "inifile.h" #include "main.h" #include "configdialog.h" #include "um.h" #include "mainwindow.h" #include "tempfile.h" #include "player.h" #include "rateconv.h" #include "gettext.h" #include "filetypes.h" static GtkObjectClass *parent_class; static void config_dialog_destroy(GtkObject *obj) { ConfigDialog *cd = CONFIG_DIALOG(obj); cd->selected_tempdir = NULL; parent_class->destroy(obj); } static void config_dialog_class_init(GtkObjectClass *klass) { parent_class = gtk_type_class(gtk_window_get_type()); klass->destroy = config_dialog_destroy; } static void config_dialog_ok(GtkButton *button, gpointer user_data) { gchar *c; gboolean b = FALSE; GList *la,*lb; GtkWidget *w; ConfigDialog *cd = CONFIG_DIALOG(user_data); if (intbox_check(cd->sound_buffer_size) || intbox_check(cd->disk_threshold) || intbox_check(cd->view_quality) || intbox_check_limit(cd->recent_files,0,MAINWINDOW_RECENT_MAX, _("number of recent files")) || intbox_check_limit(cd->vzoom_max,1,9999, _("maximum vertical zoom")) || format_selector_check(cd->fallback_format)) return; /* c = (gchar *)gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(cd->sound_driver)->entry)); */ c = sound_driver_id_from_index(combo_selected_index(cd->sound_driver)); g_assert(c != NULL); if (gtk_toggle_button_get_active(cd->driver_autodetect)) inifile_set(INI_SETTING_SOUNDDRIVER,"auto"); else b = inifile_set(INI_SETTING_SOUNDDRIVER,c) || b; b = inifile_set_guint32(INI_SETTING_SOUNDBUFSIZE, cd->sound_buffer_size->val) || b; if (b) user_info(_("Some of the settings you have changed will not be " "activated until you restart the program")); inifile_set_guint32(INI_SETTING_REALMAX,cd->disk_threshold->val*1024); inifile_set_guint32(INI_SETTING_VIEW_QUALITY, cd->view_quality->val); inifile_set_gboolean(INI_SETTING_TIMESCALE, gtk_toggle_button_get_active(cd->time_scale_default)); inifile_set_gboolean(INI_SETTING_VZOOM, gtk_toggle_button_get_active(cd->vzoom_default)); inifile_set_gboolean(INI_SETTING_HZOOM, gtk_toggle_button_get_active(cd->hzoom_default)); inifile_set_gboolean(INI_SETTING_SPEED, gtk_toggle_button_get_active(cd->speed_default)); inifile_set_gboolean(INI_SETTING_SLABELS, gtk_toggle_button_get_active(cd->labels_default)); inifile_set_gboolean(INI_SETTING_BUFPOS, gtk_toggle_button_get_active(cd->bufpos_default)); inifile_set(INI_SETTING_MIXER, (char *)gtk_entry_get_text(cd->mixer_utility)); inifile_set_gboolean("useGeometry", gtk_toggle_button_get_active(cd->remember_geometry)); inifile_set_gboolean("drawImprove", gtk_toggle_button_get_active(cd->improve)); inifile_set_gboolean("mainwinFront", gtk_toggle_button_get_active(cd->mainwin_front)); default_time_mode = combo_selected_index(cd->time_display); inifile_set_guint32(INI_SETTING_TIME_DISPLAY,default_time_mode); default_time_mode = combo_selected_index(cd->time_display); inifile_set_guint32(INI_SETTING_TIME_DISPLAY,default_time_mode); default_timescale_mode = combo_selected_index(cd->time_display_timescale); inifile_set_guint32(INI_SETTING_TIME_DISPLAY_SCALE,default_timescale_mode); sound_lock_driver = gtk_toggle_button_get_active(cd->sound_lock); inifile_set_gboolean("soundLock",sound_lock_driver); status_bar_roll_cursor = gtk_toggle_button_get_active(cd->roll_cursor); inifile_set_gboolean("rollCursor",status_bar_roll_cursor); output_byteswap_flag = gtk_toggle_button_get_active(cd->output_bswap); inifile_set_gboolean("outputByteswap",output_byteswap_flag); output_stereo_flag = gtk_toggle_button_get_active(cd->output_stereo); inifile_set_gboolean("outputStereo",output_stereo_flag); view_follow_strict_flag = gtk_toggle_button_get_active(cd->center_cursor); inifile_set_gboolean("centerCursor",view_follow_strict_flag); autoplay_mark_flag = gtk_toggle_button_get_active(cd->mark_autoplay); inifile_set_gboolean("autoPlayMark",autoplay_mark_flag); la = gtk_container_children(GTK_CONTAINER(cd->tempdirs)); lb = NULL; for (; la != NULL; la = la->next) { w = GTK_WIDGET(la->data); w = GTK_BIN(w)->child; gtk_label_get(GTK_LABEL(w),&c); lb = g_list_append(lb,c); } set_temp_directories(lb); g_list_free(lb); inifile_set_guint32("recentFiles",cd->recent_files->val); inifile_set_guint32("vzoomMax",cd->vzoom_max->val); format_selector_get(cd->fallback_format,&player_fallback_format); format_selector_save_to_inifile(cd->fallback_format,"playerFallback"); chunk_filter_use_floating_tempfiles = gtk_toggle_button_get_active(cd->floating_tempfiles); inifile_set_gboolean("tempfilesFP",chunk_filter_use_floating_tempfiles); varispeed_reset_flag = gtk_toggle_button_get_active(cd->varispeed_autoreset); inifile_set_gboolean("speedReset",varispeed_reset_flag); varispeed_smooth_flag = !gtk_toggle_button_get_active(cd->varispeed_fast); inifile_set_gboolean("speedSmooth",varispeed_smooth_flag); b = gtk_toggle_button_get_active(cd->varispeed_enable); inifile_set_gboolean("varispeed",b); mainwindow_set_speed_sensitive(b); inifile_set_guint32("varispeedConv", combo_selected_index(cd->varispeed_method)); inifile_set_guint32("speedConv",combo_selected_index(cd->speed_method)); dither_editing = gtk_toggle_button_get_active(cd->dither_editing); inifile_set_guint32("ditherEditing", dither_editing?DITHER_MINIMAL:DITHER_NONE); dither_playback = gtk_toggle_button_get_active(cd->dither_playback); inifile_set_guint32("ditherPlayback", dither_playback?DITHER_MINIMAL:DITHER_NONE); if (sndfile_ogg_supported()) inifile_set_guint32("sndfileOggMode", combo_selected_index(cd->oggmode)); sample_convert_mode = combo_selected_index(cd->convmode); inifile_set_guint32("sampleMode",sample_convert_mode); gtk_widget_destroy(GTK_WIDGET(cd)); mainwindow_update_texts(); } static void sound_settings_click(GtkButton *button, gpointer user_data) { ConfigDialog *cd = CONFIG_DIALOG(user_data); sound_driver_show_preferences( sound_driver_id_from_index(combo_selected_index(cd->sound_driver))); } static void sound_driver_changed(Combo *combo, gpointer user_data) { ConfigDialog *cd = CONFIG_DIALOG(user_data); gchar *c; c = combo_selected_string(combo); gtk_widget_set_sensitive(GTK_WIDGET(cd->sound_driver_prefs), sound_driver_has_preferences( sound_driver_id_from_name(c))); g_free(c); } static gboolean color_expose(GtkWidget *widget, GdkEventExpose *event, gpointer user_data) { GdkColor *c = (GdkColor *)user_data; GdkGC *gc; gc = gdk_gc_new(widget->window); gdk_gc_set_foreground(gc,c); gdk_draw_rectangle(widget->window,gc,TRUE, event->area.x,event->area.y,event->area.width, event->area.height); gdk_gc_unref(gc); return TRUE; } static void color_select(GtkList *list, GtkWidget *widget, gpointer user_data) { GtkColorSelection *cs = GTK_COLOR_SELECTION(user_data); GdkColor *c = (GdkColor *)gtk_object_get_user_data(GTK_OBJECT(widget)); gdouble color[4]; gtk_object_set_user_data(GTK_OBJECT(cs),widget); color[0] = ((gdouble)(c->red))/65535.0; color[1] = ((gdouble)(c->green))/65535.0; color[2] = ((gdouble)(c->blue))/65535.0; color[3] = 1.0; gtk_color_selection_set_color(cs,color); #if GTK_MAJOR_VERSION == 1 gtk_color_selection_set_color(cs,color); #endif #if GTK_MAJOR_VERSION == 2 gtk_color_selection_set_previous_color(cs, c); #endif } static void color_set(GtkColorSelection *selection, gpointer user_data) { gdouble color[4]; GtkWidget *widget; GdkColor *c; gtk_color_selection_get_color(selection,color); widget = GTK_WIDGET(gtk_object_get_user_data(GTK_OBJECT(selection))); c = gtk_object_get_user_data(GTK_OBJECT(widget)); c->red = (guint)(color[0]*65535.0); c->green = (guint)(color[1]*65535.0); c->blue = (guint)(color[2]*65535.0); gdk_colormap_alloc_color(gdk_colormap_get_system(),c,FALSE,TRUE); gtk_widget_queue_draw(widget); } static void color_apply(GtkButton *button, gpointer user_data) { GdkColor *c = (GdkColor *)user_data; set_custom_colors(c); } static void colors_click(GtkButton *button, gpointer user_data) { GtkWidget *a,*b,*c,*d,*e,*f,*g; GtkWidget *cs; gint i,key; ConfigDialog *cd = CONFIG_DIALOG(user_data); GdkColor *ctable; GtkAccelGroup* ag; ag = gtk_accel_group_new(); ctable = g_malloc((LAST_COLOR-FIRST_CUSTOM_COLOR)*sizeof(GdkColor)); for (i=FIRST_CUSTOM_COLOR; ichild),_("_Preview")); gtk_widget_add_accelerator (d, "clicked", ag, key, GDK_MOD1_MASK, (GtkAccelFlags) 0); gtk_signal_connect(GTK_OBJECT(d),"clicked",GTK_SIGNAL_FUNC(color_apply), ctable); gtk_container_add(GTK_CONTAINER(c),d); d = gtk_button_new_with_label(""); key = gtk_label_parse_uline(GTK_LABEL(GTK_BIN(d)->child),_("_OK")); gtk_widget_add_accelerator (d, "clicked", ag, key, GDK_MOD1_MASK, (GtkAccelFlags) 0); gtk_signal_connect(GTK_OBJECT(d),"clicked",GTK_SIGNAL_FUNC(color_apply), ctable); gtk_signal_connect(GTK_OBJECT(d),"clicked",GTK_SIGNAL_FUNC(save_colors), NULL); gtk_signal_connect_object(GTK_OBJECT(d),"clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy), (GtkObject *)a); gtk_signal_connect_object(GTK_OBJECT(d),"clicked", GTK_SIGNAL_FUNC(g_free),(GtkObject *)ctable); gtk_container_add(GTK_CONTAINER(c),d); GTK_WIDGET_SET_FLAGS(d,GTK_CAN_DEFAULT); gtk_widget_grab_default(d); d = gtk_button_new_with_label(""); key = gtk_label_parse_uline(GTK_LABEL(GTK_BIN(d)->child),_("_Cancel")); gtk_widget_add_accelerator (d, "clicked", ag, key, GDK_MOD1_MASK, (GtkAccelFlags) 0); gtk_widget_add_accelerator (d, "clicked", ag, GDK_Escape, 0, (GtkAccelFlags) 0); gtk_signal_connect_object(GTK_OBJECT(d),"clicked", GTK_SIGNAL_FUNC(set_custom_colors), (GtkObject *)NULL); gtk_signal_connect_object(GTK_OBJECT(d),"clicked", GTK_SIGNAL_FUNC(g_free),(GtkObject *)ctable); gtk_signal_connect_object(GTK_OBJECT(d),"clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy), (GtkObject *)a); gtk_container_add(GTK_CONTAINER(c),d); gtk_widget_show_all(a); gtk_window_add_accel_group(GTK_WINDOW (a), ag); } static void tempdir_add_click(GtkButton *button, gpointer user_data) { ConfigDialog *cd = CONFIG_DIALOG(user_data); GtkWidget *w; gchar *ch; ch = (gchar *)gtk_entry_get_text(cd->tempdir_add_entry); if (ch[0] == 0) return; w = gtk_list_item_new_with_label(ch); gtk_container_add(GTK_CONTAINER(cd->tempdirs),w); gtk_widget_show(w); gtk_entry_set_text(cd->tempdir_add_entry,""); } static void tempdir_remove_click(GtkButton *button, gpointer user_data) { ConfigDialog *cd = CONFIG_DIALOG(user_data); gtk_container_remove(GTK_CONTAINER(cd->tempdirs),cd->selected_tempdir); } static void tempdir_up_click(GtkButton *button, gpointer user_data) { ConfigDialog *cd = CONFIG_DIALOG(user_data); GtkWidget *w; GList *l; gint pos; w = cd->selected_tempdir; pos = gtk_list_child_position(cd->tempdirs,w); if (pos == 0) return; gtk_object_ref(GTK_OBJECT(w)); gtk_container_remove(GTK_CONTAINER(cd->tempdirs),w); l = g_list_append(NULL,w); gtk_list_insert_items(cd->tempdirs,l,pos-1); gtk_list_toggle_row(cd->tempdirs,w); gtk_object_unref(GTK_OBJECT(w)); } static void tempdir_down_click(GtkButton *button, gpointer user_data) { ConfigDialog *cd = CONFIG_DIALOG(user_data); GtkWidget *w; GList *l; gint pos; w = cd->selected_tempdir; pos = gtk_list_child_position(cd->tempdirs,w); /* if (pos == 0) return; */ gtk_object_ref(GTK_OBJECT(w)); gtk_container_remove(GTK_CONTAINER(cd->tempdirs),w); l = g_list_append(NULL,w); gtk_list_insert_items(cd->tempdirs,l,pos+1); gtk_list_toggle_row(cd->tempdirs,w); gtk_object_unref(GTK_OBJECT(w)); } static void tempdir_browse_click(GtkButton *button, gpointer user_data) { ConfigDialog *cd = CONFIG_DIALOG(user_data); gchar *c,*d; c = (gchar *)gtk_entry_get_text(cd->tempdir_add_entry); d = get_directory(c,_("Browse directory")); if (d != NULL) { gtk_entry_set_text(cd->tempdir_add_entry,d); g_free(d); } } static void tempdir_select(GtkList *list, GtkWidget *widget, gpointer user_data) { ConfigDialog *cd = CONFIG_DIALOG(user_data); cd->selected_tempdir = widget; gtk_widget_set_sensitive(GTK_WIDGET(cd->tempdir_remove),TRUE); gtk_widget_set_sensitive(GTK_WIDGET(cd->tempdir_up),TRUE); gtk_widget_set_sensitive(GTK_WIDGET(cd->tempdir_down),TRUE); } static void tempdir_unselect(GtkList *list, GtkWidget *widget, gpointer user_data) { ConfigDialog *cd = CONFIG_DIALOG(user_data); if (cd->selected_tempdir == widget) { cd->selected_tempdir = NULL; gtk_widget_set_sensitive(GTK_WIDGET(cd->tempdir_remove),FALSE); gtk_widget_set_sensitive(GTK_WIDGET(cd->tempdir_up),FALSE); gtk_widget_set_sensitive(GTK_WIDGET(cd->tempdir_down),FALSE); } } static void driver_autodetect_toggled(GtkToggleButton *button, gpointer user_data) { ConfigDialog *cd = CONFIG_DIALOG(user_data); gboolean b; b = gtk_toggle_button_get_active(button); if (b) combo_set_selection(cd->sound_driver,sound_driver_index()); gtk_widget_set_sensitive(GTK_WIDGET(cd->sound_driver), !b); } static void config_dialog_init(ConfigDialog *cd) { GtkWidget *w,*a,*b,*c,*d,*e,*f,*g,*h; GList *l; GtkAccelGroup *ag; guint key,i,j; gchar *ch; ag = gtk_accel_group_new(); gtk_window_set_title(GTK_WINDOW(cd),_("Preferences")); gtk_window_set_modal(GTK_WINDOW(cd),TRUE); gtk_window_set_position(GTK_WINDOW (cd), GTK_WIN_POS_CENTER); gtk_window_set_default_size(GTK_WINDOW(cd),10,400); gtk_container_set_border_width(GTK_CONTAINER(cd),5); /* Create the main widgets */ w = intbox_new( inifile_get_guint32( INI_SETTING_REALMAX, INI_SETTING_REALMAX_DEFAULT )/1024); cd->disk_threshold = INTBOX(w); w = intbox_new(inifile_get_guint32(INI_SETTING_SOUNDBUFSIZE, INI_SETTING_SOUNDBUFSIZE_DEFAULT)); cd->sound_buffer_size = INTBOX(w); w = combo_new(); cd->sound_driver = COMBO(w); l = sound_driver_valid_names(); combo_set_items(cd->sound_driver,l,sound_driver_index()); gtk_signal_connect(GTK_OBJECT(cd->sound_driver),"selection_changed", GTK_SIGNAL_FUNC(sound_driver_changed),cd); i = rateconv_driver_count(TRUE); for (l=NULL,j=0; jvarispeed_method = COMBO(w); j = inifile_get_guint32("varispeedConv",i-1); if (j >= i) j = i-1; combo_set_items(cd->varispeed_method, l, j); g_list_free(l); i = rateconv_driver_count(FALSE); for (l=NULL,j=0; jspeed_method = COMBO(w); j = inifile_get_guint32("speedConv",0); if (j >= i) j = 0; combo_set_items(cd->speed_method, l, j); g_list_free(l); w = gtk_entry_new(); cd->mixer_utility = GTK_ENTRY(w); gtk_entry_set_text(cd->mixer_utility,inifile_get(INI_SETTING_MIXER, INI_SETTING_MIXER_DEFAULT)); w = intbox_new(inifile_get_guint32(INI_SETTING_VIEW_QUALITY, INI_SETTING_VIEW_QUALITY_DEFAULT)); cd->view_quality = INTBOX(w); w = gtk_check_button_new_with_label(""); key = gtk_label_parse_uline(GTK_LABEL (GTK_BIN (w)->child), _("Show _time scale by default")); gtk_widget_add_accelerator (w, "clicked", ag, key, GDK_MOD1_MASK, (GtkAccelFlags) 0); cd->time_scale_default = GTK_TOGGLE_BUTTON(w); gtk_toggle_button_set_active(cd->time_scale_default,inifile_get_gboolean( INI_SETTING_TIMESCALE, INI_SETTING_TIMESCALE_DEFAULT)); w = gtk_check_button_new_with_label(""); key = gtk_label_parse_uline(GTK_LABEL (GTK_BIN (w)->child), _("Show _horizontal zoom slider by default")); gtk_widget_add_accelerator (w, "clicked", ag, key, GDK_MOD1_MASK, (GtkAccelFlags) 0); cd->hzoom_default = GTK_TOGGLE_BUTTON(w); gtk_toggle_button_set_active(cd->hzoom_default,inifile_get_gboolean( INI_SETTING_HZOOM, INI_SETTING_HZOOM_DEFAULT)); w = gtk_check_button_new_with_label(""); key = gtk_label_parse_uline(GTK_LABEL (GTK_BIN (w)->child), _("Show _vertical zoom slider by default")); gtk_widget_add_accelerator (w, "clicked", ag, key, GDK_MOD1_MASK, (GtkAccelFlags) 0); cd->vzoom_default = GTK_TOGGLE_BUTTON(w); gtk_toggle_button_set_active(cd->vzoom_default,inifile_get_gboolean( INI_SETTING_VZOOM, INI_SETTING_VZOOM_DEFAULT)); w = gtk_check_button_new_with_label(""); key = gtk_label_parse_uline(GTK_LABEL (GTK_BIN (w)->child), _("Show _speed slider by default")); gtk_widget_add_accelerator (w, "clicked", ag, key, GDK_MOD1_MASK, (GtkAccelFlags) 0); cd->speed_default = GTK_TOGGLE_BUTTON(w); gtk_toggle_button_set_active(cd->speed_default,inifile_get_gboolean( INI_SETTING_SPEED, INI_SETTING_SPEED_DEFAULT)); w = gtk_check_button_new_with_label(""); key = gtk_label_parse_uline(GTK_LABEL (GTK_BIN (w)->child), _("Show slider l_abels by default")); gtk_widget_add_accelerator (w, "clicked", ag, key, GDK_MOD1_MASK, (GtkAccelFlags) 0); cd->labels_default = GTK_TOGGLE_BUTTON(w); gtk_toggle_button_set_active(cd->labels_default, inifile_get_gboolean(INI_SETTING_SLABELS, INI_SETTING_SLABELS_DEFAULT)); w = gtk_check_button_new_with_label(""); key = gtk_label_parse_uline(GTK_LABEL (GTK_BIN (w)->child), _("Show playback buffer positio_n by default")); gtk_widget_add_accelerator (w, "clicked", ag, key, GDK_MOD1_MASK, (GtkAccelFlags) 0); cd->bufpos_default = GTK_TOGGLE_BUTTON(w); gtk_toggle_button_set_active(cd->bufpos_default, inifile_get_gboolean(INI_SETTING_BUFPOS, INI_SETTING_BUFPOS_DEFAULT)); w = gtk_button_new_with_label(""); key = gtk_label_parse_uline(GTK_LABEL(GTK_BIN(w)->child), _("_Settings")); gtk_widget_add_accelerator(w, "clicked", ag, key, GDK_MOD1_MASK, (GtkAccelFlags) 0); gtk_signal_connect(GTK_OBJECT(w),"clicked", GTK_SIGNAL_FUNC(sound_settings_click),cd); gtk_widget_set_sensitive(w,sound_driver_has_preferences(NULL)); cd->sound_driver_prefs = GTK_BUTTON(w); w = gtk_check_button_new_with_label(""); key = gtk_label_parse_uline(GTK_LABEL (GTK_BIN (w)->child), _("_Keep sound driver opened (to avoid start/stop" " clicks)")); gtk_widget_add_accelerator (w, "clicked", ag, key, GDK_MOD1_MASK, (GtkAccelFlags) 0); cd->sound_lock = GTK_TOGGLE_BUTTON(w); gtk_toggle_button_set_active(cd->sound_lock,sound_lock_driver); w = gtk_check_button_new_with_label(""); key = gtk_label_parse_uline(GTK_LABEL(GTK_BIN(w)->child), _("_Byte-swap output (try this if playback " "sounds horrible)")); gtk_widget_add_accelerator(w,"clicked",ag,key,GDK_MOD1_MASK, (GtkAccelFlags)0); cd->output_bswap = GTK_TOGGLE_BUTTON(w); gtk_toggle_button_set_active(cd->output_bswap,output_byteswap_flag); w = gtk_check_button_new_with_label(""); key = gtk_label_parse_uline(GTK_LABEL(GTK_BIN(w)->child), _("Play _mono files as stereo")); gtk_widget_add_accelerator(w,"clicked",ag,key,GDK_MOD1_MASK, (GtkAccelFlags)0); cd->output_stereo = GTK_TOGGLE_BUTTON(w); gtk_toggle_button_set_active(cd->output_stereo,output_stereo_flag); w = gtk_check_button_new_with_label(""); key = gtk_label_parse_uline(GTK_LABEL (GTK_BIN (w)->child), _("_Update cursor information while playing")); gtk_widget_add_accelerator (w, "clicked", ag, key, GDK_MOD1_MASK, (GtkAccelFlags) 0); cd->roll_cursor = GTK_TOGGLE_BUTTON(w); gtk_toggle_button_set_active(cd->roll_cursor,status_bar_roll_cursor); w = gtk_check_button_new_with_label(""); key = gtk_label_parse_uline(GTK_LABEL (GTK_BIN (w)->child), _("_Keep cursor in center of view when " "following playback")); gtk_widget_add_accelerator (w, "clicked", ag, key, GDK_MOD1_MASK, (GtkAccelFlags) 0); cd->center_cursor = GTK_TOGGLE_BUTTON(w); gtk_toggle_button_set_active(cd->center_cursor, view_follow_strict_flag); w = gtk_check_button_new_with_label(""); key = gtk_label_parse_uline(GTK_LABEL(GTK_BIN(w)->child), _("_Auto-start playback when jumping to mark")); gtk_widget_add_accelerator (w, "clicked", ag, key, GDK_MOD1_MASK, (GtkAccelFlags) 0); cd->mark_autoplay = GTK_TOGGLE_BUTTON(w); gtk_toggle_button_set_active(cd->mark_autoplay,autoplay_mark_flag); w = gtk_check_button_new_with_label(""); key = gtk_label_parse_uline(GTK_LABEL(GTK_BIN(w)->child), _("Enable _variable speed playback")); gtk_widget_add_accelerator (w,"clicked", ag, key, GDK_MOD1_MASK, (GtkAccelFlags) 0); cd->varispeed_enable = GTK_TOGGLE_BUTTON(w); gtk_toggle_button_set_active(cd->varispeed_enable, inifile_get_gboolean("varispeed",TRUE)); w = gtk_check_button_new_with_label(""); key = gtk_label_parse_uline(GTK_LABEL(GTK_BIN(w)->child), _("Auto-_reset speed")); gtk_widget_add_accelerator(w,"clicked",ag,key,GDK_MOD1_MASK,0); cd->varispeed_autoreset = GTK_TOGGLE_BUTTON(w); gtk_toggle_button_set_active(cd->varispeed_autoreset,varispeed_reset_flag); w = gtk_check_button_new_with_label(""); key = gtk_label_parse_uline(GTK_LABEL(GTK_BIN(w)->child), _("Use fast and noisy method")); gtk_widget_add_accelerator(w,"clicked",ag,key,GDK_MOD1_MASK,0); cd->varispeed_fast = GTK_TOGGLE_BUTTON(w); gtk_toggle_button_set_active(cd->varispeed_fast,!varispeed_smooth_flag); w = combo_new(); cd->time_display = COMBO(w); l = NULL; l = g_list_append(l,_("(H')MM:SS.t")); l = g_list_append(l,_("(H')MM:SS.mmmm")); l = g_list_append(l,translate_strip(N_("TimeDisplay|Samples"))); l = g_list_append(l,_("Time Code 24fps")); l = g_list_append(l,_("Time Code 25fps (PAL)")); l = g_list_append(l,_("Time Code 29.97fps (NTSC)")); l = g_list_append(l,_("Time Code 30fps")); i = inifile_get_guint32(INI_SETTING_TIME_DISPLAY,0); combo_set_items(cd->time_display,l,i); w = combo_new(); cd->time_display_timescale = COMBO(w); i = inifile_get_guint32(INI_SETTING_TIME_DISPLAY_SCALE,i); combo_set_items(cd->time_display_timescale,l,i); g_list_free(l); w = gtk_check_button_new_with_label(""); key = gtk_label_parse_uline(GTK_LABEL (GTK_BIN (w)->child), _("_Remember window sizes/positions")); gtk_widget_add_accelerator (w, "clicked", ag, key, GDK_MOD1_MASK, (GtkAccelFlags) 0); cd->remember_geometry = GTK_TOGGLE_BUTTON(w); gtk_toggle_button_set_active(cd->remember_geometry, inifile_get_gboolean("useGeometry",FALSE)); w = gtk_check_button_new_with_label(""); key = gtk_label_parse_uline(GTK_LABEL (GTK_BIN (w)->child), _("_Draw waveform a second time with improved " "quality")); gtk_widget_add_accelerator (w, "clicked", ag, key, GDK_MOD1_MASK, (GtkAccelFlags) 0); cd->improve = GTK_TOGGLE_BUTTON(w); gtk_toggle_button_set_active(cd->improve, inifile_get_gboolean("drawImprove",TRUE)); w = gtk_list_new(); cd->tempdirs = GTK_LIST(w); gtk_list_set_selection_mode(cd->tempdirs,GTK_SELECTION_SINGLE); for (i=0; 1; i++) { ch = get_temp_directory(i); if (ch == NULL) break; a = gtk_list_item_new_with_label(ch); gtk_container_add(GTK_CONTAINER(w),a); } gtk_signal_connect(GTK_OBJECT(w),"select_child", GTK_SIGNAL_FUNC(tempdir_select),cd); gtk_signal_connect(GTK_OBJECT(w),"unselect_child", GTK_SIGNAL_FUNC(tempdir_unselect),cd); cd->selected_tempdir = NULL; w = gtk_entry_new(); cd->tempdir_add_entry = GTK_ENTRY(w); w = gtk_button_new_with_label(""); key = gtk_label_parse_uline(GTK_LABEL(GTK_BIN(w)->child), _("_Remove")); gtk_widget_add_accelerator(w, "clicked", ag, key, GDK_MOD1_MASK, (GtkAccelFlags) 0); gtk_signal_connect(GTK_OBJECT(w),"clicked", GTK_SIGNAL_FUNC(tempdir_remove_click),cd); gtk_widget_set_sensitive(w,FALSE); cd->tempdir_remove = GTK_BUTTON(w); w = gtk_button_new_with_label(""); key = gtk_label_parse_uline(GTK_LABEL(GTK_BIN(w)->child), _("_Add")); gtk_widget_add_accelerator(w, "clicked", ag, key, GDK_MOD1_MASK, (GtkAccelFlags) 0); gtk_signal_connect(GTK_OBJECT(w),"clicked", GTK_SIGNAL_FUNC(tempdir_add_click),cd); cd->tempdir_add = GTK_BUTTON(w); w = gtk_button_new_with_label(""); key = gtk_label_parse_uline(GTK_LABEL(GTK_BIN(w)->child), _("_Browse...")); gtk_widget_add_accelerator(w, "clicked", ag, key, GDK_MOD1_MASK, (GtkAccelFlags) 0); gtk_signal_connect(GTK_OBJECT(w),"clicked", GTK_SIGNAL_FUNC(tempdir_browse_click),cd); cd->tempdir_browse = GTK_BUTTON(w); w = gtk_button_new_with_label(""); key = gtk_label_parse_uline(GTK_LABEL(GTK_BIN(w)->child), _("_Up")); gtk_widget_add_accelerator(w, "clicked", ag, key, GDK_MOD1_MASK, (GtkAccelFlags) 0); gtk_signal_connect(GTK_OBJECT(w),"clicked", GTK_SIGNAL_FUNC(tempdir_up_click),cd); gtk_widget_set_sensitive(w,FALSE); cd->tempdir_up = GTK_BUTTON(w); w = gtk_button_new_with_label(""); key = gtk_label_parse_uline(GTK_LABEL(GTK_BIN(w)->child), _("_Down")); gtk_widget_add_accelerator(w, "clicked", ag, key, GDK_MOD1_MASK, (GtkAccelFlags) 0); gtk_signal_connect(GTK_OBJECT(w),"clicked", GTK_SIGNAL_FUNC(tempdir_down_click),cd); gtk_widget_set_sensitive(w,FALSE); cd->tempdir_down = GTK_BUTTON(w); w = intbox_new(inifile_get_guint32("recentFiles",4)); cd->recent_files = INTBOX(w); w = intbox_new(inifile_get_guint32("vzoomMax",100)); cd->vzoom_max = INTBOX(w); w = gtk_check_button_new_with_label(""); key = gtk_label_parse_uline(GTK_LABEL (GTK_BIN (w)->child), _("Keep main _window in front after " "applying effect")); gtk_widget_add_accelerator (w, "clicked", ag, key, GDK_MOD1_MASK, (GtkAccelFlags) 0); cd->mainwin_front = GTK_TOGGLE_BUTTON(w); gtk_toggle_button_set_active(cd->mainwin_front, inifile_get_gboolean("mainwinFront",TRUE)); w = format_selector_new(TRUE); format_selector_set(FORMAT_SELECTOR(w),&player_fallback_format); cd->fallback_format = FORMAT_SELECTOR(w); w = gtk_check_button_new_with_label(""); key = gtk_label_parse_uline(GTK_LABEL (GTK_BIN (w)->child), _("_Use floating-point temporary files")); gtk_widget_add_accelerator (w, "clicked", ag, key, GDK_MOD1_MASK, (GtkAccelFlags) 0); cd->floating_tempfiles = GTK_TOGGLE_BUTTON(w); gtk_toggle_button_set_active(cd->floating_tempfiles, chunk_filter_use_floating_tempfiles); w = gtk_check_button_new_with_label(""); key = gtk_label_parse_uline(GTK_LABEL(GTK_BIN(w)->child), _("Enable _dithering for editing")); gtk_widget_add_accelerator(w,"clicked",ag,key,GDK_MOD1_MASK, (GtkAccelFlags)0); cd->dither_editing = GTK_TOGGLE_BUTTON(w); gtk_toggle_button_set_active(cd->dither_editing,dither_editing); w = gtk_check_button_new_with_label(""); key = gtk_label_parse_uline(GTK_LABEL(GTK_BIN(w)->child), _("Enable dithering for _playback")); gtk_widget_add_accelerator(w,"clicked",ag,key,GDK_MOD1_MASK, (GtkAccelFlags)0); cd->dither_playback = GTK_TOGGLE_BUTTON(w); gtk_toggle_button_set_active(cd->dither_playback,dither_playback); w = gtk_check_button_new_with_label(""); key = gtk_label_parse_uline(GTK_LABEL(GTK_BIN(w)->child), _("Auto dete_ct driver on each start-up")); gtk_widget_add_accelerator(w,"clicked",ag,key,GDK_MOD1_MASK, (GtkAccelFlags)0); cd->driver_autodetect = GTK_TOGGLE_BUTTON(w); if (!strcmp(inifile_get(INI_SETTING_SOUNDDRIVER,DEFAULT_DRIVER),"auto")) { gtk_widget_set_sensitive(GTK_WIDGET(cd->sound_driver),FALSE); gtk_toggle_button_set_active(cd->driver_autodetect,TRUE); } gtk_signal_connect(GTK_OBJECT(w),"toggled", GTK_SIGNAL_FUNC(driver_autodetect_toggled),cd); w = combo_new(); l = NULL; l = g_list_append(l,_("Direct access")); l = g_list_append(l,_("Decompress")); l = g_list_append(l,_("Bypass")); combo_set_items(COMBO(w),l,inifile_get_guint32("sndfileOggMode",1)); g_list_free(l); if (!sndfile_ogg_supported()) { combo_set_selection(COMBO(w),2); gtk_widget_set_sensitive(w,FALSE); } cd->oggmode = COMBO(w); w = combo_new(); l = NULL; l = g_list_append(l,_("Biased")); l = g_list_append(l,_("Pure-Scaled")); combo_set_items(COMBO(w),l,sample_convert_mode); g_list_free(l); cd->convmode = COMBO(w); /* Layout the window */ a = gtk_vbox_new(FALSE,5); gtk_container_add(GTK_CONTAINER(cd),a); b = gtk_notebook_new(); gtk_notebook_set_tab_pos(GTK_NOTEBOOK(b),GTK_POS_TOP); gtk_box_pack_start(GTK_BOX(a),b,TRUE,TRUE,0); c = gtk_vbox_new(FALSE,14); gtk_container_set_border_width(GTK_CONTAINER(c),8); gtk_notebook_append_page(GTK_NOTEBOOK(b),c,gtk_label_new(_("Interface"))); d = gtk_frame_new(_(" Main window ")); gtk_box_pack_start(GTK_BOX(c),d,FALSE,FALSE,0); e = gtk_vbox_new(FALSE,3); gtk_container_set_border_width(GTK_CONTAINER(e),5); gtk_container_add(GTK_CONTAINER(d),e); f = GTK_WIDGET(cd->remember_geometry); gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0); f = GTK_WIDGET(cd->mainwin_front); gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0); f = gtk_hbox_new(FALSE,3); gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0); g = gtk_label_new(_("Number of recent files in File menu: ")); gtk_box_pack_start(GTK_BOX(f),g,FALSE,FALSE,0); g = GTK_WIDGET(cd->recent_files); gtk_box_pack_start(GTK_BOX(f),g,FALSE,FALSE,8); d = gtk_frame_new(_(" View ")); gtk_box_pack_start(GTK_BOX(c),d,FALSE,FALSE,0); e = gtk_vbox_new(FALSE,3); gtk_container_set_border_width(GTK_CONTAINER(e),5); gtk_container_add(GTK_CONTAINER(d),e); f = GTK_WIDGET(cd->improve); gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0); f = gtk_hbox_new(FALSE,3); gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0); g = gtk_button_new_with_label(""); key = gtk_label_parse_uline(GTK_LABEL (GTK_BIN (g)->child), _("Customize co_lors...")); gtk_widget_add_accelerator (g,"clicked",ag,key,GDK_MOD1_MASK, (GtkAccelFlags) 0); gtk_signal_connect(GTK_OBJECT(g),"clicked",GTK_SIGNAL_FUNC(colors_click), cd); gtk_box_pack_start(GTK_BOX(f),g,FALSE,FALSE,0); d = gtk_frame_new(_(" Window contents ")); gtk_box_pack_start(GTK_BOX(c),d,FALSE,FALSE,0); e = gtk_vbox_new(FALSE,3); gtk_container_set_border_width(GTK_CONTAINER(e),5); gtk_container_add(GTK_CONTAINER(d),e); f = GTK_WIDGET(cd->time_scale_default); gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0); f = GTK_WIDGET(cd->vzoom_default); gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0); f = GTK_WIDGET(cd->speed_default); gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0); f = GTK_WIDGET(cd->labels_default); gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0); f = GTK_WIDGET(cd->bufpos_default); gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0); f = gtk_hbox_new(FALSE,3); gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0); g = gtk_label_new(_("Vertical zoom limit: ")); gtk_box_pack_start(GTK_BOX(f),g,FALSE,FALSE,0); g = GTK_WIDGET(cd->vzoom_max); gtk_box_pack_start(GTK_BOX(f),g,FALSE,FALSE,8); g = gtk_label_new(_("x")); gtk_box_pack_start(GTK_BOX(f),g,FALSE,FALSE,0); c = gtk_vbox_new(FALSE,14); gtk_container_set_border_width(GTK_CONTAINER(c),8); gtk_notebook_append_page(GTK_NOTEBOOK(b),c,gtk_label_new(_("Sound"))); d = gtk_frame_new(_(" Driver options ")); gtk_box_pack_start(GTK_BOX(c),d,FALSE,FALSE,0); e = gtk_vbox_new(FALSE,3); gtk_container_set_border_width(GTK_CONTAINER(e),5); gtk_container_add(GTK_CONTAINER(d),e); f = gtk_hbox_new(FALSE,3); gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0); g = gtk_label_new(""); key = gtk_label_parse_uline(GTK_LABEL (g), _("_Driver:")); gtk_box_pack_start(GTK_BOX(f),g,FALSE,FALSE,0); g = GTK_WIDGET(cd->sound_driver); gtk_widget_add_accelerator(g, "grab_focus", ag, key, GDK_MOD1_MASK, (GtkAccelFlags) 0); gtk_box_pack_start(GTK_BOX(f),g,FALSE,FALSE,8); g = GTK_WIDGET(cd->sound_driver_prefs); gtk_box_pack_start(GTK_BOX(f),g,FALSE,FALSE,3); f = GTK_WIDGET(cd->driver_autodetect); gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0); f = GTK_WIDGET(cd->output_bswap); gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0); f = GTK_WIDGET(cd->sound_lock); gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0); f = GTK_WIDGET(cd->output_stereo); gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0); d = gtk_frame_new(_(" Fallback format ")); gtk_box_pack_start(GTK_BOX(c),d,FALSE,FALSE,0); e = gtk_vbox_new(FALSE,3); gtk_container_set_border_width(GTK_CONTAINER(e),5); gtk_container_add(GTK_CONTAINER(d),e); f = gtk_label_new(_("Sample format to try when the sound file's format isn't" " supported.")); gtk_label_set_line_wrap(GTK_LABEL(f),TRUE); gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0); f = GTK_WIDGET(cd->fallback_format); gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0); c = gtk_vbox_new(FALSE,14); gtk_container_set_border_width(GTK_CONTAINER(c),8); gtk_notebook_append_page(GTK_NOTEBOOK(b),c,gtk_label_new(_("Playback"))); d = gtk_frame_new(_(" Playback settings ")); gtk_box_pack_start(GTK_BOX(c),d,FALSE,FALSE,0); e = gtk_vbox_new(FALSE,3); gtk_container_set_border_width(GTK_CONTAINER(e),5); gtk_container_add(GTK_CONTAINER(d),e); f = GTK_WIDGET(cd->mark_autoplay); gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0); f = GTK_WIDGET(cd->roll_cursor); gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0); f = GTK_WIDGET(cd->center_cursor); gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0); d = gtk_frame_new(_(" Variable speed ")); gtk_box_pack_start(GTK_BOX(c),d,FALSE,FALSE,0); e = gtk_vbox_new(FALSE,3); gtk_container_set_border_width(GTK_CONTAINER(e),5); gtk_container_add(GTK_CONTAINER(d),e); f = GTK_WIDGET(cd->varispeed_enable); gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0); f = GTK_WIDGET(cd->varispeed_fast); gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0); f = GTK_WIDGET(cd->varispeed_autoreset); gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0); c = gtk_vbox_new(FALSE,14); gtk_container_set_border_width(GTK_CONTAINER(c),8); gtk_notebook_append_page(GTK_NOTEBOOK(b),c,gtk_label_new(_("Files"))); d = gtk_frame_new(_(" Temporary file directories ")); gtk_box_pack_start(GTK_BOX(c),d,FALSE,FALSE,0); e = gtk_vbox_new(FALSE,3); gtk_container_set_border_width(GTK_CONTAINER(e),5); gtk_container_add(GTK_CONTAINER(d),e); f = gtk_table_new(5,3,FALSE); gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0); g = gtk_scrolled_window_new(NULL,NULL); gtk_table_attach(GTK_TABLE(f),g,0,2,0,4,GTK_EXPAND|GTK_FILL,GTK_FILL,0,0); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(g),GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); h = GTK_WIDGET(cd->tempdirs); gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(g),h); g = GTK_WIDGET(cd->tempdir_up); gtk_table_attach(GTK_TABLE(f),g,2,3,0,1,GTK_FILL,0,0,0); g = GTK_WIDGET(cd->tempdir_down); gtk_table_attach(GTK_TABLE(f),g,2,3,1,2,GTK_FILL,0,0,0); g = GTK_WIDGET(cd->tempdir_remove); gtk_table_attach(GTK_TABLE(f),g,2,3,2,3,GTK_FILL,0,0,0); g = GTK_WIDGET(cd->tempdir_add_entry); gtk_table_attach(GTK_TABLE(f),g,0,1,4,5,GTK_EXPAND|GTK_FILL,0,0,4); g = GTK_WIDGET(cd->tempdir_browse); gtk_table_attach(GTK_TABLE(f),g,1,2,4,5,GTK_FILL,0,0,4); g = GTK_WIDGET(cd->tempdir_add); gtk_table_attach(GTK_TABLE(f),g,2,3,4,5,GTK_FILL,0,0,4); d = gtk_frame_new(_(" Temporary file settings ")); gtk_box_pack_start(GTK_BOX(c),d,FALSE,FALSE,0); e = gtk_vbox_new(FALSE,3); gtk_container_set_border_width(GTK_CONTAINER(e),5); gtk_container_add(GTK_CONTAINER(d),e); f = gtk_label_new(_("To avoid rounding errors when applying more than one " "effect on the same data, floating-point temporary " "files can be used. However, this will increase disk " "and CPU usage.")); gtk_label_set_line_wrap(GTK_LABEL(f),TRUE); gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0); f = GTK_WIDGET(cd->floating_tempfiles); gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0); f = gtk_label_new(_("Some versions of libsndfile supports accessing " "Ogg files without decompressing to a temporary " "file.")); gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0); gtk_label_set_line_wrap(GTK_LABEL(f),TRUE); f = gtk_hbox_new(FALSE,3); gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0); g = gtk_label_new("Libsndfile ogg handling: "); gtk_box_pack_start(GTK_BOX(f),g,FALSE,FALSE,0); g = GTK_WIDGET(cd->oggmode); gtk_box_pack_start(GTK_BOX(f),g,TRUE,TRUE,0); c = gtk_vbox_new(FALSE,14); gtk_container_set_border_width(GTK_CONTAINER(c),8); gtk_notebook_append_page(GTK_NOTEBOOK(b),c,gtk_label_new(_("Quality"))); d = gtk_frame_new(_(" Rate conversions ")); gtk_box_pack_start(GTK_BOX(c),d,FALSE,FALSE,0); e = gtk_vbox_new(FALSE,3); gtk_container_add(GTK_CONTAINER(d),e); gtk_container_set_border_width(GTK_CONTAINER(e),5); f = gtk_table_new(2,2,FALSE); gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0); attach_label(_("Varispeed: "),f,0,0); attach_label(_("Speed effect: "),f,1,0); g = GTK_WIDGET(cd->varispeed_method); gtk_table_attach(GTK_TABLE(f),g,1,2,0,1,GTK_EXPAND|GTK_FILL,0,0,0); g = GTK_WIDGET(cd->speed_method); gtk_table_attach(GTK_TABLE(f),g,1,2,1,2,GTK_EXPAND|GTK_FILL,0,0,0); gtk_table_set_row_spacings(GTK_TABLE(f),4); d = gtk_frame_new(_(" Dithering ")); gtk_box_pack_start(GTK_BOX(c),d,FALSE,FALSE,0); e = gtk_vbox_new(FALSE,3); gtk_container_add(GTK_CONTAINER(d),e); gtk_container_set_border_width(GTK_CONTAINER(e),5); f = GTK_WIDGET(cd->dither_editing); gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0); f = GTK_WIDGET(cd->dither_playback); gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0); d = gtk_frame_new(_(" Sample conversion ")); gtk_box_pack_start(GTK_BOX(c),d,FALSE,FALSE,0); e = gtk_vbox_new(FALSE,3); gtk_container_add(GTK_CONTAINER(d),e); gtk_container_set_border_width(GTK_CONTAINER(e),5); f = gtk_hbox_new(FALSE,0); gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0); g = gtk_label_new(_("Normalization mode: ")); gtk_box_pack_start(GTK_BOX(f),g,FALSE,FALSE,0); g = GTK_WIDGET(cd->convmode); gtk_box_pack_start(GTK_BOX(f),g,TRUE,TRUE,0); c = gtk_vbox_new(FALSE,14); gtk_container_set_border_width(GTK_CONTAINER(c),8); gtk_notebook_append_page(GTK_NOTEBOOK(b),c,gtk_label_new(_("Other"))); d = gtk_frame_new(_(" Time format ")); gtk_box_pack_start(GTK_BOX(c),d,FALSE,FALSE,0); e = gtk_table_new(2,2,FALSE); gtk_container_set_border_width(GTK_CONTAINER(e),5); gtk_container_add(GTK_CONTAINER(d),e); gtk_table_set_row_spacings(GTK_TABLE(e),4); g = gtk_label_new(""); key = gtk_label_parse_uline(GTK_LABEL(g), _("Display t_imes as: ")); gtk_misc_set_alignment(GTK_MISC(g),0.0,0.5); gtk_table_attach(GTK_TABLE(e),g,0,1,0,1,GTK_FILL,0,0,0); g = GTK_WIDGET(cd->time_display); gtk_widget_add_accelerator(g, "grab_focus", ag, key, GDK_MOD1_MASK, (GtkAccelFlags) 0); gtk_table_attach(GTK_TABLE(e),g,1,2,0,1,GTK_FILL|GTK_EXPAND,0,0,0); g = gtk_label_new(""); key = gtk_label_parse_uline(GTK_LABEL(g), _("Times_cale format: ")); gtk_misc_set_alignment(GTK_MISC(g),0.0,0.5); gtk_table_attach(GTK_TABLE(e),g,0,1,1,2,GTK_FILL,0,0,0); g = GTK_WIDGET(cd->time_display_timescale); gtk_widget_add_accelerator(g, "grab_focus", ag, key, GDK_MOD1_MASK, (GtkAccelFlags) 0); gtk_table_attach(GTK_TABLE(e),g,1,2,1,2,GTK_FILL|GTK_EXPAND,0,0,0); d = gtk_frame_new(_(" External applications ")); gtk_box_pack_start(GTK_BOX(c),d,FALSE,FALSE,0); e = gtk_vbox_new(FALSE,3); gtk_container_set_border_width(GTK_CONTAINER(e),5); gtk_container_add(GTK_CONTAINER(d),e); f = gtk_hbox_new(FALSE,3); gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,3); g = gtk_label_new(""); key = gtk_label_parse_uline(GTK_LABEL (g), _("Mi_xer utility: ")); gtk_box_pack_start(GTK_BOX(f),g,FALSE,FALSE,0); g = GTK_WIDGET(cd->mixer_utility); gtk_widget_add_accelerator(g, "grab_focus", ag, key, GDK_MOD1_MASK, (GtkAccelFlags) 0); gtk_box_pack_start(GTK_BOX(f),g,FALSE,FALSE,8); c = gtk_vbox_new(FALSE,14); gtk_container_set_border_width(GTK_CONTAINER(c),8); gtk_notebook_append_page(GTK_NOTEBOOK(b),c,gtk_label_new(_("Advanced"))); d = gtk_frame_new(_(" Advanced settings ")); gtk_box_pack_start(GTK_BOX(c),d,FALSE,FALSE,0); e = gtk_vbox_new(FALSE,3); gtk_container_set_border_width(GTK_CONTAINER(e),5); gtk_container_add(GTK_CONTAINER(d),e); f = gtk_hbox_new(FALSE,3); gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0); g = gtk_label_new(""); key = gtk_label_parse_uline(GTK_LABEL (g), _("Disk editing _threshold: ")); gtk_box_pack_start(GTK_BOX(f),g,FALSE,FALSE,0); g = GTK_WIDGET(cd->disk_threshold); gtk_widget_add_accelerator(g, "grab_focus", ag, key, GDK_MOD1_MASK, (GtkAccelFlags) 0); gtk_box_pack_start(GTK_BOX(f),g,TRUE,TRUE,8); g = gtk_label_new("K "); gtk_box_pack_start(GTK_BOX(f),g,FALSE,FALSE,0); f = gtk_hbox_new(FALSE,3); gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0); g = gtk_label_new(""); key = gtk_label_parse_uline(GTK_LABEL (g), _("View _quality:")); gtk_box_pack_start(GTK_BOX(f),g,FALSE,FALSE,0); g = GTK_WIDGET(cd->view_quality); gtk_widget_add_accelerator(g, "grab_focus", ag, key, GDK_MOD1_MASK, (GtkAccelFlags) 0); gtk_box_pack_start(GTK_BOX(f),g,TRUE,TRUE,8); g = gtk_label_new(_("samples/pixel")); gtk_box_pack_start(GTK_BOX(f),g,FALSE,FALSE,0); f = gtk_hbox_new(FALSE,3); gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0); g = gtk_label_new(""); key = gtk_label_parse_uline(GTK_LABEL (g), _("Output _buffer size:")); gtk_box_pack_start(GTK_BOX(f),g,FALSE,FALSE,0); g = GTK_WIDGET(cd->sound_buffer_size); gtk_widget_add_accelerator(g, "grab_focus", ag, key, GDK_MOD1_MASK, (GtkAccelFlags) 0); gtk_box_pack_start(GTK_BOX(f),g,TRUE,TRUE,8); g = gtk_label_new(_("bytes")); gtk_box_pack_start(GTK_BOX(f),g,FALSE,FALSE,0); b = gtk_hbutton_box_new(); gtk_box_pack_start(GTK_BOX(a),b,FALSE,TRUE,0); c = gtk_button_new_with_label(""); key = gtk_label_parse_uline(GTK_LABEL (GTK_BIN (c)->child), _("_OK")); gtk_widget_add_accelerator (c, "clicked", ag, key, GDK_MOD1_MASK, (GtkAccelFlags) 0); gtk_widget_add_accelerator (c, "clicked", ag, GDK_KP_Enter, 0, (GtkAccelFlags) 0); gtk_widget_add_accelerator (c, "clicked", ag, GDK_Return, 0, (GtkAccelFlags) 0); gtk_signal_connect(GTK_OBJECT(c),"clicked", GTK_SIGNAL_FUNC(config_dialog_ok),cd); gtk_container_add (GTK_CONTAINER (b), c); GTK_WIDGET_SET_FLAGS (c, GTK_CAN_DEFAULT); c = gtk_button_new_with_label(""); key = gtk_label_parse_uline(GTK_LABEL (GTK_BIN (c)->child), _("_Close")); gtk_widget_add_accelerator (c, "clicked", ag, key, GDK_MOD1_MASK, (GtkAccelFlags) 0); gtk_widget_add_accelerator (c, "clicked", ag, GDK_Escape, 0, (GtkAccelFlags) 0); gtk_signal_connect_object(GTK_OBJECT(c),"clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy), GTK_OBJECT(cd)); gtk_container_add (GTK_CONTAINER (b), c); GTK_WIDGET_SET_FLAGS (c, GTK_CAN_DEFAULT); gtk_widget_show_all(a); gtk_window_add_accel_group(GTK_WINDOW (cd), ag); } GtkType config_dialog_get_type(void) { static GtkType id = 0; if (!id) { GtkTypeInfo info = { "ConfigDialog", sizeof(ConfigDialog), sizeof(ConfigDialogClass), (GtkClassInitFunc) config_dialog_class_init, (GtkObjectInitFunc) config_dialog_init }; id = gtk_type_unique(gtk_window_get_type(),&info); } return id; } GtkWidget *config_dialog_new(void) { return gtk_type_new(config_dialog_get_type()); } mhwaveedit-1.4.24/src/configdialog.h000066400000000000000000000050631334022513400173250ustar00rootroot00000000000000/* * Copyright (C) 2002 2003 2004 2005 2008 2009 2011 2012, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #ifndef CONFIGDIALOG_H_INCLUDED #define CONFIGDIALOG_H_INCLUDED #include #include "int_box.h" #include "combo.h" #include "formatselector.h" #define CONFIG_DIALOG(obj) GTK_CHECK_CAST(obj,config_dialog_get_type(),ConfigDialog) #define CONFIG_DIALOG_CLASS(klass) GTK_CHECK_CLASS_CAST(klass,config_dialog_get_type(),ConfigDialogClass) #define IS_CONFIG_DIALOG(obj) GTK_CHECK_TYPE(obj,config_dialog_get_type()) typedef struct { GtkWindow window; Intbox *disk_threshold; Combo *sound_driver; GtkButton *sound_driver_prefs; Intbox *sound_buffer_size; GtkEntry *mixer_utility; GtkToggleButton *time_scale_default,*sound_lock,*roll_cursor,*improve; GtkToggleButton *vzoom_default, *hzoom_default,*speed_default,*labels_default; GtkToggleButton *bufpos_default; GtkToggleButton *output_bswap,*center_cursor,*mark_autoplay; GtkToggleButton *mainwin_front,*varispeed_enable,*varispeed_autoreset; GtkToggleButton *varispeed_fast,*dither_editing,*dither_playback; GtkToggleButton *driver_autodetect,*output_stereo; Intbox *recent_files; Intbox *vzoom_max; Intbox *view_quality; Combo *time_display,*time_display_timescale,*varispeed_method, *speed_method; GtkToggleButton *remember_geometry; GtkList *tempdirs; GtkWidget *selected_tempdir; GtkButton *tempdir_remove,*tempdir_up,*tempdir_down,*tempdir_add; GtkButton *tempdir_browse; GtkEntry *tempdir_add_entry; FormatSelector *fallback_format; GtkToggleButton *floating_tempfiles; Combo *oggmode; Combo *convmode; } ConfigDialog; typedef struct { GtkWindowClass wc; } ConfigDialogClass; GtkType config_dialog_get_type(void); GtkWidget *config_dialog_new(void); #endif mhwaveedit-1.4.24/src/convert_inc.c000066400000000000000000000622031334022513400172030ustar00rootroot00000000000000/* * Copyright (C) 2002 2003 2004 2005 2008 2009 2012, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ /* FIXME: Endian-ness stuff! */ /* This piece of code is imported several times into dataformat.c. */ /* Macros that must be defined and are undefined at the end of this file: * FTYPE - Floating point sample type * OTYPE - Other floating-point sample type * C_PCMxy_FLOAT, C_FLOAT_PCMxy - Conversion routine names * PZMODE - Preserve-zero level mode */ #define CASTU32(x) ((guint32)x) #define CASTS32(x) ((gint32)x) #define MUL(x,m) (((FTYPE)(x))*((FTYPE)(m))) #define DIV(x,d) (((FTYPE)(x))/((FTYPE)(d))) #define MULADD(x,m,a) (((FTYPE)(x))*((FTYPE)(m)) + ((FTYPE)(a))) #define MULSUB(x,m,a) (((FTYPE)(x))*((FTYPE)(m)) - ((FTYPE)(a))) #define SUBDIV(x,s,d) ((((FTYPE)(x)) - ((FTYPE)(s))) / ((FTYPE)(d))) #define ADDDIV(x,s,d) ((((FTYPE)(x)) + ((FTYPE)(s))) / ((FTYPE)(d))) #ifdef PZMODE #define NORM8U(x) SUBDIV(x,128.0,127.0) #define NORM8S(x) DIV(x,127.0) #define UNNORM8U(x) MULADD(x,127.0,128.0) #define UNNORM8S(x) MUL(x,127.0) #define NORM16U(x) SUBDIV(x,32768.0,32767.0) #define NORM16S(x) DIV(x,32767.0) #define UNNORM16U(x) MULADD(x,32767.0,32768.0) #define UNNORM16S(x) MUL(x,32767.0) #define NORM24U(x) SUBDIV(x,8388608.0,8388607.0) #define UNNORM24U(x) MULADD(x,8388607.0,8388608.0) #define UNNORM24S(x) MUL(x,8388607.0) #define NORM32U(x) SUBDIV(x,2147483648.0,2147483647.0) #define NORM32S(x) DIV(x,2147483647.0) #define UNNORM32U(x) MULADD(x,2147483647.0,2147483648.0) #define UNNORM32S(x) MUL(x,2147483647.0) #undef PZMODE #else #define NORM8U(x) SUBDIV(x,127.5,127.5) #define NORM8S(x) ADDDIV(x,0.5,127.5) #define UNNORM8U(x) MULADD(x,127.5,127.5) #define UNNORM8S(x) MULSUB(x,127.5,0.5) #define NORM16U(x) SUBDIV(x,32767.5,32767.5) #define NORM16S(x) ADDDIV(x,0.5,32767.5) #define UNNORM16U(x) MULADD(x,32767.5,32767.5) #define UNNORM16S(x) MULSUB(x,32767.5,0.5) #define NORM24U(x) SUBDIV(x,8388607.5,8388607.5) #define UNNORM24U(x) MULADD(x,8388607.5,8388607.5) #define UNNORM24S(x) MULSUB(x,8388607.5,0.5) #define NORM32U(x) SUBDIV(x,2147483647.5,2147483647.5) #define NORM32S(x) ADDDIV(x,0.5,2147483647.5) #define UNNORM32S(x) MULSUB(x,2147483647.5,0.5) #endif /* ifdef PZMODE */ #if IS_BIGENDIAN == TRUE #define C_PCM16SNE_FLOAT C_PCM16SBE_FLOAT #define C_PCM16UNE_FLOAT C_PCM16UBE_FLOAT #define C_PCM32SNE_FLOAT C_PCM32SBE_FLOAT #define C_PCM32UNE_FLOAT C_PCM32UBE_FLOAT #define C_PCM24SNEPM_FLOAT C_PCM24SBEPM_FLOAT #define C_PCM24UNEPM_FLOAT C_PCM24UBEPM_FLOAT #define C_PCM24SNEPL_FLOAT C_PCM24SBEPL_FLOAT #define C_PCM24UNEPL_FLOAT C_PCM24UBEPL_FLOAT #define C_PCM16SOE_FLOAT C_PCM16SLE_FLOAT #define C_PCM16UOE_FLOAT C_PCM16ULE_FLOAT #define C_PCM32SOE_FLOAT C_PCM32SLE_FLOAT #define C_PCM32UOE_FLOAT C_PCM32ULE_FLOAT #define C_PCM24SOEPM_FLOAT C_PCM24SLEPM_FLOAT #define C_PCM24UOEPM_FLOAT C_PCM24ULEPM_FLOAT #define C_PCM24SOEPL_FLOAT C_PCM24SLEPL_FLOAT #define C_PCM24UOEPL_FLOAT C_PCM24ULEPL_FLOAT #define C_FLOAT_PCM16SNE C_FLOAT_PCM16SBE #define C_FLOAT_PCM16UNE C_FLOAT_PCM16UBE #define C_FLOAT_PCM32SNE C_FLOAT_PCM32SBE #define C_FLOAT_PCM32UNE C_FLOAT_PCM32UBE #define C_FLOAT_PCM24SNEPM C_FLOAT_PCM32SBEPM #define C_FLOAT_PCM24UNEPM C_FLOAT_PCM32UBEPM #define C_FLOAT_PCM24SNEPL C_FLOAT_PCM32SBEPL #define C_FLOAT_PCM24UNEPL C_FLOAT_PCM32UBEPL #define C_FLOAT_PCM16SOE C_FLOAT_PCM16SLE #define C_FLOAT_PCM16UOE C_FLOAT_PCM16ULE #define C_FLOAT_PCM32SOE C_FLOAT_PCM32SLE #define C_FLOAT_PCM32UOE C_FLOAT_PCM32ULE #define C_FLOAT_PCM24SOE C_FLOAT_PCM24SLEPM #define C_FLOAT_PCM24UOE C_FLOAT_PCM24ULEPM #define C_FLOAT_PCM24SOE C_FLOAT_PCM24SLEPL #define C_FLOAT_PCM24UOE C_FLOAT_PCM24ULEPL static void C_PCM24SLE_FLOAT(guint32 *in, FTYPE *out, int count) { unsigned long l0,l1,l2,m; unsigned char *c; for (; count>4; count-=4,in+=3,out+=4) { l0 = in[0]; /* d00 d01 d02 d10 */ l1 = in[1]; /* d11 d12 d20 d21 */ l2 = in[2]; /* d22 d30 d31 d32 */ m = ((l0<<8) & 0xFF0000) + ((l0>>8) & 0xFF00) + (l0>>24); m = (m+0x800000) & 0xFFFFFF; /* signed -> unsigned */ out[0] = NORM24U(m); m = (l0 & 0xFF) + ((l1 >> 16) & 0xFF00) + (l1 & 0xFF0000); m = (m+0x800000) & 0xFFFFFF; out[1] = NORM24U(m); m = ((l1<<8) & 0xFF00) + ((l1>>8) & 0xFF) + ((l2>>8) & 0xFF0000); m = (m+0x800000) & 0xFFFFFF; out[2] = NORM24U(m); m = (l2 << 16) + (l2 & 0xFF00) + ((l2>>16) & 0xFF); m = (m+0x800000) & 0xFFFFFF; out[3] = NORM24U(m); } c = (unsigned char *)in; for (; count>0; count--,c+=3,out++) { l0 = c[0]; l1 = c[1]; l2 = c[2]; m = l0 + (l1<<8) + (l2<<16); m = (m+0x800000) & 0xFFFFFF; *out = NORM24U(m); } } static void C_PCM24SBE_FLOAT(guint32 *in, FTYPE *out, int count) { unsigned long l0,l1,l2,m; unsigned char *c; for (; count>4; count-=4,in+=3,out+=4) { l0 = in[0]; /* d02 d01 d00 d12 */ l1 = in[1]; /* d11 d10 d22 d21 */ l2 = in[2]; /* d20 d32 d31 d30 */ m = l0 >> 8; m = (m+0x800000) & 0xFFFFFF; /* signed -> unsigned */ out[0] = NORM24U(m); m = (l0 << 16) + (l1 >> 16); m = (m+0x800000) & 0xFFFFFF; out[1] = NORM24U(m); m = (l1<<8) + (l2>>24); m = (m+0x800000) & 0xFFFFFF; out[2] = NORM24U(m); m = ((l2 << 16) & 0xFF0000) + (l2 & 0xFF00) + ((l2>>16) & 0xFF); m = (m+0x800000) & 0xFFFFFF; out[3] = NORM24U(m); } c = (unsigned char *)in; for (; count>0; count--,c+=3,out++) { l0 = c[0]; l1 = c[1]; l2 = c[2]; m = (l0<<16) + (l1<<8) + l2; m = (m+0x800000) & 0xFFFFFF; *out = NORM24U(m); } } static void C_PCM24ULE_FLOAT(guint32 *in, FTYPE *out, int count) { unsigned long l0,l1,l2,m; unsigned char *c; for (; count>4; count-=4,in+=3,out+=4) { l0 = in[0]; /* d00 d01 d02 d10 */ l1 = in[1]; /* d11 d12 d20 d21 */ l2 = in[2]; /* d22 d30 d31 d32 */ m = ((l0<<8) & 0xFF0000) + ((l0>>8) & 0xFF00) + (l0>>24); out[0] = NORM24U(m); m = (l0 & 0xFF) + ((l1 >> 16) & 0xFF00) + (l1 & 0xFF0000); out[1] = NORM24U(m); m = ((l1<<8) & 0xFF00) + ((l1>>8) & 0xFF) + ((l2>>8) & 0xFF0000); out[2] = NORM24U(m); m = ((l2 << 16) & 0xFF0000) + (l2 & 0xFF00) + ((l2>>16) & 0xFF); out[3] = NORM24U(m); } c = (unsigned char *)in; for (; count>0; count--,c+=3,out++) { l0 = c[0]; l1 = c[1]; l2 = c[2]; m = l0 + (l1<<8) + (l2<<16); *out = NORM24U(m); } } static void C_PCM24UBE_FLOAT(guint32 *in, FTYPE *out, int count) { unsigned long l0,l1,l2,m; unsigned char *c; for (; count>4; count-=4,in+=3,out+=4) { l0 = in[0]; /* d02 d01 d00 d12 */ l1 = in[1]; /* d11 d10 d22 d21 */ l2 = in[2]; /* d20 d32 d31 d30 */ m = l0 >> 8; out[0] = NORM24U(m); m = ((l0 << 16) & 0xFF0000) + (l1 >> 16); out[1] = NORM24U(m); m = ((l1<<8) & 0xFFFF00) + (l2>>24); out[2] = NORM24U(m); m = ((l2 << 16) & 0xFF0000) + (l2 & 0xFF00) + ((l2>>16) & 0xFF); out[3] = NORM24U(m); } c = (unsigned char *)in; for (; count>0; count--,c+=3,out++) { l0 = c[0]; l1 = c[1]; l2 = c[2]; m = (l0<<16) + (l1<<8) + l2; *out = NORM24U(m); } } #else #define C_PCM16SNE_FLOAT C_PCM16SLE_FLOAT #define C_PCM16UNE_FLOAT C_PCM16ULE_FLOAT #define C_PCM32SNE_FLOAT C_PCM32SLE_FLOAT #define C_PCM32UNE_FLOAT C_PCM32ULE_FLOAT #define C_PCM24SNEPM_FLOAT C_PCM24SLEPM_FLOAT #define C_PCM24UNEPM_FLOAT C_PCM24ULEPM_FLOAT #define C_PCM24SNEPL_FLOAT C_PCM24SLEPL_FLOAT #define C_PCM24UNEPL_FLOAT C_PCM24ULEPL_FLOAT #define C_PCM16SOE_FLOAT C_PCM16SBE_FLOAT #define C_PCM16UOE_FLOAT C_PCM16UBE_FLOAT #define C_PCM32SOE_FLOAT C_PCM32SBE_FLOAT #define C_PCM32UOE_FLOAT C_PCM32UBE_FLOAT #define C_PCM24SOEPM_FLOAT C_PCM24SBEPM_FLOAT #define C_PCM24UOEPM_FLOAT C_PCM24UBEPM_FLOAT #define C_PCM24SOEPL_FLOAT C_PCM24SBEPL_FLOAT #define C_PCM24UOEPL_FLOAT C_PCM24UBEPL_FLOAT #define C_FLOAT_PCM16SNE C_FLOAT_PCM16SLE #define C_FLOAT_PCM16UNE C_FLOAT_PCM16ULE #define C_FLOAT_PCM32SNE C_FLOAT_PCM32SLE #define C_FLOAT_PCM32UNE C_FLOAT_PCM32ULE #define C_FLOAT_PCM24SNEPM C_FLOAT_PCM24SLEPM #define C_FLOAT_PCM24UNEPM C_FLOAT_PCM24ULEPM #define C_FLOAT_PCM24SNEPL C_FLOAT_PCM24SLEPL #define C_FLOAT_PCM24UNEPL C_FLOAT_PCM24ULEPL #define C_FLOAT_PCM16SOE C_FLOAT_PCM16SBE #define C_FLOAT_PCM16UOE C_FLOAT_PCM16UBE #define C_FLOAT_PCM32SOE C_FLOAT_PCM32SBE #define C_FLOAT_PCM32UOE C_FLOAT_PCM32UBE #define C_FLOAT_PCM24SOEPM C_FLOAT_PCM24SBEPM #define C_FLOAT_PCM24UOEPM C_FLOAT_PCM24UBEPM #define C_FLOAT_PCM24SOEPL C_FLOAT_PCM24SBEPL #define C_FLOAT_PCM24UOEPL C_FLOAT_PCM24UBEPL static void C_PCM24SLE_FLOAT(guint32 *in, FTYPE *out, int count) { unsigned long l0,l1,l2,m; unsigned char *c; for (; count>4; count-=4,in+=3,out+=4) { l0 = in[0]; /* d10 d02 d01 d00 */ l1 = in[1]; /* d21 d20 d12 d11 */ l2 = in[2]; /* d32 d31 d30 d22 */ m = l0; m = (m+0x800000) & 0xFFFFFF; /* signed -> unsigned */ out[0] = NORM24U(m); m = (l0 >> 24) + (l1 << 8); m = (m+0x800000) & 0xFFFFFF; out[1] = NORM24U(m); m = (l1 >> 16) + (l2 << 16); m = (m+0x800000) & 0xFFFFFF; out[2] = NORM24U(m); m = (l2 >> 8); m = (m+0x800000) & 0xFFFFFF; out[3] = NORM24U(m); } c = (unsigned char *)in; for (; count>0; count--,c+=3,out++) { l0 = c[0]; l1 = c[1]; l2 = c[2]; m = l0 + (l1<<8) + (l2<<16); m = (m+0x800000) & 0xFFFFFF; *out = NORM24U(m); } } static void C_PCM24SBE_FLOAT(guint32 *in, FTYPE *out, int count) { unsigned long l0,l1,l2,m; unsigned char *c; for (; count>4; count-=4,in+=3,out+=4) { l0 = in[0]; /* d12 d00 d01 d02 */ l1 = in[1]; /* d21 d22 d10 d11 */ l2 = in[2]; /* d30 d31 d32 d20 */ m = (l0 << 16) + (l0 & 0xFF00) + ((l0 >> 16) & 0xFF); m = (m+0x800000) & 0xFFFFFF; /* signed -> unsigned */ out[0] = NORM24U(m); m = ((l0>>8) & 0xFF0000) + ((l1<<8) & 0xFF00) + ((l1>>8) & 0xFF); m = (m+0x800000) & 0xFFFFFF; out[1] = NORM24U(m); m = (l1 & 0xFF0000) + ((l1>>16) & 0xFF00) + (l2 & 0xFF); m = (m+0x800000) & 0xFFFFFF; out[2] = NORM24U(m); m = ((l2 << 8) & 0xFF0000) + ((l2>>8) & 0xFF00) + ((l2>>24) & 0xFF); m = (m+0x800000) & 0xFFFFFF; out[3] = NORM24U(m); } c = (unsigned char *)in; for (; count>0; count--,c+=3,out++) { l0 = c[0]; l1 = c[1]; l2 = c[2]; m = (l0<<16) + (l1<<8) + l2; m = (m+0x800000) & 0xFFFFFF; *out = NORM24U(m); } } static void C_PCM24ULE_FLOAT(guint32 *in, FTYPE *out, int count) { unsigned long l0,l1,l2,m; unsigned char *c; for (; count>4; count-=4,in+=3,out+=4) { l0 = in[0]; /* d10 d02 d01 d00 */ l1 = in[1]; /* d21 d20 d12 d11 */ l2 = in[2]; /* d32 d31 d30 d22 */ m = l0 & 0xFFFFFF; out[0] = NORM24U(m); m = (l0 >> 24) + ((l1 << 8) & 0xFFFF00); out[1] = NORM24U(m); m = (l1 >> 16) + ((l2 << 16) & 0xFF0000); out[2] = NORM24U(m); m = (l2 >> 8); out[3] = NORM24U(m); } c = (unsigned char *)in; for (; count>0; count--,c+=3,out++) { l0 = c[0]; l1 = c[1]; l2 = c[2]; m = l0 + (l1<<8) + (l2<<16); *out = NORM24U(m); } } static void C_PCM24UBE_FLOAT(guint32 *in, FTYPE *out, int count) { unsigned long l0,l1,l2,m; unsigned char *c; for (; count>4; count-=4,in+=3,out+=4) { l0 = in[0]; /* d12 d00 d01 d02 */ l1 = in[1]; /* d21 d22 d10 d11 */ l2 = in[2]; /* d30 d31 d32 d20 */ m = ((l0 << 16) & 0xFF0000) + (l0 & 0xFF00) + ((l0 >> 16) & 0xFF); out[0] = NORM24U(m); m = ((l0>>8) & 0xFF0000) + ((l1<<8) & 0xFF00) + ((l1>>8) & 0xFF); out[1] = NORM24U(m); m = (l1 & 0xFF0000) + ((l1>>16) & 0xFF00) + (l2 & 0xFF); out[2] = NORM24U(m); m = ((l2 << 8) & 0xFF0000) + ((l2>>8) & 0xFF00) + ((l2>>24) & 0xFF); out[3] = NORM24U(m); } c = (unsigned char *)in; for (; count>0; count--,c+=3,out++) { l0 = c[0]; l1 = c[1]; l2 = c[2]; m = (l0<<16) + (l1<<8) + l2; *out = NORM24U(m); } } #endif static void C_PCM8S_FLOAT(signed char *in, FTYPE *out, int count) { for (; count>0; count--,in++,out++) *out = NORM8S(*in); } static void C_PCM8U_FLOAT(unsigned char *in, FTYPE *out, int count) { for (; count>0; count--,in++,out++) *out = NORM8U(*in); } static void C_PCM16SNE_FLOAT(signed short *in, FTYPE *out, int count) { /* puts("HELLO!"); */ for (; count>0; count--,in++,out++) *out = NORM16S(*in); } static void C_PCM16SOE_FLOAT(unsigned short *in, FTYPE *out, int count) { unsigned short u; signed short i; for (; count>0; count--,in++,out++) { u = *in; i = (u >> 8) + (u << 8); *out = NORM16S(i); } } static void C_PCM16UNE_FLOAT(unsigned short *in, FTYPE *out, int count) { for (; count>0; count--,in++,out++) *out = NORM16U(*in); } static void C_PCM16UOE_FLOAT(unsigned short *in, FTYPE *out, int count) { unsigned short i; for (; count>0; count--,in++,out++) { i = *in; i = (i >> 8) + (i << 8); *out = NORM16U(i); } } static void C_PCM32SNE_FLOAT(gint32 *in, FTYPE *out, int count) { for (; count>0; count--,in++,out++) *out = NORM32S(*in); } static void C_PCM32SOE_FLOAT(guint32 *in, FTYPE *out, int count) { guint32 u; guint32 x; gint32 i; /* g_assert(sizeof(u) == 4 && sizeof(x) == 4 && sizeof(i) == 4); */ for (; count>0; count--,in++,out++) { u = *in; x = (u<>CASTU32(8)) & CASTU32(0xFF00)) + (u>>CASTU32(24)); i = (gint32)x; *out = NORM32S(i); } } static void C_PCM32UNE_FLOAT(guint32 *in, FTYPE *out, int count) { #ifdef FTYPE_IS_FLOAT gint32 x; for (; count>0; count--,in++,out++) { x = (gint32)(*in ^ 0x80000000); *out = NORM32S(x); } #else for (; count>0; count--,in++,out++) *out = NORM32U(*in); #endif } static void C_PCM32UOE_FLOAT(guint32 *in, FTYPE *out, int count) { #ifdef FTYPE_IS_FLOAT guint32 i,x; gint32 xi; for (; count>0; count--,in++,out++) { i = *in; x = (i<>CASTU32(8)) & CASTU32(0xFF00)) + (i>>CASTU32(24)); xi = (gint32)(x ^ 0x80000000); *out = NORM32S(xi); } #else guint32 i,x; for (; count>0; count--,in++,out++) { i = *in; x = (i<>CASTU32(8)) & CASTU32(0xFF00)) + (i>>CASTU32(24)); *out = NORM32U(x); } #endif } static void C_PCM24SNEPM_FLOAT(guint32 *in, FTYPE *out, int count) { unsigned long l; for (; count>0; count--,in++,out++) { l = (*in >> 8) ^ 0x800000; *out = NORM24U(l); } } static void C_PCM24SOEPM_FLOAT(guint32 *in, FTYPE *out, int count) { guint32 i,x; for (; count>0; count--,in++,out++) { i = *in; x = ((i << 16) & 0xFF0000) | (i & 0xFF00) | ((i >> 16) & 0xFF); x ^= 0x800000; *out = NORM24U(x); } } static void C_PCM24UNEPM_FLOAT(guint32 *in, FTYPE *out, int count) { unsigned long l; for (; count>0; count--,in++,out++) { l = *in >> 8; *out = NORM24U(l); } } static void C_PCM24UOEPM_FLOAT(guint32 *in, FTYPE *out, int count) { guint32 i,x; for (; count>0; count--,in++,out++) { i = *in; x = ((i << 16) & 0xFF0000) | (i & 0xFF00) | ((i >> 16) & 0xFF); *out = NORM24U(x); } } static void C_PCM24SNEPL_FLOAT(guint32 *in, FTYPE *out, int count) { unsigned long l; for (; count>0; count--,in++,out++) { l = (*in & 0xFFFFFF) ^ 0x800000; *out = NORM24U(l); } } static void C_PCM24SOEPL_FLOAT(guint32 *in, FTYPE *out, int count) { guint32 i,x; for (; count>0; count--,in++,out++) { i = *in; x = ((i << 8) & 0xFF0000) | ((i >> 8) & 0xFF00) | ((i >> 24) & 0xFF); x ^= 0x800000; *out = NORM24U(x); } } static void C_PCM24UNEPL_FLOAT(guint32 *in, FTYPE *out, int count) { unsigned long l; for (; count>0; count--,in++,out++) { l = *in & 0xFFFFFF; *out = NORM24U(l); } } static void C_PCM24UOEPL_FLOAT(guint32 *in, FTYPE *out, int count) { guint32 i,x; for (; count>0; count--,in++,out++) { i = *in; x = ((i << 8) & 0xFF0000) | ((i >> 8) & 0xFF00) | ((i >> 24) & 0xFF); *out = NORM24U(x); } } static int C_FLOAT_PCM8S(FTYPE *in, signed char *out, int count) { long int l; int cc=0; FTYPE f; for (; count>0; count--,in++,out++) { f = *in; l = RINT(UNNORM8S(f)); if (l > 127 || f > 2.0) { l = 127; cc++; } else if (l < -128 || f < -2.0) { l = -128; cc++; } *out = l; } return cc; } static int C_FLOAT_PCM8U(FTYPE *in, unsigned char *out, int count) { long int l; int cc=0; FTYPE f; for (; count>0; count--,in++,out++) { f = *in; l = RINT(UNNORM8U(f)); if (l > 255 || f > 2.0) { l = 255; cc++; } else if (l < 0 || f < -2.0) { l = 0; cc++; } *out = l; } return cc; } static int C_FLOAT_PCM16SNE(FTYPE *in, signed short *out, int count) { long int l; int cc=0; FTYPE f; for (; count>0; count--,in++,out++) { f = *in; l = RINT(UNNORM16S(f)); if (l > 32767 || f > 2.0) { l = 32767; cc++; } else if (l < -32768 || f < -2.0) { l=-32768; cc++; } *out = l; } return cc; } static int C_FLOAT_PCM16SOE(FTYPE *in, signed short *out, int count) { int i; i = C_FLOAT_PCM16SNE(in,out,count); byteswap(out,2,count*2); return i; } static int C_FLOAT_PCM16UNE(FTYPE *in, unsigned short *out, int count) { long int l; int cc=0; FTYPE f; for (; count>0; count--,in++,out++) { f = *in; l = RINT(UNNORM16U(f)); if (l > 65535 || f > 2.0) { l = 65535; cc++; } else if (l < 0 || f < -2.0) { l = 0; cc++; } *out = l; } return cc; } static int C_FLOAT_PCM16UOE(FTYPE *in, unsigned short *out, int count) { int i; i = C_FLOAT_PCM16UNE(in,out,count); byteswap(out,2,count*2); return i; } static int C_FLOAT_PCM24SLE(FTYPE *in, unsigned char *out, int count) { long int l; int cc=0; FTYPE f; for (; count>0; count--,in++,out+=3) { f = *in; l = RINT(UNNORM24S(f)); if (l > 0x7FFFFF || f > 2.0) { l = 0x7FFFFF; cc++; } else if (l < -0x800000 || f < -2.0) { l = -0x800000; cc++; } out[0] = l & 0xFF; out[1] = (l & 0xFF00) >> 8; out[2] = (l & 0xFF0000) >> 16; } return cc; } static int C_FLOAT_PCM24SBE(FTYPE *in, unsigned char *out, int count) { long int l; int cc=0; FTYPE f; for (; count>0; count--,in++,out+=3) { f = *in; l = RINT(UNNORM24S(f)); if (l > 0x7FFFFF || f > 2.0) { l = 0x7FFFFF; cc++; } else if (l < -0x800000 || f < -2.0) { l = -0x800000; cc++; } out[0] = (l & 0xFF0000) >> 16; out[1] = (l & 0xFF00) >> 8; out[2] = l & 0xFF; } return cc; } static int C_FLOAT_PCM24ULE(FTYPE *in, unsigned char *out, int count) { long int l; int cc=0; FTYPE f; for (; count>0; count--,in++,out+=3) { f = *in; l = RINT(UNNORM24U(f)); if (l > 0xFFFFFF || f > 2.0) { l = 0xFFFFFF; cc++; } else if (l < 0 || f < -2.0) { l = 0; cc++; } out[0] = l & 0xFF; out[1] = (l & 0xFF00) >> 8; out[2] = (l & 0xFF0000) >> 16; } return cc; } static int C_FLOAT_PCM24UBE(FTYPE *in, unsigned char *out, int count) { long int l; int cc=0; FTYPE f; for (; count>0; count--,in++,out+=3) { f = *in; l = RINT(UNNORM24U(f)); if (l > 0xFFFFFF || f > 2.0) { l = 0xFFFFFF; cc++; } else if (l < 0 || f < -2.0) { l = 0; cc++; } out[0] = (l & 0xFF0000) >> 16; out[1] = (l & 0xFF00) >> 8; out[2] = l & 0xFF; } return cc; } static int C_FLOAT_PCM32SNE(FTYPE *in, gint32 *out, int count) { FTYPE f; gint32 i; int cc=0; for (; count>0; count--,in++,out++) { f = *in; i = RINT(UNNORM32S(f)); if (f > 1.25 || (f >= 1.0 && i<0x7FFFFFFF)) { i = 0x7FFFFFFF; cc++; } else if (f < -1.25 || (f <= -1.0 && i>-0x7FFFFFFF)) { i = -0x80000000; cc++; } *out = i; } return cc; } static int C_FLOAT_PCM32SOE(FTYPE *in, gint32 *out, int count) { int i; i = C_FLOAT_PCM32SNE(in,out,count); byteswap(out,4,count*4); return i; } static int C_FLOAT_PCM32UNE(FTYPE *in, guint32 *out, int count) { FTYPE f; gint32 i; int cc=0; for (; count>0; count--,in++,out++) { f = *in; i = RINT(UNNORM32S(f)); if (f > 1.25 || (f >= 1.0 && i<0x7FFFFFFF)) { i = 0x7FFFFFFF; cc++; } else if (f < -1.25 || (f <= -1.0 && i>-0x7FFFFFFF)) { i = -0x80000000; cc++; } *out = (guint32)i ^ 0x80000000; } return cc; } static int C_FLOAT_PCM32UOE(FTYPE *in, guint32 *out, int count) { int i; i = C_FLOAT_PCM32UNE(in,out,count); byteswap(out,4,count*4); return i; } static int C_FLOAT_PCM24SNEPM(FTYPE *in, guint32 *out, int count) { long l; int cc=0; FTYPE f; for (; count>0; count--,in++,out++) { f = *in; l = RINT(UNNORM24S(f)); if (l > 0x7FFFFF || f > 2.0) { l = 0x7FFFFF; cc++; } else if (l < -0x800000 || f < -2.0) { l = -0x800000; cc++; } *out = l << 8; } return cc; } static int C_FLOAT_PCM24SOEPM(FTYPE *in, guint32 *out, int count) { int i; i = C_FLOAT_PCM24SNEPM(in,out,count); byteswap(out,4,count*4); return i; } static int C_FLOAT_PCM24UNEPM(FTYPE *in, guint32 *out, int count) { unsigned long l; int cc=0; FTYPE f; for (; count>0; count--,in++,out++) { f = *in; l = RINT(UNNORM24U(f)); if (l > 0xFFFFFF || f > 2.0) { l = 0xFFFFFF; cc++; } else if (l < 0 || f < -2.0) { l = 0; cc++; } *out = l << 8; } return cc; } static int C_FLOAT_PCM24UOEPM(FTYPE *in, guint32 *out, int count) { int i; i = C_FLOAT_PCM24UNEPM(in,out,count); byteswap(out,4,count*4); return i; } static int C_FLOAT_PCM24SNEPL(FTYPE *in, guint32 *out, int count) { long l; int cc=0; FTYPE f; for (; count>0; count--,in++,out++) { f = *in; l = RINT(UNNORM24S(f)); if (l > 0x7FFFFF || f > 2.0) { l = 0x7FFFFF; cc++; } else if (l < -0x800000 || f < -2.0) { l = -0x800000; cc++; } *out = l; } return cc; } static int C_FLOAT_PCM24SOEPL(FTYPE *in, guint32 *out, int count) { int i; i = C_FLOAT_PCM24SNEPL(in,out,count); byteswap(out,4,count*4); return i; } static int C_FLOAT_PCM24UNEPL(FTYPE *in, guint32 *out, int count) { unsigned long l; int cc=0; FTYPE f; for (; count>0; count--,in++,out++) { f = *in; l = RINT(UNNORM24U(f)); if (l > 0xFFFFFF || f > 2.0) { l = 0xFFFFFF; cc++; } else if (l < 0 || f < -2.0) { l = 0; cc++; } *out = l; } return cc; } static int C_FLOAT_PCM24UOEPL(FTYPE *in, guint32 *out, int count) { int i; i = C_FLOAT_PCM24UNEPL(in,out,count); byteswap(out,4,count*4); return i; } /* Defined in this file. */ #undef C_PCM16SNE_FLOAT #undef C_PCM16SOE_FLOAT #undef C_PCM16UNE_FLOAT #undef C_PCM16UOE_FLOAT #undef C_PCM32SNE_FLOAT #undef C_PCM32SOE_FLOAT #undef C_PCM32UNE_FLOAT #undef C_PCM32UOE_FLOAT #undef C_PCM24SNEPM_FLOAT #undef C_PCM24SOEPM_FLOAT #undef C_PCM24UNEPM_FLOAT #undef C_PCM24UOEPM_FLOAT #undef C_PCM24SNEPL_FLOAT #undef C_PCM24SOEPL_FLOAT #undef C_PCM24UNEPL_FLOAT #undef C_PCM24UOEPL_FLOAT #undef C_FLOAT_PCM16SNE #undef C_FLOAT_PCM16SOE #undef C_FLOAT_PCM16UNE #undef C_FLOAT_PCM16UOE #undef C_FLOAT_PCM32SNE #undef C_FLOAT_PCM32SOE #undef C_FLOAT_PCM32UNE #undef C_FLOAT_PCM32UOE #undef C_FLOAT_PCM24SNEPM #undef C_FLOAT_PCM24SOEPM #undef C_FLOAT_PCM24UNEPM #undef C_FLOAT_PCM24UOEPM #undef C_FLOAT_PCM24SNEPL #undef C_FLOAT_PCM24SOEPL #undef C_FLOAT_PCM24UNEPL #undef C_FLOAT_PCM24UOEPL #undef MUL #undef DIV #undef MULADD #undef SUBDIV #undef NORM8U #undef NORM8S #undef UNNORM8U #undef UNNORM8S #undef NORM16U #undef NORM16S #undef UNNORM16U #undef UNNORM16S #undef NORM24U #undef UNNORM24U #undef UNNORM24S #undef NORM32U #undef NORM32S #undef UNNORM32U #undef UNNORM32S /* Defined on the outside */ #undef FTYPE #undef RINT #undef C_PCM8S_FLOAT #undef C_PCM8U_FLOAT #undef C_PCM16SLE_FLOAT #undef C_PCM16SBE_FLOAT #undef C_PCM16ULE_FLOAT #undef C_PCM16UBE_FLOAT #undef C_PCM24SLE_FLOAT #undef C_PCM24SBE_FLOAT #undef C_PCM24ULE_FLOAT #undef C_PCM24UBE_FLOAT #undef C_PCM24SLEPM_FLOAT #undef C_PCM24SBEPM_FLOAT #undef C_PCM24ULEPM_FLOAT #undef C_PCM24UBEPM_FLOAT #undef C_PCM24SLEPL_FLOAT #undef C_PCM24SBEPL_FLOAT #undef C_PCM24ULEPL_FLOAT #undef C_PCM24UBEPL_FLOAT #undef C_PCM32SLE_FLOAT #undef C_PCM32SBE_FLOAT #undef C_PCM32ULE_FLOAT #undef C_PCM32UBE_FLOAT #undef C_FLOAT_PCM8S #undef C_FLOAT_PCM8U #undef C_FLOAT_PCM16SLE #undef C_FLOAT_PCM16SBE #undef C_FLOAT_PCM16ULE #undef C_FLOAT_PCM16UBE #undef C_FLOAT_PCM24SLE #undef C_FLOAT_PCM24SBE #undef C_FLOAT_PCM24ULE #undef C_FLOAT_PCM24UBE #undef C_FLOAT_PCM24SLEPM #undef C_FLOAT_PCM24SBEPM #undef C_FLOAT_PCM24ULEPM #undef C_FLOAT_PCM24UBEPM #undef C_FLOAT_PCM24SLEPL #undef C_FLOAT_PCM24SBEPL #undef C_FLOAT_PCM24ULEPL #undef C_FLOAT_PCM24UBEPL #undef C_FLOAT_PCM32SLE #undef C_FLOAT_PCM32SBE #undef C_FLOAT_PCM32ULE #undef C_FLOAT_PCM32UBE mhwaveedit-1.4.24/src/dataformat.c000066400000000000000000001341331334022513400170160ustar00rootroot00000000000000/* * Copyright (C) 2002 2003 2004 2005 2006 2007 2008 2010 2012, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif #include #include #include #include "dataformat.h" #include "inifile.h" #include "main.h" #include "gettext.h" Dataformat dataformat_sample_t,dataformat_single; gboolean ieee_le_compatible,ieee_be_compatible; gint sample_convert_mode; void floating_point_check(void) { char c[4] = { 0, 0, 0xD0, 0xC0 }; char d[4] = { 0xC0, 0xD0, 0, 0 }; float *f; f = (float *)c; ieee_le_compatible = (*f == -6.5); f = (float *)d; ieee_be_compatible = (*f == -6.5); dataformat_sample_t.type = DATAFORMAT_FLOAT; dataformat_sample_t.samplesize = sizeof(sample_t); dataformat_sample_t.bigendian = ieee_be_compatible; dataformat_sample_t.channels = 0; dataformat_sample_t.samplebytes = 0; dataformat_sample_t.samplerate = 0; dataformat_single.type = DATAFORMAT_FLOAT; dataformat_single.samplesize = sizeof(float); dataformat_single.bigendian = ieee_be_compatible; dataformat_single.channels = 0; dataformat_single.samplebytes = 0; dataformat_single.samplerate = 0; } gboolean dataformat_equal(Dataformat *f1, Dataformat *f2) { return (f1->type == f2->type && f1->samplerate==f2->samplerate && f1->samplesize==f2->samplesize && f1->channels==f2->channels && (f1->samplesize == 1 || BOOLEQ(f1->bigendian,f2->bigendian)) && (f1->type != DATAFORMAT_PCM || (BOOLEQ(f1->sign,f2->sign) && (f1->samplesize != 4 || f1->packing == f2->packing)))); } gboolean dataformat_samples_equal(Dataformat *f1, Dataformat *f2) { return (f1->type == f2->type && f1->samplesize==f2->samplesize && (f1->samplesize == 1 || BOOLEQ(f1->bigendian,f2->bigendian)) && (f1->type != DATAFORMAT_PCM || (BOOLEQ(f1->sign,f2->sign) && (f1->samplesize != 4 || f1->packing == f2->packing)))); } const gchar *sampletype_name(Dataformat *fmt) { if (fmt->type == DATAFORMAT_FLOAT) { if (fmt->samplesize == sizeof(double)) return "double"; else return "float"; } switch (fmt->samplesize) { case 1: return "8 bit"; case 2: return "16 bit"; case 3: return "24 bit"; default: case 4: if (fmt->packing != 0) return "24+8 bit"; else return "32 bit"; } } gboolean dataformat_get_from_inifile(gchar *ini_prefix, gboolean full, Dataformat *result) { guint t,ss,chn,pack=0; guint32 sr; gboolean sign=FALSE,end=FALSE; gchar *c,*d; c = g_strdup_printf("%s_SampleSize",ini_prefix); d = inifile_get(c,NULL); g_free(c); if (d == NULL) return FALSE; switch (d[0]) { case '1': t=DATAFORMAT_PCM; ss=1; break; case '2': t=DATAFORMAT_PCM; ss=2; break; case '3': switch (d[1]) { case 'm': t=DATAFORMAT_PCM; ss=4; pack=1; break; case 'l': t=DATAFORMAT_PCM; ss=4; pack=2; break; case 'p': default: t=DATAFORMAT_PCM; ss=3; break; } case '4': t=DATAFORMAT_PCM; ss=4; break; case 's': t=DATAFORMAT_FLOAT; ss=sizeof(float); break; case 'd': t=DATAFORMAT_FLOAT; ss=sizeof(double); break; default: return FALSE; } c = g_strdup_printf("%s_BigEndian",ini_prefix); end=inifile_get_gboolean(c,ieee_be_compatible && t==DATAFORMAT_FLOAT); g_free(c); if (t == DATAFORMAT_PCM) { c = g_strdup_printf("%s_Signed",ini_prefix); sign=inifile_get_gboolean(c,FALSE); g_free(c); } result->type = t; result->samplesize = ss; result->packing = pack; result->sign = sign; result->bigendian = end; if (full) { c = g_strdup_printf("%s_SampleRate",ini_prefix); sr = inifile_get_guint32(c,44100); g_free(c); c = g_strdup_printf("%s_Channels",ini_prefix); chn = inifile_get_guint32(c,2); g_free(c); result->samplerate = sr; result->channels = chn; } result->samplebytes = result->channels * result->samplesize; return TRUE; } void dataformat_save_to_inifile(gchar *ini_prefix, Dataformat *format, gboolean full) { char *s[6] = { "1","2","3p","4","3m","3l" }; gchar *c; c = g_strdup_printf("%s_SampleSize",ini_prefix); if (format->type == DATAFORMAT_PCM) { inifile_set(c,s[format->samplesize+format->packing-1]); g_free(c); c = g_strdup_printf("%s_Signed",ini_prefix); inifile_set_gboolean(c,format->sign); } else if (format->samplesize == sizeof(float)) { inifile_set(c,"s"); } else { inifile_set(c,"d"); } g_free(c); c = g_strdup_printf("%s_BigEndian",ini_prefix); inifile_set_gboolean(c,format->bigendian); g_free(c); if (full) { c = g_strdup_printf("%s_SampleRate",ini_prefix); inifile_set_guint32(c,format->samplerate); g_free(c); c = g_strdup_printf("%s_Channels",ini_prefix); inifile_set_guint32(c,format->channels); g_free(c); } } /* PCM<->FLOAT SAMPLE CONVERSION ROUTINES */ /* These routines could really use some optimizing if anyone feels like it. */ /* 1) single-float, max-range */ #define FTYPE float #define FTYPE_IS_FLOAT #ifdef HAVE_LRINTF #define RINT(x) lrintf(x) #else #define RINT(x) ((long int)((x<0)?(x-0.5000001):(x+0.5000001))) #warning "Using fallback for lrintf, losing accuracy" #endif #define C_PCM8S_FLOAT convert_pcm8s_float #define C_PCM8U_FLOAT convert_pcm8u_float #define C_PCM16SLE_FLOAT convert_pcm16sle_float #define C_PCM16SBE_FLOAT convert_pcm16sbe_float #define C_PCM16ULE_FLOAT convert_pcm16ule_float #define C_PCM16UBE_FLOAT convert_pcm16ube_float #define C_PCM24SLE_FLOAT convert_pcm24sle_float #define C_PCM24SBE_FLOAT convert_pcm24sbe_float #define C_PCM24ULE_FLOAT convert_pcm24ule_float #define C_PCM24UBE_FLOAT convert_pcm24ube_float #define C_PCM24SLEPM_FLOAT convert_pcm24slepm_float #define C_PCM24SBEPM_FLOAT convert_pcm24sbepm_float #define C_PCM24ULEPM_FLOAT convert_pcm24ulepm_float #define C_PCM24UBEPM_FLOAT convert_pcm24ubepm_float #define C_PCM24SLEPL_FLOAT convert_pcm24slepl_float #define C_PCM24SBEPL_FLOAT convert_pcm24sbepl_float #define C_PCM24ULEPL_FLOAT convert_pcm24ulepl_float #define C_PCM24UBEPL_FLOAT convert_pcm24ubepl_float #define C_PCM32SLE_FLOAT convert_pcm32sle_float #define C_PCM32SBE_FLOAT convert_pcm32sbe_float #define C_PCM32ULE_FLOAT convert_pcm32ule_float #define C_PCM32UBE_FLOAT convert_pcm32ube_float #define C_FLOAT_PCM8S convert_float_pcm8s #define C_FLOAT_PCM8U convert_float_pcm8u #define C_FLOAT_PCM16SLE convert_float_pcm16sle #define C_FLOAT_PCM16SBE convert_float_pcm16sbe #define C_FLOAT_PCM16ULE convert_float_pcm16ule #define C_FLOAT_PCM16UBE convert_float_pcm16ube #define C_FLOAT_PCM24SLE convert_float_pcm24sle #define C_FLOAT_PCM24SBE convert_float_pcm24sbe #define C_FLOAT_PCM24ULE convert_float_pcm24ule #define C_FLOAT_PCM24UBE convert_float_pcm24ube #define C_FLOAT_PCM24SLEPM convert_float_pcm24slepm #define C_FLOAT_PCM24SBEPM convert_float_pcm24sbepm #define C_FLOAT_PCM24ULEPM convert_float_pcm24ulepm #define C_FLOAT_PCM24UBEPM convert_float_pcm24ubepm #define C_FLOAT_PCM24SLEPL convert_float_pcm24slepl #define C_FLOAT_PCM24SBEPL convert_float_pcm24sbepl #define C_FLOAT_PCM24ULEPL convert_float_pcm24ulepl #define C_FLOAT_PCM24UBEPL convert_float_pcm24ubepl #define C_FLOAT_PCM32SLE convert_float_pcm32sle #define C_FLOAT_PCM32SBE convert_float_pcm32sbe #define C_FLOAT_PCM32ULE convert_float_pcm32ule #define C_FLOAT_PCM32UBE convert_float_pcm32ube #include "convert_inc.c" /* 2) double-float, max-range */ #define FTYPE double #undef FTYPE_IS_FLOAT #ifdef HAVE_LRINT #define RINT(x) lrint(x) #else #define RINT(x) ((long int)((x<0)?(x-0.5000001):(x+0.5000001))) #warning "Using fallback for lrint, losing accuracy" #endif #define C_PCM8S_FLOAT convert_pcm8s_double #define C_PCM8U_FLOAT convert_pcm8u_double #define C_PCM16SLE_FLOAT convert_pcm16sle_double #define C_PCM16SBE_FLOAT convert_pcm16sbe_double #define C_PCM16ULE_FLOAT convert_pcm16ule_double #define C_PCM16UBE_FLOAT convert_pcm16ube_double #define C_PCM24SLE_FLOAT convert_pcm24sle_double #define C_PCM24SBE_FLOAT convert_pcm24sbe_double #define C_PCM24ULE_FLOAT convert_pcm24ule_double #define C_PCM24UBE_FLOAT convert_pcm24ube_double #define C_PCM24SLEPM_FLOAT convert_pcm24slepm_double #define C_PCM24SBEPM_FLOAT convert_pcm24sbepm_double #define C_PCM24ULEPM_FLOAT convert_pcm24ulepm_double #define C_PCM24UBEPM_FLOAT convert_pcm24ubepm_double #define C_PCM24SLEPL_FLOAT convert_pcm24slepl_double #define C_PCM24SBEPL_FLOAT convert_pcm24sbepl_double #define C_PCM24ULEPL_FLOAT convert_pcm24ulepl_double #define C_PCM24UBEPL_FLOAT convert_pcm24ubepl_double #define C_PCM32SLE_FLOAT convert_pcm32sle_double #define C_PCM32SBE_FLOAT convert_pcm32sbe_double #define C_PCM32ULE_FLOAT convert_pcm32ule_double #define C_PCM32UBE_FLOAT convert_pcm32ube_double #define C_FLOAT_PCM8S convert_double_pcm8s #define C_FLOAT_PCM8U convert_double_pcm8u #define C_FLOAT_PCM16SLE convert_double_pcm16sle #define C_FLOAT_PCM16SBE convert_double_pcm16sbe #define C_FLOAT_PCM16ULE convert_double_pcm16ule #define C_FLOAT_PCM16UBE convert_double_pcm16ube #define C_FLOAT_PCM24SLE convert_double_pcm24sle #define C_FLOAT_PCM24SBE convert_double_pcm24sbe #define C_FLOAT_PCM24ULE convert_double_pcm24ule #define C_FLOAT_PCM24UBE convert_double_pcm24ube #define C_FLOAT_PCM24SLEPM convert_double_pcm24slepm #define C_FLOAT_PCM24SBEPM convert_double_pcm24sbepm #define C_FLOAT_PCM24ULEPM convert_double_pcm24ulepm #define C_FLOAT_PCM24UBEPM convert_double_pcm24ubepm #define C_FLOAT_PCM24SLEPL convert_double_pcm24slepl #define C_FLOAT_PCM24SBEPL convert_double_pcm24sbepl #define C_FLOAT_PCM24ULEPL convert_double_pcm24ulepl #define C_FLOAT_PCM24UBEPL convert_double_pcm24ubepl #define C_FLOAT_PCM32SLE convert_double_pcm32sle #define C_FLOAT_PCM32SBE convert_double_pcm32sbe #define C_FLOAT_PCM32ULE convert_double_pcm32ule #define C_FLOAT_PCM32UBE convert_double_pcm32ube #include "convert_inc.c" /* 3) single-float, preserve-zero */ #define PZMODE #define FTYPE float #define FTYPE_IS_FLOAT #ifdef HAVE_LRINTF #define RINT(x) lrintf(x) #else #define RINT(x) ((long int)((x<0)?(x-0.5000001):(x+0.5000001))) #endif #define C_PCM8S_FLOAT convert_pcm8s_float_pz #define C_PCM8U_FLOAT convert_pcm8u_float_pz #define C_PCM16SLE_FLOAT convert_pcm16sle_float_pz #define C_PCM16SBE_FLOAT convert_pcm16sbe_float_pz #define C_PCM16ULE_FLOAT convert_pcm16ule_float_pz #define C_PCM16UBE_FLOAT convert_pcm16ube_float_pz #define C_PCM24SLE_FLOAT convert_pcm24sle_float_pz #define C_PCM24SBE_FLOAT convert_pcm24sbe_float_pz #define C_PCM24ULE_FLOAT convert_pcm24ule_float_pz #define C_PCM24UBE_FLOAT convert_pcm24ube_float_pz #define C_PCM24SLEPM_FLOAT convert_pcm24slepm_float_pz #define C_PCM24SBEPM_FLOAT convert_pcm24sbepm_float_pz #define C_PCM24ULEPM_FLOAT convert_pcm24ulepm_float_pz #define C_PCM24UBEPM_FLOAT convert_pcm24ubepm_float_pz #define C_PCM24SLEPL_FLOAT convert_pcm24slepl_float_pz #define C_PCM24SBEPL_FLOAT convert_pcm24sbepl_float_pz #define C_PCM24ULEPL_FLOAT convert_pcm24ulepl_float_pz #define C_PCM24UBEPL_FLOAT convert_pcm24ubepl_float_pz #define C_PCM32SLE_FLOAT convert_pcm32sle_float_pz #define C_PCM32SBE_FLOAT convert_pcm32sbe_float_pz #define C_PCM32ULE_FLOAT convert_pcm32ule_float_pz #define C_PCM32UBE_FLOAT convert_pcm32ube_float_pz #define C_FLOAT_PCM8S convert_float_pcm8s_pz #define C_FLOAT_PCM8U convert_float_pcm8u_pz #define C_FLOAT_PCM16SLE convert_float_pcm16sle_pz #define C_FLOAT_PCM16SBE convert_float_pcm16sbe_pz #define C_FLOAT_PCM16ULE convert_float_pcm16ule_pz #define C_FLOAT_PCM16UBE convert_float_pcm16ube_pz #define C_FLOAT_PCM24SLE convert_float_pcm24sle_pz #define C_FLOAT_PCM24SBE convert_float_pcm24sbe_pz #define C_FLOAT_PCM24ULE convert_float_pcm24ule_pz #define C_FLOAT_PCM24UBE convert_float_pcm24ube_pz #define C_FLOAT_PCM24SLEPM convert_float_pcm24slepm_pz #define C_FLOAT_PCM24SBEPM convert_float_pcm24sbepm_pz #define C_FLOAT_PCM24ULEPM convert_float_pcm24ulepm_pz #define C_FLOAT_PCM24UBEPM convert_float_pcm24ubepm_pz #define C_FLOAT_PCM24SLEPL convert_float_pcm24slepl_pz #define C_FLOAT_PCM24SBEPL convert_float_pcm24sbepl_pz #define C_FLOAT_PCM24ULEPL convert_float_pcm24ulepl_pz #define C_FLOAT_PCM24UBEPL convert_float_pcm24ubepl_pz #define C_FLOAT_PCM32SLE convert_float_pcm32sle_pz #define C_FLOAT_PCM32SBE convert_float_pcm32sbe_pz #define C_FLOAT_PCM32ULE convert_float_pcm32ule_pz #define C_FLOAT_PCM32UBE convert_float_pcm32ube_pz #include "convert_inc.c" /* 4) double-float, preserve-zero */ #define PZMODE #define FTYPE double #undef FTYPE_IS_FLOAT #ifdef HAVE_LRINT #define RINT(x) lrint(x) #else #define RINT(x) ((long int)((x<0)?(x-0.5000001):(x+0.5000001))) #endif #define C_PCM8S_FLOAT convert_pcm8s_double_pz #define C_PCM8U_FLOAT convert_pcm8u_double_pz #define C_PCM16SLE_FLOAT convert_pcm16sle_double_pz #define C_PCM16SBE_FLOAT convert_pcm16sbe_double_pz #define C_PCM16ULE_FLOAT convert_pcm16ule_double_pz #define C_PCM16UBE_FLOAT convert_pcm16ube_double_pz #define C_PCM24SLE_FLOAT convert_pcm24sle_double_pz #define C_PCM24SBE_FLOAT convert_pcm24sbe_double_pz #define C_PCM24ULE_FLOAT convert_pcm24ule_double_pz #define C_PCM24UBE_FLOAT convert_pcm24ube_double_pz #define C_PCM24SLEPM_FLOAT convert_pcm24slepm_double_pz #define C_PCM24SBEPM_FLOAT convert_pcm24sbepm_double_pz #define C_PCM24ULEPM_FLOAT convert_pcm24ulepm_double_pz #define C_PCM24UBEPM_FLOAT convert_pcm24ubepm_double_pz #define C_PCM24SLEPL_FLOAT convert_pcm24slepl_double_pz #define C_PCM24SBEPL_FLOAT convert_pcm24sbepl_double_pz #define C_PCM24ULEPL_FLOAT convert_pcm24ulepl_double_pz #define C_PCM24UBEPL_FLOAT convert_pcm24ubepl_double_pz #define C_PCM32SLE_FLOAT convert_pcm32sle_double_pz #define C_PCM32SBE_FLOAT convert_pcm32sbe_double_pz #define C_PCM32ULE_FLOAT convert_pcm32ule_double_pz #define C_PCM32UBE_FLOAT convert_pcm32ube_double_pz #define C_FLOAT_PCM8S convert_double_pcm8s_pz #define C_FLOAT_PCM8U convert_double_pcm8u_pz #define C_FLOAT_PCM16SLE convert_double_pcm16sle_pz #define C_FLOAT_PCM16SBE convert_double_pcm16sbe_pz #define C_FLOAT_PCM16ULE convert_double_pcm16ule_pz #define C_FLOAT_PCM16UBE convert_double_pcm16ube_pz #define C_FLOAT_PCM24SLE convert_double_pcm24sle_pz #define C_FLOAT_PCM24SBE convert_double_pcm24sbe_pz #define C_FLOAT_PCM24ULE convert_double_pcm24ule_pz #define C_FLOAT_PCM24UBE convert_double_pcm24ube_pz #define C_FLOAT_PCM24SLEPM convert_double_pcm24slepm_pz #define C_FLOAT_PCM24SBEPM convert_double_pcm24sbepm_pz #define C_FLOAT_PCM24ULEPM convert_double_pcm24ulepm_pz #define C_FLOAT_PCM24UBEPM convert_double_pcm24ubepm_pz #define C_FLOAT_PCM24SLEPL convert_double_pcm24slepl_pz #define C_FLOAT_PCM24SBEPL convert_double_pcm24sbepl_pz #define C_FLOAT_PCM24ULEPL convert_double_pcm24ulepl_pz #define C_FLOAT_PCM24UBEPL convert_double_pcm24ubepl_pz #define C_FLOAT_PCM32SLE convert_double_pcm32sle_pz #define C_FLOAT_PCM32SBE convert_double_pcm32sbe_pz #define C_FLOAT_PCM32ULE convert_double_pcm32ule_pz #define C_FLOAT_PCM32UBE convert_double_pcm32ube_pz #include "convert_inc.c" typedef void (*convert_function_pf)(void *in, void *out, guint count); typedef int (*convert_function_fp)(void *in, void *out, guint count); /* (PZ-mode) (PCM size) (PCM sign) (PCM endian) (FP isdouble) */ static convert_function_pf pcm_fp_functions[96] = { (convert_function_pf)convert_pcm8u_float, (convert_function_pf)convert_pcm8u_double, (convert_function_pf)convert_pcm8u_float, (convert_function_pf)convert_pcm8u_double, (convert_function_pf)convert_pcm8s_float, (convert_function_pf)convert_pcm8s_double, (convert_function_pf)convert_pcm8s_float, (convert_function_pf)convert_pcm8s_double, (convert_function_pf)convert_pcm16ule_float, (convert_function_pf)convert_pcm16ule_double, (convert_function_pf)convert_pcm16ube_float, (convert_function_pf)convert_pcm16ube_double, (convert_function_pf)convert_pcm16sle_float, (convert_function_pf)convert_pcm16sle_double, (convert_function_pf)convert_pcm16sbe_float, (convert_function_pf)convert_pcm16sbe_double, (convert_function_pf)convert_pcm24ule_float, (convert_function_pf)convert_pcm24ule_double, (convert_function_pf)convert_pcm24ube_float, (convert_function_pf)convert_pcm24ube_double, (convert_function_pf)convert_pcm24sle_float, (convert_function_pf)convert_pcm24sle_double, (convert_function_pf)convert_pcm24sbe_float, (convert_function_pf)convert_pcm24sbe_double, (convert_function_pf)convert_pcm32ule_float, (convert_function_pf)convert_pcm32ule_double, (convert_function_pf)convert_pcm32ube_float, (convert_function_pf)convert_pcm32ube_double, (convert_function_pf)convert_pcm32sle_float, (convert_function_pf)convert_pcm32sle_double, (convert_function_pf)convert_pcm32sbe_float, (convert_function_pf)convert_pcm32sbe_double, (convert_function_pf)convert_pcm24ulepm_float, (convert_function_pf)convert_pcm24ulepm_double, (convert_function_pf)convert_pcm24ubepm_float, (convert_function_pf)convert_pcm24ubepm_double, (convert_function_pf)convert_pcm24slepm_float, (convert_function_pf)convert_pcm24slepm_double, (convert_function_pf)convert_pcm24sbepm_float, (convert_function_pf)convert_pcm24sbepm_double, (convert_function_pf)convert_pcm24ulepl_float, (convert_function_pf)convert_pcm24ulepl_double, (convert_function_pf)convert_pcm24ubepl_float, (convert_function_pf)convert_pcm24ubepl_double, (convert_function_pf)convert_pcm24slepl_float, (convert_function_pf)convert_pcm24slepl_double, (convert_function_pf)convert_pcm24sbepl_float, (convert_function_pf)convert_pcm24sbepl_double, (convert_function_pf)convert_pcm8u_float_pz, (convert_function_pf)convert_pcm8u_double_pz, (convert_function_pf)convert_pcm8u_float_pz, (convert_function_pf)convert_pcm8u_double_pz, (convert_function_pf)convert_pcm8s_float_pz, (convert_function_pf)convert_pcm8s_double_pz, (convert_function_pf)convert_pcm8s_float_pz, (convert_function_pf)convert_pcm8s_double_pz, (convert_function_pf)convert_pcm16ule_float_pz, (convert_function_pf)convert_pcm16ule_double_pz, (convert_function_pf)convert_pcm16ube_float_pz, (convert_function_pf)convert_pcm16ube_double_pz, (convert_function_pf)convert_pcm16sle_float_pz, (convert_function_pf)convert_pcm16sle_double_pz, (convert_function_pf)convert_pcm16sbe_float_pz, (convert_function_pf)convert_pcm16sbe_double_pz, (convert_function_pf)convert_pcm24ule_float_pz, (convert_function_pf)convert_pcm24ule_double_pz, (convert_function_pf)convert_pcm24ube_float_pz, (convert_function_pf)convert_pcm24ube_double_pz, (convert_function_pf)convert_pcm24sle_float_pz, (convert_function_pf)convert_pcm24sle_double_pz, (convert_function_pf)convert_pcm24sbe_float_pz, (convert_function_pf)convert_pcm24sbe_double_pz, (convert_function_pf)convert_pcm32ule_float_pz, (convert_function_pf)convert_pcm32ule_double_pz, (convert_function_pf)convert_pcm32ube_float_pz, (convert_function_pf)convert_pcm32ube_double_pz, (convert_function_pf)convert_pcm32sle_float_pz, (convert_function_pf)convert_pcm32sle_double_pz, (convert_function_pf)convert_pcm32sbe_float_pz, (convert_function_pf)convert_pcm32sbe_double_pz, (convert_function_pf)convert_pcm24ulepm_float_pz, (convert_function_pf)convert_pcm24ulepm_double_pz, (convert_function_pf)convert_pcm24ubepm_float_pz, (convert_function_pf)convert_pcm24ubepm_double_pz, (convert_function_pf)convert_pcm24slepm_float_pz, (convert_function_pf)convert_pcm24slepm_double_pz, (convert_function_pf)convert_pcm24sbepm_float_pz, (convert_function_pf)convert_pcm24sbepm_double_pz, (convert_function_pf)convert_pcm24ulepl_float_pz, (convert_function_pf)convert_pcm24ulepl_double_pz, (convert_function_pf)convert_pcm24ubepl_float_pz, (convert_function_pf)convert_pcm24ubepl_double_pz, (convert_function_pf)convert_pcm24slepl_float_pz, (convert_function_pf)convert_pcm24slepl_double_pz, (convert_function_pf)convert_pcm24sbepl_float_pz, (convert_function_pf)convert_pcm24sbepl_double_pz }; /* (PZ-mode) (PCM size) (PCM sign) (PCM endian) (FP isdouble) */ static convert_function_fp fp_pcm_functions[96] = { (convert_function_fp)convert_float_pcm8u, (convert_function_fp)convert_double_pcm8u, (convert_function_fp)convert_float_pcm8u, (convert_function_fp)convert_double_pcm8u, (convert_function_fp)convert_float_pcm8s, (convert_function_fp)convert_double_pcm8s, (convert_function_fp)convert_float_pcm8s, (convert_function_fp)convert_double_pcm8s, (convert_function_fp)convert_float_pcm16ule, (convert_function_fp)convert_double_pcm16ule, (convert_function_fp)convert_float_pcm16ube, (convert_function_fp)convert_double_pcm16ube, (convert_function_fp)convert_float_pcm16sle, (convert_function_fp)convert_double_pcm16sle, (convert_function_fp)convert_float_pcm16sbe, (convert_function_fp)convert_double_pcm16sbe, (convert_function_fp)convert_float_pcm24ule, (convert_function_fp)convert_double_pcm24ule, (convert_function_fp)convert_float_pcm24ube, (convert_function_fp)convert_double_pcm24ube, (convert_function_fp)convert_float_pcm24sle, (convert_function_fp)convert_double_pcm24sle, (convert_function_fp)convert_float_pcm24sbe, (convert_function_fp)convert_double_pcm24sbe, (convert_function_fp)convert_float_pcm32ule, (convert_function_fp)convert_double_pcm32ule, (convert_function_fp)convert_float_pcm32ube, (convert_function_fp)convert_double_pcm32ube, (convert_function_fp)convert_float_pcm32sle, (convert_function_fp)convert_double_pcm32sle, (convert_function_fp)convert_float_pcm32sbe, (convert_function_fp)convert_double_pcm32sbe, (convert_function_fp)convert_float_pcm24ulepm, (convert_function_fp)convert_double_pcm24ulepm, (convert_function_fp)convert_float_pcm24ubepm, (convert_function_fp)convert_double_pcm24ubepm, (convert_function_fp)convert_float_pcm24slepm, (convert_function_fp)convert_double_pcm24slepm, (convert_function_fp)convert_float_pcm24sbepm, (convert_function_fp)convert_double_pcm24sbepm, (convert_function_fp)convert_float_pcm24ulepl, (convert_function_fp)convert_double_pcm24ulepl, (convert_function_fp)convert_float_pcm24ubepl, (convert_function_fp)convert_double_pcm24ubepl, (convert_function_fp)convert_float_pcm24slepl, (convert_function_fp)convert_double_pcm24slepl, (convert_function_fp)convert_float_pcm24sbepl, (convert_function_fp)convert_double_pcm24sbepl, (convert_function_fp)convert_float_pcm8u_pz, (convert_function_fp)convert_double_pcm8u_pz, (convert_function_fp)convert_float_pcm8u_pz, (convert_function_fp)convert_double_pcm8u_pz, (convert_function_fp)convert_float_pcm8s_pz, (convert_function_fp)convert_double_pcm8s_pz, (convert_function_fp)convert_float_pcm8s_pz, (convert_function_fp)convert_double_pcm8s_pz, (convert_function_fp)convert_float_pcm16ule_pz, (convert_function_fp)convert_double_pcm16ule_pz, (convert_function_fp)convert_float_pcm16ube_pz, (convert_function_fp)convert_double_pcm16ube_pz, (convert_function_fp)convert_float_pcm16sle_pz, (convert_function_fp)convert_double_pcm16sle_pz, (convert_function_fp)convert_float_pcm16sbe_pz, (convert_function_fp)convert_double_pcm16sbe_pz, (convert_function_fp)convert_float_pcm24ule_pz, (convert_function_fp)convert_double_pcm24ule_pz, (convert_function_fp)convert_float_pcm24ube_pz, (convert_function_fp)convert_double_pcm24ube_pz, (convert_function_fp)convert_float_pcm24sle_pz, (convert_function_fp)convert_double_pcm24sle_pz, (convert_function_fp)convert_float_pcm24sbe_pz, (convert_function_fp)convert_double_pcm24sbe_pz, (convert_function_fp)convert_float_pcm32ule_pz, (convert_function_fp)convert_double_pcm32ule_pz, (convert_function_fp)convert_float_pcm32ube_pz, (convert_function_fp)convert_double_pcm32ube_pz, (convert_function_fp)convert_float_pcm32sle_pz, (convert_function_fp)convert_double_pcm32sle_pz, (convert_function_fp)convert_float_pcm32sbe_pz, (convert_function_fp)convert_double_pcm32sbe_pz, (convert_function_fp)convert_float_pcm24ulepm_pz, (convert_function_fp)convert_double_pcm24ulepm_pz, (convert_function_fp)convert_float_pcm24ubepm_pz, (convert_function_fp)convert_double_pcm24ubepm_pz, (convert_function_fp)convert_float_pcm24slepm_pz, (convert_function_fp)convert_double_pcm24slepm_pz, (convert_function_fp)convert_float_pcm24sbepm_pz, (convert_function_fp)convert_double_pcm24sbepm_pz, (convert_function_fp)convert_float_pcm24ulepl_pz, (convert_function_fp)convert_double_pcm24ulepl_pz, (convert_function_fp)convert_float_pcm24ubepl_pz, (convert_function_fp)convert_double_pcm24ubepl_pz, (convert_function_fp)convert_float_pcm24slepl_pz, (convert_function_fp)convert_double_pcm24slepl_pz, (convert_function_fp)convert_float_pcm24sbepl_pz, (convert_function_fp)convert_double_pcm24sbepl_pz }; /* The values in these tables correspond to one LSB step and are used as * amplitude for the dithering, adjusted to avoid numerical (double * rounding) problems. These exact values were found by changing so * frand/drand return constant +/- 0.5 and adjusting until the self-test * passes. */ static const float dither_amp_biased_float[4] = { /* (1.0/127.5), (1.0/32767.5), (1.0/8388607.5), (1.0/2147483647.5) */ 0.007842957, 3.033876e-5, 0.0, 0.0 }; static const float dither_amp_scaled_float[4] = { /* (1.0/127.0), (1.0/32767.0), (1.0/8388607.0), (1.0/2147483647.0) */ 0.007873832, 3.033876e-5, 0.0, 0.0 }; static const double dither_amp_biased_double[4] = { /* (1.0/127.5), (1.0/32767.5), (1.0/8388607.5), (1.0/2147483647.5) */ 0.007843137254901598, 3.051804379305967e-05, 1.192092963231417e-07, 4.656611762854367e-10 }; static const float dither_amp_scaled_double[4] = { /* (1.0/127.0), (1.0/32767.0), (1.0/8388607.0), (1.0/2147483647.0) */ 0.007874015751697883, 3.051850948998556e-05, 1.192092966562086e-07, 4.656610513853464e-10 }; static float frand(void) { long l; float f; l = rand(); l &= ~1; f = ((float)l) / ((float)RAND_MAX); f -= 0.5; /* g_assert(f >= -0.5 && f <= 0.5); */ return f; } static int dither_convert_float(float *indata, char *outdata, int count, convert_function_fp fn, int outdata_ssize) { float amp_factor; float databuf[4096]; int i,j,r=0; /* amp_factor = powf(2.0f,(float)(1-outdata_ssize*8)); */ if (sample_convert_mode == CONVERT_MODE_BIASED) amp_factor = dither_amp_biased_float[outdata_ssize-1]; else amp_factor = dither_amp_scaled_float[outdata_ssize-1]; while (count > 0) { i = MIN(count,ARRAY_LENGTH(databuf)); memcpy(databuf,indata,i*sizeof(float)); for (j=0; j= -0.5 && d <= 0.5); */ return d; } static int dither_convert_double(double *indata, char *outdata, int count, convert_function_fp fn, int outdata_ssize) { double amp_factor; double databuf[4096]; int i,j,r=0; /* amp_factor = pow(2.0,(double)(1-outdata_ssize*8)); */ if (sample_convert_mode == CONVERT_MODE_BIASED) amp_factor = dither_amp_biased_double[outdata_ssize-1]; else amp_factor = dither_amp_scaled_double[outdata_ssize-1]; while (count > 0) { i = MIN(count,ARRAY_LENGTH(databuf)); memcpy(databuf,indata,i*sizeof(double)); for (j=0; jtype == DATAFORMAT_PCM && f->samplesize == 4 && f->packing != 0) return 3; else return f->samplesize; } sample_t minimum_float_value(Dataformat *x) { static const sample_t tbl[4] = { (-128.0/127.0), (-32768.0/32767.0), (-8388608.0/8388607.0), (-2147483648.0/2147483647.0) }; if (sample_convert_mode==0 || x->type!=DATAFORMAT_PCM) return -1.0; else return tbl[real_ssize(x) - 1]; } sample_t convert_factor(Dataformat *infmt, Dataformat *outfmt) { sample_t fneg; fneg = minimum_float_value(outfmt) / minimum_float_value(infmt); return fneg; } void apply_convert_factor(Dataformat *infmt, Dataformat *outfmt, sample_t *buffer, guint count) { sample_t f; guint i; if (sample_convert_mode == 0 || infmt->type!=DATAFORMAT_PCM || outfmt->type!=DATAFORMAT_PCM) return; f = convert_factor(infmt,outfmt); for (i=0; isamplesize); } else if (indata_format->type == DATAFORMAT_PCM) { if (outdata_format->type == DATAFORMAT_PCM) { /* PCM -> PCM conversion */ if (real_ssize(outdata_format) >= real_ssize(indata_format) && sample_convert_mode==CONVERT_MODE_NOOFFS) dither_mode = DITHER_NONE; c = g_malloc(count * sizeof(sample_t)); convert_array(indata,indata_format,c,&dataformat_sample_t, count,dither_mode,clipcount); apply_convert_factor(indata_format,outdata_format, (sample_t *)c, count); convert_array(c,&dataformat_sample_t,outdata,outdata_format, count,dither_mode,clipcount); g_free(c); } else { /* PCM -> FP conversion */ i = (sample_convert_mode ? 48:0) + (indata_format->samplesize-1)*8 + (indata_format->sign?4:0) + (indata_format->bigendian?2:0) + (outdata_format->samplesize/sizeof(double)); if (indata_format->samplesize == 4) i += 8*indata_format->packing; /* printf("convert_array: i=%d\n",i); */ g_assert(ibigendian, dataformat_sample_t.bigendian)) byteswap(outdata,outdata_format->samplesize, count*outdata_format->samplesize); } } else if (outdata_format->type == DATAFORMAT_PCM) { /* FP -> PCM conversion */ if (XOR(indata_format->bigendian, dataformat_sample_t.bigendian)) { byteswap(indata,indata_format->samplesize, count*indata_format->samplesize); } i = (sample_convert_mode ? 48:0) + (outdata_format->samplesize-1)*8 + (outdata_format->sign?4:0) + (outdata_format->bigendian?2:0) + (indata_format->samplesize/sizeof(double)); if (outdata_format->samplesize == 4) i += 8*outdata_format->packing; g_assert(i < ARRAY_LENGTH(fp_pcm_functions)); if (indata_format->samplesize == sizeof(float) && outdata_format->samplesize > 2) dither_mode = DITHER_NONE; g_assert(dither_mode != DITHER_UNSPEC); if (dither_mode != DITHER_NONE) { if (indata_format->samplesize == sizeof(float)) cc = dither_convert_float(indata,outdata,count, fp_pcm_functions[i], real_ssize(outdata_format)); else cc = dither_convert_double(indata,outdata,count, fp_pcm_functions[i], real_ssize(outdata_format)); } else cc = fp_pcm_functions[i](indata,outdata,count); if (XOR(indata_format->bigendian, dataformat_sample_t.bigendian)) { byteswap(indata,indata_format->samplesize, count*indata_format->samplesize); } if (clipcount != NULL) *clipcount += cc; } else { /* FP -> FP conversion */ if (indata_format->samplesize == outdata_format->samplesize) { g_assert(XOR(indata_format->bigendian, outdata_format->bigendian)); memcpy(outdata,indata,count*indata_format->samplesize); byteswap(outdata,outdata_format->samplesize,count*outdata_format->samplesize); return; } if (XOR(indata_format->bigendian, dataformat_sample_t.bigendian)) byteswap(indata,indata_format->samplesize, count*indata_format->samplesize); if (indata_format->samplesize == sizeof(float)) { g_assert(outdata_format->samplesize == sizeof(double)); float *f = indata; double *d = outdata; int c = count; for (; c>0; c--,f++,d++) *d = (double)(*f); } else { g_assert(outdata_format->samplesize == sizeof(float)); double *d = indata; float *f = outdata; int c = count; for (; c>0; c--,f++,d++) *f = (float)(*d); } if (XOR(indata_format->bigendian, dataformat_sample_t.bigendian)) byteswap(indata,indata_format->samplesize, count*indata_format->samplesize); if (XOR(outdata_format->bigendian, dataformat_sample_t.bigendian)) byteswap(outdata,outdata_format->samplesize, count*outdata_format->samplesize); } } gint unnormalized_count(sample_t *buf, gint count, Dataformat *target) { gint i,c=0; sample_t maxval,minval; maxval = maximum_float_value(target); minval = minimum_float_value(target); for (i=0; i maxval || buf[i] < minval) c++; return c; } static void print_format(Dataformat *fmt) { if (fmt->type == DATAFORMAT_FLOAT) { if (fmt->samplesize == sizeof(float)) printf(_("Floating-point (single %s)\n"),fmt->bigendian?_("Big-endian"):_("Little-endian")); else printf(_("Floating-point (double %s)\n"),fmt->bigendian?_("Big-endian"):_("Little-endian")); } else { printf(_("PCM, %d(%d) bit, %s %s\n"), real_ssize(fmt)*8, fmt->samplesize*8, fmt->sign?_("Signed"):_("Unsigned"), fmt->bigendian?_("Big-endian"):_("Little-endian")); } } #define SBUFLEN 32 void conversion_selftest(void) { guint samplesizes[] = { 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, sizeof(float), sizeof(float), sizeof(double), sizeof(double) }; gboolean signs[] = { FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE }; gboolean endians[] = { FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, TRUE, FALSE, TRUE }; gint packings[] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,1,1,1,2,2,2,2, 0,0,0,0 }; gint types[] = { DATAFORMAT_PCM, DATAFORMAT_PCM, DATAFORMAT_PCM, DATAFORMAT_PCM, DATAFORMAT_PCM, DATAFORMAT_PCM, DATAFORMAT_PCM, DATAFORMAT_PCM, DATAFORMAT_PCM, DATAFORMAT_PCM, DATAFORMAT_PCM, DATAFORMAT_PCM, DATAFORMAT_PCM, DATAFORMAT_PCM, DATAFORMAT_PCM, DATAFORMAT_PCM, DATAFORMAT_PCM, DATAFORMAT_PCM, DATAFORMAT_PCM, DATAFORMAT_PCM, DATAFORMAT_PCM, DATAFORMAT_PCM, DATAFORMAT_PCM, DATAFORMAT_PCM, DATAFORMAT_FLOAT, DATAFORMAT_FLOAT, DATAFORMAT_FLOAT, DATAFORMAT_FLOAT}; guchar pcm_buf[SBUFLEN*8],pcm_buf2[SBUFLEN*8],pcm_buf3[SBUFLEN*8]; sample_t sbuf[SBUFLEN],sbuf2[SBUFLEN],sbuf3[SBUFLEN],sbuf4[SBUFLEN],s,s2; guint i,j,k; Dataformat fmt[2]; gboolean expect_fail, err=FALSE; int dm,scm; off_t cc; #if 0 fmt[0].type = DATAFORMAT_PCM; fmt[0].samplesize = 1; fmt[0].sign = FALSE; fmt[0].bigendian = TRUE; fmt[0].packing = 0; for (i=0; i<256; i++) pcm_buf[i] = i; convert_array(pcm_buf,fmt,sbuf,&dataformat_sample_t,256); convert_array(sbuf,&dataformat_sample_t,pcm_buf2,fmt,256); for (i=0; i<256; i++) printf("%d -> %f -> %d\n",pcm_buf[i],sbuf[i],pcm_buf2[i]); return; #endif /* puts(""); */ /* Perform tests */ for (dm=0; dm<2; dm++) { for (scm=0; scm<2; scm++) { printf("Dither mode: %d, Convert mode: %d\n",dm,scm); sample_convert_mode = scm; puts(_(" Testing ranges...")); /* Generate full range in sample_t buffer */ for (j=0; j %.10f, %.10f -> %.10f\n",sbuf[0],sbuf2[0], sbuf[SBUFLEN-1],sbuf2[SBUFLEN-1]); for (j=0,k=0; j fmt[1].samplesize || (fmt[0].samplesize != fmt[1].samplesize && dm != 0 && scm == 0)) expect_fail = TRUE; else expect_fail = FALSE; if (expect_fail) continue; convert_array(pcm_buf,fmt,pcm_buf2,fmt+1,ARRAY_LENGTH(sbuf), dm,NULL); convert_array(pcm_buf2,fmt+1,pcm_buf3,fmt,ARRAY_LENGTH(sbuf), dm,NULL); if (memcmp(pcm_buf,pcm_buf3, ARRAY_LENGTH(sbuf)*fmt[0].samplesize)) { if (expect_fail) fputs(_("(expected) "),stdout); fputs(_("Conversion test failed, between: "),stdout); print_format(fmt); fputs(_(" and: "),stdout); print_format(fmt+1); for (j=0,k=0; j2 && sizeof(sample_t)<8)) continue; fmt[0].type = types[i]; fmt[0].samplesize = samplesizes[i]; fmt[0].sign = signs[i]; fmt[0].bigendian = endians[i]; fmt[0].packing = packings[i]; /* print_format(fmt); */ /* Get FP values for minimum and minimum+1 */ int sgnloc = (packings[i] == 2) ? 1 : 0; int lsbloc = (packings[i] == 1) ? 2 : (samplesizes[i]-1); if (!endians[i]) { sgnloc=samplesizes[i]-1-sgnloc; lsbloc=samplesizes[i]-1-lsbloc; } memset(pcm_buf,0,8); if (signs[i]) { pcm_buf[sgnloc] = 0x80; pcm_buf[samplesizes[i]+sgnloc] = 0x80; } pcm_buf[samplesizes[i]+lsbloc] += 1; convert_array(pcm_buf,fmt,sbuf,&dataformat_sample_t,2,DITHER_NONE,NULL); /* printf("%02x %02x %02x %02x %02x %02x %02x %02x %f %f\n", pcm_buf[0], pcm_buf[1], pcm_buf[2], pcm_buf[3], pcm_buf[4], pcm_buf[5], pcm_buf[6], pcm_buf[7], sbuf[0],sbuf[1]); */ g_assert(sbuf[0] <= -1.0 && sbuf[1]>sbuf[0]); s = sbuf[1]; sbuf[SBUFLEN-1] = s; s = (s-sbuf[0]) / ((sample_t)(SBUFLEN-1)); s2 = sbuf[0]; for (j=0; j 0.5001 || s > 1e-7) break; } else { if (sbuf3[j] < -0.02 || sbuf3[j] > 0.02 || s > 1e-4) break; } } if (j < SBUFLEN) { err = TRUE; printf("Dither test failed for mode %d format: ",dm); print_format(fmt); for (j=0; j test_times[i].tv_sec || (test_times[j].tv_sec == test_times[i].tv_sec && test_times[j].tv_usec > test_times[i].tv_usec)) i = j; } f = (float)test_times[i].tv_sec + ((float)test_times[i].tv_usec) * 0.000001; f /= 100; i = 0; while (f < 1.0) { f*=10.0; i++; } f = 1.0; while (i > 0) { f/=10.0; i--; } printf(_("\n\nTest results (1 time unit = %f usec/sample)\n"), f*1000000/SBUFLEN); printf(" "); for (i=0; i /* struct describing the sample format. */ #define DATAFORMAT_PCM 0 /* Linear PCM */ #define DATAFORMAT_FLOAT 1 /* Floating-point (float or double array) */ typedef struct { int type; /* DATAFORMAT_PCM or DATAFORMAT_FLOAT */ guint32 samplerate; /* Samples/sec */ unsigned samplesize; /* bytes (PCM: 1,2,3 or 4, * float: sizeof(gfloat) or sizeof(gdouble))*/ int packing; /* For non-packed 24-in-32 samples, * set samplesize to 4 and packing to 1 (data in * MSB) or 2 (data in LSB) * For other types, this should be 0 */ int channels; /* Number of channels (1-8) */ int samplebytes; /* should always be samplesize*channels */ /* For DATAFORMAT_PCM only: */ gboolean sign; /* TRUE=signed, FALSE=unsigned */ gboolean bigendian; /* TRUE=big endian, FALSE=little endian */ } Dataformat; extern Dataformat dataformat_sample_t; extern Dataformat dataformat_single; #define CONVERT_MODE_BIASED 0 #define CONVERT_MODE_NOOFFS 1 #define CONVERT_MODE_MAX 1 extern gint sample_convert_mode; extern gboolean ieee_le_compatible,ieee_be_compatible; #define FORMAT_IS_SAMPLET(fmtp) ((fmtp)->type == DATAFORMAT_FLOAT && (fmtp)->samplesize == sizeof(sample_t)) void floating_point_check(void); /* Returns TRUE if the two formats are equal */ gboolean dataformat_equal(Dataformat *f1, Dataformat *f2); /* Returns TRUE if the two formats are equal but doesn't care for sample rate * or channels */ gboolean dataformat_samples_equal(Dataformat *f1, Dataformat *f2); /* Returns TRUE if there was a format stored. */ gboolean dataformat_get_from_inifile(gchar *ini_prefix, gboolean full, Dataformat *result); void dataformat_save_to_inifile(gchar *ini_prefix, Dataformat *format, gboolean full); const gchar *sampletype_name(Dataformat *fmt); /* ------------------- * CONVERSION ROUTINES * ------------------- */ #ifdef USE_DOUBLE_SAMPLES typedef gdouble sample_t; #define sf_readf_sample_t sf_readf_double #define sf_writef_sample_t sf_writef_double #else typedef gfloat sample_t; #define sf_readf_sample_t sf_readf_float #define sf_writef_sample_t sf_writef_float #endif #define DITHER_NONE 0 #define DITHER_MINIMAL 1 #define DITHER_MAX 1 /* This constant can be used to indicate that dithering should not * be necessary. If this is given when an FP->PCM conversion is done, * the program will halt. */ #define DITHER_UNSPEC -1 /* These convert one or many samples between pcm formats and sample_t * NOTE: These convert SINGLE-CHANNEL samples so you have to multiply the * count with the number of channels if you want to read full samples. * NOTE 2: These routines assumes the data to be in host endian order. */ #define maximum_float_value(x) (1.0) sample_t minimum_float_value(Dataformat *x); void convert_array(void *indata, Dataformat *indata_format, void *outdata, Dataformat *outdata_format, guint count, int dither_mode, off_t *clipcount); void apply_convert_factor(Dataformat *infmt, Dataformat *outfmt, sample_t *buffer, guint count); gint unnormalized_count(sample_t *buf, gint buflen, Dataformat *target); void conversion_selftest(void); void conversion_performance_test(void); #endif mhwaveedit-1.4.24/src/datasource.c000066400000000000000000000666741334022513400170440ustar00rootroot00000000000000/* * Copyright (C) 2002 2003 2004 2005 2006 2009 2010 2012, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include #include #include #include #include "gtkfiles.h" #include "ringbuf.h" #include "um.h" #include "main.h" #include "inifile.h" #include "datasource.h" #include "tempfile.h" #include "gettext.h" static GtkObjectClass *parent_class; static GList *datasource_list = NULL; guint datasource_count(void) { return g_list_length(datasource_list); } static void datasource_init(Datasource *obj) { /* printf("datasource_init(%p)\n",obj); */ datasource_list = g_list_append(datasource_list, obj); obj->type = DATASOURCE_SILENCE; obj->format.type = DATAFORMAT_PCM; obj->format.samplerate=44100; obj->format.samplesize=2; obj->format.packing=0; obj->format.channels=2; obj->format.sign=1; obj->format.bigendian = IS_BIGENDIAN; obj->format.samplebytes=4; obj->length = 0; obj->bytes = 0; obj->opencount = 0; obj->read_temparea.ptr = NULL; obj->read_temparea.size = 0; obj->readfp_temparea.ptr = NULL; obj->readfp_temparea.size = 0; obj->tag = 0; } static void datasource_clear(Datasource *ds) { g_assert(ds->opencount == 0); g_assert(ds->read_temparea.ptr == NULL && ds->readfp_temparea.ptr == NULL); switch (ds->type) { case DATASOURCE_TEMPFILE: if (ds->data.virtual.filename) xunlink(ds->data.virtual.filename); /* Fall through */ case DATASOURCE_VIRTUAL: if (ds->data.virtual.filename) { g_free(ds->data.virtual.filename); ds->data.virtual.filename = NULL; } break; case DATASOURCE_REAL: if (ds->data.real) { g_free(ds->data.real); ds->data.real = NULL; } break; case DATASOURCE_SNDFILE_TEMPORARY: if (ds->data.sndfile.filename) xunlink(ds->data.sndfile.filename); /* Fall through */ case DATASOURCE_SNDFILE: if (ds->data.sndfile.filename) { g_free(ds->data.sndfile.filename); ds->data.sndfile.filename = NULL; } break; case DATASOURCE_REF: case DATASOURCE_CLONE: case DATASOURCE_BYTESWAP: case DATASOURCE_CONVERT: if (ds->data.clone) gtk_object_unref(GTK_OBJECT(ds->data.clone)); ds->data.clone = NULL; break; case DATASOURCE_CHANMAP: if (ds->data.chanmap.clone) gtk_object_unref(GTK_OBJECT(ds->data.chanmap.clone)); if (ds->data.chanmap.map) g_free(ds->data.chanmap.map); ds->data.chanmap.clone = NULL; ds->data.chanmap.map = NULL; } ds->type = DATASOURCE_SILENCE; } static void datasource_destroy(GtkObject *obj) { Datasource *ds = DATASOURCE(obj); /* printf("datasource_destroy(%p)\n",obj); */ datasource_clear(ds); datasource_list = g_list_remove(datasource_list, obj); parent_class->destroy(obj); } static void datasource_class_init(GtkObjectClass *klass) { parent_class = gtk_type_class(gtk_object_get_type()); klass->destroy = datasource_destroy; } GtkType datasource_get_type(void) { static GtkType id = 0; if (!id) { GtkTypeInfo info = { "Datasource", sizeof(Datasource), sizeof(DatasourceClass), (GtkClassInitFunc) datasource_class_init, (GtkObjectInitFunc) datasource_init }; id=gtk_type_unique(gtk_object_get_type(),&info); } return id; } static char *datasource_get_temparea(struct temparea *ta, int size) { if (size > ta->size) { g_free(ta->ptr); ta->ptr = g_malloc(size); ta->size = size; } return ta->ptr; } /* Creates a copy of the original datasource * If it refers to a file, create a DATASOURCE_REF instead. */ static Datasource *datasource_copy(Datasource *orig) { Datasource *ds; ds = gtk_type_new(datasource_get_type()); ds->type = orig->type; memcpy(&(ds->format),&(orig->format),sizeof(Dataformat)); ds->length = orig->length; ds->bytes = orig->bytes; switch (orig->type) { case DATASOURCE_VIRTUAL: case DATASOURCE_TEMPFILE: case DATASOURCE_SNDFILE: case DATASOURCE_SNDFILE_TEMPORARY: ds->type = DATASOURCE_REF; ds->data.clone = orig; gtk_object_ref(GTK_OBJECT(orig)); gtk_object_sink(GTK_OBJECT(orig)); break; case DATASOURCE_REAL: ds->data.real = g_malloc(orig->bytes); memcpy(ds->data.real, orig->data.real, orig->bytes); break; case DATASOURCE_CLONE: case DATASOURCE_BYTESWAP: case DATASOURCE_REF: case DATASOURCE_CONVERT: ds->data.clone = orig->data.clone; gtk_object_ref(GTK_OBJECT(ds->data.clone)); gtk_object_sink(GTK_OBJECT(ds->data.clone)); break; case DATASOURCE_CHANMAP: ds->data.chanmap.clone = orig->data.chanmap.clone; gtk_object_ref(GTK_OBJECT(ds->data.chanmap.clone)); gtk_object_sink(GTK_OBJECT(ds->data.chanmap.clone)); ds->data.chanmap.map = g_malloc(ds->format.channels * sizeof(int)); memcpy(ds->data.chanmap.map, orig->data.chanmap.map, ds->format.channels*sizeof(int)); break; } return ds; } Datasource *datasource_clone_df(Datasource *source, Dataformat *format) { Datasource *df; if (source->type == DATASOURCE_REAL || source->type == DATASOURCE_SILENCE || source->type == DATASOURCE_CLONE) { df = datasource_copy(source); g_assert(df->type == source->type); memcpy(&(df->format),format,sizeof(Dataformat)); df->length = df->bytes / format->samplebytes; return df; } df = gtk_type_new(datasource_get_type()); df->type = DATASOURCE_CLONE; memcpy(&(df->format),format,sizeof(Dataformat)); df->bytes = source->bytes; df->length = source->bytes / format->samplebytes; df->data.clone = source; gtk_object_ref(GTK_OBJECT(source)); return df; } Datasource *datasource_byteswap(Datasource *source) { Datasource *ds; if (source == NULL) return NULL; ds = gtk_type_new(datasource_get_type()); ds->type = DATASOURCE_BYTESWAP; memcpy(&(ds->format),&(source->format),sizeof(Dataformat)); ds->format.bigendian = !source->format.bigendian; ds->length = source->length; ds->bytes = source->bytes; ds->data.clone = source; gtk_object_ref(GTK_OBJECT(source)); gtk_object_sink(GTK_OBJECT(source)); return ds; } Datasource *datasource_channel_map(Datasource *source, int n_channels, int *map) { Datasource *ds; if (source == NULL) return NULL; ds = gtk_type_new(datasource_get_type()); ds->type = DATASOURCE_CHANMAP; memcpy(&(ds->format),&(source->format),sizeof(Dataformat)); ds->format.channels = n_channels; ds->format.samplebytes = ds->format.samplesize * n_channels; ds->length = source->length; ds->bytes = ds->length * ds->format.samplebytes; ds->data.chanmap.clone = source; gtk_object_ref(GTK_OBJECT(source)); gtk_object_sink(GTK_OBJECT(source)); ds->data.chanmap.map = g_malloc(n_channels * sizeof(int)); memcpy(ds->data.chanmap.map, map, n_channels*sizeof(int)); return ds; } Datasource *datasource_new_silent(Dataformat *format, off_t samples) { Datasource *ds; ds = gtk_type_new(datasource_get_type()); memcpy(&(ds->format), format, sizeof(Dataformat)); ds->type = DATASOURCE_SILENCE; ds->length = samples; ds->bytes = samples * ds->format.samplebytes; return ds; } Datasource *datasource_new_from_data(void *data, Dataformat *format, guint32 size) { Datasource *ds; ds = (Datasource *)gtk_type_new(datasource_get_type()); ds->type = DATASOURCE_REAL; memcpy(&(ds->format),format,sizeof(Dataformat)); ds->length = size / format->samplebytes; ds->bytes = size; ds->data.real = data; return ds; } #define DUMP_BUFSIZE 65536 gboolean datasource_dump(Datasource *ds, off_t position, off_t length, EFILE *file, int dither_mode, StatusBar *bar, off_t *clipcount) { gchar *buf; off_t i; guint u; if (datasource_open(ds)) return TRUE; buf = g_malloc(DUMP_BUFSIZE); while (length > 0) { i = MIN(length*ds->format.samplebytes,DUMP_BUFSIZE); u = datasource_read_array(ds,position,i,buf,dither_mode,clipcount); if (u==0 || e_fwrite(buf,u,file) || status_bar_progress(bar,u)) { datasource_close(ds); g_free(buf); return TRUE; } length -= u/ds->format.samplebytes; position += u/ds->format.samplebytes; } datasource_close(ds); g_free(buf); return FALSE; } gboolean datasource_realize(Datasource *ds, int dither_mode) { gchar *c; guint32 sz=ds->bytes; if (datasource_open(ds)) return TRUE; c = g_malloc(sz); if (datasource_read_array(ds,0,sz,c, dither_mode,NULL)) { g_free(c); datasource_close(ds); return TRUE; } datasource_close(ds); datasource_clear(ds); ds->type = DATASOURCE_REAL; ds->data.real = c; return FALSE; } static gboolean datasource_open_sndfile(Datasource *ds) { #if defined(HAVE_LIBSNDFILE) SF_INFO i; SNDFILE *s; char *d; int fd; fd = xopen(ds->data.sndfile.filename,O_RDONLY,0); if (fd == -1) return TRUE; i.format = 0; s = sf_open_fd(fd,SFM_READ,&i,TRUE); if (s == NULL) { d = g_strdup_printf(_("Couldn't open %s"), ds->data.sndfile.filename); user_error(d); g_free(d); close(fd); return TRUE; } ds->data.sndfile.handle = s; ds->data.sndfile.pos = 0; return FALSE; #else g_assert_not_reached(); return TRUE; #endif } static void datasource_close_sndfile(Datasource *ds) { #if defined(HAVE_LIBSNDFILE) sf_close(ds->data.sndfile.handle); #else g_assert_not_reached(); #endif } gboolean datasource_open(Datasource *ds) { if (ds->opencount == 0) switch (ds->type) { case DATASOURCE_VIRTUAL: case DATASOURCE_TEMPFILE: ds->data.virtual.handle = e_fopen(ds->data.virtual.filename, EFILE_READ); if (ds->data.virtual.handle == NULL) return TRUE; ds->data.virtual.pos = 0; break; case DATASOURCE_SNDFILE: case DATASOURCE_SNDFILE_TEMPORARY: if (datasource_open_sndfile(ds)) return TRUE; break; case DATASOURCE_REF: case DATASOURCE_CLONE: case DATASOURCE_BYTESWAP: case DATASOURCE_CONVERT: if (datasource_open(ds->data.clone)) return TRUE; break; case DATASOURCE_CHANMAP: if (datasource_open(ds->data.chanmap.clone)) return TRUE; break; } ds->opencount ++; return FALSE; } static void clear_temparea(struct temparea *ta) { if (ta->ptr != NULL) { g_free(ta->ptr); ta->ptr = NULL; ta->size = 0; } } void datasource_close(Datasource *ds) { g_assert(ds->opencount != 0); ds->opencount --; if (ds->opencount > 0) return; clear_temparea(&ds->read_temparea); clear_temparea(&ds->readfp_temparea); switch (ds->type) { case DATASOURCE_VIRTUAL: case DATASOURCE_TEMPFILE: e_fclose(ds->data.virtual.handle); break; case DATASOURCE_SNDFILE: case DATASOURCE_SNDFILE_TEMPORARY: datasource_close_sndfile(ds); break; case DATASOURCE_REF: case DATASOURCE_CLONE: case DATASOURCE_BYTESWAP: case DATASOURCE_CONVERT: datasource_close(ds->data.clone); break; case DATASOURCE_CHANMAP: datasource_close(ds->data.chanmap.clone); break; } } static guint datasource_clone_read_array(Datasource *source, off_t sampleno, guint size, gpointer buffer, int dither_mode, off_t *clipcount) { /* This is not optimized but it's only used in rare cases so the important * thing is that it works.*/ off_t orig_offset; off_t orig_sampleno; off_t orig_size; off_t orig_adjust; guint x; gchar *p; /* Offset to be sent to the original chunk */ orig_offset = sampleno * source->format.samplebytes; /* orig_offset converted to sample number */ orig_sampleno = orig_offset / source->data.clone->format.samplebytes; /* How bany bytes too early will we read? */ orig_adjust = orig_offset % source->data.clone->format.samplebytes; /* How much data should we read (should be able to fill buffer) */ orig_size = size + orig_adjust + source->data.clone->format.samplebytes - 1; p = datasource_get_temparea(&(source->read_temparea),orig_size); x = datasource_read_array(source->data.clone, orig_sampleno, orig_size, p, dither_mode,clipcount); if (x != 0) { g_assert(x-orig_adjust >= size); memcpy(buffer, p+orig_adjust, size); x = size; } return x; } #if defined(HAVE_LIBSNDFILE) static void sndfile_read_error(sf_count_t x, Datasource *source) { gchar c[256],*d; if (x<0) sf_error_str(source->data.sndfile.handle,c,sizeof(c)); else strcpy(c,_("Unexpected end of file")); d = g_strdup_printf(_("Error reading %s: %s"), source->data.sndfile.filename, c); user_error(d); g_free(d); } #endif static guint datasource_sndfile_read_array(Datasource *source, off_t sampleno, guint size, gpointer buffer) { #if defined(HAVE_LIBSNDFILE) gchar c[256],*d; sf_count_t samples,x; if (source->data.sndfile.pos != sampleno) { if (sf_seek(source->data.sndfile.handle,sampleno,SEEK_SET) == -1) { sf_error_str(source->data.sndfile.handle,c,sizeof(c)); d = g_strdup_printf(_("Error seeking in %s: %s"), source->data.sndfile.filename, c); user_error(d); g_free(d); return 0; } source->data.sndfile.pos = sampleno; } samples = size / source->format.samplebytes; if (source->format.type == DATAFORMAT_FLOAT) { x = sf_readf_sample_t(source->data.sndfile.handle,buffer,samples); } else if (source->data.sndfile.raw_readable) { /* Read raw */ x = sf_read_raw(source->data.sndfile.handle,buffer,size); x /= source->format.samplebytes; } else if (source->format.samplesize==2 && source->format.sign) { /* Read as short */ x = sf_readf_short(source->data.sndfile.handle,buffer,samples); } else if (source->format.samplesize==4 && source->format.sign && source->format.packing < 2) { /* Read as int */ /* TODO: Handle archs with sizeof(int)>4 */ x = sf_readf_int(source->data.sndfile.handle,buffer,samples); } else { g_assert_not_reached(); return 0; } if (x>0) source->data.sndfile.pos += x; if (xformat.samplebytes; #else g_assert_not_reached(); return 0; #endif } static void remap_main(void *source_buf, int item_size, int source_channels, void *dest_buf, int dest_channels, int *map, int items) { int i,j; char *sp,*dp; int dstep,sstep; /* Simplest possible implementation - room for optimization */ dstep = item_size*dest_channels; sstep = item_size*source_channels; for (i=0; i= source_channels) { for (j=0; jtype) { case DATASOURCE_REAL: memcpy(buffer,source->data.real+sampleno*source->format.samplebytes, size); return size; case DATASOURCE_VIRTUAL: case DATASOURCE_TEMPFILE: /* Calculate offset in file */ x = source->data.virtual.offset + sampleno*source->format.samplebytes; if (x != source->data.virtual.pos && e_fseek(source->data.virtual.handle, x, SEEK_SET)) return 0; source->data.virtual.pos = x; if (e_fread(buffer,size,source->data.virtual.handle)) return 0; source->data.virtual.pos += size; return size; case DATASOURCE_SILENCE: memset(buffer,0,size); return size; case DATASOURCE_SNDFILE: case DATASOURCE_SNDFILE_TEMPORARY: return datasource_sndfile_read_array(source,sampleno,size,buffer); case DATASOURCE_REF: return datasource_read_array_main(source->data.clone,sampleno,size, buffer,dither_mode,clipcount); case DATASOURCE_CLONE: return datasource_clone_read_array(source,sampleno,size,buffer, dither_mode,clipcount); case DATASOURCE_BYTESWAP: u = datasource_read_array_main(source->data.clone,sampleno,size, buffer,dither_mode,clipcount); if (u>0) byteswap(buffer,source->format.samplesize,u); return u; case DATASOURCE_CONVERT: u = size / source->format.samplebytes; if (dataformat_samples_equal(&(source->format),&dataformat_sample_t)) return datasource_read_array_fp(source->data.clone,sampleno,u, buffer,dither_mode,clipcount) * source->format.samplebytes ; c = (sample_t *)datasource_get_temparea(&(source->read_temparea), u*sizeof(sample_t)* source->format.channels); u = datasource_read_array_fp(source->data.clone, sampleno, u, (gpointer)c,dither_mode,clipcount); if (u > 0) { apply_convert_factor(&(source->data.clone->format), &(source->format), (sample_t *)c, u*source->format.channels); convert_array(c,&dataformat_sample_t,buffer,&(source->format), u*source->format.channels,dither_mode,clipcount); } return u * source->format.samplebytes; case DATASOURCE_CHANMAP: u = (size / source->format.samplebytes) * source->data.chanmap.clone->format.samplebytes; c = (sample_t *)datasource_get_temparea(&(source->read_temparea),u); g_assert(c != buffer); u = datasource_read_array_main(source->data.chanmap.clone, sampleno, u, c, dither_mode,clipcount); s = u / source->data.chanmap.clone->format.samplebytes; if (s > 0) remap_main(c, source->data.chanmap.clone->format.samplesize, source->data.chanmap.clone->format.channels, buffer, source->format.channels, source->data.chanmap.map, s); return s*source->format.samplebytes; default: g_assert_not_reached(); return 0; } } guint datasource_read_array(Datasource *source, off_t sampleno, guint size, gpointer buffer, int dither_mode, off_t *clipcount) { off_t o; g_assert(source->opencount > 0); /* Check sampleno */ g_assert(sampleno <= source->length); /* Check size */ /* Round down to even samples */ size = size - size % source->format.samplebytes; o = (source->length - sampleno) * (off_t)(source->format.samplebytes); if (size > o) size = (guint)o; /* Round down to available data */ if (size == 0) return 0; /* Do it */ return datasource_read_array_main(source,sampleno,size,buffer, dither_mode,clipcount); } gboolean datasource_read(Datasource *source, off_t sampleno, gpointer buffer, int dither_mode) { return (datasource_read_array(source,sampleno,source->format.samplebytes, buffer,dither_mode,NULL) != source->format.samplebytes); } guint datasource_read_array_fp(Datasource *source, off_t sampleno, guint samples, sample_t *buffer, int dither_mode, off_t *clipcount) { gchar *p; guint x,s; g_assert(source->opencount > 0); g_assert(sampleno <= source->length); if (samples > source->length-sampleno) samples = (guint)(source->length-sampleno); if (samples == 0) return 0; switch (source->type) { case DATASOURCE_SILENCE: memset(buffer,0,samples*source->format.channels*sizeof(sample_t)); return samples; case DATASOURCE_REF: case DATASOURCE_CONVERT: g_assert(source->type == DATASOURCE_CONVERT || dataformat_equal(&(source->format), &(source->data.clone->format))); x = datasource_read_array_fp(source->data.clone,sampleno, samples,buffer,dither_mode, clipcount); apply_convert_factor(&(source->data.clone->format), &(source->format), buffer, x*source->format.channels); return x; default: if (dataformat_samples_equal(&(source->format),&dataformat_sample_t)) return datasource_read_array(source,sampleno, samples*source->format.samplebytes, buffer, dither_mode, clipcount) / source->format.samplebytes; s = samples * source->format.samplebytes; p = datasource_get_temparea(&(source->readfp_temparea),s); x = datasource_read_array(source,sampleno,s,p,dither_mode,clipcount); g_assert(x==s || x==0); if (x==s) { convert_array(p,&(source->format),buffer,&dataformat_sample_t, samples*source->format.channels,dither_mode,clipcount); return samples; } return 0; } } gboolean datasource_read_fp(Datasource *ds, off_t sampleno, sample_t *buffer, int dither_mode) { return (datasource_read_array_fp(ds,sampleno,1,buffer,dither_mode,NULL)!=1); } static gboolean datasource_uses_file(Datasource *ds, gchar *filename) { return ((ds->type==DATASOURCE_VIRTUAL && is_same_file(ds->data.virtual.filename,filename)) || ((ds->type==DATASOURCE_SNDFILE && is_same_file(ds->data.sndfile.filename,filename)))); } gboolean datasource_backup_unlink(gchar *filename) { GList *l,*q=NULL; Datasource *ds; Datasource *backup=NULL; gchar *lastname=filename,*t; guint dirnum=0; gint i; /* Find out which Datasources actually use the file. */ for (l=datasource_list; l!=NULL; l=l->next) { ds = (Datasource *)l->data; if (datasource_uses_file(ds,filename)) q = g_list_append(q,ds); } /* Now iterate through those files. */ for (l=q; l!=NULL; l=l->next) { ds = (Datasource *)l->data; if (!datasource_uses_file(ds,filename)) continue; /* For the first affected datasource (backup == NULL), the file is * moved to a temporary directory and the filename in the datasource * is updated. For each remaining sources, the file is copied. * * This is not optimal, but the case with more than one reference to * a file can only happen when the user has opened the same file * multiple times. */ if (backup == NULL) { /* This loop first tries to move the file to each temporary * directory. If all directories fail, we copy the file. */ dirnum = 0; while (1) { t = get_temp_filename(dirnum); if (t == NULL) { dirnum = 0; t = get_temp_filename(0); i = xrename(lastname,t,TRUE); break; } i = xrename(lastname,t,FALSE); if (i!=2) break; dirnum ++; g_free(t); } if (i) { g_free(t); return TRUE; } } else { /* Special case: the same file has been opened many times. */ t = get_temp_filename(0); if (errdlg_copyfile(lastname,t)) { g_free(t); return TRUE; } } switch (ds->type) { case DATASOURCE_VIRTUAL: g_free(ds->data.virtual.filename); ds->data.virtual.filename = t; ds->type = DATASOURCE_TEMPFILE; break; case DATASOURCE_SNDFILE: g_free(ds->data.sndfile.filename); ds->data.sndfile.filename = t; ds->type = DATASOURCE_SNDFILE_TEMPORARY; break; default: g_assert_not_reached(); break; } backup = ds; lastname = t; } g_list_free(q); return xunlink(filename); } Datasource *datasource_convert(Datasource *source, Dataformat *new_format) { Datasource *ds; if (source == NULL) return NULL; g_assert(!dataformat_equal(new_format,&(source->format))); g_assert(new_format->channels == source->format.channels && new_format->samplerate == source->format.samplerate); if (source->format.type == DATAFORMAT_PCM && new_format->type == DATAFORMAT_PCM && source->format.samplesize == new_format->samplesize && source->format.sign == new_format->sign && source->format.packing == new_format->packing) { g_assert(XOR(source->format.bigendian,new_format->bigendian)); return datasource_byteswap(source); } if (source->format.type == DATAFORMAT_FLOAT && new_format->type == DATAFORMAT_FLOAT && source->format.samplesize == new_format->samplesize) { g_assert(XOR(source->format.bigendian,new_format->bigendian)); return datasource_byteswap(source); } ds = gtk_type_new(datasource_get_type()); ds->type = DATASOURCE_CONVERT; memcpy(&(ds->format),new_format,sizeof(Dataformat)); ds->format.samplebytes = ds->format.samplesize * ds->format.channels; ds->length = source->length; ds->bytes = ds->length * new_format->samplebytes; ds->data.clone = source; gtk_object_ref(GTK_OBJECT(source)); gtk_object_sink(GTK_OBJECT(source)); return ds; } #define NS 4096 static gint datasource_clip_check_fp(Datasource *ds, StatusBar *bar) { sample_t *buf; off_t o; guint i; off_t clipcount = 0; g_assert(ds->format.type == DATAFORMAT_FLOAT); if (datasource_open(ds)) return -1; buf = g_malloc(sizeof(sample_t) * ds->format.samplebytes); for (o=0; olength; ) { i = datasource_read_array_fp(ds,o,NS,buf,DITHER_UNSPEC,&clipcount); o += i; if (i == 0) { g_free(buf); datasource_close(ds); return -1; } if (clipcount > 0) { g_free(buf); datasource_close(ds); return 1; } if (status_bar_progress(bar,NS)) { g_free(buf); datasource_close(ds); return -2; } } datasource_close(ds); g_free(buf); return 0; } #undef NS gint datasource_clip_check(Datasource *ds, StatusBar *bar) { gint i; switch (ds->type) { case DATASOURCE_SNDFILE: case DATASOURCE_SNDFILE_TEMPORARY: /* Libsndfile is always used with normalization turned on */ return 0; case DATASOURCE_SILENCE: /* Trivial */ return 0; case DATASOURCE_REAL: case DATASOURCE_VIRTUAL: case DATASOURCE_TEMPFILE: /* If we contain PCM data, clipping can't occur */ if (ds->format.type == DATAFORMAT_PCM) return 0; return datasource_clip_check_fp(ds,bar); case DATASOURCE_BYTESWAP: case DATASOURCE_CLONE: /* This could cause clipping in special cases. * That clipping can not be solved by normalizing the data. */ i = datasource_clip_check(ds->data.clone,bar); if (i < 0) return i; if (i > 0) return 2; if (ds->format.type == DATAFORMAT_FLOAT) return datasource_clip_check_fp(ds,bar); else return 0; case DATASOURCE_REF: case DATASOURCE_CONVERT: return datasource_clip_check(ds->data.clone,bar); case DATASOURCE_CHANMAP: return datasource_clip_check(ds->data.chanmap.clone,bar); default: break; } g_assert_not_reached(); return 0; } mhwaveedit-1.4.24/src/datasource.h000066400000000000000000000214601334022513400170310ustar00rootroot00000000000000/* * Copyright (C) 2002 2003 2004 2005 2006 2009, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ /* Datasource object represent a source of PCM data. */ /* This is (and should be) mainly used by chunk.c */ #ifndef DATASOURCE_H_INCLUDED #define DATASOURCE_H_INCLUDED #include #include "gtkfiles.h" #include "statusbar.h" #include "dataformat.h" #define DATASOURCE(obj) GTK_CHECK_CAST(obj,datasource_get_type(),Datasource) #define DATASOURCE_CLASS(klass) GTK_CHECK_CLASS_CAST(klass,datasource_get_type(),DatasourceClass) #define IS_DATASOURCE(obj) GTK_CHECK_TYPE(obj,datasource_get_type()) #ifndef HAVE_LIBSNDFILE #define SNDFILE void #else #include #endif /* Values for the type member of the Datasource struct. Determines how to * actually get the data. */ /* Data stored directly in memory */ #define DATASOURCE_REAL 0 /* The data is stored in a (read-only) file. */ #define DATASOURCE_VIRTUAL 1 /* Data stored in a file that will be removed when the Datasource is * destroyed. */ #define DATASOURCE_TEMPFILE 2 /* Silence (duh) */ #define DATASOURCE_SILENCE 3 /* The data is read using libSndfile */ #define DATASOURCE_SNDFILE 4 /* Same as DATASOURCE_SNDFILE but will be removed when the chunk is * destroyed. */ #define DATASOURCE_SNDFILE_TEMPORARY 5 /* Reference to another Datasource. Has the same format. * All requests will simply be passed on to the referred datasource. */ #define DATASOURCE_REF 6 /* Clone of another PCM Datasource. The Clone can have different * format than the original. This is used for mending files with * broken headers..*/ #define DATASOURCE_CLONE 7 /* Byteswapped clone of PCM datsource.*/ #define DATASOURCE_BYTESWAP 8 /* Autoconverting datasource. This Datasource must have the * same number of channels as referred Datasource. * Floating point requests will be passed on to the referred * Datasource, PCM requests will be sent as FP requests and then * automatically converted from the FP data. */ #define DATASOURCE_CONVERT 9 /* Clone of other datasource with channels rearranged. * Has the sample sample format and rate, but can have different number of * channels */ #define DATASOURCE_CHANMAP 10 struct temparea { gpointer ptr; int size; }; struct _Datasource; struct _Datasource { GtkObject object; gint type; Dataformat format; off_t length; /*Number of samples */ off_t bytes; /* Number of bytes in file. */ guint opencount; /* To keep track of nested open/close calls */ /* Temporary areas for internal use */ struct temparea read_temparea,readfp_temparea; gint tag; /* Extra field... */ /* Type-specific data */ union { /* --- DATASOURCE_TEMPFILE and DATASOURCE_VIRTUAL --- */ struct { char *filename; off_t offset; /* Offset of data in file (bytes) */ EFILE *handle; off_t pos; /* Current position in file (bytes) */ } virtual; /* --- DATASOURCE_REAL ---*/ char *real; /* Pointer into the memory buffer with the sound data. */ /* --- DATASOURCE_SNDFILE and DATASOURCE_SNDFILE_TEMPORARY --- */ struct { char *filename; gboolean raw_readable; SNDFILE *handle; off_t pos; /* Current position in file (samples) */ } sndfile; /* DATASOURCE_CLONE, DATASOURCE_REF, DATASOURCE_CONVERT and * DATASOURCE_BYTESWAP */ struct _Datasource *clone; /* DATASOURCE_CHANMAP */ struct { struct _Datasource *clone; int *map; } chanmap; } data; }; typedef struct _Datasource Datasource; typedef struct { GtkObjectClass klass; } DatasourceClass; GtkType datasource_get_type(void); /* ------------ * CONSTRUCTORS * ------------ */ /* Create data source from another Datasource object. The format of the data * will be that of the format argument, regardless of what the other source * specifies. This makes it possible to override the format when you know it is * wrong. * source must be a PCM datasource */ Datasource *datasource_clone_df(Datasource *source, Dataformat *format); /* Returns a byte-swapped clone of another Datasource. * source must be a PCM datasource */ Datasource *datasource_byteswap(Datasource *source); /* Returns a Datasource containing the same data as source, but converted to * new_format. If source is floating-point, the original data will still * be returned when the read_array_fp function is used. source and new must * have the same number of channels and samplerate. */ Datasource *datasource_convert(Datasource *source, Dataformat *new_format); /* Returns a Datasource containing the same data as source, but with its * channels remapped. * n_channels is the number of channels in the new source. * map should point to an array length n_channels mapping to source channels */ Datasource *datasource_channel_map(Datasource *source, int n_channels, int *map); /* Create a data source from a memory buffer of data. The buffer will be * g_free:d when the data source is destroyed and the data should not be * modified by the caller any more after this call. */ Datasource *datasource_new_from_data(void *data, Dataformat *format, guint32 size); /* Create a new datasource containing silence with a certain format and the * specified number of samples */ Datasource *datasource_new_silent(Dataformat *format, off_t samples); /* --------------------- * DATA ACCESS FUNCTIONS * --------------------- */ /* Open the data source. Must be called before any of the other data access * functions. May be called more than one time for the same Datasource. */ gboolean datasource_open(Datasource *source); /* Close the data source. Must be called once for each call to * datasource_open. */ void datasource_close(Datasource *source); /* Read one/many PCM/float sample from the Data source into the buffer. The * sample data will always be in host endian order. */ gboolean datasource_read(Datasource *source, off_t sampleno, gpointer buffer, int dither_mode); gboolean datasource_read_fp(Datasource *source, off_t sampleno, sample_t *buffer, int dither_mode); /* Returns number of bytes read (0 on error). If clipping != NULL and clipping * conversion was performed, sets *clipping to TRUE. */ guint datasource_read_array(Datasource *source, off_t sampleno, guint size, gpointer buffer, int dither_mode, off_t *clipcount); /* Returns number of (multi-channel) samples read (0 on error). */ guint datasource_read_array_fp(Datasource *source, off_t sampleno, guint samples, sample_t *buffer, int dither_mode, off_t *clipcount); /* ------- * VARIOUS * ------- */ /* Returns the number of active Datasource objects */ guint datasource_count(void); /* This dumps the contents of the datasource into a file. You don't need * to open the datasource when using this function. The StatusBar must * already be in progress mode. */ gboolean datasource_dump(Datasource *ds, off_t position, off_t length, EFILE *file, int dither_mode, StatusBar *bar, off_t *clipcount); /* This reads all the data of the datasource into a memory buffer and converts * it into a memory datasource. */ gboolean datasource_realize(Datasource *ds, int dither_mode); /* This function will unlink a file. If any of the Datasources depend on this * file, the file will be moved or copied into a temporary file before the * original name is unlinked. */ gboolean datasource_backup_unlink(gchar *filename); /* Returns zero if reading the datasource does not cause clipping conversion. * and the datasource contains normalized data. * Returns non-zero if reading the datasource causes clipping conversion * Returns 1 if the error can be solved by normalizing the Datasource * Returns 2 if the error can not be solved in that way (very special cases) * Returns <0 if an error or break occurred while checking * The StatusBar must already be in progress mode. */ gint datasource_clip_check(Datasource *ds, StatusBar *bar); #endif mhwaveedit-1.4.24/src/document.c000066400000000000000000000632451334022513400165170ustar00rootroot00000000000000/* * Copyright (C) 2005 2006 2007 2010 2011 2012, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include #include "um.h" #include "document.h" #include "filetypes.h" #include "player.h" #include "gettext.h" ListObject *document_objects = NULL; Document *playing_document = NULL; static guint untitled_count = 0; gboolean view_follow_strict_flag; enum { VIEW_CHANGED_SIGNAL, SELECTION_CHANGED_SIGNAL, CURSOR_CHANGED_SIGNAL, STATE_CHANGED_SIGNAL, LAST_SIGNAL }; static guint document_signals[LAST_SIGNAL] = { 0 }; static GtkObjectClass *parent_class; static void document_set_cursor_main(Document *d, off_t cursorpos, gboolean playslave, gboolean running, off_t bufpos); static void clear_marklist(struct MarkList *m) { int i; for (i=0; ilength; i++) g_free(m->names[i]); g_free(m->names); g_free(m->places); m->names = NULL; m->places = NULL; m->length = m->alloced = 0; } static void copy_marklist(struct MarkList *dest, struct MarkList *src) { int i; for (i=0; ilength; i++) g_free(dest->names[i]); dest->length = 0; if ( dest->alloced < src->length ) { dest->names = g_realloc(dest->names, src->length * sizeof(dest->names[0])); dest->places = g_realloc(dest->places, src->length * sizeof(dest->places[0])); dest->alloced = src->length; } for (i=0; ilength; i++) { dest->names[i] = g_strdup(src->names[i]); dest->places[i] = src->places[i]; } dest->length = src->length; } static gboolean marklist_equal(struct MarkList *l1, struct MarkList *l2) { int i,j; if (l1->length != l2->length) return FALSE; for (i=0; ilength; i++) { for (j=0; jlength; j++) if (!strcmp(l1->names[i],l2->names[j])) break; if (j == l2->length) return FALSE; if (l1->places[i] != l2->places[i]) return FALSE; } return TRUE; } static void document_init(GtkObject *obj) { Document *d = DOCUMENT(obj); d->filename = NULL; d->lossy = FALSE; d->titlename = NULL; d->title_serial = 0; d->history_pos = NULL; d->chunk = NULL; d->viewstart = d->viewend = 0; d->selstart = d->selend = 0; d->cursorpos = 0; d->marks.length = d->marks.alloced = 0; /* Most initialization is delayed until we have a chunk */ } static void clear_history(struct HistoryEntry *h) { struct HistoryEntry *ph; if (h != NULL) { while (h->next != NULL) h=h->next; while (h != NULL) { if (h->chunk != NULL) { gtk_object_unref(GTK_OBJECT(h->chunk)); h->chunk = NULL; } clear_marklist(&(h->marks)); ph = h->prev; g_free(h); h = ph; } } } static void document_destroy(GtkObject *object) { Document *d = DOCUMENT(object); if (d->filename != NULL) { g_free(d->filename); d->filename = NULL; } if (d->titlename != NULL) { g_free(d->titlename); d->titlename = NULL; } if (d->chunk != NULL) { gtk_object_unref(GTK_OBJECT(d->chunk)); d->chunk = NULL; } clear_history(d->history_pos); d->history_pos = NULL; list_object_remove(document_objects,object); parent_class->destroy(object); } static void document_state_changed(Document *d) { list_object_notify(document_objects,d); } static void document_class_init(GtkObjectClass *klass) { DocumentClass *dc = DOCUMENT_CLASS(klass); parent_class = gtk_type_class(gtk_object_get_type()); klass->destroy = document_destroy; dc->view_changed = NULL; dc->selection_changed = NULL; dc->cursor_changed = NULL; dc->state_changed = document_state_changed; document_signals[VIEW_CHANGED_SIGNAL] = gtk_signal_new("view-changed", GTK_RUN_FIRST, GTK_CLASS_TYPE(klass), GTK_SIGNAL_OFFSET(DocumentClass,view_changed), gtk_marshal_NONE__NONE, GTK_TYPE_NONE, 0); document_signals[SELECTION_CHANGED_SIGNAL] = gtk_signal_new("selection-changed", GTK_RUN_FIRST, GTK_CLASS_TYPE(klass), GTK_SIGNAL_OFFSET(DocumentClass,selection_changed), gtk_marshal_NONE__NONE, GTK_TYPE_NONE, 0); document_signals[CURSOR_CHANGED_SIGNAL] = gtk_signal_new("cursor-changed", GTK_RUN_FIRST, GTK_CLASS_TYPE(klass), GTK_SIGNAL_OFFSET(DocumentClass,cursor_changed), gtk_marshal_NONE__BOOL, GTK_TYPE_NONE, 1, GTK_TYPE_BOOL); document_signals[STATE_CHANGED_SIGNAL] = gtk_signal_new("state-changed", GTK_RUN_FIRST, GTK_CLASS_TYPE(klass), GTK_SIGNAL_OFFSET(DocumentClass,state_changed), gtk_marshal_NONE__NONE, GTK_TYPE_NONE, 0); gtk_object_class_add_signals(klass,document_signals,LAST_SIGNAL); } GtkType document_get_type(void) { static GtkType id = 0; if (!id) { GtkTypeInfo info = { "Document", sizeof(Document), sizeof(DocumentClass), (GtkClassInitFunc) document_class_init, (GtkObjectInitFunc) document_init }; id = gtk_type_unique(gtk_object_get_type(),&info); } return id; } Document *document_new_with_file(gchar *filename, StatusBar *bar) { Chunk *c; gboolean b; Document *d; c = chunk_load_x(filename,dither_editing,bar,&b); if (c == NULL) return NULL; d = document_new_with_chunk(c,filename,bar); d->lossy = b; return d; } static void document_set_filename(Document *d, gchar *filename, gboolean do_notify) { guint i=0; GList *l; Document *x; if ((filename == d->filename && filename != NULL) || (d->filename != NULL && filename != NULL && !strcmp(d->filename,filename))) return; g_free(d->titlename); g_free(d->filename); d->filename = g_strdup(filename); if (filename == NULL) { d->titlename = g_strdup_printf(_("untitled #%d"),++untitled_count); } else { for (l=document_objects->list;l!=NULL;l=l->next) { x = DOCUMENT(l->data); if (x == d) continue; if (d->filename == NULL || x->filename == NULL || strcmp(namepart(d->filename),namepart(x->filename))) continue; if (x->title_serial > i) i=x->title_serial; } d->title_serial = i+1; if (d->title_serial > 1) d->titlename = g_strdup_printf("%s #%d",namepart(d->filename), d->title_serial); else d->titlename = g_strdup(namepart(d->filename)); } if (do_notify) list_object_notify(document_objects,d); } void document_forget_filename(Document *d) { document_set_filename(d,NULL,FALSE); gtk_signal_emit(GTK_OBJECT(d),document_signals[STATE_CHANGED_SIGNAL]); } Document *document_new_with_chunk(Chunk *chunk, gchar *sourcename, StatusBar *bar) { Document *d = (Document *)gtk_type_new(document_get_type()); /* Don't send the notify signal from document_objects here, since we * haven't added the document yet. */ document_set_filename(d,sourcename,FALSE); d->chunk = chunk; gtk_object_ref(GTK_OBJECT(chunk)); gtk_object_sink(GTK_OBJECT(chunk)); d->viewstart = 0; d->viewend = chunk->length; d->bar = bar; /* The add signal will be sent here */ list_object_add(document_objects,d); return d; } gboolean document_save(Document *d, gchar *filename, gint type_id, gboolean use_defs) { gboolean b; int i; if (d->filename != NULL && !strcmp(filename,d->filename) && d->lossy) { i = user_message(_("Loading and then saving files with 'lossy' " "formats (like mp3 and ogg) leads to a quality " "loss, also for the unmodified parts of the " "file."), UM_OKCANCEL); if (i == MR_CANCEL) return TRUE; } b = chunk_save(d->chunk,filename,type_id,use_defs,dither_editing,d->bar); if (!b) { clear_history(d->history_pos); d->history_pos = NULL; document_set_filename(d,filename,TRUE); gtk_signal_emit(GTK_OBJECT(d), document_signals[STATE_CHANGED_SIGNAL]); } return b; } static void cursor_cb(off_t pos, off_t bufpos, gboolean is_running) { Document *d = playing_document; if (playing_document != NULL) { if (!is_running) playing_document=NULL; document_set_cursor_main(d,pos,TRUE,is_running,bufpos); if (!is_running) gtk_object_unref(GTK_OBJECT(d)); } } void document_play(Document *d, off_t start, off_t end, gboolean loop, gfloat speed) { off_t ps,pe,pc; g_assert(d != NULL); /* This special if case was introduced to avoid a skipping sound * caused by the cursor not matching the actual playing positon when * pressing the "play" button and you're already playing. This * becomes a "wobbling" sound when holding down the ',' key due * to the keyboard auto-repeating. */ if (player_playing() && playing_document == d && BOOLEQ(player_looping(),loop) && start == d->cursorpos && d->cursorpos < player_get_buffer_pos()) { /* Keep everything intact except end */ player_get_range(&ps,&pe); pc = player_get_buffer_pos(); player_change_range(pc,end); } else { /* General case */ /* Stop the player if running, this should lead to cursor_cb * being called and clearing playing_document */ player_stop(); g_assert(playing_document == NULL); /* playing_document must be setup before calling player_play, * since for very short files the cursor_cb might be called * immediately with is_running==FALSE */ playing_document = d; gtk_object_ref(GTK_OBJECT(d)); if (player_play(d->chunk,start,end,loop,cursor_cb)) { playing_document = NULL; gtk_object_unref(GTK_OBJECT(d)); } } /* This sets the speed to the proper value */ player_set_speed(speed); } void document_play_from_cursor(Document *d, gboolean loopmode, gfloat speed) { g_assert(d != NULL); document_play(d,d->cursorpos,d->chunk->length,loopmode,speed); } void document_play_selection(Document *d, gboolean loopmode, gfloat speed) { g_assert(d != NULL); if (d->selstart != d->selend) document_play(d,d->selstart,d->selend,loopmode,speed); else document_play(d,0,d->chunk->length,loopmode,speed); } void document_stop(Document *d, gboolean do_return) { off_t s,e; g_assert(d != NULL); if (d != playing_document) return; player_get_range(&s,&e); player_stop(); g_assert(playing_document == NULL); if (do_return) document_set_cursor(d,s); } /* Make sure the current state is stored properly in history */ static void fix_history(Document *d) { struct HistoryEntry *h; if (d->history_pos == NULL || d->chunk != d->history_pos->chunk || d->selstart != d->history_pos->selstart || d->selend != d->history_pos->selend || !marklist_equal(&(d->marks),&(d->history_pos->marks))) { /* Create a new history entry and add it to the history */ h = g_malloc0(sizeof(*h)); h->chunk = d->chunk; gtk_object_ref(GTK_OBJECT(d->chunk)); h->selstart = d->selstart; h->selend = d->selend; h->viewstart = d->viewstart; h->viewend = d->viewend; h->cursor = d->cursorpos; copy_marklist(&(h->marks), &(d->marks)); if (d->history_pos == NULL) { h->prev = h->next = NULL; d->history_pos = h; } else { h->prev = d->history_pos; h->next = d->history_pos->next; if (h->next != NULL) h->next->prev = h; d->history_pos->next = h; d->history_pos = h; } } } void document_update(Document *d, Chunk *new_chunk, off_t movestart, off_t movedist) { int i,j; if (new_chunk == NULL) return; /* Make sure the current state is stored in history */ fix_history(d); /* Remove current redo data, if any. */ if (d->history_pos->next != NULL) { d->history_pos->next->prev = NULL; clear_history(d->history_pos->next); d->history_pos->next = NULL; } /* If we've converted sample rate or channel, we must stop playback */ if ((d->chunk->format.channels != new_chunk->format.channels || d->chunk->format.samplerate != new_chunk->format.samplerate) && playing_document == d) player_stop(); /* Set the new chunk */ gtk_object_unref(GTK_OBJECT(d->chunk)); d->chunk = new_chunk; gtk_object_ref(GTK_OBJECT(new_chunk)); gtk_object_sink(GTK_OBJECT(new_chunk)); /* Update the view. We have three cases: */ if ((d->viewend - d->viewstart) >= new_chunk->length) { /* 1. The resulting chunk is smaller than the current view */ d->viewstart = 0; d->viewend = new_chunk->length; } else if (d->viewend > new_chunk->length) { /* 2. The resulting chunk is large enough for the current view * but the view must be panned to the left */ d->viewstart -= (d->viewend - new_chunk->length); d->viewend = new_chunk->length; } else { /* 3. The view still works - do nothing */ } /* Update selection endpoints */ if (d->selstart >= movestart) { d->selstart += movedist; if (d->selstart < movestart) d->selstart = movestart; d->selend += movedist; if (d->selend < movestart) d->selend = movestart; } if (d->selstart >= new_chunk->length) d->selstart = d->selend = 0; else if (d->selend >= new_chunk->length) d->selend = new_chunk->length; /* Update marks */ for (i=d->marks.length-1; i>=0; i--) { if (d->marks.places[i] >= movestart) { d->marks.places[i] += movedist; if (d->marks.places[i] < movestart || d->marks.places[i] > new_chunk->length) { g_free(d->marks.names[i]); for (j=i; jmarks.length-1; j++) { d->marks.places[j] = d->marks.places[j+1]; d->marks.names[j] = d->marks.names[j+1]; } d->marks.length --; } } } /* If we're playing this document, update the playback range. If not, * update the cursor */ if (playing_document == d && player_playing()) player_switch(new_chunk, movestart, movedist); else { if (d->cursorpos >= movestart) { d->cursorpos += movedist; if (d->cursorpos < movestart) d->cursorpos = movestart; } if (d->cursorpos > new_chunk->length) d->cursorpos = new_chunk->length; } /* Make sure the current state is stored in history */ fix_history(d); /* Emit signal */ gtk_signal_emit(GTK_OBJECT(d),document_signals[STATE_CHANGED_SIGNAL]); } gboolean document_apply(Document *d, chunk_filter_proc proc, chunk_filter_proc eof_proc, gint amount, gboolean convert, gchar *title) { Chunk *c,*p,*r; off_t u,plen,rlen; /* Decide if we should filter selection or the whole file */ if ((d->selstart == d->selend) || (d->selstart==0 && d->selend >= d->chunk->length)) { /* procstart(w); */ r = chunk_filter( d->chunk, proc, eof_proc, amount, convert, dither_editing, d->bar, title); /* procend(w); */ if (r) { document_update(d, r, 0, 0); return FALSE; } else return TRUE; } else { u = d->selstart; p = chunk_get_part(d->chunk, u, d->selend - u); plen = p->length; /* procstart(w); */ r = chunk_filter( p, proc, eof_proc, amount, convert, dither_editing, d->bar, title); /* procend(w); */ gtk_object_sink(GTK_OBJECT(p)); if (r) { rlen = r->length; c = chunk_replace_part(d->chunk,u,plen,r); gtk_object_sink(GTK_OBJECT(r)); /* If the result is longer, report the difference as an * insertion at the old selection's right endpoint * If the result is shorter, report the difference as a * removal at the new selection's right endpoint */ if (rlen > plen) document_update(d, c, d->selstart+plen, rlen-plen); else document_update(d, c, d->selstart+rlen, rlen-plen); return FALSE; } else return TRUE; } } void document_parse(Document *d, chunk_parse_proc proc, gboolean allchannels, gboolean convert, gchar *title) { Chunk *c; if ((d->selstart == d->selend) || (d->selstart==0 && d->selend >= d->chunk->length)) { /* procstart(w); */ chunk_parse(d->chunk,proc,allchannels,convert,dither_editing, d->bar,title,0,FALSE); /* procend(w); */ } else { c = chunk_get_part(d->chunk,d->selstart, d->selend - d->selstart); /* procstart(w); */ chunk_parse(c,proc,allchannels,convert,dither_editing, d->bar,title,0,FALSE); /* procend(w); */ gtk_object_sink(GTK_OBJECT(c)); } } gboolean document_apply_cb(Document *d, document_apply_proc proc, gboolean selection_only, gpointer user_data) { Chunk *c,*p,*r; off_t u,plen,rlen; /* Decide if we should filter selection or the whole file */ if ((!selection_only) || (d->selstart == d->selend) || (d->selstart==0 && d->selend >= d->chunk->length)) { r = proc( d->chunk, d->bar, user_data ); if (r) { document_update(d, r, 0, 0); return FALSE; } else return TRUE; } else { u = d->selstart; p = chunk_get_part(d->chunk, u, d->selend - u); plen = p->length; r = proc( p, d->bar, user_data ); gtk_object_sink(GTK_OBJECT(p)); if (r) { rlen = r->length; c = chunk_replace_part(d->chunk,u,plen,r); gtk_object_sink(GTK_OBJECT(r)); /* If the result is longer, report the difference as an * insertion at the old selection's right endpoint * If the result is shorter, report the difference as a * removal at the new selection's right endpoint */ if (rlen > plen) document_update(d, c, d->selstart+plen, rlen-plen); else document_update(d, c, d->selstart+rlen, rlen-plen); return FALSE; } else return TRUE; } } static void document_set_cursor_main(Document *d, off_t cursorpos, gboolean playslave, gboolean running, off_t bufpos) { off_t vs,ve,dist; g_assert(cursorpos >= 0 && cursorpos <= d->chunk->length); if (d->cursorpos == cursorpos) return; if (!playslave && playing_document == d && player_playing()) { player_set_buffer_pos(cursorpos); return; } if (d->followmode && playslave) { dist = d->viewend - d->viewstart; if (view_follow_strict_flag) { vs = cursorpos - dist/2; ve = vs + dist; } else { if (d->cursorpos < d->viewend && cursorpos > d->viewend && cursorpos < d->viewend + dist) { /* Scroll one page forward */ vs = d->viewend; ve = d->viewend + dist; } else if (cursorpos >= d->viewstart && cursorpos < d->viewend) { /* Do nothing */ vs = d->viewstart; ve = d->viewend; } else { vs = cursorpos - dist/2; ve = vs + dist; } } if (vs < 0) { ve -= vs; vs = 0; } else if (ve > d->chunk->length) { ve = d->chunk->length; vs = ve - dist; } document_set_view(d,vs,ve); } d->old_cursorpos = d->cursorpos; d->cursorpos = cursorpos; d->old_playbufpos = d->playbufpos; d->playbufpos = running ? bufpos : -1; gtk_signal_emit(GTK_OBJECT(d), document_signals[CURSOR_CHANGED_SIGNAL], running); } void document_set_cursor(Document *d, off_t cursorpos) { document_set_cursor_main(d,cursorpos,FALSE,(playing_document == d && player_playing()),cursorpos); } off_t document_nudge_cursor(Document *d, off_t delta) { off_t newpos; newpos = d->cursorpos + delta; if(newpos > d->chunk->length) { delta = (d->chunk->length) - (d->cursorpos); } else if(newpos < 0) { delta = - (d->cursorpos); } newpos = d->cursorpos + delta; document_set_cursor(d,newpos); return delta; } void document_set_followmode(Document *d, gboolean mode) { d->followmode = mode; } void document_set_view(Document *d, off_t viewstart, off_t viewend) { off_t o; /* puts("document_set_view"); */ if (viewstart > viewend) { o = viewstart; viewstart = viewend; viewend = o; } g_assert(viewstart >= 0 && (viewstart < d->chunk->length || d->chunk->length == 0) && viewend >= 0 && viewend <= d->chunk->length); if (d->viewstart != viewstart || d->viewend != viewend) { d->viewstart = viewstart; d->viewend = viewend; gtk_signal_emit(GTK_OBJECT(d),document_signals[VIEW_CHANGED_SIGNAL]); } } void document_scroll(Document *d, off_t distance) { if (d->viewstart + distance < 0) distance = -d->viewstart; else if (d->viewend + distance > d->chunk->length) distance = d->chunk->length - d->viewend; document_set_view(d,d->viewstart+distance,d->viewend+distance); } void document_set_selection(Document *d, off_t selstart, off_t selend) { off_t o; /* Adjust the input arguments so they're properly ordered etc. */ if (selstart > selend) { o = selstart; selstart = selend; selend = o; } if (selstart == selend) selstart = selend = 0; if (d->chunk->length == 0 && d->selstart == 0 && d->selend == 0) return; g_assert(selstart >= 0 && selstart < d->chunk->length && selend >= 0 && selend <= d->chunk->length); if (d->selstart != selstart || d->selend != selend) { d->old_selstart = d->selstart; d->old_selend = d->selend; d->selstart = selstart; d->selend = selend; gtk_signal_emit(GTK_OBJECT(d), document_signals[SELECTION_CHANGED_SIGNAL]); } } void document_zoom(Document *d, gfloat zoom, gboolean followcursor) { off_t dist,newdist; off_t newstart,newend; /* puts("document_zoom"); */ dist = d->viewend - d->viewstart; newdist = (off_t) ((gfloat) dist / zoom); if (newdist >= d->chunk->length) { document_set_view(d,0,d->chunk->length); return; } if (newdist < 1) newdist = 1; /* printf("dist: %d, newdist: %d\n",(int)dist,(int)newdist); printf("d->cursorpos: %d, d->viewstart: %d, d->viewend: %d\n", (int)d->cursorpos,(int)d->viewstart,(int)d->viewend); */ if (followcursor && d->cursorpos >= d->viewstart && d->cursorpos <= d->viewend) newstart = d->cursorpos - newdist/2; else newstart = d->viewstart + (dist - newdist)/2; if (newstart < 0) newstart = 0; newend = newstart + newdist; if (newend > d->chunk->length) { newend = d->chunk->length; newstart = newend - newdist; } document_set_view(d, newstart, newend); } void document_set_mark(Document *d, gchar *label, off_t position) { int i,j; for (i=0; imarks.length; i++) if (!strcmp(d->marks.names[i],label)) { if (position == DOCUMENT_BAD_MARK) { g_free(d->marks.names[i]); for (j=i; jmarks.length-1; j++) { d->marks.names[j] = d->marks.names[j+1]; d->marks.places[j] = d->marks.places[j+1]; } d->marks.length --; } else { d->marks.places[i] = position; } gtk_signal_emit(GTK_OBJECT(d), document_signals[STATE_CHANGED_SIGNAL]); return; } if (d->marks.length == d->marks.alloced) { d->marks.alloced += 16; d->marks.names = g_realloc(d->marks.names,d->marks.alloced* sizeof(d->marks.names[0])); d->marks.places = g_realloc(d->marks.places,d->marks.alloced* sizeof(d->marks.places[0])); } d->marks.names[d->marks.length] = g_strdup(label); d->marks.places[d->marks.length] = position; d->marks.length ++; gtk_signal_emit(GTK_OBJECT(d), document_signals[STATE_CHANGED_SIGNAL]); } off_t document_get_mark(Document *d, const gchar *label) { int i; for (i=0; imarks.length; i++) { if (!strcmp(d->marks.names[i],label)) return d->marks.places[i]; } return DOCUMENT_BAD_MARK; } void document_clear_marks(Document *d) { if (d->marks.length > 0) { clear_marklist(&(d->marks)); gtk_signal_emit(GTK_OBJECT(d), document_signals[STATE_CHANGED_SIGNAL]); } } void document_foreach_mark(Document *d, void (*func)(gchar *label, off_t position, gpointer user_data), gpointer user_data) { int i; for (i=0; imarks.length; i++) func(d->marks.names[i],d->marks.places[i],user_data); } gboolean document_can_undo(Document *d) { return (d->history_pos != NULL && d->history_pos->prev != NULL); } gboolean document_can_redo(Document *d) { return (d->history_pos != NULL && d->history_pos->next != NULL); } static void get_state_from_history(Document *d) { d->viewstart = d->history_pos->viewstart; d->viewend = d->history_pos->viewend; d->selstart = d->history_pos->selstart; d->selend = d->history_pos->selend; gtk_object_unref(GTK_OBJECT(d->chunk)); d->chunk = d->history_pos->chunk; gtk_object_ref(GTK_OBJECT(d->chunk)); copy_marklist(&(d->marks),&(d->history_pos->marks)); gtk_signal_emit(GTK_OBJECT(d),document_signals[STATE_CHANGED_SIGNAL]); } void document_undo(Document *d) { g_assert(document_can_undo(d)); player_stop(); fix_history(d); d->history_pos = d->history_pos->prev; get_state_from_history(d); } void document_redo(Document *d) { g_assert(document_can_redo(d)); player_stop(); fix_history(d); d->history_pos = d->history_pos->next; get_state_from_history(d); } void document_set_status_bar(Document *d, StatusBar *bar) { d->bar = bar; } mhwaveedit-1.4.24/src/document.h000066400000000000000000000165301334022513400165170ustar00rootroot00000000000000/* * Copyright (C) 2005 2006, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #ifndef DOCUMENT_H_INCLUDED #define DOCUMENT_H_INCLUDED #include "chunk.h" #include "listobject.h" #define DOCUMENT(obj) GTK_CHECK_CAST(obj,document_get_type(),Document) #define DOCUMENT_CLASS(klass) GTK_CHECK_CLASS_CAST(klass,document_get_type(),DocumentClass) #define IS_DOCUMENT(obj) GTK_CHECK_TYPE(obj,document_get_type()) struct MarkList { int length, alloced; char **names; off_t *places; }; struct HistoryEntry; struct HistoryEntry { Chunk *chunk; off_t selstart,selend,viewstart,viewend,cursor; struct MarkList marks; struct HistoryEntry *next,*prev; }; typedef struct { GtkObject object; /* The filename associated with the document (or NULL if none). */ gchar *filename; /* TRUE if the file referred to by filename has a lossy format. */ gboolean lossy; /* A unique name for each document, either: * the file's name part without the path * the file's name part + a number (if >1 document with the same filename) * "untitled #n" (if filename == NULL) */ gchar *titlename; /* Unique for each window, * set whenever view->chunk!=NULL */ guint title_serial; /* This points to where we are in the history or NULL if the * history is empty */ struct HistoryEntry *history_pos; /* Pointer to Mark data structure */ struct MarkList marks; Chunk *chunk; /* The chunk being viewed. */ off_t viewstart,viewend; /* The view start and end+1 */ off_t selstart,selend; /* Selection start and end+1 */ off_t cursorpos; /* Cursor position */ /* Used when sending the selection_changed signal */ off_t old_selstart, old_selend; /* Used when sending the cursor_changed signal */ off_t old_cursorpos; off_t playbufpos, old_playbufpos; gboolean followmode; /* Follow mode flag */ StatusBar *bar; } Document; typedef struct { GtkObjectClass parent_class; /* Emitted when the view start/end is changed. */ void (*view_changed)(Document *doc); /* Emitted when the selection start/end is changed. */ void (*selection_changed)(Document *doc); /* Emitted when the cursor position is changed. * Rolling is TRUE if the cursor was set because of playback */ void (*cursor_changed)(Document *doc, gboolean rolling); /* Emitted when an action has been performed. */ void (*state_changed)(Document *doc); } DocumentClass; extern ListObject *document_objects; extern Document *playing_document; /* If TRUE and follow mode is enabled, the cursor will always be centered in * view. */ extern gboolean view_follow_strict_flag; typedef Chunk *(*document_apply_proc)(Chunk *chunk, StatusBar *bar, gpointer user_data); GtkType document_get_type(void); Document *document_new_with_file(gchar *filename, StatusBar *bar); Document *document_new_with_chunk(Chunk *chunk, gchar *sourcename, StatusBar *bar); void document_set_status_bar(Document *d, StatusBar *bar); gboolean document_save(Document *d, gchar *filename, gint type_id, gboolean use_defs); void document_play(Document *d, off_t start, off_t end, gboolean loop, gfloat speed); void document_play_from_cursor(Document *d, gboolean loopmode, gfloat speed); void document_play_selection(Document *d, gboolean loopmode, gfloat speed); /* Stop and keep cursor at current position */ void document_stop(Document *d, gboolean do_return); /* Changes the document's chunk to new_chunk. The old state is pushed onto * the history stack. All marks, selection endpoints and the cursor will be * moved movedist (can be negative) samples if they're to the right of * movestart. If that would move them to the left of movestart, they will be * either removed (marks) or set to movestart (selection endpoints & cursor) * * To simplify other code, if new_chunk==NULL this function does nothing. */ void document_update(Document *d, Chunk *new_chunk, off_t movestart, off_t movedist); /* Apply a certain filter function on the selection (or on the whole file * if nothing selected). */ gboolean document_apply(Document *d, chunk_filter_proc proc, chunk_filter_proc eof_proc, gint amount, gboolean convert, gchar *title); /* Same as document_apply but just parses the data, doesn't change it */ void document_parse(Document *d, chunk_parse_proc proc, gboolean allchannels, gboolean convert, gchar *title); /* Call a procedure with a chunk representing the selection (or the whole * file if nothing selected). The returned Chunk from the procedure will * replace the selection. */ gboolean document_apply_cb(Document *d, document_apply_proc proc, gboolean selection_only, gpointer user_data); void document_set_followmode(Document *d, gboolean followmode); void document_set_cursor(Document *d, off_t cursorpos); off_t document_nudge_cursor(Document *d, off_t delta); void document_set_view(Document *d, off_t viewstart, off_t viewend); void document_scroll(Document *d, off_t distance); /* Sets the selection. * d - A Document. * selstart - Starting point of the selection * selend - End of selection + 1. If selend==selstart the selection is removed. * If selend1.0 means zooming in, <1.0 means zooming out. * Must be non-zero. */ void document_zoom(Document *d, gfloat zoom, gboolean followcursor); /* Places a mark. * * d - A Document. * label - A text label. If a mark with the same label exists, it will be * removed. * position - At which sample to place the mark. Specify DOCUMENT_BAD_MARK * to remove the mark. */ void document_set_mark(Document *d, gchar *label, off_t position); /* Gets the position of a mark with a certain label. * d - A Document * label - The text label of the mark. * Returns: The position of the mark, or DOCUMENT_BAD_MARK * if it doesn't exist. */ off_t document_get_mark(Document *d, const gchar *label); #define DOCUMENT_BAD_MARK ((off_t)-1) /* Clears the filename component */ void document_forget_filename(Document *d); /* Removes all marks. */ void document_clear_marks(Document *d); void document_foreach_mark(Document *d, void (*func)(gchar *label, off_t position, gpointer user_data), gpointer user_data); gboolean document_can_undo(Document *d); void document_undo(Document *d); gboolean document_can_redo(Document *d); void document_redo(Document *d); #endif mhwaveedit-1.4.24/src/documentlist.c000066400000000000000000000131561334022513400174070ustar00rootroot00000000000000/* * Copyright (C) 2002 2003 2004 2005 2009, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include #include "documentlist.h" static GtkObjectClass *parent_class; enum { CHANGED_SIGNAL, LAST_SIGNAL }; static guint document_list_signals[LAST_SIGNAL] = { 0 }; static gboolean updating = FALSE; static void document_list_changed(Combo *combo) { Document *d=NULL; DocumentList *dl = DOCUMENT_LIST(combo); if (updating) return; d = DOCUMENT(list_object_get(document_objects, combo_selected_index(combo))); if (d != dl->selected) { dl->selected = d; memcpy(&(dl->format),&(d->chunk->format),sizeof(Dataformat)); gtk_signal_emit(GTK_OBJECT(dl), document_list_signals[CHANGED_SIGNAL]); } if (COMBO_CLASS(parent_class)->selection_changed) COMBO_CLASS(parent_class)->selection_changed(combo); } static void document_list_addnotify(ListObject *lo, gpointer item, gpointer user_data) { Document *d = DOCUMENT(item); DocumentList *dl = DOCUMENT_LIST(user_data); if (dl->selected == NULL) { dl->selected=d; gtk_widget_set_sensitive(GTK_WIDGET(dl),TRUE); } document_list_setup(dl,dl->selected); if (d == dl->selected) { gtk_signal_emit(GTK_OBJECT(dl), document_list_signals[CHANGED_SIGNAL]); } } static void document_list_remove(ListObject *lo, gpointer item, gpointer user_data) { Document *w = DOCUMENT(item); DocumentList *mwl = DOCUMENT_LIST(user_data); if (w == mwl->selected) { if (list_object_get_size(document_objects) == 0) { /* We set the selected item to NULL and dim the widget, but * no signal is sent out. */ mwl->selected = NULL; gtk_widget_set_sensitive(GTK_WIDGET(mwl),FALSE); return; } mwl->selected = DOCUMENT(list_object_get(document_objects,0)); document_list_setup(mwl,mwl->selected); gtk_signal_emit(GTK_OBJECT(mwl), document_list_signals[CHANGED_SIGNAL]); } else document_list_setup(mwl,mwl->selected); } static void document_list_init(GtkObject *obj) { DocumentList *mwl = DOCUMENT_LIST(obj); /* Most initialization is done in document_list_setup */ combo_set_max_request_width(COMBO(obj),350); mwl->selected = NULL; gtk_signal_connect_while_alive(GTK_OBJECT(document_objects), "item_added", GTK_SIGNAL_FUNC(document_list_addnotify), obj,obj); gtk_signal_connect_while_alive(GTK_OBJECT(document_objects), "item_removed", GTK_SIGNAL_FUNC(document_list_remove), obj,obj); gtk_signal_connect_while_alive(GTK_OBJECT(document_objects), "item_notify", GTK_SIGNAL_FUNC(document_list_addnotify), obj,obj); } static void document_list_class_init(GtkObjectClass *klass) { DocumentListClass *mwlc = DOCUMENT_LIST_CLASS(klass); parent_class = gtk_type_class(combo_get_type()); mwlc->document_changed = NULL; COMBO_CLASS(klass)->selection_changed = document_list_changed; document_list_signals[CHANGED_SIGNAL] = gtk_signal_new( "document_changed", GTK_RUN_FIRST, GTK_CLASS_TYPE(klass), GTK_SIGNAL_OFFSET(DocumentListClass, document_changed), gtk_marshal_NONE__NONE, GTK_TYPE_NONE, 0); gtk_object_class_add_signals(klass,document_list_signals,LAST_SIGNAL); } GtkType document_list_get_type(void) { static GtkType id=0; if (!id) { GtkTypeInfo info = { "DocumentList", sizeof(DocumentList), sizeof(DocumentListClass), (GtkClassInitFunc)document_list_class_init, (GtkObjectInitFunc)document_list_init }; id = gtk_type_unique( combo_get_type(), &info ); } return id; } GtkWidget *document_list_new(Document *chosen) { GtkWidget *widget; widget = GTK_WIDGET(gtk_type_new(document_list_get_type())); document_list_setup(DOCUMENT_LIST(widget),chosen); return widget; } struct setup_func_data { GList *lp; Document *first; }; static void document_list_setup_func(gpointer item, gpointer user_data) { struct setup_func_data *sfdp = (struct setup_func_data *)user_data; Document *w = DOCUMENT(item); if (w->titlename != NULL) { sfdp->lp = g_list_append(sfdp->lp, w->titlename); if (sfdp->first == NULL) sfdp->first = w; } } void document_list_setup(DocumentList *mwl, Document *chosen) { gint i; struct setup_func_data sfd; updating = TRUE; sfd.lp = NULL; sfd.first = NULL; list_object_foreach(document_objects,document_list_setup_func,&sfd); combo_set_items(COMBO(mwl),sfd.lp,0); if (chosen == NULL) chosen = sfd.first; if (chosen) { i = g_list_index(sfd.lp,chosen->titlename); g_assert(i >= 0); combo_set_selection(COMBO(mwl),i); memcpy(&(mwl->format),&(chosen->chunk->format), sizeof(Dataformat)); mwl->selected = chosen; } g_list_free(sfd.lp); updating = FALSE; } mhwaveedit-1.4.24/src/documentlist.h000066400000000000000000000037761334022513400174230ustar00rootroot00000000000000/* * Copyright (C) 2002 2003 2004 2005, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ /* Document selection widget for the effect browser */ #ifndef DOCUMENTLIST_H_INCLUDED #define DOCUMENTLIST_H_INCLUDED #include "combo.h" #include "document.h" #include "listobject.h" #define DOCUMENT_LIST(obj) GTK_CHECK_CAST(obj,document_list_get_type(),DocumentList) #define DOCUMENT_LIST_CLASS(klass) GTK_CHECK_CLASS_CAST(klass,document_list_get_type(),DocumentListClass) #define IS_DOCUMENT_LIST(obj) GTK_CHECK_TYPE(obj,document_list_get_type()) typedef struct { Combo combo; Document *selected; /* Format of the selected document's chunk. The reason to keep track of * this separately is that it makes it easier to handle the special case * where there are no windows (selected==NULL) */ Dataformat format; } DocumentList; typedef struct { ComboClass comboclass; /* The current mainwindow has changed, either by the user or the * selected mainwindow was closed, or the chunk in the current * mainwindow has changed. . */ void (*document_changed)(DocumentList *dl); } DocumentListClass; GtkType document_list_get_type(void); GtkWidget *document_list_new(Document *chosen); void document_list_setup(DocumentList *mwl, Document *chosen); #endif mhwaveedit-1.4.24/src/effectbrowser.c000066400000000000000000000702401334022513400175320ustar00rootroot00000000000000/* * Copyright (C) 2003 2004 2007 2009 2011, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include #include #include #include "effectbrowser.h" #include "volumedialog.h" #include "speeddialog.h" #include "sampleratedialog.h" #include "samplesizedialog.h" #include "combinechannelsdialog.h" #include "pipedialog.h" #include "inifile.h" #include "documentlist.h" #include "um.h" #include "gettext.h" #include "mapchannelsdialog.h" #include "sandwichdialog.h" struct source { gchar tag; gchar *name; effect_register_rebuild_func rebuild_func; effect_register_get_func get_func; gpointer rebuild_func_data,get_func_data; int is_new; }; struct effect { gchar *name,*title,*location,*author,source_tag; gboolean process_tag; }; static ListObject *effect_list = NULL; static GSList *sources = NULL; static GSList *geometry_stack = NULL; static gboolean geometry_stack_inited = FALSE; static GtkObjectClass *parent_class; static void list_widget_rebuild(gpointer dummy, gpointer dummy2, EffectBrowser *eb); void effect_register_add_source(gchar *name, gchar tag, effect_register_rebuild_func rebuild_func, gpointer rebuild_func_data, effect_register_get_func get_func, gpointer get_func_data) { struct source *s; s = g_malloc(sizeof(*s)); s->tag = tag; s->name = name; s->rebuild_func = rebuild_func; s->rebuild_func_data = rebuild_func_data; s->get_func = get_func; s->get_func_data = get_func_data; s->is_new = TRUE; sources = g_slist_append(sources,s); } void effect_register_add_effect(gchar source_tag, const gchar *name, const gchar *title, const gchar *author, const gchar *location) { struct effect *e; e = g_malloc(sizeof(*e)); e->source_tag = source_tag; e->name = g_strdup(name); e->title = g_strdup(title); e->author = g_strdup(author); e->location = g_strdup(location); list_object_add(effect_list, e); } static void builtin_rebuild_func(gchar source_tag, gpointer user_data) { gchar *author = _("Built-in"); static const gchar loc[] = ""; effect_register_add_effect(source_tag,"volume",_("Volume adjust/fade"), author,loc); effect_register_add_effect(source_tag,"srate",_("Convert samplerate"), author,loc); effect_register_add_effect(source_tag,"ssize",_("Convert sample format"), author,loc); effect_register_add_effect(source_tag,"mapchannels",_("Map channels"), author,loc); effect_register_add_effect(source_tag,"combine",_("Combine channels"), author,loc); effect_register_add_effect(source_tag,"sandwich", _("Add channels from other file"),author,loc); effect_register_add_effect(source_tag,"speed",_("Speed"),author,loc); effect_register_add_effect(source_tag,"pipe",_("Pipe through program"), author,loc); } static EffectDialog *builtin_get_func(gchar *name, gchar source_tag, gpointer user_data) { GtkType type = -1; if (!strcmp(name,"volume")) type = volume_dialog_get_type(); else if (!strcmp(name,"srate")) type = samplerate_dialog_get_type(); else if (!strcmp(name,"ssize")) type = samplesize_dialog_get_type(); else if (!strcmp(name,"mapchannels")) type = map_channels_dialog_get_type(); else if (!strcmp(name,"combine")) type = combine_channels_dialog_get_type(); else if (!strcmp(name,"speed")) type = speed_dialog_get_type(); else if (!strcmp(name,"pipe")) type = pipe_dialog_get_type(); else if (!strcmp(name,"sandwich")) type = sandwich_dialog_get_type(); if (type >= 0) return EFFECT_DIALOG(gtk_type_new(type)); else return NULL; } void effect_register_init(void) { /* Add built-in effects source */ effect_register_add_source("Built-in",'B',builtin_rebuild_func,NULL, builtin_get_func,NULL); } static void effect_register_update_list(void) { GSList *s; struct source *src; gboolean b = FALSE; if (effect_list == NULL) effect_list = list_object_new(FALSE); for (s=sources; s!=NULL; s=s->next) { src = (struct source *)s->data; if (src -> is_new) { /* TODO: Cache instead of requesting from source each time */ src->rebuild_func(src->tag, src->rebuild_func_data); src->is_new = FALSE; b = TRUE; } } if (b) list_object_notify(effect_list,NULL); } void free_effect(struct effect *e) { g_free(e->name); g_free(e->title); g_free(e->location); g_free(e->author); g_free(e); } void effect_register_rebuild(void) { GSList *s; struct source *src; list_object_foreach(effect_list,(GFunc)free_effect,NULL); list_object_clear(effect_list,FALSE); for (s=sources; s!=NULL; s=s->next) { src = (struct source *)s->data; src->is_new = TRUE; } effect_register_update_list(); } static void effect_browser_remove_effect(EffectBrowser *eb) { if (eb->current_dialog >= 0) gtk_container_remove (GTK_CONTAINER(eb->dialog_container), GTK_WIDGET(eb->dialogs[eb->current_dialog])); eb->current_dialog = -1; } static void effect_browser_destroy(GtkObject *obj) { EffectBrowser *eb = EFFECT_BROWSER(obj); guint i; effect_browser_remove_effect(eb); for (i=0; idialogs[i] != NULL) { gtk_widget_unref(GTK_WIDGET(eb->dialogs[i])); eb->dialogs[i] = NULL; } } if (parent_class->destroy) parent_class->destroy(obj); } static void geom_push(EffectBrowser *eb) { gchar *c; guint pos; /* This seems to be the only way to find out handle position */ pos = GTK_WIDGET(eb->effect_list_container)->allocation.width; c = g_strdup_printf("%d",pos); geometry_stack_push(GTK_WINDOW(eb),c,&geometry_stack); g_free(c); } static gint effect_browser_delete_event(GtkWidget *widget, GdkEventAny *event) { geom_push(EFFECT_BROWSER(widget)); if (GTK_WIDGET_CLASS(parent_class)->delete_event) return GTK_WIDGET_CLASS(parent_class)->delete_event(widget,event); else return FALSE; } static void effect_browser_class_init(GtkObjectClass *klass) { parent_class = gtk_type_class(gtk_window_get_type()); klass->destroy = effect_browser_destroy; GTK_WIDGET_CLASS(klass)->delete_event = effect_browser_delete_event; } static void effect_browser_close(EffectBrowser *eb) { geom_push(eb); gtk_widget_destroy(GTK_WIDGET(eb)); } static void apply_click(GtkWidget *widget, EffectBrowser *eb) { gboolean ca,b,mwf; if (eb->dl->selected == NULL) { user_error(_("You have no open file to apply the effect to!")); return; } ca = gtk_toggle_button_get_active(eb->close_after); mwf = inifile_get_gboolean("mainwinFront",TRUE); if (ca) gtk_widget_hide(GTK_WIDGET(eb)); b = effect_dialog_apply(eb->dialogs[eb->current_dialog]); if (ca) { if (b) gtk_widget_show(GTK_WIDGET(eb)); else effect_browser_close(eb); } else if (!mwf) gdk_window_raise(GTK_WIDGET(eb)->window); } static EffectDialog *get_effect_missing_dialog(gchar *name, gchar source_tag) { EffectDialog *ed; GtkWidget *w; ed = gtk_type_new(effect_dialog_get_type()); w = gtk_label_new(_("This effect could not be loaded.")); gtk_container_add(ed->input_area,w); gtk_widget_show(w); return ed; } static void effect_browser_set_effect_main(EffectBrowser *eb, struct effect *e) { int i; EffectDialog *ed; GSList *s; struct source *src; gchar *c; effect_browser_remove_effect(eb); /* Check dialog cache */ for (i=0; idialog_effects[i] == e) break; } if (i >= EFFECT_BROWSER_CACHE_SIZE) { /* Dialog not in cache */ /* Make room in top of cache */ for (i=0; idialog_effects[i] == NULL) break; } if (i >= EFFECT_BROWSER_CACHE_SIZE) { /* No room in cache, throw out last element */ i = EFFECT_BROWSER_CACHE_SIZE-1; gtk_object_unref(GTK_OBJECT(eb->dialogs[i])); eb->dialogs[i] = NULL; eb->dialog_effects[i] = NULL; } for (; i>0; i--) { eb->dialogs[i] = eb->dialogs[i-1]; eb->dialog_effects[i] = eb->dialog_effects[i-1]; } /* Get the new dialog */ ed = NULL; for (s=sources; s!=NULL; s=s->next) { src = (struct source *)s->data; if (src->tag == e->source_tag) { ed = src->get_func(e->name, e->source_tag, src->get_func_data); effect_dialog_setup(ed, e->name, eb); break; } } if (ed == NULL) ed = get_effect_missing_dialog(e->name,e->source_tag); g_assert(i == 0); eb->dialogs[i] = ed; gtk_object_ref(GTK_OBJECT(ed)); gtk_object_sink(GTK_OBJECT(ed)); eb->dialog_effects[i] = e; } eb->current_dialog = i; gtk_container_add(eb->dialog_container, GTK_WIDGET(eb->dialogs[i])); gtk_widget_show(GTK_WIDGET(eb->dialogs[i])); c = g_strdup_printf("%c%s",e->source_tag,e->name); inifile_set("lastEffect",c); g_free(c); } void effect_browser_invalidate_effect(EffectBrowser *eb, gchar *effect_name, gchar source_tag) { gboolean displayed = FALSE; struct effect *e; gint i=0; /* Search the cache for the effect */ for (i=0; idialog_effects[i]; if (e != NULL && e->source_tag == source_tag && !strcmp(e->name, effect_name)) break; } if (i >= EFFECT_BROWSER_CACHE_SIZE) return; /* Not found */ displayed = (i == eb->current_dialog); if (displayed) effect_browser_remove_effect(eb); gtk_object_unref(GTK_OBJECT(eb->dialogs[i])); eb->dialogs[i] = NULL; eb->dialog_effects[i] = NULL; if (displayed) effect_browser_set_effect_main(eb,e); } static void effect_browser_select_child(GtkList *list, GtkWidget *widget, gpointer user_data) { EffectBrowser *eb = EFFECT_BROWSER(user_data); struct effect *effect; effect = gtk_object_get_data(GTK_OBJECT(widget),"effectptr"); g_assert(effect != NULL); effect_browser_set_effect_main(eb,effect); eb->list_widget_sel = GTK_LIST_ITEM(widget); } static void save_effect_order(EffectBrowser *eb) { GList *l; gint i; gchar *c,*d; struct effect *effect; l = gtk_container_get_children(GTK_CONTAINER(eb->list_widget)); for (i=0; l!=NULL; l=l->next,i++) { c = g_strdup_printf("effectBrowserOrder%d",i); effect = gtk_object_get_data(GTK_OBJECT(l->data),"effectptr"); d = g_strdup_printf("%c%s",effect->source_tag,effect->name); inifile_set(c,d); g_free(c); g_free(d); } c = g_strdup_printf("effectBrowserOrder%d",i); inifile_set(c,NULL); g_free(c); g_list_free(l); } static void moveup_main(EffectBrowser *eb, GtkListItem *item) { gint i; GList *l; i = gtk_list_child_position(GTK_LIST(eb->list_widget), GTK_WIDGET(item)); if (i <= 0) return; l = g_list_append(NULL, item); gtk_list_remove_items_no_unref(GTK_LIST(eb->list_widget),l); gtk_list_insert_items(GTK_LIST(eb->list_widget),l,i-1); gtk_list_item_select(GTK_LIST_ITEM(eb->list_widget_sel)); save_effect_order(eb); } static void movedown_main(EffectBrowser *eb, GtkListItem *item) { gint i; GList *l; i = gtk_list_child_position(GTK_LIST(eb->list_widget), GTK_WIDGET(item)); l = g_list_append(NULL, item); gtk_list_remove_items_no_unref(GTK_LIST(eb->list_widget),l); gtk_list_insert_items(GTK_LIST(eb->list_widget),l,i+1); gtk_list_item_select(GTK_LIST_ITEM(eb->list_widget_sel)); save_effect_order(eb); } static void movetop_main(EffectBrowser *eb, GtkListItem *item) { GList *l; l = g_list_append(NULL, item); gtk_list_remove_items_no_unref(GTK_LIST(eb->list_widget),l); gtk_list_prepend_items(GTK_LIST(eb->list_widget),l); gtk_list_item_select(GTK_LIST_ITEM(eb->list_widget_sel)); save_effect_order(eb); } static void movebot_main(EffectBrowser *eb, GtkListItem *item) { GList *l; l = g_list_append(NULL, item); gtk_list_remove_items_no_unref(GTK_LIST(eb->list_widget),l); gtk_list_append_items(GTK_LIST(eb->list_widget),l); gtk_list_item_select(GTK_LIST_ITEM(eb->list_widget_sel)); save_effect_order(eb); } static EffectBrowser *clicked_eb; static void list_item_moveup(GtkMenuItem *menuitem, gpointer user_data) { moveup_main(clicked_eb, clicked_eb->list_widget_clicked); } static void list_item_movedown(GtkMenuItem *menuitem, gpointer user_data) { movedown_main(clicked_eb, clicked_eb->list_widget_clicked); } static void list_item_movetotop(GtkMenuItem *menuitem, gpointer user_data) { movetop_main(clicked_eb, clicked_eb->list_widget_clicked); } static void list_item_movetobottom(GtkMenuItem *menuitem, gpointer user_data) { movebot_main(clicked_eb, clicked_eb->list_widget_clicked); } static void list_item_sort_main(EffectBrowser *eb, GCompareFunc compfunc) { /* Not the quickest way, but preserves original order if compfunc returns >0 when objects are equal */ GList *k,*l,*m=NULL; gint i; struct effect *e; gchar *c,*d; k = gtk_container_get_children(GTK_CONTAINER(eb->list_widget)); for (l=k; l!=NULL; l=l->next) { e = gtk_object_get_data(GTK_OBJECT(l->data),"effectptr"); g_assert(e != NULL); m = g_list_insert_sorted(m,e,compfunc); } g_list_free(k); for (l=m,i=0; l!=NULL; l=l->next,i++) { e = (struct effect *)l->data; c = g_strdup_printf("effectBrowserOrder%d",i); d = g_strdup_printf("%c%s",e->source_tag,e->name); inifile_set(c,d); g_free(d); g_free(c); } c = g_strdup_printf("effectBrowserOrder%d",i); inifile_set(c,NULL); g_free(c); g_list_free(m); list_widget_rebuild(NULL,NULL,eb); } gint title_sort_func(gconstpointer a, gconstpointer b) { struct effect const *ae = a, *be = b; int i; i = strcmp(ae->title,be->title); if (i==0) return 1; else return i; } gint auth_sort_func(gconstpointer a, gconstpointer b) { struct effect const *ae = a, *be = b; int i; i = strcmp(ae->author,be->author); if (i==0) return 1; else return i; } gint type_sort_func(gconstpointer a, gconstpointer b) { struct effect const *ae = a, *be = b; int i; i = ae->source_tag - be->source_tag; if (i==0) return 1; else return i; } gint loc_sort_func(gconstpointer a, gconstpointer b) { struct effect const *ae = a, *be = b; int i; i = strcmp(ae->location,be->location); if (i==0) return 1; else return i; } static void list_item_sortbytitle(GtkMenuItem *menuitem, gpointer user_data) { list_item_sort_main(clicked_eb, title_sort_func); } static void list_item_sortbytype(GtkMenuItem *menuitem, gpointer user_data) { list_item_sort_main(clicked_eb, type_sort_func); } static void list_item_sortbyloc(GtkMenuItem *menuitem, gpointer user_data) { list_item_sort_main(clicked_eb, loc_sort_func); } static void list_item_sortbyauth(GtkMenuItem *menuitem, gpointer user_data) { list_item_sort_main(clicked_eb, auth_sort_func); } static void list_item_unsort(GtkMenuItem *menuitem, gpointer user_data) { inifile_set("effectBrowserOrder0",NULL); list_widget_rebuild(NULL,NULL,clicked_eb); } static void list_item_rebuild(GtkMenuItem *menuitem, gpointer user_data) { effect_register_rebuild(); } static gchar *translate_menu_path(const gchar *path, gpointer func_data) { return _(path); } static gint list_item_button_press(GtkWidget *widget, GdkEventButton *event, gpointer user_data) { EffectBrowser *eb = EFFECT_BROWSER(user_data); static GtkItemFactory *item_factory = NULL; GtkWidget *w; static GtkItemFactoryEntry menu_items[] = { { N_("/Move Up"), NULL, list_item_moveup, 0, NULL }, { N_("/Move Down"), NULL, list_item_movedown, 0, NULL }, { N_("/Move to Top"), NULL, list_item_movetotop, 0, NULL }, { N_("/Move to Bottom"), NULL, list_item_movetobottom,0, NULL }, { "/sep1", NULL, NULL, 0, "" }, { N_("/Sort by Name"), NULL, list_item_sortbytitle, 0, NULL }, { N_("/Sort by Type"), NULL, list_item_sortbytype, 0, NULL }, { N_("/Sort by Location"), NULL, list_item_sortbyloc,0,NULL }, { N_("/Sort by Author"), NULL, list_item_sortbyauth,0, NULL }, { "/sep2", NULL, NULL, 0, "" }, { N_("/Restore Order"), NULL, list_item_unsort, 0, NULL }, { N_("/Rebuild Effect List"), NULL, list_item_rebuild,0,NULL } }; if (event->button == 3) { if (item_factory == NULL) { item_factory = gtk_item_factory_new(GTK_TYPE_MENU,"",NULL); #ifdef ENABLE_NLS gtk_item_factory_set_translate_func(item_factory, translate_menu_path, NULL, NULL); #endif gtk_item_factory_create_items(item_factory, ARRAY_LENGTH(menu_items), menu_items,NULL); } clicked_eb = eb; eb->list_widget_clicked = GTK_LIST_ITEM(widget); w = gtk_item_factory_get_widget(item_factory,""); gtk_menu_popup(GTK_MENU(w),NULL,NULL,NULL,NULL,event->button, event->time); } return FALSE; } static void add_list_item_main(struct effect *e, GtkList *l, EffectBrowser *eb) { gchar *c,*d; GtkWidget *w; c = g_strdup_printf("[%c] %s",e->source_tag,e->title); /* Translate here for keeping compatibility with old translations */ /* New translations should translate the title without the prefix */ if (e->source_tag == 'B' || e->source_tag == 'S') d = _(c); else d = c; w = gtk_list_item_new_with_label(d); g_free(c); gtk_object_set_data(GTK_OBJECT(w),"effectptr",e); gtk_signal_connect(GTK_OBJECT(w),"button_press_event", GTK_SIGNAL_FUNC(list_item_button_press),eb); gtk_container_add(GTK_CONTAINER(l),w); gtk_widget_show(w); } static void add_list_item(gpointer item, gpointer user_data) { EffectBrowser *eb = EFFECT_BROWSER(user_data); struct effect *e = (struct effect *)item; add_list_item_main(e,eb->list_widget,eb); } static void top_click(GtkButton *button, gpointer user_data) { EffectBrowser *eb = EFFECT_BROWSER(user_data); movetop_main(eb,eb->list_widget_sel); } static void bottom_click(GtkButton *button, gpointer user_data) { EffectBrowser *eb = EFFECT_BROWSER(user_data); movebot_main(eb,eb->list_widget_sel); } static void up_click(GtkButton *button, gpointer user_data) { EffectBrowser *eb = EFFECT_BROWSER(user_data); moveup_main(eb, eb->list_widget_sel); } static void down_click(GtkButton *button, gpointer user_data) { EffectBrowser *eb = EFFECT_BROWSER(user_data); movedown_main(eb, eb->list_widget_sel); } static void add_list_widget_items(GtkList *list, EffectBrowser *eb) { gint i; gchar *c,*d; GList *l; struct effect *e; if (inifile_get("effectBrowserOrder0",NULL) == NULL) { list_object_foreach(effect_list,add_list_item,eb); } else { for (l=effect_list->list; l!=NULL; l=l->next) { e = (struct effect *)l->data; e->process_tag = FALSE; } for (i=0; ; i++) { c = g_strdup_printf("effectBrowserOrder%d",i); d = inifile_get(c,NULL); g_free(c); if (d == NULL) break; for (l=effect_list->list; l!=NULL; l=l->next) { e = (struct effect *)l->data; if (e->process_tag) continue; if (e->source_tag != d[0] || strcmp(e->name,d+1)) continue; add_list_item_main(e,list,eb); e->process_tag = TRUE; break; } } for (l=effect_list->list; l!=NULL; l=l->next) { e = (struct effect *)l->data; if (!e->process_tag) add_list_item_main(e,list,eb); } } } static void list_widget_rebuild(gpointer dummy, gpointer dummy2, EffectBrowser *eb) { gtk_list_clear_items(eb->list_widget,0,-1); add_list_widget_items(eb->list_widget, eb); } static void effect_browser_init(EffectBrowser *eb) { GtkWidget *b,*b1,*b11,*b11w,*b12,*b121,*b122,*b123,*b124,*b2,*b21; GtkWidget *b21w,*b22,*b23,*b24,*b25,*b251,*b252; GtkAccelGroup* ag; gchar *c,*d; gint x; eb->list_widget_sel = NULL; ag = gtk_accel_group_new(); memset(eb->dialogs,0,sizeof(eb->dialogs)); memset(eb->dialog_effects,0,sizeof(eb->dialog_effects)); eb->current_dialog = -1; b11w = gtk_list_new(); eb->list_widget = GTK_LIST(b11w); gtk_list_set_selection_mode(GTK_LIST(b11w),GTK_SELECTION_SINGLE); effect_register_update_list(); add_list_widget_items(eb->list_widget,eb); gtk_signal_connect(GTK_OBJECT(effect_list),"item-notify", GTK_SIGNAL_FUNC(list_widget_rebuild),eb); b11 = gtk_scrolled_window_new(NULL,NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(b11), GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC); gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(b11),b11w); gtk_widget_set_usize(GTK_WIDGET(b11),150,150); eb->effect_list_container = GTK_CONTAINER(b11); #ifdef GTK_STOCK_GOTO_TOP b121 = gtk_button_new_from_stock(GTK_STOCK_GOTO_TOP); #else b121 = gtk_button_new_with_label(_("Top")); #endif gtk_signal_connect(GTK_OBJECT(b121),"clicked", GTK_SIGNAL_FUNC(top_click),eb); #ifdef GTK_STOCK_GO_UP b122 = gtk_button_new_from_stock(GTK_STOCK_GO_UP); #else b122 = gtk_button_new_with_label(_("Up")); #endif gtk_signal_connect(GTK_OBJECT(b122),"clicked", GTK_SIGNAL_FUNC(up_click),eb); #ifdef GTK_STOCK_GO_DOWN b123 = gtk_button_new_from_stock(GTK_STOCK_GO_DOWN); #else b123 = gtk_button_new_with_label(_("Down")); #endif gtk_signal_connect(GTK_OBJECT(b123),"clicked", GTK_SIGNAL_FUNC(down_click),eb); #ifdef GTK_STOCK_GOTO_BOTTOM b124 = gtk_button_new_from_stock(GTK_STOCK_GOTO_BOTTOM); #else b124 = gtk_button_new_with_label(_("Bottom")); #endif gtk_signal_connect(GTK_OBJECT(b124),"clicked", GTK_SIGNAL_FUNC(bottom_click),eb); b12 = gtk_hbox_new(FALSE,5); gtk_box_pack_start(GTK_BOX(b12),b121,FALSE,FALSE,0); gtk_box_pack_start(GTK_BOX(b12),b122,FALSE,FALSE,0); gtk_box_pack_start(GTK_BOX(b12),b123,FALSE,FALSE,0); gtk_box_pack_start(GTK_BOX(b12),b124,FALSE,FALSE,0); b1 = gtk_vbox_new(FALSE,5); gtk_box_pack_start(GTK_BOX(b1),b11,TRUE,TRUE,0); gtk_box_pack_start(GTK_BOX(b1),b12,FALSE,FALSE,0); b21w = gtk_alignment_new(0.5,0.5,1.0,1.0); eb->dialog_container = GTK_CONTAINER(b21w); b21 = gtk_scrolled_window_new(NULL,NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(b21), GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC); gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(b21),b21w); b22 = gtk_hseparator_new(); b23 = gtk_hbox_new(FALSE,3); eb->mw_list_box = GTK_BOX(b23); b24 = gtk_check_button_new_with_label(_("Close dialog after applying " "effect")); eb->close_after = GTK_TOGGLE_BUTTON(b24); #ifdef GTK_STOCK_APPLY b251 = gtk_button_new_from_stock(GTK_STOCK_APPLY); #else b251 = gtk_button_new_with_label(_("Apply")); #endif gtk_signal_connect(GTK_OBJECT(b251),"clicked",(GtkSignalFunc)apply_click, eb); #ifdef GTK_STOCK_CLOSE b252 = gtk_button_new_from_stock(GTK_STOCK_CLOSE); #else b252 = gtk_button_new_with_label(_("Close")); #endif gtk_widget_add_accelerator (b252, "clicked", ag, GDK_Escape, 0, (GtkAccelFlags) 0); gtk_signal_connect_object(GTK_OBJECT(b252),"clicked", (GtkSignalFunc)effect_browser_close, GTK_OBJECT(eb)); b25 = gtk_hbutton_box_new(); gtk_box_pack_start(GTK_BOX(b25),b251,FALSE,TRUE,3); gtk_box_pack_start(GTK_BOX(b25),b252,FALSE,TRUE,3); b2 = gtk_vbox_new(FALSE,5); gtk_box_pack_start(GTK_BOX(b2),b21,TRUE,TRUE,0); gtk_box_pack_end(GTK_BOX(b2),b25,FALSE,FALSE,0); gtk_box_pack_end(GTK_BOX(b2),b24,FALSE,FALSE,0); gtk_box_pack_end(GTK_BOX(b2),b23,FALSE,TRUE,0); gtk_box_pack_end(GTK_BOX(b2),b22,FALSE,TRUE,0); b = gtk_hpaned_new(); gtk_paned_pack1(GTK_PANED(b),b1,FALSE,TRUE); gtk_paned_pack2(GTK_PANED(b),b2,TRUE,TRUE); gtk_window_set_title(GTK_WINDOW(eb),_("Effects")); gtk_window_add_accel_group(GTK_WINDOW (eb), ag); gtk_window_set_policy(GTK_WINDOW(eb),FALSE,TRUE,FALSE); if (!geometry_stack_inited) { if (inifile_get_gboolean("useGeometry",FALSE)) geometry_stack = geometry_stack_from_inifile("effectGeometry"); geometry_stack_inited = TRUE; } if (!geometry_stack_pop(&geometry_stack,&c,GTK_WINDOW(eb))) { gtk_window_set_position (GTK_WINDOW (eb), GTK_WIN_POS_CENTER); gtk_window_set_default_size(GTK_WINDOW(eb),600,300); } else { if (c != NULL) { x = strtoul(c,&d,10); if (*d == 0 && *c != 0) gtk_paned_set_position(GTK_PANED(b),x); g_free(c); } } gtk_container_set_border_width(GTK_CONTAINER(eb),5); gtk_container_add(GTK_CONTAINER(eb),b); GTK_WIDGET_SET_FLAGS(GTK_WIDGET(b251),GTK_CAN_DEFAULT); gtk_widget_grab_default(GTK_WIDGET(b251)); gtk_widget_show_all(b); } GtkType effect_browser_get_type(void) { static GtkType id=0; if (!id) { GtkTypeInfo info = { "EffectBrowser", sizeof(EffectBrowser), sizeof(EffectBrowserClass), (GtkClassInitFunc)effect_browser_class_init, (GtkObjectInitFunc)effect_browser_init }; id = gtk_type_unique(gtk_window_get_type(),&info); } return id; } GtkWidget *effect_browser_new(Document *doc) { return effect_browser_new_with_effect(doc,"volume",'B',FALSE); } GtkWidget *effect_browser_new_with_effect(Document *doc, gchar *effect, gchar source_tag, gboolean close_after) { GtkWidget *w; EffectBrowser *eb = EFFECT_BROWSER(gtk_type_new(effect_browser_get_type())); gtk_signal_connect(GTK_OBJECT(eb->list_widget),"select_child", (GtkSignalFunc)effect_browser_select_child,eb); w = document_list_new(doc); gtk_box_pack_end(GTK_BOX(eb->mw_list_box),w,TRUE,TRUE,0); gtk_widget_show(w); eb->dl = DOCUMENT_LIST(w); w = gtk_label_new(_("Apply to: ")); gtk_box_pack_end(GTK_BOX(eb->mw_list_box),w,FALSE,FALSE,0); gtk_widget_show(w); if (effect == NULL) { effect = inifile_get("lastEffect","Bvolume"); source_tag = effect[0]; effect++; } effect_browser_set_effect(eb,effect,source_tag); if (eb->current_dialog < 0) effect_browser_set_effect(eb,"volume",'B'); g_assert(eb->current_dialog >= 0); gtk_toggle_button_set_active(eb->close_after,close_after); return GTK_WIDGET(eb); } void effect_browser_set_effect(EffectBrowser *eb, gchar *effect, gchar source_tag) { struct effect *e; GList *l,*w; gpointer p; for (l=effect_list->list; l!=NULL; l=l->next) { e = (struct effect *)l->data; if (e->source_tag == source_tag && !strcmp(e->name, effect)) { /* Find the list item which points to this effect */ w = gtk_container_get_children(GTK_CONTAINER(eb->list_widget)); for (; w!=NULL; w=w->next) { p = gtk_object_get_data(GTK_OBJECT(w->data),"effectptr"); g_assert(p != NULL); if (p == e) { gtk_list_select_child(eb->list_widget, GTK_WIDGET(w->data)); return; } } /* Effect exists but not in list, shouldn't happen */ g_assert_not_reached(); } } /* Effect doesn't exist - do nothing */ } void effect_browser_shutdown(void) { if (inifile_get_gboolean("useGeometry",FALSE)) geometry_stack_save_to_inifile("effectGeometry",geometry_stack); } mhwaveedit-1.4.24/src/effectbrowser.h000066400000000000000000000057401334022513400175420ustar00rootroot00000000000000/* * Copyright (C) 2003 2004 2007, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #ifndef EFFECTBROWSER_H_INCLUDED #define EFFECTBROWSER_H_INCLUDED #include "documentlist.h" #include "effectdialog.h" #define EFFECT_BROWSER(obj) GTK_CHECK_CAST(obj,effect_browser_get_type(),EffectBrowser) #define EFFECT_BROWSER_CLASS(klass) GTK_CHECK_CLASS_CAST(klass,effect_browser_get_type(),EffectBrowserClass) #define IS_EFFECT_BROWSER(obj) GTK_CHECK_TYPE(obj,effect_browser_get_type()) #define EFFECT_BROWSER_CACHE_SIZE 8 typedef struct { GtkWindow window; DocumentList *dl; GtkBox *mw_list_box; GtkList *list_widget; GtkListItem *list_widget_sel,*list_widget_clicked; GtkToggleButton *close_after; gint current_dialog; EffectDialog *dialogs[EFFECT_BROWSER_CACHE_SIZE]; gpointer dialog_effects[EFFECT_BROWSER_CACHE_SIZE]; GtkContainer *effect_list_container; GtkContainer *dialog_container; } EffectBrowser; typedef struct { GtkWindowClass window_class; } EffectBrowserClass; typedef void (*effect_register_rebuild_func)(gchar source_tag, gpointer user_data); typedef EffectDialog *(*effect_register_get_func)(gchar *name, gchar source_tag, gpointer user_data); #define EFFECT_PARAM_TAG 0 #define EFFECT_PARAM_TITLE 1 #define EFFECT_PARAM_AUTHOR 2 #define EFFECT_PARAM_LOCATION 3 #define EFFECT_PARAM_MAX 3 void effect_register_init(void); void effect_register_add_source(gchar *name, gchar tag, effect_register_rebuild_func rebuild_func, gpointer rebuild_func_data, effect_register_get_func get_func, gpointer get_func_data); void effect_register_add_effect(gchar source_tag, const gchar *name, const gchar *title, const gchar *author, const gchar *location); void effect_register_rebuild(void); GtkType effect_browser_get_type(void); GtkWidget *effect_browser_new(Document *doc); GtkWidget *effect_browser_new_with_effect(Document *doc, gchar *effect_name, gchar source_tag, gboolean close_after); void effect_browser_set_effect(EffectBrowser *eb, gchar *effect_name, gchar source_tag); void effect_browser_invalidate_effect(EffectBrowser *eb, gchar *effect_name, gchar source_tag); void effect_browser_shutdown(void); #endif mhwaveedit-1.4.24/src/effectdialog.c000066400000000000000000000071121334022513400173040ustar00rootroot00000000000000/* * Copyright (C) 2002 2003 2004, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include #include #include #include "mainwindow.h" #include "effectdialog.h" #include "effectbrowser.h" #include "main.h" #include "um.h" enum { APPLY_SIGNAL, SETUP_SIGNAL, TARGET_CHANGED_SIGNAL, LAST_SIGNAL }; static guint effect_dialog_signals[LAST_SIGNAL] = { 0 }; static void effect_dialog_class_init(GtkObjectClass *klass) { EFFECT_DIALOG_CLASS(klass)->apply = NULL; EFFECT_DIALOG_CLASS(klass)->setup = NULL; EFFECT_DIALOG_CLASS(klass)->target_changed = NULL; effect_dialog_signals[APPLY_SIGNAL] = gtk_signal_new("apply",GTK_RUN_LAST,GTK_CLASS_TYPE(klass), GTK_SIGNAL_OFFSET(EffectDialogClass,apply), gtk_marshal_BOOL__NONE,GTK_TYPE_BOOL,0); effect_dialog_signals[SETUP_SIGNAL] = gtk_signal_new("setup",GTK_RUN_FIRST,GTK_CLASS_TYPE(klass), GTK_SIGNAL_OFFSET(EffectDialogClass,setup), gtk_marshal_NONE__NONE,GTK_TYPE_NONE,0); effect_dialog_signals[TARGET_CHANGED_SIGNAL] = gtk_signal_new("target-changed",GTK_RUN_FIRST,GTK_CLASS_TYPE(klass), GTK_SIGNAL_OFFSET(EffectDialogClass,target_changed), gtk_marshal_NONE__NONE,GTK_TYPE_NONE,0); gtk_object_class_add_signals(klass,effect_dialog_signals,LAST_SIGNAL); } gboolean effect_dialog_apply(EffectDialog *ed) { gboolean r; gtk_signal_emit(GTK_OBJECT(ed),effect_dialog_signals[APPLY_SIGNAL],&r); return r; } static void effect_dialog_init(EffectDialog *v) { GtkWidget *b; gtk_box_set_spacing(GTK_BOX(v),3); b = gtk_hbox_new ( FALSE, 3 ); v->input_area = GTK_CONTAINER(b); gtk_box_pack_start ( GTK_BOX(v), b, FALSE, FALSE, 0 ); gtk_widget_show ( b ); gtk_container_set_border_width(GTK_CONTAINER(v),5); } GtkType effect_dialog_get_type(void) { static GtkType id = 0; if (!id) { GtkTypeInfo info = { "EffectDialog", sizeof(EffectDialog), sizeof(EffectDialogClass), (GtkClassInitFunc) effect_dialog_class_init, (GtkObjectInitFunc) effect_dialog_init }; id = gtk_type_unique(gtk_vbox_get_type(),&info); } return id; } static void effect_dialog_eb_target_changed(DocumentList *dl, gpointer user_data) { /* puts("effect_dialog_eb_target_changed"); */ gtk_signal_emit(GTK_OBJECT(user_data), effect_dialog_signals[TARGET_CHANGED_SIGNAL]); } void effect_dialog_setup(EffectDialog *ed, gchar *effect_name, gpointer eb) { g_assert(ed->eb == NULL && eb != NULL); ed->eb = eb; ed->effect_name = effect_name; gtk_signal_connect_while_alive (GTK_OBJECT(EFFECT_BROWSER(eb)->dl),"document_changed", GTK_SIGNAL_FUNC(effect_dialog_eb_target_changed),ed,GTK_OBJECT(ed)); gtk_signal_emit(GTK_OBJECT(ed), effect_dialog_signals[SETUP_SIGNAL]); } mhwaveedit-1.4.24/src/effectdialog.h000066400000000000000000000062201334022513400173100ustar00rootroot00000000000000/* * Copyright (C) 2002 2003 2004, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ /* -------------------------------------------------------------------------- * This is the base class for most of the dialogs inside the effects * browser. The class should be considered "abstract" and the functions in this * file should only be used from subclasses. * * Each EffectDialog is associated with an effect browser and when * the associated browser is closed, the dialog will automatically * close as well. * * The EffectDialog has an input area where subclasses can place widgets for * setting effect parameters etc. * -------------------------------------------------------------------------- */ #ifndef EFFECT_DIALOG_H_INCLUDED #define EFFECT_DIALOG_H_INCLUDED #include #include "mainwindow.h" #define EFFECT_DIALOG(obj) GTK_CHECK_CAST(obj,effect_dialog_get_type(),EffectDialog) #define EFFECT_DIALOG_CLASS(klass) GTK_CHECK_CLASS_CAST(klass,effect_dialog_get_type(),EffectDialogClass) #define IS_EFFECT_DIALOG(obj) GTK_CHECK_TYPE(obj,effect_dialog_get_type()) typedef struct _EffectDialog { GtkVBox vbox; /* Input area - subclasses can add their own widgets here. */ GtkContainer *input_area; /* Associated effect browser. Read-only, set this once with the * effect_dialog_setup function. */ gpointer eb; /* Effect name. Read-only, do not modify or free. */ gchar *effect_name; } EffectDialog; typedef struct _EffectDialogClass { GtkVBoxClass vbox_class; /* This signal is emitted when the OK or Apply button is pressed. Default * action: do nothing. Return TRUE if something failed. */ gboolean (*apply)(EffectDialog *ed); /* This signal is called when the associated EffectBrowser and * effect name has been set for the dialog. */ void (*setup)(EffectDialog *ed); /* Called when eb->mwl->selected->chunk has changed */ void (*target_changed)(EffectDialog *ed); } EffectDialogClass; GtkType effect_dialog_get_type(void); /* This sets the associated Mainwindow for the dialog. This must be called once * and only once for a dialog. * * ed - An EffectDialog * eb - The EffectBrowser to associate with the EffectDialog. */ void effect_dialog_setup(EffectDialog *ed, gchar *effect_name, gpointer eb); /* This "runs" the effect with the current settings. Returns TRUE on failure. */ gboolean effect_dialog_apply(EffectDialog *ed); #endif mhwaveedit-1.4.24/src/filetypes.c000066400000000000000000001265041334022513400167030ustar00rootroot00000000000000/* * Copyright (C) 2002 2003 2004 2005 2006 2007 2009 2011 2012, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include #include #include #include #include #include #include #include "um.h" #include "inifile.h" #include "rawdialog.h" #include "pipedialog.h" #include "mainloop.h" #include "filetypes.h" #include "tempfile.h" #include "combo.h" #include "gettext.h" #define MAX_REAL_SIZE inifile_get_guint32(INI_SETTING_REALMAX,INI_SETTING_REALMAX_DEFAULT) #define WAVE_FORMAT_PCM 1 #define WAVE_FORMAT_IEEE_FLOAT 3 struct file_type; struct file_type { gchar *name; gchar *extension; gboolean lossy; gboolean (*typecheck)(gchar *filename); Chunk *(*load)(gchar *filename, int dither_mode, StatusBar *bar); gboolean (*save)(Chunk *chunk, gchar *filename, gpointer settings, struct file_type *type, int dither_mode, StatusBar *bar, gboolean *fatal); gpointer (*get_settings)(void); void (*free_settings)(gpointer settings); gint extra_data; }; static GList *file_types = NULL; static struct file_type *raw_type,*mplayer_type; static gboolean wav_check(gchar *filename); static Chunk *wav_load(gchar *filename, int dither_mode, StatusBar *bar); static gint wav_save(Chunk *chunk, gchar *filename, gpointer settings, struct file_type *type, int dither_mode, StatusBar *bar,gboolean *fatal); #ifdef HAVE_LIBSNDFILE static gboolean sndfile_check(gchar *filename); static Chunk *sndfile_load(gchar *filename, int dither_mode, StatusBar *bar); static gint sndfile_save(Chunk *chunk, gchar *filename, gpointer settings, struct file_type *type, int dither_mode, StatusBar *bar, gboolean *fatal); static gboolean sndfile_save_main(Chunk *chunk, gchar *filename, int format, int dither_mode, StatusBar *bar, gboolean *fatal); static gboolean sndfile_ogg_flag = FALSE; #endif static Chunk *raw_load(gchar *filename, int dither_mode, StatusBar *bar); static gint raw_save(Chunk *chunk, gchar *filename, gpointer settings, struct file_type *type, int dither_mode, StatusBar *bar, gboolean *fatal); static Chunk *ogg_load(gchar *filename, int dither_mode, StatusBar *bar); static gint ogg_save(Chunk *chunk, gchar *filename, gpointer settings, struct file_type *type, int dither_mode, StatusBar *bar, gboolean *fatal); static gpointer mp3_get_settings(void); static Chunk *mp3_load(gchar *filename, int dither_mode, StatusBar *bar); static gint mp3_save(Chunk *chunk, gchar *filename, gpointer settings, struct file_type *type, int dither_mode, StatusBar *bar, gboolean *fatal); static Chunk *try_mplayer(gchar *filename, int dither_mode, StatusBar *bar); static gboolean xputenv(char *string) { if (putenv(string)) { user_error(_("putenv failed!")); return TRUE; } return FALSE; } static gboolean xunsetenv(char *varname) { #ifdef UNSETENV_RETVAL if (unsetenv(varname) != 0) { console_message(_("unsetenv failed!")); return TRUE; } #else unsetenv(varname); #endif return FALSE; } static struct file_type *register_file_type (gchar *name, gchar *ext, gboolean lossy, gboolean (*typecheck)(gchar *filename), Chunk *(*load)(gchar *filename, int dither_mode, StatusBar *bar), gint (*save)(Chunk *chunk, gchar *filename,gpointer settings, struct file_type *type,int dither_mode, StatusBar *bar,gboolean *fatal), int extra_data) { struct file_type *t; t = g_malloc(sizeof(*t)); t->name = g_strdup(name); t->extension = g_strdup(ext); t->lossy = lossy; t->typecheck = typecheck; t->load = load; t->save = save; t->extra_data = extra_data; t->get_settings = NULL; t->free_settings = NULL; file_types = g_list_append(file_types,t); return t; } static void setup_types(void) { struct file_type *t; #if defined(HAVE_LIBSNDFILE) SF_FORMAT_INFO info; int major_count,i; gchar buf[32]; #endif if (file_types) return; register_file_type(_("Microsoft WAV format"), ".wav", FALSE, wav_check, wav_load, wav_save, 0); #if defined(HAVE_LIBSNDFILE) sf_command(NULL, SFC_GET_FORMAT_MAJOR_COUNT, &major_count, sizeof(int)); for (i=0; iget_settings = mp3_get_settings; t->free_settings = g_free; } raw_type = register_file_type(_("Raw PCM data"), ".raw", FALSE,NULL, raw_load, raw_save, 0); mplayer_type = register_file_type(_("Open with MPlayer"), NULL,TRUE,NULL, try_mplayer, NULL, 0); } guint fileformat_count(void) { setup_types(); return g_list_length(file_types); } gchar *fileformat_name(guint fileformat) { struct file_type *t; t = g_list_nth_data(file_types, fileformat); if (t) return t->name; return NULL; } gchar *fileformat_extension(guint fileformat) { struct file_type *t; t = g_list_nth_data(file_types, fileformat); if (t) return t->extension; return NULL; } gboolean fileformat_has_options(guint fileformat) { struct file_type *t; t = g_list_nth_data(file_types, fileformat); if (t) return ((t->get_settings) != NULL); else return FALSE; } static Chunk *chunk_load_main(gchar *filename, int dither_mode, StatusBar *bar, struct file_type **format) { GList *l; struct file_type *ft; gchar *c; Chunk *chunk; setup_types(); /* Search through the extensions */ for (l=file_types; l!=NULL; l=l->next) { ft = (struct file_type *)l->data; if (!ft->extension) continue; c = strchr(filename,0) - strlen(ft->extension); if (cextension)!=0) continue; if (ft->typecheck==NULL || ft->typecheck(filename)) { *format = ft; return ft->load(filename,dither_mode,bar); } } /* Use the file checking functions */ for (l=file_types; l!=NULL; l=l->next) { ft = (struct file_type *)l->data; if (ft->typecheck == NULL) continue; if (ft->typecheck(filename)) { *format = ft; return ft->load(filename,dither_mode,bar); } } /* Try mplayer if available */ chunk = try_mplayer(filename,dither_mode,bar); if (chunk != NULL) { *format = mplayer_type; return chunk; } /* Use the raw loader */ *format = raw_type; return raw_load(filename,dither_mode,bar); } Chunk *chunk_load_x(gchar *filename, int dither_mode, StatusBar *bar, gboolean *lossy) { Chunk *chunk; gchar *c; EFILE *f; struct file_type *ft = NULL; /* First, see if the file exists */ if (!file_exists(filename)) { c = g_strdup_printf(_("The file %s does not exist!"),filename); user_error(c); g_free(c); return NULL; } if (!file_is_normal(filename)) { c = g_strdup_printf(_("The file %s is not a regular file!"),filename); user_error(c); g_free(c); return NULL; } /* Try to open it here so we don't get a lot of 'permission * denied' and similar errors later */ f = e_fopen(filename,EFILE_READ); if (f == NULL) return NULL; e_fclose(f); status_bar_begin_progress(bar,1,_("Loading")); chunk = chunk_load_main(filename,dither_mode,bar,&ft); status_bar_end_progress(bar); if (chunk != NULL) *lossy = ft->lossy; return chunk; } Chunk *chunk_load(gchar *filename, int dither_mode, StatusBar *bar) { gboolean b; return chunk_load_x(filename,dither_mode,bar,&b); } static struct file_type *choose_format(gchar *filename) { struct file_type *ft; GList *l; gchar *c, **z, **z2; guint i; gint x; setup_types(); /* Search through the extensions */ for (l=file_types; l!=NULL; l=l->next) { ft = (struct file_type *)l->data; if (!ft->extension) continue; c = strchr(filename,0) - strlen(ft->extension); if (cextension)!=0) continue; if (ft->save != NULL) return ft; } /* Ask for file type */ z = g_malloc((g_list_length(file_types)+1) * sizeof(char *)); for (l=file_types,z2=z; l!=NULL; l=l->next,z2++) { ft = (struct file_type *)l->data; *z2 = ft->name; } *z2 = NULL; c = g_strdup_printf(_("The file name '%s' has an extension unknown to the " "program. Please specify in which format this file " "should be saved."),filename); i = (guint)inifile_get_guint32("lastSaveFileType",0); if (i>=g_list_length(file_types)) i=0; x = user_choice(z, (guint)i, _("Unknown file type"), c, TRUE); g_free(z); g_free(c); if (x==-1) return NULL; inifile_set_guint32("lastSaveFileType",(guint32)x); ft = g_list_nth_data( file_types, x ); return ft; } gboolean chunk_save(Chunk *chunk, gchar *filename, int filetype, gboolean use_default_settings, int dither_mode, StatusBar *bar) { gchar *d; gboolean b=FALSE,res; EFILE *f; gpointer settings = NULL; struct file_type *ft; gint i; /* Let the user choose a format first, so that if the user presses cancel, * we haven't done any of the backup/unlink stuff.. */ if (filetype < 0) ft = choose_format(filename); else ft = g_list_nth_data(file_types, filetype); if (ft == NULL) return TRUE; if (!use_default_settings) { if (ft->get_settings == NULL) { i = user_message("There are no settings for this file format. " "Proceeding with standard settings.", UM_OKCANCEL); if (i == MR_CANCEL) return TRUE; } else { settings = ft->get_settings(); if (settings == NULL) return TRUE; } } if (file_exists(filename)) { /* Check that the file is writeable by us. */ f = e_fopen(filename,EFILE_APPEND); if (f == NULL) return TRUE; e_fclose(f); /* we may need to move or copy the file into a tempfile... */ if (datasource_backup_unlink(filename)) return TRUE; } status_bar_begin_progress(bar,chunk->size,_("Saving")); res = ft->save(chunk,filename,settings,ft,dither_mode,bar,&b); if (res && b && !status_bar_progress(bar,0)) { d = g_strdup_printf(_("The file %s may be destroyed since the" " saving failed. Try to free up some disk space " "and save again. If you exit now the " "file's contents could be in a bad state. "), filename); user_warning(d); g_free(d); } status_bar_end_progress(bar); if (settings != NULL) ft->free_settings(settings); return res; } /* WAV */ static gboolean wav_check(gchar *filename) { EFILE *f; char buf[12]; f = e_fopen ( filename, EFILE_READ ); if (!f) return FALSE; if (e_fread(buf,12,f)) { e_fclose(f); return FALSE; } e_fclose(f); if ((memcmp(buf,"RIFF",4) && memcmp(buf,"RIFX",4)) || memcmp(buf+8,"WAVE",4)) return FALSE; return TRUE; } static off_t find_wav_chunk(EFILE *f, char *chunkname, gboolean be) { char buf[4]; guint32 l; while (1) { if (e_fread(buf,4,f) || e_fread_u32_xe(&l,f,be)) return -1; if (!memcmp(buf,chunkname,4)) { #if SIZEOF_OFF_T > 4 return (off_t) l; #else return (l>=0x80000000) ? 0x7FFFFFFFL : l; #endif } if (e_fseek(f,(off_t)l,SEEK_CUR)) return -1; } } static Chunk *wav_load(char *filename, int dither_mode, StatusBar *bar) { EFILE *f; char *c; char buf[12]; long int m; guint16 s,channels,bits; guint32 samplerate; off_t l,e; gboolean rifx = FALSE; Datasource *ds; Dataformat fmt; f = e_fopen ( filename, EFILE_READ ); if (!f) return NULL; if (e_fread(buf,12,f)) { e_fclose(f); return NULL; } if ((memcmp(buf,"RIFF",4) && memcmp(buf,"RIFX",4)) || memcmp(buf+8,"WAVE",4)) { c = g_strdup_printf (_("%s is not a valid wav file"),filename); user_error(c); g_free(c); e_fclose(f); return NULL; } if (!memcmp(buf,"RIFX",4)) rifx=TRUE; l = find_wav_chunk(f,"fmt ",rifx); if ((l == -1) || e_fread_u16_xe(&s,f,rifx)) { e_fclose(f); return NULL; } if ( l<16 || (s != 0x0001 && s != 0x0003) ) { e_fclose(f); #if defined(HAVE_LIBSNDFILE) /* Fall back on Libsndfile for reading non-PCM wav files. */ return sndfile_load(filename,dither_mode,bar); #else c = g_strdup_printf (_("The file %s is a compressed wav file. This " "program can only work with uncompressed wav " "files."),filename); user_error(c); free(c); return NULL; #endif } if (e_fread_u16_xe(&channels,f,rifx) || e_fread_u32_xe(&samplerate,f,rifx) || e_fseek(f,6,SEEK_CUR) || e_fread_u16_xe(&bits,f,rifx) || (l>16 && e_fseek(f,l-16,SEEK_CUR))) { e_fclose(f); return NULL; } l = find_wav_chunk(f,"data",rifx); m = e_ftell(f); if (l == -1 || m == -1) { e_fclose(f); return NULL; } /* Find length of file and close it*/ if (e_fseek(f,0,SEEK_END)) { e_fclose(f); return NULL; } e = e_ftell(f); e_fclose(f); if (e == -1) { return NULL; } /* Is the file smaller than expected? */ if (e-m 4 /* Special code to handle very large files. If the specified data * chunk length makes the expected file length within 32 bytes of * the 4GB limit, assume the data chunk continues until EOF */ if (m+l >= (off_t)0xFFFFFFE0) l=e-m; #endif fmt.samplerate = samplerate; fmt.channels = channels; if (s == 1) fmt.type = DATAFORMAT_PCM; else fmt.type = DATAFORMAT_FLOAT; fmt.samplesize = (bits+7) >> 3; fmt.samplebytes = fmt.samplesize * fmt.channels; fmt.sign = (bits>8); fmt.bigendian = rifx; fmt.packing = 0; ds = gtk_type_new(datasource_get_type()); memcpy(&(ds->format),&fmt,sizeof(fmt)); ds->type = DATASOURCE_VIRTUAL; ds->bytes = l; ds->length = l / (off_t)fmt.samplebytes; ds->data.virtual.filename = g_strdup(filename); ds->data.virtual.offset = m; /* printf("wav_load: samplebytes: %d, length: %ld\n",(int)fmt.samplebytes, (long int)ds->length); printf("wav_load: bigendian: %d\n",fmt.bigendian); */ if (ds->bytes <= MAX_REAL_SIZE) datasource_realize(ds,dither_mode); return chunk_new_from_datasource(ds); } static gboolean wav_save(Chunk *chunk, char *filename, gpointer settings, struct file_type *type, int dither_mode, StatusBar *bar, gboolean *fatal) { Chunk *c; EFILE *f; Datasource *ds; DataPart *dp; Dataformat *fmt,cfmt; gboolean b,q; fmt = &(chunk->format); /* Check if the format is OK */ if (fmt->type == DATAFORMAT_PCM) { /* Check that the sign and endian-ness is correct */ if (fmt->samplesize == 1) q = FALSE; else q = TRUE; if (XOR(fmt->sign,q) || fmt->bigendian || fmt->packing!=0) { memcpy(&cfmt,fmt,sizeof(cfmt)); cfmt.sign = q; cfmt.bigendian = FALSE; if (cfmt.packing != 0) { g_assert(cfmt.samplesize == 4); cfmt.samplesize = 3; cfmt.packing = 0; } c = chunk_convert(chunk,&cfmt,DITHER_UNSPEC,bar); b = wav_save(c,filename,settings,type,dither_mode,bar,fatal); gtk_object_sink(GTK_OBJECT(c)); return b; } } else if (ieee_le_compatible || ieee_be_compatible) { if (fmt->bigendian) { memcpy(&cfmt,fmt,sizeof(cfmt)); cfmt.bigendian = FALSE; c = chunk_convert(chunk,&cfmt,DITHER_UNSPEC,bar); b = wav_save(c,filename,settings,type,dither_mode,bar,fatal); gtk_object_sink(GTK_OBJECT(c)); return b; } } /* If we can't handle it, delegate the FP chunk saving to libsndfile. */ if (chunk->format.type == DATAFORMAT_FLOAT && !ieee_le_compatible && !ieee_be_compatible) { #ifdef HAVE_LIBSNDFILE return sndfile_save_main(chunk,filename,SF_FORMAT_WAV,dither_mode, bar,fatal); #else user_error(_("On this system, libsndfile is required to save " "floating-point wav files.")); return TRUE; #endif } if (fmt->type == DATAFORMAT_PCM && fmt->samplesize==1 && fmt->sign) { /* user_error(_("8-bit wav-files must be in unsigned format!")); */ g_assert_not_reached(); } if (fmt->type == DATAFORMAT_PCM && fmt->samplesize>1 && !fmt->sign) { /*user_error(_("16/24/32-bit wav-files must be in signed format!")); */ g_assert_not_reached(); } if (fmt->type == DATAFORMAT_PCM && fmt->bigendian == TRUE) { /* user_error(_("wav files must be in little endian format!")); */ g_assert_not_reached(); } /* Give a warning once if we're saving a file larger than 2GB */ if (chunk->size > (off_t)0x7FFFFFD3 && !inifile_get_gboolean("warnLargeWav",FALSE)) { user_warning(_("You are saving a wav file larger than 2048MB." " Such large files are non-standard and may not be " "readable by all programs.\n\n" " (this warning will not be displayed again)")); inifile_set_gboolean("warnLargeWav",TRUE); } /* If we're saving an entire TEMPFILE and it's in WAV format, we can just * move it (this speeds up things like saving directly after * recording. */ dp = (DataPart *)chunk->parts->data; ds = dp->ds; if (chunk->parts->next == NULL && dp->position == 0 && dp->length == ds->length && (ds->type == DATASOURCE_TEMPFILE) && (ds->data.virtual.offset == 44 || (ieee_le_compatible && ds->data.virtual.offset == 58)) && wav_check(ds->data.virtual.filename)) { if (xunlink(filename)) return TRUE; *fatal = TRUE; if (xrename(ds->data.virtual.filename,filename,TRUE)) return TRUE; ds->type = DATASOURCE_VIRTUAL; g_free(ds->data.virtual.filename); ds->data.virtual.filename = g_strdup(filename); return FALSE; } else { /* Regular saving */ f = e_fopen(filename,EFILE_WRITE); if (!f) return TRUE; *fatal = TRUE; if (write_wav_header(f,fmt,chunk->size)) { e_fclose(f); return TRUE; } b = chunk_dump(chunk,f,FALSE,dither_mode,bar); if (b) { e_fclose_remove(f); return TRUE; } e_fclose ( f ); return FALSE; } return 0; } /* RAW */ static Chunk *raw_load(gchar *filename, int dither_mode, StatusBar *bar) { Datasource *ds; Dataformat *fmt; off_t i; guint offs; i = errdlg_filesize(filename); if (i==-1) return NULL; fmt = rawdialog_execute(filename,i,&offs); if (!fmt) return NULL; ds = (Datasource *)gtk_type_new(datasource_get_type()); memcpy(&(ds->format),fmt,sizeof(Dataformat)); ds->bytes = i-offs; ds->length = (i-offs)/fmt->samplebytes; ds->type = DATASOURCE_VIRTUAL; ds->data.virtual.filename = g_strdup(filename); ds->data.virtual.offset = offs; return chunk_new_from_datasource(ds); } static gint raw_save(Chunk *chunk, gchar *filename, gpointer settings, struct file_type *type, int dither_mode, StatusBar *bar, gboolean *fatal) { EFILE *f; gint i; f = e_fopen(filename,EFILE_WRITE); if (!f) return TRUE; i = chunk_dump(chunk,f,IS_BIGENDIAN,dither_mode,bar); if (i < 0) *fatal = TRUE; e_fclose(f); return i; } /* SNDFILE */ #if defined(HAVE_LIBSNDFILE) static gboolean sndfile_check(gchar *filename) { SF_INFO info = {}; SNDFILE *s; s = sf_open(filename, SFM_READ, &info); if (s) sf_close(s); return (s!=NULL && ((info.format&SF_FORMAT_SUBMASK) != SF_FORMAT_RAW) && ((info.format&SF_FORMAT_SUBMASK) != SF_FORMAT_VORBIS || inifile_get_guint32("sndfileOggMode",1)!=2)); } static Chunk *sndfile_load(gchar *filename, int dither_mode, StatusBar *bar) { SF_INFO info = {}; SNDFILE *s; Datasource *ds; Dataformat f; gchar *ch; int rawbuf_size; void *rawbuf; guint st; gboolean raw_readable=FALSE; TempFile tmp; s = sf_open(filename, SFM_READ, &info); if (!s) { ch = g_strdup_printf(_("Failed to open '%s'!"),filename); user_error(ch); g_free(ch); return NULL; } /* printf("info.seekable = %d, info.samples = %d\n",info.seekable,info.samples); */ memset(&f,0,sizeof(f)); f.type = DATAFORMAT_PCM; f.bigendian = IS_BIGENDIAN; /* Fix samplesize parameter */ switch (info.format&SF_FORMAT_SUBMASK) { case SF_FORMAT_PCM_U8: f.sign=FALSE;f.samplesize=1;raw_readable=TRUE;break; case SF_FORMAT_PCM_S8: f.sign=TRUE; f.samplesize=1;raw_readable=TRUE;break; case SF_FORMAT_PCM_16: f.sign=TRUE; f.samplesize=2;break; case SF_FORMAT_PCM_24: f.sign=TRUE; f.samplesize=4; f.packing=1; break; case SF_FORMAT_PCM_32: f.sign=TRUE; f.samplesize=4; break; case SF_FORMAT_VORBIS: if (inifile_get_guint32("sndfileOggMode",1)!=0) info.seekable = 0; /* (Fall through on purpose) */ /* Default to floating point */ default: memcpy(&f,&dataformat_sample_t,sizeof(f)); break; } f.samplerate = info.samplerate; f.channels = info.channels; f.samplebytes = f.channels * f.samplesize; ds = gtk_type_new(datasource_get_type()); ds->type = DATASOURCE_SNDFILE; memcpy(&(ds->format),&f,sizeof(f)); ds->length = (off_t) info.frames; ds->bytes = (off_t) (ds->length * f.samplebytes); ds->opencount = 1; ds->data.sndfile.filename = g_strdup(filename); ds->data.sndfile.raw_readable = raw_readable; ds->data.sndfile.handle = s; ds->data.sndfile.pos = 0; /* Handle seekable chunks */ if (info.seekable) { datasource_close(ds); return chunk_new_from_datasource(ds); } /* Chunk is not seekable, we must dump it into a tempfile. */ /* puts("Non-native format!!"); */ tmp = tempfile_init(&f,FALSE); status_bar_begin_progress(bar,info.frames,NULL); rawbuf_size = f.samplesize * f.channels * 1024; rawbuf = g_malloc(rawbuf_size); while (ds->data.sndfile.pos < ds->length) { st = datasource_read_array(ds,ds->data.sndfile.pos,rawbuf_size, rawbuf, dither_mode, NULL); if (st == 0 || tempfile_write(tmp,rawbuf,st) || status_bar_progress(bar, st/f.samplebytes)) { datasource_close(ds); gtk_object_sink(GTK_OBJECT(ds)); tempfile_abort(tmp); g_free(rawbuf); status_bar_end_progress(bar); return NULL; } } g_free(rawbuf); datasource_close(ds); gtk_object_sink(GTK_OBJECT(ds)); status_bar_end_progress(bar); return tempfile_finished(tmp); } static gboolean find_nearest_sndfile_format(Dataformat *fmt, int format, SF_INFO *info, gchar *filename) { int suggestions[] = { SF_FORMAT_PCM_U8, SF_FORMAT_PCM_S8, SF_FORMAT_PCM_16, SF_FORMAT_PCM_24, SF_FORMAT_PCM_32, SF_FORMAT_FLOAT, SF_FORMAT_DOUBLE }; int i,j,k; SF_INFO sfi; info->samplerate = fmt->samplerate; info->channels = fmt->channels; /* Try suggestions first... */ if (fmt->type == DATAFORMAT_PCM) { i = fmt->samplesize; if (fmt->packing != 0) i--; if (i == 1) i--; } else if (fmt->samplesize == sizeof(float)) i = 5; else i = 6; for (; iformat = format | suggestions[i]; if (sf_format_check(info)) return FALSE; } /* Now try the formats that were not in the suggestion array... */ sf_command(NULL, SFC_GET_FORMAT_SUBTYPE_COUNT, &i, sizeof(int)); for (j=0; jformat = (sfi.format&SF_FORMAT_SUBMASK) | format; if (sf_format_check(info)) return FALSE; } /* Try the left out suggestions finally... */ i = fmt->samplesize; if (i > 1) { i--; for (; i>=0; i--) { info->format = format | suggestions[i]; if (sf_format_check(info)) return FALSE; } } user_error(_("Invalid sample format or number of channels for this file" " format")); return TRUE; } static gboolean sndfile_save_main(Chunk *chunk, gchar *filename, int format, int dither_mode, StatusBar *bar, gboolean *fatal) { gchar *c; off_t i; guint n; SNDFILE *s; SF_INFO info; void *samplebuf; ChunkHandle *ch; off_t clipcount = 0; Dataformat fmt; Chunk *convchunk; sf_count_t wc; if (find_nearest_sndfile_format(&(chunk->format),format,&info,filename)) return -1; s = sf_open(filename, SFM_WRITE, &info); if (!s) { c = g_strdup_printf(_("Failed to open '%s'!"),filename); user_error(c); g_free(c); return -1; } /* Decide on a format suitable for passing into one of the * sndfile_write functions (byte,short,int or float) */ memcpy(&fmt,&(chunk->format),sizeof(fmt)); fmt.bigendian = IS_BIGENDIAN; if (fmt.samplesize > 1) { fmt.sign = TRUE; if (fmt.samplesize == 3) { fmt.samplesize = 4; fmt.packing = 1; } if (fmt.packing == 2) fmt.packing=1; fmt.samplebytes = fmt.samplesize * fmt.channels; } if (dataformat_samples_equal(&fmt,&(chunk->format))) { convchunk = chunk; gtk_object_ref(GTK_OBJECT(convchunk)); } else { convchunk = chunk_convert_sampletype(chunk, &fmt); gtk_object_ref(GTK_OBJECT(convchunk)); gtk_object_sink(GTK_OBJECT(convchunk)); } ch = chunk_open(convchunk); if (ch == NULL) { gtk_object_unref(GTK_OBJECT(convchunk)); sf_close(s); return -1; } samplebuf = g_malloc(fmt.samplebytes * 1024); for (i=0; ilength; i+=n) { n = chunk_read_array(ch,i,1024*fmt.samplebytes,samplebuf,dither_mode,&clipcount); if (!n) { chunk_close(ch); sf_close(s); g_free(samplebuf); gtk_object_unref(GTK_OBJECT(convchunk)); *fatal = TRUE; return -1; } n /= fmt.samplebytes; if (fmt.type == DATAFORMAT_FLOAT) { if (fmt.samplesize == sizeof(float)) { wc = sf_writef_float(s,samplebuf,n); } else { wc = sf_writef_double(s,samplebuf,n); } } else if (fmt.type == DATAFORMAT_PCM) { if (fmt.samplesize == 1) { wc = sf_write_raw(s,samplebuf,n*fmt.samplebytes); wc /= fmt.samplebytes; } else if (fmt.samplesize == 2) { wc = sf_writef_short(s,samplebuf,n); } else { wc = sf_writef_int(s,samplebuf,n); } } if (wc != n) { c = g_strdup_printf(_("Failed to write to '%s'!"),filename); user_error(c); g_free(c); chunk_close(ch); sf_close(s); g_free(samplebuf); gtk_object_unref(GTK_OBJECT(convchunk)); *fatal = TRUE; return -1; } if (status_bar_progress(bar, n*fmt.samplebytes)) { chunk_close(ch); sf_close(s); g_free(samplebuf); xunlink(filename); gtk_object_unref(GTK_OBJECT(convchunk)); return -1; } } chunk_close(ch); sf_close(s); g_free(samplebuf); gtk_object_unref(GTK_OBJECT(convchunk)); return clipwarn(clipcount,TRUE); } static gint sndfile_save(Chunk *chunk, gchar *filename, gpointer settings, struct file_type *type, int dither_mode, StatusBar *bar, gboolean *fatal) { return sndfile_save_main(chunk,filename,type->extra_data,dither_mode, bar,fatal); } #endif gboolean sndfile_ogg_supported(void) { #if defined(HAVE_LIBSNDFILE) setup_types(); return sndfile_ogg_flag; #else return FALSE; #endif } /* OGG and MP3 */ int run_decoder_cs(gpointer csource, gpointer user_data) { return 0; } static Chunk *run_decoder(gchar *filename, gchar *tempname, gchar *progname, gchar **argv, int dither_mode, StatusBar *bar) { gchar *c; Chunk *r=NULL; Datasource *ds; pid_t p,q; gboolean b; off_t o; gpointer cs; /* Using oggdec in raw mode to decode to stdout, it seems there is no * way to determine the sample rate of the output, so we decode it to a * temporary wave file instead */ p = fork(); if (p == -1) { c = g_strdup_printf("Error: fork: %s",strerror(errno)); user_error(c); g_free(c); return NULL; } else if (p == 0) { close_all_files(); execvp(progname,argv); fprintf(stderr,"execvp: %s: %s\n",progname,strerror(errno)); _exit(1); } b = um_use_gtk; um_use_gtk = FALSE; /* Estimate the output wav's size as 20 times the original's size or 64MB */ o = errdlg_filesize(filename); if (o<0) o=64*1024*1024; else o *= 20; status_bar_begin_progress(bar,o,_("Decoding")); /* Hack: To avoid the potential race condition between mainloop and waitpid * in this loop, we add a constant event source to make sure the mainloop * never waits indefinitely. */ cs = mainloop_constant_source_add(run_decoder_cs,NULL,TRUE); while (1) { mainloop(); /* See if the child has exited */ q = waitpid(p,NULL,WNOHANG); if (q == p) break; if (q == -1) { console_perror("waitpid"); break; } /* See how large the file is */ if (!file_exists(tempname)) continue; o = errdlg_filesize(tempname); if (o > 0 && status_bar_progress(bar,o-bar->progress_cur)) { kill(p,SIGKILL); waitpid(p,NULL,0); xunlink(tempname); break; } } um_use_gtk = b; if (file_exists(tempname)) { r=wav_load(tempname,dither_mode,bar); if (r != NULL) { ds = ((DataPart *)(r->parts->data))->ds; if (ds->type == DATASOURCE_VIRTUAL) ds->type = DATASOURCE_TEMPFILE; } } status_bar_end_progress(bar); mainloop_constant_source_free(cs); return r; } static Chunk *ogg_load(gchar *filename, int dither_mode, StatusBar *bar) { gchar *tempname = get_temp_filename(0); gchar *argv[] = { "oggdec", "--quiet", "-o", tempname, filename, NULL }; Chunk *c; c = run_decoder(filename,tempname,"oggdec",argv,dither_mode,bar); g_free(tempname); return c; } static gboolean ogg_save(Chunk *chunk, gchar *filename, gpointer settings, struct file_type *type, int dither_mode, StatusBar *bar, gboolean *fatal) { Chunk *x=NULL,*y; Dataformat fmt; gchar *c,*d; gboolean b; off_t clipcount = 0; xunlink(filename); d = g_strdup_printf("OUTFILE=%s",filename); if (xputenv(d)) { g_free(d); return TRUE; } if (chunk->format.type == DATAFORMAT_FLOAT) { memcpy(&fmt,&(chunk->format),sizeof(Dataformat)); fmt.type = DATAFORMAT_PCM; fmt.samplesize = 4; fmt.packing = 0; fmt.samplebytes = fmt.samplesize * fmt.channels; x = chunk_convert_sampletype(chunk,&fmt); g_assert(x != NULL); } y = (x==NULL) ? chunk : x; c = g_strdup_printf("oggenc --raw -B %d -C %d -R %d --raw-endianness %d " "--quiet -o \"$OUTFILE\" -", y->format.samplesize*8, y->format.channels, y->format.samplerate, y->format.bigendian?1:0); b = pipe_dialog_send_chunk(y,c,FALSE,dither_mode,bar,&clipcount); g_free(c); if (x != NULL) gtk_object_sink(GTK_OBJECT(x)); if (!xunsetenv("OUTFILE")) g_free(d); if (b || !file_exists(filename)) { *fatal = TRUE; return -1; } return clipwarn(clipcount,TRUE); } static struct { Combo *type_combo, *subtype_combo; GtkEntry *arg_entry; GtkToggleButton *set_default; gboolean ok_flag, destroyed_flag; GList *preset_list, *bitrate_list; } mp3_get_settings_data; static void set_flag(gboolean *flag) { *flag = TRUE; } static void mp3_get_settings_type_changed(Combo *obj, gpointer user_data) { int i; i = combo_selected_index(obj); gtk_widget_set_sensitive(GTK_WIDGET(mp3_get_settings_data.subtype_combo), (i<3)); gtk_widget_set_sensitive(GTK_WIDGET(mp3_get_settings_data.arg_entry), (i==3)); if (i == 0) combo_set_items(mp3_get_settings_data.subtype_combo, mp3_get_settings_data.preset_list, 0); else if (i < 3) combo_set_items(mp3_get_settings_data.subtype_combo, mp3_get_settings_data.bitrate_list, 5); } static gpointer mp3_get_settings(void) { gchar *type_strings[] = { "vbr_preset", "abr_preset", "cbr_preset", "custom" }; gchar *type_names[] = { _("Variable bitrate (default)"), _("Average bitrate"), _("Constant bitrate"), _("Custom argument") }; gchar *bitrate_strings[] = { "80", "96", "112", "128", "160", "192", "224", "256", "320" }; gchar *vbr_preset_strings[] = { "standard", "extreme", "insane" }; gchar *vbr_preset_names[] = { _("Standard (high quality)"), _("Extreme (higher quality)"), _("Insane (highest possible quality)") }; int type; /* 0 = VBR preset, 1 = ABR preset, 2 = CBR preset, 3 = custom */ int subtype = 0; gchar *custom_arg = NULL; GList *l; GtkWidget *a,*b,*c,*d; gchar *p; int i,j; /* Setup lists */ for (l=NULL, i=0; itype == DATAFORMAT_FLOAT) return FALSE; return (XOR(fmt->samplesize == 1, fmt->sign) && fmt->packing == 0); } static gint mp3_save(Chunk *chunk, gchar *filename, gpointer settings, struct file_type *type, int dither_mode, StatusBar *bar, gboolean *fatal) { Chunk *x; Dataformat fmt; gchar *c; gboolean b; off_t clipcount = 0; xunlink(filename); c = g_strdup_printf("OUTFILE=%s",filename); if (xputenv(c)) { g_free(c); return -1; } c = g_strdup_printf("LAMEFLAGS=%s",(settings == NULL) ? "--preset standard" : (gchar *)settings); if (xputenv(c)) { g_free(c); return -1; } if (wav_regular_format(&(chunk->format))) b = pipe_dialog_send_chunk(chunk, "lame --silent $LAMEFLAGS - " "\"$OUTFILE\"",TRUE,dither_mode,bar, &clipcount); else { memcpy(&fmt,&(chunk->format),sizeof(Dataformat)); if (fmt.type == DATAFORMAT_FLOAT || fmt.samplesize == 3 || fmt.packing!=0) { fmt.type = DATAFORMAT_PCM; fmt.samplesize = 4; fmt.packing = 0; } fmt.sign = (fmt.samplesize > 1); fmt.bigendian = FALSE; fmt.samplebytes = fmt.samplesize * fmt.channels; x = chunk_convert_sampletype(chunk,&fmt); if (x == NULL) b=TRUE; else { b = pipe_dialog_send_chunk(x, "lame --silent --preset standard - " "\"$OUTFILE\"",TRUE,dither_mode,bar, &clipcount); gtk_object_sink(GTK_OBJECT(x)); } } if (!xunsetenv("OUTFILE")) g_free(c); if (b || !file_exists(filename)) { *fatal = TRUE; return -1; } return clipwarn(clipcount,TRUE); } /* Mplayer */ static Chunk *try_mplayer(gchar *filename, int dither_mode, StatusBar *bar) { gchar *c,*d; char *tempname; Chunk *x; char *argv[] = { "sh", "-c", "mplayer -quiet -noconsolecontrols " "-ao \"pcm:file=$OUTFILE\" -vc dummy -vo null " "\"$INFILE\"", NULL }; if (!program_exists("mplayer")) return NULL; tempname = get_temp_filename(0); c = g_strdup_printf("OUTFILE=%s",tempname); d = g_strdup_printf("INFILE=%s",filename); if (xputenv(c)) { g_free(d); g_free(c); g_free(tempname); return NULL; } if (xputenv(d)) { g_free(d); if (!xunsetenv("OUTFILE")) g_free(c); g_free(tempname); return NULL; } x = run_decoder(filename,tempname,"sh",argv,dither_mode,bar); if (!xunsetenv("OUTFILE")) g_free(c); if (!xunsetenv("INFILE")) g_free(d); g_free(tempname); return x; } mhwaveedit-1.4.24/src/filetypes.h000066400000000000000000000037541334022513400167110ustar00rootroot00000000000000/* * Copyright (C) 2002 2003 2004 2005 2006 2012, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ /* This module contains functions for loading and saving files. Most of it is * taken from the old chunk.c code. */ #ifndef FILETYPES_H_INCLUDED #define FILETYPES_H_INCLUDED #include "chunk.h" #include "statusbar.h" /* Returns the number of file formats supported. All numbers below this count * can be used as the fileformat parameter for the other functions. */ guint fileformat_count(void); /* Returns the name or default extension for a certain file format. */ gchar *fileformat_name(guint fileformat); gchar *fileformat_extension(guint fileformat); gboolean fileformat_has_options(guint fileformat); /* Indicate if libsndfile has ogg support */ gboolean sndfile_ogg_supported(); /* Loads a document from a specified file. */ Chunk *chunk_load(gchar *filename, int dither_mode, StatusBar *bar); Chunk *chunk_load_x(gchar *filename, int dither_mode, StatusBar *bar, gboolean *lossy); /* Saves the contents of a chunk into a new file. The file format is determined * from the extension or asked at run time. */ gboolean chunk_save(Chunk *chunk, gchar *filename, int filetype, gboolean user_default_settings, int dither_mode, StatusBar *bar); #endif mhwaveedit-1.4.24/src/float_box.c000066400000000000000000000146301334022513400166500ustar00rootroot00000000000000/* * Copyright (C) 2002 2003 2004 2005 2011, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include #include #include #include "um.h" #include "float_box.h" #include "main.h" #include "gettext.h" #if GTK_MAJOR_VERSION==2 static GtkEntryClass *parent_class; #else static GtkEditableClass *parent_class; #endif enum { NUMCHANGED_SIGNAL, LAST_SIGNAL }; #if GTK_MAJOR_VERSION == 2 #include "float_box_marsh.c" #define gtk_marshal_NONE__FLOAT gtk_marshal_VOID__FLOAT #else typedef void (*GtkSignal_NONE__FLOAT) (GtkObject *object, gfloat arg, gpointer user_data); static void gtk_marshal_NONE__FLOAT(GtkObject *object, GtkSignalFunc func, gpointer func_data, GtkArg *args) { GtkSignal_NONE__FLOAT rfunc; rfunc=(GtkSignal_NONE__FLOAT)func; rfunc(object,GTK_VALUE_FLOAT(args[0]),func_data); } #endif static guint floatbox_signals[LAST_SIGNAL] = { 0 }; static void floatbox_update_text(Floatbox *box) { char e[30]; format_float(box->val, e, sizeof(e)); gtk_entry_set_text(GTK_ENTRY(box),e); } #if GTK_MAJOR_VERSION==2 static void floatbox_activate(GtkEntry *editable) #else static void floatbox_activate(GtkEditable *editable) #endif { float f; char *c,*d; c=(char *)gtk_entry_get_text(GTK_ENTRY(editable)); f=strtod(c,&d); if (*d==0) floatbox_set(FLOATBOX(editable),f); else floatbox_update_text(FLOATBOX(editable)); if (parent_class->activate) parent_class->activate(editable); } static gint floatbox_focus_out(GtkWidget *widget, GdkEventFocus *event) { char *c,*d; float f; Floatbox *b = FLOATBOX(widget); c=(char *)gtk_entry_get_text(GTK_ENTRY(widget)); f=strtod(c,&d); if (*d==0 && b->adj!=NULL && f>=gtk_adjustment_get_lower(b->adj) && f<=gtk_adjustment_get_upper(b->adj)) { gtk_adjustment_set_value(b->adj,f); } return GTK_WIDGET_CLASS(parent_class)->focus_out_event(widget,event); } static void floatbox_class_init(FloatboxClass *klass) { parent_class = gtk_type_class(gtk_entry_get_type()); #if GTK_MAJOR_VERSION==2 GTK_ENTRY_CLASS(klass)->activate = floatbox_activate; #else GTK_EDITABLE_CLASS(klass)->activate = floatbox_activate; #endif GTK_WIDGET_CLASS(klass)->focus_out_event = floatbox_focus_out; klass->numchange=NULL; floatbox_signals[NUMCHANGED_SIGNAL] = gtk_signal_new("numchanged",GTK_RUN_FIRST, GTK_CLASS_TYPE(klass), GTK_SIGNAL_OFFSET(FloatboxClass,numchange), gtk_marshal_NONE__FLOAT,GTK_TYPE_NONE,1, GTK_TYPE_FLOAT); gtk_object_class_add_signals(GTK_OBJECT_CLASS(klass),floatbox_signals, LAST_SIGNAL); } static void floatbox_init(Floatbox *fbox) { #if GTK_MAJOR_VERSION == 2 gtk_entry_set_width_chars(GTK_ENTRY(fbox),10); #else GtkRequisition req; gtk_widget_size_request(GTK_WIDGET(fbox),&req); gtk_widget_set_usize(GTK_WIDGET(fbox),req.width/3,req.height); #endif fbox->adj = NULL; } GtkType floatbox_get_type(void) { static GtkType id=0; if (!id) { GtkTypeInfo info = { "Floatbox", sizeof(Floatbox), sizeof(FloatboxClass), (GtkClassInitFunc) floatbox_class_init, (GtkObjectInitFunc) floatbox_init }; id=gtk_type_unique(gtk_entry_get_type(),&info); } return id; } void floatbox_set(Floatbox *box, float val) { if (box->val == val) return; if (box->adj != NULL && val >= gtk_adjustment_get_lower(box->adj) && val <= gtk_adjustment_get_upper(box->adj)) { gtk_adjustment_set_value(box->adj, val); return; } box->val=val; floatbox_update_text(box); gtk_signal_emit(GTK_OBJECT(box),floatbox_signals[NUMCHANGED_SIGNAL],box->val); } GtkWidget *floatbox_new(float val) { Floatbox *box; box=gtk_type_new(floatbox_get_type()); box->val = val-1.0; /* To force update */ floatbox_set(box,val); return GTK_WIDGET(box); } gboolean floatbox_check(Floatbox *box) { gfloat f; char *c,*d; c=(char *)gtk_entry_get_text(GTK_ENTRY(box)); f=strtod(c,&d); if (*d==0) { floatbox_set(box,f); return FALSE; } else { d = g_strdup_printf(_("'%s' is not a number!"),c); user_error(d); g_free(d); return TRUE; } } gboolean floatbox_check_limit(Floatbox *box, float lowest, float highest, gchar *valuename) { gfloat f; char *c,*d; c=(char *)gtk_entry_get_text(GTK_ENTRY(box)); f=strtod(c,&d); if (*d==0 && f >= lowest && f <= highest) { floatbox_set(box,f); return FALSE; } else { d = g_strdup_printf(_("Value for '%s' must be a number between %f and " "%f"),valuename,lowest,highest); user_error(d); g_free(d); return TRUE; } } static void floatbox_adj_changed(GtkAdjustment *adjustment, gpointer user_data) { Floatbox *box = FLOATBOX(user_data); box->val = box->adj->value; floatbox_update_text(box); gtk_signal_emit(GTK_OBJECT(box),floatbox_signals[NUMCHANGED_SIGNAL], box->val); } GtkWidget *floatbox_create_scale(Floatbox *box, float minval, float maxval) { GtkWidget *w; #if GTK_MAJOR_VERSION > 1 GtkRequisition req; #endif if (box->adj == NULL) { box->adj = GTK_ADJUSTMENT(gtk_adjustment_new(minval,minval, maxval+ (maxval-minval)/10.0, (maxval-minval)/100.0, (maxval-minval)/4.0, (maxval-minval)/10.0)); gtk_signal_connect(GTK_OBJECT(box->adj),"value_changed", GTK_SIGNAL_FUNC(floatbox_adj_changed),box); gtk_adjustment_set_value(box->adj,box->val); } w = gtk_hscale_new(box->adj); #if GTK_MAJOR_VERSION > 1 gtk_widget_size_request(w,&req); gtk_widget_set_usize(w,req.width*5,req.height); #endif return w; } mhwaveedit-1.4.24/src/float_box.h000066400000000000000000000032651334022513400166570ustar00rootroot00000000000000/* * Copyright (C) 2002 2003 2005, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #ifndef FLOATBOX_H_INCLUDED #define FLOATBOX_H_INCLUDED #define FLOATBOX(obj) GTK_CHECK_CAST (obj, floatbox_get_type(), Floatbox) #define FLOATBOX_CLASS(class) GTK_CHECK_CLASS_CAST(class,floatbox_get_type(),FloatboxClass) #define IS_FLOATBOX(obj) GTK_CHECK_TYPE (obj,floatbox_get_type()) typedef struct _Floatbox Floatbox; typedef struct _FloatboxClass FloatboxClass; struct _Floatbox { GtkEntry parent; float val; GtkAdjustment *adj; }; struct _FloatboxClass { GtkEntryClass parent; void (*numchange)(Floatbox *, float); }; GtkType floatbox_get_type(void); GtkWidget *floatbox_new(float value); GtkWidget *floatbox_create_scale(Floatbox *box, float minval, float maxval); void floatbox_set(Floatbox *box, float value); gboolean floatbox_check(Floatbox *box); gboolean floatbox_check_limit(Floatbox *box, float lowest, float highest, gchar *valuename); #endif mhwaveedit-1.4.24/src/float_box_marsh.c000066400000000000000000000071411334022513400200410ustar00rootroot00000000000000 #ifdef G_ENABLE_DEBUG #define g_marshal_value_peek_boolean(v) g_value_get_boolean (v) #define g_marshal_value_peek_char(v) g_value_get_char (v) #define g_marshal_value_peek_uchar(v) g_value_get_uchar (v) #define g_marshal_value_peek_int(v) g_value_get_int (v) #define g_marshal_value_peek_uint(v) g_value_get_uint (v) #define g_marshal_value_peek_long(v) g_value_get_long (v) #define g_marshal_value_peek_ulong(v) g_value_get_ulong (v) #define g_marshal_value_peek_int64(v) g_value_get_int64 (v) #define g_marshal_value_peek_uint64(v) g_value_get_uint64 (v) #define g_marshal_value_peek_enum(v) g_value_get_enum (v) #define g_marshal_value_peek_flags(v) g_value_get_flags (v) #define g_marshal_value_peek_float(v) g_value_get_float (v) #define g_marshal_value_peek_double(v) g_value_get_double (v) #define g_marshal_value_peek_string(v) (char*) g_value_get_string (v) #define g_marshal_value_peek_param(v) g_value_get_param (v) #define g_marshal_value_peek_boxed(v) g_value_get_boxed (v) #define g_marshal_value_peek_pointer(v) g_value_get_pointer (v) #define g_marshal_value_peek_object(v) g_value_get_object (v) #else /* !G_ENABLE_DEBUG */ /* WARNING: This code accesses GValues directly, which is UNSUPPORTED API. * Do not access GValues directly in your code. Instead, use the * g_value_get_*() functions */ #define g_marshal_value_peek_boolean(v) (v)->data[0].v_int #define g_marshal_value_peek_char(v) (v)->data[0].v_int #define g_marshal_value_peek_uchar(v) (v)->data[0].v_uint #define g_marshal_value_peek_int(v) (v)->data[0].v_int #define g_marshal_value_peek_uint(v) (v)->data[0].v_uint #define g_marshal_value_peek_long(v) (v)->data[0].v_long #define g_marshal_value_peek_ulong(v) (v)->data[0].v_ulong #define g_marshal_value_peek_int64(v) (v)->data[0].v_int64 #define g_marshal_value_peek_uint64(v) (v)->data[0].v_uint64 #define g_marshal_value_peek_enum(v) (v)->data[0].v_int #define g_marshal_value_peek_flags(v) (v)->data[0].v_uint #define g_marshal_value_peek_float(v) (v)->data[0].v_float #define g_marshal_value_peek_double(v) (v)->data[0].v_double #define g_marshal_value_peek_string(v) (v)->data[0].v_pointer #define g_marshal_value_peek_param(v) (v)->data[0].v_pointer #define g_marshal_value_peek_boxed(v) (v)->data[0].v_pointer #define g_marshal_value_peek_pointer(v) (v)->data[0].v_pointer #define g_marshal_value_peek_object(v) (v)->data[0].v_pointer #endif /* !G_ENABLE_DEBUG */ /* VOID:FLOAT (marsh.txt:2) */ void gtk_marshal_VOID__FLOAT (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data) { typedef void (*GMarshalFunc_VOID__FLOAT) (gpointer data1, gfloat arg_1, gpointer data2); register GMarshalFunc_VOID__FLOAT callback; register GCClosure *cc = (GCClosure*) closure; register gpointer data1, data2; g_return_if_fail (n_param_values == 2); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_VOID__FLOAT) (marshal_data ? marshal_data : cc->callback); callback (data1, g_marshal_value_peek_float (param_values + 1), data2); } mhwaveedit-1.4.24/src/formatselector.c000066400000000000000000000165441334022513400177320ustar00rootroot00000000000000/* * Copyright (C) 2002 2003 2004 2005 2010 2012, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include #include "main.h" #include "formatselector.h" #include "inifile.h" #include "gettext.h" #define DEFAULT_CHANS 2 #define DEFAULT_RATE 44100 static void format_selector_class_init(GtkObjectClass *klass) { } static void samplesize_changed(Combo *obj, gpointer user_data) { int i; FormatSelector *fs = FORMAT_SELECTOR(user_data); i = combo_selected_index(obj); gtk_widget_set_sensitive(GTK_WIDGET(fs->sign_combo),(i<4)); gtk_widget_set_sensitive(GTK_WIDGET(fs->packing_combo),(i==2)); if (i == 0) combo_set_selection(fs->sign_combo,0); else if (i < 4) combo_set_selection(fs->sign_combo,1); else combo_set_selection(fs->endian_combo, dataformat_sample_t.bigendian?1:0); } static void format_selector_init(GtkWidget *widget) { GtkWidget *a=widget,*b; FormatSelector *fs = FORMAT_SELECTOR(widget); GList *l; gtk_table_set_row_spacings(GTK_TABLE(widget),3); gtk_table_set_col_spacings(GTK_TABLE(widget),4); attach_label(_("Sample type: "),widget,1,0); b = combo_new(); l = g_list_append(NULL,_("8 bit PCM")); l = g_list_append(l, _("16 bit PCM")); l = g_list_append(l, _("24 bit PCM")); l = g_list_append(l, _("32 bit PCM")); l = g_list_append(l, _("Floating-point, single")); l = g_list_append(l, _("Floating-point, double")); combo_set_items(COMBO(b),l,0); g_list_free(l); fs->samplesize_combo = COMBO(b); gtk_signal_connect(GTK_OBJECT(b),"selection_changed", GTK_SIGNAL_FUNC(samplesize_changed),fs); gtk_table_attach(GTK_TABLE(a),b,1,2,1,2,GTK_FILL,0,0,0); attach_label(_("Signedness: "),a,2,0); b = combo_new(); l = g_list_append(NULL, _("Unsigned")); l = g_list_append(l, _("Signed")); combo_set_items(COMBO(b),l,0); g_list_free(l); fs->sign_combo = COMBO(b); gtk_table_attach(GTK_TABLE(a),b,1,2,2,3,GTK_FILL,0,0,0); attach_label(_("Endianness: "),a,3,0); b = combo_new(); l = g_list_append(NULL,_("Little endian")); l = g_list_append(l,_("Big endian")); combo_set_items(COMBO(b),l,0); g_list_free(l); fs->endian_combo = COMBO(b); gtk_table_attach(GTK_TABLE(a),b,1,2,3,4,GTK_FILL,0,0,0); attach_label(_("Alignment:"),a,4,0); b = combo_new(); l = g_list_append(NULL,_("Packed")); l = g_list_append(l, _("Top bytes")); l = g_list_append(l, _("Bottom bytes")); combo_set_items(COMBO(b),l,0); g_list_free(l); fs->packing_combo = COMBO(b); gtk_widget_set_sensitive(b, FALSE); gtk_table_attach(GTK_TABLE(a),b,1,2,4,5,GTK_FILL,0,0,0); fs->channel_combo = NULL; fs->rate_box = NULL; gtk_widget_show_all(widget); gtk_widget_hide(widget); } GtkType format_selector_get_type(void) { static GtkType id = 0; if (!id) { GtkTypeInfo info = { "FormatSelector", sizeof(FormatSelector), sizeof(FormatSelectorClass), (GtkClassInitFunc) format_selector_class_init, (GtkObjectInitFunc) format_selector_init }; id = gtk_type_unique(gtk_table_get_type(),&info); } return id; } /* Show channel and sample rate items */ static void format_selector_show_full(FormatSelector *fs) { GList *l=NULL; GtkWidget *a=GTK_WIDGET(fs),*b,*c; guint i; attach_label(_("Channels: "),a,0,0); b = combo_new(); for (i=1; i<9; i++) l=g_list_append(l,g_strdup(channel_format_name(i))); combo_set_items(COMBO(b),l,DEFAULT_CHANS-1); g_list_foreach(l,(GFunc)g_free,NULL); g_list_free(l); gtk_table_attach(GTK_TABLE(fs),b,1,2,0,1,GTK_FILL,0,0,0); fs->channel_combo = COMBO(b); gtk_widget_show(b); attach_label(_("Sample rate: "),a,5,0); b = gtk_alignment_new(0.0,0.5,0.0,1.0); gtk_table_attach(GTK_TABLE(fs),b,1,2,5,6,GTK_FILL,0,0,0); gtk_widget_show(b); c = intbox_new(DEFAULT_RATE); fs->rate_box = INTBOX(c); gtk_container_add(GTK_CONTAINER(b),c); gtk_widget_show(c); } GtkWidget *format_selector_new(gboolean show_full) { GtkWidget *fs = gtk_type_new(format_selector_get_type()); if (show_full) format_selector_show_full(FORMAT_SELECTOR(fs)); return fs; } void format_selector_set(FormatSelector *fs, Dataformat *fmt) { if (fmt->type == DATAFORMAT_PCM) { if (fmt->samplesize == 4 && fmt->packing != 0) { combo_set_selection(fs->samplesize_combo, 2); combo_set_selection(fs->packing_combo, fmt->packing); } else combo_set_selection(fs->samplesize_combo, fmt->samplesize-1); combo_set_selection(fs->sign_combo, fmt->sign?1:0); } else { if (fmt->samplesize == sizeof(float)) combo_set_selection(fs->samplesize_combo, 4); else combo_set_selection(fs->samplesize_combo, 5); } combo_set_selection(fs->endian_combo, fmt->bigendian?1:0); if (fs->channel_combo != NULL) combo_set_selection(fs->channel_combo, fmt->channels-1); if (fs->rate_box != NULL) intbox_set(fs->rate_box, fmt->samplerate); } void format_selector_get(FormatSelector *fs, Dataformat *result) { int i; i = combo_selected_index(fs->samplesize_combo); if (i<4) { result->type = DATAFORMAT_PCM; if (i == 2) { result->packing = combo_selected_index(fs->packing_combo); result->samplesize = (result->packing != 0)?4:3; } else { result->samplesize = i+1; result->packing = 0; } } else { result->type = DATAFORMAT_FLOAT; result->samplesize = (i>4)?sizeof(double):sizeof(float); } result->sign = combo_selected_index(fs->sign_combo); result->bigendian = combo_selected_index(fs->endian_combo); if (fs->channel_combo != NULL) result->channels = combo_selected_index(fs->channel_combo)+1; else result->channels = DEFAULT_CHANS; if (fs->rate_box != NULL) { intbox_check(fs->rate_box); result->samplerate = fs->rate_box->val; } else result->samplerate = DEFAULT_RATE; result->samplebytes = result->samplesize * result->channels; } void format_selector_set_from_inifile(FormatSelector *fs, gchar *ini_prefix) { Dataformat fmt; if (dataformat_get_from_inifile(ini_prefix,fs->channel_combo!=NULL,&fmt)) format_selector_set(fs,&fmt); } void format_selector_save_to_inifile(FormatSelector *fs, gchar *ini_prefix) { Dataformat f; format_selector_get(fs,&f); dataformat_save_to_inifile(ini_prefix,&f,fs->channel_combo!=NULL); } gboolean format_selector_check(FormatSelector *fs) { if (fs->rate_box != NULL) return intbox_check_limit(fs->rate_box,1000,500000,_("sample rate")); else return FALSE; } mhwaveedit-1.4.24/src/formatselector.h000066400000000000000000000036441334022513400177340ustar00rootroot00000000000000/* * Copyright (C) 2002 2003 2005 2012, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #ifndef FORMATSELECTOR_H_INCLUDED #define FORMATSELECTOR_H_INCLUDED #include #include "combo.h" #include "dataformat.h" #include "int_box.h" #define FORMAT_SELECTOR(obj) GTK_CHECK_CAST(obj,format_selector_get_type(),FormatSelector) #define FORMAT_SELECTOR_CLASS(klass) GTK_CHECK_CLASS_CAST(klass,format_selector_get_type(),FormatSelectorClass) #define IS_FORMAT_SELECTOR(obj) GTK_CHECK_TYPE(obj,format_selector_get_type()) typedef struct { GtkTable table; Combo *samplesize_combo,*sign_combo,*endian_combo,*packing_combo; Combo *channel_combo; Intbox *rate_box; } FormatSelector; typedef struct { GtkTableClass table_class; } FormatSelectorClass; GtkType format_selector_get_type(void); GtkWidget *format_selector_new(gboolean show_full); void format_selector_set(FormatSelector *fs, Dataformat *format); void format_selector_get(FormatSelector *fs, Dataformat *result); void format_selector_set_from_inifile(FormatSelector *fs, gchar *ini_prefix); void format_selector_save_to_inifile(FormatSelector *fs, gchar *ini_prefix); gboolean format_selector_check(FormatSelector *fs); #endif mhwaveedit-1.4.24/src/gettext.h000066400000000000000000000060021334022513400163560ustar00rootroot00000000000000/* Convenience header for conditional use of GNU . Copyright (C) 1995-1998, 2000-2002 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, 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 Library General Public License for more details. You should have received a copy of the GNU Library 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. */ #ifndef _LIBGETTEXT_H #define _LIBGETTEXT_H 1 /* NLS can be disabled through the configure --disable-nls option. */ #if ENABLE_NLS /* Get declarations of GNU message catalog functions. */ # include #else /* Solaris /usr/include/locale.h includes /usr/include/libintl.h, which chokes if dcgettext is defined as a macro. So include it now, to make later inclusions of a NOP. We don't include as well because people using "gettext.h" will not include , and also including would fail on SunOS 4, whereas is OK. */ #if defined(__sun) # include #endif /* Disabled NLS. The casts to 'const char *' serve the purpose of producing warnings for invalid uses of the value returned from these functions. On pre-ANSI systems without 'const', the config.h file is supposed to contain "#define const". */ # define gettext(Msgid) ((const char *) (Msgid)) # define dgettext(Domainname, Msgid) ((const char *) (Msgid)) # define dcgettext(Domainname, Msgid, Category) ((const char *) (Msgid)) # define ngettext(Msgid1, Msgid2, N) \ ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2)) # define dngettext(Domainname, Msgid1, Msgid2, N) \ ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2)) # define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \ ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2)) # define textdomain(Domainname) ((const char *) (Domainname)) # define bindtextdomain(Domainname, Dirname) ((const char *) (Dirname)) # define bind_textdomain_codeset(Domainname, Codeset) ((const char *) (Codeset)) #endif /* A pseudo function call that serves as a marker for the automated extraction of messages, but does not call gettext(). The run-time translation is done at a different place in the code. The argument, String, should be a literal string. Concatenated strings and other string expressions won't work. The macro's expansion is not parenthesized, so that it is suitable as initializer for static 'char[]' or 'const char[]' variables. */ #define N_(String) String #define _(String) gettext(String) #endif /* _LIBGETTEXT_H */ mhwaveedit-1.4.24/src/gotodialog.c000066400000000000000000000156351334022513400170310ustar00rootroot00000000000000/* * Copyright (C) 2003 2004 2006 2011, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include #include #include "gotodialog.h" #include "inifile.h" #include "main.h" #include "gettext.h" static gboolean goto_dialog_apply(GotoDialog *gd) { off_t p=0,q; float f; Document *d = gd->mw->doc; int i, j; if (d == NULL) return FALSE; if (floatbox_check(gd->offset)) return TRUE; for (i=0; i<5; i++) if (gtk_toggle_button_get_active(gd->relbuttons[i])) break; switch (i) { case GOTO_DIALOG_POS_AFTER_BEG_FILE: p = 0; break; case GOTO_DIALOG_POS_AFTER_END_FILE: p = d->chunk->length; break; case GOTO_DIALOG_POS_AFTER_CURSOR: p = d->cursorpos; break; case GOTO_DIALOG_POS_AFTER_BEG_SEL: p = (d->selstart==d->selend)?0:d->selstart; break; case GOTO_DIALOG_POS_AFTER_END_SEL: p = (d->selstart==d->selend)?d->chunk->length:d->selend; break; default: g_assert_not_reached(); } for (j=0; j<2; j++) if (gtk_toggle_button_get_active(gd->unitbuttons[j])) break; f = gd->offset->val; if (j == GOTO_DIALOG_UNIT_SECONDS) f *= ((float)(d->chunk->format.samplerate)); q = p+(off_t)f; if(q > d->chunk->length) { q = d->chunk->length; } else if(q < 0) { q = 0; } document_set_cursor(d,q); inifile_set_gfloat("gotoOffset",gd->offset->val); inifile_set_guint32("gotoRel",i); inifile_set_guint32("gotoUnits",j); return FALSE; } static void goto_dialog_ok(GtkButton *button, GotoDialog *gd) { if (!goto_dialog_apply(gd)) gtk_widget_destroy(GTK_WIDGET(gd)); } static void goto_dialog_init(GotoDialog *gd) { GtkWidget *a,*b,*c; guint32 i; GtkAccelGroup* ag; ag = gtk_accel_group_new(); a = gtk_vbox_new(FALSE,0); gtk_container_set_border_width(GTK_CONTAINER(a),8); gtk_container_add(GTK_CONTAINER(gd),a); b = gtk_hbox_new(FALSE,5); gtk_box_pack_start(GTK_BOX(a),b,FALSE,FALSE,3); c = gtk_label_new(_("Place cursor ")); gtk_box_pack_start(GTK_BOX(b),c,FALSE,FALSE,0); c = floatbox_new(inifile_get_gfloat("gotoOffset",0.0)); gd->offset = FLOATBOX(c); gtk_box_pack_start(GTK_BOX(b),c,FALSE,FALSE,0); c = gtk_radio_button_new_with_label(NULL, _("seconds")); gd->unitbuttons[GOTO_DIALOG_UNIT_SECONDS] = GTK_TOGGLE_BUTTON(c); gtk_box_pack_start(GTK_BOX(b),c,FALSE,FALSE,0); c = gtk_radio_button_new_with_label_from_widget( GTK_RADIO_BUTTON(c), _("samples")); gd->unitbuttons[GOTO_DIALOG_UNIT_SAMPLES] = GTK_TOGGLE_BUTTON(c); gtk_box_pack_start(GTK_BOX(b),c,FALSE,FALSE,0); b = gtk_radio_button_new_with_label(NULL,_("after beginning of file")); gd->relbuttons[GOTO_DIALOG_POS_AFTER_BEG_FILE] = GTK_TOGGLE_BUTTON(b); gtk_box_pack_start(GTK_BOX(a),b,FALSE,FALSE,0); b = gtk_radio_button_new_with_label_from_widget( GTK_RADIO_BUTTON(b),_("after end of file")); gd->relbuttons[GOTO_DIALOG_POS_AFTER_END_FILE] = GTK_TOGGLE_BUTTON(b); gtk_box_pack_start(GTK_BOX(a),b,FALSE,FALSE,0); b = gtk_radio_button_new_with_label_from_widget( GTK_RADIO_BUTTON(b),_("after current cursor position")); gd->relbuttons[GOTO_DIALOG_POS_AFTER_CURSOR] = GTK_TOGGLE_BUTTON(b); gtk_box_pack_start(GTK_BOX(a),b,FALSE,FALSE,0); b = gtk_radio_button_new_with_label_from_widget( GTK_RADIO_BUTTON(b),_("after selection start")); gd->relbuttons[GOTO_DIALOG_POS_AFTER_BEG_SEL] = GTK_TOGGLE_BUTTON(b); gtk_box_pack_start(GTK_BOX(a),b,FALSE,FALSE,0); b = gtk_radio_button_new_with_label_from_widget( GTK_RADIO_BUTTON(b),_("after selection end")); gd->relbuttons[GOTO_DIALOG_POS_AFTER_END_SEL] = GTK_TOGGLE_BUTTON(b); gtk_box_pack_start(GTK_BOX(a),b,FALSE,FALSE,0); b = gtk_label_new(_("(use a negative number to place the cursor before " "instead of after the selected point)")); gtk_label_set_justify(GTK_LABEL(b),GTK_JUSTIFY_LEFT); gtk_label_set_line_wrap(GTK_LABEL(b),TRUE); gtk_box_pack_start(GTK_BOX(a),b,FALSE,FALSE,0); b = gtk_hbutton_box_new(); gtk_box_pack_end(GTK_BOX(a),b,FALSE,FALSE,0); c = gtk_button_new_with_label(_("OK")); gtk_signal_connect(GTK_OBJECT(c),"clicked", GTK_SIGNAL_FUNC(goto_dialog_ok),gd); gtk_container_add(GTK_CONTAINER(b),c); gtk_widget_add_accelerator (c, "clicked", ag, GDK_KP_Enter, 0, (GtkAccelFlags) 0); gtk_widget_add_accelerator (c, "clicked", ag, GDK_Return, 0, (GtkAccelFlags) 0); c = gtk_button_new_with_label(_("Apply")); gtk_signal_connect_object(GTK_OBJECT(c),"clicked", GTK_SIGNAL_FUNC(goto_dialog_apply), GTK_OBJECT(gd)); gtk_container_add(GTK_CONTAINER(b),c); c = gtk_button_new_with_label(_("Close")); gtk_signal_connect_object(GTK_OBJECT(c),"clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy), GTK_OBJECT(gd)); gtk_container_add(GTK_CONTAINER(b),c); gtk_widget_add_accelerator (c, "clicked", ag, GDK_Escape, 0, (GtkAccelFlags) 0); b = gtk_hseparator_new(); gtk_box_pack_end(GTK_BOX(a),b,FALSE,FALSE,0); i = inifile_get_guint32("gotoRel",0); if (i>4) i=0; gtk_toggle_button_set_active(gd->relbuttons[i],TRUE); i = inifile_get_guint32("gotoUnits",0); if (i>2) i=0; gtk_toggle_button_set_active(gd->unitbuttons[i],TRUE); gtk_widget_show_all(a); gtk_window_set_title(GTK_WINDOW(gd),_("Position cursor")); gtk_window_add_accel_group(GTK_WINDOW (gd), ag); gtk_window_set_position (GTK_WINDOW (gd), GTK_WIN_POS_CENTER); } static void goto_dialog_class_init(GtkObjectClass *klass) { } GtkType goto_dialog_get_type(void) { static GtkType id = 0; if (!id) { GtkTypeInfo info = { "GotoDialog", sizeof(GotoDialog), sizeof(GotoDialogClass), (GtkClassInitFunc) goto_dialog_class_init, (GtkObjectInitFunc) goto_dialog_init }; id = gtk_type_unique(gtk_window_get_type(),&info); } return id; } GtkWidget *goto_dialog_new(Mainwindow *mw) { GtkWidget *w; w = gtk_type_new(goto_dialog_get_type()); GOTO_DIALOG(w)->mw = mw; return w; } mhwaveedit-1.4.24/src/gotodialog.h000066400000000000000000000034431334022513400170300ustar00rootroot00000000000000/* * Copyright (C) 2003 2006 2011, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #ifndef GOTODIALOG_H_INCLUDED #define GOTODIALOG_H_INCLUDED #include #include "float_box.h" #include "mainwindow.h" #define GOTO_DIALOG(obj) GTK_CHECK_CAST(obj,goto_dialog_get_type(),GotoDialog) #define GOTO_DIALOG_CLASS(klass) GTK_CHECK_CLASS_CAST(klass,goto_dialog_get_type(),GotoDialogClass) #define IS_GOTO_DIALOG(obj) GTK_CHECK_TYPE(obj,goto_dialog_get_type()) #define GOTO_DIALOG_POS_AFTER_BEG_FILE 0 #define GOTO_DIALOG_POS_AFTER_END_FILE 1 #define GOTO_DIALOG_POS_AFTER_CURSOR 2 #define GOTO_DIALOG_POS_AFTER_BEG_SEL 3 #define GOTO_DIALOG_POS_AFTER_END_SEL 4 #define GOTO_DIALOG_UNIT_SECONDS 0 #define GOTO_DIALOG_UNIT_SAMPLES 1 typedef struct _GotoDialog { GtkWindow parent; Mainwindow *mw; Floatbox *offset; GtkToggleButton *relbuttons[5]; GtkToggleButton *unitbuttons[2]; } GotoDialog; typedef struct _GotoDialogClass { GtkWindowClass edc; } GotoDialogClass; GtkType goto_dialog_get_type(void); GtkWidget *goto_dialog_new(Mainwindow *mw); #endif mhwaveedit-1.4.24/src/gtkfiles.c000066400000000000000000000526001334022513400165020ustar00rootroot00000000000000/* * Copyright (C) 2002 2003 2004 2005 2006 2011, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include #include #include #include #include #include #include #include #include "um.h" #include "gtkfiles.h" #include "main.h" #include "mainloop.h" #include "inifile.h" #include "gettext.h" gboolean report_write_errors = TRUE; static int highest_fd = 2; int xopen(char *filename, int flags, int mode) { int fd; gchar *c; fd = open(filename,flags,mode); if (fd == -1) { if (report_write_errors || mode==EFILE_READ) { c = g_strdup_printf(_("Could not open %s: %s"),filename, strerror(errno)); user_error(c); g_free(c); } else if (errno != ENOSPC) { c = g_strdup_printf(_("Warning: Unexpected error: %s"), filename); user_perror(c); g_free(c); } } if (fd > highest_fd) highest_fd = fd; return fd; } EFILE *e_fopen(char *filename, int mode) { int fd,flag; switch (mode) { case EFILE_READ: flag = O_RDONLY; break; case EFILE_WRITE: flag = O_WRONLY | O_CREAT | O_TRUNC; break; case EFILE_APPEND: flag = O_WRONLY | O_CREAT | O_APPEND; break; default: g_assert_not_reached(); return NULL; } fd = xopen(filename,flag,0666); if (fd == -1) return NULL; return e_fopen_fd(fd,filename); } EFILE *e_fopen_fd(int fd, gchar *virtual_filename) { EFILE *e; e = g_malloc(sizeof(*e)); e->fd = fd; e->filename = g_strdup(virtual_filename); return e; } void close_all_files(void) { close_all_files_except(NULL,0); } void close_all_files_except(int *fds, int count) { /* We close one file higher than highest_fd because of some sound drivers keep a file handle that wasn't opened through us. */ int i,j; for (i=3; i<=highest_fd+1; i++) { for (j=0; jfd) != 0) { c = g_strdup_printf(_("Error closing %s: %s"), f->filename, strerror(errno)); user_error(c); g_free(c); b = TRUE; } g_free(f->filename); g_free(f); return b; } gboolean e_fclose_remove(EFILE *f) { gchar *c; gboolean b=FALSE; if (close(f->fd) != 0) { c = g_strdup_printf(_("Error closing %s: %s"), f->filename, strerror(errno)); user_error(c); g_free(c); b=TRUE; } if (xunlink(f->filename)) b=TRUE; g_free(f->filename); g_free(f); return b; } gboolean e_fseek(EFILE *stream, off_t offset, int whence) { char *c; if (lseek(stream->fd,offset,whence) == (off_t)-1) { c = g_strdup_printf(_("Could not seek in %s: %s"),stream->filename, strerror(errno)); user_error(c); g_free(c); return TRUE; } return FALSE; } gint e_fread_upto(void *data, size_t size, EFILE *stream) { char *c; gint r = 0; ssize_t i; while (size > 0) { i = read(stream->fd, (void *)(((char *)data)+r), size); if (i == 0) return r; if (i < 0) { if (errno == EINTR) continue; c = g_strdup_printf(_("Could not read from %s: %s"), stream->filename,strerror(errno)); user_error(c); g_free(c); return -1; } r += i; size -= i; } return r; } gboolean e_fread(void *data, size_t size, EFILE *stream) { gint i; gchar *c; i = e_fread_upto(data,size,stream); if (i < size) { if (i >= 0) { c = g_strdup_printf(_("Unexpected end of file reading from %s"), stream->filename); user_error(c); g_free(c); } return TRUE; } return FALSE; } gboolean e_fwrite(void *data, size_t size, EFILE *stream) { char *c; gint w = 0; ssize_t i; while (size > 0) { i = write(stream->fd, (void *)(((char *)data)+w), size); if (i == 0) { c = g_strdup_printf(_("Unable to write data to %s"), stream->filename); user_error(c); g_free(c); return TRUE; } if (i < 0) { if (errno == EINTR) continue; c = g_strdup_printf(_("Could not read from %s: %s"), stream->filename,strerror(errno)); user_error(c); g_free(c); return TRUE; } w += i; size -= i; } return FALSE; } gboolean e_fwrite0(size_t size, EFILE *stream) { char buf[4096]; size_t s; memset(buf,0,sizeof(buf)); while (size>0) { s = MIN(size,sizeof(buf)); if (e_fwrite(buf,s,stream)) return TRUE; size -= s; } return FALSE; } gboolean e_fread_bswap(void *data, size_t size, EFILE *stream) { size_t i; gchar c; if (e_fread(data,size,stream)) return TRUE; i=0; size--; while (ibufsize) { buf=g_realloc(buf,size); bufsize=size; } for (i=0; ifd, 0, SEEK_CUR); if (l == -1) { c = g_strdup_printf(_("Could not get file position in %s: %s"), stream->filename, strerror(errno)); user_error(c); g_free(c); } return l; } gboolean is_same_file(char *filename1, char *filename2) { struct stat s1, s2; if (!strcmp(filename1,filename2)) return TRUE; if (stat(filename1,&s1)) { if (errno == ENOENT) return FALSE; else return TRUE; } if (stat(filename2,&s2)) { if (errno == ENOENT) return FALSE; else return TRUE; } return (s1.st_dev==s2.st_dev && s1.st_ino==s2.st_ino); } /* Removes double slashes */ static void cleanup_filename(gchar *fn) { gchar *c; while (1) { c = strstr(fn,"//"); if (c == NULL) return; while (*c != 0) { c[0]=c[1]; c++; } } } #if (GTK_MAJOR_VERSION < 2) || (GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION < 4) || defined(DISABLE_FILECHOOSER) /* Use the GtkFileSelection */ static gchar *get_filename_result; static gboolean get_filename_quitflag; static gboolean get_filename_savemode; static GtkFileSelection *get_filename_fs; static void get_filename_callback(GtkButton *button, gpointer user_data) { GtkFileSelection *fs = GTK_FILE_SELECTION(user_data); gchar *c; if (button==GTK_BUTTON(fs->ok_button)) { if (get_filename_savemode && file_exists((gchar *)gtk_file_selection_get_filename(fs))) { if (user_message(_("File already exists. Overwrite?"), UM_YESNOCANCEL) != MR_YES) { gtk_signal_emit_stop_by_name(GTK_OBJECT(button),"clicked"); return; } } else if (!get_filename_savemode && !file_exists((gchar *) gtk_file_selection_get_filename(fs))) { user_error(_("No file with that name!")); gtk_signal_emit_stop_by_name(GTK_OBJECT(button),"clicked"); return; } if (get_filename_result) free(get_filename_result); get_filename_result = g_strdup(gtk_file_selection_get_filename(fs)); if (inifile_get_gboolean("useGeometry",FALSE)) { c = get_geom(GTK_WINDOW(fs)); inifile_set("fileGeometry",c); g_free(c); } } } static void get_filename_destroy(void) { get_filename_quitflag = TRUE; } static gchar *get_filename_internal_get_name(void) { return g_strdup(gtk_file_selection_get_filename(get_filename_fs)); } static void get_filename_internal_set_name(gchar *new_name) { gtk_file_selection_set_filename(get_filename_fs,new_name); } gchar *get_filename(gchar *current_name, gchar *filemask, gchar *title_text, gboolean savemode, GtkWidget *custom_widget) { GtkFileSelection *f; GtkAllocation all; gchar *c; get_filename_result=NULL; get_filename_savemode = savemode; f=GTK_FILE_SELECTION(gtk_file_selection_new(title_text)); get_filename_fs = f; if (custom_widget != NULL) gtk_box_pack_end(GTK_BOX(GTK_FILE_SELECTION(f)->main_vbox), custom_widget, FALSE, FALSE, 0); c = inifile_get("fileGeometry",NULL); if (c!=NULL && inifile_get_gboolean("useGeometry",FALSE) && !parse_geom(c,&all)) { gtk_window_set_default_size(GTK_WINDOW(f),all.width,all.height); gtk_widget_set_uposition(GTK_WIDGET(f),all.x,all.y); } else gtk_window_set_position(GTK_WINDOW(f),GTK_WIN_POS_CENTER); if (current_name) gtk_file_selection_set_filename(f,current_name); if (filemask) gtk_file_selection_complete(f,filemask); gtk_signal_connect(GTK_OBJECT(f),"destroy", GTK_SIGNAL_FUNC(get_filename_destroy),NULL); gtk_signal_connect(GTK_OBJECT(f->ok_button),"clicked", GTK_SIGNAL_FUNC(get_filename_callback),f); gtk_signal_connect(GTK_OBJECT(f->cancel_button),"clicked", GTK_SIGNAL_FUNC(get_filename_callback),f); gtk_signal_connect_object(GTK_OBJECT(f->ok_button),"clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy), GTK_OBJECT(f)); gtk_signal_connect_object(GTK_OBJECT(f->cancel_button),"clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy), GTK_OBJECT(f)); gtk_window_set_modal(GTK_WINDOW(f),TRUE); gtk_widget_show(GTK_WIDGET(f)); /* gtk_window_maximize(GTK_WINDOW(f)); */ get_filename_quitflag=FALSE; while (!get_filename_quitflag) mainloop(); if (get_filename_result != NULL) cleanup_filename(get_filename_result); return get_filename_result; } static void get_directory_callback(GtkButton *button, gpointer user_data) { GtkFileSelection *fs = GTK_FILE_SELECTION(user_data); gchar *c; get_filename_result = g_strdup(gtk_file_selection_get_filename(fs)); c = strchr(get_filename_result,0); c--; while (c>get_filename_result && *c=='/') { *c = 0; c--; } if (inifile_get_gboolean("useGeometry",FALSE)) { c = get_geom(GTK_WINDOW(fs)); inifile_set("dirGeometry",c); g_free(c); } } gchar *get_directory(gchar *current_name, gchar *title_text) { GtkFileSelection *f; gchar *c; GtkAllocation all; f = GTK_FILE_SELECTION(gtk_file_selection_new(title_text)); c = inifile_get("dirGeometry",NULL); if (c!=NULL && inifile_get_gboolean("useGeometry",FALSE) && !parse_geom(c,&all)) { gtk_window_set_default_size(GTK_WINDOW(f),all.width,all.height); gtk_widget_set_uposition(GTK_WIDGET(f),all.x,all.y); } else gtk_window_set_position(GTK_WINDOW(f),GTK_WIN_POS_CENTER); if (current_name) gtk_file_selection_set_filename(f,current_name); gtk_signal_connect(GTK_OBJECT(f),"destroy", GTK_SIGNAL_FUNC(get_filename_destroy),NULL); gtk_signal_connect(GTK_OBJECT(f->ok_button),"clicked", GTK_SIGNAL_FUNC(get_directory_callback),f); gtk_signal_connect(GTK_OBJECT(f->cancel_button),"clicked", GTK_SIGNAL_FUNC(get_directory_callback),f); gtk_signal_connect_object(GTK_OBJECT(f->ok_button),"clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy), GTK_OBJECT(f)); gtk_signal_connect_object(GTK_OBJECT(f->cancel_button),"clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy), GTK_OBJECT(f)); gtk_window_set_modal(GTK_WINDOW(f),TRUE); gtk_widget_set_sensitive(GTK_WIDGET(f->file_list),FALSE); gtk_widget_show(GTK_WIDGET(f)); get_filename_quitflag=FALSE; while (!get_filename_quitflag) mainloop(); if (get_filename_result != NULL) cleanup_filename(get_filename_result); return get_filename_result; } #else /* Use the GtkFileChooserDialog */ static GtkFileChooser *get_filename_fc; struct response { gboolean savemode; gboolean responded; gint r; }; static void response(GtkDialog *dialog, gint arg1, gpointer user_data) { struct response *sr = (struct response *)user_data; gchar *c; if (sr->savemode && arg1 == GTK_RESPONSE_ACCEPT) { c = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); if (c != NULL && file_exists(c)) { if (user_message(_("File already exists. Overwrite?"), UM_YESNOCANCEL) != MR_YES) return; } } sr->responded = TRUE; sr->r = arg1; } static gchar *get_filename_internal_get_name(void) { gchar *c; c = gtk_file_chooser_get_filename(get_filename_fc); if (c == NULL) return g_strdup(""); return c; } static void get_filename_internal_set_name(gchar *new_name) { gchar *c,*d; c = g_filename_to_utf8(new_name,-1,NULL,NULL,NULL); gtk_file_chooser_set_filename(get_filename_fc,c); d = strrchr(c,'/'); if (d != NULL && d[1] != 0) gtk_file_chooser_set_current_name(get_filename_fc,d+1); g_free(c); } static gchar *get_filename_main(gchar *current_name, gchar *title_text, gboolean savemode, GtkFileChooserAction action, gchar *geom_setting, GtkWidget *custom_widget) { GtkWidget *w; GtkFileChooser *fc; gchar *c,*d; GtkAllocation all; struct response sr = { savemode, FALSE, 0 }; if (current_name != NULL) c = g_filename_to_utf8(current_name,-1,NULL,NULL,NULL); else c = NULL; w = gtk_file_chooser_dialog_new(title_text,NULL, action, savemode?GTK_STOCK_SAVE_AS:GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,NULL); fc = GTK_FILE_CHOOSER(w); get_filename_fc = fc; if (custom_widget != NULL) gtk_file_chooser_set_extra_widget(fc, custom_widget); d = inifile_get(geom_setting,NULL); if (d!=NULL && !savemode && inifile_get_gboolean("useGeometry",FALSE) && !parse_geom(d,&all)) { gtk_window_set_default_size(GTK_WINDOW(w),all.width,all.height); gtk_widget_set_uposition(GTK_WIDGET(w),all.x,all.y); } else gtk_window_set_position(GTK_WINDOW(w),GTK_WIN_POS_CENTER); gtk_window_set_modal(GTK_WINDOW(w),TRUE); if (c != NULL) { if (c[0] == '/' && (action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER || file_is_directory(c))) { gtk_file_chooser_set_current_folder(fc,c); } else { gtk_file_chooser_set_filename(fc,c); if (savemode) { d = strrchr(c,'/'); if (d != NULL && d[1] != 0) gtk_file_chooser_set_current_name(fc,d+1); } g_free(c); } } gtk_signal_connect(GTK_OBJECT(fc),"response",GTK_SIGNAL_FUNC(response), &sr); gtk_widget_show(w); while (!sr.responded) mainloop(); c = NULL; if (sr.r == GTK_RESPONSE_ACCEPT) c = gtk_file_chooser_get_filename(fc); if (sr.r != GTK_RESPONSE_DELETE_EVENT) { if (!savemode && inifile_get_gboolean("useGeometry",FALSE)) { d = get_geom(GTK_WINDOW(w)); inifile_set(geom_setting,d); g_free(d); } gtk_widget_destroy(w); } if (c != NULL) cleanup_filename(c); return c; } gchar *get_filename(gchar *current_name, gchar *filemask, gchar *title_text, gboolean savemode, GtkWidget *custom_widget) { return get_filename_main(current_name,title_text,savemode, savemode?GTK_FILE_CHOOSER_ACTION_SAVE: GTK_FILE_CHOOSER_ACTION_OPEN,"fileGeometry", custom_widget); } gchar *get_directory(gchar *current_name, gchar *title_text) { return get_filename_main(current_name,title_text,FALSE, GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, "dirGeometry",NULL); } #endif void get_filename_modify_extension(gchar *new_extension) { gchar *c,*d,*e,*f; c = get_filename_internal_get_name(); d = strrchr(c,'.'); e = strrchr(c,'/'); if (d != NULL && (e == NULL || e < d)) *d = 0; if (c[0] != 0 && (e == NULL || e[1] != 0)) { /* printf("%s\n",c); */ f = g_strdup_printf("%s%s",c,new_extension); get_filename_internal_set_name(f); g_free(f); } g_free(c); } gboolean e_copydata(EFILE *from, EFILE *to, off_t bytes) { off_t count; size_t rest; guint8 buf[4096]; count = bytes / sizeof(buf); rest = bytes % sizeof(buf); for (; count>0; count--) if (e_fread(buf,sizeof(buf),from) || e_fwrite(buf,sizeof(buf),to)) return TRUE; if (rest>0) return (e_fread(buf,rest,from) || e_fwrite(buf,rest,to)); else return FALSE; } off_t errdlg_filesize(gchar *filename) { EFILE *f; off_t r; f = e_fopen(filename,EFILE_READ); if (f == NULL) return -1; if (e_fseek(f,0,SEEK_END)) { e_fclose(f); return -1; } r = e_ftell(f); e_fclose(f); return r; } gboolean errdlg_copyfile(gchar *from, gchar *to) { off_t l; EFILE *in, *out; gboolean b; l = errdlg_filesize ( from ); if ( l == -1 ) return TRUE; in = e_fopen(from,EFILE_READ); if (!in) return TRUE; out = e_fopen(to,EFILE_WRITE); if (!out) { e_fclose(in); return TRUE; } b = e_copydata(in,out,l); e_fclose(in); if (b) e_fclose_remove(out); else e_fclose(out); return b; } gboolean file_exists(char *filename) { int i; struct stat ss; i = stat(filename,&ss); if (i && errno==ENOENT) return FALSE; return TRUE; } gboolean program_exists(char *progname) { gchar *c,*d,*e; c = getenv("PATH"); if (c == NULL) c="/bin:/usr/bin"; c = g_strdup(c); for (d=strtok(c,":"); d!=NULL; d=strtok(NULL,":")) { e = g_strdup_printf("%s/%s",d,progname); if (file_exists(e)) { g_free(e); g_free(c); return TRUE; } g_free(e); } g_free(c); return FALSE; } gboolean file_is_normal(char *filename) { struct stat s; int i; i = stat(filename,&s); return (i==0 && S_ISREG(s.st_mode)); } gboolean file_is_directory(char *filename) { struct stat s; int i; i = stat(filename,&s); return (i==0 && S_ISDIR(s.st_mode)); } static int e_fgetc(EFILE *stream) { unsigned char c; ssize_t i; gchar *m; while (1) { i = read(stream->fd,&c,1); if (i == 0) return -1; if (i == -1) { if (errno == EINTR) continue; m = g_strdup_printf(_("Error reading from %s: %s"), stream->filename,strerror(errno)); user_error(m); g_free(m); return -1; } return (int)c; } } long int e_readline(gchar **line, size_t *size, EFILE *stream) { size_t s = 0; int c; while (1) { if (s == *size) { *size = *size ? *size * 2 : 32; *line = g_realloc(*line, *size); } c = e_fgetc(stream); if (c==EOF || (c=='\n' && s>0)) { (*line)[s]=0; return s; } if (c=='\n') return e_readline(line,size,stream); (*line)[s] = (gchar)c; s++; } } gboolean xunlink(gchar *filename) { gchar *c; if (unlink(filename) == -1 && errno != ENOENT) { c = g_strdup_printf(_("Could not remove '%s': %s"),filename, strerror(errno)); user_error(c); g_free(c); return TRUE; } return FALSE; } gint xrename(gchar *oldname, gchar *newname, gboolean allow_copy) { gchar *c; g_assert(strcmp(oldname,newname) != 0); if (rename(oldname,newname) == 0) return 0; if (errno == EXDEV) { if (allow_copy) return errdlg_copyfile(oldname,newname)?1:0; else return 2; } else { c = g_strdup_printf(_("Error creating link to '%s': %s"),oldname, strerror(errno)); user_error(c); g_free(c); return 1; } } gchar *make_filename_rooted(gchar *name) { gchar *c,*d; if (name[0] == '/' || name[0] == 0) return g_strdup(name); c = g_get_current_dir(); d = g_strdup_printf("%s/%s",c,name); g_free(c); cleanup_filename(d); return d; } gboolean fd_canwrite(int fd) { fd_set set; struct timeval tv = {}; int i; FD_ZERO(&set); FD_SET(fd,&set); i = select(fd+1,NULL,&set,NULL,&tv); if (i == 0) return FALSE; else return TRUE; } gboolean fd_canread(int fd) { fd_set set; struct timeval tv = {}; int i; FD_ZERO(&set); FD_SET(fd,&set); i = select(fd+1,&set,NULL,NULL,&tv); if (i == 0) return FALSE; else return TRUE; } gboolean e_fread_u16_xe(guint16 *data, EFILE *stream, gboolean be) { unsigned char buf[2]; guint16 i; if (e_fread(buf,2,stream)) return TRUE; if (be) { i=buf[0]; i<<=8; i|=buf[1]; } else { i=buf[1]; i<<=8; i|=buf[0]; } *data = i; return FALSE; } gboolean e_fread_u32_xe(guint32 *data, EFILE *stream, gboolean be) { unsigned char buf[4]; guint32 i; if (e_fread(buf,4,stream)) return TRUE; if (be) { i=buf[0]; i<<=8; i|=buf[1]; i<<=8; i|=buf[2]; i<<=8; i|=buf[3]; } else { i=buf[3]; i<<=8; i|=buf[2]; i<<=8; i|=buf[1]; i<<=8; i|=buf[0]; } *data = i; return FALSE; } mhwaveedit-1.4.24/src/gtkfiles.h000066400000000000000000000102201334022513400164770ustar00rootroot00000000000000/* * Copyright (C) 2002 2003 2004 2005 2006 2011, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ /* GTK wrappers around the standard I/O functions, and some other file-related * stuff. */ #ifndef GTKFILES_H_INCLUDED #define GTKFILES_H_INCLUDED #include #include #include #include typedef struct { int fd; char *filename; } EFILE; #define EFILE_READ 0 #define EFILE_WRITE 1 #define EFILE_APPEND 2 gboolean xunlink(char *filename); /* Renames oldname into newname. If oldname and newname are on * different file systems, and allow_copy is TRUE, the file will be copied. * * Return value: * 0. Success. * 1. Failure. (an error message has already been displayed) * 2. allow_copy is FALSE and the filenames were not on the same filesystem. */ gint xrename(char *oldname, char *newname, gboolean allow_copy); /* This flag is TRUE by default. If it is FALSE, e_fopen with mode!=EFILE_READ * and e_fwrite will not popup error dialog boxes when an error occurs. If an * error other than disk full occurs, a warning message is issued to stderr. */ extern gboolean report_write_errors; int xopen(char *filename, int flags, int mode); /* Constants for openmode are defined above (EFILE_READ/WRITE/APPEND) */ EFILE *e_fopen(char *filename, int openmode); EFILE *e_fopen_fd(int fd, char *virtual_filename); gboolean e_fclose(EFILE *stream); gboolean e_fclose_remove(EFILE *stream); void close_all_files(void); /* Used after forking */ void close_all_files_except(int *fds, int count); gboolean e_fseek(EFILE *stream, off_t offset, int whence); gboolean e_fread(void *data, size_t size, EFILE *stream); gboolean e_fwrite(void *data, size_t size, EFILE *stream); gboolean e_fwrite0(size_t size, EFILE *stream); off_t e_ftell(EFILE *stream); long int e_readline(gchar **line, size_t *size, EFILE *stream); gboolean e_copydata(EFILE *from, EFILE *to, off_t bytes); gboolean errdlg_copyfile(gchar *from, gchar *to); gboolean e_fread_bswap(void *data, size_t size, EFILE *stream); gboolean e_fwrite_bswap(void *data, size_t size, EFILE *stream); gboolean is_same_file(char *filename1, char *filename2); off_t errdlg_filesize(gchar *filename); gboolean file_exists(char *filename); gboolean file_is_normal(char *filename); gboolean file_is_directory(char *filename); gboolean program_exists(char *progname); /* Meant to be called from signal handlers when inside get_filename */ void get_filename_modify_extension(gchar *new_extension); gchar *get_filename(gchar *current_name, gchar *filemask, gchar *title_text, gboolean savemode, GtkWidget *custom_widget); gchar *get_directory(gchar *current_name, gchar *title_text); gchar *make_filename_rooted(gchar *name); gboolean fd_canread(int fd); gboolean fd_canwrite(int fd); #if (G_BYTE_ORDER == G_BIG_ENDIAN) #define e_fwrite_le(a,b,c) e_fwrite_bswap(a,b,c) #define e_fread_le(a,b,c) e_fread_bswap(a,b,c) #define e_fwrite_be(a,b,c) e_fwrite(a,b,c) #define e_fread_be(a,b,c) e_fread(a,b,c) #else #define e_fwrite_le(a,b,c) e_fwrite(a,b,c) #define e_fread_le(a,b,c) e_fread(a,b,c) #define e_fwrite_be(a,b,c) e_fwrite_bswap(a,b,c) #define e_fread_be(a,b,c) e_fread_bswap(a,b,c) #endif #define e_fwrite_xe(a,b,c,be) ((be)?e_fwrite_be(a,b,c):e_fwrite_le(a,b,c)) #define e_fread_xe(a,b,c,be) ((be)?e_fread_be(a,b,c):e_fread_le(a,b,c)) gboolean e_fread_u16_xe(guint16 *data, EFILE *stream, gboolean be); gboolean e_fread_u32_xe(guint32 *data, EFILE *stream, gboolean be); #endif mhwaveedit-1.4.24/src/help.c000066400000000000000000000546231334022513400156310ustar00rootroot00000000000000/* * Copyright (C) 2002-2012, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ /* Automatically generated by gendocs.sh */ #include #include "gettext.h" #include "help.h" int help_page_count = 13 ; const char *help_page_titles[] = { N_("General"), N_("Sample view"), N_("Playing"), N_("Recording"), N_("Editing"), N_("Effects"), N_("Quality"), N_("File formats"), N_("Files"), N_("Keyboard shortcuts"), N_("Bug reporting"), N_("Helping out"), N_("Contact"), NULL }; static const char * O00_contents[] = { "\n", /* xgettext:no-c-format */ N_("mhWaveEdit is a graphical program for editing sound files. It is completely free (GPL).\n"), "\n", /* xgettext:no-c-format */ N_("You can find the latest release of mhWaveEdit at:\n"), /* xgettext:no-c-format */ N_("http://gna.org/projects/mhwaveedit/\n"), NULL }; static const char * D01_contents[] = { "\n", /* xgettext:no-c-format */ N_("The area where you 'see' the contents of the file you are editing, is called the 'sample view'. \n"), "\n", /* xgettext:no-c-format */ N_("In the sample view there is a grey vertical bar called the 'cursor'. The cursor follows the sound wave when you play the sound. You can position the cursor by clicking with the right (2:nd) mouse button. If you do this while you're playing a file, the playing will continue from the new cursor position. You can also position the cursor more exact by using the 'Position Cursor...' command on the Edit menu.\n"), "\n", /* xgettext:no-c-format */ N_("You can place marks in your file by holding down Ctrl and pressing a number from 0 to 9. This will place a mark (green vertical bar) with the same number at the current cursor position. You can later make the cursor go to that position again by just pressing the number. Setting and jumping to marks can be done while playing. To remove a mark, jump to the mark and set it again.\n"), NULL }; static const char * D02_contents[] = { "\n", /* xgettext:no-c-format */ N_("Playing a file is simple, just load the file and press the play button. The green play button plays from the current position. The yellow play button plays the current selection, or the entire file if nothing is selected. Stop the playback with the stop button (with the red square). \n"), "\n", /* xgettext:no-c-format */ N_("The playback speed can be varied by adjusting the slider to the far right. \n"), "\n", /* xgettext:no-c-format */ N_("You can do normal editing while the file is playing.\n"), NULL }; static const char * D03_contents[] = { "\n", /* xgettext:no-c-format */ N_("Recording is done with 'Record...' on the Play menu, or the Record button (the red circle). A dialog box will pop up where you can select what format you want to record in. After selecting the format, meters and numbers will appear showing info about the volume level of the sound input. \n"), "\n", /* xgettext:no-c-format */ N_("When you want to start recording, press the \"Start recording\" button. When you've recorded everything you wanted to, press the Finish button and the record dialog will disappear and newly recorded sound will show up in a new window.\n"), "\n", /* xgettext:no-c-format */ N_("Currently it is impossible to play and record at the same time, so the playback will stop when you record.\n"), NULL }; static const char * D04_contents[] = { "\n", /* xgettext:no-c-format */ N_("You make selections by dragging the mouse over the sample view. You can hear what you've currently selected by clicking on the \"play selection\" button (the button with the yellow arrow) or by selecting 'Play selection' from the Play menu.\n"), "\n", /* xgettext:no-c-format */ N_("You can use the cursor to refine the selection. Use the 'Selection start at cursor' and 'Selection end at cursor' buttons to move the selection starting point or the selection end point to the current cursor position. You can also drag the selection endpoints using the mouse.\n"), "\n", /* xgettext:no-c-format */ N_("The 'Cut' and 'Copy' functions work like in any other software. \n"), "\n", /* xgettext:no-c-format */ N_("The 'Paste' function insert the clipboard contents at the cursor position. The 'Paste over' function works like 'Paste', except that it overwrites the data after the insert position. \n"), "\n", /* xgettext:no-c-format */ N_("The 'Paste mix' function combines the clipboard data with the data at the cursor position.\n"), "\n", /* xgettext:no-c-format */ N_("The 'Paste as new' function opens a new window and puts the clipboard contents into it. \n"), "\n", /* xgettext:no-c-format */ N_("The 'Crop' function deletes all parts of the file that are not selected.\n"), "\n", /* xgettext:no-c-format */ N_("The 'Silence selection' function replaces the selected part with silence. To avoid clicks, the silent part is a line that meets the wave at the endpoints.\n"), "\n", /* xgettext:no-c-format */ N_("All editing functions work non-destructively, that is, the file you're editing isn't actually changed until you save it (the effects also work this way).\n"), "\n", NULL }; static const char * D05_contents[] = { "\n", /* xgettext:no-c-format */ N_("mhWaveEdit has a few simple effects, which are available from the 'Effects' menu. \n"), "\n", /* xgettext:no-c-format */ N_(" * Fade in/out\n"), "\n", /* xgettext:no-c-format */ N_(" This creates a linear fade in or fade out effect.\n"), "\n", /* xgettext:no-c-format */ N_(" * Normalize, Normalize to...\n"), "\n", /* xgettext:no-c-format */ N_(" This amplifies the sound as much as possible without getting clipping distortion. The \"Normalize to...\" item lets you specify which level to normalize to.\n"), "\n", /* xgettext:no-c-format */ N_(" * Volume adjust/fade...\n"), "\n", /* xgettext:no-c-format */ N_(" This effect lets you select a starting volume and a ending volume and amplifies the selection fading from the starting volume to the ending volume.\n"), "\n", /* xgettext:no-c-format */ N_(" Note that volumes above 100% may cause sound distortion. Use the 'Find top volume' to find out the maximum amplification possible without distortion. (You can use this for normalizing samples.) \n"), "\n", /* xgettext:no-c-format */ N_(" By setting starting volume and ending volume to the same value you get a simple amplification of the sound. \n"), "\n", /* xgettext:no-c-format */ N_(" * Convert samplerate...\n"), "\n", /* xgettext:no-c-format */ N_(" This converts the samplerate of the entire file to one you specify. There are different methods for doing this, usually the one in the top has the best quality but can take longer than the other methode.\n"), "\n", /* xgettext:no-c-format */ N_(" * Convert sample format...\n"), "\n", /* xgettext:no-c-format */ N_(" This converts the sample format of the entire file.\n"), "\n", /* xgettext:no-c-format */ N_(" The 'Don't actually change the data' option can be used if the program was wrong about the file's format.\n"), "\n", /* xgettext:no-c-format */ N_(" * Byte swap\n"), "\n", /* xgettext:no-c-format */ N_(" This \"byte swaps\" the selected part. It can be used to repair damaged files where the byte order is wrong. Note that if the sound looks alright but plays wrong, you should not use this option, instead you should use the \"byte-swap output\" option in the Preferences dialog.\n"), "\n", /* xgettext:no-c-format */ N_(" * Mix to mono\n"), "\n", /* xgettext:no-c-format */ N_(" This mixes all channels of the file together to a mono sound.\n"), "\n", /* xgettext:no-c-format */ N_(" * Add channel\n"), "\n", /* xgettext:no-c-format */ N_(" This copies the first channel to a new channel in the sound, converting mono to stereo etc.\n"), "\n", /* xgettext:no-c-format */ N_(" * Map channels...\n"), /* xgettext:no-c-format */ N_(" \n"), /* xgettext:no-c-format */ N_(" With this effect, you can change the number of channels in the file. You can also rearrange and add (i.e. mix) channels.\n"), "\n", /* xgettext:no-c-format */ N_(" * Combine channels...\n"), "\n", /* xgettext:no-c-format */ N_(" This effect lets you create a new sound by a linear combination of the old channels. This means you can do channel mixing / swapping / balance / panning / amplification etc. by entering different values. For example, to swap the left and right channel, you select that the new Channel 1 should be 0% of the old Channel 1 and 100% of the old Channel 2, and the new Channel 2 should be 100% of the old Channel 1 and 0% of the old Channel 2 \n"), "\n", /* xgettext:no-c-format */ N_(" * Speed adjustment...\n"), "\n", /* xgettext:no-c-format */ N_(" This effect changes the speed of the selection. The tone will change as well.\n"), /* xgettext:no-c-format */ N_(" * Pipe through program...\n"), /* xgettext:no-c-format */ N_(" \n"), /* xgettext:no-c-format */ N_(" This effect is for advanced users wanting to pipe raw audio data through an external program. The output of the program is read back and replaces the processed part. \n"), "\n", /* xgettext:no-c-format */ N_("mhWaveEdit supports LADSPA effects and can also make use of most of the SoX utility's effects. To find the LADSPA plugins the environment variable LADSPA_PATH must be properly set up. \n"), "\n", /* xgettext:no-c-format */ N_("All supported effects can be found by choosing the 'Effects...' menu item. The effects are listed with names beginning with [B] for builtin effects, [L] for LADSPA effects, and [S] for SoX effects.\n"), "\n", NULL }; static const char * D06_contents[] = { "\n", /* xgettext:no-c-format */ N_("Some notes on sound quality.\n"), "\n", /* xgettext:no-c-format */ N_("The general rule when doing audio editing/processing is to not manipulate the data more than necessary and keep an original copy whenever you're processing your important files. \n"), "\n", /* xgettext:no-c-format */ N_("Cut, copy and paste operations move the data around without modifying it, so these don't degrade the sound quality. Because of level differences, you may get a \"step\" at the start and end of the inserted part, which can cause a small clicking sound. \n"), "\n", /* xgettext:no-c-format */ N_("The mix paste function doesn't decrease quality, unless the peaks become too high and you get clipping. In that case you will get a warning message.\n"), "\n", /* xgettext:no-c-format */ N_("Sound data is normally stored as integer values. Therefore, whenever you normalize, adjust volume, decrease sample size or filter a sound, the result must be rounded. If you use 24 or 32 bit sample sizes, this is not really a problem, but if you use 8 or 16 bits sample size, this rounding causes a decrease in quality. \n"), "\n", /* xgettext:no-c-format */ N_("The quality decrease that the rounding causes can be masked by adding a small amount of noise before rounding. This is called \"dithering\". mhWaveEdit supports basic dithering and it's enabled by default.\n"), "\n", /* xgettext:no-c-format */ N_("By default, mhWaveEdit uses floating-point temporary files for storing processed results to avoid rounding until the file is saved.\n"), NULL }; static const char * D07_contents[] = { "\n", /* xgettext:no-c-format */ N_("Even if mhWaveEdit was originally built for editing wav files, it's also possible to load and save in a few other formats. mhWaveEdit always supports wav and raw files, but if it's compiled with the libsndfile library, mhWaveEdit supports a couple of other formats as well. \n"), "\n", /* xgettext:no-c-format */ N_("To save a file with a different file format, use \"Save as...\" and choose a format in the file type selection box. \n"), "\n", /* xgettext:no-c-format */ N_("mhWaveEdit has basic support for mp3 and ogg formats. For this to work you need to have LAME installed for mp3 support, and OggDec/OggEnc for Ogg support. If you have these programs, you can open and save mp3/ogg files just like any other file format.\n"), "\n", /* xgettext:no-c-format */ N_("If mplayer is installed, mhwaveedit can open all formats that it supports, for example the soundtrack of a video file. Since mplayer is only a player, these files can not be saved back after editing, you have to save the file into a supported format.\n"), NULL }; static const char * D08_contents[] = { "\n", /* xgettext:no-c-format */ N_("mhWaveEdit creates a directory ~/.mhwaveedit where it stores configuration information. \n"), "\n", /* xgettext:no-c-format */ N_("The configuration file is called config. It can be hand edited, but the easiest way is through 'Preferences' on the Edit menu.\n"), "\n", /* xgettext:no-c-format */ N_("Each mhwaveedit process creates a session file in the .mhwaveedit directory called mhwaveedit-session---, where is the session ID number and is a character code showing the state of the session ('r' for running sessions). \n"), "\n", /* xgettext:no-c-format */ N_("Temporary files are by default also stored in the ~/.mhwaveedit directory. Which directories to use can be set through the preferences dialog. To get the best performance, you should have one temporary directory for each local filesystem. The temporary files have names of the form \"mhwaveedit-temp--nnnn-\". Do NOT open or remove temporary files with the same pid number as a currently running mhWaveEdit.\n"), "\n", /* xgettext:no-c-format */ N_("mhWaveEdit checks on startup for leftover temporary files and lets the user open them. After opening a crashed session, the files can be saved or thrown away.\n"), NULL }; static const char * D09_contents[] = { "\n", /* xgettext:no-c-format */ N_("F1 Help\n"), /* xgettext:no-c-format */ N_("F12 Record\n"), "\n", /* xgettext:no-c-format */ N_("Ctrl+(number) Set mark\n"), /* xgettext:no-c-format */ N_("(number) Goto mark\n"), "\n", /* xgettext:no-c-format */ N_("Ctrl+P Preferences\n"), /* xgettext:no-c-format */ N_("Ctrl+E Effects\n"), "\n", /* xgettext:no-c-format */ N_("Ctrl+O Open file\n"), /* xgettext:no-c-format */ N_("Ctrl+S Save file\n"), /* xgettext:no-c-format */ N_("Ctrl+U Save selection as\n"), "\n", /* xgettext:no-c-format */ N_("Ctrl+C Copy\n"), /* xgettext:no-c-format */ N_("Ctrl+X Cut\n"), /* xgettext:no-c-format */ N_("Ctrl+D Delete\n"), /* xgettext:no-c-format */ N_("Delete Delete\n"), /* xgettext:no-c-format */ N_("Ctrl+V Paste\n"), /* xgettext:no-c-format */ N_("Ctrl+Z Undo\n"), /* xgettext:no-c-format */ N_("Ctrl+A Select all\n"), "\n", /* xgettext:no-c-format */ N_("Ctrl+G Position cursor (Go to)\n"), /* xgettext:no-c-format */ N_("Ctrl+H Position cursor at file start\n"), /* xgettext:no-c-format */ N_("Ctrl+J Position cursor at file end\n"), /* xgettext:no-c-format */ N_("Ctrl+K Position cursor at selection start\n"), /* xgettext:no-c-format */ N_("Ctrl+L Position cursor at selection end\n"), /* xgettext:no-c-format */ N_("Y,U Move cursor to nearest all-channel zero-crossing\n"), /* xgettext:no-c-format */ N_("I,O Move cursor to nearest any-channel zero-crossing\n"), "\n", /* xgettext:no-c-format */ N_("Ctrl+Q Selection start at cursor\n"), /* xgettext:no-c-format */ N_("Ctrl+W Selection end at cursor\n"), "\n", /* xgettext:no-c-format */ N_("+,= Zoom in\n"), /* xgettext:no-c-format */ N_("- Zoom out\n"), /* xgettext:no-c-format */ N_("> Zoom to selection\n"), /* xgettext:no-c-format */ N_("< Zoom all\n"), /* xgettext:no-c-format */ N_("Arrow keys Scroll left/right\n"), "\n", /* xgettext:no-c-format */ N_("Home Move view to file start\n"), /* xgettext:no-c-format */ N_("End Move view to file end\n"), /* xgettext:no-c-format */ N_("Tab Move view to cursor\n"), /* xgettext:no-c-format */ N_("Ctrl+Tab Move cursor to center of view\n"), "\n", /* xgettext:no-c-format */ N_("Space Play/Stop\n"), /* xgettext:no-c-format */ N_("Shift+Space Play all\n"), /* xgettext:no-c-format */ N_(", Play from cursor pos\n"), /* xgettext:no-c-format */ N_(". Stop\n"), /* xgettext:no-c-format */ N_("/ Play selection\n"), /* xgettext:no-c-format */ N_("H,J Move cursor (and playback) 1/8 of view\n"), /* xgettext:no-c-format */ N_("K,L Move cursor one sample\n"), /* xgettext:no-c-format */ N_("Ctrl+arrow Move cursor (and playback) half second\n"), /* xgettext:no-c-format */ N_("( Play first 3 seconds of selection\n"), /* xgettext:no-c-format */ N_(") Play last 3 seconds of selection\n"), NULL }; static const char * D10_contents[] = { "\n", /* xgettext:no-c-format */ N_("If you find a bug or flaw in the program that's not mentioned in the BUGS file, report the bug in the bug tracker (see contact info) or mail a bug report describing the bug to: magnus.hjorth@home.se\n"), "\n", /* xgettext:no-c-format */ N_("In case of a crash, please do not send me any core dumps. They are huge and completely useless to me. Instead, create a backtrace. Backtraces tell you exactly where the program crashed.\n"), "\n", /* xgettext:no-c-format */ N_("How to create a backtrace:\n"), /* xgettext:no-c-format */ N_("1. Enable core dumps: ulimit -c unlimited\n"), /* xgettext:no-c-format */ N_("2. Run the program: mhwaveedit\n"), /* xgettext:no-c-format */ N_("3. Make the program crash. You should now get a file named core or core.1234 in the directory you're in.\n"), /* xgettext:no-c-format */ N_("4. Run gdb with the program and core file: \n"), /* xgettext:no-c-format */ N_(" gdb /usr/local/bin/mhwaveedit core | tee backtrace.txt\n"), /* xgettext:no-c-format */ N_("5. After gdb has loaded, use the command: bt\n"), /* xgettext:no-c-format */ N_("6. Quit gdb with the command: quit\n"), /* xgettext:no-c-format */ N_("7. Now you should have a back trace in the file backtrace.txt\n"), NULL }; static const char * D11_contents[] = { "\n", /* xgettext:no-c-format */ N_("There are plenty of things you can do if you want to help the development of mhWaveEdit. \n"), "\n", /* xgettext:no-c-format */ N_("First of all, look for bugs and report all bugs you find into the bug tracker or through e-mail. Sometimes a bug can get overlooked for a long time because nobody reports it, so don't be afraid to report bugs that have been there for a few releases. You don't have to provide fixes or very detailed information, although it helps of course.\n"), "\n", /* xgettext:no-c-format */ N_("Feature requests are also welcome, report them to the mailing list or to the bug tracker.\n"), "\n", /* xgettext:no-c-format */ N_("If you speak a language other than English and mhWaveEdit isn't translated to your language, you can contribute a translation. To do that, copy the template mhwaveedit.pot in the po directory into a new file ll.po, where ll is your language code (see http://www.gnu.org/software/gettext/manual/html_node/gettext_221.html for a list of language codes). \n"), "\n", /* xgettext:no-c-format */ N_("It's possible to edit po-files by hand, but I recommend a program such as poEdit (http://www.poedit.org) for editing translations. \n"), "\n", /* xgettext:no-c-format */ N_("Note that for those translatable strings that look like \"RecordStatus|Paused\", you should ignore what's to the left and only translate the string to the right (\"Paused\" in this example). This convention is there to make it possible to translate the same string to different things depending on context. \n"), "\n", /* xgettext:no-c-format */ N_("After you've filled in all the translations you want (you don't have to translate all the strings), mail in the po file to me (see contact info) and I'll add it to the next release. \n"), "\n", /* xgettext:no-c-format */ N_("If a translation is incomplete, you're very welcome to translate the remaining untranslated messages and mail them in. Corrections to translations are also appreciated, but they may need to be checked with the previous translator before including them. \n"), "\n", NULL }; static const char * D12_contents[] = { "\n", /* xgettext:no-c-format */ N_("For bug reports, translation updates, patches and PayPal donations:\n"), /* xgettext:no-c-format */ N_("magnus.hjorth@home.se\n"), "\n", /* xgettext:no-c-format */ N_("Project page with bug tracker, mailing list membership:\n"), /* xgettext:no-c-format */ N_("http://gna.org/projects/mhwaveedit\n"), "\n", /* xgettext:no-c-format */ N_("Mailing list (you must be a subscriber before you can post messages):\n"), /* xgettext:no-c-format */ N_("mhwaveedit-discuss@gna.org\n"), "\n", NULL }; const char ** help_page_contents[] = { O00_contents , D01_contents , D02_contents , D03_contents , D04_contents , D05_contents , D06_contents , D07_contents , D08_contents , D09_contents , D10_contents , D11_contents , D12_contents , NULL }; mhwaveedit-1.4.24/src/help.h000066400000000000000000000020351334022513400156240ustar00rootroot00000000000000/* * Copyright (C) 2004, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #ifndef HELP_H_INCLUDED #define HELP_H_INCLUDED #define HELP_PAGE_SHORTCUTS 9 #define HELP_PAGE_DEFAULT HELP_PAGE_SHORTCUTS extern int help_page_count; extern const char *help_page_titles[]; extern const char **help_page_contents[]; #endif mhwaveedit-1.4.24/src/historybox.c000066400000000000000000000100601334022513400170760ustar00rootroot00000000000000/* * Copyright (C) 2003 2004 2010, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include #include #include "historybox.h" #include "inifile.h" #define HISTORY_BOX_MAXENTRIES 20 typedef struct { gchar *name; GList *entries; } HistoryBoxHistory; static GHashTable *history_hash = NULL; /* key=gchar* (malloc'd), value=GList* */ static void history_box_init(HistoryBox *box) { } static void history_box_class_init(GtkObjectClass *klass) { } static void load_history(HistoryBoxHistory *hist) { gint i; gchar c[128],*d; for (i=1; i<=HISTORY_BOX_MAXENTRIES; i++) { g_snprintf(c,sizeof(c),"history_%s_%d",hist->name,i); d = inifile_get(c,NULL); if (!d) break; hist->entries = g_list_append(hist->entries,g_strdup(d)); } } static void save_history(HistoryBoxHistory *hist) { gint i; gchar c[128]; GList *l; for (i=1,l=hist->entries; l!=NULL; i++,l=l->next) { g_snprintf(c,sizeof(c),"history_%s_%d",hist->name,i); inifile_set(c,l->data); } g_snprintf(c,sizeof(c),"history_%s_%d",hist->name,i); inifile_set(c,NULL); g_assert(i<=HISTORY_BOX_MAXENTRIES+1); } GtkType history_box_get_type(void) { static GtkType id = 0; if (!id) { GtkTypeInfo info = { "HistoryBox", sizeof(HistoryBox), sizeof(HistoryBoxClass), (GtkClassInitFunc) history_box_class_init, (GtkObjectInitFunc) history_box_init }; id = gtk_type_unique(gtk_combo_get_type(),&info); } return id; } GtkWidget *history_box_new(gchar *historyname, gchar *value) { HistoryBox *hb = gtk_type_new(history_box_get_type()); history_box_set_history(hb, historyname); history_box_set_value(hb, value); return GTK_WIDGET(hb); } gchar *history_box_get_value(HistoryBox *box) { return (gchar *)gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(box)->entry)); } void history_box_set_history(HistoryBox *box, gchar *historyname) { HistoryBoxHistory *hist; if (!history_hash) history_hash=g_hash_table_new(g_str_hash,g_str_equal); hist = g_hash_table_lookup(history_hash, historyname); if (!hist) { hist = g_malloc(sizeof(*hist)); hist->name = g_strdup(historyname); hist->entries = NULL; load_history(hist); g_hash_table_insert(history_hash,hist->name,hist); } if (hist->entries != NULL) gtk_combo_set_popdown_strings(GTK_COMBO(box),hist->entries); else gtk_list_clear_items(GTK_LIST(GTK_COMBO(box)->list),0,-1); box->history = hist; } void history_box_set_value(HistoryBox *box, gchar *value) { gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(box)->entry),value); } void history_box_rotate_history(HistoryBox *box) { gchar *v; HistoryBoxHistory *hist=box->history; GList *l,*n; v = g_strdup(history_box_get_value(box)); for (l=hist->entries; l!=NULL; l=n) { n = l->next; if (!strcmp(l->data,v)) { g_free(l->data); hist->entries = g_list_remove_link(hist->entries,l); g_list_free(l); } } hist->entries = g_list_prepend(hist->entries, v); l = g_list_nth(hist->entries, HISTORY_BOX_MAXENTRIES-1); if (l && l->next) { g_assert(l->next->next == NULL); g_free(l->next->data); g_list_free_1(l->next); l->next = NULL; } gtk_combo_set_popdown_strings(GTK_COMBO(box),hist->entries); save_history(hist); } mhwaveedit-1.4.24/src/historybox.h000066400000000000000000000031211334022513400171030ustar00rootroot00000000000000/* * Copyright (C) 2003, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #ifndef HISTORYBOX_H_INCLUDED #define HISTORYBOX_H_INCLUDED #include #define HISTORY_BOX(obj) GTK_CHECK_CAST(obj,history_box_get_type(),HistoryBox) #define HISTORY_BOX_CLASS(klass) GTK_CHECK_CLASS_CAST(klass,history_box_get_type(),HistoryBoxClass) #define IS_HISTORY_BOX(obj) GTK_CHECK_TYPE(obj,history_box_get_type()) typedef struct { GtkCombo combo; gpointer history; } HistoryBox; typedef struct { GtkComboClass comboclass; } HistoryBoxClass; GtkType history_box_get_type(void); GtkWidget *history_box_new(gchar *historyname, gchar *value); gchar *history_box_get_value(HistoryBox *box); void history_box_set_history(HistoryBox *box, gchar *historyname); void history_box_set_value(HistoryBox *box, gchar *value); void history_box_rotate_history(HistoryBox *box); #endif mhwaveedit-1.4.24/src/hzoom.xbm000066400000000000000000000007161334022513400163730ustar00rootroot00000000000000#define hzoom_width 20 #define hzoom_height 20 static unsigned char hzoom_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x40, 0x00, 0x30, 0xc0, 0x00, 0x38, 0xc0, 0x01, 0xfc, 0xff, 0x03, 0xfe, 0xff, 0x07, 0xfc, 0xff, 0x03, 0x38, 0xc0, 0x01, 0x30, 0xc0, 0x00, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; mhwaveedit-1.4.24/src/icon.xpm000066400000000000000000000040311334022513400161770ustar00rootroot00000000000000/* XPM */ static char * icon_xpm[] = { "32 32 58 1", " c None", ". c #F7963B", "+ c #F0973F", "@ c #EB9A44", "# c #E59C48", "$ c #1C2DEA", "% c #0B1364", "& c #0C1365", "* c #0A1057", "= c #DF9E4D", "- c #0D156D", "; c #D89F51", "> c #D2A156", ", c #CDA45B", "' c #C7A65F", ") c #6269BC", "! c #999999", "~ c #5E66BE", "{ c #565FC3", "] c #0F1985", "^ c #BBAA68", "/ c #0D1570", "( c #101A8D", "_ c #B5AC6D", ": c #0E177B", "< c #0E177A", "[ c #101A8B", "} c #AFAE72", "| c #A8AF76", "1 c #A2B17B", "2 c #9DB47F", "3 c #97B684", "4 c #90B789", "5 c #FF0000", "6 c #6F0000", "7 c #6E0000", "8 c #8BBA8D", "9 c #770000", "0 c #5F0000", "a c #85BC92", "b c #3F0000", "c c #7FBE96", "d c #78BF9B", "e c #C55656", "f c #BF6060", "g c #C85151", "h c #B27373", "i c #6DC4A4", "j c #67C6A9", "k c #860000", "l c #7B0000", "m c #60C7AD", "n c #5BCAB2", "o c #55CCB7", "p c #4FCEBB", "q c #48CFC0", "r c #43D1C4", "s c #3DD4C9", "................................", "++++++++++++++++++++++++++++++++", "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", "#####$$%####$$&#####$*###$%#####", "=====$$%====$$-=====$-===$-=====", ";;;;;$%$%;;$$$-;;;;;$-;;;$-;;;;;", ">>>>>$-$$%$$%$->>>>>$->>>$->>>>>", ",,,,,$-%$$$%%$-,,,,,$*,,,$-,,,,,", "'''''$-'%$%%'$-'''''$$$$$$-'''''", "$)!!!$~!!))!!$~!!!!!$))~{$~!!!!$", "]$%^^$-^^^^^^$-^^^^^$/^^^$-^^$$(", "_]$%_$-______$-_____$-___$-_$:<[", "}}]$%$-}}}}}}$-}}}}}$-}}}$*$&&}}", "|||]$$-||||||$*|||||$-|||$$-*|||", "1111]$-111111$$$$$$$$-111$%<1111", "22222%%222222&------&*222**22222", "33333333333333333333333333333333", "44444564444445555555555555744444", "88885598888885669990509965578888", "aaa5b59aaaaaa59aaaaa59aaa6057aaa", "cc56059cccccc59ccccc59ccccc757cc", "d560d59dddddd59ddddd59dddddd7557", "5ef!!5g!!!!!!5g!!!!!5h!!!!!!!ee5", "06iii59ii5iii59iiiii5555557iiii7", "jjjjj59j555jj59jjjjj5k9l990jjjjj", "mmmmm5955655m59mmmmm59mmmmmmmmmm", "nnnnn5656675559nnnnn59nnnnnnnnnn", "ooooo5567oo7559ooooo50oooooooooo", "ppppp559pppp559ppppp5555550ppppp", "qqqqq660qqqq670qqqqq9999996qqqqq", "rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr", "ssssssssssssssssssssssssssssssss"}; mhwaveedit-1.4.24/src/inifile.c000066400000000000000000000146701334022513400163160ustar00rootroot00000000000000/* * Copyright (C) 2002 2003 2004 2005 2008, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include #include #include #include "main.h" #include "gtkfiles.h" #include "inifile.h" #include "gettext.h" static GHashTable *settings; static gchar *ininame; static gboolean settings_changed = FALSE; struct inifile_setting { gchar *name; gchar *value; }; static gboolean xisspace(gchar c) { return (c==' ' || c=='\t'); } static gchar *skipspace(gchar *c) { while (xisspace(*c)) c++; return c; } void inifile_init(void) { EFILE *f; gchar *c,*d,*namestart,*valuestart; size_t s = 0; int x; settings = g_hash_table_new(g_str_hash,g_str_equal); c = g_strjoin(NULL,get_home_directory(),"/.mhwaveedit",NULL); mkdir(c,CONFDIR_PERMISSION); g_free(c); ininame = g_strjoin(NULL,get_home_directory(),"/.mhwaveedit/config",NULL); if (!file_exists(ininame)) return; f = e_fopen(ininame,EFILE_READ); if (!f) return; c = NULL; while (1) { x = e_readline(&c,&s,f); if (x <= 0) break; /* Ta bort kommentar och avslutande space*/ d = strchr(c,'#'); if (!d) d=strchr(c,0); while (d>c && xisspace(*(d-1))) d--; *d = 0; /* Skippa inledande space */ d = skipspace(c); if (*d == 0) continue; namestart = d; while (*d!=0 && *d!=' ' && *d!='\t' && *d!='=') d++; if (*d == 0) { g_printerr(_("%s: Expected '=': %s\n"),ininame,c); break; } *d = 0; d++; d = skipspace(d); if (*d!='=') { g_printerr(_("%s: Expected '=': %s\n"),ininame,c); break; } d++; d = skipspace(d); if (*d==0) { g_printerr(_("%s: Expected value: %s\n"),ininame,c); break; } valuestart = d; g_hash_table_insert(settings,g_strdup(namestart), g_strdup(valuestart)); } e_fclose(f); g_free(c); } gchar *inifile_get(gchar *setting, gchar *defaultValue) { gchar *c; c = g_hash_table_lookup(settings, setting); if (c == NULL) return defaultValue; return c; } guint32 inifile_get_guint32(gchar *setting, guint32 defaultValue) { gchar *c,*d; guint32 ui; c = inifile_get(setting, NULL); if (c) { ui = strtoul(c,&d,10); if (*d==0) return ui; inifile_set_guint32(setting,defaultValue); } return defaultValue; } gint32 inifile_get_gint32(gchar *setting, gint32 defaultValue) { gchar *c,*d; gint32 ui; c = inifile_get(setting, NULL); if (c) { ui = strtol(c,&d,10); if (*d==0) return ui; inifile_set_gint32(setting,defaultValue); } return defaultValue; } gfloat inifile_get_gfloat(gchar *setting, gfloat defaultValue) { gchar *c,*d; double x; c = inifile_get(setting,NULL); if (c) { x = strtod(c,&d); if (*d==0) return (gfloat)x; inifile_set_gfloat(setting,defaultValue); } return defaultValue; } gboolean inifile_get_gboolean(gchar *setting, gboolean defaultValue) { gchar *c; c = inifile_get(setting, NULL); // printf("inifile_get_gboolean: c == %s\n",c); if (c) { if ( !g_strcasecmp(c,"y") || !strcmp(c,"1") || !g_strcasecmp(c,"yes") || !g_strcasecmp(c,"on") || !g_strcasecmp(c,"true") || !g_strcasecmp(c,"enabled")) return TRUE; if (!g_strcasecmp(c,"n") || !strcmp(c,"0") || !g_strcasecmp(c,"no") || !g_strcasecmp(c,"off") || !g_strcasecmp(c,"false") || !g_strcasecmp(c,"disabled")) return FALSE; inifile_set_gboolean(setting,defaultValue); } return defaultValue; } gboolean inifile_set(gchar *setting, gchar *value) { gboolean b; gpointer c,d; b = g_hash_table_lookup_extended(settings,setting,&c,&d); if (!b && value == NULL) return FALSE; if (b && value != NULL && !strcmp(d,value)) return FALSE; /* printf("key: '%s', from: '%s', to: '%s'\n",setting,b?d:"(none)",value); */ if (b) { g_hash_table_remove(settings,c); g_free(c); g_free(d); } if (value != NULL) g_hash_table_insert(settings,g_strdup(setting),g_strdup(value)); settings_changed = TRUE; return TRUE; } gboolean inifile_set_guint32(gchar *setting, guint32 value) { gchar c[32]; g_snprintf(c,sizeof(c),"%lu",(unsigned long int)value); return inifile_set(setting,c); } gboolean inifile_set_gint32(gchar *setting, gint32 value) { gchar c[32]; g_snprintf(c,sizeof(c),"%ld",(signed long int)value); return inifile_set(setting,c); } gboolean inifile_set_gboolean(gchar *setting, gboolean value) { return inifile_set(setting,value?"true":"false"); } gboolean inifile_set_gfloat(gchar *setting, gfloat value) { gchar c[128]; g_snprintf(c,sizeof(c),"%f",(float)value); return inifile_set(setting,c); } static void do_save_setting(gchar *setting, gchar *value, EFILE *f) { e_fwrite(setting,strlen(setting),f); e_fwrite(" = ",3,f); e_fwrite(value,strlen(value),f); e_fwrite("\n",1,f); } void inifile_save(void) { EFILE *f = e_fopen(ininame,EFILE_WRITE); char *c = "# mhWaveEdit configuration file.\n" "# Automatically generated by " PROGRAM_VERSION_STRING "\n" "# May be hand edited but extra comments will be removed when the \n" "# settings are saved.\n" "# Remove this file to restore default settings.\n" "\n"; if (f == NULL) return; if (e_fwrite(c,strlen(c),f)) return; g_hash_table_foreach(settings,(GHFunc)do_save_setting,f); e_fclose(f); settings_changed = FALSE; } static void do_quit(gchar *setting, gchar *value) { g_free(setting); g_free(value); } void inifile_quit(void) { if (settings_changed) inifile_save(); g_hash_table_foreach(settings,(GHFunc)do_quit,NULL); g_hash_table_destroy(settings); } mhwaveedit-1.4.24/src/inifile.h000066400000000000000000000103001334022513400163050ustar00rootroot00000000000000/* * Copyright (C) 2002 2003 2008 2010 2012, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ /* This module handles the runtime configuration of the program. */ #ifndef INIFILE_H_INCLUDED #define INIFILE_H_INCLUDED #include /* Some keys and default values that are used in different places of the * program */ #define INI_SETTING_SOUNDDRIVER "soundDriver" #define INI_SETTING_REALMAX "diskEditingThreshold" #define INI_SETTING_REALMAX_DEFAULT (1024*128) #define INI_SETTING_SOUNDBUFSIZE "soundBufferSize" #define INI_SETTING_SOUNDBUFSIZE_DEFAULT 65536 #define INI_SETTING_TIMESCALE "showTimeScale" #define INI_SETTING_TIMESCALE_DEFAULT TRUE #define INI_SETTING_VZOOM "showVerticalZoom" #define INI_SETTING_VZOOM_DEFAULT TRUE #define INI_SETTING_HZOOM "showHorizontalZoom" #define INI_SETTING_HZOOM_DEFAULT TRUE #define INI_SETTING_SPEED "showSpeed" #define INI_SETTING_SPEED_DEFAULT inifile_get_gboolean("varispeed",TRUE) #define INI_SETTING_SLABELS "showSliderLabels" #define INI_SETTING_SLABELS_DEFAULT FALSE #define INI_SETTING_BUFPOS "showBufpos" #define INI_SETTING_BUFPOS_DEFAULT FALSE #define INI_SETTING_MIXER "mixerUtility" #define INI_SETTING_MIXER_DEFAULT DEFAULT_MIXERAPP #define INI_SETTING_VIEW_QUALITY "viewQuality" #define INI_SETTING_VIEW_QUALITY_DEFAULT 128 #define INI_SETTING_VIEW_QUALITY_HIGH "viewQualityHigh" #define INI_SETTING_VIEW_QUALITY_HIGH_DEFAULT 5000 #define INI_SETTING_TIME_DISPLAY "timeDisplay" #define INI_SETTING_TIME_DISPLAY_SCALE "timeDisplayScale" /* This function must be called before any other of these functions. It will * initialize the inifile system and load the settings file ~/.mhwaveedit/config * if available. */ void inifile_init(void); /* Reads a setting. * setting - Name of the setting. * defaultValue - Default value returned if no such setting exists. * Returns: A read-only string of the setting's value or defaultValue if the * setting doesn't exist. */ gchar *inifile_get(gchar *setting, gchar *defaultValue); /* Same as inifile_get excepts requires that the value is a guint32 value. * Returns: The value converted into a guint32 or defaultValue if setting * doesn't exist or is not a valid number. */ guint32 inifile_get_guint32(gchar *setting, guint32 defaultValue); gint32 inifile_get_gint32(gchar *setting, gint32 defaultValue); /* Same as inifile_get except requires that the value is a boolean value. * 'y','yes','1','true','enabled','on' are interpreted as TRUE. * 'n','no','0','false','disabled','off' are interpreted as FALSE. * Returns: The value converted into a boolean or defaultValue if setting * doesn't exist or is not a valid boolean. */ gboolean inifile_get_gboolean(gchar *setting, gboolean defaultValue); /* Same as inifile_get except requires that the value is a floating-point * number. */ gfloat inifile_get_gfloat(gchar *setting, gfloat defaultValue); /* Changes a setting. * setting - Name of the setting. * value - The new value. * Returns: TRUE if the setting was modified, FALSE if it already had that * value. */ gboolean inifile_set(gchar *setting, gchar *value); gboolean inifile_set_guint32(gchar *setting, guint32 value); gboolean inifile_set_gint32(gchar *setting, gint32 value); gboolean inifile_set_gboolean(gchar *setting, gboolean value); gboolean inifile_set_gfloat(gchar *setting, gfloat value); /* Save the settings into the config file. */ void inifile_save(void); /* Free all resources and save the settings if they were changed. */ void inifile_quit(void); #endif mhwaveedit-1.4.24/src/int_box.c000066400000000000000000000143131334022513400163330ustar00rootroot00000000000000/* * Copyright (C) 2002 2003 2004 2005 2011, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include #include #include #include "um.h" #include "int_box.h" #include "main.h" #include "gettext.h" #if GTK_MAJOR_VERSION==2 static GtkEntryClass *parent_class; #else static GtkEditableClass *parent_class; #endif enum { NUMCHANGED_SIGNAL, LAST_SIGNAL }; typedef void (*GtkSignal_NONE__LONG) (GtkObject *object, long int arg1, gpointer user_data); #if GTK_MAJOR_VERSION == 2 # include "int_box_marsh.c" # define gtk_marshal_NONE__LONG gtk_marshal_VOID__LONG #else static void gtk_marshal_NONE__LONG(GtkObject *object, GtkSignalFunc func, gpointer func_data, GtkArg *args) { GtkSignal_NONE__LONG rfunc; rfunc=(GtkSignal_NONE__LONG)func; rfunc(object,GTK_VALUE_LONG(args[0]),func_data); } #endif /* GTK 2 */ static guint intbox_signals[LAST_SIGNAL] = { 0 }; static void intbox_update_text(Intbox *box) { gchar e[30]; g_snprintf(e,sizeof(e),"%ld",box->val); gtk_entry_set_text(GTK_ENTRY(box),e); } #if GTK_MAJOR_VERSION==2 static void intbox_activate(GtkEntry *editable) #else static void intbox_activate(GtkEditable *editable) #endif { long l; char *c,*d; c=(char *)gtk_entry_get_text(GTK_ENTRY(editable)); l=strtol(c,&d,10); if (*d==0) intbox_set(INTBOX(editable),l); else intbox_update_text(INTBOX(editable)); if (parent_class->activate) parent_class->activate(editable); } static gint intbox_focus_out(GtkWidget *widget, GdkEventFocus *event) { long l; char *c,*d; Intbox *b = INTBOX(widget); c=(char *)gtk_entry_get_text(GTK_ENTRY(widget)); l=strtol(c,&d,10); if (*d==0 && b->adj!=NULL && l>=(long)gtk_adjustment_get_lower(b->adj) && l<=(long)gtk_adjustment_get_upper(b->adj)) gtk_adjustment_set_value(b->adj,l); return GTK_WIDGET_CLASS(parent_class)->focus_out_event(widget,event); } static void intbox_class_init(IntboxClass *klass) { parent_class = gtk_type_class(gtk_entry_get_type()); #if GTK_MAJOR_VERSION==2 GTK_ENTRY_CLASS(klass)->activate = intbox_activate; #else GTK_EDITABLE_CLASS(klass)->activate = intbox_activate; #endif GTK_WIDGET_CLASS(klass)->focus_out_event = intbox_focus_out; klass->numchange=NULL; intbox_signals[NUMCHANGED_SIGNAL] = gtk_signal_new("numchanged",GTK_RUN_FIRST, GTK_CLASS_TYPE(klass), GTK_SIGNAL_OFFSET(IntboxClass,numchange), gtk_marshal_NONE__LONG,GTK_TYPE_NONE,1, GTK_TYPE_LONG); gtk_object_class_add_signals(GTK_OBJECT_CLASS(klass),intbox_signals, LAST_SIGNAL); } static void intbox_init(Intbox *fbox) { #if GTK_MAJOR_VERSION==2 gtk_entry_set_width_chars(GTK_ENTRY(fbox),10); #else GtkRequisition req; gtk_widget_size_request(GTK_WIDGET(fbox),&req); gtk_widget_set_usize(GTK_WIDGET(fbox),req.width/3,req.height); #endif fbox->adj = NULL; } GtkType intbox_get_type(void) { static GtkType id=0; if (!id) { GtkTypeInfo info = { "Intbox", sizeof(Intbox), sizeof(IntboxClass), (GtkClassInitFunc) intbox_class_init, (GtkObjectInitFunc) intbox_init, NULL, NULL}; id=gtk_type_unique(gtk_entry_get_type(),&info); } return id; } void intbox_set(Intbox *box, long val) { if (box->val == val) return; if (box->adj != NULL && val >= (long)gtk_adjustment_get_lower(box->adj) && val <= (long)gtk_adjustment_get_upper(box->adj)) { gtk_adjustment_set_value(box->adj,(gfloat)val); return; } box->val=val; intbox_update_text(box); gtk_signal_emit(GTK_OBJECT(box),intbox_signals[NUMCHANGED_SIGNAL],box->val); } GtkWidget *intbox_new(long val) { Intbox *box; box=gtk_type_new(intbox_get_type()); box->val=val-1; intbox_set(box,val); return GTK_WIDGET(box); } gboolean intbox_check(Intbox *box) { long l; char *c,*d; c=(char *)gtk_entry_get_text(GTK_ENTRY(box)); l=strtol(c,&d,10); if (*d==0) { intbox_set(box,l); return FALSE; } else { d = g_strdup_printf(_("'%s' is not a number!"),c); user_error(d); g_free(d); return TRUE; } } gboolean intbox_check_limit(Intbox *box, long int lowest, long int highest, gchar *valuename) { long l; char *c,*d; c = (char *)gtk_entry_get_text(GTK_ENTRY(box)); l = strtol(c,&d,10); if (*d == 0 && l >= lowest && l <= highest) { intbox_set(box,l); return FALSE; } else { d = g_strdup_printf(_("Value for %s must be a number between %ld and " "%ld"),valuename,lowest,highest); user_error(d); g_free(d); return TRUE; } } static void intbox_adj_changed(GtkAdjustment *adjustment, gpointer user_data) { Intbox *box = INTBOX(user_data); box->val = box->adj->value; intbox_update_text(box); gtk_signal_emit(GTK_OBJECT(box),intbox_signals[NUMCHANGED_SIGNAL], box->val); } GtkWidget *intbox_create_scale(Intbox *box, long minval, long maxval) { GtkWidget *w; #if GTK_MAJOR_VERSION > 1 GtkRequisition req; #endif if (box->adj == NULL) { box->adj = GTK_ADJUSTMENT(gtk_adjustment_new(minval,minval, maxval+1.0, 1.0, 10.0, 1.0)); gtk_signal_connect(GTK_OBJECT(box->adj),"value_changed", GTK_SIGNAL_FUNC(intbox_adj_changed),box); gtk_adjustment_set_value(box->adj,box->val); } w = gtk_hscale_new(box->adj); gtk_scale_set_digits(GTK_SCALE(w),0); #if GTK_MAJOR_VERSION > 1 gtk_widget_size_request(w,&req); gtk_widget_set_usize(w,req.width*5,req.height); #endif return w; } mhwaveedit-1.4.24/src/int_box.h000066400000000000000000000032521334022513400163400ustar00rootroot00000000000000/* * Copyright (C) 2002 2003 2005, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #ifndef INTBOX_H_INCLUDED #define INTBOX_H_INCLUDED #define INTBOX(obj) GTK_CHECK_CAST (obj, intbox_get_type(), Intbox) #define INTBOX_CLASS(class) GTK_CHECK_CLASS_CAST(class,intbox_get_type(),IntboxClass) #define IS_INTBOX(obj) GTK_CHECK_TYPE (obj,intbox_get_type()) typedef struct _Intbox Intbox; typedef struct _IntboxClass IntboxClass; struct _Intbox { GtkEntry parent; long int val; GtkAdjustment *adj; }; struct _IntboxClass { GtkEntryClass parent; void (*numchange)(Intbox *, long int); }; GtkType intbox_get_type(void); GtkWidget *intbox_new(long value); void intbox_set(Intbox *box, long value); /* TRUE = Contains invalid value */ gboolean intbox_check(Intbox *box); gboolean intbox_check_limit(Intbox *box, long int lowest, long int highest, gchar *valuename); GtkWidget *intbox_create_scale(Intbox *box, long minval, long maxval); #endif mhwaveedit-1.4.24/src/int_box_marsh.c000066400000000000000000000071241334022513400175270ustar00rootroot00000000000000 #ifdef G_ENABLE_DEBUG #define g_marshal_value_peek_boolean(v) g_value_get_boolean (v) #define g_marshal_value_peek_char(v) g_value_get_char (v) #define g_marshal_value_peek_uchar(v) g_value_get_uchar (v) #define g_marshal_value_peek_int(v) g_value_get_int (v) #define g_marshal_value_peek_uint(v) g_value_get_uint (v) #define g_marshal_value_peek_long(v) g_value_get_long (v) #define g_marshal_value_peek_ulong(v) g_value_get_ulong (v) #define g_marshal_value_peek_int64(v) g_value_get_int64 (v) #define g_marshal_value_peek_uint64(v) g_value_get_uint64 (v) #define g_marshal_value_peek_enum(v) g_value_get_enum (v) #define g_marshal_value_peek_flags(v) g_value_get_flags (v) #define g_marshal_value_peek_float(v) g_value_get_float (v) #define g_marshal_value_peek_double(v) g_value_get_double (v) #define g_marshal_value_peek_string(v) (char*) g_value_get_string (v) #define g_marshal_value_peek_param(v) g_value_get_param (v) #define g_marshal_value_peek_boxed(v) g_value_get_boxed (v) #define g_marshal_value_peek_pointer(v) g_value_get_pointer (v) #define g_marshal_value_peek_object(v) g_value_get_object (v) #else /* !G_ENABLE_DEBUG */ /* WARNING: This code accesses GValues directly, which is UNSUPPORTED API. * Do not access GValues directly in your code. Instead, use the * g_value_get_*() functions */ #define g_marshal_value_peek_boolean(v) (v)->data[0].v_int #define g_marshal_value_peek_char(v) (v)->data[0].v_int #define g_marshal_value_peek_uchar(v) (v)->data[0].v_uint #define g_marshal_value_peek_int(v) (v)->data[0].v_int #define g_marshal_value_peek_uint(v) (v)->data[0].v_uint #define g_marshal_value_peek_long(v) (v)->data[0].v_long #define g_marshal_value_peek_ulong(v) (v)->data[0].v_ulong #define g_marshal_value_peek_int64(v) (v)->data[0].v_int64 #define g_marshal_value_peek_uint64(v) (v)->data[0].v_uint64 #define g_marshal_value_peek_enum(v) (v)->data[0].v_int #define g_marshal_value_peek_flags(v) (v)->data[0].v_uint #define g_marshal_value_peek_float(v) (v)->data[0].v_float #define g_marshal_value_peek_double(v) (v)->data[0].v_double #define g_marshal_value_peek_string(v) (v)->data[0].v_pointer #define g_marshal_value_peek_param(v) (v)->data[0].v_pointer #define g_marshal_value_peek_boxed(v) (v)->data[0].v_pointer #define g_marshal_value_peek_pointer(v) (v)->data[0].v_pointer #define g_marshal_value_peek_object(v) (v)->data[0].v_pointer #endif /* !G_ENABLE_DEBUG */ /* VOID:LONG (marsh.txt:1) */ void gtk_marshal_VOID__LONG (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data) { typedef void (*GMarshalFunc_VOID__LONG) (gpointer data1, glong arg_1, gpointer data2); register GMarshalFunc_VOID__LONG callback; register GCClosure *cc = (GCClosure*) closure; register gpointer data1, data2; g_return_if_fail (n_param_values == 2); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_VOID__LONG) (marshal_data ? marshal_data : cc->callback); callback (data1, g_marshal_value_peek_long (param_values + 1), data2); } mhwaveedit-1.4.24/src/ladspacore.c000066400000000000000000000264721334022513400170170ustar00rootroot00000000000000/* * Copyright (C) 2004 2005 2007, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include #ifdef HAVE_LADSPA #include #include #include #include #include #include "um.h" #include "ladspacore.h" #include "gettext.h" static GHashTable *effect_list; static int descriptor_to_index(LADSPA_PortDescriptor pdesc) { int j; if ((pdesc & LADSPA_PORT_INPUT) != 0) j=0; else if ((pdesc & LADSPA_PORT_OUTPUT) != 0) j=1; else return -1; if ((pdesc & LADSPA_PORT_CONTROL) != 0) return j; else if ((pdesc & LADSPA_PORT_AUDIO) != 0) return j+2; else return -1; } static void scan_file(gchar *filename, gchar *basename, gboolean do_check) { void *p; LADSPA_Descriptor_Function func; gchar *msg,*c; gint i,j; int k[4]; unsigned long l; const LADSPA_Descriptor *desc; LadspaEffect *eff; p = dlopen(filename,RTLD_NOW); if (p == NULL) { console_message(dlerror()); return; } func = dlsym(p,"ladspa_descriptor"); if (func == NULL) { msg = g_strdup_printf("%s: ladspa_descriptor: %s", basename,dlerror()); console_message(msg); g_free(msg); dlclose(p); return; } i=0; while (1) { outer: desc = func(i); if (desc == NULL) break; c = g_strdup_printf("%ld_%s",(long int)desc->UniqueID,basename); if (do_check && g_hash_table_lookup(effect_list,c) != NULL) { g_free(c); i++; continue; } eff = g_malloc0(sizeof(*eff)); eff->id = c; eff->filename = g_strdup(filename); eff->effect_number = i++; eff->name = g_strdup(desc->Name); eff->maker = g_strdup(desc->Maker); eff->copyright = g_strdup(desc->Copyright); for (l=0; lPortCount; l++) { j = descriptor_to_index(desc->PortDescriptors[l]); if (j < 0) { msg = g_strdup_printf(_("Effect %s contains " "invalid port %s"),eff->name, desc->PortNames[l]); console_message(msg); g_free(msg); g_free(eff->id); g_free(eff->filename); g_free(eff->name); g_free(eff->maker); g_free(eff->copyright); g_free(eff); goto outer; } eff->numports[j]++; } for (j=0; j<4; j++) if (eff->numports[j] > 0) eff->ports[j] = g_malloc(eff->numports[j] * sizeof(LadspaPort)); k[0] = k[1] = k[2] = k[3] = 0; for (l=0; lPortCount; l++) { j = descriptor_to_index(desc->PortDescriptors[l]); if (j < 0) continue; eff->ports[j][k[j]].number = l; eff->ports[j][k[j]].name = g_strdup(desc->PortNames[l]); memcpy(&(eff->ports[j][k[j]].prh), &(desc->PortRangeHints[l]), sizeof(LADSPA_PortRangeHint)); k[j] ++; } g_hash_table_insert(effect_list,eff->id,eff); } dlclose(p); } static void scan_directory(gchar *dir, gpointer dummy) { DIR *d; struct dirent *de; int i; gchar *fn,*msg; char *cur_lc_numeric; d = opendir(dir); if (d == NULL) { if (errno != ENOENT) { msg = g_strdup_printf(_("Ladspa: Error scanning %s"),dir); console_perror(msg); g_free(msg); } return; } /* Some LADSPA plugins resets LC_NUMERIC setting, * so we need to save it. */ cur_lc_numeric = setlocale(LC_NUMERIC, NULL); while (1) { de = readdir(d); if (de == NULL) break; i = strlen(de->d_name); if (i<4 || strcmp(de->d_name + i-3, ".so")) continue; fn = g_strdup_printf("%s/%s",dir,de->d_name); scan_file(fn,de->d_name,FALSE); g_free(fn); } closedir(d); /* Restore LC_NUMERIC setting. */ setlocale(LC_NUMERIC, cur_lc_numeric); } static gboolean ladspa_cleanup_func(gpointer key, gpointer value, gpointer user_data) { int i,j; LadspaEffect *eff; eff = (LadspaEffect *)value; g_free(eff->id); g_free(eff->name); g_free(eff->filename); g_free(eff->maker); g_free(eff->copyright); for (i=0; i<4; i++) { for (j=0; jnumports[i]; j++) g_free(eff->ports[i][j].name); g_free(eff->ports[i]); } g_free(eff); /* eff->id == value, so no need to free value again */ return TRUE; } static void ladspa_cleanup(void) { if (effect_list == NULL) return; g_hash_table_foreach_remove(effect_list, ladspa_cleanup_func, NULL); g_hash_table_destroy(effect_list); effect_list = NULL; } static void ladspa_path_foreach(void (*function)(gchar *dirname, gpointer user_data), gpointer user_data) { gchar *p,*c; p = getenv("LADSPA_PATH"); if (p == NULL) { p = DEFAULT_LADSPA_PATH; /* console_message(_("Environment variable LADSPA_PATH not set.\n" "LADSPA support is disabled.")); return; */ } p = g_strdup(p); c = strtok(p,":"); while (c != NULL) { function(c,user_data); c = strtok(NULL,":"); } free(p); } void ladspa_rescan(void) { ladspa_cleanup(); effect_list = g_hash_table_new(g_str_hash,g_str_equal); ladspa_path_foreach(scan_directory,NULL); } static void foreach_func(gpointer key, gpointer value, gpointer user_data) { void (*func)(void *) = (void (*)(void *))user_data; func(value); } void ladspa_foreach_effect(void (*func)(LadspaEffect *eff)) { g_hash_table_foreach(effect_list,foreach_func,func); } void find_effect_func(gchar *dirname, gpointer user_data) { gchar *fn = (gchar *)user_data; gchar *c; c = g_strdup_printf("%s/%s",dirname,fn); if (file_exists(c)) scan_file(c,fn,TRUE); g_free(c); } LadspaEffect *ladspa_find_effect(gchar *id) { LadspaEffect *eff; gchar *c,*d,*e; unsigned long unid; if (effect_list == NULL) effect_list = g_hash_table_new(g_str_hash,g_str_equal); eff = (LadspaEffect *)g_hash_table_lookup(effect_list,id); if (eff != NULL) return eff; /* Parse the ID to get uniqueID and filename */ c = g_strdup(id); d = strchr(c,'_'); if (d == NULL) { g_free(c); return NULL; } *d = 0; d++; /* c should now be UniqueID, d filename. g_free(c) frees both c & d */ unid = strtoul(c,&e,10); if (*e != 0) { g_free(c); return NULL; } /* Search for the file and add it's effects if found */ ladspa_path_foreach(find_effect_func,d); g_free(c); /* Try again */ eff = (LadspaEffect *)g_hash_table_lookup(effect_list,id); return eff; } static LadspaEffect *processing_effect; static const LADSPA_Descriptor *processing_desc; static LADSPA_Handle processing_handle; static sample_t *processing_outbuf; static gboolean ladspa_filter_proc(void *in, guint sample_size, chunk_writeout_func out_func, WriteoutID id, Dataformat *format) { sample_t *s = (sample_t *)in; guint chans = format->channels; guint frames = sample_size / (sizeof(sample_t)*chans); guint i,j,k,m; int l; float *b; for (i=0; inumports[2]; k++) { l = processing_effect->ports[2][k].map; if (l < 0) continue; b = processing_effect->ports[2][k].buffer; #ifndef USE_DOUBLE_SAMPLES if (chans == 1) { memcpy(b,&s[i],j*sizeof(float)); continue; } #endif for (m=0; mrun(processing_handle,j); /* Get output */ /* Copy the input to use as default (a little inefficient, I know..) */ if (processing_effect->keep) memcpy(processing_outbuf,&s[i],j*chans*sizeof(sample_t)); else memset(processing_outbuf,0,j*chans*sizeof(sample_t)); for (k=0; k < processing_effect->numports[3]; k++) { l = processing_effect->ports[3][k].map; if (l < 0) continue; b = processing_effect->ports[3][k].buffer; #ifndef USE_DOUBLE_SAMPLES if (chans == 1) { memcpy(processing_outbuf,b,j*sizeof(float)); continue; } #endif for (m=0; mfilename,RTLD_LAZY); if (p == NULL) { user_error(dlerror()); return NULL; } func = dlsym(p,"ladspa_descriptor"); if (func == NULL) { c = g_strdup_printf("%s: ladspa_descriptor: %s",eff->filename, dlerror()); user_error(c); g_free(c); dlclose(p); setlocale(LC_NUMERIC, cur_lc_numeric); return NULL; } desc = func(eff->effect_number); g_assert(desc != NULL); hand = desc->instantiate(desc,chunk->format.samplerate); /* Connect ports */ for (i=0; i<2; i++) for (j=0; jnumports[i]; j++) { f = eff->ports[i][j].value; desc->connect_port(hand,eff->ports[i][j].number, &(eff->ports[i][j].value)); eff->ports[i][j].value = f; } for (i=2; i<4; i++) for (j=0; jnumports[i]; j++) { eff->ports[i][j].buffer = g_malloc(1024*sizeof(float)); desc->connect_port(hand,eff->ports[i][j].number, eff->ports[i][j].buffer); if (i == 2 && eff->ports[i][j].map == -1) for (k=0; k<1024; k++) eff->ports[i][j].buffer[k] = eff->ports[i][j].value; } /* Apply effect */ processing_effect = eff; processing_desc = desc; processing_handle = hand; processing_outbuf = g_malloc(1024*chunk->format.channels* sizeof(sample_t)); if (desc->activate != NULL) desc->activate(hand); c = g_strdup_printf(_("Applying effect '%s'"),eff->name); r = chunk_filter(chunk, ladspa_filter_proc, NULL, CHUNK_FILTER_MANY, TRUE, dither_mode, bar, c); g_free(c); if (desc->deactivate != NULL) desc->deactivate(hand); if (desc->cleanup != NULL) desc->cleanup(hand); dlclose(p); g_free(processing_outbuf); for (i=2; i<4; i++) for (j=0; jnumports[i]; j++) g_free(eff->ports[i][j].buffer); /* Restore LC_NUMERIC setting. */ setlocale(LC_NUMERIC, cur_lc_numeric); return r; } #endif /* HAVE_LADSPA */ mhwaveedit-1.4.24/src/ladspacore.h000066400000000000000000000046031334022513400170140ustar00rootroot00000000000000/* * Copyright (C) 2004 2007, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #ifndef LADSPACORE_H_INCLUDED #define LADSPACORE_H_INCLUDED #if defined(HAVE_SYS_LADSPA_H) #include #else #include "../ext/ladspa.h" #endif #include "chunk.h" typedef struct { gchar *name; unsigned long number; LADSPA_PortRangeHint prh; /* This data should be set before running ladspa_run_effect */ /* For audio ports only, which channel to map to. * Audio input - Which channel of input sound to send here or -1 for * sending a constant value (specified in value). * Audio output - Which channel of output sound to put this in or * -1 to ignore. */ int map; /* For output control ports - set after running. * For input control ports - value to set. * For output audio ports - ignored * For input audio ports - if map == -1, constant to emit */ float value; /* Data used by ladspa_run_effect */ float *buffer; } LadspaPort; typedef struct { gchar *id,*name,*filename; guint effect_number; gchar *maker,*copyright; /* 0 = control input, 1 = control output, * 2 = audio input, 3 = audio output */ int numports[4]; LadspaPort *ports[4]; gboolean keep; } LadspaEffect; void ladspa_rescan(void); LadspaEffect *ladspa_find_effect(gchar *id); void ladspa_foreach_effect(void (*func)(LadspaEffect *eff)); /* Note: The parameters to this effect are arranged so this function can be * used as a callback for mainwindow_effect_manual */ Chunk *ladspa_run_effect(Chunk *chunk, StatusBar *bar, LadspaEffect *f, int dither_mode); #endif mhwaveedit-1.4.24/src/ladspadialog.c000066400000000000000000000330461334022513400173210ustar00rootroot00000000000000/* * Copyright (C) 2004 2005 2007 2008 2011, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include #include #include "inifile.h" #include "ladspadialog.h" #include "effectbrowser.h" #include "int_box.h" #include "float_box.h" #include "um.h" #include "combo.h" #include "gettext.h" static gchar *first_effect = NULL; gchar *ladspa_dialog_first_effect(void) { return first_effect; } #if defined(HAVE_LADSPA) GtkObjectClass *parent_class; gboolean ladspa_dialog_apply(EffectDialog *ed) { LadspaDialog *ld = LADSPA_DIALOG(ed); guint i,j,k; Intbox *ib; Floatbox *fb; GtkToggleButton *tb; gchar *c,*d; gboolean output_mapped[8] = { 0 }; gboolean res,is_tb; float f,l,u; Document *doc = EFFECT_BROWSER(ed->eb)->dl->selected; Chunk *chunk = doc->chunk; LADSPA_PortRangeHintDescriptor prhd; for (i=0; ieffect->numports[0]; i++) { is_tb = FALSE; if (IS_INTBOX(ld->settings[0][i])) { ib = INTBOX(ld->settings[0][i]); if (intbox_check(ib)) return TRUE; f = (float)ib->val; } else if (IS_FLOATBOX(ld->settings[0][i])) { fb = FLOATBOX(ld->settings[0][i]); if (floatbox_check(fb)) return TRUE; f = fb->val; } else { /* Must be a togglebutton */ tb = GTK_TOGGLE_BUTTON(ld->settings[0][i]); if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(tb))) f = 1.0; else f = 0.0; is_tb = TRUE; } prhd = ld->effect->ports[0][i].prh.HintDescriptor; l = ld->effect->ports[0][i].prh.LowerBound; u = ld->effect->ports[0][i].prh.UpperBound; if (LADSPA_IS_HINT_SAMPLE_RATE(prhd)) { l *= (gfloat)chunk->format.samplerate; u *= (gfloat)chunk->format.samplerate; } if (LADSPA_IS_HINT_BOUNDED_BELOW(prhd) && f < l) { c = g_strdup_printf(_("Value for '%s' must not be below %f"), ld->effect->ports[0][i].name,l); user_error(c); g_free(c); return TRUE; } if (LADSPA_IS_HINT_BOUNDED_ABOVE(prhd) && f > u) { c = g_strdup_printf(_("Value for '%s' must not be above %f"), ld->effect->ports[0][i].name, u); user_error(c); g_free(c); return TRUE; } c = g_strdup_printf("ladspa_%s_defaultControl%d",ld->effect->id,i); if (is_tb) inifile_set_gboolean(c, f != 0.0); else inifile_set_gfloat(c, f); ld->effect->ports[0][i].value = f; } for (j=2; j<4; j++) for (i=0; ieffect->numports[j]; i++) { k = combo_selected_index(COMBO(ld->settings[j][i])); d = g_strdup_printf("ladspa_%s_default%s%d",ld->effect->id, (j==2)?"Input":"Output",i); if (k >= ld->channels) { ld->effect->ports[j][i].map = -1; ld->effect->ports[j][i].value = 0.0; inifile_set_gint32(d,-1); g_free(d); continue; } g_assert(ld->channels == chunk->format.channels); g_assert(k < ld->channels); if (j==3){ if (output_mapped[k]) { g_free(d); d = g_strdup_printf (_("You have mapped more than one " "output port to channel '%s'. You " "can only map one output port to " "each channel."),channel_name(k,ld->channels)); user_error(d); g_free(d); return TRUE; } else output_mapped[k] = TRUE; } ld->effect->ports[j][i].map = k; inifile_set_guint32(d,k); g_free(d); } ld->effect->keep = gtk_toggle_button_get_active(ld->keep); c = g_strdup_printf("ladspa_%s_defaultKeep",ld->effect->id); inifile_set_gboolean(c,ld->effect->keep); g_free(c); res = document_apply_cb(doc, (document_apply_proc)ladspa_run_effect, TRUE,ld->effect); if (res) return TRUE; for (i=0; ieffect->numports[1]; i++) { c = g_strdup_printf("%f",ld->effect->ports[1][i].value); gtk_label_set_text(GTK_LABEL(ld->settings[1][i]), c); g_free(c); } return FALSE; } static void ladspa_dialog_target_changed(EffectDialog *ed) { LadspaDialog *ld = LADSPA_DIALOG(ed); EffectBrowser *eb = EFFECT_BROWSER(ed->eb); /* puts("ladspa_dialog_target_changed"); */ if (ld->channels != eb->dl->format.channels) effect_browser_invalidate_effect(eb,ld->effect->id,'L'); } void ladspa_dialog_setup(EffectDialog *ed) { LadspaDialog *ld = LADSPA_DIALOG(ed); LadspaEffect *eff; GtkWidget *a,*b,*c,*d,*e,*x; guint i,k,n,q; gint j; float f,u,l; GList *li; gchar *ch; gboolean bo,want_scale; Dataformat *format = &(EFFECT_BROWSER(ed->eb)->dl->format); LADSPA_PortRangeHintDescriptor prhd; /* puts("ladspa_dialog_setup"); */ ld->effect = eff = ladspa_find_effect(ed->effect_name); g_assert(eff != NULL); a = gtk_table_new(8,2,FALSE); gtk_container_add(ed->input_area, a); b = gtk_label_new(eff->name); gtk_table_attach(GTK_TABLE(a),b,0,2,0,1,GTK_FILL|GTK_SHRINK,0,0,0); gtk_misc_set_alignment(GTK_MISC(b),0.0,0.5); ch = g_strdup_printf(_("Author: %s"),eff->maker); b = gtk_label_new(ch); g_free(ch); gtk_table_attach(GTK_TABLE(a),b,0,2,1,2,GTK_FILL|GTK_SHRINK,0,0,0); gtk_misc_set_alignment(GTK_MISC(b),0.0,0.5); ch = g_strdup_printf(_("Copyright: %s"),eff->copyright); b = gtk_label_new(ch); g_free(ch); gtk_table_attach(GTK_TABLE(a),b,0,2,2,3,GTK_FILL|GTK_SHRINK,0,0,0); gtk_misc_set_alignment(GTK_MISC(b),0.0,0.5); if (eff->numports[0] > 0) { ld->settings[0] = g_malloc(eff->numports[0] * sizeof(GtkWidget *)); b = gtk_frame_new(_(" Input controls ")); gtk_table_attach(GTK_TABLE(a),b,0,1,3,4,GTK_FILL,0,0,8); c = gtk_vbox_new(FALSE,3); gtk_container_add(GTK_CONTAINER(b),c); gtk_container_set_border_width(GTK_CONTAINER(c),4); for (i=0; inumports[0]; i++) { prhd = eff->ports[0][i].prh.HintDescriptor; ch = g_strdup_printf("ladspa_%s_defaultControl%d",eff->id,i); if (LADSPA_IS_HINT_TOGGLED(prhd)) { d=gtk_check_button_new_with_label(eff->ports[0][i].name); bo = LADSPA_IS_HINT_DEFAULT_1(prhd); bo = inifile_get_gboolean(ch,bo); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(d), LADSPA_IS_HINT_DEFAULT_1(prhd)); gtk_box_pack_start(GTK_BOX(c),d,FALSE,FALSE,0); ld->settings[0][i] = d; } else { d = gtk_hbox_new(FALSE,3); gtk_box_pack_start(GTK_BOX(c),d,FALSE,FALSE,0); e = gtk_label_new(eff->ports[0][i].name); gtk_box_pack_start(GTK_BOX(d),e,FALSE,FALSE,0); u = eff->ports[0][i].prh.UpperBound; l = eff->ports[0][i].prh.LowerBound; if (LADSPA_IS_HINT_SAMPLE_RATE(prhd)) { u *= format->samplerate; l *= format->samplerate; } if (LADSPA_IS_HINT_DEFAULT_MINIMUM(prhd)) f=l; else if (LADSPA_IS_HINT_DEFAULT_LOW(prhd)) { if (LADSPA_IS_HINT_LOGARITHMIC(prhd)) f = exp(log(l)*0.75+log(u)*0.25); else f = l*0.75 + u*0.25; } else if (LADSPA_IS_HINT_DEFAULT_MIDDLE(prhd)) { if (LADSPA_IS_HINT_LOGARITHMIC(prhd)) f = exp(log(l)*0.5 + log(u)*0.5); else f = l*0.5 + u*0.5; } else if (LADSPA_IS_HINT_DEFAULT_HIGH(prhd)) { if (LADSPA_IS_HINT_LOGARITHMIC(prhd)) f = exp(log(l)*0.25+log(u)*0.75); else f = l*0.25 + u*0.75; } else if (LADSPA_IS_HINT_DEFAULT_MAXIMUM(prhd)) f=u; else if (LADSPA_IS_HINT_DEFAULT_0(prhd)) f=0.0; else if (LADSPA_IS_HINT_DEFAULT_1(prhd)) f=1.0; else if (LADSPA_IS_HINT_DEFAULT_100(prhd)) f=100.0; else if (LADSPA_IS_HINT_DEFAULT_440(prhd)) f=440.0; else if (LADSPA_IS_HINT_BOUNDED_BELOW(prhd)) f=l; else if (LADSPA_IS_HINT_BOUNDED_ABOVE(prhd)) f=u; else f=0.0; f = inifile_get_gfloat(ch,f); want_scale = (LADSPA_IS_HINT_BOUNDED_BELOW(prhd) && LADSPA_IS_HINT_BOUNDED_ABOVE(prhd)); if (LADSPA_IS_HINT_INTEGER(prhd)) { e = intbox_new((long)f); if (want_scale) { x = intbox_create_scale(INTBOX(e),(long)l, (long)u); gtk_box_pack_end(GTK_BOX(d),x,FALSE,FALSE,0); gtk_widget_set_can_focus(x,FALSE); } } else { e = floatbox_new(f); if (want_scale) { x = floatbox_create_scale(FLOATBOX(e),l,u); gtk_box_pack_end(GTK_BOX(d),x,FALSE,FALSE,0); gtk_widget_set_can_focus(x,FALSE); } } ld->settings[0][i] = e; gtk_box_pack_end(GTK_BOX(d),e,FALSE,FALSE,0); } g_free(ch); } } else ld->settings[0] = NULL; k = format->channels; ld->channels = k; if (eff->numports[1] > 0) { ld->settings[1] = g_malloc(eff->numports[1] * sizeof(GtkWidget *)); b = gtk_frame_new(_(" Output controls ")); gtk_table_attach(GTK_TABLE(a),b,0,1,4,5,GTK_FILL,0,0,8); c = gtk_vbox_new(FALSE,3); gtk_container_add(GTK_CONTAINER(b),c); gtk_container_set_border_width(GTK_CONTAINER(c),4); for (i=0; inumports[1]; i++) { d = gtk_hbox_new(FALSE,3); gtk_box_pack_start(GTK_BOX(c),d,FALSE,FALSE,0); e = gtk_label_new(eff->ports[1][i].name); gtk_box_pack_start(GTK_BOX(d),e,FALSE,FALSE,0); e = gtk_label_new("--"); ld->settings[1][i] = e; gtk_box_pack_end(GTK_BOX(d),e,FALSE,FALSE,0); } } else ld->settings[1] = NULL; li = NULL; for (j=0; jnumports[n+2] == 0) { ld->settings[n+2] = NULL; continue; } ld->settings[n+2] = g_malloc(eff->numports[n+2]*sizeof(GtkWidget *)); b = gtk_frame_new(n==0 ? _(" Input audio ") : _(" Output audio ")); gtk_table_attach(GTK_TABLE(a),b,0,1,5+n,6+n,GTK_FILL,0,0,8); c = gtk_vbox_new(FALSE,3); gtk_container_add(GTK_CONTAINER(b),c); gtk_container_set_border_width(GTK_CONTAINER(c),4); for (i=0; inumports[n+2]; i++) { d = gtk_hbox_new(FALSE,3); gtk_box_pack_start(GTK_BOX(c),d,FALSE,FALSE,0); e = gtk_label_new(eff->ports[n+2][i].name); gtk_box_pack_start(GTK_BOX(d),e,FALSE,FALSE,0); e = combo_new(); ld->settings[n+2][i] = e; gtk_box_pack_end(GTK_BOX(d),e,FALSE,FALSE,0); ch = g_strdup_printf("ladspa_%s_default%s%d",eff->id, (n==0)?"Input":"Output",i); q = (i < k) ? i : k; j = inifile_get_gint32(ch,q); g_free(ch); if (j <= -1) j = k; else if (j >= k) { j = q; } combo_set_items(COMBO(e),li,j); } } g_list_foreach(li,(GFunc)g_free,NULL); g_list_free(li); b = gtk_check_button_new_with_label(_("Keep data in unmapped output " "channels")); gtk_table_attach(GTK_TABLE(a),b,0,2,7,8,GTK_FILL,0,0,0); ch = g_strdup_printf("ladspa_%s_defaultKeep",ld->effect->id); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(b), inifile_get_gboolean(ch,TRUE)); g_free(ch); ld->keep = GTK_TOGGLE_BUTTON(b); gtk_widget_show_all(a); } static void ladspa_dialog_destroy(GtkObject *obj) { LadspaDialog *ld = LADSPA_DIALOG(obj); /* puts("ladspa_dialog_destroy"); */ guint i; for (i=0; i<4; i++) { g_free(ld->settings[i]); ld->settings[i] = NULL; } parent_class->destroy(obj); } void ladspa_dialog_class_init(GtkObjectClass *klass) { parent_class = gtk_type_class(effect_dialog_get_type()); EFFECT_DIALOG_CLASS(klass)->apply = ladspa_dialog_apply; EFFECT_DIALOG_CLASS(klass)->setup = ladspa_dialog_setup; EFFECT_DIALOG_CLASS(klass)->target_changed = ladspa_dialog_target_changed; klass->destroy = ladspa_dialog_destroy; } void ladspa_dialog_init(GtkObject *obj) { /* Wait with initialisation until the setup signal */ } GtkType ladspa_dialog_get_type(void) { static GtkType id=0; if (!id) { GtkTypeInfo info = { "LadspaDialog", sizeof(LadspaDialog), sizeof(LadspaDialogClass), (GtkClassInitFunc)ladspa_dialog_class_init, (GtkObjectInitFunc)ladspa_dialog_init }; id = gtk_type_unique(effect_dialog_get_type(),&info); } return id; } static void register_func(LadspaEffect *eff) { effect_register_add_effect('L', eff->id, eff->name, eff->maker, eff->filename); if (first_effect == NULL) first_effect = eff->id; } static void ladspa_dialog_rebuild(gchar source_tag, gpointer user_data) { ladspa_rescan(); ladspa_foreach_effect(register_func); } static EffectDialog *ladspa_dialog_get(gchar *name, gchar source_tag, gpointer user_data) { if (ladspa_find_effect(name) == NULL) return NULL; return EFFECT_DIALOG(gtk_type_new(ladspa_dialog_get_type())); } void ladspa_dialog_register(void) { effect_register_add_source("LADSPA Plugin",'L',ladspa_dialog_rebuild, NULL,ladspa_dialog_get,NULL); } #else /* matches #if defined(HAVE_LADSPA) */ void ladspa_dialog_register(void) { } #endif /* defined(HAVE_LADSPA) */ mhwaveedit-1.4.24/src/ladspadialog.h000066400000000000000000000031321334022513400173170ustar00rootroot00000000000000/* * Copyright (C) 2004 2005, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #ifndef LADSPADIALOG_H_INCLUDED #define LADSPADIALOG_H_INCLUDED #ifdef HAVE_LADSPA #include "effectdialog.h" #include "ladspacore.h" #define LADSPA_DIALOG(obj) GTK_CHECK_CAST(obj,ladspa_dialog_get_type(),LadspaDialog) #define LADSPA_DIALOG_CLASS(klass) GTK_CHECK_CLASS_CAST(klass,ladspa_dialog_get_type(),LadspaDialogClass) #define IS_LADSPA_DIALOG(obj) GTK_CHECK_TYPE(obj,ladspa_dialog_get_type()) typedef struct { EffectDialog ed; LadspaEffect *effect; guint channels; GtkWidget **settings[4]; GtkToggleButton *keep; } LadspaDialog; typedef struct { EffectDialogClass edc; } LadspaDialogClass; GtkType ladspa_dialog_get_type(void); #endif /* HAVE_LADSPA */ void ladspa_dialog_register(void); gchar *ladspa_dialog_first_effect(void); #endif /* LADSPADIALOG_H_INCLUDED */ mhwaveedit-1.4.24/src/listobject.c000066400000000000000000000112011334022513400170240ustar00rootroot00000000000000/* * Copyright (C) 2004 2009, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include #include #include "main.h" #include "listobject.h" enum { ITEM_ADDED_SIGNAL, ITEM_REMOVED_SIGNAL, ITEM_NOTIFY_SIGNAL, LAST_SIGNAL }; static guint list_object_signals[LAST_SIGNAL] = { 0 }; static GtkObjectClass *parent_class; static void list_object_destroy(GtkObject *obj) { ListObject *lo = LIST_OBJECT(obj); list_object_clear(lo,FALSE); } static void list_object_class_init(GtkObjectClass *klass) { ListObjectClass *loc = LIST_OBJECT_CLASS(klass); parent_class = gtk_type_class( gtk_object_get_type() ); klass->destroy = list_object_destroy; loc->item_removed = NULL; loc->item_added = NULL; list_object_signals[ITEM_ADDED_SIGNAL] = gtk_signal_new("item-added", GTK_RUN_FIRST, GTK_CLASS_TYPE(klass), GTK_SIGNAL_OFFSET(ListObjectClass,item_added), gtk_marshal_NONE__POINTER, GTK_TYPE_NONE, 1, GTK_TYPE_POINTER); list_object_signals[ITEM_REMOVED_SIGNAL] = gtk_signal_new("item-removed", GTK_RUN_FIRST, GTK_CLASS_TYPE(klass), GTK_SIGNAL_OFFSET(ListObjectClass,item_removed), gtk_marshal_NONE__POINTER, GTK_TYPE_NONE, 1, GTK_TYPE_POINTER); list_object_signals[ITEM_NOTIFY_SIGNAL] = gtk_signal_new("item-notify", GTK_RUN_FIRST, GTK_CLASS_TYPE(klass), GTK_SIGNAL_OFFSET(ListObjectClass,item_notify), gtk_marshal_NONE__POINTER, GTK_TYPE_NONE, 1, GTK_TYPE_POINTER); gtk_object_class_add_signals(klass,list_object_signals,LAST_SIGNAL); } static void list_object_init(GtkObject *obj) { ListObject *lo = LIST_OBJECT(obj); lo->list = NULL; lo->do_ref = FALSE; } GtkType list_object_get_type(void) { static GtkType id=0; if (!id) { GtkTypeInfo info = { "ListObject", sizeof(ListObject), sizeof(ListObjectClass), (GtkClassInitFunc) list_object_class_init, (GtkObjectInitFunc) list_object_init }; id = gtk_type_unique( gtk_object_get_type(), &info ); } return id; } ListObject *list_object_new(gboolean do_ref) { ListObject *lo = gtk_type_new(list_object_get_type()); lo->do_ref = do_ref; return lo; } ListObject *list_object_new_from_list(GList *list, gboolean do_ref) { ListObject *lo = gtk_type_new(list_object_get_type()); lo->do_ref = do_ref; lo->list = list; if (do_ref) { g_list_foreach(list,(GFunc)gtk_object_ref,NULL); g_list_foreach(list,(GFunc)gtk_object_sink,NULL); } return lo; } void list_object_add(ListObject *lo, gpointer ptr) { lo->list = g_list_append(lo->list, ptr); if (lo->do_ref) { gtk_object_ref(GTK_OBJECT(ptr)); gtk_object_sink(GTK_OBJECT(ptr)); } gtk_signal_emit(GTK_OBJECT(lo),list_object_signals[ITEM_ADDED_SIGNAL], ptr); } gboolean list_object_remove(ListObject *lo, gpointer ptr) { GList *l; l = g_list_find(lo->list,ptr); if (l == NULL) return FALSE; lo->list = g_list_remove_link( lo->list, l ); gtk_signal_emit(GTK_OBJECT(lo),list_object_signals[ITEM_REMOVED_SIGNAL], ptr); if (lo->do_ref) gtk_object_unref(GTK_OBJECT(ptr)); g_list_free_1(l); return TRUE; } void list_object_notify(ListObject *lo, gpointer ptr) { gtk_signal_emit(GTK_OBJECT(lo),list_object_signals[ITEM_NOTIFY_SIGNAL], ptr); } void list_object_clear(ListObject *lo, gboolean do_signal) { GList *l; if (do_signal) while (lo->list != NULL) list_object_remove(lo,lo->list->data); else { l = lo->list; lo->list = NULL; if (lo->do_ref) g_list_foreach(l,(GFunc)gtk_object_unref,NULL); g_list_free(l); } } guint list_object_get_size(ListObject *lo) { return g_list_length(lo->list); } gpointer list_object_get(ListObject *lo, guint index) { return g_list_nth_data(lo->list, index); } void list_object_foreach(ListObject *lo, GFunc func, gpointer user_data) { g_list_foreach(lo->list,func,user_data); } mhwaveedit-1.4.24/src/listobject.h000066400000000000000000000056761334022513400170540ustar00rootroot00000000000000/* * Copyright (C) 2004 2009, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ /* This is a GtkObject wrapper around GList with notification signals * and optional automatic refcounting for GtkObjects. */ #ifndef LISTOBJECT_H_INCLUDED #define LISTOBJECT_H_INCLUDED #define LIST_OBJECT(obj) GTK_CHECK_CAST(obj,list_object_get_type(),ListObject) #define LIST_OBJECT_CLASS(klass) GTK_CHECK_CLASS_CAST(klass,list_object_get_type(),ListObjectClass) #define IS_LIST_OBJECT(obj) GTK_CHECK_TYPE(obj,list_object_get_type()) typedef struct { GtkObject obj; /* */ GList *list; gboolean do_ref; } ListObject; typedef struct { GtkObjectClass obj_class; /* Signal sent directly after one item has been removed * The signal is sent before dereferencing the object (if do_ref) */ void (*item_removed)(ListObject *,gpointer); /* Signal sent directly after one item has been added */ void (*item_added)(ListObject *,gpointer); /* General "notification" signal */ void (*item_notify)(ListObject *,gpointer); } ListObjectClass; GtkType list_object_get_type(void); /* Creates a new ListObject * do_ref: Enable automatic referencing/derefencing - should only be used * if the list just contains GtkObjects */ ListObject *list_object_new(gboolean do_ref); /* Creates a new ListObject from an existing list. The list is "taken over" * by the new object so it should not be changed or freed afterwards. */ ListObject *list_object_new_from_list(GList *l, gboolean do_ref); /* Adds ptr to the list. */ void list_object_add(ListObject *lo, gpointer ptr); /* Removes ptr from the list. Returns TRUE if something was removed. */ gboolean list_object_remove(ListObject *lo, gpointer ptr); /* Sends the notify signal */ void list_object_notify(ListObject *lo, gpointer ptr); /* Returns the number of items in the list */ guint list_object_get_size(ListObject *lo); /* Gets an item from the list */ gpointer list_object_get(ListObject *lo, guint index); void list_object_foreach(ListObject *lo, GFunc func, gpointer user_data); /* Clears the list. do_signal: Whether the item-removed signal should be sent for each object. */ void list_object_clear(ListObject *lo, gboolean do_signal); #endif mhwaveedit-1.4.24/src/main.c000066400000000000000000000770651334022513400156320ustar00rootroot00000000000000/* * Copyright (C) 2002 2003 2004 2005 2007 2008 2010 2011 2012, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include #include #include #include #include #include #include #include #include #include #include #include "mainloop.h" #include "mainwindow.h" #include "datasource.h" #include "player.h" #include "chunk.h" #include "sound.h" #include "main.h" #include "inifile.h" #include "um.h" #include "effectbrowser.h" #include "soxdialog.h" #include "statusbar.h" #include "ladspadialog.h" #include "gettext.h" #include "session.h" #ifdef HAVE_SCHED_H #include #endif GdkPixmap *icon = NULL; gboolean quitflag; gboolean quality_mode = TRUE; gchar *driver_option = NULL; int dither_editing; int dither_playback; const char *strip_context(const char *s) { const char *c; if (s[0] == '|') { c = strchr(s+1,'|'); if (c != NULL) return c+1; } return s; } static int idle_work(gpointer csource, gpointer user_data) { if (!idle_work_flag) { idle_work_flag = TRUE; return 1; } if (status_bar_progress_count() > 0) return 1; if (mainwindow_update_caches()) return 1; return -1; } #if GTK_MAJOR_VERSION == 1 void gdk_gc_set_rgb_fg_color(GdkGC *gc, GdkColor *clr) { static GdkColor cached = {0,-1,-1,-1}; if (clr->red == cached.red && clr->green == cached.green && clr->blue == cached.blue) clr->pixel = cached.pixel; else { gdk_colormap_alloc_color(gdk_colormap_get_system(), clr,FALSE,TRUE); memcpy(&cached,clr,sizeof(cached)); } gdk_gc_set_foreground(gc, clr); } #endif #if GTK_MAJOR_VERSION == 1 || (GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION < 18) void gtk_widget_set_has_window(GtkWidget *w, gboolean has_window) { if (!has_window) GTK_WIDGET_SET_FLAGS(w,GTK_NO_WINDOW); else GTK_WIDGET_UNSET_FLAGS(w,GTK_NO_WINDOW); } void gtk_widget_set_can_focus(GtkWidget *w, gboolean can_focus) { if (!can_focus) GTK_WIDGET_SET_FLAGS(w,GTK_CAN_FOCUS); else GTK_WIDGET_UNSET_FLAGS(w,GTK_CAN_FOCUS); } #endif int main(int argc, char **argv) { int i; int wavefile_count=0; gboolean ladspa = TRUE; gboolean b; gchar *c; /* Some versions of the aRts C library call g_thread_init internally, * and that confuses GLib2's memory allocation stuff. */ #ifdef HAVE_GTHREAD g_thread_init(NULL); #endif /* Set default locale */ setlocale(LC_ALL,""); /* This must be the same for all locales */ setlocale(LC_NUMERIC, "POSIX"); /* Disable gtk's ability to set the locale. */ /* If gtk is allowed to set the locale, then it will override the above */ /* setlocale for LC_NUMERIC. */ #if GTK_MAJOR_VERSION == 2 gtk_disable_setlocale(); #endif #ifdef ENABLE_NLS /* Setup message domain */ bindtextdomain("mhwaveedit", LOCALEDIR); textdomain("mhwaveedit"); #if GTK_MAJOR_VERSION == 2 bind_textdomain_codeset("mhwaveedit", "UTF-8"); #endif #endif floating_point_check(); /* Check for "terminating" options that don't require starting GTK. */ for (i=1; i DITHER_MAX) dither_editing = DITHER_MINIMAL; dither_playback = inifile_get_gboolean("ditherPlayback",DITHER_NONE); if (dither_playback < 0 || dither_playback > DITHER_MAX) dither_playback = DITHER_NONE; sample_convert_mode = inifile_get_guint32("sampleMode",CONVERT_MODE_NOOFFS); if (sample_convert_mode < 0 || sample_convert_mode > CONVERT_MODE_MAX) sample_convert_mode = CONVERT_MODE_NOOFFS; gtk_hbutton_box_set_layout_default(GTK_BUTTONBOX_END); mainwindow_objects = list_object_new(FALSE); document_objects = list_object_new(FALSE); default_time_mode = inifile_get_guint32(INI_SETTING_TIME_DISPLAY,0); if (default_time_mode > 6) default_time_mode = 0; default_timescale_mode = inifile_get_guint32(INI_SETTING_TIME_DISPLAY_SCALE,1); if (default_timescale_mode > 6) default_time_mode = 0; /* Some color related stuff */ set_custom_colors(NULL); /* Register effects */ effect_register_init(); if (ladspa) ladspa_dialog_register(); sox_dialog_register(); um_use_gtk = TRUE; /* Search command line for filenames and create windows */ b = TRUE; for (i=1;itv_usec < y->tv_usec) { int nsec = (y->tv_usec - x->tv_usec) / 1000000 + 1; y->tv_usec -= 1000000 * nsec; y->tv_sec += nsec; } if (x->tv_usec - y->tv_usec > 1000000) { int nsec = (x->tv_usec - y->tv_usec) / 1000000; y->tv_usec += 1000000 * nsec; y->tv_sec -= nsec; } /* Compute the time remaining to wait. `tv_usec' is certainly positive. */ result->tv_sec = x->tv_sec - y->tv_sec; result->tv_usec = x->tv_usec - y->tv_usec; /* Return 1 if result is negative. */ return x->tv_sec < y->tv_sec; } gchar *get_home_directory(void) { static gchar *homedir = NULL; struct passwd *p; if (!homedir) homedir = getenv("HOME"); if (!homedir) { p = getpwuid(getuid()); if (p) homedir = p->pw_dir; } if (!homedir) { g_warning(_("Could not find home directory. Using current directory as " "home directory.")); homedir = "."; } return homedir; } static gboolean color_alloced[LAST_COLOR] = { 0 }; GdkColor color_table[LAST_COLOR]; /* old defaults GdkColor factory_default_colors[] = { { 0, 0, 0, 0 }, { 0, 0, 0, 0xFFFF }, { 0, 0xFFFF, 0, 0 }, { 0, 0x8000, 0x8000, 0x8000 }, { 0, 0x0f00, 0x8400, 0x6900 }, { 0, 0xE800, 0xA500, 0x4000 }, { 0, 0xff00, 0xff00, 0xff00 }, { 0, 0x8000, 0x8000, 0x8000 } }; */ GdkColor factory_default_colors[] = { { 0, 0, 0, 0 }, { 0, 29952, 50176, 27392 }, { 0, 41216, 39936, 52992 }, { 0, 62720, 62720, 62720 }, { 0, 60160, 55552, 0 }, { 0, 43776, 11776, 0 }, { 0, 0xff00, 0xff00, 0xff00 }, { 0, 0x8000, 0x8000, 0x8000 }, { 0, 0x6200, 0x7c00, 0x5e00 } }; static GdkGC *gc_table[LAST_COLOR] = { }; gchar *color_names[] = { N_("Black"), N_("White"), N_("Background"), N_("L Waveform"), N_("R Waveform"), N_("Cursor"), N_("Marks"), N_("Selection"), N_("Progress bar"), N_("Zero-level"), N_("Buffer position") }; gchar *color_inifile_entry[] = { NULL, NULL, "colorBG", "colorWave1", "colorWave2", "colorCursor","colorMark", "colorSelection","colorProgress", "colorBars","colorBufpos" }; GdkColor *get_color(enum Color c) { if (!color_alloced[c]) { if (c == BLACK) gdk_color_black(gdk_colormap_get_system(),&color_table[c]); else if (c == WHITE) gdk_color_white(gdk_colormap_get_system(),&color_table[c]); else { gdk_colormap_alloc_color(gdk_colormap_get_system(), &color_table[c],FALSE,TRUE); } } color_alloced[c] = TRUE; return &color_table[c]; } GdkGC *get_gc(enum Color c, GtkWidget *w) { if (gc_table[c] == NULL) { gc_table[c] = gdk_gc_new(w->window); gdk_gc_set_foreground(gc_table[c],get_color(c)); } return gc_table[c]; } int hexval(gchar chr) { if (chr >= '0' && chr <= '9') return chr-'0'; else if (chr >= 'a' && chr <= 'f') return chr-'a'+10; else if (chr >= 'A' && chr <= 'F') return chr-'A'+10; else return -1; } static void parse_color(gchar *str, GdkColor *color) { unsigned int i,j,k,rgb[3]; for (i=0; i<3; i++,str+=2) { j = hexval(str[0]); if (j == -1) return; k = hexval(str[1]); if (k == -1) return; rgb[i] = j*16+k; } color->red = rgb[0] * 256; color->green = rgb[1] * 256; color->blue = rgb[2] * 256; } void set_custom_colors(GdkColor *c) { gint i; gchar *d; if (!c) { set_custom_colors(factory_default_colors); for (i=FIRST_CUSTOM_COLOR; i %s\n",color_inifile_entry[i],d); */ if (d != NULL) { /* printf("Before: %x,%x,%x\n",color_table[i].red, color_table[i].green,color_table[i].blue); */ parse_color(d,&color_table[i]); /* printf("After: %x,%x,%x\n",color_table[i].red, color_table[i].green,color_table[i].blue); */ } } } else memcpy(&color_table[FIRST_CUSTOM_COLOR],c, CUSTOM_COLOR_COUNT*sizeof(GdkColor)); memset(color_alloced,0,sizeof(color_alloced)); for (i=FIRST_CUSTOM_COLOR; i buffer_size) i=buffer_size; bufend = ((char *)buffer) + i; for (j=0; j 6) mode = 0; if (mode == 2) { g_snprintf(timebuf,50,"%05" OFF_T_FORMAT,(OFF_T_FTYPE)samples); } else if (mode < 2) { secs = (gfloat) samples / (gfloat) samplerate; mins = (guint) (secs / 60.0); hours = mins / 60; mins = mins % 60; msecs = ((guint) (secs * 1000.0)); msecs %= 60000; maxhours = samplemax / (samplerate * 3600); if (mode == 0) { if (maxhours > 0) g_snprintf(timebuf,50,"%d'%02d:%02d.%d",hours,mins, msecs/1000,(msecs%1000)/100); else g_snprintf(timebuf,50,"%02d:%02d.%d",mins, msecs/1000,(msecs%1000)/100); } else if (mode == 1) { if (maxhours > 0) g_snprintf(timebuf,50,"%d'%02d:%02d.%03d",hours,mins, msecs/1000,msecs%1000); else g_snprintf(timebuf,50,"%02d:%02d.%03d",mins, msecs/1000,msecs%1000); } else { if (maxhours > 0) g_snprintf(timebuf,50,"%d'%02d:%02d",hours,mins, msecs/1000); else g_snprintf(timebuf,50,"%02d:%02d",mins,msecs/1000); } } else { secs = (gfloat) samples / (gfloat) samplerate; if (mode == 3) { ffps=24.0; ifps=24; } else if (mode == 4) { ffps=25.0; ifps=25; } else if (mode == 5) { ffps=30.0*1.000/1.001; ifps=30; } else { ffps=30.0; ifps=30; } frames = (guint) (secs * ffps); /* Ten-minute units never need to be dropped. */ if (mode == 5) { fptm = 60*30*10 - 2*9; } else { fptm = ifps * 600; } mins = 10 * (frames / fptm); frames = frames % fptm; /* Translate the remaining frames to mins+isecs+frames */ if (mode != 5) { isecs = frames / ifps; frames %= ifps; mins += isecs / 60; isecs %= 60; } else { /* First minute is 60x30 frames */ if (frames >= 60*30) { mins ++; frames -= 60*30; /* Remaining minutes are 60x30-2 frames */ mins += frames / (60*30-2); frames %= (60*30-2); /* Skip two frames on the last minute */ frames += 2; } isecs = frames / ifps; frames %= ifps; g_assert(isecs < 60); } hours = mins / 60; mins = mins % 60; g_snprintf(timebuf,50,"%02d:%02d:%02d[%02d]", hours, mins, isecs, frames); } return timebuf; } guint default_time_mode = 100, default_timescale_mode = 100; gchar *get_time_s(guint32 samplerate, off_t samples, off_t samplemax, gchar *timebuf) { return get_time(samplerate,samples,samplemax,timebuf,-1); } gchar *get_time_l(guint32 samplerate, off_t samples, off_t samplemax, gchar *timebuf) { return get_time(samplerate,samples,samplemax,timebuf,1); } gchar *get_time_head(guint32 samplerate, off_t samples, off_t samplemax, gchar *timebuf, gint timemode) { switch (timemode) { case TIMEMODE_REAL: case TIMEMODE_REALLONG: case TIMEMODE_24FPS: case TIMEMODE_25FPS: case TIMEMODE_NTSC: case TIMEMODE_30FPS: default: return get_time(samplerate,samples,samplemax,timebuf,-1); case TIMEMODE_SAMPLES: return get_time(samplerate,samples,samplemax,timebuf, TIMEMODE_SAMPLES); } } gchar *get_time_tail(guint32 samplerate, off_t samples, off_t samplemax, gchar *timebuf, gint timemode) { off_t frameno; guint i; switch (timemode) { case TIMEMODE_REAL: return NULL; case TIMEMODE_REALLONG: i = ((samples % samplerate) * 1000) / samplerate; g_snprintf(timebuf,50,".%03d",i); return timebuf; case TIMEMODE_24FPS: i = ((samples % samplerate) * 24) / samplerate; g_snprintf(timebuf,50,"[%02d]",i); return timebuf; case TIMEMODE_25FPS: i = ((samples % samplerate) * 25) / samplerate; g_snprintf(timebuf,50,"[%02d]",i); return timebuf; case TIMEMODE_NTSC: frameno = (samples * 30 * 1000) / (samplerate * 1001); /* Remove all 10 minute blocks of 60x30x10-2x9 frames */ i = (guint) (frameno % (60*30*10-2*9)); /* Remove the first minute */ if (i >= 60*30) { i -= 60*30; /* Remove subsequent minutes */ i %= 60*30-2; /* Add drop frame in current minute to count */ i += 2; } /* Remove seconds */ i %= 30; g_snprintf(timebuf,50,"[%02d]",i); return timebuf; case TIMEMODE_30FPS: i = ((samples % samplerate) * 30) / samplerate; g_snprintf(timebuf,50,"[%02d]",i); return timebuf; default: case TIMEMODE_SAMPLES: return NULL; } } /* This table specify at which intervals big or small lines can be * drawn. */ static const gint bigsizes[] = { 1, 2, 5, 10, 20, 30, 60, 120, 180, 300, 600, 900, 1800, 3600, 36000 }; /* This table is TRUE whenever the entry in the table above is * not an even divisor in the entry that follows it. */ static const gboolean bigskip[] = { FALSE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE }; static const gint smallsizes_real[] = { 1000, 100, 10 }; static const gint smallsizes_24fps[] = { 24, 12, 4 }; static const gint smallsizes_25fps[] = { 25, 5 }; static const gint smallsizes_30fps[] = { 30, 10, 5 }; /* Returns: * 0 - Both major and minor points should have text from the get_time_head * function. * 1 - Major points should have text from the get_time_head function, and * minor points should have text from teh get_time_tail function. */ /* Midpoints are generated when there is a minor point scale that has * <= nmidpoints elements, is larger than the scale used for the minor points * and the major points are at the smallest scale. * Sounds very messy, but it's for making sure that we always have points * we can draw text on. * */ guint find_timescale_points(guint32 samplerate, off_t start_samp, off_t end_samp, off_t *points, int *npoints, off_t *midpoints, int *nmidpoints, off_t *minor_points, int *nminorpoints, int timemode) { guint pctr=0,mpctr=0,midpctr=0; off_t p,q,r,s; int i; const int *ss; int ssl; int max_points = *npoints, max_minorpoints = *nminorpoints; int max_midpoints = *nmidpoints; g_assert(max_points > 2); g_assert(max_minorpoints >= max_points); *nmidpoints = 0; /* Handle sample-based time */ if (timemode == TIMEMODE_SAMPLES) { p = 1; q = start_samp; r = end_samp; while (r-q >= (off_t)(max_points-1)) { q /= 10; r /= 10; p *= 10; } for (s=q; s<=r+1; s++) { points[pctr++] = s * p; g_assert(pctr <= max_points); } p = 1; q = start_samp; r = end_samp; while (r-q >= (off_t)(max_minorpoints-1)) { q /= 10; r /= 10; p *= 10; } for (s=q; s<=r+1; s++) { minor_points[mpctr++] = s * p; g_assert(mpctr <= max_minorpoints); } *npoints = pctr; *nminorpoints = mpctr; return 0; } /* Handle major points (common between timecode and real time) */ i = 0; while (i < (ARRAY_LENGTH(bigsizes)-1) && ( (end_samp-start_samp)/(bigsizes[i]*samplerate) > (off_t)(max_points-2) ) ) i++; q = start_samp / (bigsizes[i] * samplerate); r = end_samp / (bigsizes[i] * samplerate); /* printf("q = %d, r = %d\n",(int)q,(int)r); */ while (1) { points[pctr++] = (q++) * bigsizes[i] * samplerate; /* printf("q = %d, pctr = %d, max_points = %d\n",(int)q,(int)pctr,(int)max_points); */ g_assert(pctr <= max_points); if (q > r) break; } *npoints = pctr; /* Handle minor points of >=1s */ if (i > 0) { i--; while (bigskip[i]) i--; if ( (end_samp-start_samp) / (bigsizes[i]*samplerate) >= (off_t)(max_minorpoints-2)) { *nminorpoints = 0; return 0; } while (i > 0 && ( (end_samp-start_samp)/(bigsizes[i-1]*samplerate) < (off_t)(max_minorpoints-2) ) ) i--; q = start_samp / (bigsizes[i] * samplerate); r = end_samp / (bigsizes[i] * samplerate); for (s=q; s<=r+1; s++) { minor_points[mpctr++] = s * bigsizes[i] * samplerate; g_assert(mpctr <= max_minorpoints); } *nminorpoints = mpctr; return 0; } /* Handle sub-second minor ticks for NTSC timecode */ /* This is a special case since NTSC frames are not second-aligned */ if (timemode == TIMEMODE_NTSC) { /* Calculate start and end frame count (rounded down) */ q = (start_samp * 30 * 1000) / (samplerate * 1001); r = (end_samp * 30 * 1000) / (samplerate * 1001); if (r-q >= max_minorpoints) { *nminorpoints = 0; return 0; } for (s=q; s<=r; s++) { /* Convert from frame to sample, rounding upwards */ minor_points[mpctr++] = (s * samplerate * 1001 + 29999) / (30000); } *nminorpoints = mpctr; return 1; } /* Handle sub-second minor ticks, real time or non-NTSC timecode */ switch (timemode) { case TIMEMODE_REAL: case TIMEMODE_REALLONG: ss = smallsizes_real; ssl = ARRAY_LENGTH(smallsizes_real); break; case TIMEMODE_24FPS: ss = smallsizes_24fps; ssl = ARRAY_LENGTH(smallsizes_24fps); break; case TIMEMODE_25FPS: ss = smallsizes_25fps; ssl = ARRAY_LENGTH(smallsizes_25fps); break; case TIMEMODE_30FPS: ss = smallsizes_30fps; ssl = ARRAY_LENGTH(smallsizes_30fps); break; default: g_assert_not_reached(); } i = 0; while (i < ssl && ((end_samp-start_samp)*ss[i])/samplerate >= (off_t)(max_minorpoints-2)) i++; if (i >= ssl) { *nminorpoints = 0; return 0; } q = (start_samp*ss[i])/samplerate; r = (end_samp*ss[i])/samplerate; for (s=q; s<=r+1; s++) { minor_points[mpctr++] = (s * samplerate + ss[i]-1) / ss[i]; } *nminorpoints = mpctr; /* Generate mid points */ do { i++; } while (i < ssl && ((end_samp-start_samp)*ss[i])/samplerate >= (off_t)(max_midpoints-2)); if (i >= ssl) return 1; q = (start_samp*ss[i])/samplerate; r = (end_samp*ss[i])/samplerate; for (s=q; s<=r+1; s++) { midpoints[midpctr++] = (s * samplerate + ss[i]-1) / ss[i]; } *nmidpoints = midpctr; return 1; } gfloat parse_time(gchar *timestr) { gchar *c,*d; gfloat t = 0.0, f; long int l; int i; c = timestr; /* Hours */ d = strchr(c,'\''); if (d != NULL) { l = strtol(c,&d,10); if (l < 0 || *d != '\'') return -1.0; t += (gfloat)l * 3600.0; c = d+1; } /* Minutes */ d = strchr(c,':'); if (d != NULL) { l = strtol(c,&d,10); if (l < 0 || *d != ':') return -1.0; t += (gfloat)l * 60.0; c = d+1; } /* Seconds */ if (*c != '.') { l = strtol(c,&d,10); if (l < 0 || (*d != '.' && *d != 0)) return -1.0; t += (gfloat)l; if (*d == 0) return t; c = d + 1; } else c = c + 1; /* Millis */ l = strtol(c,&d,10); if (l < 0 || *d != 0) return -1.0; f = (gfloat)l; for (i=0; i<(d-c); i++) f *= 0.1; t += f; return t; } struct lookup_keys_priv { gconstpointer value; GSList *keys; }; static void lookup_keys_func(gpointer key, gpointer value, gpointer user_data) { struct lookup_keys_priv *p = (struct lookup_keys_priv *)user_data; if (!strcmp(value,p->value)) p->keys=g_slist_prepend(p->keys,key); } GSList *hash_table_lookup_keys(GHashTable *hash_table, gconstpointer value) { struct lookup_keys_priv p = { value, NULL }; g_hash_table_foreach(hash_table,lookup_keys_func,&p); return p.keys; } struct geometry_stack_item { gint x,y; gint width, height; gchar *extra; }; static gboolean parse_geom_x(gchar *str, struct geometry_stack_item *result) { struct geometry_stack_item a; gchar *d,*e; a.x = strtoul(str,&d,10); if (*d != '_') return TRUE; a.y = strtoul(d+1,&d,10); if (*d != '_') return TRUE; a.width = strtoul(d+1,&d,10); if (*d != '_') return TRUE; a.height = strtoul(d+1,&e,10); if (e == d+1) return TRUE; if (*e == '_') a.extra = g_strdup(e+1); else a.extra = NULL; memcpy(result,&a,sizeof(*result)); return FALSE; } gboolean parse_geom(gchar *str, GtkAllocation *result) { struct geometry_stack_item item; if (parse_geom_x(str,&item)) return TRUE; if (item.extra) g_free(item.extra); result->x = item.x; result->y = item.y; result->width = item.width; result->height = item.height; return FALSE; } static gchar *get_geom_x(GtkWindow *window, gchar *extra) { gint x,y,width,height; gdk_window_get_size(GTK_WIDGET(window)->window,&width,&height); gdk_window_get_root_origin(GTK_WIDGET(window)->window,&x,&y); if (extra == NULL) return g_strdup_printf("%d_%d_%d_%d",x,y,width,height); else return g_strdup_printf("%d_%d_%d_%d_%s",x,y,width,height,extra); } gchar *get_geom(GtkWindow *window) { return get_geom_x(window,NULL); } GSList *geometry_stack_from_inifile(gchar *ininame) { gchar *c,*d; struct geometry_stack_item a,*ap; GSList *l = NULL; gboolean boo; c = inifile_get(ininame,NULL); if (c != NULL) { while (g_slist_length(l) < 64) { d = strchr(c,'|'); if (d) *d=0; boo = parse_geom_x(c,&a); if (d) *d='|'; if (boo) break; if (a.width > 0 && a.height > 0) { ap = g_malloc(sizeof(*ap)); memcpy(ap,&a,sizeof(*ap)); l = g_slist_append(l,ap); } if (d == NULL) break; c = d+1; } } return l; } static void stack_proc(gpointer data, gpointer user_data) { struct geometry_stack_item *all = (struct geometry_stack_item *)data; gchar **c = (gchar **)user_data; gchar *d; if (all->extra) d = g_strdup_printf("%s%s%d_%d_%d_%d_%s",(*c)?(*c):"",(*c)?"|":"", all->x,all->y,all->width,all->height,all->extra); else d = g_strdup_printf("%s%s%d_%d_%d_%d",(*c)?(*c):"",(*c)?"|":"", all->x,all->y,all->width,all->height); g_free(*c); *c = d; } void geometry_stack_save_to_inifile(gchar *ininame, GSList *stack) { gchar *c=NULL; g_slist_foreach(stack,stack_proc,&c); if (c != NULL) inifile_set(ininame,c); g_free(c); } gboolean geometry_stack_pop(GSList **stackp, gchar **extra, GtkWindow *wnd) { struct geometry_stack_item *ap; if (*stackp == NULL) return FALSE; ap = (struct geometry_stack_item *)((*stackp)->data); *stackp = g_slist_remove(*stackp,ap); if (ap->x < -4000 || ap->x > 4000 || ap->y < -4000 || ap->y > 4000 || ap->width > 4000 || ap->height > 4000) { fputs(_("Ignoring extreme old window size/position values\n"),stderr); g_free(ap->extra); g_free(ap); return geometry_stack_pop(stackp,extra,wnd); } gtk_window_set_default_size(GTK_WINDOW(wnd),ap->width,ap->height); gtk_widget_set_uposition(GTK_WIDGET(wnd),ap->x,ap->y); if (extra) *extra = ap->extra; g_free(ap); return TRUE; } void geometry_stack_push(GtkWindow *w, gchar *extra, GSList **stackp) { struct geometry_stack_item *all; gint x,y,width,height; all = g_malloc(sizeof(*all)); gdk_window_get_size(GTK_WIDGET(w)->window,&width,&height); gdk_window_get_root_origin(GTK_WIDGET(w)->window,&x,&y); all->x = x; all->y = y; all->width = width; all->height = height; if (extra) all->extra = g_strdup(extra); else all->extra = NULL; *stackp = g_slist_prepend(*stackp,all); } char *translate_strip(const char *s) { char *c; c = _(s); if (c == s) { c = strchr(s,'|'); g_assert(c != NULL); return c+1; } else return c; } void format_float(float f, char *r, int maxsz) { gchar *c; g_snprintf(r,maxsz,"%#.7g",f); c = strchr(r,0); c-=2; while (c>=r && isdigit(c[0]) && c[1]=='0') { c[1] = 0; c--; } } mhwaveedit-1.4.24/src/main.h000066400000000000000000000203411334022513400156200ustar00rootroot00000000000000/* * Copyright (C) 2002 2003 2004 2005 2006 2007 2008 2009 2010, Magnus Hjorth * Copyright (C) 2011 2012, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ /* This contains the main procedure and some other useful procedures and macros. */ #ifndef MAIN_H_INCLUDED #define MAIN_H_INCLUDED #include #include #ifdef HAVE_SYS_TIME_H #include #endif #ifdef HAVE_SYS_TYPES_H #include #endif #ifdef HAVE_TIME_H #include #endif #include /* GTK compatibility stuff */ #if GTK_MAJOR_VERSION == 1 #define GTK_CLASS_TYPE(klass) (((GtkObjectClass *)klass)->type) #define gtk_style_get_font(style) ((style)->font) #define GTK_WIN_POS_CENTER_ON_PARENT GTK_WIN_POS_CENTER #define gtk_container_get_children gtk_container_children #define gtk_bin_get_child(bin) ((bin)->child) #define gtk_widget_set_size_request gtk_widget_set_usize #define gtk_entry_set_width_chars(e,w) gtk_widget_set_usize(GTK_WIDGET(e),w*10,-1) void gdk_gc_set_rgb_fg_color(GdkGC *gc, GdkColor *clr); #define gtk_adjustment_get_lower(adj) ((adj)->lower) #define gtk_adjustment_get_upper(adj) ((adj)->upper) #else #define GTK_WINDOW_DIALOG GTK_WINDOW_TOPLEVEL #define gtk_object_class_add_signals(x,y,z) #endif #if GTK_MAJOR_VERSION == 1 || (GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION < 18) void gtk_widget_set_has_window(GtkWidget *w, gboolean has_window); void gtk_widget_set_can_focus(GtkWidget *w, gboolean can_focus); #endif /* Global stuff */ #define PROGRAM_VERSION_STRING PACKAGE " " VERSION /* Permissions for creating ~/.mhwaveedit directory */ #define CONFDIR_PERMISSION 0755 /* Various portability stuff */ #ifndef HAVE_CEILL #define ceill(x) ((long)ceil(x)) #endif #ifndef HAVE_FSEEKO #define fseeko(s,o,w) fseek(s,(long)(o),w) #endif #ifndef HAVE_FTELLO #define ftello(s) ((off_t)ftell(s)) #endif /* Useful macros and functions */ #define ARRAY_LENGTH(arr) (sizeof(arr)/sizeof((arr)[0])) #define ARRAY_END(arr) (arr + ARRAY_LENGTH(arr)) #if G_BYTE_ORDER == G_LITTLE_ENDIAN #define IS_BIGENDIAN FALSE #else #define IS_BIGENDIAN TRUE #endif #if SIZEOF_OFF_T > 4 #define OFF_T_FORMAT "lld" #define OFF_T_FTYPE long long #else #define OFF_T_FORMAT "ld" #define OFF_T_FTYPE long #endif #define BOOLEQ(x,y) (((x) && (y)) || (!(x) && !(y))) #define XOR(x,y) (((x) && !(y)) || (!(x) && (y))) extern gboolean quitflag; extern GdkPixmap *icon; extern gboolean quality_mode; extern gchar *driver_option; extern gboolean idle_work_flag; /* Various functions */ void byteswap(void *buffer, int element_size, int buffer_size); int timeval_subtract(GTimeVal *result, GTimeVal *x, GTimeVal *y); float timeval_divide(GTimeVal *x, GTimeVal *y); void timeval_divide_float(GTimeVal *result, GTimeVal *x, gfloat y); gboolean free2(gpointer key, gpointer value, gpointer user_data); gchar *get_home_directory(void); void do_yield(gboolean may_sleep); int hexval(gchar chr); void launch_mixer(void); GtkLabel *attach_label(gchar *text, GtkWidget *table, guint y, guint x); enum Color { BLACK=0, WHITE, BACKGROUND, WAVE1, WAVE2, CURSOR, MARK, SELECTION, PROGRESS, BARS, BUFPOS, LAST_COLOR }; #define FIRST_CUSTOM_COLOR BACKGROUND #define CUSTOM_COLOR_COUNT (LAST_COLOR-FIRST_CUSTOM_COLOR) extern GdkColor factory_default_colors[]; extern gchar *color_names[]; extern gchar *color_inifile_entry[]; GdkColor *get_color(enum Color c); GdkGC *get_gc(enum Color c, GtkWidget *wid); void set_custom_colors(GdkColor *c); void save_colors(void); gchar *channel_name(guint chan, guint total); gchar channel_char(guint chan); gchar *channel_format_name(guint chans); gchar *namepart(gchar *filename); #define TIMEMODE_REAL 0 #define TIMEMODE_REALLONG 1 #define TIMEMODE_SAMPLES 2 #define TIMEMODE_24FPS 3 #define TIMEMODE_25FPS 4 #define TIMEMODE_NTSC 5 #define TIMEMODE_30FPS 6 /* Determines how long time a certain number of samples represents, and returns it as a text string. samplerate - The sample rate for which we should determine the time samplerate member is used.) samples - The number of samples to measure. samplemax - Maximum value that needs to be displayed in the same format. If unknown, use the same value as for samples. timebuf - The buffer to store the text string into (should be at least 50 bytes) return value - timebuf */ extern guint default_time_mode; extern guint default_timescale_mode; gchar *get_time(guint32 samplerate, off_t samples, off_t samplemax, gchar *timebuf, gint timemode); /* Returns time always in short format H'MM:SS or MM:SS */ gchar *get_time_s(guint32 samplerate, off_t samples, off_t samplemax, gchar *timebuf); /* Returns time always in long time format H'MM:SS.mmmm */ gchar *get_time_l(guint32 samplerate, off_t samples, off_t samplemax, gchar *timebuf); /* Returns time in same format as get_time, but with sub-seconds removed */ gchar *get_time_head(guint32 samplerate, off_t samples, off_t samplemax, gchar *timebuf, int timemode); /* Returns time in same format as get_time, but with only sub-second part */ gchar *get_time_tail(guint32 samplerate, off_t samples, off_t samplemax, gchar *timebuf, int timemode); /* Find a number of even sample points around start_samp and end_samp * suitable for marking out on a time scale with major and minor ticks. * * At least two major points are always returned, one before/on start_samp and * one after/on end_samp. * *npoints and *nminorpoints should be set to the maximum allowed number of * points, and will be set to the number of stored points on return. * * Returns a hint on how the text should be drawn: * 0 - Both major and minor points should have text from the get_time_head * function. * 1 - Major points should have text from the get_time_head function, and * minor points should have text from thh get_time_tail function. */ guint find_timescale_points(guint32 samplerate, off_t start_samp, off_t end_samp, off_t *points, int *npoints, off_t *midpoints, int *nmidpoints, off_t *minorpoints, int *nminorpoints, int timemode); /* Converts a string in the form: [H'][MM:]SS[.mmmm] to a seconds value. * Returns negative value if the input is invalid. */ gfloat parse_time(gchar *timestr); /* Lookup all keys corresponding to a certain value in a hash table. */ GSList *hash_table_lookup_keys(GHashTable *hash_table, gconstpointer value); /* Parse a geometry string in the form x_y_w_h */ gboolean parse_geom(gchar *str, GtkAllocation *result); /* Get a geometry string from a window (it must be realized) */ gchar *get_geom(GtkWindow *window); /* Geometry stack functions */ GSList *geometry_stack_from_inifile(gchar *ininame); void geometry_stack_save_to_inifile(gchar *ininame, GSList *stack); /* Returns TRUE on success */ gboolean geometry_stack_pop(GSList **stackp, gchar **extra, GtkWindow *wnd); void geometry_stack_push(GtkWindow *w, gchar *extra, GSList **stackp); /* * Tries to translate the string s. * * If the string gets translated, returns the translated string. * If the string doesn't get translated, returns a pointer to after the first * pipe char ('|') in the string. * * This is used when you want different translations for the same string, * depending on context. "X|Z" and "Y|Z" both return "Z" if not translated, * but can be translated to different things. */ char *translate_strip(const char *s); void format_float(float f, char *r, int maxsz); /* Variables that choose dither methods. Doesn't really belong in this * file, but I'm lazy.. */ extern int dither_editing; extern int dither_playback; #endif mhwaveedit-1.4.24/src/mainloop.c000066400000000000000000000442371334022513400165170ustar00rootroot00000000000000/* * Copyright (C) 2008 2009 2010, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include #include #include #include "mainloop.h" #include "sound.h" #include "statusbar.h" #include "document.h" #include "mainwindow.h" gboolean idle_work_flag; struct constant_source { constsource_cb cb; gpointer user_data; gboolean enabled; gboolean lowprio; }; struct time_source { timesource_cb cb; gpointer user_data; gboolean enabled; GTimeVal call_time; }; struct io_source { GPollFD pfd; iosource_cb cb; gpointer user_data; gboolean enabled; }; struct io_group { int nfds; GPollFD *pfds; int *orig_events; int wdtime_ms; gpointer wd; iogroup_cb cb; gpointer user_data; gboolean enabled; }; static GList *constsources = NULL, *timesources = NULL, *iosources = NULL; static GList *iogroups = NULL; static GList *dead_iosources = NULL; static gboolean in_sources(gpointer src, gpointer *sources, int n_sources) { int i; if (sources == NULL) return TRUE; for (i=0; inext; src = (struct time_source *)l->data; if (!src->enabled || !in_sources(src,sources,n_sources)) continue; i = timeval_subtract(&tv, &src->call_time, current_time); if (i || (tv.tv_sec==0 && tv.tv_usec==0)) { timeout = 0; if (do_dispatch) { src->enabled = FALSE; j = src->cb(src, current_time, src->user_data); if (j != 0) { if (j > 0) memcpy(&src->call_time,current_time,sizeof(GTimeVal)); else j = -j; src->call_time.tv_usec += j*1000; while (src->call_time.tv_usec >= 1000000) { src->call_time.tv_sec += 1; src->call_time.tv_usec -= 1000000; } src->enabled = TRUE; } } } else { j = tv.tv_usec / 1000 + tv.tv_sec * 1000; if (j <= 0) j=1; if (timeout < 0 || j < timeout) timeout = j; } } return timeout; } static int timesource_scan(GTimeVal *current_time, gboolean do_dispatch) { return timesource_scan_main(current_time,do_dispatch,NULL,0); } static gboolean iosource_check_main(void) { GList *l; struct io_source *src; struct io_group *grp; int i; for (l=iosources; l!=NULL; l=l->next) { src = (struct io_source *)l->data; if (src->enabled && src->pfd.revents != 0) return TRUE; } for (l=iogroups; l!=NULL; l=l->next) { grp = (struct io_group *)l->data; if (grp->enabled) { for (i=0; infds; i++) { if (grp->pfds[i].revents != 0) return TRUE; } } } return FALSE; } static gboolean iosource_dispatch_main(GTimeVal *current_time) { GList *l; struct io_source *src; struct io_group *grp; int i,j,k; GTimeVal tv; for (l=iosources; l!=NULL; l=l->next) { src = (struct io_source *)l->data; if (src->enabled && src->pfd.revents != 0) { src->cb(src,src->pfd.fd,src->pfd.revents,src->user_data); src->pfd.revents = 0; } } for (l=iogroups; l!=NULL; l=l->next) { grp = (struct io_group *)l->data; if (grp->enabled) { j = 0; for (i=0; infds; i++) { if (j == 0 && grp->pfds[i].revents != 0) { j++; k = grp->cb(grp,grp->pfds[i].fd,grp->pfds[i].revents, grp->user_data); } if (j != 0 && k == 0) grp->pfds[i].events &= ~(grp->pfds[i].revents); } if (j != 0 && k != 0) { mainloop_io_group_enable(grp,(k > 0)); } /* Restart watchdog */ if (grp->wd != NULL) { tv.tv_sec = current_time->tv_sec; tv.tv_usec = current_time->tv_usec + grp->wdtime_ms*1000; if (tv.tv_usec > 1000000) { tv.tv_sec++; tv.tv_usec-=1000000; } mainloop_time_source_restart(grp->wd, &tv); } } } return TRUE; } #if GLIB_MAJOR_VERSION < 2 static gboolean timesource_prepare(gpointer source_data, GTimeVal *current_time, gint *timeout, gpointer user_data) { int i; i = timesource_scan(current_time,FALSE); if (i < 0) return FALSE; else if (i == 0) return TRUE; else { if (*timeout < 0 || i < *timeout) *timeout = i; return FALSE; } } static gboolean timesource_check(gpointer source_data, GTimeVal *current_time, gpointer user_data) { int i; i = timesource_scan(current_time,FALSE); return (i == 0); } static gboolean timesource_dispatch(gpointer source_data, GTimeVal *dispatch_time, gpointer user_data) { timesource_scan(dispatch_time,TRUE); return TRUE; } static GSourceFuncs tsf = { timesource_prepare, timesource_check, timesource_dispatch, NULL }; static void mainloop_time_source_added(struct time_source *src) { static gboolean inited = FALSE; if (!inited) { g_source_add(G_PRIORITY_HIGH, FALSE, &tsf, NULL, NULL, NULL); inited = TRUE; } } static gboolean iosource_prepare(gpointer source_data, GTimeVal *current_time, gint *timeout, gpointer user_data) { return FALSE; } static gboolean iosource_check(gpointer source_data, GTimeVal *current_time, gpointer user_data) { return iosource_check_main(); } static gboolean iosource_dispatch(gpointer source_data, GTimeVal *dispatch_time, gpointer user_data) { iosource_dispatch_main(dispatch_time); return TRUE; } static GSourceFuncs isf = { iosource_prepare, iosource_check, iosource_dispatch, NULL }; static void poll_add_main(GPollFD *pfd) { static gboolean inited = FALSE; if (!inited) { g_source_add(G_PRIORITY_HIGH, FALSE, &isf, NULL, NULL, NULL); inited = TRUE; } g_main_add_poll(pfd, G_PRIORITY_HIGH); } static void poll_remove_main(GPollFD *pfd) { g_main_remove_poll(pfd); } #else static gboolean timesource_prepare(GSource *source, gint *timeout) { GTimeVal tv; int i; g_source_get_current_time(source, &tv); i = timesource_scan(&tv,FALSE); if (i <= 0) return (i == 0); else { if (*timeout < 0 || i < *timeout) *timeout = i; return FALSE; } } static gboolean timesource_check(GSource *source) { GTimeVal tv; int i; g_source_get_current_time(source, &tv); i = timesource_scan(&tv,FALSE); return (i == 0); } static gboolean timesource_dispatch(GSource *source, GSourceFunc callback, gpointer user_data) { GTimeVal tv; g_source_get_current_time(source,&tv); timesource_scan(&tv,TRUE); return TRUE; } static GSourceFuncs tsf2 = { timesource_prepare, timesource_check, timesource_dispatch, NULL }; static void mainloop_time_source_added(struct time_source *src) { static gboolean inited = FALSE; GSource *s; if (!inited) { s = g_source_new(&tsf2, sizeof(*s)); g_source_attach(s,NULL); inited = TRUE; } } static gboolean iosource_prepare(GSource *source, int *timeout) { return FALSE; } static gboolean iosource_check(GSource *source) { return iosource_check_main(); } static gboolean iosource_dispatch(GSource *source, GSourceFunc callback, gpointer user_data) { GTimeVal tv; g_source_get_current_time(source, &tv); iosource_dispatch_main(&tv); return TRUE; } static GSource *iosource_handle = NULL; static GSourceFuncs isf2 = { iosource_prepare, iosource_check, iosource_dispatch }; static void poll_add_main(GPollFD *pfd) { if (iosource_handle == NULL) { iosource_handle = g_source_new(&isf2, sizeof(GSource)); g_source_attach(iosource_handle,NULL); } g_source_add_poll(iosource_handle, pfd); } static void poll_remove_main(GPollFD *pfd) { g_source_remove_poll(iosource_handle, pfd); } #endif /* ---------------------------------------- */ /* Note: Does not yet support io groups */ static void sources_poll(gpointer *sources, int n_sources) { int timeout,nfds,i; GTimeVal tv; struct pollfd *pfds; GList *l; struct io_source *src; struct io_source **srcp; /* puts("sources_poll"); */ g_get_current_time(&tv); timeout = timesource_scan_main(&tv,TRUE,sources,n_sources); if (timeout == 0) return; pfds = g_malloc(n_sources * sizeof(struct pollfd)); srcp = g_malloc(n_sources * sizeof(struct io_source *)); nfds = 0; for (l=iosources; l!=NULL; l=l->next) { src = (struct io_source *)l->data; if (in_sources(src,sources,n_sources)) { srcp[nfds] = src; memcpy(&pfds[nfds],&src->pfd,sizeof(pfds[0])); nfds++; } } if (nfds == 0 && timeout < 0) return; /* printf("Calling poll with nfds=%d, timeout=%d (n_sources=%d)\n", nfds,timeout,n_sources); */ i = poll(pfds,nfds,timeout); if (i < 0) { perror("poll"); return; } if (i > 0) { for (i=0; ipfd.revents = pfds[i].revents; if (src->enabled && src->pfd.revents != 0) { src->cb(src,src->pfd.fd,src->pfd.revents,src->user_data); src->pfd.revents = 0; } } } g_free(pfds); g_free(srcp); } static void mainloop_main(gpointer *sources, int n_sources) { static guint const_highprio_idle_count=0; struct constant_source *csrc; gint i,j; GList *l,*ln; if (dead_iosources != NULL) { for (l=dead_iosources; l!=NULL; l=l->next) { g_free(l->data); } g_list_free(dead_iosources); dead_iosources = NULL; } i = -1; for (l=constsources; l!=NULL; l=ln) { ln = l->next; csrc = (struct constant_source *)l->data; if (csrc->enabled && !csrc->lowprio && in_sources(csrc,sources,n_sources)) { j = csrc->cb(csrc,csrc->user_data); if (j > 0 || sources != NULL) return; if (j > i) i = j; } } if (i > 0) { const_highprio_idle_count=0; return; } const_highprio_idle_count++; if (sources == NULL && gtk_events_pending()) { gtk_main_iteration(); return; } else if (sources != NULL) { sources_poll(sources,n_sources); } if (!idle_work_flag) { idle_work_flag = TRUE; return; } for (l=constsources; l!=NULL; l=ln) { ln = l->next; csrc = (struct constant_source *)l->data; if (csrc->enabled && csrc->lowprio && in_sources(csrc,sources,n_sources)) { j = csrc->cb(csrc,csrc->user_data); if (j > 0) return; if (j > i) i = j; } } if (sources != NULL) return; if (i < 0) { gtk_main_iteration(); } else if (i >= 0 && const_highprio_idle_count > 10) do_yield(TRUE); } void mainloop(void) { mainloop_main(NULL,0); } /* Note: Does not (yet) support IO groups */ void mainloop_recurse_on(gpointer *sources, int n_sources) { mainloop_main(sources, n_sources); } gpointer mainloop_constant_source_add(constsource_cb cb, gpointer user_data, gboolean low_prio) { struct constant_source *src; src = g_malloc(sizeof(*src)); src->cb = cb; src->user_data = user_data; src->enabled = TRUE; src->lowprio = low_prio; constsources = g_list_prepend(constsources, src); return src; } void mainloop_constant_source_enable(gpointer constsource, gboolean enable) { struct constant_source *src = (struct constant_source *)constsource; src->enabled = enable; } void mainloop_constant_source_free(gpointer constsource) { constsources = g_list_remove(constsources, constsource); g_free(constsource); } gpointer mainloop_time_source_add(GTimeVal *tv, timesource_cb cb, gpointer user_data) { struct time_source *src; src = g_malloc(sizeof(*src)); src->cb = cb; src->user_data = user_data; if (tv != NULL) { memcpy(&src->call_time,tv,sizeof(src->call_time)); src->enabled = TRUE; } else { src->enabled = FALSE; } timesources = g_list_append(timesources, src); mainloop_time_source_added(src); return src; } void mainloop_time_source_restart(gpointer timesource, GTimeVal *new_tv) { struct time_source *src = (struct time_source *)timesource; memcpy(&(src->call_time),new_tv,sizeof(src->call_time)); src->enabled = TRUE; } void mainloop_time_source_free(gpointer timesource) { timesources = g_list_remove(timesources, timesource); g_free(timesource); } gboolean mainloop_time_source_enabled(gpointer ts) { struct time_source *src = (struct time_source *)ts; return src->enabled; } gpointer mainloop_io_source_add(int fd, gushort events, iosource_cb cb, gpointer user_data) { struct io_source *src; src = g_malloc(sizeof(*src)); src->pfd.fd = fd; src->pfd.events = events; src->pfd.revents = 0; src->cb = cb; src->user_data = user_data; src->enabled = TRUE; iosources = g_list_append(iosources, src); poll_add_main(&(src->pfd)); return src; } void mainloop_io_source_enable(gpointer iosource, gboolean enable) { struct io_source *src = (struct io_source *)iosource; if (XOR(src->enabled,enable)) { src->enabled = enable; if (enable) poll_add_main(&(src->pfd)); else poll_remove_main(&(src->pfd)); } } void mainloop_io_source_set_events(gpointer iosource, gushort new_events) { struct io_source *src = (struct io_source *)iosource; src->pfd.events = new_events; if (new_events != 0 && !src->enabled) { poll_add_main(&(src->pfd)); src->enabled = TRUE; } } void mainloop_io_source_free(gpointer iosource) { mainloop_io_source_enable(iosource,FALSE); iosources = g_list_remove(iosources, iosource); /* We can not free the IO source here, because we might be * removing it from inside a callback called from sources_poll */ dead_iosources = g_list_append(dead_iosources, iosource); } gpointer mainloop_io_group_add(int nfds, GPollFD *pfds, int wdtime_ms, iogroup_cb cb, gpointer user_data) { struct io_group *grp; int i; grp = g_malloc(sizeof(*grp)); grp->nfds = nfds; grp->pfds = NULL; grp->orig_events = NULL; if (nfds > 0) { grp->pfds = g_malloc(nfds*sizeof(GPollFD)); memcpy(grp->pfds, pfds, nfds*sizeof(GPollFD)); grp->orig_events = g_malloc(nfds*sizeof(int)); } for (i=0; iorig_events[i] = pfds[i].events; poll_add_main(&(grp->pfds[i])); } grp->wdtime_ms = wdtime_ms; grp->wd = NULL; grp->cb = cb; grp->user_data = user_data; grp->enabled = FALSE; iogroups = g_list_append(iogroups, grp); mainloop_io_group_enable(grp,TRUE); return grp; } static gint iogroup_watchdog_cb(gpointer timesource, GTimeVal *current_time, gpointer user_data) { struct io_group *grp = (struct io_group *)user_data; int i,j; i = grp->cb(grp, -1, 0, grp->user_data); if (i > 0) { for (j=0; jnfds; j++) grp->pfds[j].events = grp->orig_events[j]; } if (i >= 0) return -grp->wdtime_ms; else return 0; } void mainloop_io_group_enable(gpointer iogroup, gboolean enable) { struct io_group *grp = (struct io_group *)iogroup; int i; GTimeVal tv; if (XOR(grp->enabled,enable)) { if (enable) { if (grp->wdtime_ms > 0) grp->wd = mainloop_time_source_add(NULL,iogroup_watchdog_cb,grp); } else { mainloop_time_source_free(grp->wd); grp->wd = NULL; } } if (enable && grp->wd != NULL) { g_get_current_time(&tv); tv.tv_sec += grp->wdtime_ms / 1000; tv.tv_usec += 1000*(grp->wdtime_ms%1000); if (tv.tv_usec >= 1000000) { tv.tv_sec++; tv.tv_usec -= 1000000; } mainloop_time_source_restart(grp->wd,&tv); } for (i=0; infds; i++) { grp->pfds[i].events = enable ? grp->orig_events[i] : 0; } grp->enabled = enable; } void mainloop_io_group_free(gpointer iogroup) { struct io_group *grp = (struct io_group *)iogroup; int i; iogroups = g_list_remove(iogroups, grp); mainloop_io_group_enable(iogroup,FALSE); for (i=0; infds; i++) { poll_remove_main(&(grp->pfds[i])); } g_free(grp->pfds); g_free(grp->orig_events); g_free(grp); } struct defer { gpointer src; defer_once_cb cscb; gpointer user_data; }; static int defer_once_cb1(gpointer csource, gpointer user_data) { struct defer *d = (struct defer *)user_data; d->cscb(d->user_data); mainloop_constant_source_free(csource); g_free(d); return -1; } static int defer_once_cb2(gpointer tsource, GTimeVal *tm, gpointer user_data) { struct defer *d = (struct defer *)user_data; d->cscb(d->user_data); mainloop_time_source_free(tsource); g_free(d); return 0; } void mainloop_defer_once(defer_once_cb cb, gint reltime, gpointer user_data) { struct defer *d; GTimeVal t; d = g_malloc(sizeof(*d)); if (reltime <= 0) d->src = mainloop_constant_source_add(defer_once_cb1, d, TRUE); else { g_get_current_time(&t); t.tv_usec += reltime*1000; while (t.tv_usec >= 1000000) { t.tv_usec -= 1000000; t.tv_sec += 1; } d->src = mainloop_time_source_add(&t,defer_once_cb2,d); } d->cscb = cb; d->user_data = user_data; } mhwaveedit-1.4.24/src/mainloop.h000066400000000000000000000057501334022513400165210ustar00rootroot00000000000000/* * Copyright (C) 2008 2009 2010, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #ifndef MAINLOOP_H_INCLUDED #define MAINLOOP_H_INCLUDED #include void mainloop(void); void mainloop_recurse_on(gpointer *sources, int n_sources); typedef void (*iosource_cb)(gpointer iosource, int fd, gushort revents, gpointer user_data); /* fd is -1 if timeout occurred * Return value: <0=Disable, 0=Wait for additional events, >0=Re-enable all events * For timeout, <0=Disable watchdog, 0=Restart watchdog and wait for same events, >0=Re-enable all events */ typedef int (*iogroup_cb)(gpointer iogroup, int fd, gushort revents, gpointer user_data); /* Return value: 0=disable, >0=call again in X millis from current_time * <0=call again in X millis from nominal time */ typedef gint (*timesource_cb)(gpointer timesource, GTimeVal *current_time, gpointer user_data); /* Return value: * <0: May sleep * 0: Execute other event sources but do not sleep * >0: Do not execute any other event sources */ typedef int (*constsource_cb)(gpointer csource, gpointer user_data); gpointer mainloop_io_source_add(int fd, gushort events, iosource_cb cb, gpointer user_data); void mainloop_io_source_set_events(gpointer iosource, gushort new_events); void mainloop_io_source_enable(gpointer iosource, gboolean enable); void mainloop_io_source_free(gpointer iosource); gpointer mainloop_io_group_add(int nfds, GPollFD *pfds, int wdtime_ms, iogroup_cb cb, gpointer user_data); void mainloop_io_group_enable(gpointer iogroup, gboolean enable); void mainloop_io_group_free(gpointer iogroup); gpointer mainloop_time_source_add(GTimeVal *tv, timesource_cb cb, gpointer user_data); void mainloop_time_source_restart(gpointer timesource, GTimeVal *new_tv); void mainloop_time_source_free(gpointer timesource); gboolean mainloop_time_source_enabled(gpointer timesource); gpointer mainloop_constant_source_add(constsource_cb cb, gpointer user_data, gboolean lowprio); void mainloop_constant_source_enable(gpointer constsource, gboolean enable); void mainloop_constant_source_free(gpointer constsource); /* Convenience wrappers */ typedef void (*defer_once_cb)(gpointer user_data); void mainloop_defer_once(defer_once_cb cb, gint reltime, gpointer user_data); #endif mhwaveedit-1.4.24/src/mainwindow.c000066400000000000000000002752121334022513400170540ustar00rootroot00000000000000/* * Copyright (C) 2002 2003 2004 2005 2006 2007 2008 2009 2010, Magnus Hjorth * Copyright (C) 2011 2012 2013 2018, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include #include #include #include #include #include #include "gtkfiles.h" #include "filetypes.h" #include "chunkview.h" #include "mainwindow.h" #include "recorddialog.h" #include "configdialog.h" #include "gotodialog.h" #include "chunk.h" #include "um.h" #include "main.h" #include "inifile.h" #include "player.h" #include "sound.h" #include "effectbrowser.h" #include "soxdialog.h" #include "help.h" #include "ladspadialog.h" #include "gettext.h" #include "bitmap.h" #include "button_open.xpm" #include "button_save.xpm" #include "button_undo.xpm" #include "button_redo.xpm" #include "button_cut.xpm" #include "button_copy.xpm" #include "button_paste.xpm" #include "button_pasteover.xpm" #include "button_delete.xpm" #include "button_cursorstart.xpm" #include "button_cursorend.xpm" #include "button_play.xpm" #include "button_playselection.xpm" #include "button_stop.xpm" #include "button_loop.xpm" #include "button_follow.xpm" #include "button_record.xpm" #include "button_mixer.xpm" #include "button_bounce.xpm" #include "icon.xpm" #include "vzoom.xbm" #include "hzoom.xbm" #include "speed.xbm" /* #define SHOW_DEBUG_MENU */ #if GTK_MAJOR_VERSION < 2 #define INV_SPEED #endif #ifdef FIXED_DATE #define BUILD_DATE FIXED_DATE #else #define BUILD_DATE __DATE__ #endif #ifdef FIXED_TIME #define BUILD_TIME FIXED_TIME #else #define BUILD_TIME __TIME__ #endif ListObject *mainwindow_objects = NULL; static gboolean window_geometry_stack_inited = FALSE; static GSList *window_geometry_stack = NULL; static GList *recent_filenames = NULL; static GtkObjectClass *parent_class; static Chunk *clipboard = NULL; gboolean autoplay_mark_flag = FALSE; gboolean varispeed_reset_flag = FALSE; static Mainwindow *mainwindow_set_document(Mainwindow *w, Document *doc, gchar *filename); static void mainwindow_view_changed(Document *d, gpointer user_data); static void mainwindow_selection_changed(Document *d, gpointer user_data); static void mainwindow_cursor_changed(Document *d, gboolean rolling, gpointer user_data); static void mainwindow_state_changed(Document *d, gpointer user_data); static void load_recent(void) { guint i; gchar *c,*d; g_assert(recent_filenames == NULL); for (i=1; ; i++) { c = g_strdup_printf("recentFile%d",i); d = inifile_get(c,NULL); g_free(c); if (d == NULL) break; recent_filenames = g_list_append(recent_filenames, g_strdup(d)); } } static void save_recent(void) { guint i,j; GList *l; gchar *c; j = inifile_get_guint32("recentFiles",4); if (j > MAINWINDOW_RECENT_MAX) j=4; for (i=1,l=recent_filenames; i<=j && l!=NULL; i++,l=l->next) { c = g_strdup_printf("recentFile%d",i); inifile_set(c,l->data); g_free(c); } } static void update_file_recent(Mainwindow *w) { guint i = 1; GList *l = recent_filenames; GList *m = w->recent; gchar *c,*d; for (; m!=NULL && l!=NULL; m=m->next,l=l->next,i++) { d = namepart((gchar *)l->data); c = g_strdup_printf("%d. %s",i,d); gtk_label_set_text(GTK_LABEL(GTK_BIN(m->data)->child),c); gtk_widget_set_sensitive(GTK_WIDGET(m->data),TRUE); g_free(c); } for (; m!=NULL; m=m->next,i++) { c = g_strdup_printf("%d.",i); gtk_label_set_text(GTK_LABEL(GTK_BIN(m->data)->child),c); gtk_widget_set_sensitive(GTK_WIDGET(m->data),FALSE); g_free(c); } } static void recent_file(gchar *filename) { GList *l = recent_filenames; /* Remove other reference to this file, if it exists */ while (l!=NULL) { if (!strcmp((gchar *)l->data,filename)) { recent_filenames = g_list_remove_link(recent_filenames,l); g_free(l->data); g_list_free_1(l); break; } else l = l->next; } /* Put file at top */ recent_filenames = g_list_prepend(recent_filenames,g_strdup(filename)); list_object_foreach(mainwindow_objects,(GFunc)update_file_recent,NULL); save_recent(); } static void update_desc(Mainwindow *w); static void set_sensitive(GList *l, gboolean s) { while (l != NULL) { gtk_widget_set_sensitive(GTK_WIDGET(l->data),s); l = l->next; } } /* This function makes the window un-sensitive and brings it to front.*/ static void procstart(StatusBar *bar, gpointer user_data) { Mainwindow *w = MAINWINDOW(user_data); mainwindow_set_sensitive(w,FALSE); w->esc_pressed_flag = FALSE; #if GTK_MAJOR_VERSION > 1 gtk_window_present(GTK_WINDOW(w)); #else if (GTK_WIDGET(w)->window) gdk_window_raise(GTK_WIDGET(w)->window); #endif gtk_grab_add(GTK_WIDGET(w)); } static void procend(StatusBar *bar, gpointer user_data) { Mainwindow *w = MAINWINDOW(user_data); mainwindow_set_sensitive(w,TRUE); mainwindow_update_texts(); gtk_grab_remove(GTK_WIDGET(w)); } static void fix_title(Mainwindow *wnd) { gchar *c; if (wnd->doc != NULL) { c = g_strdup_printf ( _("mhWaveEdit: %s (%s): %d Hz, %s"), wnd->doc->titlename, chunk_get_time(wnd->doc->chunk, wnd->doc->chunk->length, NULL), wnd->doc->chunk->format.samplerate, sampletype_name(&(wnd->doc->chunk->format))); } else c = g_strdup(PROGRAM_VERSION_STRING); gtk_window_set_title ( GTK_WINDOW ( wnd ), c ); g_free ( c ); } static void update_desc(Mainwindow *w) { if (w->doc != NULL) status_bar_set_info(w->statusbar,w->doc->cursorpos, (playing_document==w->doc),w->doc->viewstart, w->doc->viewend,w->doc->selstart, w->doc->selend, w->doc->chunk->format.samplerate, w->doc->chunk->length); else status_bar_reset(w->statusbar); } static void typesel_changed(Combo *obj, GtkWidget *user_data) { int i; gchar *c; i = combo_selected_index(obj); if (i == 0) { gtk_widget_set_sensitive(user_data,TRUE); } else { c = fileformat_extension(i-1); get_filename_modify_extension(c); if (fileformat_has_options(i-1)) { gtk_widget_set_sensitive(user_data,TRUE); } else { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(user_data),TRUE); gtk_widget_set_sensitive(user_data,FALSE); } } } static void mainwindow_open(Mainwindow *w, gchar *filename) { Document *doc; doc = document_new_with_file ( filename, w->statusbar ); if (doc == NULL) return; mainwindow_set_document ( w, doc, filename ); inifile_set("lastOpenFile",filename); recent_file(filename); } static gchar *get_save_filename(gchar *old_filename, gchar *title_text, gint *type_id, gboolean *use_defaults) { gchar *lsf,*lsd,*filename; gchar *c,*d,*e; GtkBox *b1,*b2; GtkWidget *w,*usedef,*typesel; GList *l; gint i; /* Get the lastSaveFile entry */ lsf = inifile_get("lastSaveFile",NULL); /* If we didn't have a lastSaveFile entry, assume we want to save into the same directory as we loaded from. */ if (lsf == NULL) lsf = inifile_get("lastOpenFile",NULL); /* Get the directory part and copy into lsd */ if (lsf != NULL) { lsd = g_strdup(lsf); c = strrchr(lsd,'/'); if (c != NULL) c[1]=0; else { g_free(lsd); lsd = NULL; } } else lsd = NULL; /* Create the custom widget */ usedef = gtk_check_button_new_with_label(_("Use default settings")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(usedef),TRUE); typesel = combo_new(); l = g_list_append(NULL,g_strdup(_("Auto-detect from extension"))); for (i=0; ; i++) { c = fileformat_name(i); if (c == NULL) break; d = fileformat_extension(i); e = g_strdup_printf("%s (%s)",c,d); l = g_list_append(l,e); } combo_set_items(COMBO(typesel),l,0); gtk_signal_connect(GTK_OBJECT(typesel),"selection-changed", GTK_SIGNAL_FUNC(typesel_changed),usedef); g_list_foreach(l,(GFunc)g_free,NULL); g_list_free(l); b1 = GTK_BOX(gtk_hbox_new(FALSE,0)); w = gtk_label_new(_("File type: ")); gtk_box_pack_start(b1,w,FALSE,FALSE,0); gtk_box_pack_start(b1,typesel,TRUE,TRUE,0); gtk_box_pack_start(b1,usedef,FALSE,FALSE,6); b2 = GTK_BOX(gtk_vbox_new(FALSE,8)); gtk_box_pack_start(b2,GTK_WIDGET(b1),FALSE,FALSE,0); gtk_object_ref(GTK_OBJECT(usedef)); gtk_object_ref(GTK_OBJECT(typesel)); gtk_widget_show_all(GTK_WIDGET(b2)); if (lsd == NULL) filename = get_filename ( old_filename, "*.wav", title_text, TRUE, GTK_WIDGET(b2)); else if (old_filename == NULL) filename = get_filename (lsd, "*.wav", title_text, TRUE, GTK_WIDGET(b2)); else { c = strrchr(old_filename, '/'); if (!c) c=old_filename; else c = c+1; d = g_strjoin("/",lsd,c,NULL); filename = get_filename(d, "*.wav", title_text, TRUE, GTK_WIDGET(b2)); g_free(d); } *use_defaults = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(usedef)); *type_id = combo_selected_index(COMBO(typesel)) - 1; g_free(lsd); gtk_object_unref(GTK_OBJECT(typesel)); gtk_object_unref(GTK_OBJECT(usedef)); return filename; } static gboolean mainwindow_save ( Mainwindow *w, gchar *filename ) { int type_id = -1; gboolean use_defs = TRUE; gboolean r; gboolean fmal = FALSE; /* TRUE if filename should be g_free:d */ if (!document_can_undo(w->doc) && w->doc->filename != NULL) if (user_message(_("The file has not changed since last save. Press OK" " if you want to save it anyway?"),UM_OKCANCEL) == MR_CANCEL) return FALSE; /* If there is no filename provided, get a filename from a dialog * box. Also set the fmal flag so we remember to free the * filename later. */ if (filename == NULL) { filename = get_save_filename(w->doc->filename,_("Save File"), &type_id,&use_defs); if (filename == NULL) return TRUE; fmal = TRUE; } g_assert(filename != NULL); /* Save the file */ r = document_save(w->doc, filename, type_id, use_defs); if (r) { if (fmal) g_free(filename); return TRUE; } inifile_set("lastSaveFile",filename); recent_file(filename); if (fmal) g_free(filename); return FALSE; } static gboolean change_check ( Mainwindow *w ) { gint i; gchar *c; if (w->doc == NULL || (w->doc->filename != NULL && !document_can_undo(w->doc))) return FALSE; c = g_strdup_printf( _("Save changes to %s?"), w->doc->titlename ); i = user_message ( c, UM_YESNOCANCEL ); switch (i) { case MR_YES: return mainwindow_save ( w, w->doc->filename ); case MR_NO: return FALSE; case MR_CANCEL: return TRUE; } g_assert_not_reached(); return TRUE; } static void mainwindow_destroy(GtkObject *obj) { Mainwindow *w = MAINWINDOW(obj); list_object_remove(mainwindow_objects, obj); if ( w->doc != NULL ) { gtk_signal_disconnect_by_data(GTK_OBJECT(w->doc),obj); gtk_object_unref(GTK_OBJECT(w->doc)); w->doc = NULL; } if (list_object_get_size(mainwindow_objects) == 0) { if (clipboard) gtk_object_unref ( GTK_OBJECT(clipboard) ); clipboard = NULL; quitflag = TRUE; geometry_stack_save_to_inifile("windowGeometry", window_geometry_stack); } parent_class->destroy(obj); } static gint mainwindow_delete_event(GtkWidget *widget, GdkEventAny *event) { Mainwindow *w = MAINWINDOW ( widget ); GtkWidgetClass *pcw = GTK_WIDGET_CLASS(parent_class); if (change_check(w)) return TRUE; if (playing_document == w->doc) player_stop(); geometry_stack_push(GTK_WINDOW(w),NULL,&window_geometry_stack); if (pcw->delete_event) return pcw->delete_event(widget,event); else return FALSE; } static void mainwindow_realize(GtkWidget *widget) { if (GTK_WIDGET_CLASS(parent_class)->realize) GTK_WIDGET_CLASS(parent_class)->realize(widget); if (!icon) icon = gdk_pixmap_create_from_xpm_d(widget->window,NULL,NULL, icon_xpm); gdk_window_set_icon(widget->window,NULL,icon,NULL); } static void mainwindow_toggle_mark(Mainwindow *w, gchar *label) { off_t u; u = document_get_mark(w->doc,label); if (u == w->doc->cursorpos) document_set_mark(w->doc,label,DOCUMENT_BAD_MARK); else document_set_mark(w->doc,label,w->doc->cursorpos); } static void do_play(Mainwindow *w, off_t start, off_t end, gboolean loop) { gboolean speed_reset = FALSE; if (varispeed_reset_flag && !(player_playing() && playing_document == w->doc)) speed_reset = TRUE; if (speed_reset) document_stop(w->doc,FALSE); #ifdef INV_SPEED if (speed_reset) gtk_adjustment_set_value(w->speed_adj,-1.0); document_play(w->doc, start, end, loop, -w->speed_adj->value); #else if (speed_reset) gtk_adjustment_set_value(w->speed_adj,1.0); document_play(w->doc, start, end, loop, w->speed_adj->value); #endif update_desc(w); } static void mainwindow_goto_mark(Mainwindow *w, gchar *label) { off_t u; u = document_get_mark(w->doc,label); if (u != DOCUMENT_BAD_MARK) { if (autoplay_mark_flag) do_play(w,u,w->doc->chunk->length,w->loopmode); else document_set_cursor(w->doc, u); } } static void view_zoomin(GtkMenuItem *menu_item, gpointer user_data); static void view_zoomout(GtkMenuItem *menu_item, gpointer user_data); static void view_zoomtoselection(GtkMenuItem *menu_item, gpointer user_data); static void view_zoomall(GtkMenuItem *menu_item, gpointer user_data); static void edit_play(GtkMenuItem *menu_item, gpointer user_data); static void edit_playselection(GtkMenuItem *menu_item, gpointer user_data); static void edit_stop(GtkMenuItem *menu_item, gpointer user_data); static gint mainwindow_keypress(GtkWidget *widget, GdkEventKey *event) { Mainwindow *w = MAINWINDOW(widget); off_t o; /* printf("%d\n",event->keyval); */ if (!w->sensitive) { if (event->keyval == GDK_Escape) status_bar_break_progress(w->statusbar); return TRUE; } if (w->doc == NULL) return GTK_WIDGET_CLASS(parent_class)->key_press_event(widget,event); if ((event->state & GDK_CONTROL_MASK)) switch (event->keyval) { case GDK_0: mainwindow_toggle_mark(w,"0"); return TRUE; case GDK_1: mainwindow_toggle_mark(w,"1"); return TRUE; case GDK_2: mainwindow_toggle_mark(w,"2"); return TRUE; case GDK_3: mainwindow_toggle_mark(w,"3"); return TRUE; case GDK_4: mainwindow_toggle_mark(w,"4"); return TRUE; case GDK_5: mainwindow_toggle_mark(w,"5"); return TRUE; case GDK_6: mainwindow_toggle_mark(w,"6"); return TRUE; case GDK_7: mainwindow_toggle_mark(w,"7"); return TRUE; case GDK_8: mainwindow_toggle_mark(w,"8"); return TRUE; case GDK_9: mainwindow_toggle_mark(w,"9"); return TRUE; case GDK_Left: case GDK_KP_Left: if (playing_document == w->doc) player_nudge(-0.5); else { o = w->doc->cursorpos - w->doc->chunk->format.samplerate/2; if (o < 0) o = 0; document_set_cursor(w->doc,o); } return TRUE; case GDK_Right: case GDK_KP_Right: if (playing_document == w->doc) player_nudge(0.5); else { o = w->doc->cursorpos + w->doc->chunk->format.samplerate/2; if (o > w->doc->chunk->length) o = w->doc->chunk->length; document_set_cursor(w->doc,o); } return TRUE; case GDK_Tab: o = (w->doc->viewstart + w->doc->viewend) / 2; document_set_cursor(w->doc,o); } else switch (event->keyval) { case GDK_0: mainwindow_goto_mark(w,"0"); return TRUE; case GDK_1: mainwindow_goto_mark(w,"1"); return TRUE; case GDK_2: mainwindow_goto_mark(w,"2"); return TRUE; case GDK_3: mainwindow_goto_mark(w,"3"); return TRUE; case GDK_4: mainwindow_goto_mark(w,"4"); return TRUE; case GDK_5: mainwindow_goto_mark(w,"5"); return TRUE; case GDK_6: mainwindow_goto_mark(w,"6"); return TRUE; case GDK_7: mainwindow_goto_mark(w,"7"); return TRUE; case GDK_8: mainwindow_goto_mark(w,"8"); return TRUE; case GDK_9: mainwindow_goto_mark(w,"9"); return TRUE; case GDK_plus: case GDK_KP_Add: case GDK_equal: view_zoomin(NULL,widget); return TRUE; case GDK_Down: case GDK_KP_Down: document_zoom(w->doc,2.0,FALSE); return TRUE; case GDK_minus: case GDK_KP_Subtract: view_zoomout(NULL,widget); return TRUE; case GDK_Up: case GDK_KP_Up: document_zoom(w->doc,0.5,FALSE); return TRUE; case GDK_greater: view_zoomtoselection(NULL,widget); return TRUE; case GDK_less: view_zoomall(NULL,widget); return TRUE; case GDK_comma: edit_play(NULL,widget); return TRUE; case GDK_period: edit_stop(NULL,widget); return TRUE; case GDK_slash: edit_playselection(NULL, widget); return TRUE; case GDK_space: if ((event->state & GDK_SHIFT_MASK) != 0) do_play(w,0,w->doc->chunk->length,w->loopmode); else if (playing_document == w->doc) document_stop(w->doc,w->bouncemode); else if (w->doc != NULL) do_play(w,w->doc->cursorpos,w->doc->chunk->length, w->loopmode); return TRUE; case GDK_Left: case GDK_KP_Left: if (playing_document==w->doc && w->doc->followmode) player_nudge(-0.5); else document_scroll(w->doc, -(w->doc->viewend - w->doc->viewstart)/MAINWINDOW_SCROLL_DELTA_RATIO); return TRUE; case GDK_Right: case GDK_KP_Right: if (playing_document==w->doc && w->doc->followmode) player_nudge(+0.5); else document_scroll(w->doc, (w->doc->viewend - w->doc->viewstart)/MAINWINDOW_SCROLL_DELTA_RATIO); return TRUE; case GDK_parenleft: o = 3*w->doc->chunk->format.samplerate; if (w->doc->selstart == w->doc->selend) { if (w->doc->chunk->length < o) do_play(w,0,w->doc->chunk->length,FALSE); else do_play(w,0,o,FALSE); } else if (w->doc->selstart+o > w->doc->selend) do_play(w,w->doc->selstart,w->doc->selend,FALSE); else do_play(w,w->doc->selstart,w->doc->selstart+o,FALSE); return TRUE; case GDK_parenright: o = 3*w->doc->chunk->format.samplerate; if (w->doc->selstart == w->doc->selend) { if (w->doc->chunk->length < o) do_play(w,0,w->doc->chunk->length,FALSE); else do_play(w,w->doc->chunk->length-o, w->doc->chunk->length,FALSE); } else if (w->doc->selstart+o > w->doc->selend) do_play(w,w->doc->selstart,w->doc->selend,FALSE); else do_play(w,w->doc->selend-o,w->doc->selend,FALSE); return TRUE; case GDK_Home: document_set_view(w->doc,0,w->doc->viewend-w->doc->viewstart); if (playing_document != w->doc || w->doc->followmode) document_set_cursor(w->doc,0); return TRUE; case GDK_End: /* Stop playback to prevent cursor jumping back to start point */ document_stop(w->doc,FALSE); document_scroll(w->doc,w->doc->chunk->length); if (playing_document != w->doc || w->doc->followmode) document_set_cursor(w->doc,w->doc->chunk->length); return TRUE; case GDK_Tab: document_scroll(w->doc, w->doc->cursorpos- (w->doc->viewend+w->doc->viewstart)/2); return TRUE; } return GTK_WIDGET_CLASS(parent_class)->key_press_event(widget,event); } static void urldecode(char *str) { char *s,*d; int i,j; s = d = str; while (*s != 0) { if (*s != '%' || s[1] == 0 || s[2] == 0) { *d = *s; d ++; s ++; } else { i = hexval(s[1]); j = hexval(s[2]); if (i < 0 || j < 0) { *d = *s; d ++; s ++; continue; } *d = (char)(i*16+j); d ++; s += 3; } } *d = 0; } static void mainwindow_drag_data_received(GtkWidget *widget, GdkDragContext *dc, gint x, gint y, GtkSelectionData *selection_data, guint info, guint t) { gchar *c,*d,*e,*f; if (selection_data->length > 0) { /* Copy and add extra null for safety */ c = g_malloc(selection_data->length+1); memcpy(c,selection_data->data,selection_data->length); c[selection_data->length] = 0; gtk_drag_finish(dc, TRUE, FALSE, t); /* Split into files */ for (d=strtok(c,"\n\r"); d!=NULL; d=strtok(NULL,"\n\r")) { e = strchr(d,':'); if (e == NULL) continue; *e = 0; if (strcmp(d,"file")) continue; while (e[1] == '/') e++; urldecode(e); if (!file_exists(e)) { f = g_strdup_printf("Silently ignoring non-esisting " "file: %s\n",e); console_message(f); g_free(f); continue; } mainwindow_open(MAINWINDOW(widget),e); /* printf("Dropped: %s\n",e); */ } g_free(c); } else gtk_drag_finish(dc, FALSE, FALSE, t); } static void mainwindow_class_init(GtkObjectClass *klass) { parent_class = gtk_type_class(gtk_window_get_type()); klass->destroy = mainwindow_destroy; GTK_WIDGET_CLASS(klass)->delete_event = mainwindow_delete_event; GTK_WIDGET_CLASS(klass)->realize = mainwindow_realize; GTK_WIDGET_CLASS(klass)->key_press_event = mainwindow_keypress; GTK_WIDGET_CLASS(klass)->drag_data_received = mainwindow_drag_data_received; } static Mainwindow *mainwindow_set_document(Mainwindow *w, Document *d, gchar *filename) { if (w->doc != NULL) { w = MAINWINDOW ( mainwindow_new() ); gtk_widget_show ( GTK_WIDGET ( w ) ); } w->doc = d; document_set_followmode(d,w->followmode); gtk_object_ref(GTK_OBJECT(w->doc)); gtk_object_sink(GTK_OBJECT(w->doc)); gtk_signal_connect(GTK_OBJECT(d),"view_changed", GTK_SIGNAL_FUNC(mainwindow_view_changed),w); gtk_signal_connect(GTK_OBJECT(d),"selection_changed", GTK_SIGNAL_FUNC(mainwindow_selection_changed),w); gtk_signal_connect(GTK_OBJECT(d),"cursor_changed", GTK_SIGNAL_FUNC(mainwindow_cursor_changed),w); gtk_signal_connect(GTK_OBJECT(d),"state_changed", GTK_SIGNAL_FUNC(mainwindow_state_changed),w); chunk_view_set_document ( w->view, d ); document_set_status_bar(d, w->statusbar); fix_title(w); update_desc(w); set_sensitive(w->need_chunk_items,TRUE); if (!inifile_get_gboolean("varispeed",TRUE)) gtk_widget_set_sensitive(w->speed_slider,FALSE); list_object_add(mainwindow_objects,w); mainwindow_view_changed(w->doc,w); return w; } static Mainwindow *mainwindow_set_chunk(Mainwindow *w, Chunk *c, gchar *filename) { Document *d; d = document_new_with_chunk(c,filename,w->statusbar); return mainwindow_set_document(w,d,filename); } void mainwindow_set_speed_sensitive(gboolean sensitive) { GList *l; Mainwindow *w; for (l=mainwindow_objects->list;l!=NULL;l=l->next) { w = MAINWINDOW(l->data); gtk_widget_set_sensitive(w->speed_slider,sensitive); } } static void file_open(GtkMenuItem *menuitem, gpointer user_data) { gchar *c; Mainwindow *w = MAINWINDOW ( user_data ); if (w->doc != NULL && w->doc->filename != NULL) c = get_filename(w->doc->filename,"*.wav",_("Load File"),FALSE,NULL); else { c = inifile_get("lastOpenFile",NULL); if (c == NULL) c = inifile_get("lastSaveFile",NULL); c = get_filename(c,"*.wav", _("Load File"), FALSE, NULL); } if (!c) return; mainwindow_open(w,c); g_free(c); } static void file_save(GtkMenuItem *menuitem, gpointer user_data) { Mainwindow *w = MAINWINDOW ( user_data ); mainwindow_save ( w, w->doc->filename ); } static void file_saveas(GtkMenuItem *menuitem, gpointer user_data) { mainwindow_save ( MAINWINDOW(user_data), NULL ); } static void file_saveselection(GtkMenuItem *menuitem, gpointer user_data) { gint type_id; gboolean use_defs; gchar *fn; Chunk *c; Mainwindow *w = MAINWINDOW(user_data); fn = get_save_filename(NULL,_("Save selection as ..."), &type_id,&use_defs); if (!fn) return; c = chunk_get_part(w->doc->chunk,w->doc->selstart, w->doc->selend-w->doc->selstart); if (!chunk_save(c,fn,type_id,use_defs,dither_editing,w->statusbar)) inifile_set("lastSaveFile",fn); gtk_object_sink(GTK_OBJECT(c)); g_free(fn); } static void file_close(GtkMenuItem *menuitem, gpointer user_data) { Mainwindow *w = MAINWINDOW(user_data); if (change_check(w)) return; if (playing_document == w->doc) player_stop(); if (list_object_get_size(mainwindow_objects)==1 && w->doc != NULL) { chunk_view_set_document(w->view, NULL); gtk_signal_disconnect_by_data(GTK_OBJECT(w->doc),w); gtk_object_unref(GTK_OBJECT(w->doc)); w->doc = NULL; fix_title(w); set_sensitive(w->need_chunk_items,FALSE); set_sensitive(w->need_undo_items,FALSE); set_sensitive(w->need_selection_items,FALSE); list_object_remove(mainwindow_objects,w); } else { geometry_stack_push(GTK_WINDOW(w),NULL,&window_geometry_stack); gtk_widget_destroy(GTK_WIDGET(w)); } } static void try_close(Mainwindow *w, gboolean *user_data) { if (*user_data) return; *user_data = change_check(w); } static void file_exit(GtkMenuItem *menuitem, gpointer user_data) { gboolean b = FALSE; guint i; GtkWidget *wid; if (list_object_get_size(mainwindow_objects) == 0) file_close(menuitem,user_data); list_object_foreach(mainwindow_objects,(GFunc)try_close,&b); if (b) return; player_stop(); /* Reverse the list so we get the oldest windows on the top of the * geometry stack */ i = list_object_get_size(mainwindow_objects); for (; i>0; i--) { wid = GTK_WIDGET(list_object_get(mainwindow_objects,i-1)); geometry_stack_push(GTK_WINDOW(wid),NULL,&window_geometry_stack); gtk_widget_destroy(wid); } } static void edit_undo(GtkMenuItem *menuitem, gpointer user_data) { Mainwindow *w = MAINWINDOW (user_data); document_undo(w->doc); } static void edit_redo(GtkMenuItem *menuitem, gpointer user_data) { Mainwindow *w = MAINWINDOW (user_data); document_redo(w->doc); } static void update_clipboard_items(Mainwindow *w, gpointer user_data) { set_sensitive(w->need_clipboard_items,user_data != NULL); } static void edit_cut(GtkMenuItem *menuitem, gpointer user_data) { Chunk *chunk, *part; Mainwindow *w = MAINWINDOW(user_data); g_assert (w->doc->selend != w->doc->selstart); if (clipboard) gtk_object_unref(GTK_OBJECT(clipboard)); part = chunk_get_part( w->doc->chunk, w->doc->selstart, w->doc->selend - w->doc->selstart); chunk = chunk_remove_part( w->doc->chunk, w->doc->selstart, w->doc->selend - w->doc->selstart); clipboard = part; gtk_object_ref(GTK_OBJECT(clipboard)); gtk_object_sink(GTK_OBJECT(clipboard)); document_update(w->doc, chunk, w->doc->selstart, -(clipboard->length)); list_object_foreach(mainwindow_objects, (GFunc)update_clipboard_items, (gpointer)w); } static void edit_crop(GtkMenuItem *menu_item, gpointer user_data) { Mainwindow *w = MAINWINDOW(user_data); Chunk *c; c = chunk_get_part( w->doc->chunk, w->doc->selstart, w->doc->selend - w->doc->selstart); document_update(w->doc, c, 0, -(w->doc->selstart)); } static void edit_copy(GtkMenuItem *menu_item, gpointer user_data) { Mainwindow *w = MAINWINDOW(user_data); g_assert (w->doc->selend != w->doc->selstart); if (clipboard) gtk_object_unref(GTK_OBJECT(clipboard)); clipboard = chunk_get_part(w->doc->chunk, w->doc->selstart, w->doc->selend - w->doc->selstart); gtk_object_ref(GTK_OBJECT(clipboard)); gtk_object_sink(GTK_OBJECT(clipboard)); list_object_foreach(mainwindow_objects, (GFunc)update_clipboard_items, (gpointer)w); } static void edit_paste(GtkMenuItem *menu_item, gpointer user_data) { Chunk *c = clipboard, *nc; Mainwindow *w = MAINWINDOW(user_data); off_t cp,cl; if (w->doc == NULL) { mainwindow_set_chunk(w,clipboard,NULL); return; } if (!dataformat_equal(&(w->doc->chunk->format),&(c->format))) { c = chunk_convert(c,&(w->doc->chunk->format),dither_editing, w->statusbar); if (c == NULL) return; } cl = c->length; nc = chunk_insert(w->doc->chunk,c,w->doc->cursorpos); gtk_object_sink(GTK_OBJECT(c)); cp = w->doc->cursorpos; document_update(w->doc, nc, cp, cl); document_set_selection( w->doc, cp, cp + cl ); } static void edit_pasteover(GtkMenuItem *menuitem, gpointer user_data) { Mainwindow *w = MAINWINDOW(user_data); Chunk *c,*d=clipboard; off_t orig_len,dl; if (w->doc == NULL) { mainwindow_set_chunk(w,clipboard,NULL); return; } if (!dataformat_equal(&(w->doc->chunk->format),&(d->format))) { d = chunk_convert(d,&(w->doc->chunk->format),dither_editing, w->statusbar); if (d == NULL) return; } dl = d->length; orig_len = MIN(w->doc->chunk->length-w->doc->cursorpos, dl); c = chunk_replace_part(w->doc->chunk, w->doc->cursorpos, orig_len, d); gtk_object_sink(GTK_OBJECT(d)); document_update(w->doc, c, 0, 0); document_set_selection( w->doc, w->doc->cursorpos, w->doc->cursorpos + dl ); } static void edit_mixpaste(GtkMenuItem *menuitem, gpointer user_data) { Mainwindow *w = MAINWINDOW(user_data); Chunk *c,*p,*y,*d=clipboard; off_t partlen; if (w->doc == NULL) { mainwindow_set_chunk(w,clipboard,NULL); return; } if (!dataformat_equal(&(w->doc->chunk->format),&(d->format))) { d = chunk_convert(d,&(w->doc->chunk->format),dither_editing, w->statusbar); if (d == NULL) return; } p = chunk_get_part(w->doc->chunk,w->doc->cursorpos,d->length); partlen = p->length; y = chunk_mix(p,d,dither_editing,w->statusbar); gtk_object_sink(GTK_OBJECT(p)); if (!y) return; c = chunk_replace_part(w->doc->chunk,w->doc->cursorpos,partlen,y); gtk_object_sink(GTK_OBJECT(y)); document_update(w->doc, c, 0, 0); document_set_selection( w->doc, w->doc->cursorpos, w->doc->cursorpos + d->length ); gtk_object_sink(GTK_OBJECT(d)); } static void edit_pastetonew(GtkMenuItem *menuitem, gpointer user_data) { Mainwindow *w = MAINWINDOW (user_data); mainwindow_set_chunk(w,clipboard,NULL); } static void edit_delete(GtkMenuItem *menuitem, gpointer user_data) { Mainwindow *w = MAINWINDOW(user_data); Chunk *chunk; gint32 slen; slen = w->doc->selend - w->doc->selstart; chunk = chunk_remove_part(w->doc->chunk, w->doc->selstart, slen); document_update( w->doc, chunk, w->doc->selstart, -slen); } static Chunk *interp(Chunk *chunk, StatusBar *bar, gpointer user_data) { return chunk_interpolate_endpoints(chunk,TRUE,dither_editing,bar); } static void edit_silence(GtkMenuItem *menuitem, gpointer user_data) { Mainwindow *w = MAINWINDOW(user_data); document_apply_cb(w->doc,interp,TRUE,NULL); } static void edit_selectall(GtkMenuItem *menuitem, gpointer user_data) { Mainwindow *w = MAINWINDOW(user_data); if (w->doc->selstart != 0 || w->doc->selend != w->doc->chunk->length) document_set_selection(w->doc,0,w->doc->chunk->length); else document_set_selection(w->doc,0,0); } static void edit_selectnone(GtkMenuItem *menuitem, gpointer user_data) { Mainwindow *w = MAINWINDOW(user_data); document_set_selection(w->doc,0,0); } static void view_zoomin(GtkMenuItem *menuitem, gpointer user_data) { Mainwindow *w = MAINWINDOW ( user_data ); document_zoom(w->doc,2.0,TRUE); } static void view_zoomout(GtkMenuItem *item, gpointer user_data) { Mainwindow *w = MAINWINDOW ( user_data ); document_zoom(w->doc,0.5,TRUE); } static void view_zoomtoselection(GtkMenuItem *menuitem, gpointer user_data) { Document *d; d = MAINWINDOW(user_data)->doc; document_set_view(d,d->selstart,d->selend); } static void view_zoomall(GtkMenuItem *menuitem, gpointer user_data) { Document *d; d = MAINWINDOW(user_data)->doc; document_set_view(d,0,d->chunk->length); } #ifdef SHOW_DEBUG_MENU static void debug_mark(GtkMenuItem *menuitem, gpointer user_data) { /* MAINWINDOW(user_data)->changed = TRUE; */ } static gboolean dummy_proc(void *in, guint sample_size, chunk_writeout_func out_func, WriteoutID id, Dataformat *format) { return out_func(id,in,sample_size); } static void debug_dummy(GtkMenuItem *menuitem, gpointer user_data) { Mainwindow *w = MAINWINDOW(user_data); document_apply(w->doc,dummy_proc,NULL,CHUNK_FILTER_MANY,FALSE,"DUMMY"); } static void debug_dummy2(GtkMenuItem *menuitem, gpointer user_data) { Mainwindow *w = MAINWINDOW(user_data); document_apply(w->doc,dummy_proc,NULL,CHUNK_FILTER_MANY,TRUE,"DUMMY"); } static void checkoc_proc(Chunk *chunk, gpointer user_data) { if (chunk->opencount > 0) printf(_("Chunk %p has opencount=%d\n"),chunk,chunk->opencount); } static void debug_checkoc(GtkMenuItem *menuitem, gpointer user_data) { puts("--------"); chunk_foreach((GFunc)checkoc_proc,NULL); } static void dump_format(Dataformat *df) { printf("%d Channels @ %dHz ",df->channels,df->samplerate); if (df->type == DATAFORMAT_FLOAT) { if (df->samplesize <= sizeof(float)) { puts("float"); } else puts("double"); } else { printf("%d%c%c\n",df->samplesize,df->sign?'S':'U', df->bigendian?'B':'L'); } } static void dump_dp(DataPart *dp) { printf(" Datasource@%p, L/S=%Ld/%Ld Format: ",dp->ds, dp->ds->length,dp->ds->bytes); dump_format(&(dp->ds->format)); printf(" Usage: %Ld + %Ld\n",dp->position,dp->length); switch (dp->ds->type) { case DATASOURCE_REAL: printf(" REAL @ %p\n",dp->ds->data.real); break; case DATASOURCE_VIRTUAL: printf(" VIRTUAL @ %s:%Ld\n",dp->ds->data.virtual.filename, dp->ds->data.virtual.offset); break; case DATASOURCE_TEMPFILE: printf(" TEMPFILE @ %s:%Ld\n",dp->ds->data.virtual.filename, dp->ds->data.virtual.offset); break; case DATASOURCE_SILENCE: puts(" SILENCE"); break; case DATASOURCE_SNDFILE: printf(" SNDFILE @ %s:%Ld \n", dp->ds->data.sndfile.filename, dp->ds->data.sndfile.pos, dp->ds->data.sndfile.raw_readable?'T':'F'); break; case DATASOURCE_SNDFILE_TEMPORARY: printf(" SNDFILE @ %s:%Ld \n", dp->ds->data.sndfile.filename, dp->ds->data.sndfile.pos, dp->ds->data.sndfile.raw_readable?'T':'F'); break; case DATASOURCE_REF: printf(" REF --> %p\n",dp->ds->data.clone); break; case DATASOURCE_CLONE: printf(" CLONE --> %p\n",dp->ds->data.clone); break; case DATASOURCE_BYTESWAP: printf(" BYTESWAP --> %p\n",dp->ds->data.clone); break; } } static void dump_chunk(Chunk *c) { printf(" Chunk@%p, L/S=%Ld/%Ld, Format: ",c,c->length,c->size); dump_format(&(c->format)); puts(" Used datasources:"); g_list_foreach(c->parts,(GFunc)dump_dp,NULL); } static void indirect_dump_chunk(Chunk **cp) { dump_chunk(*cp); } static void windowinfo_proc(gpointer item, gpointer user_data) { struct HistoryEntry *he; Mainwindow *w = MAINWINDOW(item); printf(_("\nWindow '%s'\n"),w->doc->filename); puts(_(" Current chunk:")); dump_chunk(w->view->doc->chunk); puts(_(" History:")); he = w->doc->history_pos; if (he == NULL) { puts(" (empty)"); } else { while (he->prev != NULL) he=he->prev; while (he != NULL) { dump_chunk(he->chunk); he=he->next; } } } static void debug_chunkinfo(GtkMenuItem *menuitem, gpointer user_data) { list_object_foreach(mainwindow_objects,windowinfo_proc,NULL); } #endif static void mainwindow_show_effect_dialog(Mainwindow *mw, gchar *effect_name) { EffectBrowser *eb; eb = EFFECT_BROWSER(effect_browser_new_with_effect(mw->doc,effect_name, 'B', (effect_name!=NULL))); gtk_widget_show(GTK_WIDGET(eb)); } static void effects_volume(GtkMenuItem *menuitem, gpointer user_data) { mainwindow_show_effect_dialog(MAINWINDOW(user_data),"volume"); } static void effects_speed(GtkMenuItem *menuitem, gpointer user_data) { mainwindow_show_effect_dialog(MAINWINDOW(user_data),"speed"); } static void effects_samplerate(GtkMenuItem *menuitem, gpointer user_data) { mainwindow_show_effect_dialog(MAINWINDOW(user_data),"srate"); } static void effects_samplesize(GtkMenuItem *menuitem, gpointer user_data) { mainwindow_show_effect_dialog(MAINWINDOW(user_data),"ssize"); } static void effects_mixchannels(GtkMenuItem *menuitem, gpointer user_data) { Chunk *c; Mainwindow *w = MAINWINDOW(user_data); player_stop(); if (w->doc->chunk->format.channels == 1) user_info(_("There already is only one channel!")); else { c = chunk_onechannel(w->doc->chunk,dither_editing,w->statusbar); if (c) document_update(w->doc,c,0,0); } } static void effects_splitchannel(GtkMenuItem *menuitem, gpointer user_data) { Mainwindow *w = MAINWINDOW (user_data); Chunk *c; c = chunk_copy_channel(w->doc->chunk,0,dither_editing,w->statusbar); if (c == NULL) return; player_stop(); document_update(w->doc, c, 0, 0); } static void effects_mapchannels(GtkMenuItem *menuitem, gpointer user_data) { mainwindow_show_effect_dialog(MAINWINDOW(user_data),"mapchannels"); } static void edit_stop(GtkMenuItem *menu_item, gpointer user_data) { Mainwindow *w = MAINWINDOW(user_data); if (playing_document == NULL) { if (w->doc->cursorpos != 0 || w->doc->chunk->length == 0) document_set_cursor(w->doc,0); else document_set_cursor(w->doc,w->doc->chunk->length); } else document_stop(w->doc, w->bouncemode); } gboolean mainwindow_update_caches(void) { static guint last = 0; guint i,s; Mainwindow *wnd; s = list_object_get_size(mainwindow_objects); if (s == 0) return FALSE; if (last >= s) last=0; i = last+1; while (1) { if (i >= s) i = 0; wnd = MAINWINDOW(list_object_get(mainwindow_objects, i)); if (chunk_view_update_cache(wnd->view)) { last = i; return TRUE; } if (i == last) return FALSE; i++; } } static void edit_playselection(GtkMenuItem *menuitem, gpointer user_data) { Mainwindow *w = MAINWINDOW (user_data); document_play_selection(w->doc,w->loopmode, varispeed_reset_flag ? 1.0 : player_get_speed()); } static void edit_playall(GtkMenuItem *menuitem, gpointer user_data) { Mainwindow *w = MAINWINDOW (user_data); do_play(w,0,w->doc->chunk->length,w->loopmode); } static gchar *get_help_page_contents(int page) { const char **c; char *ts[128]; int i,j,k,l,x; gchar *r; c = help_page_contents[page]; l = 0; for (i=0; c[i]!=NULL && i<128; i++) { ts[i] = gettext(c[i]); l += strlen(ts[i]); } r = g_malloc(l+1); k = 0; for (j=0; jstyle->font_desc); pango_font_description_set_family_static(pfd, "Monospace"); gtk_widget_modify_font(label2, pfd); pango_font_description_free(pfd); } #endif gtk_container_add (GTK_CONTAINER (viewport1), label2); GTK_WIDGET_SET_FLAGS (label2, GTK_CAN_FOCUS); gtk_label_set_justify (GTK_LABEL (label2), GTK_JUSTIFY_LEFT); gtk_label_set_line_wrap (GTK_LABEL (label2), TRUE); gtk_misc_set_alignment (GTK_MISC (label2), 0, 0); gtk_misc_set_padding (GTK_MISC (label2), 5, 5); gtk_widget_show (label2); label = gtk_label_new (_(help_page_titles[i])); gtk_notebook_append_page (GTK_NOTEBOOK (notebook), frame, label); } /* Show default page (defined in help.h) */ #if GTK_MAJOR_VERSION == 1 gtk_notebook_set_page (GTK_NOTEBOOK (notebook), HELP_PAGE_DEFAULT); #else gtk_notebook_set_current_page (GTK_NOTEBOOK(notebook),HELP_PAGE_DEFAULT); #endif gtk_notebook_set_tab_pos (GTK_NOTEBOOK (notebook), GTK_POS_LEFT); box2 = gtk_vbox_new (FALSE, 10); gtk_container_set_border_width (GTK_CONTAINER (box2), 1); gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0); gtk_widget_show (box2); button = gtk_button_new_with_label (_("Close")); gtk_widget_add_accelerator (button, "clicked", ag, GDK_KP_Enter, 0, (GtkAccelFlags) 0); gtk_widget_add_accelerator (button, "clicked", ag, GDK_Return, 0, (GtkAccelFlags) 0); gtk_widget_add_accelerator (button, "clicked", ag, GDK_Escape, 0, (GtkAccelFlags) 0); GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT); gtk_signal_connect_object(GTK_OBJECT(button),"clicked", (GtkSignalFunc)gtk_widget_destroy, GTK_OBJECT(window)); gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0); gtk_widget_show (button); gtk_widget_show (table); gtk_widget_show (window); gtk_window_add_accel_group(GTK_WINDOW (window), ag); } static void help_about(void) { GtkAccelGroup* ag; gchar *p; GtkWidget *a,*b,*c; ag = gtk_accel_group_new(); a = gtk_window_new(GTK_WINDOW_DIALOG); gtk_window_set_modal(GTK_WINDOW(a),TRUE); gtk_window_set_title(GTK_WINDOW(a),_("About mhWaveEdit")); gtk_container_set_border_width(GTK_CONTAINER(a),5); gtk_window_set_position (GTK_WINDOW (a), GTK_WIN_POS_CENTER); // Centre the window b = gtk_vbox_new(FALSE,10); gtk_container_add(GTK_CONTAINER(a),b); gtk_widget_show(b); c = gtk_label_new(PROGRAM_VERSION_STRING); gtk_box_pack_start(GTK_BOX(b),c,FALSE,FALSE,0); gtk_widget_show(c); c = gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(b),c,FALSE,FALSE,0); gtk_widget_show(c); c = gtk_label_new(_("Created by Magnus Hjorth (magnus.hjorth@home.se)\n" "Copyright 2002-2018, Magnus Hjorth")); gtk_box_pack_start(GTK_BOX(b),c,FALSE,FALSE,0); gtk_widget_show(c); c = gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(b),c,FALSE,FALSE,0); gtk_widget_show(c); p = g_strdup_printf(_("Current sound driver: %s"),sound_driver_name()); c = gtk_label_new(p); g_free(p); gtk_box_pack_start(GTK_BOX(b),c,FALSE,FALSE,0); gtk_widget_show(c); c = gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(b),c,FALSE,FALSE,0); gtk_widget_show(c); p = g_strdup_printf(_("Compiled %s %s"), BUILD_DATE, BUILD_TIME); c = gtk_label_new(p); g_free(p); gtk_box_pack_start(GTK_BOX(b),c,FALSE,FALSE,0); gtk_widget_show(c); #ifdef USE_DOUBLE_SAMPLES c = gtk_label_new(_("Uses double-precision math")); gtk_box_pack_start(GTK_BOX(b),c,FALSE,FALSE,0); gtk_widget_show(c); #endif c = gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(b),c,FALSE,FALSE,0); gtk_widget_show(c); c = gtk_label_new(_("Distributed under GNU General Public License.\n" "For information, see the file COPYING")); gtk_box_pack_start(GTK_BOX(b),c,FALSE,FALSE,0); gtk_widget_show(c); c = gtk_button_new_with_label(_("OK")); gtk_widget_add_accelerator (c, "clicked", ag, GDK_KP_Enter, 0, (GtkAccelFlags) 0); gtk_widget_add_accelerator (c, "clicked", ag, GDK_Return, 0, (GtkAccelFlags) 0); gtk_widget_add_accelerator (c, "clicked", ag, GDK_Escape, 0, (GtkAccelFlags) 0); gtk_signal_connect_object(GTK_OBJECT(c),"clicked", (GtkSignalFunc)gtk_widget_destroy,GTK_OBJECT(a)); gtk_box_pack_start(GTK_BOX(b),c,FALSE,FALSE,0); gtk_widget_show(c); gtk_widget_show(a); gtk_window_add_accel_group(GTK_WINDOW (a), ag); } static void edit_play(GtkMenuItem *menuitem, gpointer user_data) { Mainwindow *w = MAINWINDOW (user_data); do_play(w,w->doc->cursorpos,w->doc->chunk->length,w->loopmode); } static void edit_selstartcursor(GtkMenuItem *menuitem, gpointer user_data) { Mainwindow *w = MAINWINDOW(user_data); if (w->doc->selstart == w->doc->selend) document_set_selection(w->doc,w->doc->cursorpos, w->doc->chunk->length); else document_set_selection(w->doc,w->doc->cursorpos,w->doc->selend); } static void edit_selendcursor(GtkMenuItem *menuitem, gpointer user_data) { Mainwindow *w = MAINWINDOW(user_data); if (w->doc->selstart == w->doc->selend) document_set_selection(w->doc,0,w->doc->cursorpos+1); else document_set_selection(w->doc,w->doc->selstart,w->doc->cursorpos); } static void edit_record(GtkMenuItem *menuitem, gpointer user_data) { Mainwindow *wnd = MAINWINDOW (user_data); Chunk *c; int noverruns, i; off_t overrun_locs[10]; gchar s[2], *str; player_stop(); c = record_dialog_execute(&noverruns, overrun_locs); if (c) { wnd = mainwindow_set_chunk(wnd,c,NULL); if (noverruns > 0) { for (i=0; idoc, s, overrun_locs[i]/c->format.samplebytes); } str = g_strdup_printf ("%d overruns where detected while recording. " "This means the recording may be damaged. The " "locations where the overruns happened have been " "indicated with markers.",noverruns); user_warning(str); g_free(str); } } } static void edit_preferences(GtkMenuItem *menuitem, gpointer user_data) { gtk_widget_show(config_dialog_new()); } static void effects_combinechannels(GtkMenuItem *menuitem, gpointer user_data) { mainwindow_show_effect_dialog(MAINWINDOW(user_data),"combine"); } static void effects_sandwich(GtkMenuItem *menuitem, gpointer user_data) { mainwindow_show_effect_dialog(MAINWINDOW(user_data),"sandwich"); } static void view_timescale(GtkCheckMenuItem *checkmenuitem, gpointer user_data) { Mainwindow *w = MAINWINDOW ( user_data ); chunk_view_set_timescale(w->view, checkmenuitem->active); } static void view_horizoom(GtkCheckMenuItem *checkmenuitem, gpointer user_data) { Mainwindow *w = MAINWINDOW ( user_data ); if (w->hzoom_icon == NULL) return; if (checkmenuitem->active) { gtk_widget_show(w->hzoom_icon); gtk_widget_show(w->hzoom_slider); } else { gtk_widget_hide(w->hzoom_icon); gtk_widget_hide(w->hzoom_slider); } } static void view_vertzoom(GtkCheckMenuItem *checkmenuitem, gpointer user_data) { Mainwindow *w = MAINWINDOW ( user_data ); if (w->vzoom_icon == NULL) return; if (checkmenuitem->active) { gtk_widget_show(w->vzoom_icon); gtk_widget_show(w->vzoom_slider); gtk_widget_show(GTK_WIDGET(w->vzoom_label)); } else { gtk_widget_hide(w->vzoom_icon); gtk_widget_hide(w->vzoom_slider); gtk_widget_hide(GTK_WIDGET(w->vzoom_label)); } } static void view_speed(GtkCheckMenuItem *checkmenuitem, gpointer user_data) { Mainwindow *w = MAINWINDOW(user_data); if (w->speed_icon == NULL) return; if (checkmenuitem->active) { gtk_widget_show(w->speed_icon); gtk_widget_show(w->speed_slider); if (w->show_labels) gtk_widget_show(GTK_WIDGET(w->speed_label)); } else { gtk_widget_hide(w->speed_icon); gtk_widget_hide(w->speed_slider); gtk_widget_hide(GTK_WIDGET(w->speed_label)); } } static void view_sliderlabels(GtkCheckMenuItem *checkmenuitem, gpointer user_data) { Mainwindow *w = MAINWINDOW(user_data); w->show_labels = checkmenuitem->active; if (w->vzoom_slider == NULL) return; if (w->show_labels) { if (GTK_WIDGET_VISIBLE(w->vzoom_slider)) gtk_widget_show(GTK_WIDGET(w->vzoom_label)); if (GTK_WIDGET_VISIBLE(w->speed_slider)) gtk_widget_show(GTK_WIDGET(w->speed_label)); } else { gtk_widget_hide(GTK_WIDGET(w->vzoom_label)); gtk_widget_hide(GTK_WIDGET(w->speed_label)); } } static void view_bufpos(GtkCheckMenuItem *checkmenuitem, gpointer user_data) { Mainwindow *w = MAINWINDOW(user_data); w->view->show_bufpos = checkmenuitem->active; gtk_widget_queue_draw(GTK_WIDGET(w->view)); } static void edit_insertsilence(GtkMenuItem *menuitem, gpointer user_data) { Mainwindow *w = MAINWINDOW ( user_data ); gfloat f; off_t cp; Chunk *c,*nc; if (user_input_float(_("Seconds of silence: "),_("Insert Silence"),0.0, GTK_WINDOW(w),&f)) return; if (f<=0.0) return; c = chunk_new_silent(&(w->doc->chunk->format),f); nc = chunk_insert(w->doc->chunk, c, w->doc->cursorpos); cp = w->doc->cursorpos; document_update(w->doc,nc,cp,c->length); document_set_selection( w->doc, cp, cp + c->length ); gtk_object_sink(GTK_OBJECT(c)); } static void edit_clearclipboard(GtkMenuItem *menuitem, gpointer user_data) { gtk_object_unref(GTK_OBJECT(clipboard)); clipboard = NULL; list_object_foreach(mainwindow_objects, (GFunc)update_clipboard_items, NULL); } static void edit_positioncursor(GtkMenuItem *menuitem, gpointer user_data) { gtk_widget_show(goto_dialog_new(MAINWINDOW(user_data))); } static Chunk *effects_normalize_proc(Chunk *chunk, StatusBar *bar, gpointer user_data) { sample_t s; Chunk *c; gfloat *lp = (gfloat *)user_data; sample_t level = (lp == NULL) ? 1.0 : *lp; s = chunk_peak_level(chunk,bar); if (s < 0.0) return NULL; c = chunk_amplify(chunk,level/s,dither_editing,bar); return c; } static void effects_normalize(GtkMenuItem *menuitem, gpointer user_data) { document_apply_cb(MAINWINDOW(user_data)->doc,effects_normalize_proc, TRUE,NULL); } static void effects_normalizeto(GtkMenuItem *menuitem, gpointer user_data) { gboolean b; gfloat val; val = inifile_get_gfloat("lastNormLevel",1.0); b = user_input_float(_("Level: "),_("Normalize to..."),val, GTK_WINDOW(user_data),&val); if (b) return; b = document_apply_cb(MAINWINDOW(user_data)->doc,effects_normalize_proc, TRUE,&val); if (b) return; inifile_set_gfloat("lastNormLevel",val); } static void effects_pipe(GtkMenuItem *menuitem, gpointer user_data) { mainwindow_show_effect_dialog(MAINWINDOW(user_data),"pipe"); } static void cursor_moveto_beginning(GtkMenuItem *menuitem, gpointer user_data) { document_set_cursor(MAINWINDOW(user_data)->doc,0); } static void cursor_moveto_end(GtkMenuItem *menuitem, gpointer user_data) { Mainwindow *w = MAINWINDOW(user_data); document_set_cursor(w->doc,w->doc->chunk->length); } static void cursor_moveto_selstart(GtkMenuItem *menuitem, gpointer user_data) { Mainwindow *w = MAINWINDOW(user_data); document_set_cursor(w->doc,w->doc->selstart); } static void cursor_moveto_selend(GtkMenuItem *menuitem, gpointer user_data) { Mainwindow *w = MAINWINDOW(user_data); document_set_cursor(w->doc,w->doc->selend); } static void cursor_move_left(GtkMenuItem *menuitem, gpointer user_data) { off_t delta; Mainwindow *w = MAINWINDOW(user_data); delta = - ((w->doc->viewend - w->doc->viewstart)/MAINWINDOW_NUDGE_DELTA_RATIO); if(delta > -1) { delta = -1; } document_nudge_cursor(w->doc,delta); } static void cursor_move_right(GtkMenuItem *menuitem, gpointer user_data) { off_t delta; Mainwindow *w = MAINWINDOW(user_data); delta = ((w->doc->viewend - w->doc->viewstart)/MAINWINDOW_NUDGE_DELTA_RATIO); if(delta < 1) { delta = 1; } document_nudge_cursor(w->doc,delta); } static void cursor_move_leftsample(GtkMenuItem *menuitem, gpointer user_data) { Mainwindow *w = MAINWINDOW(user_data); document_nudge_cursor(w->doc,-1); } static void cursor_move_rightsample(GtkMenuItem *menuitem, gpointer user_data) { Mainwindow *w = MAINWINDOW(user_data); document_nudge_cursor(w->doc,1); } static void cursor_findzerocrossing_leftall(GtkMenuItem *menuitem, gpointer user_data) { Mainwindow *w = MAINWINDOW(user_data); off_t newpos; newpos = chunk_zero_crossing_all_reverse( w->doc->chunk,w->statusbar,w->doc->cursorpos); if(newpos >= 0) { document_set_cursor(w->doc,newpos); } } static void cursor_findzerocrossing_rightall(GtkMenuItem *menuitem, gpointer user_data) { Mainwindow *w = MAINWINDOW(user_data); off_t newpos; newpos = chunk_zero_crossing_all_forward( w->doc->chunk,w->statusbar,w->doc->cursorpos); if(newpos >= 0) { document_set_cursor(w->doc,newpos); } } static void cursor_findzerocrossing_leftany(GtkMenuItem *menuitem, gpointer user_data) { Mainwindow *w = MAINWINDOW(user_data); off_t newpos; newpos = chunk_zero_crossing_any_reverse( w->doc->chunk,w->statusbar,w->doc->cursorpos); if(newpos >= 0) { document_set_cursor(w->doc,newpos); } } static void cursor_findzerocrossing_rightany(GtkMenuItem *menuitem, gpointer user_data) { Mainwindow *w = MAINWINDOW(user_data); off_t newpos; newpos = chunk_zero_crossing_any_forward( w->doc->chunk,w->statusbar,w->doc->cursorpos); if(newpos >= 0) { document_set_cursor(w->doc,newpos); } } static Chunk *byteswap_proc(Chunk *chunk, StatusBar *bar, gpointer user_data) { return chunk_byteswap(chunk); } static void effects_byteswap(GtkMenuItem *menuitem, gpointer user_data) { document_apply_cb(MAINWINDOW(user_data)->doc,byteswap_proc,TRUE,NULL); } static Chunk *fadein_proc(Chunk *chunk, StatusBar *bar, gpointer user_data) { return chunk_volume_ramp(chunk,0.0,1.0,dither_editing,bar); } static Chunk *fadeout_proc(Chunk *chunk, StatusBar *bar, gpointer user_data) { return chunk_volume_ramp(chunk,1.0,0.0,dither_editing,bar); } static void effects_fadein(GtkMenuItem *menuitem, gpointer user_data) { document_apply_cb(MAINWINDOW(user_data)->doc,fadein_proc,TRUE,NULL); } static void effects_fadeout(GtkMenuItem *menuitem, gpointer user_data) { document_apply_cb(MAINWINDOW(user_data)->doc,fadeout_proc,TRUE,NULL); } static void effects_dialog(GtkMenuItem *menuitem, gpointer user_data) { mainwindow_show_effect_dialog(MAINWINDOW(user_data),NULL); } static void file_recent(GtkMenuItem *menuitem, gpointer user_data) { Mainwindow *w = MAINWINDOW(user_data); Document *doc; gchar *fn; GList *l = w->recent; GList *m = recent_filenames; while (l->data != menuitem) { l=l->next; m=m->next; } fn = g_strdup((gchar *)m->data); doc = document_new_with_file(fn, w->statusbar); if (doc == NULL) { g_free(fn); return; } mainwindow_set_document(w, doc, fn); inifile_set("lastOpenFile",fn); recent_file(fn); g_free(fn); } static gchar *translate_menu_path(const gchar *path, gpointer func_data) { return _(path); } static GtkWidget *xgtk_item_factory_get_item(GtkItemFactory *itemf, gchar *caption) { GtkWidget *w; w = gtk_item_factory_get_item(itemf,caption); g_assert(w != NULL); return w; } static GtkWidget *create_menu(Mainwindow *w) { guint i,j; GtkWidget *item; GtkItemFactoryEntry entry = {}; GtkItemFactoryEntry menu_items1[] = { { N_("/_File"), NULL, NULL, 0, "" }, { N_("/File/_Open..."), "O", file_open, 0, NULL }, { N_("/File/_Save"), "S", file_save, 0, NULL }, { N_("/File/Save _as..."),NULL, file_saveas, 0, NULL }, {N_("/File/Save selection as..."),"U",file_saveselection,0,NULL}, { N_("/_Edit"), NULL, NULL, 0, "" }, { N_("/Edit/_Undo"), "Z", edit_undo, 0, NULL }, { N_("/Edit/_Redo"), "Z", edit_redo, 0, NULL }, { N_("/Edit/sep1"), NULL, NULL, 0, "" }, { N_("/Edit/Cu_t"), "X", edit_cut, 0, NULL }, { N_("/Edit/_Copy"), "C", edit_copy, 0, NULL }, { N_("/Edit/_Paste"), "V", edit_paste, 0, NULL }, { N_("/Edit/Paste _over"),NULL, edit_pasteover, 0, NULL }, { N_("/Edit/_Mix paste"),NULL, edit_mixpaste, 0, NULL }, { N_("/Edit/Insert _silence"),NULL, edit_insertsilence,0,NULL }, { N_("/Edit/Paste to _new"),NULL, edit_pastetonew,0, NULL }, { N_("/Edit/Cr_op"), NULL, edit_crop, 0, NULL }, { N_("/Edit/_Delete"), "D", edit_delete, 0, NULL }, { N_("/Edit/Silence selection"),NULL,edit_silence, 0, NULL }, { N_("/Edit/sep2"), NULL, NULL, 0, "" }, { N_("/Edit/Select _all"),"A",edit_selectall,0, NULL }, { N_("/Edit/Select none"),NULL,edit_selectnone,0, NULL }, { N_("/Edit/sep3"), NULL, NULL, 0, "" }, { N_("/Edit/Clear clipboard"),NULL, edit_clearclipboard,0,NULL }, { N_("/Edit/sep4"), NULL, NULL, 0, "" }, { N_("/Edit/Preferences"),"P", edit_preferences,0,NULL }, { N_("/_View"), NULL, NULL, 0, "" }, { N_("/View/Zoom _in"), NULL, view_zoomin, 0, NULL }, { N_("/View/Zoom _out"),NULL, view_zoomout, 0, NULL }, { N_("/View/Zoom to _selection"),NULL,view_zoomtoselection,0,NULL }, { N_("/View/sep1"), NULL, NULL, 0, "" }, { N_("/View/Zoom _all"),NULL, view_zoomall, 0, NULL }, { N_("/View/sep2"), NULL, NULL, 0, "" }, { N_("/View/_Time scale"),NULL, view_timescale, 0, "" }, { N_("/View/_Horizontal zoom"),NULL, view_horizoom, 0, "" }, { N_("/View/_Vertical zoom"),NULL, view_vertzoom, 0, "" }, { N_("/View/Sp_eed slider"),NULL, view_speed, 0, "" }, { N_("/View/Slider labels"),NULL, view_sliderlabels,0,""}, { N_("/View/Buffer position"),NULL, view_bufpos, 0, "" }, { N_("/_Cursor"), NULL, NULL, 0, "" }, {N_("/Cursor/Set selection start"),"Q",edit_selstartcursor,0, NULL}, { N_("/Cursor/Set selection end"),"W",edit_selendcursor,0,NULL}, { N_("/Cursor/sep1"), NULL, NULL, 0, "" }, { N_("/Cursor/Move to"), NULL, NULL, 0, "" }, { N_("/Cursor/Move to/Beginning"),"H",cursor_moveto_beginning,0, NULL}, { N_("/Cursor/Move to/End"),"J",cursor_moveto_end, 0, NULL }, { N_("/Cursor/Move to/Selection start"),"K", cursor_moveto_selstart,0,NULL}, { N_("/Cursor/Move to/Selection end"),"L", cursor_moveto_selend,0,NULL}, { N_("/Cursor/Move"), NULL, NULL, 0, "" }, { N_("/Cursor/Move/Left"),"H",cursor_move_left,0,NULL}, { N_("/Cursor/Move/Right"),"J",cursor_move_right,0,NULL}, { N_("/Cursor/Move/Left sample"),"K",cursor_move_leftsample,0,NULL}, { N_("/Cursor/Move/Right sample"),"L",cursor_move_rightsample,0,NULL}, { N_("/Cursor/Find zero-crossing"),NULL,NULL,0,""}, { N_("/Cursor/Find zero-crossing/Left (all channels)"),"Y", cursor_findzerocrossing_leftall,0,NULL}, { N_("/Cursor/Find zero-crossing/Right (all channels)"),"U", cursor_findzerocrossing_rightall,0,NULL}, { N_("/Cursor/Find zero-crossing/Left (any channel)"),"I", cursor_findzerocrossing_leftany,0,NULL}, { N_("/Cursor/Find zero-crossing/Right (any channel)"),"O", cursor_findzerocrossing_rightany,0,NULL}, { N_("/Cursor/sep2"), NULL, NULL, 0, "" }, { N_("/Cursor/Position cursor..."),"G",edit_positioncursor,0, NULL}, { N_("/_Play"), NULL, NULL, 0, "" }, { N_("/Play/_Play from cursor"),NULL, edit_play, 0, NULL }, { N_("/Play/Play _all"),NULL, edit_playall, 0, NULL }, { N_("/Play/Play se_lection"),NULL, edit_playselection,0,NULL }, { N_("/Play/_Stop"), NULL, edit_stop, 0, NULL }, { N_("/Play/sep1"), NULL, NULL, 0, "" }, { N_("/Play/_Record..."), "F12", edit_record, 0, NULL }, { N_("/Effec_ts"), NULL, NULL, 0, "" }, { N_("/Effects/Fade _in"),NULL, effects_fadein, 0, NULL }, { N_("/Effects/Fade o_ut"),NULL, effects_fadeout,0, NULL }, { N_("/Effects/_Normalize"),"N",effects_normalize,0, NULL }, { N_("/Effects/Normali_ze to..."),NULL,effects_normalizeto,0,NULL }, { N_("/Effects/_Volume adjust (fade)..."),NULL,effects_volume,0,NULL }, { N_("/Effects/sep1"), NULL, NULL, 0, "" }, { N_("/Effects/Convert sample_rate..."),NULL,effects_samplerate,0,NULL }, { N_("/Effects/Convert sample _format..."),NULL,effects_samplesize,0, NULL}, { N_("/Effects/B_yte swap"),NULL, effects_byteswap,0,NULL }, { N_("/Effects/sep2"), NULL, NULL, 0, "" }, { N_("/Effects/_Mix to mono"),NULL,effects_mixchannels,0,NULL }, { N_("/Effects/Add channe_l"),NULL,effects_splitchannel,0,NULL }, { N_("/Effects/Ma_p channels..."),NULL,effects_mapchannels,0,NULL }, {N_("/Effects/_Combine channels..."),NULL,effects_combinechannels,0,NULL}, { N_("/Effects/Add channels from other file..."),NULL,effects_sandwich,0,NULL}, { N_("/Effects/sep3"), NULL, NULL, 0, "" }, { N_("/Effects/_Speed adjustment..."),NULL,effects_speed, 0, NULL }, { N_("/Effects/Pipe through program..."),NULL,effects_pipe,0,NULL }, { N_("/Effects/sep4"), NULL, NULL, 0, "" }, { N_("/Effects/Effects dialog..."),"E",effects_dialog,0,NULL }, #ifdef SHOW_DEBUG_MENU { N_("/Debug"), NULL, NULL, 0, "" }, /* { N_("/Debug/Mark as modified"),NULL, debug_mark, 0, NULL }, */ { N_("/Debug/Dummy effect"),NULL, debug_dummy, 0, NULL }, { N_("/Debug/Dummy effect FP"),NULL, debug_dummy2, 0, NULL }, { N_("/Debug/Check opencount"),NULL, debug_checkoc, 0, NULL }, { N_("/Debug/Dump chunk info"),NULL, debug_chunkinfo,0, NULL }, #endif { N_("/_Help"), NULL, NULL, 0, ""}, { N_("/Help/_Documentation"),"F1", help_readme, 0, NULL }, { N_("/Help/_About"), NULL, help_about, 0, NULL } }; GtkItemFactoryEntry menu_items2[] = { { N_("/File/sep1"), NULL, NULL, 0, "" }, { N_("/File/_Close"), NULL, file_close, 0, NULL }, { N_("/File/sep2"), NULL, NULL, 0, "" }, { N_("/File/_Exit"), NULL, file_exit, 0, NULL } }; gchar *need_chunk_names[] = { "/File/Save", "/File/Save as...", "/Edit/Insert silence", "/Edit/Select all", "/Cursor", "/View", "/Play/Play from cursor", "/Play/Play all", "/Play/Stop", "/Effects", "/Effects/Normalize", "/Effects/Effects dialog...", "/Edit/Select none" }; gchar *need_selection_names[] = { "/Edit/Cut", "/Edit/Copy", "/Edit/Delete", "/Edit/Crop", "/Edit/Silence selection", "/View/Zoom to selection", "/File/Save selection as...", "/Play/Play selection" }; gchar *need_clipboard_names[] = { "/Edit/Paste", "/Edit/Paste over", "/Edit/Mix paste", "/Edit/Paste to new", "/Edit/Clear clipboard" }; GtkAccelGroup *accel_group; GtkItemFactory *item_factory; accel_group = gtk_accel_group_new(); item_factory = gtk_item_factory_new(GTK_TYPE_MENU_BAR,"
", accel_group); #ifdef ENABLE_NLS gtk_item_factory_set_translate_func(item_factory, translate_menu_path, NULL, NULL); #endif gtk_item_factory_create_items_ac(item_factory,ARRAY_LENGTH(menu_items1), menu_items1,w,2); w->recent = NULL; j = inifile_get_guint32("recentFiles",4); if (j > MAINWINDOW_RECENT_MAX) j=4; if (j > 0) { entry.path = "/File/sep3"; entry.item_type = ""; entry.callback = NULL; gtk_item_factory_create_item(item_factory,&entry,w,2); item = gtk_item_factory_get_item(item_factory,entry.path); } for (i=1; i<=j; i++) { entry.item_type = NULL; entry.path = g_strdup_printf("/File/Last%d",i); entry.callback = (GtkItemFactoryCallback)file_recent; gtk_item_factory_create_item(item_factory,&entry,w,2); item = gtk_item_factory_get_item(item_factory,entry.path); w->recent = g_list_append(w->recent, item); gtk_widget_set_sensitive(item,FALSE); g_free(entry.path); } gtk_item_factory_create_items_ac(item_factory,ARRAY_LENGTH(menu_items2), menu_items2,w,2); gtk_window_add_accel_group(GTK_WINDOW(w),accel_group); for (i=0; ineed_chunk_items = g_list_append(w->need_chunk_items,xgtk_item_factory_get_item( item_factory,need_chunk_names[i])); for (i=0; ineed_selection_items = g_list_append(w->need_selection_items, xgtk_item_factory_get_item( item_factory,need_selection_names[i])); for (i=0; ineed_clipboard_items = g_list_append(w->need_clipboard_items, xgtk_item_factory_get_item( item_factory,need_clipboard_names[i])); w->need_undo_items = g_list_append(w->need_undo_items,gtk_item_factory_get_item (item_factory,"/Edit/Undo") ); w->need_redo_items = g_list_append(w->need_redo_items, xgtk_item_factory_get_item(item_factory,"/Edit/Redo")); update_file_recent(w); item = gtk_item_factory_get_item(item_factory,"/View/Zoom in"); w->zoom_items = g_list_append(w->zoom_items,item); item = gtk_item_factory_get_item(item_factory,"/View/Zoom out"); w->zoom_items = g_list_append(w->zoom_items,item); item = gtk_item_factory_get_item(item_factory,"/View/Time scale"); gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM(item), inifile_get_gboolean(INI_SETTING_TIMESCALE, INI_SETTING_TIMESCALE_DEFAULT)); item = gtk_item_factory_get_item(item_factory,"/View/Horizontal zoom"); gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM(item), inifile_get_gboolean(INI_SETTING_HZOOM,INI_SETTING_HZOOM_DEFAULT)); item = gtk_item_factory_get_item(item_factory,"/View/Vertical zoom"); gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM(item), inifile_get_gboolean(INI_SETTING_VZOOM,INI_SETTING_VZOOM_DEFAULT)); item = gtk_item_factory_get_item(item_factory,"/View/Speed slider"); gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM(item), inifile_get_gboolean(INI_SETTING_SPEED,INI_SETTING_SPEED_DEFAULT)); item = gtk_item_factory_get_item(item_factory,"/View/Slider labels"); gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM(item), inifile_get_gboolean(INI_SETTING_SLABELS,INI_SETTING_SLABELS_DEFAULT)); item = gtk_item_factory_get_item(item_factory,"/View/Buffer position"); gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM(item), inifile_get_gboolean(INI_SETTING_BUFPOS,INI_SETTING_BUFPOS_DEFAULT)); item = gtk_item_factory_get_item(item_factory,"/Play/Record..."); gtk_widget_set_sensitive(item,input_supported()); item = gtk_item_factory_get_item(item_factory,"/Edit/Delete"); gtk_widget_add_accelerator(item, "activate", accel_group, GDK_Delete, 0, 0); return gtk_item_factory_get_widget(item_factory,"
"); } static void loopmode_toggle(GtkToggleButton *button, gboolean *user_data) { *user_data = gtk_toggle_button_get_active(button); inifile_set_gboolean("loopMode", *user_data); } static void followmode_toggle(GtkToggleButton *button, gboolean *user_data) { Mainwindow *w = MAINWINDOW(user_data); w->followmode = gtk_toggle_button_get_active(button); if (w->doc != NULL) document_set_followmode(w->doc, w->followmode); inifile_set_gboolean("followMode", w->followmode); } static void bouncemode_toggle(GtkToggleButton *button, gboolean *user_data) { Mainwindow *w = MAINWINDOW(user_data); w->bouncemode = gtk_toggle_button_get_active(button); inifile_set_gboolean("bounceMode", gtk_toggle_button_get_active(button)); } static GtkWidget *create_toolbar(Mainwindow *w) { GtkWidget *t,*b,*r; GdkPixmap *p; GdkBitmap *bmp; #if GTK_MAJOR_VERSION == 2 t = gtk_toolbar_new(); #else t = gtk_toolbar_new(GTK_ORIENTATION_HORIZONTAL, GTK_TOOLBAR_ICONS); #endif p = gdk_pixmap_colormap_create_from_xpm_d( NULL, gtk_widget_get_colormap(GTK_WIDGET(w)), &bmp, NULL, button_open_xpm); b = gtk_pixmap_new(p, bmp); r = gtk_toolbar_append_element( GTK_TOOLBAR(t),GTK_TOOLBAR_CHILD_BUTTON,NULL,NULL, _("Load a file from disk"),"X",b,GTK_SIGNAL_FUNC(file_open),w); p = gdk_pixmap_colormap_create_from_xpm_d( NULL, gtk_widget_get_colormap(GTK_WIDGET(w)), &bmp, NULL, button_save_xpm); b = gtk_pixmap_new(p, bmp); r = gtk_toolbar_append_element( GTK_TOOLBAR(t),GTK_TOOLBAR_CHILD_BUTTON,NULL,NULL, _("Save the current file to disk"),"X",b,GTK_SIGNAL_FUNC(file_save),w); w->need_chunk_items = g_list_append(w->need_chunk_items,r); gtk_toolbar_append_space(GTK_TOOLBAR(t)); p = gdk_pixmap_colormap_create_from_xpm_d( NULL, gtk_widget_get_colormap(GTK_WIDGET(w)), &bmp, NULL, button_undo_xpm); b = gtk_pixmap_new(p, bmp); r = gtk_toolbar_append_element( GTK_TOOLBAR(t),GTK_TOOLBAR_CHILD_BUTTON,NULL,NULL, _("Undo the last change"),"X",b,GTK_SIGNAL_FUNC(edit_undo),w); w->need_undo_items = g_list_append(w->need_undo_items, r); p = gdk_pixmap_colormap_create_from_xpm_d( NULL, gtk_widget_get_colormap(GTK_WIDGET(w)), &bmp, NULL, button_redo_xpm); b = gtk_pixmap_new(p, bmp); r = gtk_toolbar_append_element( GTK_TOOLBAR(t),GTK_TOOLBAR_CHILD_BUTTON,NULL,NULL, _("Redo the last undo operation"),"X",b,GTK_SIGNAL_FUNC(edit_redo), w); w->need_redo_items = g_list_append(w->need_redo_items, r); gtk_toolbar_append_space(GTK_TOOLBAR(t)); p = gdk_pixmap_colormap_create_from_xpm_d( NULL, gtk_widget_get_colormap(GTK_WIDGET(w)), &bmp, NULL, button_cut_xpm); b = gtk_pixmap_new(p, bmp); r = gtk_toolbar_append_element( GTK_TOOLBAR(t),GTK_TOOLBAR_CHILD_BUTTON,NULL,NULL, _("Cut out the current selection"),"X",b,GTK_SIGNAL_FUNC(edit_cut),w); w->need_selection_items = g_list_append(w->need_selection_items, r); p = gdk_pixmap_colormap_create_from_xpm_d( NULL, gtk_widget_get_colormap(GTK_WIDGET(w)), &bmp, NULL, button_copy_xpm); b = gtk_pixmap_new(p, bmp); r = gtk_toolbar_append_element( GTK_TOOLBAR(t),GTK_TOOLBAR_CHILD_BUTTON,NULL,NULL, _("Copy the current selection"),"X",b,GTK_SIGNAL_FUNC(edit_copy),w); w->need_selection_items = g_list_append(w->need_selection_items, r); p = gdk_pixmap_colormap_create_from_xpm_d( NULL, gtk_widget_get_colormap(GTK_WIDGET(w)), &bmp, NULL, button_paste_xpm); b = gtk_pixmap_new(p, bmp); r = gtk_toolbar_append_element( GTK_TOOLBAR(t),GTK_TOOLBAR_CHILD_BUTTON,NULL,NULL, _("Paste at cursor position"),"X",b,GTK_SIGNAL_FUNC(edit_paste),w); w->need_clipboard_items = g_list_append(w->need_clipboard_items, r); p = gdk_pixmap_colormap_create_from_xpm_d( NULL, gtk_widget_get_colormap(GTK_WIDGET(w)), &bmp, NULL, button_pasteover_xpm); b = gtk_pixmap_new(p, bmp); r = gtk_toolbar_append_element( GTK_TOOLBAR(t),GTK_TOOLBAR_CHILD_BUTTON,NULL,NULL, _("Paste, overwriting the data after the cursor position"),"X",b, GTK_SIGNAL_FUNC(edit_pasteover),w); w->need_clipboard_items = g_list_append(w->need_clipboard_items, r); gtk_widget_set_sensitive(r,FALSE); p = gdk_pixmap_colormap_create_from_xpm_d( NULL, gtk_widget_get_colormap(GTK_WIDGET(w)), &bmp, NULL, button_delete_xpm); b = gtk_pixmap_new(p, bmp); r = gtk_toolbar_append_element( GTK_TOOLBAR(t),GTK_TOOLBAR_CHILD_BUTTON,NULL,NULL, _("Delete the selection"),"X",b,GTK_SIGNAL_FUNC(edit_delete),w); w->need_selection_items = g_list_append(w->need_selection_items, r); gtk_toolbar_append_space(GTK_TOOLBAR(t)); p = gdk_pixmap_colormap_create_from_xpm_d( NULL, gtk_widget_get_colormap(GTK_WIDGET(w)), &bmp, NULL, button_cursorstart_xpm); b = gtk_pixmap_new(p, bmp); r = gtk_toolbar_append_element( GTK_TOOLBAR(t),GTK_TOOLBAR_CHILD_BUTTON,NULL,NULL, _("Set selection start to cursor position"),"X",b, GTK_SIGNAL_FUNC(edit_selstartcursor),w); w->need_chunk_items = g_list_append(w->need_chunk_items, r); p = gdk_pixmap_colormap_create_from_xpm_d( NULL, gtk_widget_get_colormap(GTK_WIDGET(w)), &bmp, NULL, button_cursorend_xpm); b = gtk_pixmap_new(p, bmp); r = gtk_toolbar_append_element( GTK_TOOLBAR(t),GTK_TOOLBAR_CHILD_BUTTON,NULL,NULL, _("Set selection end to cursor position"),"X",b, GTK_SIGNAL_FUNC(edit_selendcursor),w); w->need_chunk_items = g_list_append(w->need_chunk_items, r); gtk_toolbar_append_space(GTK_TOOLBAR(t)); p = gdk_pixmap_colormap_create_from_xpm_d( NULL, gtk_widget_get_colormap(GTK_WIDGET(w)), &bmp, NULL, button_play_xpm); b = gtk_pixmap_new(p, bmp); r = gtk_toolbar_append_element( GTK_TOOLBAR(t),GTK_TOOLBAR_CHILD_BUTTON,NULL,NULL, _("Play from cursor position"),"X",b, GTK_SIGNAL_FUNC(edit_play),w); w->need_chunk_items = g_list_append(w->need_chunk_items, r); p = gdk_pixmap_colormap_create_from_xpm_d (NULL, gtk_widget_get_colormap(GTK_WIDGET(w)), &bmp, NULL, button_playselection_xpm); b = gtk_pixmap_new(p, bmp); r = gtk_toolbar_append_element( GTK_TOOLBAR(t),GTK_TOOLBAR_CHILD_BUTTON,NULL,NULL, _("Play selected area"),"X",b, GTK_SIGNAL_FUNC(edit_playselection),w); w->need_chunk_items = g_list_append(w->need_chunk_items,r); p = gdk_pixmap_colormap_create_from_xpm_d( NULL, gtk_widget_get_colormap(GTK_WIDGET(w)), &bmp, NULL, button_stop_xpm); b = gtk_pixmap_new(p, bmp); r = gtk_toolbar_append_element( GTK_TOOLBAR(t),GTK_TOOLBAR_CHILD_BUTTON,NULL,NULL, _("Stop playing"),"X",b, GTK_SIGNAL_FUNC(edit_stop),w); w->need_chunk_items = g_list_append(w->need_chunk_items, r); gtk_toolbar_append_space(GTK_TOOLBAR(t)); p = gdk_pixmap_colormap_create_from_xpm_d( NULL, gtk_widget_get_colormap(GTK_WIDGET(w)), &bmp, NULL, button_loop_xpm); b = gtk_pixmap_new(p, bmp); r = gtk_toolbar_append_element( GTK_TOOLBAR(t),GTK_TOOLBAR_CHILD_TOGGLEBUTTON,NULL,NULL, _("Loop mode (play over and over)"),"X",b, GTK_SIGNAL_FUNC(loopmode_toggle),&(w->loopmode)); if ( inifile_get_gboolean("loopMode",FALSE) ) gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(r), TRUE); p = gdk_pixmap_colormap_create_from_xpm_d( NULL, gtk_widget_get_colormap(GTK_WIDGET(w)), &bmp, NULL, button_follow_xpm); b = gtk_pixmap_new(p, bmp); r = gtk_toolbar_append_element( GTK_TOOLBAR(t),GTK_TOOLBAR_CHILD_TOGGLEBUTTON,NULL,NULL, _("Keep view and playback together"),"X",b, GTK_SIGNAL_FUNC(followmode_toggle),w); if ( inifile_get_gboolean("followMode",FALSE) ) { gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(r), TRUE); w->followmode = TRUE; } else w->followmode = FALSE; p = gdk_pixmap_colormap_create_from_xpm_d( NULL, gtk_widget_get_colormap(GTK_WIDGET(w)), &bmp, NULL, button_bounce_xpm); b = gtk_pixmap_new(p, bmp); r = gtk_toolbar_append_element( GTK_TOOLBAR(t),GTK_TOOLBAR_CHILD_TOGGLEBUTTON,NULL,NULL, _("Auto return to playback start"),"X",b, GTK_SIGNAL_FUNC(bouncemode_toggle),w); if ( inifile_get_gboolean("bounceMode",FALSE) ) { gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(r), TRUE); w->bouncemode = TRUE; } gtk_toolbar_append_space(GTK_TOOLBAR(t)); p = gdk_pixmap_colormap_create_from_xpm_d( NULL, gtk_widget_get_colormap(GTK_WIDGET(w)), &bmp, NULL, button_record_xpm); b = gtk_pixmap_new(p, bmp); r = gtk_toolbar_append_element( GTK_TOOLBAR(t),GTK_TOOLBAR_CHILD_BUTTON,NULL,NULL, _("Record"),"X",b,GTK_SIGNAL_FUNC(edit_record),w); gtk_widget_set_sensitive(r,input_supported()); gtk_toolbar_append_space(GTK_TOOLBAR(t)); p = gdk_pixmap_colormap_create_from_xpm_d( NULL, gtk_widget_get_colormap(GTK_WIDGET(w)), &bmp, NULL, button_mixer_xpm); b = gtk_pixmap_new(p, bmp); r = gtk_toolbar_append_element( GTK_TOOLBAR(t),GTK_TOOLBAR_CHILD_BUTTON,NULL,NULL, _("Launch mixer"),"X",b,GTK_SIGNAL_FUNC(launch_mixer),w); return t; } static gboolean setting_zoom_flag = FALSE; static void mainwindow_view_changed(Document *d, gpointer user_data) { float max_samp,min_samp,current_samp; Mainwindow *w = MAINWINDOW(user_data); w->view_adj->page_size = (d->viewend - d->viewstart); w->view_adj->upper = d->chunk->length; w->view_adj->value = d->viewstart; w->view_adj->step_increment = 16; w->view_adj->page_increment = w->view_adj->page_size / 2; gtk_adjustment_changed ( w->view_adj ); setting_zoom_flag = TRUE; max_samp = w->doc->chunk->length; min_samp = GTK_WIDGET(w->view)->allocation.width; current_samp = w->doc->viewend - w->doc->viewstart; if (current_samp < min_samp) { if (current_samp < w->doc->chunk->length) { /* We are zoomed in longer than the slider allows, so set it * to max */ w->zoom_adj->value = 1.0; w->zoom_adj->page_size = 0.2; set_sensitive(w->zoom_items,TRUE); } else { /* We're viewing the whole chunk and can't zoom in or out */ w->zoom_adj->value = 0.0; w->zoom_adj->page_size = 1.2; set_sensitive(w->zoom_items,FALSE); } } else { w->zoom_adj->value = log(current_samp/max_samp)/log(min_samp/max_samp); w->zoom_adj->page_size = 0.2; set_sensitive(w->zoom_items,TRUE); } gtk_adjustment_changed ( w->zoom_adj ); setting_zoom_flag = FALSE; update_desc(w); } static void mainwindow_selection_changed(Document *d, gpointer user_data) { Mainwindow *w = MAINWINDOW ( user_data ); update_desc ( w ); set_sensitive(w->need_selection_items, (d->selstart != d->selend)); } static void mainwindow_cursor_changed(Document *d, gboolean rolling, gpointer user_data) { Mainwindow *w; w = MAINWINDOW ( user_data ); if (!rolling || status_bar_roll_cursor) update_desc(w); } static void mainwindow_state_changed(Document *d, gpointer user_data) { Mainwindow *w = MAINWINDOW(user_data); fix_title(w); update_desc(w); set_sensitive(w->need_undo_items,document_can_undo(d)); set_sensitive(w->need_redo_items,document_can_redo(d)); set_sensitive(w->need_selection_items,(d->selstart != d->selend)); mainwindow_view_changed(d,user_data); } static void mainwindow_value_changed(GtkAdjustment *adjustment, gpointer user_data) { Document *d = MAINWINDOW(user_data)->doc; off_t s,e; s = (off_t)adjustment->value; e = (off_t)(adjustment->value + adjustment->page_size); /* Due to rounding, these can become out of range. * Especially for GTK1 where value and page_size are gfloats */ if (s < 0) s = 0; if (e <= s) e = s+1; else if (e > d->chunk->length) e = d->chunk->length; document_set_view(d, s, e); } static void mainwindow_zoom_changed(GtkAdjustment *adjustment, gpointer user_data) { gboolean follow_cursor; float max_samp,min_samp,target_samp,current_samp; Mainwindow *w = MAINWINDOW(user_data); /* puts("mainwindow_zoom_changed"); */ if (setting_zoom_flag) return; current_samp = w->doc->viewend - w->doc->viewstart; min_samp = GTK_WIDGET(w->view)->allocation.width; max_samp = w->doc->chunk->length; target_samp = max_samp * pow(min_samp/max_samp,adjustment->value); follow_cursor = target_samp <= current_samp; document_zoom(w->doc,current_samp/target_samp,follow_cursor); } static void mainwindow_vertical_zoom_changed(GtkAdjustment *adjustment, gpointer user_data) { gfloat s; Mainwindow *w = MAINWINDOW(user_data); gchar c[32],d[32]; int ndec; s = pow(100.0, adjustment->value); chunk_view_set_scale(w->view, s); ndec = 3-(int)(adjustment->value*2.0); if (ndec > 0) { g_snprintf(d,sizeof(d),"V: %%.0%df",ndec); g_snprintf(c,sizeof(c),d,(float) s); } else { g_snprintf(c,sizeof(c),"V: %d",(int)s); } gtk_label_set_text(w->vzoom_label,c); } static void mainwindow_speed_changed(GtkAdjustment *adjustment, gpointer user_data) { Mainwindow *w = MAINWINDOW(user_data); gchar c[32]; gfloat f; f = adjustment->value; #ifdef INV_SPEED f = -f; #endif if (w->doc == playing_document) player_set_speed(f); g_snprintf(c,sizeof(c),"S: %d%%",(int)(f*100.0+0.5)); gtk_label_set_text(w->speed_label,c); } static void dc_func(gchar *label, off_t pos, gpointer fud) { off_t *ud = (off_t *)fud; if (pos < ud[0] && pos > ud[1]) ud[1] = pos; else if (pos > ud[0] && pos < ud[2]) ud[2] = pos; } static void mainwindow_view_double_click(ChunkView *view, off_t *sample, Mainwindow *wnd) { off_t o[3] = { *sample, 0, wnd->doc->chunk->length }; document_foreach_mark(wnd->doc,dc_func,o); document_set_selection(wnd->doc,o[1],o[2]); } static gint hzoom_scale_press(GtkWidget *widget, GdkEventButton *event, gpointer user_data) { Mainwindow *mw = MAINWINDOW(user_data); if (event->button == 3) { gtk_adjustment_set_value(mw->zoom_adj, 0); return TRUE; } return FALSE; } static gint vzoom_scale_press(GtkWidget *widget, GdkEventButton *event, gpointer user_data) { Mainwindow *mw = MAINWINDOW(user_data); if (event->button == 3) { gtk_adjustment_set_value(mw->vertical_zoom_adj, 0); return TRUE; } return FALSE; } static gint speed_scale_press(GtkWidget *widget, GdkEventButton *event, gpointer user_data) { Mainwindow *mw = MAINWINDOW(user_data); if (event->button == 3) { #ifdef INV_SPEED gtk_adjustment_set_value(mw->speed_adj, -1.0); #else gtk_adjustment_set_value(mw->speed_adj, 1.0); #endif return TRUE; } return FALSE; } static void mainwindow_init(Mainwindow *obj) { GtkWidget *a,*b,*c; GtkRequisition req; GtkTargetEntry gte; if (!window_geometry_stack_inited) { if (inifile_get_gboolean("useGeometry",FALSE)) window_geometry_stack = geometry_stack_from_inifile("windowGeometry"); window_geometry_stack_inited = TRUE; load_recent(); } /* Stll in datastrukturen */ obj->view = CHUNKVIEW(chunk_view_new()); chunk_view_set_timescale( obj->view, inifile_get_gboolean(INI_SETTING_TIMESCALE, INI_SETTING_TIMESCALE_DEFAULT)); obj->view->show_bufpos = inifile_get_gboolean (INI_SETTING_BUFPOS,INI_SETTING_BUFPOS_DEFAULT); gtk_signal_connect( GTK_OBJECT(obj->view), "double-click", GTK_SIGNAL_FUNC(mainwindow_view_double_click), obj); obj->view_adj = GTK_ADJUSTMENT( gtk_adjustment_new ( 0,0,0,0,0,0 )); gtk_signal_connect( GTK_OBJECT(obj->view_adj), "value-changed", GTK_SIGNAL_FUNC(mainwindow_value_changed), obj); obj->zoom_adj = GTK_ADJUSTMENT( gtk_adjustment_new ( 0, 0, 1.2,0.01, 0.1, 0.2 )); gtk_signal_connect( GTK_OBJECT(obj->zoom_adj), "value-changed", GTK_SIGNAL_FUNC(mainwindow_zoom_changed), obj); obj->vertical_zoom_adj = GTK_ADJUSTMENT(gtk_adjustment_new ( 0, 0, 0.2 + log (inifile_get_guint32 ("vzoomMax", 100)) / log (100.0), 0.01, 0.1, 0.2 )); gtk_signal_connect( GTK_OBJECT(obj->vertical_zoom_adj), "value-changed", GTK_SIGNAL_FUNC(mainwindow_vertical_zoom_changed), obj); #ifdef INV_SPEED obj->speed_adj = GTK_ADJUSTMENT(gtk_adjustment_new(-1.0,-2.0,0.20,0.01,0.1,0.2)); #else obj->speed_adj = GTK_ADJUSTMENT(gtk_adjustment_new(1.0,0.0,2.2,0.01,0.1,0.2)); #endif gtk_signal_connect(GTK_OBJECT(obj->speed_adj),"value-changed", GTK_SIGNAL_FUNC(mainwindow_speed_changed), obj); obj->statusbar = STATUSBAR(status_bar_new()); gtk_signal_connect(GTK_OBJECT(obj->statusbar),"progress_begin", GTK_SIGNAL_FUNC(procstart),obj); gtk_signal_connect(GTK_OBJECT(obj->statusbar),"progress_end", GTK_SIGNAL_FUNC(procend),obj); obj->loopmode = inifile_get_gboolean("loopMode",FALSE); obj->bouncemode = FALSE; /* Set to true by create_toolbar */ obj->sensitive = TRUE; obj->vzoom_icon = obj->vzoom_slider = NULL; obj->hzoom_icon = obj->hzoom_slider = NULL; obj->speed_icon = obj->speed_slider = NULL; obj->speed_label = GTK_LABEL(gtk_label_new("S: 500%")); gtk_misc_set_alignment(GTK_MISC(obj->speed_label),0.0,0.0); gtk_widget_size_request(GTK_WIDGET(obj->speed_label),&req); gtk_widget_set_usize(GTK_WIDGET(obj->speed_label),req.width,req.height); obj->vzoom_label = GTK_LABEL(gtk_label_new("V: 1.000")); gtk_misc_set_alignment(GTK_MISC(obj->vzoom_label),0.0,0.0); gtk_widget_size_request(GTK_WIDGET(obj->vzoom_label),&req); gtk_widget_set_usize(GTK_WIDGET(obj->vzoom_label),req.width,req.height); obj->need_chunk_items = NULL; obj->need_selection_items = NULL; obj->need_clipboard_items = NULL; obj->need_undo_items = NULL; obj->zoom_items = NULL; fix_title ( obj ); /* Bygg upp komponenterna */ a = gtk_vbox_new( FALSE, 0 ); gtk_container_add(GTK_CONTAINER(obj),a); b = create_menu( obj ); obj->menubar = b; gtk_box_pack_start(GTK_BOX(a),b,FALSE,FALSE,0); b = gtk_table_new(3,4,FALSE); gtk_box_pack_start(GTK_BOX(a),b,TRUE,TRUE,0); c = create_toolbar( obj ); obj->toolbar = c; c = gtk_event_box_new(); gtk_container_add(GTK_CONTAINER(c),GTK_WIDGET(obj->toolbar)); gtk_widget_size_request(c,&req); gtk_widget_set_usize(c,10,req.height); gtk_table_attach(GTK_TABLE(b),c,0,1,0,1,GTK_SHRINK|GTK_FILL,GTK_FILL,0,0); c = bitmap_new_from_data(vzoom_bits, vzoom_width, vzoom_height); bitmap_set_fg(BITMAP(c),0.8); gtk_table_attach(GTK_TABLE(b),c,1,2,0,1,GTK_FILL,0,0,0); obj->vzoom_icon = c; c = bitmap_new_from_data(hzoom_bits, hzoom_width, hzoom_height); bitmap_set_fg(BITMAP(c),0.8); gtk_table_attach(GTK_TABLE(b),c,2,3,0,1,GTK_FILL,0,0,0); obj->hzoom_icon = c; c = bitmap_new_from_data(speed_bits, speed_width, speed_height); bitmap_set_fg(BITMAP(c),0.8); gtk_table_attach(GTK_TABLE(b),c,3,4,0,1,GTK_FILL,0,0,0); obj->speed_icon = c; gtk_table_attach(GTK_TABLE(b),GTK_WIDGET(obj->view),0,1,1,2, GTK_EXPAND|GTK_FILL|GTK_SHRINK, GTK_EXPAND|GTK_FILL|GTK_SHRINK,0,0); c = gtk_vscale_new ( obj->zoom_adj ); /* GTK1 doesn't work well with using the right mouse button press event. * As a work around, we use the release event instead */ #if GTK_MAJOR_VERSION > 1 gtk_signal_connect(GTK_OBJECT(c),"button_press_event",GTK_SIGNAL_FUNC(hzoom_scale_press),obj); #else gtk_signal_connect(GTK_OBJECT(c),"button_release_event",GTK_SIGNAL_FUNC(hzoom_scale_press),obj); #endif gtk_scale_set_digits(GTK_SCALE(c),3); gtk_scale_set_draw_value (GTK_SCALE(c), FALSE); gtk_table_attach(GTK_TABLE(b),c,2,3,1,2,0,GTK_EXPAND|GTK_FILL,0,0); obj->need_chunk_items = g_list_append(obj->need_chunk_items,c); obj->hzoom_slider = c; c = gtk_vscale_new ( obj->vertical_zoom_adj ); #if GTK_MAJOR_VERSION > 1 gtk_signal_connect(GTK_OBJECT(c),"button_press_event",GTK_SIGNAL_FUNC(vzoom_scale_press),obj); #else gtk_signal_connect(GTK_OBJECT(c),"button_release_event",GTK_SIGNAL_FUNC(vzoom_scale_press),obj); #endif gtk_scale_set_digits(GTK_SCALE(c),3); gtk_scale_set_draw_value (GTK_SCALE(c), FALSE); gtk_table_attach(GTK_TABLE(b),c,1,2,1,2,0,GTK_EXPAND|GTK_FILL,0,0); obj->need_chunk_items = g_list_append(obj->need_chunk_items,c); obj->vzoom_slider = c; c = gtk_vscale_new ( obj->speed_adj ); #if GTK_MAJOR_VERSION > 1 gtk_signal_connect(GTK_OBJECT(c),"button_press_event",GTK_SIGNAL_FUNC(speed_scale_press),obj); #else gtk_signal_connect(GTK_OBJECT(c),"button_release_event",GTK_SIGNAL_FUNC(speed_scale_press),obj); #endif gtk_scale_set_digits(GTK_SCALE(c),2); gtk_scale_set_draw_value (GTK_SCALE(c), FALSE); /* gtk_range_set_update_policy(GTK_RANGE(c),GTK_UPDATE_DELAYED); */ #ifndef INV_SPEED gtk_range_set_inverted(GTK_RANGE(c),TRUE); #endif gtk_table_attach(GTK_TABLE(b),c,3,4,1,2,0,GTK_EXPAND|GTK_FILL,0,0); obj->need_chunk_items = g_list_append(obj->need_chunk_items,c); obj->speed_slider = c; c = gtk_hscrollbar_new ( obj->view_adj ); gtk_table_attach(GTK_TABLE(b),c,0,1,2,3,GTK_FILL,0,0,0); c = GTK_WIDGET(obj->speed_label); gtk_table_attach(GTK_TABLE(b),c,1,4,3,4,GTK_FILL,0,2,0); c = gtk_event_box_new(); gtk_container_add(GTK_CONTAINER(c),GTK_WIDGET (obj->statusbar)); gtk_table_attach(GTK_TABLE(b),c,0,1,3,4,GTK_FILL,0,0,0); c = GTK_WIDGET(obj->vzoom_label); gtk_table_attach(GTK_TABLE(b),c,1,4,2,3,GTK_FILL,0,2,0); gtk_adjustment_value_changed(obj->speed_adj); gtk_adjustment_value_changed(obj->vertical_zoom_adj); gtk_widget_show_all(a); if (!inifile_get_gboolean(INI_SETTING_VZOOM,INI_SETTING_VZOOM_DEFAULT)) { gtk_widget_hide(obj->vzoom_icon); gtk_widget_hide(obj->vzoom_slider); gtk_widget_hide(GTK_WIDGET(obj->vzoom_label)); } if (!inifile_get_gboolean(INI_SETTING_HZOOM,INI_SETTING_HZOOM_DEFAULT)) { gtk_widget_hide(obj->hzoom_icon); gtk_widget_hide(obj->hzoom_slider); } if (!inifile_get_gboolean(INI_SETTING_SPEED,INI_SETTING_SPEED_DEFAULT)) { gtk_widget_hide(obj->speed_icon); gtk_widget_hide(obj->speed_slider); gtk_widget_hide(GTK_WIDGET(obj->speed_label)); } obj->show_labels = inifile_get_gboolean(INI_SETTING_SLABELS,INI_SETTING_SLABELS_DEFAULT); if (!obj->show_labels) { gtk_widget_hide(GTK_WIDGET(obj->vzoom_label)); gtk_widget_hide(GTK_WIDGET(obj->speed_label)); } gtk_window_set_policy(GTK_WINDOW(obj),FALSE,TRUE,FALSE); set_sensitive(obj->need_chunk_items, FALSE); set_sensitive(obj->need_selection_items, FALSE); set_sensitive(obj->need_clipboard_items, clipboard != NULL); set_sensitive(obj->need_undo_items, FALSE); set_sensitive(obj->need_redo_items, FALSE); if (!geometry_stack_pop(&window_geometry_stack,NULL,GTK_WINDOW(obj))) gtk_window_set_default_size(GTK_WINDOW(obj),540,230); /* Setup drag'n'drop target */ gte.target = "text/uri-list"; gte.flags = gte.info = 0; gtk_drag_dest_set(GTK_WIDGET(obj), GTK_DEST_DEFAULT_ALL, >e, 1, GDK_ACTION_COPY | GDK_ACTION_MOVE); } GtkType mainwindow_get_type(void) { static GtkType id=0; if (!id) { GtkTypeInfo info = { "Mainwindow", sizeof(Mainwindow), sizeof(MainwindowClass), (GtkClassInitFunc) mainwindow_class_init, (GtkObjectInitFunc) mainwindow_init }; id=gtk_type_unique(gtk_window_get_type(),&info); } return id; } GtkWidget *mainwindow_new(void) { return GTK_WIDGET( gtk_type_new(mainwindow_get_type()) ); } GtkWidget *mainwindow_new_with_file(char *filename, gboolean log) { Mainwindow *w; Document *doc; gchar *d; w = MAINWINDOW ( mainwindow_new() ); d = make_filename_rooted(filename); doc = document_new_with_file(d, w->statusbar); if (doc != NULL) { mainwindow_set_document(w, doc, d); if (log) { inifile_set("lastOpenFile",d); recent_file(d); } } g_free(d); return GTK_WIDGET(w); } static void reset_statusbar(Mainwindow *w) { status_bar_reset(w->statusbar); } void mainwindow_update_texts(void) { list_object_foreach(mainwindow_objects,(GFunc)fix_title,NULL); list_object_foreach(mainwindow_objects,(GFunc)reset_statusbar,NULL); list_object_foreach(mainwindow_objects,(GFunc)update_desc,NULL); } void mainwindow_set_sensitive(Mainwindow *mw, gboolean sensitive) { gtk_widget_set_sensitive(mw->menubar,sensitive); gtk_widget_set_sensitive(mw->toolbar,sensitive); gtk_widget_set_sensitive(GTK_WIDGET(mw->view),sensitive); mw->sensitive = sensitive; } void mainwindow_set_all_sensitive(gboolean sensitive) { list_object_foreach(mainwindow_objects,(GFunc)mainwindow_set_sensitive, GINT_TO_POINTER(sensitive)); } void mainwindow_repaint_views(void) { GList *l; for (l=mainwindow_objects->list; l!=NULL; l=l->next) { chunk_view_force_repaint(MAINWINDOW(l->data)->view); } } mhwaveedit-1.4.24/src/mainwindow.h000066400000000000000000000055261334022513400170600ustar00rootroot00000000000000/* * Copyright (C) 2002 2003 2004 2005 2006 2011 2012, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #ifndef MAINWINDOW_H_INCLUDED #define MAINWINDOW_H_INCLUDED #include #include "chunkview.h" #include "statusbar.h" #include "listobject.h" #define MAINWINDOW(obj) GTK_CHECK_CAST(obj,mainwindow_get_type(),Mainwindow) #define MAINWINDOW_CLASS(class) GTK_CHECK_CLASS_CAST(class,mainwindow_get_type(),MainwindowClass) #define IS_MAINWINDOW(obj) GTK_CHECK_TYPE(obj,mainwindow_get_type()) #define MAINWINDOW_RECENT_MAX 20 #define MAINWINDOW_SCROLL_DELTA_RATIO 4 #define MAINWINDOW_NUDGE_DELTA_RATIO 8 typedef struct _Mainwindow { GtkWindow window; ChunkView *view; GtkAdjustment *view_adj,*zoom_adj,*vertical_zoom_adj,*speed_adj; StatusBar *statusbar; gboolean sensitive; GtkWidget *menubar,*toolbar; GtkWidget *vzoom_icon,*vzoom_slider,*hzoom_icon,*hzoom_slider; GtkWidget *speed_icon,*speed_slider; GtkLabel *vzoom_label, *speed_label; gboolean show_labels; gboolean esc_pressed_flag; GList *need_chunk_items; GList *need_selection_items; GList *need_clipboard_items; GList *need_undo_items, *need_redo_items; GList *zoom_items; Document *doc; gboolean loopmode,bouncemode; gboolean followmode; GtkWidget *recent_sep; /* Separator that should be hidden if there * aren't any recent files */ GList *recent; /* List of menu items with recent files */ } Mainwindow; typedef struct _MainwindowClass { GtkWindowClass parent; } MainwindowClass; extern ListObject *mainwindow_objects; extern gboolean autoplay_mark_flag, varispeed_reset_flag; GtkType mainwindow_get_type(void); GtkWidget *mainwindow_new(); GtkWidget *mainwindow_new_with_file(char *filename, gboolean log); gboolean mainwindow_update_caches(void); void mainwindow_update_texts(void); void mainwindow_repaint_views(void); void mainwindow_set_sensitive(Mainwindow *mw, gboolean sensitive); void mainwindow_set_all_sensitive(gboolean active); void mainwindow_set_speed_sensitive(gboolean s); Mainwindow *mainwindow_playing_window(void); #endif mhwaveedit-1.4.24/src/mapchannelsdialog.c000066400000000000000000000137301334022513400203440ustar00rootroot00000000000000/* * Copyright (C) 2002 2003 2004 2005 2006, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include #include "gettext.h" #include "mainwindow.h" #include "mapchannelsdialog.h" #include "effectbrowser.h" #include "main.h" static GtkObjectClass *parent_class; static gboolean *map_matrix = NULL; static Chunk *map_channels_dialog_apply_proc(Chunk *chunk, StatusBar *bar, gpointer user_data) { MapChannelsDialog *mcd = MAP_CHANNELS_DIALOG(user_data); g_assert(mcd->channels_in == chunk->format.channels); return chunk_remap_channels(chunk,mcd->channels_out,map_matrix, dither_editing,bar); } static gboolean map_channels_dialog_apply(EffectDialog *ed) { guint i,j; gboolean b; Document *d = EFFECT_BROWSER(ed->eb)->dl->selected; MapChannelsDialog *mcd = MAP_CHANNELS_DIALOG(ed); g_assert(mcd->channels_in == d->chunk->format.channels); if (intbox_check(mcd->outchannels)) return TRUE; map_matrix = g_malloc(mcd->channels_in*mcd->channels_out* sizeof(gboolean)); for (i=0; ichannels_in; i++) for (j=0; jchannels_out; j++) map_matrix[i*mcd->channels_out + j] = gtk_toggle_button_get_active(mcd->channel_map[i*8+j]); b = document_apply_cb(d,map_channels_dialog_apply_proc,FALSE,mcd); g_free(map_matrix); map_matrix = NULL; return b; } static void map_channels_dialog_target_changed(EffectDialog *ed) { MapChannelsDialog *ccd = MAP_CHANNELS_DIALOG(ed); if (ccd->channels_in != EFFECT_BROWSER(ed->eb)->dl->format.channels) effect_browser_invalidate_effect(EFFECT_BROWSER(ed->eb), "mapchannels",'B'); } static void numchannels_changed(Intbox *box, long int val, gpointer user_data) { MapChannelsDialog *mcd = MAP_CHANNELS_DIALOG(user_data); int i,j; mcd->channels_out = val; for (i=0; i<8; i++) { if (i < val) gtk_widget_show(mcd->outnames[i]); else gtk_widget_hide(mcd->outnames[i]); for (j=0; jchannels_in; j++) { if (i < val) gtk_widget_show(GTK_WIDGET(mcd->channel_map[j*8+i])); else gtk_widget_hide(GTK_WIDGET(mcd->channel_map[j*8+i])); } } } static void map_channels_setup(EffectDialog *ed) { int i,j; GtkWidget *z,*a,*b,*c,*d; GtkLabel *l; guint channels_in = EFFECT_BROWSER(ed->eb)->dl->format.channels; MapChannelsDialog *mcd = MAP_CHANNELS_DIALOG(ed); mcd->channels_in = channels_in; mcd->channels_out = channels_in; mcd->outchannels = INTBOX(intbox_new(8)); z = gtk_vbox_new(FALSE,5); gtk_box_pack_start(GTK_BOX(ed->input_area),z,FALSE,FALSE,0); a = gtk_label_new(_("This effect applies to the whole file, " "not just the selection")); gtk_container_add(GTK_CONTAINER(z),a); a = gtk_hbox_new(FALSE,3); gtk_container_add(GTK_CONTAINER(z),a); b = gtk_label_new(_("Output channels: ")); gtk_box_pack_start(GTK_BOX(a),b,FALSE,FALSE,0); b = intbox_create_scale(mcd->outchannels,1,8); gtk_box_pack_start(GTK_BOX(a),b,FALSE,FALSE,0); b = GTK_WIDGET(mcd->outchannels); gtk_box_pack_start(GTK_BOX(a),b,FALSE,FALSE,0); a = gtk_frame_new(_("Map")); gtk_container_add(GTK_CONTAINER(z),a); b = gtk_table_new(2+channels_in,3,FALSE); gtk_container_add(GTK_CONTAINER(a),b); attach_label("x",b,1,1); c = gtk_label_new(_("Source")); gtk_table_attach(GTK_TABLE(b),c,0,1,2,2+channels_in,0,0,4,0); attach_label(_("Destination"),b,0,2); /* c = gtk_label_new(_("Destination")); gtk_misc_set_alignment(GTK_MISC(c),0.0,0.5); gtk_table_attach(GTK_TABLE(b),c,2,3,0,1,GTK_FILL,0,10,0); */ c = gtk_table_new(1+channels_in,8,TRUE); gtk_table_attach(GTK_TABLE(b),c,2,3,1,2+channels_in,GTK_FILL,GTK_FILL,0,0); for (i=0; i<8; i++) { l = attach_label(channel_name(i,8),c,0,i); mcd->outnames[i] = GTK_WIDGET(l); } for (i=0; ichannel_map[i*8+j] = GTK_TOGGLE_BUTTON(d); gtk_table_attach(GTK_TABLE(c),d,j,j+1,1+i,1+i+1,GTK_FILL,0,0, 0); } } gtk_table_set_col_spacings(GTK_TABLE(c),4); gtk_widget_show_all(z); gtk_signal_connect(GTK_OBJECT(mcd->outchannels),"numchanged", GTK_SIGNAL_FUNC(numchannels_changed),mcd); intbox_set(mcd->outchannels,mcd->channels_out); } static void map_channels_dialog_class_init(EffectDialogClass *klass) { parent_class = gtk_type_class(effect_dialog_get_type()); klass->apply = map_channels_dialog_apply; klass->setup = map_channels_setup; klass->target_changed = map_channels_dialog_target_changed; } static void map_channels_dialog_init(MapChannelsDialog *obj) { } GtkType map_channels_dialog_get_type(void) { static GtkType id = 0; if (!id) { GtkTypeInfo info = { "MapChannelsDialog", sizeof(MapChannelsDialog), sizeof(MapChannelsDialogClass), (GtkClassInitFunc)map_channels_dialog_class_init, (GtkObjectInitFunc)map_channels_dialog_init }; id = gtk_type_unique(effect_dialog_get_type(),&info); } return id; } mhwaveedit-1.4.24/src/mapchannelsdialog.h000066400000000000000000000030721334022513400203470ustar00rootroot00000000000000/* * Copyright (C) 2002 2003 2004 2006, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #ifndef MAPCHANNELSDIALOG_H_INCLUDED #define MAPCHANNELSDIALOG_H_INCLUDED #include #include "effectdialog.h" #include "int_box.h" #define MAP_CHANNELS_DIALOG(obj) GTK_CHECK_CAST(obj,map_channels_dialog_get_type(),MapChannelsDialog) #define MAP_CHANNELS_DIALOG_CLASS(klass) GTK_CHECK_CLASS_CAST(klass,map_channels_dialog_get_type(),MapChannelsDialogClass) #define IS_MAP_CHANNELS_DIALOG(obj) GTK_CHECK_TYPE(obj,map_channels_dialog_get_type()) typedef struct { EffectDialog ed; guint channels_in,channels_out; GtkToggleButton *channel_map[8*8]; Intbox *outchannels; GtkWidget *outnames[8]; } MapChannelsDialog; typedef struct { EffectDialogClass edc; } MapChannelsDialogClass; GtkType map_channels_dialog_get_type(); #endif mhwaveedit-1.4.24/src/pipedialog.c000066400000000000000000000340461334022513400170130ustar00rootroot00000000000000/* * Copyright (C) 2002 2003 2004 2005 2006 2008 2010, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include #include #include #include #include #include #include #include #include #include #include #include "main.h" #include "pipedialog.h" #include "um.h" #include "inifile.h" #include "tempfile.h" #include "effectbrowser.h" #include "gettext.h" struct pipe_data { int fds[3]; gchar *command; GtkWidget *error_log; }; extern char **environ; static Chunk *pipe_dialog_apply_proc(Chunk *chunk, StatusBar *bar, gpointer user_data) { gchar *cmd; gboolean sendwav; PipeDialog *pd = PIPE_DIALOG(user_data); Chunk *r; off_t clipcount = 0; cmd = history_box_get_value(pd->cmd); sendwav = gtk_toggle_button_get_active(pd->sendwav); inifile_set_gboolean("PipeDialog_sendWav",sendwav); r = pipe_dialog_pipe_chunk(chunk,cmd,sendwav,dither_editing,bar, &clipcount); if (r != NULL && clipwarn(clipcount,TRUE)) { gtk_object_sink(GTK_OBJECT(r)); r = NULL; } return r; } static gboolean pipe_dialog_apply(EffectDialog *ed) { gboolean b; PipeDialog *pd = PIPE_DIALOG(ed); b = document_apply_cb(EFFECT_BROWSER(ed->eb)->dl->selected, pipe_dialog_apply_proc,TRUE,pd); history_box_rotate_history(pd->cmd); return b; } static void pipe_dialog_init(PipeDialog *pd) { GtkWidget *a,*b,*c; c = gtk_vbox_new(FALSE,3); gtk_container_add(EFFECT_DIALOG(pd)->input_area,c); gtk_widget_show(c); a = gtk_hbox_new(FALSE,0); gtk_box_pack_start(GTK_BOX(c),a,FALSE,FALSE,0); gtk_widget_show(a); b = gtk_label_new(_("Command line: ")); gtk_box_pack_start(GTK_BOX(a),b,FALSE,FALSE,0); gtk_widget_show(b); b = history_box_new("PipeDialog",""); gtk_box_pack_start(GTK_BOX(a),b,TRUE,TRUE,0); gtk_widget_show(b); pd->cmd = HISTORY_BOX(b); a = gtk_check_button_new_with_label(_("Send wav header")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(a), inifile_get_gboolean("PipeDialog_sendWav", FALSE)); gtk_box_pack_start(GTK_BOX(c),a,FALSE,FALSE,0); gtk_widget_show(a); pd->sendwav = GTK_TOGGLE_BUTTON(a); } static void pipe_dialog_class_init(EffectDialogClass *edc) { edc->apply = pipe_dialog_apply; } GtkType pipe_dialog_get_type(void) { static GtkType id = 0; if (!id) { GtkTypeInfo info = { "PipeDialog", sizeof(PipeDialog), sizeof(PipeDialogClass), (GtkClassInitFunc) pipe_dialog_class_init, (GtkObjectInitFunc) pipe_dialog_init }; id = gtk_type_unique(effect_dialog_get_type(),&info); } return id; } static void add_error_text(GtkWidget *t,gchar *text) { #if GTK_MAJOR_VERSION < 2 gtk_text_insert(GTK_TEXT(t),gtk_style_get_font(t->style),t->style->fg, &(t->style->white),text,-1); #else GtkTextBuffer *tb; GtkTextIter iter; tb = gtk_text_view_get_buffer(GTK_TEXT_VIEW(t)); gtk_text_buffer_get_end_iter(tb,&iter); gtk_text_buffer_insert(tb, &iter, text, -1); #endif } static GtkWidget *create_error_window(gchar *command) { GtkWidget *a,*b,*c; GtkWidget *t; gchar *q; GtkAccelGroup* ag; ag = gtk_accel_group_new(); a = gtk_window_new(GTK_WINDOW_DIALOG); gtk_window_set_title(GTK_WINDOW(a),_("Process output")); gtk_window_set_position (GTK_WINDOW (a), GTK_WIN_POS_CENTER); gtk_window_set_default_size(GTK_WINDOW(a),470,200); b = gtk_vbox_new(FALSE,0); gtk_container_add(GTK_CONTAINER(a),b); #if GTK_MAJOR_VERSION < 2 c = gtk_text_new(NULL,NULL); #else c = gtk_text_view_new(); #endif t = c; gtk_container_add(GTK_CONTAINER(b),c); c = gtk_button_new_with_label(_("Close")); gtk_widget_add_accelerator (c, "clicked", ag, GDK_KP_Enter, 0, (GtkAccelFlags) 0); gtk_widget_add_accelerator (c, "clicked", ag, GDK_Return, 0, (GtkAccelFlags) 0); gtk_widget_add_accelerator (c, "clicked", ag, GDK_Escape, 0, (GtkAccelFlags) 0); gtk_signal_connect_object(GTK_OBJECT(c),"clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy), GTK_OBJECT(a)); gtk_box_pack_start(GTK_BOX(b),c,FALSE,FALSE,0); q = g_strdup_printf(_("Output from command '%s':\n\n"),command); add_error_text(t,q); g_free(q); gtk_widget_show_all(a); gtk_window_add_accel_group(GTK_WINDOW (a), ag); return t; } gpointer pipe_dialog_open_pipe(gchar *command, int *fds, gboolean open_out) { int cmd_in[2]={},cmd_out[2]={},cmd_err[2]={}; unsigned char syncbyte; struct pipe_data *pd; pid_t p; gchar *c; char *argv[4]; int i; /* Create pipes */ if (pipe(cmd_in)==-1 || (open_out && pipe(cmd_out)==-1) || pipe(cmd_err)==-1) { c = g_strdup_printf(_("Could not create pipe: %s"),strerror(errno)); user_error(c); g_free(c); if (!cmd_in[0]) close(cmd_in[0]); if (!cmd_in[1]) close(cmd_in[1]); if (!cmd_out[0]) close(cmd_out[0]); if (!cmd_out[1]) close(cmd_out[1]); if (!cmd_err[0]) close(cmd_err[0]); return NULL; } /* Fork */ p = fork(); if (p == -1) { /* Error (parent process) */ c = g_strdup_printf(_("Error: fork: %s"),strerror(errno)); user_error(c); g_free(c); close(cmd_in[0]); close(cmd_in[1]); if (open_out) { close(cmd_out[0]); close(cmd_out[1]); } close(cmd_err[0]); close(cmd_err[1]); return NULL; } if (p == 0) { /* Child process */ /* Redirect streams */ /* puts("Child: redirecting streams"); */ /* i = dup(1); */ dup2(cmd_in[0],0); if (open_out) dup2(cmd_out[1],1); dup2(cmd_err[1],2); /* Close the streams we don't use */ /* write(i,"Child: closing streams\n",23); */ close(cmd_in[0]); close(cmd_in[1]); if (open_out) { close(cmd_out[0]); close(cmd_out[1]); } close(cmd_err[0]); close(cmd_err[1]); /* Synchronize */ if (open_out) { i = read(0,&syncbyte,1); g_assert(i == 1 && syncbyte == 0xAB); syncbyte = 0xCD; i = write(1,&syncbyte,1); g_assert(i == 1); } /* Execute subprocess */ argv[0] = "sh"; argv[1] = "-c"; argv[2] = command; argv[3] = NULL; /* write(i,"Child: execve!\n",15); */ fflush(stdout); close_all_files(); if (execve("/bin/sh",argv,environ) == -1) { console_perror("/bin/sh"); } else console_message(_("Should not reach this point!")); _exit(1); } /* Parent process */ /* Close the streams we don't use. */ close(cmd_in[0]); if (open_out) close(cmd_out[1]); close(cmd_err[1]); /* synchronize to child */ if (open_out) { syncbyte = 0xAB; i = write(cmd_in[1],&syncbyte,1); g_assert(i == 1); i = read(cmd_out[0],&syncbyte,1); g_assert(i == 1 && syncbyte == 0xCD); } pd = g_malloc(sizeof(*pd)); pd->fds[0] = fds[0] = cmd_in[1]; pd->fds[1] = fds[1] = cmd_out[0]; pd->fds[2] = fds[2] = cmd_err[0]; pd->error_log = NULL; pd->command = g_strdup(command); return (gpointer)pd; } void pipe_dialog_close(gpointer handle) { struct pipe_data *pd = (struct pipe_data *)handle; if (pd->fds[0] != 0) close(pd->fds[0]); if (pd->fds[1] != 0) close(pd->fds[1]); close(pd->fds[2]); g_free(pd->command); g_free(pd); wait(NULL); } gboolean pipe_dialog_error_check(gpointer handle) { struct pipe_data *pd = (struct pipe_data *)handle; fd_set set; int i; struct timeval tv = {}; gchar c[512]; FD_ZERO(&set); FD_SET(pd->fds[2],&set); i = select(pd->fds[2]+1,&set,NULL,NULL,&tv); if (i < 1) return FALSE; i = read(pd->fds[2],c,sizeof(c)-1); if (i == 0) return FALSE; c[i] = 0; if (!pd->error_log) pd->error_log = create_error_window(pd->command); add_error_text(pd->error_log,c); return TRUE; } void pipe_dialog_close_input(gpointer handle) { struct pipe_data *pd = (struct pipe_data *)handle; close(pd->fds[0]); pd->fds[0] = 0; } #define BZ 65536 static Chunk *pipe_dialog_pipe_chunk_main(Chunk *chunk, gchar *command, gboolean sendwav, gboolean do_read, StatusBar *bar, gboolean *sent_all, int dither_mode, off_t *clipcount) { int fds[3],bs,bp,i; gboolean writing=TRUE; gboolean send_header = sendwav; off_t ui,read_bytes=0; gchar *inbuf=NULL,*outbuf,*c; ChunkHandle *ch=NULL; TempFile ct=0; fd_set rset,wset; gpointer pipehandle; /* puts("---"); puts(command); puts("///"); */ if (sent_all) *sent_all = FALSE; pipehandle = pipe_dialog_open_pipe(command, fds, do_read); if (pipehandle == NULL) return NULL; /* Open chunk and create buffer */ ch = chunk_open(chunk); if (!ch) { pipe_dialog_close(pipehandle); return NULL; } if (do_read) { ct = tempfile_init(&(chunk->format),FALSE); if (!ct) { chunk_close(ch); pipe_dialog_close(pipehandle); return NULL; } } status_bar_begin_progress(bar,ch->size,NULL); if (do_read) inbuf = g_malloc(BZ); outbuf = g_malloc(BZ); ui = 0; bs = bp = 0; /* We want to handle broken pipes ourselves. */ signal(SIGPIPE,SIG_IGN); /* Read/write data... */ /* If do_read is TRUE, this loop will keep running until the * child process closes it's standard output (=our data * input). Otherwise, the loop will keep running until all data has * been sent to the program */ while (do_read || writing) { /* Wait for IO */ FD_ZERO(&rset); if (do_read) FD_SET(fds[1],&rset); FD_SET(fds[2],&rset); FD_ZERO(&wset); if (writing) FD_SET(fds[0],&wset); /* printf("Waiting (writing=%d)\n",writing); */ i = select(FD_SETSIZE,&rset,&wset,NULL,NULL); /* printf("Wait finished.\n"); */ if (i == -1) { if (errno == EINTR) continue; goto errno_error_exit; } /* Read data from standard output */ if (FD_ISSET(fds[1],&rset)) { /* printf("Reading from stdin..\n"); */ i = read(fds[1],inbuf,BZ); /* printf("Read finished\n"); */ if (i == -1) { if (errno != EINTR) goto errno_error_exit; } else if (i == 0) { break; } else { if (tempfile_write(ct,inbuf,i)) goto error_exit; } read_bytes += i; continue; } /* Read data from standard error... */ if (FD_ISSET(fds[2],&rset)) pipe_dialog_error_check(pipehandle); /* Send data to process's stdin */ if (writing && FD_ISSET(fds[0],&wset)) { /* Make sure the buffer contains data */ if (bs == bp) { if (send_header) { /* FIXME: Broken for float on bigendian machines */ bs = get_wav_header(&(chunk->format),chunk->size, outbuf); bp = 0; send_header = FALSE; } else { if (ui == chunk->length) { writing = FALSE; pipe_dialog_close_input(pipehandle); continue; } i = chunk_read_array(ch,ui,BZ,outbuf, dither_mode, clipcount); if (!i) goto error_exit; bs = i; bp = 0; /* if (IS_BIGENDIAN && sendwav) byteswap(c,chunk->format.samplesize,bs); */ ui += i / chunk->format.samplebytes; } } /* printf("Writing data...\n"); */ /* Write data */ #ifdef PIPE_BUF i = write(fds[0],outbuf+bp,MIN(bs-bp,PIPE_BUF)); #else i = write(fds[0],outbuf+bp,MIN(bs-bp,fpathconf(fds[0], _PC_PIPE_BUF))); #endif /* i = write(fds[0],outbuf+bp,1); */ /* printf("Finished writing.\n"); */ if (i == -1) { /* Broken pipe - stop writing */ if (errno == EPIPE) { /* printf("Writing: Broken pipe.\n"); */ writing = FALSE; continue; } if (errno == EINTR) continue; goto errno_error_exit; } bp += i; if (status_bar_progress(bar, i)) goto error_exit; } } /* Check for any remaining data sent to standard error */ while (pipe_dialog_error_check(pipehandle)) { } /* Finish */ g_free(inbuf); g_free(outbuf); chunk_close(ch); pipe_dialog_close(pipehandle); status_bar_end_progress(bar); if (do_read && !read_bytes) { user_error(_("Command failed without returning any data")); tempfile_abort(ct); return NULL; } if (sent_all) *sent_all = !writing; return do_read ? tempfile_finished(ct) : NULL; errno_error_exit: c = g_strdup_printf(_("Error: %s"),strerror(errno)); user_error(c); g_free(c); error_exit: g_free(inbuf); g_free(outbuf); chunk_close(ch); if (do_read) tempfile_abort(ct); pipe_dialog_close(pipehandle); status_bar_end_progress(bar); return NULL; } Chunk *pipe_dialog_pipe_chunk(Chunk *chunk, gchar *command, gboolean sendwav, int dither_mode, StatusBar *bar, off_t *clipcount) { return pipe_dialog_pipe_chunk_main(chunk,command,sendwav,TRUE, bar,NULL,dither_mode,clipcount); } gboolean pipe_dialog_send_chunk(Chunk *chunk, gchar *command, gboolean sendwav, int dither_mode, StatusBar *bar, off_t *clipcount) { gboolean sent_all; pipe_dialog_pipe_chunk_main(chunk,command,sendwav,FALSE, bar,&sent_all,dither_mode,clipcount); return !sent_all; } mhwaveedit-1.4.24/src/pipedialog.h000066400000000000000000000036271334022513400170210ustar00rootroot00000000000000/* * Copyright (C) 2002 2003 2004 2006, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #ifndef PIPEDIALOG_H_INCLUDED #define PIPEDIALOG_H_INCLUDED #include #include "effectdialog.h" #include "historybox.h" #define PIPE_DIALOG(obj) GTK_CHECK_CAST(obj,pipe_dialog_get_type(),PipeDialog) #define PIPE_DIALOG_CLASS(klass) GTK_CHECK_CLASS_CAST(klass,pipe_dialog_get_type(),PipeDialogClass) #define IS_PIPE_DIALOG(obj) GTK_CHECK_TYPE(obj,pipe_dialog_get_type()) typedef struct { EffectDialog ed; HistoryBox *cmd; GtkToggleButton *sendwav; } PipeDialog; typedef struct { EffectDialogClass edc; } PipeDialogClass; GtkType pipe_dialog_get_type(void); gpointer pipe_dialog_open_pipe(gchar *command, int *fds, gboolean open_out); gboolean pipe_dialog_error_check(gpointer handle); void pipe_dialog_close(gpointer handle); void pipe_dialog_close_input(gpointer handle); Chunk *pipe_dialog_pipe_chunk(Chunk *chunk, gchar *command, gboolean sendwav, int dither_mode, StatusBar *bar, off_t *clipcount); gboolean pipe_dialog_send_chunk(Chunk *chunk, gchar *command, gboolean sendwav, int dither_mode, StatusBar *bar, off_t *clipcount); #endif mhwaveedit-1.4.24/src/player.c000066400000000000000000000416041334022513400161700ustar00rootroot00000000000000/* * Copyright (C) 2003 2004 2005 2006 2008 2009 2010, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include #include #include "inifile.h" #include "sound.h" #include "player.h" #include "main.h" #include "um.h" #include "rateest.h" #include "rateconv.h" #include "gettext.h" #include "mainloop.h" Dataformat player_fallback_format = { DATAFORMAT_PCM, 44100, 2, 2, 4, TRUE, IS_BIGENDIAN }; gboolean varispeed_smooth_flag = FALSE; /* Info about currently playing sound. */ static ChunkHandle *ch=NULL; /* NULL == stopped */ static rateconv *varispeed_conv = NULL; /* Note speed is inverse relative to output sample rate */ /* file_speed is the speed which the user "hears" */ static gfloat file_speed = 1.0; /* Speed relative to file's sample rate (1.0=Normal speed)*/ static gfloat true_speed = 1.0; /* Speed relative to playback sample rate (file_speed* file_rate/output_rate) */ static gfloat file_output_ratio = 1.0; /* file_rate/output_rate */ static off_t loopstart, loopend, curpos; static off_t realpos_offset; static gboolean loop, small_loop; /* After changing speed with the "smooth" method, the data that has already * been sent to the driver will be played with the old speed. So we need to * keep track of how much data that is. */ static off_t oldspeed_samples = 0; static gfloat oldspeed_speed = 1.0; /* Info after stopping */ static off_t realpos_atstop = 0; /* Output buffer */ static gchar varispeed_buf[8192]; static gint varispeed_bufsize,varispeed_bufpos; static gchar player_buf[4096],small_loop_buf[4096]; static gint player_bufsize,player_bufpos,small_loop_bufsize; static player_notify_func notify_func; static gpointer notify_watchdog = NULL; static off_t get_realpos_main(off_t frames_played); static void player_stop_main(gboolean read_stoppos); static gint notify_wd_cb(gpointer timesource, GTimeVal *current_time, gpointer user_data) { if (ch == NULL) return 0; notify_func(get_realpos_main(rateest_frames_played()),curpos,TRUE); return 50; } static int get_frames(void *buffer, int maxsize) { off_t frames,sz; int read; if (curpos < loopstart) frames=loopstart-curpos; else if (curpos == loopstart && small_loop) { memcpy(buffer, small_loop_buf, small_loop_bufsize); return small_loop_bufsize; } else if (curpos < loopend) frames = loopend-curpos; else if (!loop && curpos == loopend) frames = 0; else frames = ch->length - curpos; if (frames == 0) return 0; sz = frames * ch->format.samplebytes; if (sz > maxsize) sz = maxsize; read = chunk_read_array(ch,curpos,sz,buffer,dither_playback,NULL); g_assert(read <= sz); curpos += read / ch->format.samplebytes; if (loop && curpos == loopend) curpos = loopstart; return read; } static void get_new_data(void) { if (varispeed_conv != NULL) { if (varispeed_bufsize != 0) do { if (varispeed_bufpos == varispeed_bufsize) { varispeed_bufsize = get_frames(varispeed_buf, sizeof(varispeed_buf)); varispeed_bufpos = 0; if (varispeed_bufsize == 0) { rateconv_write(varispeed_conv,NULL,0); return; } } if (varispeed_bufpos < varispeed_bufsize) varispeed_bufpos += rateconv_write(varispeed_conv, varispeed_buf+varispeed_bufpos, varispeed_bufsize- varispeed_bufpos); } while (varispeed_bufpos == varispeed_bufsize && varispeed_bufsize > 0); player_bufsize = rateconv_read(varispeed_conv,player_buf, sizeof(player_buf)); } else { player_bufsize = get_frames(player_buf,sizeof(player_buf)); } player_bufpos = 0; } /* Check if the sound driver wants more data and send it. * Returns FALSE if it had nothing to do. */ static gboolean player_work(void) { guint32 i; off_t o; GTimeVal tv; if (!ch || !output_want_data()) return FALSE; if (player_bufpos == player_bufsize) { /* puts("Hey 1"); */ get_new_data(); /* Still no new data ? Then we should stop.. */ if (player_bufpos == player_bufsize) { /* puts("Calling output_play(NULL,0)"); */ i = output_play(NULL,0); /* puts("output_play done"); */ o = rateest_frames_played(); if (i > 0 || oformat.samplebytes); if (i>0 && notify_func!=NULL) { notify_func(player_get_real_pos(),curpos,TRUE); g_get_current_time(&tv); tv.tv_usec += 50000; if (tv.tv_usec >= 1000000) { tv.tv_sec++; tv.tv_usec-=1000000; } if (notify_watchdog == NULL) { notify_watchdog = mainloop_time_source_add(&tv,notify_wd_cb, NULL); } else { mainloop_time_source_restart(notify_watchdog, &tv); } } return (i>0); } static void check_small_loop(void) { off_t o; guint32 u,v; small_loop = FALSE; if (loop) { o = (loopend-loopstart)*ch->format.samplebytes; if (o <= sizeof(small_loop_buf)) { u = (guint32) o; small_loop = TRUE; chunk_read_array(ch,loopstart,u,small_loop_buf,dither_playback, NULL); for (v=1; v < sizeof(player_buf)/u; v++) memcpy(small_loop_buf+u*v,small_loop_buf,u); /* printf("check_small_loop: u=%d, v=%d\n",u,v); */ small_loop_bufsize = v*u; } } } static void restart_converter(void) { guint c,i; if (varispeed_conv != NULL) rateconv_destroy(varispeed_conv); if (inifile_get_gboolean("varispeed",TRUE)) { c = rateconv_driver_count(TRUE); i = inifile_get_guint32("varispeedConv",c-1); if (i >= c) i = c-1; varispeed_conv = rateconv_new(TRUE,rateconv_driver_id(TRUE,i), &(ch->format), (gfloat)ch->format.samplerate / true_speed, dither_playback, TRUE); } else varispeed_conv = NULL; } static gboolean player_play_main(Chunk *chk, off_t spos, off_t epos, gboolean lp, gint recursed) { gint i; gboolean b; Dataformat fmt; gchar *c; player_stop(); if (spos == epos) return TRUE; true_speed = file_speed; file_output_ratio = 1.0; memcpy(&fmt,&(chk->format),sizeof(Dataformat)); i = output_select_format(&(chk->format),(recursed<2),(GVoidFunc)player_work); if (i != 0) { if (recursed<2) { if (!output_suggest_format(&(chk->format),&fmt)) { memcpy(&fmt,&player_fallback_format,sizeof(Dataformat)); } b = !dataformat_samples_equal(&(chk->format),&fmt); if (b) { chk = chunk_convert_sampletype(chk,&fmt); b = player_play_main(chk,spos,epos,lp,1); gtk_object_sink(GTK_OBJECT(chk)); return b; } else if (chk->format.channels != fmt.channels) { chk = chunk_convert_channels(chk,fmt.channels); b = player_play_main(chk,spos,epos,lp,1); gtk_object_sink(GTK_OBJECT(chk)); return b; } else if (chk->format.samplerate != fmt.samplerate) { file_output_ratio = ((float)chk->format.samplerate) / ((float)fmt.samplerate); if (!inifile_get_gboolean("varispeed",TRUE)) { /* If we don't have varispeed, still play the sound * with the wrong speed */ true_speed = 1.0;/* the only possible w/o varispeed */ file_speed = 1.0 / file_output_ratio; } else { /* Resample to get correct playback speed */ file_speed = 1.0; true_speed = 1.0 * file_output_ratio; } /* Select the format with different sample rate */ i = output_select_format(&fmt,FALSE,(GVoidFunc)player_work); if (i < 0) return player_play_main(chk,spos,epos,lp,2); else if (i > 0) return TRUE; /* Fall out to other init stuff below */ recursed++; } else { return player_play_main(chk,spos,epos,lp,2); } } else { if (i < 0) user_error(_("The sound format of this file is not " "supported for playing.")); return TRUE; } } /* printf("true_speed: %f\n",(float)true_speed); */ if (recursed > 0) { c = g_strdup_printf("playing file as %d Hz, %s, %s",fmt.samplerate, sampletype_name(&(chk->format)), channel_format_name(chk->format.channels)); console_message(c); g_free(c); } ch = chunk_open(chk); gtk_object_ref(GTK_OBJECT(chk)); rateest_init(fmt.samplerate); restart_converter(); loopstart = spos; loopend = epos; loop = lp; player_bufsize = 1024; /* Anything >0 */ player_bufpos = player_bufsize; varispeed_bufsize = 1024; varispeed_bufpos = varispeed_bufsize; check_small_loop(); curpos = spos; realpos_offset = spos; oldspeed_samples = 0; oldspeed_speed = 1.0; player_work(); return FALSE; } gboolean player_play(Chunk *chk, off_t spos, off_t epos, gboolean lp, player_notify_func nf) { player_stop(); notify_func = nf; return player_play_main(chk,spos,epos,lp,0); } off_t player_get_buffer_pos(void) { return curpos; } static off_t get_realpos_main(off_t frames_played) { gdouble fp; off_t o,x; if (frames_played < oldspeed_samples) { fp = (gdouble)frames_played * oldspeed_speed; } else { fp = (gdouble)oldspeed_samples*oldspeed_speed + (gdouble)(frames_played-oldspeed_samples) * true_speed; } o = (off_t)(fp) + realpos_offset; /* printf("fp = %f, realpos_offset = %d -> o = %d\n",fp, (int)realpos_offset, (int)o); */ if (loop && curpos < loopend && o >= loopend) { /* printf("o fre: %Ld",o); */ x = o-loopstart; o = loopstart + x%(loopend-loopstart); /* printf(", efter: %Ld\n",o); */ } if (o >= ch->length) o = ch->length; return o; } /* This function calculates at what sample the listener is. * Since for most drivers the amount of buffering is unknown, I use clock time * to find out where we should be. After some time has passed, we should be * able to estimate the buffer amount by comparing the "clock" position and * the buffer position. Also, we check for overruns by checking for * unreasonable values */ off_t player_get_real_pos(void) { off_t o; if (ch == NULL) return realpos_atstop; o = get_realpos_main(rateest_frames_played()); /* printf("get_realpos_main returned: %Ld\n",o); */ return o; } void player_get_range(off_t *startpos, off_t *endpos) { *startpos = loopstart; *endpos = loopend; } void player_change_range(off_t start, off_t end) { off_t rp; /* Special case - we're playing a loop and the sound has looped, but * because of the output delay the cursor and the audible sound hasn't * come there yet. In that case, we're forced to flush buffers etc * to avoid sending out the old loop to the listener. */ if (loop) { rp = player_get_real_pos(); if (rp > curpos) { /* Fixme: Should handle error return (although unlikely) */ player_play(ch,rp,end,TRUE,notify_func); loopstart = start; return; } } loopstart = start; loopend = end; check_small_loop(); } void player_set_buffer_pos(off_t pos) { if (pos != curpos) { /* if (curpos == loopend && !loop && varispeed_conv != NULL) */ restart_converter(); curpos = pos; output_clear_buffers(); rateest_init(rateest_real_samplerate()); oldspeed_samples = 0; realpos_offset = pos; player_bufsize = player_bufpos = 1; player_work(); } } void player_switch(Chunk *chunk, off_t movestart, off_t movedist) { ChunkHandle *c; off_t oldpos = curpos; off_t newpos, newstart, newend; Chunk *x; if (ch == NULL) return; g_assert(chunk->format.samplerate == ch->format.samplerate); if (!dataformat_samples_equal(&(chunk->format),&(ch->format))) { x = chunk_convert_sampletype(chunk, &(ch->format)); player_switch(x,movestart,movedist); gtk_object_sink(GTK_OBJECT(x)); return; } if (chunk->format.channels != ch->format.channels) { x = chunk_convert_channels(chunk, ch->format.channels); player_switch(x,movestart,movedist); gtk_object_sink(GTK_OBJECT(x)); return; } newpos = curpos; if (newpos >= movestart) { newpos += movedist; if (newpos < movestart) { realpos_atstop = movestart; player_stop_main(FALSE); return; } if (newpos > chunk->length) { realpos_atstop = chunk->length; player_stop_main(FALSE); return; } } newstart = loopstart; if (newstart >= movestart) { newstart += movedist; if (newstart < movestart) newstart = movestart; if (newstart >= chunk->length) newstart = chunk->length; } newend = loopend; if (newend >= movestart) { newend += movedist; if (newend < movestart) newend = movestart; if (newend >= chunk->length) newend = chunk->length; } c = chunk_open(chunk); if (c == NULL) return; chunk_close(ch); gtk_object_unref(GTK_OBJECT(ch)); ch = c; gtk_object_ref(GTK_OBJECT(ch)); loopstart = newstart; loopend = newend; curpos = newpos; if (newstart == newend) loop = FALSE; check_small_loop(); realpos_offset += newpos - oldpos; } gboolean player_playing(void) { return (ch != NULL); } static void player_stop_main(gboolean read_stoppos) { gboolean b; if (ch == NULL) return; chunk_close(ch); b = output_stop(FALSE); if (read_stoppos) realpos_atstop = get_realpos_main(b ? rateest_frames_written() : rateest_frames_played()); if (notify_func) notify_func(realpos_atstop,curpos,FALSE); gtk_object_unref(GTK_OBJECT(ch)); ch = NULL; } void player_stop(void) { player_stop_main(TRUE); } gboolean player_looping(void) { return loop; } void player_nudge(gfloat seconds) { off_t samps,newpos; samps = seconds * ch->format.samplerate; newpos = player_get_real_pos() + samps; if (newpos < 0) newpos = 0; player_set_buffer_pos(newpos); } void player_set_speed(gfloat s) { off_t wr,pl,rp; gfloat os; if (file_speed == s) return; if (ch == NULL || varispeed_conv==NULL) { file_speed = true_speed = s; return; } /* We must calculate these before changing the speed variable */ wr = rateest_frames_written(); pl = rateest_frames_played(); rp = get_realpos_main(pl); os = true_speed; true_speed = s * file_output_ratio; file_speed = s; if (varispeed_smooth_flag) { /* Low latency version - just change the converter */ rateconv_set_outrate(varispeed_conv, (gfloat)ch->format.samplerate / true_speed); /* Update oldspeed_speed and oldspeed_samples. */ if (pl < oldspeed_samples) { /* This if case is just to avoid getting Inf in speed, * not strictly necessary */ if (wr != pl) oldspeed_speed = (oldspeed_speed* (gfloat)(oldspeed_samples-pl) + os*(gfloat)(wr-oldspeed_samples)) / (gfloat)(wr-pl); oldspeed_samples = wr-pl; } else { oldspeed_speed = os; oldspeed_samples = wr-pl; } rateest_init(rateest_real_samplerate()); rateest_prelog_data(wr-pl); realpos_offset = rp; /* printf("After rateest_init: rateest_frames_played=%Ld\n", rateest_frames_played()); */ } else { /* High latency version - clears buffers, restarts converter */ output_clear_buffers(); restart_converter(); curpos = rp; rateest_init(rateest_real_samplerate()); realpos_offset = curpos; oldspeed_samples = 0; player_bufsize = player_bufpos = 1; player_work(); } } gfloat player_get_speed(void) { return file_speed; } mhwaveedit-1.4.24/src/player.h000066400000000000000000000056011334022513400161720ustar00rootroot00000000000000/* * Copyright (C) 2003 2004 2005 2010, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ /* This module handles the sound playing. It reads its data from a * Chunk object, then plays it through the sound driver. The function * player_work must be called periodically to keep the playback * going. * * The code supports playing loops, and has special code to handle * very small loops without eating CPU. */ #ifndef PLAYER_H_INCLUDED #define PLAYER_H_INCLUDED #include #include "chunk.h" extern gboolean varispeed_smooth_flag; /* Fallback sample type to use if other fails */ extern Dataformat player_fallback_format; /* Play a certain chunk. Returns TRUE if anything failed. */ typedef void (*player_notify_func)(off_t realpos, off_t bufpos, gboolean is_running); gboolean player_play(Chunk *chunk, off_t startpos, off_t endpos, gboolean loop, player_notify_func nf); /* TRUE if the play thread is currently playing. */ gboolean player_playing(void); /* TRUE if the play thread is currently looping a sound */ gboolean player_looping(void); /* Returns start- and endpoint of the currently playing part. */ void player_get_range(off_t *startpos, off_t *endpos); /* Changes the playback range without moving the playback position */ void player_change_range(off_t start, off_t end); /* Stops playing (or does nothing if not playing). */ void player_stop(void); /* Gets the current position of the player thread in the data buffer. */ off_t player_get_buffer_pos(void); /* Gets the current position which is actually playing right now. This function * compensates for the buffering done by the sound drivers. */ off_t player_get_real_pos(void); /* Use another chunk as sound source but keep all buffered data. * movestart and movedist work the same way as in document_update */ void player_switch(Chunk *new_chunk, off_t movestart, off_t movedist); /* Changes the buffer position. */ void player_set_buffer_pos(off_t pos); /* Move playback position */ void player_nudge(gfloat seconds); /* Set playback speed (1.0 = normal). Does nothing if varispeed is disabled */ void player_set_speed(gfloat speed); gfloat player_get_speed(void); #endif mhwaveedit-1.4.24/src/rateconv.c000066400000000000000000000560271334022513400165220ustar00rootroot00000000000000/* * Copyright (C) 2004 2005 2006 2007 2009 2010, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include #include #include #include #ifdef HAVE_LIBSAMPLERATE #include #endif #include "rateconv.h" #include "soxdialog.h" #include "pipedialog.h" #include "ringbuf.h" #include "um.h" #include "gettext.h" struct driver_data { const gchar *name; const gchar *id; gboolean is_realtime; gboolean prefers_float; gpointer (*new_func)(struct driver_data *driver, gboolean realtime, Dataformat *format, guint32 outrate, int dither_mode); void (*destroy_func)(gpointer convdata); void (*set_outrate_func)(gpointer convdata, guint32 outrate); gint (*write_func)(gpointer convdata, gpointer buf, guint buflen); gint (*read_func)(gpointer convdata, gpointer buf, guint buflen); gboolean (*hasdata_func)(gpointer convdata); }; struct driver_data *repeat_driver; struct convdata_base { struct driver_data *driver; Ringbuf *passthru_buffer; gboolean emptying; guint32 writecount,readcount; guint32 empty_point; guint32 inrate,outrate; }; static GList *drivers = NULL; static GList *realtime_drivers = NULL; static gint sox_read(gpointer convdata, gpointer buf, guint bufsize); #ifdef HAVE_LIBSAMPLERATE struct convdata_src { struct convdata_base b; Dataformat format; SRC_STATE *state; long maxframes; SRC_DATA data; int dither_mode; }; static gpointer rateconv_src_new(struct driver_data *driver, gboolean realtime, Dataformat *format, guint32 outrate, int dither_mode) { struct convdata_src *cd; long frames; SRC_STATE *state; int i; int src_converter_type; gchar *c; /* puts("rateconv_src_new starts"); */ src_converter_type = driver->id[3] - '1'; state = src_new(src_converter_type, format->channels, &i); if (state == NULL) { c = g_strdup_printf(_("Error initialising sample rate conversion: %s"), src_strerror(i)); user_error(c); g_free(c); return NULL; } cd = g_malloc(sizeof(*cd)); cd->state = state; memcpy(&(cd->format),format,sizeof(Dataformat)); frames = 16384; cd->maxframes = frames; cd->data.data_in = g_malloc(frames * sizeof(float) * format->channels); cd->data.input_frames = 0; cd->data.data_out = g_malloc(frames * sizeof(float) * format->channels); cd->data.src_ratio = ((double)outrate)/((double)format->samplerate); cd->data.end_of_input = 0; cd->dither_mode = dither_mode; /* puts("rateconv_src_new ends"); */ return cd; } static void rateconv_src_destroy(gpointer convdata) { struct convdata_src *cd = (struct convdata_src *)convdata; src_delete(cd->state); g_free(cd->data.data_in); g_free(cd->data.data_out); g_free(cd); } static int rateconv_src_write(gpointer convdata, gpointer buf, guint bufsize) { struct convdata_src *cd = (struct convdata_src *)convdata; /* puts("rateconv_src_write starts"); */ long wf = bufsize / cd->format.samplebytes; long l = cd->maxframes - cd->data.input_frames; if (buf == NULL) { cd->data.end_of_input = 1; return 0; } if (wf > l) wf = l; if (wf == 0) return 0; convert_array(buf, &(cd->format), &(cd->data.data_in[cd->data.input_frames * cd->format.channels]), &dataformat_single, wf * cd->format.channels, cd->dither_mode, NULL); cd->data.input_frames += wf; /* puts("rateconv_src_write ends"); */ return wf * cd->format.samplebytes; } static int rateconv_src_read(gpointer convdata, gpointer buf, guint bufsize) { struct convdata_src *cd = (struct convdata_src *)convdata; /* puts("rateconv_src_read starts"); */ long rf = bufsize / cd->format.samplebytes; long l = cd->maxframes; int i; gchar *c; if (rf > l) rf = l; cd->data.output_frames = rf; i = src_process(cd->state, &(cd->data)); if (i) { c = g_strdup_printf(_("Error converting samplerate: %s\n"), src_strerror(i)); console_message(c); g_free(c); return -1; } rf = cd->data.output_frames_gen; if (rf > 0) convert_array(cd->data.data_out, &dataformat_single, buf, &(cd->format), rf * cd->format.channels, cd->dither_mode, NULL); if (cd->data.input_frames_used < cd->data.input_frames) { l = cd->data.input_frames - cd->data.input_frames_used; memmove(cd->data.data_in, &(cd->data.data_in[cd->data.input_frames_used * cd->format.channels]), l*cd->format.channels*sizeof(float)); cd->data.input_frames = l; } else cd->data.input_frames = 0; /* puts("rateconv_src_read ends"); */ return rf * cd->format.samplebytes; } static gboolean rateconv_src_hasdata(gpointer convdata) { struct convdata_src *cd = (struct convdata_src *)convdata; return (cd->data.input_frames > 0); } static void rateconv_src_set_outrate(gpointer convdata, guint32 outrate) { struct convdata_src *cd = (struct convdata_src *)convdata; double new_ratio; int i; gchar *c; new_ratio = ((double)outrate) / ((double)cd->format.samplerate); i = src_set_ratio(cd->state,new_ratio); if (i) { c = g_strdup_printf(_("Error changing samplerate conversion " "ratio: %s\n"),src_strerror(i)); console_message(c); g_free(c); } else cd->data.src_ratio = new_ratio; } #endif struct convdata_sox { struct convdata_base b; Dataformat format; gboolean converting; Dataformat convert_from_format; int fds[3]; gpointer pipehandle; gchar tmpbuf[32],tmpbuf_in[32]; /* 0 = opened, 1 = purge tmpbuf then close, 2 = write closed, 3 = read closed */ int close_status; int tmpbuf_size,tmpbuf_in_size; int dither_mode; }; static gpointer sox_new(struct driver_data *driver, gboolean realtime, Dataformat *format, guint32 outrate, int dither_mode) { struct convdata_sox cd,*cdp; Dataformat fmt; gchar c[512],d[64],e[64]; if (format->type == DATAFORMAT_FLOAT || format->samplesize == 3 || XOR(format->bigendian,IS_BIGENDIAN)) { cd.converting = TRUE; memcpy(&(cd.convert_from_format),format,sizeof(Dataformat)); cd.format.type = DATAFORMAT_PCM; cd.format.samplerate = format->samplerate; cd.format.samplesize = 4; cd.format.channels = format->channels; cd.format.sign = FALSE; cd.format.bigendian = IS_BIGENDIAN; cd.format.samplebytes = cd.format.samplesize * cd.format.channels; } else { cd.converting = FALSE; memcpy(&(cd.format),format,sizeof(Dataformat)); } sox_dialog_format_string(d,sizeof(d),&(cd.format)); memcpy(&fmt,&(cd.format),sizeof(fmt)); fmt.samplerate = outrate; sox_dialog_format_string(e,sizeof(e),&fmt); /* driver->id+4 converts driver name to effect name, for example * "sox_resample" to "resample" */ g_snprintf(c,sizeof(c),"sox %s - %s - %s",d,e,driver->id+4); /* puts(c); */ cd.pipehandle = pipe_dialog_open_pipe(c,cd.fds,TRUE); if (cd.pipehandle == NULL) return NULL; cd.tmpbuf_size = 0; cd.tmpbuf_in_size = 0; cd.close_status = 0; cd.dither_mode = dither_mode; cdp = g_malloc(sizeof(*cdp)); memcpy(cdp,&cd,sizeof(struct convdata_sox)); return (gpointer)cdp; } static void sox_destroy(gpointer convdata) { struct convdata_sox *cd = (struct convdata_sox *)convdata; if (cd->pipehandle != NULL) pipe_dialog_close(cd->pipehandle); g_free(convdata); } static gboolean sox_purge_tmpbuf(struct convdata_sox *cd) { int i,j; if (!fd_canwrite(cd->fds[0])) return FALSE; i = write(cd->fds[0],cd->tmpbuf,cd->tmpbuf_size); if (i <= 0) return TRUE; cd->tmpbuf_size -= i; for (j=0; jtmpbuf_size; j++) cd->tmpbuf[j] = cd->tmpbuf[j+i]; if (cd->close_status == 1 && cd->tmpbuf_size == 0) { pipe_dialog_close_input(cd->pipehandle); cd->close_status = 2; } return FALSE; } static gint sox_write_main(struct convdata_sox *cd, gpointer buf, guint bufsize) { int i,j; gchar *c,*p = buf; gboolean purged=FALSE; pipe_dialog_error_check(cd->pipehandle); bufsize -= bufsize % cd->format.samplebytes; if (cd->tmpbuf_size > 0) { if (sox_purge_tmpbuf(cd)) return -1; if (cd->tmpbuf_size > 0) return 0; purged = TRUE; } if (buf == NULL && cd->close_status == 0) { cd->close_status = 1; if (cd->tmpbuf_size == 0) { pipe_dialog_close_input(cd->pipehandle); cd->close_status = 2; } } if (bufsize == 0 || cd->close_status>0 || !fd_canwrite(cd->fds[0])) return purged?cd->format.samplebytes:0; /* puts("sox_write: calling write..."); */ #ifdef PIPE_BUF i = write(cd->fds[0],buf,MIN(bufsize,PIPE_BUF)); #else i = write(cd->fds[0],buf,MIN(bufsize,fpathconf(cd->fds[0], _PC_PIPE_BUF))); #endif /* printf("tried = %d, got = %d\n",(int)bufsize,i); */ if (i == 0) { user_error(_("Unexpected EOF in connection to subprocess")); return -1; } if (i == -1) { c = g_strdup_printf(_("Error writing to subprocess: %s"), strerror(errno)); user_error(c); g_free(c); return -1; } j = i % cd->format.samplebytes; if (j > 0) { cd->tmpbuf_size = cd->format.samplebytes - j; memcpy(cd->tmpbuf,p+i,cd->tmpbuf_size); } return i-j+(purged?cd->format.samplebytes:0); } static gint sox_write(gpointer convdata, gpointer buf, guint bufsize) { struct convdata_sox *cd = (struct convdata_sox *)convdata; if (cd->converting) { gpointer p; guint ns,frames; gint i; frames = bufsize / cd->convert_from_format.samplebytes; ns = frames * cd->format.samplebytes; p = g_malloc(ns); convert_array(buf,&(cd->convert_from_format), p,&(cd->format),frames*cd->format.channels, cd->dither_mode,NULL); i = sox_write_main(cd,p,ns); g_free(p); if (i<=0) return i; return (i / cd->format.samplebytes) * cd->convert_from_format.samplebytes; } return sox_write_main(cd,buf,bufsize); } static gint sox_read_main(struct convdata_sox *cd, gpointer buf, guint bufsize) { int i,j; gchar *c, *p = buf; if (cd->close_status == 3) return 0; pipe_dialog_error_check(cd->pipehandle); bufsize -= bufsize % cd->format.samplebytes; if (bufsize == 0) return 0; if (cd->tmpbuf_size > 0) sox_purge_tmpbuf(cd); if (cd->tmpbuf_in_size > 0) { if (!fd_canread(cd->fds[1]) && cd->close_status < 2) return 0; i = read(cd->fds[1],cd->tmpbuf_in+cd->tmpbuf_in_size, cd->format.samplebytes - cd->tmpbuf_in_size); if (i == -1) { c = g_strdup_printf(_("Error reading from sub process: %s"), strerror(errno)); user_error(c); g_free(c); return -1; } if (i == 0) { cd->tmpbuf_in_size = 0; return 0; } cd->tmpbuf_in_size += i; if (cd->tmpbuf_in_size < cd->format.samplebytes) return 0; memcpy(buf,cd->tmpbuf_in,cd->format.samplebytes); cd->tmpbuf_in_size = 0; i = sox_read_main(cd, p+cd->format.samplebytes, bufsize-cd->format.samplebytes); if (i == -1) return -1; return cd->format.samplebytes + i; } if (!fd_canread(cd->fds[1]) && cd->close_status < 2) return 0; i = read(cd->fds[1],buf,bufsize); if (i == -1) { c = g_strdup_printf(_("Error reading from sub process: %s"), strerror(errno)); user_error(c); g_free(c); return -1; } if (i == 0) { if (cd->close_status < 2) { user_error(_("SoX closed connection too early!")); return -1; } else { cd->close_status = 3; pipe_dialog_close(cd->pipehandle); cd->pipehandle = NULL; return 0; } } j = i % cd->format.samplebytes; if (j > 0) { cd->tmpbuf_in_size = j; i -= j; memcpy(cd->tmpbuf_in, p+i, j); } return i; } static gint sox_read(gpointer convdata, gpointer buf, guint bufsize) { struct convdata_sox *cd = (struct convdata_sox *)convdata; if (cd->converting) { gpointer p; guint ns,frames; gint i; frames = bufsize / cd->convert_from_format.samplebytes; ns = frames * cd->format.samplebytes; p = g_malloc(ns); i = sox_read_main(cd,p,ns); if (i > 0) { convert_array(p,&(cd->format),buf,&(cd->convert_from_format), i/cd->format.samplesize, cd->dither_mode, NULL); } g_free(p); if (i<=0) return i; return (i / cd->convert_from_format.samplebytes) * cd->format.samplebytes; } return sox_read_main(cd,buf,bufsize); } static gboolean sox_hasdata(gpointer convdata) { struct convdata_sox *cd = (struct convdata_sox *)convdata; if (cd->tmpbuf_size > 0) sox_purge_tmpbuf(cd); if (cd->close_status == 3) return FALSE; if (cd->close_status == 2) return TRUE; return fd_canread(cd->fds[1]); } struct convdata_repeat { struct convdata_base b; Ringbuf *databuf; Dataformat format; gchar cursamp[32]; gfloat fracpos, ratio; }; static gpointer repeat_new(struct driver_data *driver, gboolean realtime, Dataformat *format, guint32 outrate, int dither_mode) { struct convdata_repeat *data; data = g_malloc(sizeof(*data)); data->databuf = ringbuf_new(realtime ? 1024*format->samplebytes : format->samplerate * format->samplebytes); data->fracpos = 1.0; data->ratio = (format->samplerate) / ((gfloat)outrate); memcpy(&(data->format),format,sizeof(Dataformat)); return (gpointer)data; } static void repeat_destroy(gpointer convdata) { struct convdata_repeat *data = (struct convdata_repeat *)convdata; ringbuf_free(data->databuf); g_free(data); } static gint repeat_write(gpointer convdata, gpointer buf, guint bufsize) { struct convdata_repeat *data = (struct convdata_repeat *)convdata; if (buf == NULL) return 0; return (gint)ringbuf_enqueue(data->databuf,buf,bufsize); } static gint repeat_read(gpointer convdata, gpointer buf, guint bufsize) { struct convdata_repeat *data = (struct convdata_repeat *)convdata; gchar *p = (gchar *)buf; guint i; gfloat fracpos,ratio; guint samplebytes; bufsize -= bufsize % data->format.samplebytes; if (data->format.samplerate == data->b.outrate) return ringbuf_dequeue(data->databuf,buf,bufsize); i = bufsize; fracpos = data->fracpos; ratio = data->ratio; samplebytes = data->format.samplebytes; while (i > 0) { /* Read new sample data */ while (fracpos >= 1.0) { if (ringbuf_dequeue(data->databuf,data->cursamp,samplebytes) < samplebytes) goto breakout; fracpos -= 1.0; } /* Write sample data */ memcpy(p,data->cursamp,samplebytes); p += samplebytes; i -= samplebytes; fracpos += ratio; } breakout: data->fracpos = fracpos; return bufsize - i; } static gboolean repeat_hasdata(gpointer convdata) { struct convdata_repeat *data = (struct convdata_repeat *)convdata; return (data->fracpos < 1.0 || ringbuf_available(data->databuf)); } static void repeat_set_outrate(gpointer convdata, guint32 outrate) { struct convdata_repeat *data = (struct convdata_repeat *)convdata; data->ratio = (data->format.samplerate) / ((gfloat)outrate); } static void register_drivers(void) { static int already_run = 0; struct driver_data *d,d2; #ifdef HAVE_LIBSAMPLERATE const char *c; int i; c = NULL; i = 0; #endif if (already_run) return; already_run++; #ifdef HAVE_LIBSAMPLERATE d2.is_realtime = TRUE; d2.prefers_float = TRUE; d2.new_func = rateconv_src_new; d2.destroy_func = rateconv_src_destroy; d2.write_func = rateconv_src_write; d2.read_func = rateconv_src_read; d2.hasdata_func = rateconv_src_hasdata; d2.set_outrate_func = rateconv_src_set_outrate; for (i=0; 1; i++) { c = src_get_name(i); if (c == NULL) break; d = (struct driver_data *)g_malloc(sizeof(*d)); memcpy(d,&d2,sizeof(*d)); d->name = c; d->id = g_strdup_printf("src%c",i+'1'); drivers = g_list_append(drivers,d); realtime_drivers = g_list_append(realtime_drivers,d); } #endif if (sox_dialog_first_effect() != NULL || program_exists("sox")) { d2.is_realtime = FALSE; d2.prefers_float = FALSE; d2.new_func = sox_new; d2.destroy_func = sox_destroy; d2.write_func = sox_write; d2.read_func = sox_read; d2.hasdata_func = sox_hasdata; d = (struct driver_data *)g_malloc(sizeof(*d)); memcpy(d,&d2,sizeof(*d)); d->name = _("(SoX) Simulated analog filtration"); d->id = "sox_resample"; drivers = g_list_append(drivers,d); d = (struct driver_data *)g_malloc(sizeof(*d)); memcpy(d,&d2,sizeof(*d)); d->name = _("(SoX) Polyphase interpolation"); d->id = "sox_polyphase"; drivers = g_list_append(drivers,d); } d = g_malloc(sizeof(*d)); d->name = _("Sample repeat/skip (low quality)"); d->id = "repeat"; d->is_realtime = TRUE; d->prefers_float = FALSE; d->new_func = repeat_new; d->destroy_func = repeat_destroy; d->write_func = repeat_write; d->read_func = repeat_read; d->hasdata_func = repeat_hasdata; d->set_outrate_func = repeat_set_outrate; drivers = g_list_append(drivers,d); realtime_drivers = g_list_append(realtime_drivers,d); repeat_driver = d; } int rateconv_driver_count(gboolean realtime) { GList *l; register_drivers(); l = realtime ? realtime_drivers : drivers; return g_list_length(l); } const gchar *rateconv_driver_name(gboolean realtime, int index) { GList *l; struct driver_data *d; register_drivers(); l = realtime ? realtime_drivers : drivers; d = (struct driver_data *)g_list_nth_data(l,index); return d->name; } const gchar *rateconv_driver_id(gboolean realtime, int index) { GList *l; struct driver_data *d; register_drivers(); l = realtime ? realtime_drivers : drivers; d = (struct driver_data *)g_list_nth_data(l,index); return d->id; } int rateconv_driver_index(gboolean realtime, const gchar *driver_id) { GList *l; int i; struct driver_data *d; l = realtime ? realtime_drivers : drivers; for (i=0; l!=NULL; i++,l=l->next) { d = (struct driver_data *)l->data; if (!strcmp(d->id,driver_id)) return i; } return -1; } gboolean rateconv_prefers_float(const gchar *driver_id) { GList *l; struct driver_data *d; for (l=drivers; l!=NULL; l=l->next) { d = (struct driver_data *)l->data; if (!strcmp(d->id,driver_id)) return d->prefers_float; } return FALSE; } rateconv *rateconv_new(gboolean realtime, const char *driver_id, Dataformat *format, guint32 outrate, int dither_mode, gboolean passthru) { GList *l; struct driver_data *d; struct convdata_base *conv; register_drivers(); /* If desired sample rate is same as input rate, use the repeat * driver, which has special case for this. */ if (format->samplerate == outrate && !realtime) driver_id = "repeat"; l = realtime ? realtime_drivers : drivers; for (; l!=NULL; l=l->next) { d = (struct driver_data *)l->data; if (!strcmp(d->id,driver_id)) { conv = d->new_func(d,realtime,format,(outrate>0)?outrate:44100,dither_mode); if (conv == NULL) return NULL; conv->driver = d; conv->inrate = format->samplerate; conv->outrate = outrate; if (passthru) conv->passthru_buffer = ringbuf_new(16384 - (16384%format->samplebytes)); else conv->passthru_buffer = NULL; conv->emptying = FALSE; conv->readcount = conv->writecount = 0; conv->empty_point = 0; return conv; } } return NULL; } gint rateconv_write(rateconv *conv, void *data, guint bufsize) { struct convdata_base *convdata = (struct convdata_base *)conv; guint i = 0; gint j; if (convdata->passthru_buffer != NULL && convdata->inrate == convdata->outrate) { i = ringbuf_freespace(convdata->passthru_buffer); if (i < bufsize) bufsize = i; } j = convdata->driver->write_func(conv,data,bufsize); if (j > 0 && i > 0) { g_assert(j <= i); i = ringbuf_enqueue(convdata->passthru_buffer,data,j); g_assert(i == j); } if (j > 0) convdata->writecount += j; return j; } gint rateconv_read(rateconv *conv, void *data, guint bufsize) { struct convdata_base *convdata = (struct convdata_base *)conv; gint i; if (convdata->outrate == 0) { memset(data,0,bufsize); return bufsize; } i = convdata->driver->read_func(conv,data,bufsize); if (i > 0) { convdata->readcount += i; while (convdata->readcount > convdata->outrate) { convdata->readcount -= convdata->outrate; if (convdata->empty_point > convdata->outrate) convdata->empty_point -= convdata->outrate; else convdata->empty_point = 0; if (convdata->writecount > convdata->inrate) convdata->writecount -= convdata->inrate; else convdata->writecount = 0; } if (convdata->emptying && convdata->readcount >= convdata->empty_point) convdata->emptying = FALSE; if (convdata->passthru_buffer != NULL && convdata->inrate == convdata->outrate && !convdata->emptying) return ringbuf_dequeue(convdata->passthru_buffer,data,i); } return i; } gboolean rateconv_hasdata(rateconv *conv) { struct convdata_base *convdata = (struct convdata_base *)conv; return convdata->driver->hasdata_func(conv); } void rateconv_destroy(rateconv *conv) { struct convdata_base *convdata = (struct convdata_base *)conv; return convdata->driver->destroy_func(conv); } #define FLOAT(x) ((float)x) #define GUINT32(x) ((guint32)x) void rateconv_set_outrate(rateconv *conv, guint32 outrate) { struct convdata_base *convdata = (struct convdata_base *)conv; g_assert(convdata->driver->is_realtime); if (outrate > 0) convdata->driver->set_outrate_func(conv,outrate); convdata->outrate = outrate; if (convdata->passthru_buffer != NULL && convdata->outrate == convdata->inrate) { ringbuf_drain(convdata->passthru_buffer); convdata->emptying = TRUE; convdata->empty_point = GUINT32(FLOAT(convdata->writecount) * (FLOAT(convdata->outrate) / FLOAT(convdata->inrate))); } } mhwaveedit-1.4.24/src/rateconv.h000066400000000000000000000036111334022513400165160ustar00rootroot00000000000000/* * Copyright (C) 2004 2005 2006, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ /* Routines for converting sample rate, both realtime and block-based */ #ifndef RATECONV_H_INCLUDED #define RATECONV_H_INCLUDED #include "datasource.h" int rateconv_driver_count(gboolean realtime); const char *rateconv_driver_id(gboolean realtime, int index); const char *rateconv_driver_name(gboolean realtime, int index); int rateconv_driver_index(gboolean realtime, const gchar *driver_id); typedef void rateconv; /* Returns TRUE if the converter prefers in/out data in floating-point format, * for quality reasons. */ gboolean rateconv_prefers_float(const char *driver_id); rateconv *rateconv_new(gboolean realtime, const char *driver_id, Dataformat *format, guint32 outrate, int dither_mode, gboolean passthru); /* data == NULL means no more data will be sent */ gint rateconv_write(rateconv *conv, void *data, guint bufsize); gint rateconv_read(rateconv *conv, void *buffer, guint bufsize); gboolean rateconv_hasdata(rateconv *conv); void rateconv_destroy(rateconv *conv); /* Only for realtime converters */ void rateconv_set_outrate(rateconv *conv, guint32 outrate); #endif mhwaveedit-1.4.24/src/rateest.c000066400000000000000000000132751334022513400163460ustar00rootroot00000000000000/* * Copyright (C) 2005, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include #include "rateest.h" #define BIN_SEC 0.25 #define BIN_USEC 250000 #define BIN_SEC_DIV 4 #define LOW_RATIO_THRESHOLD 0.7 #define HIGH_RATIO_THRESHOLD 1.3 /* The best previous estimate we got so far */ static off_t best_written, best_played; static gfloat best_seconds; static gfloat best_discarded_seconds; /* Total number of frames logged */ static off_t total_written_frames; /* The value of total_written_frames when the current_* variables were reset */ static off_t current_checkpoint; /* Time current checkpoint was taken. Also time of last underrun */ static GTimeVal current_checkpoint_time; /* The current estimation we're building up */ /* Number of frames written for all time intervals that had "normal" usage */ static off_t current_played_frames; static gfloat current_played_seconds; /* Number of seconds that were discarded because of too high usage */ static gfloat current_discarded_seconds; /* Last time period # */ static gboolean is_first_period = TRUE; static long last_log_period; /* Amount of data played during this time period */ static off_t current_period_frames; /* Last value returned by rateest_frames_played */ static off_t last_frames_played_value; static long calc_current_period(void) { GTimeVal tv; g_get_current_time(&tv); return tv.tv_sec*BIN_SEC_DIV + tv.tv_usec/BIN_USEC; } void rateest_init(guint expected_samplerate) { best_written = best_played = (gfloat)expected_samplerate; best_seconds = 1.0; total_written_frames = 0; current_checkpoint = 0; g_get_current_time(¤t_checkpoint_time); current_played_frames = 0; current_played_seconds = 0; last_log_period = calc_current_period(); is_first_period = TRUE; current_period_frames = 0; last_frames_played_value = 0; } void rateest_log_data(guint frames) { long l; gfloat ratio; l = calc_current_period(); if (l != last_log_period) { ratio = ((gfloat)(current_period_frames * BIN_SEC_DIV)) / (best_played / best_seconds); /* printf("Period finished: frames=%d, ratio=%f\n", (int)current_period_frames,ratio); */ /* Ignore the first period, since it has unknown length */ if (is_first_period) { current_discarded_seconds += current_period_frames / rateest_real_samplerate(); } else if (l < last_log_period || (l-last_log_period > 1) || ratio < LOW_RATIO_THRESHOLD) { /* Store the current estimate as the best if it is */ if (current_played_seconds > best_seconds) { best_written = (gfloat)(total_written_frames- current_checkpoint); best_played = current_played_frames; best_seconds = current_played_seconds; best_discarded_seconds = current_discarded_seconds; } current_checkpoint = total_written_frames; g_get_current_time(¤t_checkpoint_time); current_played_frames = 0; current_played_seconds = 0.0; current_discarded_seconds = 0.0; } else if (ratio < HIGH_RATIO_THRESHOLD) { /* Add this period to the current estimation */ current_played_frames += current_period_frames; current_played_seconds += BIN_SEC; } else current_discarded_seconds += BIN_SEC; current_period_frames = 0; last_log_period = l; } current_period_frames += frames; total_written_frames += frames; } void rateest_prelog_data(guint frames) { total_written_frames += frames; } off_t rateest_frames_written(void) { return total_written_frames; } gfloat rateest_real_samplerate(void) { if (best_seconds > current_played_seconds) return ((gfloat)best_played)/best_seconds; else return ((gfloat)current_played_frames)/current_played_seconds; } off_t rateest_frames_played(void) { GTimeVal tv,tv2; int i; gfloat f,sr; off_t o,lat; /* First, use clock time, checkpoint time and estimated sample * rate to calculate position. * If the clock seems broken, use written frames and estimated latency. */ g_get_current_time(&tv); i = timeval_subtract(&tv2,&tv,¤t_checkpoint_time); sr = rateest_real_samplerate(); if (i >= 0) { /* printf("tv2: %ld.%6ld\n",tv2.tv_sec,tv2.tv_usec); */ f = (gfloat)tv2.tv_usec * 0.000001 + (gfloat)tv2.tv_sec; f *= sr; /* printf("f: %f, sr: %f\n",f,sr); */ o = current_checkpoint + (off_t)f; /* printf("First guess: %d, total_written: %d\n",(int)o, (int)total_written_frames); */ if (o>total_written_frames) o=total_written_frames; } if (i<0) { if (best_seconds > current_played_seconds) lat = best_written - (best_seconds + best_discarded_seconds)*sr; else lat = (total_written_frames - current_checkpoint) - (current_played_seconds + current_discarded_seconds)*sr; o = total_written_frames - lat; } if (o > last_frames_played_value) last_frames_played_value = o; return last_frames_played_value; } mhwaveedit-1.4.24/src/rateest.h000066400000000000000000000030311334022513400163400ustar00rootroot00000000000000/* * Copyright (C) 2005, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ /* Code for "guessing" the real sample rate and total buffer size * without using any special sound driver calls, by logging time * and size of succesful writes. */ #ifndef RATEEST_H_INCLUDED #define RATEEST_H_INCLUDED #include "main.h" /* Reset and setup estimator */ void rateest_init(guint expected_samplerate); /* Call this whenever data has been sent to sound driver */ void rateest_log_data(guint frames); /* Call this to account for data sent earlier */ void rateest_prelog_data(guint frames); /* Number of logged written frames. */ off_t rateest_frames_written(void); /* Estimate of number of actually played frames. */ off_t rateest_frames_played(void); /* Estimate of real sample rate */ gfloat rateest_real_samplerate(void); #endif mhwaveedit-1.4.24/src/rawdialog.c000066400000000000000000000101711334022513400166400ustar00rootroot00000000000000/* * Copyright (C) 2002 2003 2005 2007, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include #include #include "rawdialog.h" #include "inifile.h" #include "formatselector.h" #include "int_box.h" #include "main.h" #include "gettext.h" #include "mainloop.h" static gboolean ok_flag, destroy_flag; static Dataformat fmt; static FormatSelector *fs; static Intbox *offset_box; static gint maxhdrsize; static void rawdialog_ok(GtkButton *button, gpointer user_data) { if (format_selector_check(fs) || intbox_check_limit(offset_box,0,maxhdrsize,_("header size"))) { gtk_signal_emit_stop_by_name(GTK_OBJECT(button),"clicked"); return; } format_selector_get(fs,&fmt); ok_flag = TRUE; } static void rawdialog_destroy(GtkObject *object, gpointer user_data) { destroy_flag = TRUE; } Dataformat *rawdialog_execute(gchar *filename, gint filesize, guint *offset) { GtkWindow *w; GtkWidget *a,*b,*c; gchar *ch; memset(&fmt,0,sizeof(fmt)); fmt.type = DATAFORMAT_PCM; fmt.samplerate = 22050; fmt.channels = 1; fmt.samplesize = 1; fmt.samplebytes= fmt.samplesize * fmt.channels; fmt.sign = FALSE; fmt.bigendian = IS_BIGENDIAN; dataformat_get_from_inifile("rawDialog",TRUE,&fmt); maxhdrsize = filesize; w = GTK_WINDOW(gtk_window_new(GTK_WINDOW_DIALOG)); gtk_window_set_title(w,_("Unknown file format")); gtk_window_set_modal(w,TRUE); gtk_container_set_border_width(GTK_CONTAINER(w),5); gtk_signal_connect(GTK_OBJECT(w),"destroy", GTK_SIGNAL_FUNC(rawdialog_destroy),NULL); a = gtk_vbox_new(FALSE,3); gtk_container_add(GTK_CONTAINER(w),a); ch = g_strdup_printf(_("The format of file '%s' could not be recognized.\n\n" "Please specify the sample format below."),filename); b = gtk_label_new(ch); gtk_label_set_line_wrap(GTK_LABEL(b),TRUE); gtk_box_pack_start(GTK_BOX(a),b,TRUE,FALSE,0); g_free(ch); b = format_selector_new(TRUE); fs = FORMAT_SELECTOR(b); format_selector_set(fs,&fmt); gtk_container_add(GTK_CONTAINER(a),b); b = gtk_hbox_new(FALSE,0); gtk_container_add(GTK_CONTAINER(a),b); c = gtk_label_new(_("Header bytes: ")); gtk_box_pack_start(GTK_BOX(b),c,FALSE,FALSE,0); c = intbox_new(inifile_get_guint32("rawDialog_offset",0)); offset_box = INTBOX(c); gtk_box_pack_start(GTK_BOX(b),c,FALSE,FALSE,0); b = gtk_hseparator_new(); gtk_container_add(GTK_CONTAINER(a),b); b = gtk_hbutton_box_new(); gtk_container_add(GTK_CONTAINER(a),b); c = gtk_button_new_with_label(_("OK")); gtk_signal_connect(GTK_OBJECT(c),"clicked",GTK_SIGNAL_FUNC(rawdialog_ok), NULL); gtk_signal_connect_object(GTK_OBJECT(c),"clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy),GTK_OBJECT(w)); gtk_container_add(GTK_CONTAINER(b),c); c = gtk_button_new_with_label(_("Cancel")); gtk_signal_connect_object(GTK_OBJECT(c),"clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy),GTK_OBJECT(w)); gtk_container_add(GTK_CONTAINER(b),c); ok_flag = destroy_flag = FALSE; gtk_widget_show_all(GTK_WIDGET(w)); while (!destroy_flag) mainloop(); if (!ok_flag) return NULL; *offset = (guint) offset_box->val; dataformat_save_to_inifile("rawDialog",&fmt,TRUE); inifile_set_guint32("rawDialog_offset",*offset); return &fmt; } mhwaveedit-1.4.24/src/rawdialog.h000066400000000000000000000017621334022513400166530ustar00rootroot00000000000000/* * Copyright (C) 2002 2003 2005 2007, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #ifndef RAWDIALOG_H_INCLUDED #define RAWDIALOG_H_INCLUDED #include #include "chunk.h" Dataformat *rawdialog_execute(gchar *filename, gint filesize, guint *offset); #endif mhwaveedit-1.4.24/src/recorddialog.c000066400000000000000000001065311334022513400173330ustar00rootroot00000000000000/* * Copyright (C) 2004 2005 2008 2009, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include #include #include #include #include "recorddialog.h" #include "main.h" #include "inifile.h" #include "sound.h" #include "um.h" #include "int_box.h" #include "formatselector.h" #include "gettext.h" #include "mainloop.h" static struct { GtkWindow *wnd; FormatSelector *fs; GtkEntry *name_entry; int old_choice; GtkList *preset_list; GtkLabel *set_button_label; GtkButton *set_button_button; } other_dialog; static gboolean record_dialog_set_format(RecordDialog *rd); static GtkObjectClass *parent_class; static gboolean record_dialog_stopflag = FALSE; static RecordDialog *current_dialog; static ListObject *preset_list = NULL; static void build_preset_list(void) { gchar *s1,*s2,*s3,*s4,*s5,*s6; GList *l2 = NULL; int i; RecordFormat *rf; if (preset_list != NULL) return; /* Build format list */ /* Support reading both old and new style formats */ if (inifile_get("recordFormat1",NULL) == NULL && inifile_get("recordFormat1_Name",NULL) == NULL) { inifile_set("recordFormat1","16/2/44100/S/CD Quality"); inifile_set("recordFormat2","8/1/8000//Low quality"); } for (i=1; ; i++) { s1 = g_strdup_printf("recordFormat%d",i); s2 = inifile_get(s1,NULL); g_free(s1); if (s2 == NULL) { s1 = g_strdup_printf("recordFormat%d_Name",i); s2 = inifile_get(s1,NULL); g_free(s1); if (s2 == NULL) break; rf = g_malloc(sizeof(*rf)); s3 = g_strdup_printf("recordFormat%d",i); if (!dataformat_get_from_inifile(s3,TRUE,&(rf->fmt))) { g_free(s3); g_free(rf); continue; } g_free(s3); rf->num = i; rf->name = g_strdup(s2); l2 = g_list_append(l2,rf); } else { s3 = strchr(s2,'/'); if (s3 == NULL) continue; s3 += 1; s4 = strchr(s3,'/'); if (s4 == NULL) continue; s4 += 1; s5 = strchr(s4,'/'); if (s5 == NULL) continue; s5 += 1; s6 = strchr(s5,'/'); if (s6 == NULL) continue; s6 += 1; rf = g_malloc(sizeof(*rf)); rf->num = i; rf->fmt.type = DATAFORMAT_PCM; rf->fmt.samplesize = ((guint)strtod(s2,NULL)) / 8; rf->fmt.channels = ((guint)strtod(s3,NULL)); rf->fmt.samplebytes = rf->fmt.samplesize * rf->fmt.channels; rf->fmt.samplerate = ((guint)strtod(s4,NULL)); rf->fmt.sign = FALSE; rf->fmt.bigendian = IS_BIGENDIAN; rf->fmt.packing = 0; for (; *s5 != 0; s5++) { if (*s5 == 'B') rf->fmt.bigendian = !IS_BIGENDIAN; else if (*s5 == 'S') rf->fmt.sign = TRUE; } if (rf->fmt.samplesize < 1 || rf->fmt.samplesize > 4 || rf->fmt.channels < 1 || rf->fmt.channels > 8 || rf->fmt.samplerate < 1) { g_free(rf); continue; } rf->name = g_strdup(s6); l2 = g_list_append(l2,rf); } } preset_list = list_object_new_from_list(l2,FALSE); gtk_object_ref(GTK_OBJECT(preset_list)); } static void set_preset(gchar *name, Dataformat *fmt) { RecordFormat *rf; int i; gchar *c,*d; GList *l; g_assert(name != NULL); /* If there is an old format with the same name, update it. * Otherwise, set the number to one higher than the * currently highest used number. */ i = 0; l = preset_list->list; while (l != NULL) { rf = (RecordFormat *)(l->data); if (!strcmp(rf->name,name)) { if (dataformat_equal(&(rf->fmt),fmt)) return; memcpy(&(rf->fmt),fmt,sizeof(Dataformat)); break;; } if (rf->num > i) i = rf->num; l = l->next; } if (l == NULL) { rf = g_malloc(sizeof(*rf)); rf->name = g_strdup(name); rf->fmt = *fmt; rf->num = i+1; list_object_add(preset_list, rf); } c = g_strdup_printf("recordFormat%d",rf->num); d = g_strdup_printf("%s_Name",c); inifile_set(d,rf->name); dataformat_save_to_inifile(c,fmt,TRUE); g_free(d); g_free(c); if (l != NULL) list_object_notify(preset_list,rf); } static gboolean compare_preset(gchar *name, Dataformat *fmt) { GList *l; RecordFormat *rf; l = preset_list->list; while (l != NULL) { rf = (RecordFormat *)(l->data); if (!strcmp(rf->name,name)) return dataformat_equal(&(rf->fmt),fmt); l = l->next; } return FALSE; } static void reset_peaks(GtkButton *button, gpointer user_data) { int i; RecordDialog *rd = RECORD_DIALOG(user_data); for (i=0; i<8; i++) rd->maxpeak_values[i] = 0.0; } static void set_limit_label(RecordDialog *rd) { gchar buf[64]; if (rd->limit_record) { get_time_s(rd->current_format->samplerate, (rd->limit_bytes-rd->written_bytes) / rd->current_format->samplebytes, 0, buf); gtk_label_set_text(rd->limit_label,buf); } else gtk_label_set_text(rd->limit_label,_("(no limit)")); } static gboolean process_input(RecordDialog *rd) { guint32 x,y; gchar buf[4096]; guint c,d,e; sample_t peak,rms,avg,*sp,*sq,s,pmax; guint32 clip_amount,clip_size; int i; gboolean finish_mode = record_dialog_stopflag; if (rd->current_format == NULL) return FALSE; /* Read input */ input_store(rd->databuf); x = ringbuf_available(rd->databuf); /* Round to even samples */ x -= x % rd->current_format->samplebytes; /* If we have <0.1 s of data, wait for more. */ if ((x < rd->analysis_bytes && !finish_mode) || x==0) return FALSE; /* Send data older than 0.1s straight into the tempfile if we have one */ if (!finish_mode) x -= rd->analysis_bytes; while (x > 0) { y = ringbuf_dequeue(rd->databuf,buf,MIN(x,sizeof(buf))); if (rd->tf != NULL && !rd->paused) { if (tempfile_write(rd->tf,buf,y)) { record_dialog_stopflag = TRUE; return FALSE; } rd->written_bytes += y; if ( (rd->limit_record) && (rd->written_bytes >= rd->limit_bytes) ) { record_dialog_stopflag = TRUE; return TRUE; } } x -= y; } if (finish_mode) return TRUE; /* Analyse data */ y = ringbuf_dequeue(rd->databuf,rd->analysis_buf,rd->analysis_bytes); g_assert(y == rd->analysis_bytes); /* First write out the raw data to disk */ if (rd->tf != NULL && !rd->paused) { if (tempfile_write(rd->tf,rd->analysis_buf,y)) { record_dialog_stopflag = TRUE; return FALSE; } rd->written_bytes += y; if ( (rd->limit_record) && (rd->written_bytes >= rd->limit_bytes) ) record_dialog_stopflag = TRUE; } convert_array(rd->analysis_buf,rd->current_format, rd->analysis_sbuf,&dataformat_sample_t, rd->analysis_samples, DITHER_NONE, NULL); /* Calculate statistics */ sq = &(rd->analysis_sbuf[rd->analysis_samples]); d = rd->current_format->channels; for (c=0; canalysis_sbuf[c]); for (; sp peak) peak = s; rms += s*s; *sp = s; /* Save the abs value for clipping calculation */ } avg /= ((sample_t)rd->analysis_samples); rms = sqrt((rms)/ ((sample_t)rd->analysis_samples) - avg*avg); pmax = maximum_float_value(&(rd->current_format->fmt)); /* Since the conversion routines were changed for 1.2.9, this * algo can give false alarms, but only when you're _very_ near * clipping. */ if (peak >= pmax) { /* Calculate clipping amount and size */ sp = &(rd->analysis_sbuf[c]); while (1) { for (; sp= pmax) break; if (sp >= sq) break; for (e=0; sp=pmax; e++,sp+=d) { } clip_amount ++; clip_size += e*e; } } /* Set the labels and VU meters */ vu_meter_set_value(rd->meters[c],(float)peak); g_snprintf(buf,sizeof(buf),"%.5f",(float)peak); gtk_label_set_text(rd->peak_labels[c],buf); if (((float)peak) > rd->maxpeak_values[c] ) { rd->maxpeak_values[c] = (float)peak; gtk_label_set_text(rd->maxpeak_labels[c],buf); } g_snprintf(buf,sizeof(buf),"%.5f",(float)rms); gtk_label_set_text(rd->rms_labels[c],buf); /* This probably needs some tweaking but has to do for now. */ if (clip_amount == 0) gtk_label_set_text(rd->clip_labels[c],_("None")); else if (((float)clip_size)/((float)clip_amount) < 2.0 || (clip_size < rd->analysis_samples / (d * 100))) gtk_label_set_text(rd->clip_labels[c],_("Mild")); else gtk_label_set_text(rd->clip_labels[c],_("Heavy")); } if (rd->tf) { get_time(rd->current_format->samplerate, rd->written_bytes/rd->current_format->samplebytes, 0,buf,default_time_mode); gtk_label_set_text(rd->time_label,buf); g_snprintf(buf,200,"%" OFF_T_FORMAT "", (OFF_T_FTYPE)rd->written_bytes); gtk_label_set_text(rd->bytes_label,buf); get_time_s(rd->current_format->samplerate, rd->written_bytes/rd->current_format->samplebytes, 0, buf); if ( strcmp(buf, GTK_WINDOW(rd)->title) ) { gtk_window_set_title(GTK_WINDOW(rd),buf); /* Also update the remaining time here */ set_limit_label(rd); } i = input_overrun_count(); if (i>=0) { i -= rd->overruns_before_start; while (i > rd->overruns) { if (rd->overruns < 10) rd->overrun_locs[rd->overruns] = rd->written_bytes; rd->overruns++; } g_snprintf(buf,sizeof(buf),"%d",i); gtk_label_set_text(rd->overruns_label,buf); } } return TRUE; } void input_ready_func(void) { process_input(current_dialog); } static void record_dialog_format_changed(Combo *combo, gpointer user_data) { RECORD_DIALOG(user_data)->format_changed = TRUE; } static gchar *other_dialog_get_name(void) { gchar *c,*d; c = (gchar *)gtk_entry_get_text(other_dialog.name_entry); while (*c == ' ') c++; /* Skip beginning spaces */ if (*c == 0) return NULL; c = g_strdup(c); /* Trim ending spaces */ d = strchr(c,0); d--; while (*d == ' ') { *d = 0; d--; } return c; } static void other_dialog_ok(GtkButton *button, gpointer user_data) { RecordDialog *rd = RECORD_DIALOG(user_data); Dataformat df; gchar *c; if (format_selector_check(other_dialog.fs)) return; format_selector_get(other_dialog.fs,&df); c = other_dialog_get_name(); if (c != NULL && compare_preset(c,&df)) record_format_combo_set_named_preset(rd->format_combo,c); else record_format_combo_set_format(rd->format_combo,&df); g_free(c); } static void other_dialog_addpreset(GtkButton *button, gpointer user_data) { gchar *name; Dataformat df; if (format_selector_check(other_dialog.fs)) return; format_selector_get(other_dialog.fs,&df); name = other_dialog_get_name(); g_assert(name != NULL); set_preset(name,&df); /* b = record_format_combo_set_named_preset(rd->format_combo,name); g_assert(b); */ g_free(name); } static gboolean other_dialog_delete(GtkWidget *widget, GdkEvent *event, gpointer user_data) { return FALSE; } static void other_dialog_name_changed(GtkEditable *editable, gpointer user_data) { gchar *c; GList *l; RecordFormat *rf; c = other_dialog_get_name(); for (l=preset_list->list; l!=NULL; l=l->next) { rf = (RecordFormat *)(l->data); if (rf->name != NULL && c != NULL && !strcmp(rf->name,c)) break; } if (l != NULL) { gtk_label_set_text(other_dialog.set_button_label, _("Update preset")); gtk_widget_set_sensitive(GTK_WIDGET(other_dialog.set_button_button), TRUE); } else if (c != NULL) { gtk_label_set_text(other_dialog.set_button_label, _("Add preset")); gtk_widget_set_sensitive(GTK_WIDGET(other_dialog.set_button_button), TRUE); } else { gtk_widget_set_sensitive(GTK_WIDGET(other_dialog.set_button_button), FALSE); } g_free(c); } static GtkWidget *other_dialog_build_preset_list(RecordDialog *rd) { GtkWidget *a,*x=NULL; GList *l; RecordFormat *rf; gchar *n; n = record_format_combo_get_preset_name(rd->format_combo); for (l=preset_list->list; l!=NULL; l=l->next) { rf = (RecordFormat *)(l->data); if (rf->name == NULL) continue; a = gtk_list_item_new_with_label(rf->name); gtk_container_add(GTK_CONTAINER(other_dialog.preset_list),a); gtk_object_set_data(GTK_OBJECT(a),"fmt",rf); if (n != NULL && rf->name != NULL && !strcmp(n,rf->name)) x = a; } return x; } static void other_dialog_select_child(GtkList *list, GtkWidget *widget, gpointer user_data) { RecordFormat *rf; rf = gtk_object_get_data(GTK_OBJECT(widget),"fmt"); format_selector_set(other_dialog.fs, &(rf->fmt)); gtk_entry_set_text(other_dialog.name_entry, rf->name); } static void other_dialog_preset_item_added(ListObject *lo, RecordFormat *rf, gpointer user_data) { GtkWidget *a; a = gtk_list_item_new_with_label(rf->name); gtk_container_add(GTK_CONTAINER(other_dialog.preset_list),a); gtk_object_set_data(GTK_OBJECT(a),"fmt",rf); gtk_widget_show(a); } static void other_dialog_preset_item_removed(ListObject *lo, gpointer item, gpointer user_data) { GList *l; gpointer p; l = gtk_container_get_children(GTK_CONTAINER(other_dialog.preset_list)); for (; l!=NULL; l=l->next) { p = gtk_object_get_data(GTK_OBJECT(l->data),"fmt"); if (p == item) { gtk_container_remove(GTK_CONTAINER(other_dialog.preset_list), GTK_WIDGET(l->data)); break; } } g_list_free(l); } static void other_format_dialog(RecordFormatCombo *rfc, RecordDialog *rd) { GtkWidget *a,*b,*c,*d,*e,*f,*item; GtkAccelGroup* ag; GtkRequisition req; #if GTK_MAJOR_VERSION > 1 static GtkWindowGroup *wg = NULL; #endif ag = gtk_accel_group_new(); other_dialog.wnd = GTK_WINDOW(gtk_window_new(GTK_WINDOW_DIALOG)); gtk_window_set_title(other_dialog.wnd,_("Custom format")); #if GTK_MAJOR_VERSION < 2 gtk_window_set_modal(other_dialog.wnd,TRUE); #else if (wg == NULL) wg = gtk_window_group_new(); gtk_window_group_add_window(wg,other_dialog.wnd); #endif gtk_window_set_transient_for(other_dialog.wnd,GTK_WINDOW(rd)); other_dialog.fs = FORMAT_SELECTOR(format_selector_new(TRUE)); other_dialog.name_entry = GTK_ENTRY(gtk_entry_new()); other_dialog.preset_list = GTK_LIST(gtk_list_new()); item = other_dialog_build_preset_list(rd); gtk_signal_connect_while_alive (GTK_OBJECT(preset_list),"item_added", GTK_SIGNAL_FUNC(other_dialog_preset_item_added),other_dialog.wnd, GTK_OBJECT(other_dialog.wnd)); gtk_signal_connect_while_alive (GTK_OBJECT(preset_list),"item_removed", GTK_SIGNAL_FUNC(other_dialog_preset_item_removed),other_dialog.wnd, GTK_OBJECT(other_dialog.wnd)); a = GTK_WIDGET(other_dialog.wnd); gtk_container_set_border_width(GTK_CONTAINER(a),10); gtk_signal_connect(GTK_OBJECT(a),"delete_event", GTK_SIGNAL_FUNC(other_dialog_delete),NULL); b = gtk_vbox_new(FALSE,6); gtk_container_add(GTK_CONTAINER(a),b); c = gtk_hbox_new(FALSE,6); gtk_container_add(GTK_CONTAINER(b),c); d = gtk_vbox_new(FALSE,6); gtk_box_pack_start(GTK_BOX(c),d,FALSE,FALSE,0); e = GTK_WIDGET(other_dialog.fs); gtk_box_pack_start(GTK_BOX(d),e,FALSE,FALSE,0); e = gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(d),e,FALSE,FALSE,0); e = gtk_label_new(_("The sign and endian-ness can usually be left at their " "defaults, but should be changed if you're unable to " "record or get bad sound.")); gtk_label_set_line_wrap(GTK_LABEL(e),TRUE); gtk_box_pack_start(GTK_BOX(d),e,FALSE,FALSE,0); /* c = gtk_label_new(_("To add this format to the presets, enter a name " "below. Otherwise, leave it blank.")); gtk_label_set_line_wrap(GTK_LABEL(c),TRUE); gtk_container_add(GTK_CONTAINER(b),c); */ e = gtk_hbox_new(FALSE,4); gtk_box_pack_end(GTK_BOX(d),e,FALSE,FALSE,0); f = gtk_label_new(_("Name :")); gtk_container_add(GTK_CONTAINER(e),f); f = GTK_WIDGET(other_dialog.name_entry); gtk_container_add(GTK_CONTAINER(e),f); e = gtk_hseparator_new(); gtk_box_pack_end(GTK_BOX(d),e,FALSE,FALSE,0); d = gtk_vseparator_new(); gtk_box_pack_start(GTK_BOX(c),d,FALSE,FALSE,0); d = gtk_vbox_new(FALSE,6); gtk_container_add(GTK_CONTAINER(c),d); e = gtk_label_new(_("Presets:")); gtk_box_pack_start(GTK_BOX(d),e,FALSE,FALSE,0); e = gtk_scrolled_window_new(NULL,NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(e),GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); gtk_container_add(GTK_CONTAINER(d),e); f = GTK_WIDGET(other_dialog.preset_list); gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(e),f); c = gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(b),c,FALSE,FALSE,0); c = gtk_hbutton_box_new(); gtk_box_pack_start(GTK_BOX(b),c,FALSE,FALSE,0); d = gtk_button_new_with_label(_("Set format")); gtk_widget_add_accelerator (d, "clicked", ag, GDK_KP_Enter, 0, (GtkAccelFlags) 0); gtk_widget_add_accelerator (d, "clicked", ag, GDK_Return, 0, (GtkAccelFlags) 0); gtk_container_add(GTK_CONTAINER(c),d); gtk_signal_connect(GTK_OBJECT(d),"clicked", GTK_SIGNAL_FUNC(other_dialog_ok),rd); d = gtk_button_new_with_label(_("Add/Update preset")); gtk_widget_set_sensitive(d,FALSE); gtk_widget_size_request(d,&req); gtk_widget_set_size_request(d,req.width,req.height); gtk_container_add(GTK_CONTAINER(c),d); gtk_signal_connect(GTK_OBJECT(d),"clicked", GTK_SIGNAL_FUNC(other_dialog_addpreset),rd); other_dialog.set_button_button = GTK_BUTTON(d); other_dialog.set_button_label = GTK_LABEL(gtk_bin_get_child(GTK_BIN(d))); d = gtk_button_new_with_label(_("Close")); gtk_widget_add_accelerator (d, "clicked", ag, GDK_Escape, 0, (GtkAccelFlags) 0); gtk_container_add(GTK_CONTAINER(c),d ); gtk_signal_connect_object(GTK_OBJECT(d),"clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy), GTK_OBJECT(a)); gtk_widget_show_all(a); gtk_window_add_accel_group(GTK_WINDOW (a), ag); gtk_signal_connect(GTK_OBJECT(other_dialog.wnd),"delete_event", GTK_SIGNAL_FUNC(other_dialog_delete),NULL); gtk_signal_connect(GTK_OBJECT(other_dialog.preset_list),"select_child", GTK_SIGNAL_FUNC(other_dialog_select_child),rd); gtk_signal_connect(GTK_OBJECT(other_dialog.name_entry),"changed", GTK_SIGNAL_FUNC(other_dialog_name_changed),rd); if (item != NULL) gtk_list_select_child(other_dialog.preset_list,item); gtk_signal_connect_object_while_alive(GTK_OBJECT(rd),"destroy", GTK_SIGNAL_FUNC(gtk_widget_destroy), GTK_OBJECT(other_dialog.wnd)); } static void update_limit(RecordDialog *rd) { gdouble d; if (rd->tf == NULL) return; d = (gdouble)rd->limit_seconds; d *= (gdouble)(rd->current_format->samplerate); d *= (gdouble)(rd->current_format->samplebytes); rd->limit_bytes = (off_t)d; set_limit_label(rd); } static void set_time_limit(GtkButton *button, gpointer user_data) { gfloat f; gchar buf[64]; RecordDialog *rd = RECORD_DIALOG(user_data); f = parse_time((gchar *)gtk_entry_get_text(rd->limit_entry)); if (f < 0.0) { popup_error(_("Invalid time value. Time must be specified in the form" " (HH')MM:SS(.mmmm)")); return; } rd->limit_record = TRUE; rd->limit_seconds = f; get_time_l(1000,(off_t)(f*1000.0),(off_t)(f*1000.0),buf); gtk_label_set_text(rd->limit_set_label, buf); gtk_widget_set_sensitive(GTK_WIDGET(rd->disable_limit_button),TRUE); update_limit(rd); } static void disable_time_limit(GtkButton *button, gpointer user_data) { RecordDialog *rd = RECORD_DIALOG(user_data); rd->limit_record = FALSE; gtk_label_set_text(rd->limit_set_label,_("(no limit)")); gtk_widget_set_sensitive(GTK_WIDGET(rd->disable_limit_button),FALSE); } static gboolean record_dialog_set_format(RecordDialog *rd) { Dataformat *df; GtkWidget *a,*b; gint i; /* printf("record_dialog_set_format: %s fresh=%d\n",rf->name, rd->format_combo_fresh); */ input_stop(); rd->current_format = NULL; if (rd->vu_frame->child != NULL) gtk_container_remove(GTK_CONTAINER(rd->vu_frame), rd->vu_frame->child); g_free(rd->peak_labels); g_free(rd->maxpeak_labels); g_free(rd->rms_labels); g_free(rd->clip_labels); g_free(rd->meters); rd->peak_labels = NULL; rd->maxpeak_labels = NULL; rd->rms_labels = NULL; rd->clip_labels = NULL; rd->meters = NULL; gtk_label_set_text(rd->status_label,_("Format not selected")); gtk_widget_set_sensitive(rd->record_button,FALSE); gtk_widget_set_sensitive(rd->reset_button,FALSE); df = record_format_combo_get_format(rd->format_combo); i = input_select_format(df,FALSE,input_ready_func); if (i < 0) { user_error(_("This format is not supported by the input driver!")); return TRUE; } else if (i > 0) return TRUE; gtk_label_set_text(rd->status_label,_("Ready for recording")); record_format_combo_store(rd->format_combo); rd->current_format = &(rd->format_combo->stored_selection_format); rd->peak_labels = g_malloc(df->channels*sizeof(GtkLabel *)); rd->maxpeak_labels = g_malloc(df->channels*sizeof(GtkLabel *)); rd->clip_labels = g_malloc(df->channels*sizeof(GtkLabel *)); rd->rms_labels = g_malloc(df->channels*sizeof(GtkLabel *)); rd->meters = g_malloc(df->channels*sizeof(VuMeter *)); memset(rd->maxpeak_values,0,sizeof(rd->maxpeak_values)); a = gtk_table_new(6*((df->channels+1)/2),4,FALSE); gtk_container_set_border_width(GTK_CONTAINER(a),4); for (i=0; i*2channels; i++) { attach_label(_("Peak: "),a,i*6+2,0); attach_label(_("Peak max: "),a,i*6+3,0); attach_label(_("RMS: "),a,i*6+4,0); attach_label(_("Clipping: "),a,i*6+5,0); } for (i=0; ichannels; i++) { b = gtk_label_new(channel_name(i,df->channels)); gtk_table_attach(GTK_TABLE(a),b,(i&1)+1,(i&1)+2,(i/2)*6+0,(i/2)*6+1, 0,0,0,0); b = vu_meter_new(0.0); rd->meters[i] = VU_METER(b); gtk_table_attach(GTK_TABLE(a),b,(i&1)+1,(i&1)+2,(i/2)*6+1,(i/2)*6+2, 0,0,0,0); rd->peak_labels[i] = attach_label("",a,(i/2)*6+2,(i&1)+1); rd->maxpeak_labels[i] = attach_label("",a,(i/2)*6+3,(i&1)+1); rd->rms_labels[i] = attach_label("",a,(i/2)*6+4,(i&1)+1); rd->clip_labels[i] = attach_label(_("None"),a,(i/2)*6+5,(i&1)+1); } gtk_table_set_col_spacings(GTK_TABLE(a),5); gtk_table_set_row_spacings(GTK_TABLE(a),3); gtk_container_add(GTK_CONTAINER(rd->vu_frame),a); gtk_widget_show_all(a); gtk_widget_set_sensitive(rd->record_button,TRUE); gtk_widget_set_sensitive(rd->reset_button,TRUE); /* Create a 2 second ring buffer */ if (rd->databuf != NULL) { ringbuf_free(rd->databuf); g_free(rd->analysis_buf); g_free(rd->analysis_sbuf); } rd->databuf = ringbuf_new(2*df->samplebytes*df->samplerate); /* Do analysis on 0.1 s parts. */ rd->analysis_bytes = df->samplebytes * df->samplerate / 10; rd->analysis_samples = df->channels * df->samplerate / 10; rd->analysis_buf = g_malloc(rd->analysis_bytes); rd->analysis_sbuf = g_malloc(sizeof(sample_t) * rd->analysis_samples); /* Call process_input manually one time here * (required for some sound drivers to start recording) */ process_input(rd); return FALSE; } static void check_format_change(RecordDialog *rd) { if (!rd->format_changed) return; rd->format_changed = FALSE; record_dialog_set_format(rd); } static void record_dialog_start(GtkButton *button, gpointer user_data) { RecordDialog *rd = RECORD_DIALOG(user_data); GtkRequisition req; int i; gchar *c; if (rd->tf != NULL) { /* This is a hack to prevent the window from resizing when we * change the button's caption */ gtk_widget_size_request(rd->record_button,&req); gtk_widget_set_usize(rd->record_button,req.width,req.height); /* Toggle pause mode */ rd->paused = !rd->paused; gtk_label_set_text(GTK_LABEL(GTK_BIN(rd->record_button)->child), rd->paused?_("Resume recording"):_("Pause recording")); gtk_label_set_text(rd->status_label,rd->paused? translate_strip(N_("RecordStatus|Paused")): translate_strip(N_("RecordStatus|Recording"))); return; } inifile_set_gboolean("limitRecord",rd->limit_record); inifile_set_gfloat( "limitSecs",rd->limit_seconds); c = record_format_combo_get_preset_name(rd->format_combo); inifile_set("lastRecordFormat",c); if (c == NULL) { dataformat_save_to_inifile("lastRecordFormat", record_format_combo_get_format (rd->format_combo), TRUE); } gtk_widget_set_sensitive(GTK_WIDGET(rd->format_combo),FALSE); gtk_label_set_text(GTK_LABEL(GTK_BIN(rd->record_button)->child), _("Pause recording")); rd->paused = FALSE; gtk_label_set_text(GTK_LABEL(GTK_BIN(rd->close_button)->child), _("Finish")); rd->tf = tempfile_init(rd->current_format,TRUE); rd->written_bytes = 0; i = input_overrun_count(); gtk_label_set_text(rd->status_label, translate_strip(N_("RecordStatus|Recording"))); if (i>-1) { rd->overruns_before_start = i; gtk_label_set_text(rd->overruns_title,_("Overruns: ")); } rd->overruns = 0; gtk_label_set_text(rd->bytes_text_label,_("Bytes written: ")); gtk_label_set_text(rd->limit_text_label,_("Auto stop in: ")); update_limit(rd); } static void record_dialog_close(GtkButton *button, gpointer user_data) { record_dialog_stopflag = TRUE; } static gboolean record_dialog_delete_event(GtkWidget *widget, GdkEvent *event, gpointer user_data) { record_dialog_stopflag = TRUE; return TRUE; } void record_dialog_init(RecordDialog *obj) { GtkWidget *a,*b,*c,*d,*e; GtkAccelGroup* ag; GtkRequisition req; gchar limitbuf[64]; gchar *s1; GList *dp; gboolean complete; Dataformat df,*dfp; ag = gtk_accel_group_new(); obj->format_changed = FALSE; obj->current_format = NULL; obj->databuf = NULL; obj->meters = NULL; obj->peak_labels = obj->maxpeak_labels = obj->clip_labels = NULL; obj->rms_labels = NULL; obj->tf = NULL; obj->written_bytes = 0; obj->analysis_buf = NULL; obj->analysis_sbuf = NULL; obj->limit_record = inifile_get_gboolean("limitRecord",FALSE); obj->limit_seconds = inifile_get_gfloat("limitSecs",3600.0); if (obj->limit_seconds < 0.0) obj->limit_seconds = 3600.0; get_time_l(1000,(off_t)(obj->limit_seconds*1000.0),0,limitbuf); gtk_window_set_title(GTK_WINDOW(obj),_("Record")); gtk_window_set_modal(GTK_WINDOW(obj),TRUE); gtk_window_set_default_size(GTK_WINDOW(obj),320,400); gtk_window_set_position(GTK_WINDOW(obj),GTK_WIN_POS_CENTER); gtk_container_set_border_width(GTK_CONTAINER(obj),10); gtk_signal_connect(GTK_OBJECT(obj),"delete_event", GTK_SIGNAL_FUNC(record_dialog_delete_event),NULL); build_preset_list(); dp = input_supported_formats(&complete); obj->driver_presets = list_object_new_from_list(dp,FALSE); gtk_object_ref(GTK_OBJECT(obj->driver_presets)); gtk_object_sink(GTK_OBJECT(obj->driver_presets)); /* Add components */ a = gtk_vbox_new(FALSE,10); gtk_container_add(GTK_CONTAINER(obj),a); b = gtk_frame_new(_("Recording settings")); gtk_box_pack_start(GTK_BOX(a),b,FALSE,FALSE,0); c = gtk_vbox_new(FALSE,0); gtk_container_set_border_width(GTK_CONTAINER(c),5); gtk_container_add(GTK_CONTAINER(b),c); d = gtk_hbox_new(FALSE,0); gtk_box_pack_start(GTK_BOX(c),d,FALSE,FALSE,0); e = gtk_label_new(_("Sample format: ")); gtk_box_pack_start(GTK_BOX(d),e,FALSE,FALSE,0); e = record_format_combo_new(complete ? list_object_new(FALSE):preset_list, obj->driver_presets, !complete); gtk_box_pack_start(GTK_BOX(d),e,TRUE,TRUE,0); obj->format_combo = RECORD_FORMAT_COMBO(e); gtk_signal_connect(GTK_OBJECT(e),"format_changed", GTK_SIGNAL_FUNC(record_dialog_format_changed),obj); gtk_signal_connect(GTK_OBJECT(e),"format_dialog_request", GTK_SIGNAL_FUNC(other_format_dialog),obj); d = gtk_hbox_new(FALSE,3); gtk_box_pack_start(GTK_BOX(c),d,FALSE,FALSE,6); e = gtk_label_new(_("Time limit: ")); gtk_box_pack_start(GTK_BOX(d),e,FALSE,FALSE,0); e = gtk_label_new(_("(no limit)")); obj->limit_set_label = GTK_LABEL(e); if (obj->limit_record) gtk_label_set_text(obj->limit_set_label, limitbuf); gtk_box_pack_start(GTK_BOX(d),e,FALSE,FALSE,0); e = gtk_button_new_with_label(_("Disable")); obj->disable_limit_button = GTK_BUTTON(e); gtk_widget_set_sensitive(GTK_WIDGET(e),obj->limit_record); gtk_signal_connect(GTK_OBJECT(e),"clicked", GTK_SIGNAL_FUNC(disable_time_limit),obj); gtk_box_pack_end(GTK_BOX(d),e,FALSE,FALSE,0); e = gtk_button_new_with_label(_("Set")); gtk_signal_connect(GTK_OBJECT(e),"clicked", GTK_SIGNAL_FUNC(set_time_limit),obj); gtk_box_pack_end(GTK_BOX(d),e,FALSE,FALSE,0); e = gtk_entry_new(); obj->limit_entry = GTK_ENTRY(e); gtk_entry_set_text(obj->limit_entry, limitbuf ); /* Max length = "hhh'mm:ss.mmm" */ gtk_entry_set_max_length( obj->limit_entry, 14); gtk_box_pack_end(GTK_BOX(d),e,FALSE,FALSE,0); b = gtk_frame_new(_("Input levels")); obj->vu_frame = GTK_BIN(b); gtk_box_pack_start(GTK_BOX(a),b,TRUE,TRUE,0); b = gtk_table_new(3,4,FALSE); gtk_box_pack_start(GTK_BOX(a),b,FALSE,FALSE,0); attach_label(_("Recording status: "),b,0,0); obj->status_label = GTK_LABEL(gtk_label_new(_("Format not selected"))); gtk_table_attach(GTK_TABLE(b),GTK_WIDGET(obj->status_label),1,4,0,1, GTK_FILL,0,0,0); gtk_misc_set_alignment(GTK_MISC(obj->status_label),0.0,0.5); attach_label(_("Time recorded: "),b,1,0); obj->time_label = attach_label(_("N/A"),b,1,1); gtk_widget_size_request(GTK_WIDGET(obj->time_label),&req); /* Stops wobble during recording */ gtk_widget_set_usize(GTK_WIDGET(obj->time_label),150,req.height); obj->limit_text_label = attach_label("",b,2,0); obj->limit_label = attach_label("",b,2,1); obj->bytes_text_label = attach_label("",b,1,2); obj->bytes_label = attach_label("",b,1,3); obj->overruns_title = attach_label("",b,2,2); obj->overruns_label = attach_label("",b,2,3); b = gtk_hbutton_box_new(); gtk_box_pack_start(GTK_BOX(a),b,FALSE,FALSE,0); c = gtk_button_new_with_label(_("Start recording")); gtk_widget_add_accelerator (c, "clicked", ag, GDK_KP_Enter, 0, (GtkAccelFlags) 0); gtk_widget_add_accelerator (c, "clicked", ag, GDK_Return, 0, (GtkAccelFlags) 0); gtk_widget_set_sensitive(c,FALSE); gtk_signal_connect(GTK_OBJECT(c),"clicked", GTK_SIGNAL_FUNC(record_dialog_start),obj); obj->record_button = GTK_WIDGET(c); gtk_container_add(GTK_CONTAINER(b),c); c = gtk_button_new_with_label(_("Reset max peaks")); gtk_widget_set_sensitive(c,FALSE); gtk_signal_connect(GTK_OBJECT(c),"clicked", GTK_SIGNAL_FUNC(reset_peaks),obj); obj->reset_button = GTK_WIDGET(c); gtk_container_add(GTK_CONTAINER(b),c); c = gtk_button_new_with_label(_("Launch mixer")); gtk_signal_connect(GTK_OBJECT(c),"clicked",GTK_SIGNAL_FUNC(launch_mixer), NULL); gtk_container_add(GTK_CONTAINER(b),c); c = gtk_button_new_with_label(_("Close")); gtk_widget_add_accelerator (c, "clicked", ag, GDK_Escape, 0, (GtkAccelFlags) 0); gtk_signal_connect(GTK_OBJECT(c),"clicked", GTK_SIGNAL_FUNC(record_dialog_close),obj); gtk_container_add(GTK_CONTAINER(b),c); obj->close_button = c; gtk_widget_show_all(a); gtk_window_add_accel_group(GTK_WINDOW (obj), ag); /* Special case: Only one format supported. Choose that format and * make the format combo insensitive */ if (complete && list_object_get_size(obj->driver_presets)==1) { dfp = (Dataformat *)list_object_get(obj->driver_presets,0); record_format_combo_set_format(obj->format_combo,dfp); gtk_widget_set_sensitive(GTK_WIDGET(obj->format_combo),FALSE); return; } /* Set the last used format */ s1 = inifile_get("lastRecordFormat",NULL); if (s1 != NULL) { record_format_combo_set_named_preset(obj->format_combo,s1); } else { if (dataformat_get_from_inifile("lastRecordFormat",TRUE,&df)) record_format_combo_set_format(obj->format_combo,&df); } } static void record_dialog_destroy(GtkObject *obj) { RecordDialog *rd = RECORD_DIALOG(obj); if (rd->databuf) ringbuf_free(rd->databuf); rd->databuf = NULL; g_free(rd->analysis_buf); rd->analysis_buf = NULL; g_free(rd->analysis_sbuf); rd->analysis_sbuf = NULL; parent_class->destroy(obj); if (rd->driver_presets != NULL) { list_object_foreach(rd->driver_presets, (GFunc)g_free, NULL); list_object_clear(rd->driver_presets, FALSE); gtk_object_unref(GTK_OBJECT(rd->driver_presets)); rd->driver_presets = NULL; } } static void record_dialog_class_init(GtkObjectClass *klass) { parent_class = gtk_type_class(gtk_window_get_type()); klass->destroy = record_dialog_destroy; } GtkType record_dialog_get_type(void) { static GtkType id = 0; if (!id) { GtkTypeInfo info = { "RecordDialog", sizeof(RecordDialog), sizeof(RecordDialogClass), (GtkClassInitFunc) record_dialog_class_init, (GtkObjectInitFunc) record_dialog_init }; id = gtk_type_unique(gtk_window_get_type(),&info); } return id; } Chunk *record_dialog_execute(int *noverruns, off_t overrun_locs[10]) { RecordDialog *rd; Chunk *ds; int i; rd = RECORD_DIALOG(gtk_type_new(record_dialog_get_type())); record_dialog_stopflag = FALSE; current_dialog = rd; gtk_widget_show(GTK_WIDGET(rd)); while (!record_dialog_stopflag) { mainloop(); check_format_change(rd); } if (rd->tf != NULL) { input_stop_hint(); i = 0; /* Just to avoid infinite loops */ while (process_input(rd) && i<128) { i++; } input_stop(); ds = tempfile_finished(rd->tf); *noverruns = rd->overruns; memcpy(overrun_locs,rd->overrun_locs,10*sizeof(off_t)); gtk_widget_destroy(GTK_WIDGET(rd)); return ds; } else { input_stop(); gtk_widget_destroy(GTK_WIDGET(rd)); return NULL; } } mhwaveedit-1.4.24/src/recorddialog.h000066400000000000000000000047731334022513400173450ustar00rootroot00000000000000/* * Copyright (C) 2002 2003 2004 2009, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #ifndef RECORDDIALOG_H_INCLUDED #define RECORDDIALOG_H_INCLUDED #include #include "chunk.h" #include "int_box.h" #include "datasource.h" #include "vu_meter.h" #include "ringbuf.h" #include "tempfile.h" #include "combo.h" #include "recordformatcombo.h" #define RECORD_DIALOG(obj) GTK_CHECK_CAST(obj, record_dialog_get_type(), RecordDialog) #define RECORD_DIALOG_CLASS(klass) GTK_CHECK_CLASS_CAST(klass,record_dialog_get_type(),RecordDialogClass) #define IS_RECORD_DIALOG(obj) GTK_CHECK_TYPE(obj, record_dialog_get_type()) typedef struct { GtkWindow window; RecordFormatCombo *format_combo; gboolean format_changed; GtkBin *vu_frame; GtkLabel *status_label,*time_label,*overruns_label,*overruns_title; GtkLabel *bytes_label,*bytes_text_label,*limit_label,*limit_text_label; GtkWidget *record_button,*reset_button,*close_button; Dataformat *current_format; ListObject *driver_presets; gboolean limit_record; GtkEntry *limit_entry; GtkLabel *limit_set_label; GtkButton *disable_limit_button; gfloat limit_seconds; float maxpeak_values[8]; GtkLabel **peak_labels,**maxpeak_labels,**clip_labels,**rms_labels; VuMeter **meters; TempFile *tf; gboolean paused; off_t written_bytes; off_t limit_bytes; Ringbuf *databuf; guint32 analysis_bytes; guint32 analysis_samples; gchar *analysis_buf; sample_t *analysis_sbuf; guint overruns_before_start, overruns; off_t overrun_locs[10]; } RecordDialog; typedef struct { GtkWindowClass wc; } RecordDialogClass; GtkType record_dialog_get_type(void); Chunk *record_dialog_execute(int *noverruns, off_t overrun_locs[10]); #endif mhwaveedit-1.4.24/src/recordformatcombo.c000066400000000000000000000235601334022513400204040ustar00rootroot00000000000000/* * Copyright (C) 2009, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include #include "recordformatcombo.h" #include "gettext.h" static GtkObjectClass *parent_class; enum { FORMAT_CHANGED_SIGNAL, FORMAT_DIALOG_REQUEST_SIGNAL, LAST_SIGNAL }; static guint record_format_combo_signals[LAST_SIGNAL] = { 0 }; static char *choose_format_string = N_("Choose a sample format"); static gboolean nosignal_flag = FALSE; static void record_format_combo_destroy(GtkObject *obj) { RecordFormatCombo *rfc = RECORD_FORMAT_COMBO(obj); if (rfc->named_presets) { gtk_object_unref(GTK_OBJECT(rfc->named_presets)); rfc->named_presets = NULL; } if (rfc->nameless_presets) { gtk_object_unref(GTK_OBJECT(rfc->nameless_presets)); rfc->nameless_presets = NULL; } parent_class->destroy(obj); } static gchar *rf_string(Dataformat *fmt, gchar *name) { gchar *c,*d; if (fmt->type == DATAFORMAT_PCM) c = g_strdup_printf(_("%d-bit"),fmt->samplesize*8); else if (fmt->samplesize == sizeof(float)) c = g_strdup(_("float")); else c = g_strdup(_("double")); if (name) d = g_strdup_printf(_("%s (%s %s %d Hz)"),name, channel_format_name(fmt->channels), c,fmt->samplerate); else d = g_strdup_printf(_("%s %s %d Hz"), channel_format_name(fmt->channels), c,fmt->samplerate); g_free(c); return d; } static void rebuild_strings(RecordFormatCombo *rfc) { GList *l = NULL, *l2; RecordFormat *rf; Dataformat *df; int idx = -1, count=0; if (rfc->current_selection_type == 0) { l = g_list_append(l,g_strdup(_(choose_format_string))); idx = count; count++; } rfc->named_preset_start = count; for (l2 = rfc->named_presets->list; l2 != NULL; l2 = l2->next) { rf = (RecordFormat *)(l2->data); l = g_list_append(l,rf_string(&(rf->fmt),rf->name)); if (idx < 0 && rfc->current_selection_type == 1 && !strcmp(rfc->current_selection_name,rf->name) && dataformat_equal(&(rfc->current_selection_format), &(rf->fmt))) idx = count; count++; } rfc->nameless_preset_start = count; for (l2 = rfc->nameless_presets->list; l2 != NULL; l2 = l2->next) { df = (Dataformat *)(l2->data); l = g_list_append(l,rf_string(df,NULL)); if (idx < 0 && rfc->current_selection_type == 2 && dataformat_equal(&(rfc->current_selection_format),df)) idx = count; count ++; } rfc->custom_start = count; if (idx < 0) { rfc->current_selection_type = 3; l = g_list_append(l,rf_string(&(rfc->current_selection_format),NULL)); idx = count; count++; } rfc->other_start = count; if (rfc->show_other) l = g_list_append(l,g_strdup(_("Other format..."))); combo_set_items(COMBO(rfc),l,idx); g_list_foreach(l,(GFunc)g_free,NULL); g_list_free(l); } static void record_format_set_main(RecordFormatCombo *rfc, int type, char *name, Dataformat *fmt, gboolean rebuild) { if (rfc->current_selection_type == type && (type != 1 || !strcmp(name,rfc->current_selection_name)) && (type == 0 || dataformat_equal(&rfc->current_selection_format, fmt))) return; if (rfc->current_selection_name != NULL) g_free(rfc->current_selection_name); rfc->current_selection_type = type; rfc->current_selection_name = name ? g_strdup(name) : NULL; memcpy(&rfc->current_selection_format, fmt, sizeof(*fmt)); if (rebuild) { nosignal_flag = TRUE; rebuild_strings(rfc); nosignal_flag = FALSE; } gtk_signal_emit(GTK_OBJECT(rfc), record_format_combo_signals[FORMAT_CHANGED_SIGNAL]); } static void record_format_combo_selection_changed(Combo *obj) { RecordFormatCombo *rfc = RECORD_FORMAT_COMBO(obj); int i,j; Dataformat *df; RecordFormat *rf; if (nosignal_flag) return; i = combo_selected_index(obj); if (i >= rfc->other_start) { gtk_signal_emit(GTK_OBJECT(obj), record_format_combo_signals [FORMAT_DIALOG_REQUEST_SIGNAL]); rebuild_strings(rfc); } else if (i >= rfc->custom_start) { g_assert(i == rfc->custom_start && rfc->current_selection_type == 3); /* Do nothing - custom already selected */ } else if (i >= rfc->nameless_preset_start) { j = i - rfc->nameless_preset_start; df = list_object_get(rfc->nameless_presets, j); record_format_set_main(rfc,2,NULL,df,TRUE); } else if (i >= rfc->named_preset_start) { j = i - rfc->named_preset_start; rf = list_object_get(rfc->named_presets, j); g_assert(rf != NULL); record_format_set_main(rfc,1,rf->name,&(rf->fmt),TRUE); } else { /* Do nothing - none already selected */ } } static void record_format_combo_class_init(GtkObjectClass *klass) { parent_class = gtk_type_class(combo_get_type()); klass->destroy = record_format_combo_destroy; COMBO_CLASS(klass)->selection_changed = record_format_combo_selection_changed; RECORD_FORMAT_COMBO_CLASS(klass)->format_changed = NULL; record_format_combo_signals[FORMAT_CHANGED_SIGNAL] = gtk_signal_new("format_changed",GTK_RUN_LAST, GTK_CLASS_TYPE(klass), GTK_SIGNAL_OFFSET(RecordFormatComboClass, format_changed), gtk_marshal_NONE__NONE,GTK_TYPE_NONE,0); record_format_combo_signals[FORMAT_DIALOG_REQUEST_SIGNAL] = gtk_signal_new("format_dialog_request",GTK_RUN_LAST, GTK_CLASS_TYPE(klass), GTK_SIGNAL_OFFSET(RecordFormatComboClass, format_dialog_request), gtk_marshal_NONE__NONE,GTK_TYPE_NONE,0); gtk_object_class_add_signals(GTK_OBJECT_CLASS(klass), record_format_combo_signals,LAST_SIGNAL); } static void record_format_combo_init(GtkObject *obj) { } GtkType record_format_combo_get_type(void) { static GtkType id=0; if (!id) { GtkTypeInfo info = { "RecordFormatCombo", sizeof(RecordFormatCombo), sizeof(RecordFormatComboClass), (GtkClassInitFunc) record_format_combo_class_init, (GtkObjectInitFunc) record_format_combo_init }; id = gtk_type_unique( combo_get_type(), &info ); } return id; } static void presets_changed(ListObject *lo, gpointer item, gpointer user_data) { RecordFormatCombo *rfc = RECORD_FORMAT_COMBO(user_data); rebuild_strings(rfc); } GtkWidget *record_format_combo_new(ListObject *named_presets, ListObject *nameless_presets, gboolean show_other) { RecordFormatCombo *rfc = (RecordFormatCombo *)gtk_type_new(record_format_combo_get_type()); rfc->named_presets = named_presets; gtk_object_ref(GTK_OBJECT(named_presets)); gtk_object_sink(GTK_OBJECT(named_presets)); gtk_signal_connect_while_alive(GTK_OBJECT(named_presets),"item_added", GTK_SIGNAL_FUNC(presets_changed),rfc, GTK_OBJECT(rfc)); gtk_signal_connect_while_alive(GTK_OBJECT(named_presets),"item_removed", GTK_SIGNAL_FUNC(presets_changed),rfc, GTK_OBJECT(rfc)); gtk_signal_connect_while_alive(GTK_OBJECT(named_presets),"item_notify", GTK_SIGNAL_FUNC(presets_changed),rfc, GTK_OBJECT(rfc)); rfc->nameless_presets = nameless_presets; gtk_object_ref(GTK_OBJECT(nameless_presets)); gtk_object_sink(GTK_OBJECT(nameless_presets)); gtk_signal_connect_while_alive(GTK_OBJECT(nameless_presets),"item_added", GTK_SIGNAL_FUNC(presets_changed),rfc, GTK_OBJECT(rfc)); gtk_signal_connect_while_alive(GTK_OBJECT(nameless_presets),"item_removed", GTK_SIGNAL_FUNC(presets_changed),rfc, GTK_OBJECT(rfc)); gtk_signal_connect_while_alive(GTK_OBJECT(nameless_presets),"item_notify", GTK_SIGNAL_FUNC(presets_changed),rfc, GTK_OBJECT(rfc)); rfc->show_other = show_other; rfc->current_selection_type = 0; rebuild_strings(rfc); return GTK_WIDGET(rfc); } gboolean record_format_combo_set_named_preset(RecordFormatCombo *rfc, gchar *preset_name) { GList *l; RecordFormat *rf; for (l=rfc->named_presets->list; l!=NULL; l=l->next) { rf = (RecordFormat *)(l->data); if (!strcmp(rf->name, preset_name)) break; } if (l == NULL) return FALSE; record_format_set_main(rfc,1,rf->name,&rf->fmt,TRUE); return TRUE; } void record_format_combo_set_format(RecordFormatCombo *rfc, Dataformat *fmt) { record_format_set_main(rfc,2,NULL,fmt,TRUE); } void record_format_combo_store(RecordFormatCombo *rfc) { if (rfc->stored_selection_name != NULL) g_free(rfc->stored_selection_name); rfc->stored_selection_type = rfc->current_selection_type; rfc->stored_selection_name = g_strdup(rfc->current_selection_name); memcpy(&rfc->stored_selection_format,&rfc->current_selection_format, sizeof(Dataformat)); } void record_format_combo_recall(RecordFormatCombo *rfc) { record_format_set_main(rfc,rfc->stored_selection_type, rfc->stored_selection_name, &rfc->stored_selection_format,TRUE); } Dataformat *record_format_combo_get_format(RecordFormatCombo *rfc) { return &rfc->current_selection_format; } gchar *record_format_combo_get_preset_name(RecordFormatCombo *rfc) { if (rfc->current_selection_type == 1) return rfc->current_selection_name; else return NULL; } mhwaveedit-1.4.24/src/recordformatcombo.h000066400000000000000000000052241334022513400204060ustar00rootroot00000000000000/* * Copyright (C) 2009, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #ifndef RECORDFORMATCOMBO_H_INCLUDED #define RECORDFORMATCOMBO_H_INCLUDED #include #include "combo.h" #include "dataformat.h" #include "listobject.h" #define RECORD_FORMAT_COMBO(obj) GTK_CHECK_CAST(obj,record_format_combo_get_type(),RecordFormatCombo) #define RECORD_FORMAT_COMBO_CLASS(klass) GTK_CHECK_CLASS_CAST(klass,record_format_combo_get_type(),RecordFormatComboClass) #define IS_RECORD_FORMAT_COMBO(obj) GTK_CHECK_TYPE(obj,record_format_combo_get_type()) typedef struct { gint num; gchar *name; Dataformat fmt; } RecordFormat; typedef struct { Combo c; /* Private */ int current_selection_type; /* 0 none, 1 user preset, 2 driver preset, * 3 custom */ gchar *current_selection_name; Dataformat current_selection_format; int stored_selection_type; gchar *stored_selection_name; Dataformat stored_selection_format; int named_preset_start,nameless_preset_start,custom_start,other_start; ListObject *named_presets,*nameless_presets; gboolean show_other; } RecordFormatCombo; typedef struct { ComboClass klass; void (*format_changed)(RecordFormatCombo *rfc, Dataformat *new_fmt); void (*format_dialog_request)(RecordFormatCombo *rfc); } RecordFormatComboClass; GtkType record_format_combo_get_type(void); GtkWidget *record_format_combo_new(ListObject *named_presets, ListObject *driver_presets, gboolean show_dialog_item); gboolean record_format_combo_set_named_preset(RecordFormatCombo *rfc, gchar *preset_name); void record_format_combo_set_format(RecordFormatCombo *rfc, Dataformat *fmt); void record_format_combo_store(RecordFormatCombo *rfc); void record_format_combo_recall(RecordFormatCombo *rfc); Dataformat *record_format_combo_get_format(RecordFormatCombo *rfc); gchar *record_format_combo_get_preset_name(RecordFormatCombo *rfc); #endif mhwaveedit-1.4.24/src/ringbuf.c000066400000000000000000000126521334022513400163310ustar00rootroot00000000000000/* * Copyright (C) 2002 2003 2005, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include #include "ringbuf.h" #include Ringbuf *ringbuf_new(guint32 size) { Ringbuf *r; r = g_malloc(sizeof(Ringbuf)+size); r->size = size; r->start = r->end = 0; return r; } void ringbuf_free(Ringbuf *bufptr) { g_free(bufptr); } guint32 ringbuf_available(Ringbuf *buf) { guint32 start,end; start = buf->start; end = buf->end; if (end >= start) return end-start; else return buf->size+1 + end - start; } guint32 ringbuf_freespace(Ringbuf *buf) { guint32 start,end; start = buf->start; end = buf->end; if (start > end) return start - end - 1; else return buf->size + start - end; } void ringbuf_drain(Ringbuf *buf) { buf->end = buf->start; } gboolean ringbuf_isempty(Ringbuf *buf) { return (buf->end == buf->start); } gboolean ringbuf_isfull(Ringbuf *buf) { guint32 start,end; start = buf->start; end = buf->end; if (start == 0) return (end == buf->size); else return (end == start-1); } guint32 ringbuf_enqueue(Ringbuf *buf, gpointer data, guint32 datasize) { guint32 blksize; guint32 start,end; guint32 bytes_done = 0; start = buf->start; end = buf->end; if (end >= start) { if (start == 0) blksize = MIN(datasize, buf->size - end); else blksize = MIN(datasize, 1+buf->size - end); if (blksize == 0) return 0; memcpy( buf->data + end, data, blksize ); end += blksize; if (end == 1+buf->size) { end = 0; bytes_done = blksize; /* Fall through */ } else { buf->end = end; return blksize; } } blksize = MIN ( datasize-bytes_done, start - end - 1); if (blksize == 0) { buf->end = end; return bytes_done; } memcpy( buf->data + end, G_STRUCT_MEMBER_P( data, bytes_done ), blksize); end += blksize; bytes_done += blksize; buf->end = end; return bytes_done; } guint32 ringbuf_enqueue_zeroes(Ringbuf *buf, guint32 count) { guint32 blksize; guint32 start,end; guint32 bytes_done = 0; start = buf->start; end = buf->end; if (end >= start) { if (start == 0) blksize = MIN(count, buf->size - end); else blksize = MIN(count, 1+buf->size - end); if (blksize == 0) return 0; memset( buf->data + end, 0, blksize ); end += blksize; if (end == 1+buf->size) { end = 0; bytes_done = blksize; /* Fall through */ } else { buf->end = end; return blksize; } } blksize = MIN ( count-bytes_done, start - end - 1); if (blksize == 0) { buf->end = end; return bytes_done; } memset( buf->data + end, 0, blksize); end += blksize; bytes_done += blksize; buf->end = end; return bytes_done; } guint32 ringbuf_dequeue(Ringbuf *buf, gpointer data, guint32 datasize) { guint32 blksize,start,end; guint32 bytes_done = 0; start = buf->start; end = buf->end; if (start > end) { blksize = MIN ( datasize, buf->size+1 - start ); memcpy(data, buf->data+start, blksize); start += blksize; if (start == buf->size+1) { start = 0; bytes_done = blksize; /* Fall through */ } else { buf->start = start; return blksize; } } blksize = MIN ( datasize - bytes_done, end - start ); if (blksize == 0) { buf->start=start; return bytes_done; } memcpy ( G_STRUCT_MEMBER_P(data,bytes_done), buf->data + start, blksize ); start += blksize; bytes_done += blksize; buf->start = start; return bytes_done; } guint32 ringbuf_transfer ( Ringbuf *source, Ringbuf *dest ) { guint32 blksize; guint32 dest_start,dest_end; guint32 bytes_done = 0; dest_start = dest->start; dest_end = dest->end; if (dest_end >= dest_start) { if (dest_start == 0) blksize = dest->size - dest_end; else blksize = 1+dest->size - dest_end; if (blksize == 0) return 0; blksize = ringbuf_dequeue(source, dest->data + dest_end, blksize); dest_end += blksize; if (dest_end == 1+dest->size) { dest_end = 0; bytes_done = blksize; /* Fall through */ } else { dest->end = dest_end; return blksize; } } blksize = dest_start - dest_end - 1; if (blksize == 0) { dest->end = dest_end; return bytes_done; } blksize = ringbuf_dequeue(source, dest->data + dest_end, blksize); dest_end += blksize; bytes_done += blksize; dest->end = dest_end; return bytes_done; } mhwaveedit-1.4.24/src/ringbuf.h000066400000000000000000000050021334022513400163250ustar00rootroot00000000000000/* * Copyright (C) 2002 2003 2005, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ /* Ring-buffer functions */ #ifndef RINGBUF_H_INCLUDED #define RINGBUF_H_INCLUDED #include typedef struct { volatile guint32 start; /* First position in the buffer. */ volatile guint32 end; /* First unused position. Equal to start if * buffer is empty. */ guint32 size; /* Number of bytes that the buffer can hold. */ gchar data[1]; /* The data buffer. */ } Ringbuf; /* Creates a new ringbuffer with desired size */ Ringbuf *ringbuf_new(guint32 size); /* Destroys a ringbuffer */ void ringbuf_free(Ringbuf *bufptr); /* Empties a ringbuffer */ void ringbuf_drain(Ringbuf *buf); /* Returns the amount of data currently in the queue. */ guint32 ringbuf_available(Ringbuf *buf); /* Returns the amount of data that can be enqueued onto the queue (buf->size - ringbuf_available(buf)). */ guint32 ringbuf_freespace(Ringbuf *buf); /* Tells whether the ringbuffer is empty or not. */ gboolean ringbuf_isempty(Ringbuf *buf); /* Tells whether the ringbuffer is full or not. */ gboolean ringbuf_isfull(Ringbuf *buf); /* Adds data to the end of the buffer. Returns the number of bytes added. */ guint32 ringbuf_enqueue(Ringbuf *buf, gpointer data, guint32 datasize); /* Adds null bytes to the end of the buffer. Returns the number of bytes added*/ guint32 ringbuf_enqueue_zeroes(Ringbuf *buf, guint32 count); /* Copies and removes data from the end of the buffer. Returns the number of bytes removed. */ guint32 ringbuf_dequeue(Ringbuf *buf, gpointer data, guint32 datasize); /* Transfers data from one ringbuffer to another. Returns when source is empty or dest is full. Returns number of bytes transferred. */ guint32 ringbuf_transfer(Ringbuf *source, Ringbuf *dest); #endif mhwaveedit-1.4.24/src/sampleratedialog.c000066400000000000000000000102051334022513400202020ustar00rootroot00000000000000/* * Copyright (C) 2002 2003 2004, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include #include #include #include "mainwindow.h" #include "sampleratedialog.h" #include "chunk.h" #include "float_box.h" #include "soxdialog.h" #include "pipedialog.h" #include "um.h" #include "inifile.h" #include "effectbrowser.h" #include "rateconv.h" #include "gettext.h" static void set_method(Combo *cbo, gpointer user_data) { SamplerateDialog *s = SAMPLERATE_DIALOG(user_data); s->method = combo_selected_index(cbo); } static Chunk *apply_proc(Chunk *chunk, StatusBar *bar, gpointer user_data) { SamplerateDialog *s = SAMPLERATE_DIALOG(user_data); return chunk_convert_samplerate(chunk,s->rate->val, rateconv_driver_id(FALSE,s->method), dither_editing, bar); } static gboolean apply(EffectDialog *ed) { gboolean b; Document *d = EFFECT_BROWSER(ed->eb)->dl->selected; SamplerateDialog *s = SAMPLERATE_DIALOG(ed); if (intbox_check(s->rate) || s->rate->val==0) return TRUE; inifile_set_guint32("srate_method",s->method); b = document_apply_cb(d,apply_proc,FALSE,ed); mainwindow_update_texts(); return b; } static void samplerate_dialog_setup(EffectDialog *ed) { intbox_set(SAMPLERATE_DIALOG(ed)->rate, EFFECT_BROWSER(ed->eb)->dl->format.samplerate); } static void samplerate_dialog_class_init(EffectDialogClass *klass) { klass->apply = apply; klass->setup = samplerate_dialog_setup; } static void samplerate_dialog_init(SamplerateDialog *v) { EffectDialog *ed = EFFECT_DIALOG(v); GtkWidget *a,*b,*c; GtkRequisition req; GList *l = NULL; int i,j; a = gtk_vbox_new ( FALSE, 3 ); gtk_box_pack_start (GTK_BOX(ed->input_area),a,FALSE,FALSE,0); b = gtk_label_new ( _("(This changes the sample rate of \n" "the entire file, not just the selection)") ); gtk_box_pack_start ( GTK_BOX(a),b,FALSE,FALSE,0 ); b = gtk_hbox_new ( FALSE, 3 ); gtk_box_pack_start (GTK_BOX(a),b,FALSE,FALSE,0); c = gtk_label_new ( _("New samplerate: ") ); gtk_box_pack_start (GTK_BOX(b),c,FALSE,FALSE,0); c = intbox_new(0); v->rate = INTBOX(c); gtk_box_pack_start(GTK_BOX(b),c,FALSE,FALSE,0); b = gtk_hbox_new( FALSE, 3 ); gtk_box_pack_start(GTK_BOX(a),b,FALSE,FALSE,0); c = gtk_label_new(_("Method: ")); gtk_box_pack_start(GTK_BOX(b),c,FALSE,FALSE,0); c = combo_new(); gtk_box_pack_start(GTK_BOX(b),c,FALSE,FALSE,0); gtk_widget_size_request(c,&req); #ifdef COMBO_OLDSCHOOL gtk_widget_set_usize(c,req.width*3/2,req.height); #endif i = rateconv_driver_count(FALSE); for (j=0; jmethod = inifile_get_guint32("srate_method",0); if (v->method >= g_list_length(l)) v->method = 0; combo_set_items(COMBO(c),l,v->method); g_list_free(l); gtk_signal_connect(GTK_OBJECT(c),"selection_changed", GTK_SIGNAL_FUNC(set_method),v); gtk_widget_show_all(a); } GtkType samplerate_dialog_get_type(void) { static GtkType id = 0; if (!id) { GtkTypeInfo info = { "SamplerateDialog", sizeof(SamplerateDialog), sizeof(SamplerateDialogClass), (GtkClassInitFunc) samplerate_dialog_class_init, (GtkObjectInitFunc) samplerate_dialog_init }; id = gtk_type_unique(effect_dialog_get_type(),&info); } return id; } mhwaveedit-1.4.24/src/sampleratedialog.h000066400000000000000000000030201334022513400202040ustar00rootroot00000000000000/* * Copyright (C) 2002 2003 2004, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #ifndef SAMPLERATE_DIALOG_H_INCLUDED #define SAMPLERATE_DIALOG_H_INCLUDED #include #include "mainwindow.h" #include "effectdialog.h" #include "int_box.h" #define SAMPLERATE_DIALOG(obj) GTK_CHECK_CAST(obj,samplerate_dialog_get_type(),SamplerateDialog) #define SAMPLERATE_DIALOG_CLASS(klass) GTK_CHECK_CLASS_CAST(klass,samplerate_dialog_get_type(),SamplerateDialogClass) #define IS_SAMPLERATE_DIALOG(obj) GTK_CHECK_TYPE(obj,samplerate_dialog_get_type()) typedef struct _SamplerateDialog { EffectDialog ed; Intbox *rate; guint method; } SamplerateDialog; typedef struct _SamplerateDialogClass { EffectDialogClass ed_class; } SamplerateDialogClass; GtkType samplerate_dialog_get_type(void); #endif mhwaveedit-1.4.24/src/samplesizedialog.c000066400000000000000000000072401334022513400202260ustar00rootroot00000000000000/* * Copyright (C) 2002 2003 2004 2005 2010, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include #include "samplesizedialog.h" #include "main.h" #include "effectbrowser.h" #include "gettext.h" #include "um.h" static Chunk *samplesize_apply_proc(Chunk *chunk, StatusBar *bar, gpointer user_data) { Dataformat df; SamplesizeDialog *ssd = SAMPLESIZE_DIALOG(user_data); memcpy(&(df),&(chunk->format),sizeof(Dataformat)); format_selector_get(ssd->fs,&df); if (dataformat_samples_equal(&df,&(chunk->format))) { user_info(_("File already has the selected sample format")); return NULL; } if (ssd->gurumode) return chunk_clone_df(chunk,&df); else return chunk_convert_sampletype(chunk,&df); } static gboolean samplesize_apply(EffectDialog *ed) { gboolean b; b = document_apply_cb(EFFECT_BROWSER(ed->eb)->dl->selected, samplesize_apply_proc,FALSE,ed); mainwindow_update_texts(); return b; } static void samplesize_setup(EffectDialog *ed) { Dataformat *f = &(EFFECT_BROWSER(ed->eb)->dl->format); format_selector_set(SAMPLESIZE_DIALOG(ed)->fs, f); } static void samplesize_dialog_class_init(EffectDialogClass *klass) { klass->apply = samplesize_apply; klass->setup = samplesize_setup; } static void gurumode_toggle(GtkToggleButton *togglebutton, gpointer user_data) { SamplesizeDialog *ssd = SAMPLESIZE_DIALOG(user_data); ssd->gurumode = gtk_toggle_button_get_active(togglebutton); } static void samplesize_dialog_init(SamplesizeDialog *ssd) { GtkWidget *b,*c; GtkBox *ia = GTK_BOX(EFFECT_DIALOG(ssd)->input_area); ssd->gurumode = FALSE; ssd->fs = FORMAT_SELECTOR(format_selector_new(FALSE)); b = gtk_vbox_new(FALSE,3); gtk_box_pack_start(ia,b,FALSE,FALSE,0); gtk_widget_show(b); c = gtk_label_new ( _("(This changes the sample type of " "the entire file, not just the selection)") ); gtk_label_set_justify(GTK_LABEL(c),GTK_JUSTIFY_LEFT); gtk_misc_set_alignment(GTK_MISC(c),0,0.5); gtk_label_set_line_wrap(GTK_LABEL(c),TRUE); gtk_box_pack_start(GTK_BOX(b),c,FALSE,FALSE,0); gtk_widget_show(c); c = GTK_WIDGET(ssd->fs); gtk_box_pack_start(GTK_BOX(b),c,FALSE,FALSE,0); gtk_widget_show(c); c=gtk_check_button_new_with_label(_("Don't actually change the data " "(for repairing bad files etc)")); gtk_signal_connect(GTK_OBJECT(c),"toggled",GTK_SIGNAL_FUNC(gurumode_toggle), ssd); gtk_box_pack_start(GTK_BOX(b),c,FALSE,FALSE,0); gtk_widget_show(c); } GtkType samplesize_dialog_get_type(void) { static GtkType id = 0; if (!id) { GtkTypeInfo info = { "SamplesizeDialog", sizeof(SamplesizeDialog), sizeof(SamplesizeDialogClass), (GtkClassInitFunc) samplesize_dialog_class_init, (GtkObjectInitFunc) samplesize_dialog_init }; id = gtk_type_unique(effect_dialog_get_type(),&info); } return id; } mhwaveedit-1.4.24/src/samplesizedialog.h000066400000000000000000000030141334022513400202260ustar00rootroot00000000000000/* * Copyright (C) 2002 2003 2004, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #ifndef SAMPLESIZE_DIALOG_H_INCLUDED #define SAMPLESIZE_DIALOG_H_INCLUDED #include #include "effectdialog.h" #include "formatselector.h" #define SAMPLESIZE_DIALOG(obj) GTK_CHECK_CAST(obj,samplesize_dialog_get_type(),SamplesizeDialog) #define SAMPLESIZE_DIALOG_CLASS(klass) GTK_CHECK_CLASS_CAST(obj,samplesize_dialog_get_type(),SamplesizeDialogClass) #define IS_SAMPLESIZE_DIALOG(obj) GTK_CHECK_TYPE(obj,samplesize_dialog_get_type()) typedef struct _SamplesizeDialog { EffectDialog ed; gboolean gurumode; FormatSelector *fs; } SamplesizeDialog; typedef struct _SamplesizeDialogClass { EffectDialogClass ed_class; } SamplesizeDialogClass; GtkType samplesize_dialog_get_type(void); #endif mhwaveedit-1.4.24/src/sandwichdialog.c000066400000000000000000000125651334022513400176600ustar00rootroot00000000000000/* * Copyright (C) 2009, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include #include "sandwichdialog.h" #include "gettext.h" #include "effectbrowser.h" #include "um.h" static gboolean sandwich_dialog_apply(EffectDialog *ed) { SandwichDialog *sd = SANDWICH_DIALOG(ed); Document *d1, *d2; Chunk *c1, *c2, *t, *r; off_t c1ap, c2ap, apo; Dataformat fmt; const gchar *c; d1 = EFFECT_BROWSER(ed->eb)->dl->selected; d2 = sd->docsel->selected; c1 = d1->chunk; c2 = d2->chunk; if (gtk_toggle_button_get_active(sd->align_begin)) { c1ap = c2ap = 0; } else if (gtk_toggle_button_get_active(sd->align_end)) { c1ap = c1->length-1; c2ap = c2->length-1; } else if (gtk_toggle_button_get_active(sd->align_marker)) { c = gtk_entry_get_text(sd->marker_entry); c1ap = document_get_mark(d1,c); c2ap = document_get_mark(d2,c); if (c1ap == DOCUMENT_BAD_MARK || c2ap == DOCUMENT_BAD_MARK) { user_error("Mark does not exist in both documents."); return TRUE; } } else { c1ap = c2ap = 0; /* Silence compiler */ g_assert_not_reached(); } t = NULL; if (!dataformat_samples_equal(&(c1->format),&(c2->format)) || c1->format.samplerate != c2->format.samplerate) { memcpy(&fmt,&(c1->format),sizeof(Dataformat)); fmt.channels = c2->format.channels; t = chunk_convert(c2, &fmt, dither_editing, d1->bar); if (t == NULL) return TRUE; if (t->format.samplerate != c2->format.samplerate) { if (c2ap >= c2->length-1) c2ap = t->length-1; else c2ap = (c2ap*t->format.samplerate)/(c2->format.samplerate); } c2 = t; } g_assert(dataformat_samples_equal(&(c1->format),&(c2->format)) && c1->format.samplerate == c2->format.samplerate); r = chunk_sandwich(c1,c2,c1ap,c2ap,&apo,dither_editing,d1->bar); if (t != NULL) gtk_object_sink(GTK_OBJECT(t)); if (r == NULL) return TRUE; document_update(d1, r, 0, apo-c1ap); return FALSE; } static void sandwich_dialog_class_init(SandwichDialogClass *klass) { EFFECT_DIALOG_CLASS(klass)->apply = sandwich_dialog_apply; } static void marker_entry_changed(GtkEditable *editable, gpointer user_data) { SandwichDialog *obj = SANDWICH_DIALOG(user_data); gtk_toggle_button_set_active(obj->align_marker,TRUE); } static void sandwich_dialog_init(SandwichDialog *obj) { GtkWidget *a,*b,*c,*d; a = document_list_new(NULL); obj->docsel = DOCUMENT_LIST(a); a = gtk_radio_button_new_with_label(NULL,_("Align beginning of files")); obj->align_begin = GTK_TOGGLE_BUTTON(a); a = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(a), _("Align end of files")); obj->align_end = GTK_TOGGLE_BUTTON(a); a = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(a), _("Align at marker: ")); obj->align_marker = GTK_TOGGLE_BUTTON(a); gtk_toggle_button_set_active(obj->align_begin,TRUE); a = gtk_entry_new(); obj->marker_entry = GTK_ENTRY(a); gtk_entry_set_width_chars(obj->marker_entry, 7); gtk_entry_set_text(obj->marker_entry, "0"); gtk_signal_connect(GTK_OBJECT(obj->marker_entry),"changed", GTK_SIGNAL_FUNC(marker_entry_changed),obj); a = gtk_vbox_new(FALSE,3); b = gtk_hbox_new(FALSE,0); gtk_container_add(GTK_CONTAINER(a),b); c = gtk_label_new(_("Add channels from: ")); gtk_box_pack_start(GTK_BOX(b),c,FALSE,FALSE,0); c = GTK_WIDGET(obj->docsel); gtk_box_pack_start(GTK_BOX(b),c,TRUE,TRUE,0); b = gtk_frame_new(_("Alignment")); gtk_container_add(GTK_CONTAINER(a),b); c = gtk_vbox_new(TRUE,0); gtk_container_add(GTK_CONTAINER(b),c); gtk_container_set_border_width(GTK_CONTAINER(c),3); gtk_box_pack_start(GTK_BOX(c),GTK_WIDGET(obj->align_begin),FALSE,FALSE,0); gtk_box_pack_start(GTK_BOX(c),GTK_WIDGET(obj->align_end),FALSE,FALSE,0); d = gtk_hbox_new(FALSE,0); gtk_box_pack_start(GTK_BOX(c),d,FALSE,FALSE,0); gtk_box_pack_start(GTK_BOX(d),GTK_WIDGET(obj->align_marker),FALSE,FALSE,0); gtk_box_pack_start(GTK_BOX(d),GTK_WIDGET(obj->marker_entry),FALSE,FALSE,0); gtk_box_pack_start(GTK_BOX(EFFECT_DIALOG(obj)->input_area), a,FALSE,FALSE,0); gtk_widget_show_all(a); } GtkType sandwich_dialog_get_type(void) { static GtkType id = 0; if (!id) { GtkTypeInfo info = { "SandwichDialog", sizeof(SandwichDialog), sizeof(SandwichDialogClass), (GtkClassInitFunc) sandwich_dialog_class_init, (GtkObjectInitFunc) sandwich_dialog_init }; id = gtk_type_unique(effect_dialog_get_type(),&info); } return id; } mhwaveedit-1.4.24/src/sandwichdialog.h000066400000000000000000000027671334022513400176700ustar00rootroot00000000000000/* * Copyright (C) 2009, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #ifndef SANDWICHDIALOG_H_INCLUDED #define SANDWICHDIALOG_H_INCLUDED #include #include "effectdialog.h" #include "documentlist.h" #define SANDWICH_DIALOG(obj) GTK_CHECK_CAST(obj,sandwich_dialog_get_type(),SandwichDialog) #define SANDWICH_DIALOG_CLASS(klass) GTK_CHECK_CLASS_CAST(klass,sandwich_dialog_get_type(),SandwichDialogClass) #define IS_SANDWICH_DIALOG(obj) GTK_CHECK_TYPE(obj,sandwich_dialog_get_type()) typedef struct { EffectDialog ed; DocumentList *docsel; GtkToggleButton *align_begin,*align_end,*align_marker; GtkEntry *marker_entry; } SandwichDialog; typedef struct { EffectDialogClass edc; } SandwichDialogClass; GtkType sandwich_dialog_get_type(void); #endif mhwaveedit-1.4.24/src/session.c000066400000000000000000000344271334022513400163640ustar00rootroot00000000000000/* * Copyright (C) 2006 2009, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include #include #include #include #include #include #include #include "session.h" #include "inifile.h" #include "um.h" #include "tempfile.h" #include "gettext.h" #include "document.h" #include "mainloop.h" /* Session states */ #define SESSION_RUNNING 0 /* Currently running in another process */ #define SESSION_SUSPENDED 1 /* Suspended by user */ #define SESSION_CRASHED 2 /* Crash - session file there but process no * longer existing */ #define SESSION_LEFTOVER 3 /* Temporary files found, but no session file */ #define SESSION_OLD 4 /* Temporary files from version <1.4.8 found */ #define SESSION_UNKNOWN 5 /* Session either still running or crashed */ struct session { int id; int pid; int state; off_t size; time_t date; gchar *logfile; GList *datafiles; }; static int current_id = 0; static gchar *current_filename; static gchar *session_dir; static EFILE *current_file; static GList *session_list = NULL; /* static EFILE *current_session = NULL; */ static gint session_compare_func(gconstpointer a, gconstpointer b) { struct session *as = (struct session *)a, *bs = (struct session *)b; return (as->date > bs->date)?1:0; } void session_init(int *argc, char **argv) { int highest_id = 0; gchar *c,*p,*q; DIR *d; struct dirent *de; int i,j,k,l,m,n; char r; struct session *s; struct stat st; GList *list,*list2; gboolean b; /* Check for session files on the system */ session_dir = g_strjoin(NULL,get_home_directory(),"/.mhwaveedit",NULL); d = opendir(session_dir); if (d == NULL) { user_perror(_("Error opening session directory")); return; } while (1) { de = readdir(d); if (de == NULL) break; i = sscanf(de->d_name,"mhwaveedit-session-%d-%d-%c",&j,&k,&r); if (i < 3) continue; /* Stat the session file once to check mod. date and size */ p = g_strdup_printf("%s/%s",session_dir,de->d_name); i = stat(p,&st); if (i < 0) { console_perror(p); g_free(p); continue; } else if (!S_ISREG(st.st_mode)) { q = g_strdup_printf(_("%s: Wrong file type"),p); console_message(q); g_free(q); g_free(p); continue; } s = g_malloc(sizeof(*s)); s->id = k; if (k > highest_id) highest_id = k; s->pid = j; s->datafiles = NULL; s->size = st.st_size; s->date = st.st_mtime; s->logfile = p; /* Choose state */ if (r == 's') { s->state = SESSION_SUSPENDED; } else { /* Is there a process with the PID running? */ i = kill(s->pid, 0); if (i != 0 && errno == ESRCH) { /* Must be a crash */ s->state = SESSION_CRASHED; } else { /* Could be running */ /* Could check date here to see if reasonable */ s->state = SESSION_UNKNOWN; } } session_list = g_list_append(session_list, s); } closedir(d); /* Search for leftover tempfiles */ for (i=0; ; i++) { c = get_temp_directory(i); if (c == NULL) break; d = opendir(c); if (d == NULL) { console_perror(c); continue; } while (1) { de = readdir(d); if (de == NULL) break; j = sscanf(de->d_name,"mhwaveedit-temp-%d-%d-%d",&k,&l,&m); if (j < 2) continue; /* Try to stat the file */ p = g_strdup_printf("%s/%s",c,de->d_name); n = stat(p,&st); if (n < 0) { console_perror(p); g_free(p); continue; } else if (!S_ISREG(st.st_mode)) { q = g_strdup_printf(_("%s: Wrong file type"),p); console_message(q); g_free(p); g_free(q); continue; } /* Try to add to known session */ for (list=session_list; list!=NULL; list=list->next) { s = (struct session *)list->data; if ((j>2 && m==s->id) || (j<3 && s->pid == k && s->state==SESSION_OLD)) break; } /* Create new session */ if (list == NULL) { s = g_malloc0(sizeof(*s)); s->pid = k; if (j>2) { s->state = SESSION_LEFTOVER; s->id = m; } else { s->state = SESSION_OLD; s->id = ++highest_id; } session_list = g_list_append(session_list, s); } /* Add file to data file list */ s->datafiles = g_list_append(s->datafiles, p); /* Update session info */ s->size += st.st_size; if (s->date < st.st_mtime) s->date = st.st_mtime; } closedir(d); } current_id = highest_id+1; /* Remove empty sessions unless the session was suspended by user */ for (list=session_list; list!=NULL; list=list2) { s = (struct session *) list->data; list2 = list->next; if (s->state != SESSION_SUSPENDED && s->datafiles == NULL) { if (s->logfile != NULL) { xunlink(s->logfile); g_free(s->logfile); } session_list = g_list_remove(session_list, s); g_free(s); if (session_list == NULL) break; } } /* Sort list by date */ session_list = g_list_sort(session_list, session_compare_func); /* Debug */ /* puts("Sessions:"); for (list=session_list; list!=NULL; list=list->next) { s = (struct session *)list->data; printf("#%d: state=%d, size=%d\n",s->id,s->state,(int)s->size); for (list2=s->datafiles; list2!=NULL; list2=list2->next) { printf(" %s\n",(char *)list2->data); } } */ current_filename = g_strdup_printf("%s/mhwaveedit-session-%d-%d-r", session_dir,(int)getpid(),current_id); b = report_write_errors; report_write_errors = FALSE; current_file = e_fopen(current_filename,EFILE_WRITE); if (current_file == NULL) console_perror(_("Could not create session file")); report_write_errors = b; } gint session_get_id(void) { return current_id; } static void session_resume(struct session *s) { GList *l; gchar *fn; Mainwindow *w; g_assert(s->state == SESSION_CRASHED || s->state == SESSION_LEFTOVER || s->state == SESSION_OLD); for (l=s->datafiles; l!=NULL; l=l->next) { fn = (gchar *) l->data; w = MAINWINDOW(mainwindow_new_with_file(fn,FALSE)); gtk_widget_show(GTK_WIDGET(w)); if (w->doc == NULL) continue; /* This will rename the file to a regular tempfile name for this * session and change the reference from a regular to a tempfile. * If the file was converted into a new tempfile by the loader so * that the original file is no longer being used, it will just be * removed */ datasource_backup_unlink(fn); /* Sets the title name to "untitled X" and makes the document appear * "changed" so the "save?" dialog pops up when closing etc. */ document_forget_filename(w->doc); } /* Remove the session. */ g_list_foreach(s->datafiles, (GFunc)g_free, NULL); g_list_free(s->datafiles); g_free(s->logfile); session_list = g_list_remove(session_list, s); /* Popup notification */ if (!inifile_get_gboolean("crashMsgShown",FALSE)) { user_message(_("The files that belonged to the crashed session have been " "recovered. Any files that are not saved will be " "removed permanently.\n\n(This notice is only shown once)"), UM_OK); inifile_set_gboolean("crashMsgShown",TRUE); } } static gboolean session_delete(struct session *s) { GList *l; gchar *fn; gboolean b; for (l=s->datafiles; l!=NULL; l=l->next) { fn = (gchar *)l->data; b = xunlink(fn); if (b) return TRUE; } /* Remove the session. */ g_list_foreach(s->datafiles, (GFunc)g_free, NULL); g_list_free(s->datafiles); g_free(s->logfile); session_list = g_list_remove(session_list, s); return FALSE; } void session_quit(void) { if (current_file != NULL) e_fclose_remove(current_file); } struct session_dialog_data { GtkList *listwid; struct session **listmap; GtkWidget *resume_button,*delete_button; gboolean destroy_flag, resume_click_flag; gint resume_index; }; static void session_dialog_destroy(GtkObject *obj, gpointer user_data) { struct session_dialog_data *ddata = (struct session_dialog_data *)user_data; ddata->destroy_flag = TRUE; } static void session_dialog_select_child(GtkList *list, GtkWidget *widget, gpointer user_data) { struct session_dialog_data *ddata = (struct session_dialog_data *)user_data; ddata->resume_index = gtk_list_child_position(list,widget); gtk_widget_set_sensitive(ddata->resume_button,TRUE); gtk_widget_set_sensitive(ddata->delete_button,TRUE); } static void session_dialog_exit(GtkWidget *widget, gpointer user_data) { quitflag = TRUE; } static void session_dialog_resume_click(GtkWidget *widget, gpointer user_data) { struct session_dialog_data *ddata = (struct session_dialog_data *)user_data; ddata->resume_click_flag = TRUE; } static void session_dialog_delete_click(GtkWidget *widget, gpointer user_data) { struct session_dialog_data *ddata = (struct session_dialog_data *)user_data; int i; gboolean b; i = user_message("Delete session?",UM_OKCANCEL); if (i != MR_OK) return; b = session_delete(ddata->listmap[ddata->resume_index]); if (b) return; gtk_list_clear_items(ddata->listwid,ddata->resume_index, ddata->resume_index+1); for (i=ddata->resume_index; ddata->listmap[i]!=NULL; i++) ddata->listmap[i] = ddata->listmap[i+1]; gtk_widget_set_sensitive(ddata->resume_button,FALSE); gtk_widget_set_sensitive(ddata->delete_button,FALSE); } gboolean session_dialog(void) { struct session_dialog_data ddata; GtkWidget *a,*b,*c,*d; GList *l = NULL,*m; int i; struct session *s; gchar *ch,*p; /* Running and unknown are never shown. Old is also called crash */ gchar *state_names[] = { NULL, _("Suspended"), _("Crash"), _("Left files"), _("Crash"), NULL }; if (session_list == NULL) return FALSE; ddata.listmap = g_malloc((g_list_length(session_list)+1) * sizeof(struct session *)); for (m=session_list,i=0; m!=NULL; m=m->next) { s = (struct session *) m->data; if (s->state == SESSION_RUNNING || s->state == SESSION_UNKNOWN) continue; ch = g_strdup_printf(_("%s on %s(%d files, %ld bytes)"), state_names[s->state],ctime(&(s->date)), g_list_length(s->datafiles),(long)s->size); /* Replace the newline returned by ctime */ p = strchr(ch,'\n'); if (p) *p=' '; l = g_list_append(l,gtk_list_item_new_with_label(ch)); g_free(ch); ddata.listmap[i++] = s; } ddata.listmap[i] = NULL; if (l == NULL) { g_free(ddata.listmap); return FALSE; } a = gtk_window_new(GTK_WINDOW_DIALOG); gtk_window_set_title(GTK_WINDOW(a),_("Sessions")); gtk_window_set_modal(GTK_WINDOW(a),TRUE); gtk_window_set_default_size(GTK_WINDOW(a),400,200); gtk_container_set_border_width(GTK_CONTAINER(a),5); gtk_signal_connect(GTK_OBJECT(a),"destroy", GTK_SIGNAL_FUNC(session_dialog_destroy),&ddata); b = gtk_vbox_new(FALSE,5); gtk_container_add(GTK_CONTAINER(a),b); c = gtk_label_new(_("Earlier sessions were found. Choose one to resume or" " start a new session.")); gtk_label_set_line_wrap(GTK_LABEL(c),TRUE); gtk_box_pack_start(GTK_BOX(b),c,FALSE,FALSE,0); c = gtk_scrolled_window_new(NULL,NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(c),GTK_POLICY_NEVER, GTK_POLICY_ALWAYS); gtk_box_pack_start(GTK_BOX(b),c,TRUE,TRUE,0); d = gtk_list_new(); ddata.listwid = GTK_LIST(d); gtk_list_insert_items(GTK_LIST(d),l,0); gtk_signal_connect(GTK_OBJECT(d),"select_child", GTK_SIGNAL_FUNC(session_dialog_select_child),&ddata); gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(c),d); c = gtk_hbutton_box_new(); gtk_box_pack_end(GTK_BOX(b),c,FALSE,TRUE,0); d = gtk_button_new_with_label(_("Resume selected")); ddata.resume_button = d; gtk_widget_set_sensitive(d,FALSE); gtk_signal_connect(GTK_OBJECT(d),"clicked", GTK_SIGNAL_FUNC(session_dialog_resume_click),&ddata); gtk_signal_connect_object(GTK_OBJECT(d),"clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy), (GtkObject *)a); gtk_container_add(GTK_CONTAINER(c),d); d = gtk_button_new_with_label(_("Delete selected")); ddata.delete_button = d; gtk_widget_set_sensitive(d,FALSE); gtk_signal_connect(GTK_OBJECT(d),"clicked", GTK_SIGNAL_FUNC(session_dialog_delete_click),&ddata); gtk_container_add(GTK_CONTAINER(c),d); d = gtk_button_new_with_label(_("Start new session")); gtk_signal_connect_object(GTK_OBJECT(d),"clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy), (GtkObject *)a); gtk_container_add(GTK_CONTAINER(c),d); d = gtk_button_new_with_label(_("Exit")); gtk_signal_connect(GTK_OBJECT(d),"clicked", GTK_SIGNAL_FUNC(session_dialog_exit),&ddata); gtk_signal_connect_object(GTK_OBJECT(d),"clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy), (GtkObject *)a); gtk_container_add(GTK_CONTAINER(c),d); c = gtk_hseparator_new(); gtk_box_pack_end(GTK_BOX(b),c,FALSE,TRUE,0); ddata.destroy_flag = ddata.resume_click_flag = FALSE; gtk_widget_show_all(a); while (!ddata.destroy_flag) mainloop(); if (ddata.resume_click_flag) session_resume(ddata.listmap[ddata.resume_index]); g_free(ddata.listmap); return ddata.resume_click_flag; } mhwaveedit-1.4.24/src/session.h000066400000000000000000000033331334022513400163610ustar00rootroot00000000000000/* * Copyright (C) 2006, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #ifndef SESSION_H_INCLUDED #define SESSION_H_INCLUDED #include #include "datasource.h" #include "chunk.h" #include "document.h" #include "mainwindow.h" /* Set up session handling system. */ void session_init(int *argc, char **argv); /* If there are old sessions, a dialog will pop up and the user can choose * a session to restore/join. Returns TRUE if session was resumed. */ gboolean session_dialog(void); gint session_get_id(void); /* Called periodically from main loop */ void session_work(void); /* Dumps session data to disk. Program should exit afterwards. */ gboolean session_suspend(void); /* Remove all data for this session */ void session_quit(void); /* Logging functions */ gboolean session_log_datasource(Datasource *ds); gboolean session_log_chunk(Chunk *c); gboolean session_log_document(Document *d); gboolean session_log_mainwindow(Mainwindow *w); gboolean session_log_clipboard(Chunk *clipboard); #endif mhwaveedit-1.4.24/src/sound-alsalib.c000066400000000000000000000376721334022513400174430ustar00rootroot00000000000000/* * Copyright (C) 2004 2005 2006 2008 2010 2011 2012, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include #include "gettext.h" /* #define ALSADEBUG */ static struct { snd_pcm_t *whand,*rhand; Dataformat wfmt,rfmt; gboolean draining,draining_done; int overrun_count; gpointer iogroup; gpointer csource; gboolean eventdriv; gboolean inside_ready_func; int rw_call_count; GVoidFunc ready_func; } alsa_data = { 0 }; static gboolean alsa_output_want_data(void); static gboolean alsa_init(gboolean silent) { alsa_data.eventdriv = inifile_get_gboolean("ALSAEventDriven",TRUE); /* We assume that if you have alsa-lib, you're using the ALSA kernel * drivers. */ return TRUE; } static void alsa_quit(void) { } static void alsa_prefs_ok(GtkButton *button, gpointer user_data) { GtkWidget *w = GTK_WIDGET(user_data); GtkWidget *ep,*er; GtkToggleButton *tb; ep = gtk_object_get_data(GTK_OBJECT(w),"playentry"); er = gtk_object_get_data(GTK_OBJECT(w),"recentry"); tb = gtk_object_get_data(GTK_OBJECT(w),"eventtb"); alsa_data.eventdriv = gtk_toggle_button_get_active(tb); inifile_set("ALSAPlayDevice",(gchar *)gtk_entry_get_text(GTK_ENTRY(ep))); inifile_set("ALSARecDevice",(gchar *)gtk_entry_get_text(GTK_ENTRY(er))); inifile_set_gboolean("ALSAEventDriven",alsa_data.eventdriv); gtk_widget_destroy(w); } static void alsa_show_preferences(void) { GtkWidget *a,*b,*c,*d; alsa_init(TRUE); /* Read config */ a = gtk_window_new(GTK_WINDOW_DIALOG); gtk_window_set_title(GTK_WINDOW(a),_("ALSA Preferences")); gtk_window_set_modal(GTK_WINDOW(a),TRUE); gtk_window_set_position(GTK_WINDOW(a),GTK_WIN_POS_MOUSE); gtk_container_set_border_width(GTK_CONTAINER(a),5); gtk_signal_connect(GTK_OBJECT(a),"delete_event", GTK_SIGNAL_FUNC(gtk_false),NULL); b = gtk_table_new(4,2,FALSE); gtk_container_add(GTK_CONTAINER(a),b); attach_label(_("Playback device: "),b,0,0); c = gtk_entry_new(); gtk_entry_set_text(GTK_ENTRY(c),inifile_get("ALSAPlayDevice","default")); gtk_table_attach(GTK_TABLE(b),c,1,2,0,1,GTK_EXPAND|GTK_FILL,0,5,5); attach_label(_("Recording device: "),b,1,0); gtk_object_set_data(GTK_OBJECT(a),"playentry",c); c = gtk_entry_new(); gtk_entry_set_text(GTK_ENTRY(c),inifile_get("ALSARecDevice","hw")); gtk_table_attach(GTK_TABLE(b),c,1,2,1,2,GTK_EXPAND|GTK_FILL,0,5,5); gtk_object_set_data(GTK_OBJECT(a),"recentry",c); c = gtk_check_button_new_with_label(_("Event driven I/O")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(c),alsa_data.eventdriv); gtk_table_attach(GTK_TABLE(b),c,0,2,2,3,GTK_EXPAND|GTK_FILL,0,5,5); gtk_object_set_data(GTK_OBJECT(a),"eventtb",c); c = gtk_hbutton_box_new(); gtk_table_attach(GTK_TABLE(b),c,0,2,3,4,GTK_EXPAND|GTK_FILL, GTK_EXPAND|GTK_FILL,0,5); d = gtk_button_new_with_label(_("OK")); gtk_signal_connect(GTK_OBJECT(d),"clicked",GTK_SIGNAL_FUNC(alsa_prefs_ok), a); gtk_container_add(GTK_CONTAINER(c),d); d = gtk_button_new_with_label(_("Cancel")); gtk_signal_connect_object(GTK_OBJECT(d),"clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy), GTK_OBJECT(a)); gtk_container_add(GTK_CONTAINER(c),d); gtk_widget_show_all(a); } static gboolean alsa_open_rw(snd_pcm_t **handp, Dataformat *fmtp, gchar *devini, snd_pcm_stream_t str, gboolean silent) { int i; gchar *c,*devname; if (*handp == NULL) { devname = inifile_get(devini,"default"); i = snd_pcm_open(handp,devname,str, SND_PCM_NONBLOCK); if (i<0) { if (!silent) { c = g_strdup_printf((str == SND_PCM_STREAM_CAPTURE)? _("Error opening ALSA device '%s' " "for recording: %s"): _("Error opening ALSA device '%s' " "for playback: %s"), devname, snd_strerror(i)); user_error(c); g_free(c); } return TRUE; } memset(fmtp,0,sizeof(*fmtp)); } return FALSE; } static gboolean alsa_open_write(gboolean silent) { return alsa_open_rw(&(alsa_data.whand),&(alsa_data.wfmt), "ALSAPlayDevice",SND_PCM_STREAM_PLAYBACK,silent); } static gboolean alsa_open_read(gboolean silent) { return alsa_open_rw(&(alsa_data.rhand),&(alsa_data.rfmt), "ALSARecDevice",SND_PCM_STREAM_CAPTURE,silent); } static snd_pcm_format_t alsa_get_format(Dataformat *format) { if (format->type == DATAFORMAT_FLOAT) { if (format->samplesize == sizeof(float)) return format->bigendian ? SND_PCM_FORMAT_FLOAT_BE : SND_PCM_FORMAT_FLOAT_LE; else return format->bigendian ? SND_PCM_FORMAT_FLOAT64_BE : SND_PCM_FORMAT_FLOAT64_LE; } switch (format->samplesize) { case 1: if (format->sign) return SND_PCM_FORMAT_S8; else return SND_PCM_FORMAT_U8; case 2: if (format->sign) return format->bigendian?SND_PCM_FORMAT_S16_BE: SND_PCM_FORMAT_S16_LE; else return format->bigendian ? SND_PCM_FORMAT_U16_BE : SND_PCM_FORMAT_U16_LE; case 3: if (format->sign) return format->bigendian ? SND_PCM_FORMAT_S24_3BE : SND_PCM_FORMAT_S24_3LE; else return format->bigendian ? SND_PCM_FORMAT_U24_3BE : SND_PCM_FORMAT_U24_3LE; case 4: switch (format->packing) { case 0: case 1: /* Use 32-bit for 24-in-32 with data in MSB */ if (format->sign) return format->bigendian? SND_PCM_FORMAT_S32_BE:SND_PCM_FORMAT_S32_LE; else return format->bigendian? SND_PCM_FORMAT_U32_BE:SND_PCM_FORMAT_U32_LE; case 2: if (format->sign) return format->bigendian? SND_PCM_FORMAT_S24_BE:SND_PCM_FORMAT_S24_LE; else return format->bigendian? SND_PCM_FORMAT_U24_BE:SND_PCM_FORMAT_S24_LE; } } g_assert_not_reached(); return SND_PCM_FORMAT_UNKNOWN; } static int csource_func(gpointer csource, gpointer user_data) { int i; #ifdef ALSADEBUG puts("csource_func"); #endif i = alsa_data.rw_call_count; alsa_data.inside_ready_func = TRUE; alsa_data.ready_func(); alsa_data.inside_ready_func = FALSE; if (alsa_data.rw_call_count == i) { mainloop_constant_source_enable(csource,FALSE); return -1; } if (alsa_output_want_data()) { return 0; } mainloop_constant_source_enable(csource,FALSE); mainloop_io_group_enable(alsa_data.iogroup,TRUE); return -1; } static int iogroup_ready_func(gpointer iogroup, int fd, gushort revents, gpointer user_data) { int i; #ifdef ALSADEBUG GTimeVal tv; g_get_current_time(&tv); printf("iogroup_ready_func: time=%3d.%06d, fd=%d, revents=%d\n", (int)tv.tv_sec,(int)tv.tv_usec,(int)fd,(int)revents); #endif if (alsa_data.whand!=NULL && !alsa_output_want_data()) { #ifdef ALSADEBUG printf("Alsa woke us up but didn't want data\n"); #endif return 0; } i = alsa_data.rw_call_count; alsa_data.inside_ready_func = TRUE; alsa_data.ready_func(); alsa_data.inside_ready_func = FALSE; if (alsa_data.rw_call_count == i) return -1; if (!alsa_data.eventdriv && alsa_data.whand!=NULL && alsa_output_want_data()) { if (alsa_data.csource == NULL) alsa_data.csource = mainloop_constant_source_add(csource_func,NULL,FALSE); mainloop_constant_source_enable(alsa_data.csource,TRUE); return -1; } return 1; } static gboolean alsa_set_format(Dataformat *format,Dataformat *fmtp, snd_pcm_t **handp,gboolean playback, GVoidFunc ready_func) { snd_pcm_hw_params_t *par; int i; snd_pcm_uframes_t bufsize; unsigned int pertime,wdtime; int perdir; int fd_count; struct pollfd *fds; GPollFD *pfds; if (dataformat_equal(fmtp,format)) return FALSE; snd_pcm_hw_params_malloc(&par); snd_pcm_hw_params_any(*handp,par); i = snd_pcm_hw_params_set_access(*handp,par, SND_PCM_ACCESS_RW_INTERLEAVED); if (i) { console_message(_("snd_pcm_hw_params_set_access failed")); return TRUE; } i = snd_pcm_hw_params_set_format(*handp,par,alsa_get_format(format)); if (i) { console_message(_("snd_pcm_hw_params_set_format failed")); return TRUE; } i = snd_pcm_hw_params_set_channels(*handp,par,format->channels); if (i) { console_message(_("snd_pcm_hw_params_set_channels failed")); return TRUE; } i = snd_pcm_hw_params_set_rate(*handp,par,format->samplerate,0); if (i) { console_message(_("snd_pcm_hw_params_set_rate failed")); return TRUE; } i = snd_pcm_hw_params_set_buffer_size_last(*handp,par,&bufsize); if (i) { console_message(_("snd_pcm_hw_params_set_buffer_size_last failed")); return TRUE; } #ifdef ALSADEBUG printf("Buffer size: %d\n",(int)bufsize); #endif pertime = 100001; /* 0.1 sec */ perdir = -1; if (playback) { i = snd_pcm_hw_params_set_period_time_near(*handp,par,&pertime,&perdir); if (i) { console_message("snd_pcm_hw_params_set_period_time_near failed"); return TRUE; } #ifdef ALSADEBUG printf("Period time: %d us\n",pertime); #endif } i = snd_pcm_hw_params(*handp,par); snd_pcm_hw_params_free(par); if (i<0) { printf("snd_pcm_hw_params: %s\n",snd_strerror(i)); memset(fmtp,0,sizeof(*fmtp)); return TRUE; } memcpy(fmtp,format,sizeof(*fmtp)); alsa_data.ready_func = ready_func; fd_count = snd_pcm_poll_descriptors_count(*handp); fds = g_malloc(fd_count*sizeof(*fds)); fd_count = snd_pcm_poll_descriptors(*handp,fds,fd_count*sizeof(*fds)); pfds = g_malloc(fd_count*sizeof(GPollFD)); for (i=0; i")); snd_pcm_prepare(alsa_data.whand); return TRUE; } else if (s<0) { printf("snd_pcm_avail_update: %s\n",snd_strerror(s)); return FALSE; } /* return (s > alsa_data.wfmt.samplerate / 250); */ return (s > 0); } static guint alsa_output_play(gchar *buffer, guint bufsize) { snd_pcm_sframes_t r,s; guint u; #ifdef ALSADEBUG GTimeVal tv; #endif /* signal(SIGPIPE,SIG_IGN); */ if (bufsize == 0) return 0; if (!alsa_data.inside_ready_func) mainloop_io_group_enable(alsa_data.iogroup,TRUE); alsa_data.rw_call_count ++; #ifdef ALSADEBUG g_get_current_time(&tv); if (!alsa_data.inside_ready_func) printf("called output_play, %d bytes, re-enabled events, " "time=%3d.%06d\n", (int)bufsize,(int)tv.tv_sec,(int)tv.tv_usec); else printf("called output_play from ready-func, %d bytes, " "time=%3d.%06d\n", (int)bufsize,(int)tv.tv_sec,(int)tv.tv_usec); #endif s = bufsize/alsa_data.wfmt.samplebytes; while (1) { r = snd_pcm_writei(alsa_data.whand,buffer,s); if (r == -EAGAIN || r == 0) { #ifdef ALSADEBUG puts("snd_pcm_writei: EAGAIN!"); #endif r = snd_pcm_avail_update(alsa_data.whand); if (r > 0 && r")); snd_pcm_prepare(alsa_data.whand); continue; } if (r < 0) { printf("snd_pcm_writei: %s\n",snd_strerror(r)); return 0; } break; } u = r*alsa_data.wfmt.samplebytes; #ifdef ALSADEBUG g_get_current_time(&tv); printf("played %d samples time=%3d.%06d\n",(int)r,(int)tv.tv_sec, (int)tv.tv_usec); #endif return u; } static void alsa_output_clear_buffers(void) { /* signal(SIGPIPE,SIG_IGN); */ snd_pcm_drop(alsa_data.whand); snd_pcm_prepare(alsa_data.whand); } static void alsa_input_store(Ringbuf *buffer) { gchar buf[4096]; snd_pcm_sframes_t x; if (alsa_data.draining_done) return; alsa_data.rw_call_count ++; while (1) { x = snd_pcm_readi(alsa_data.rhand,buf, MIN(sizeof(buf),ringbuf_freespace(buffer))/ alsa_data.rfmt.samplebytes); if (x > 0) ringbuf_enqueue(buffer,buf,x*alsa_data.rfmt.samplebytes); else if (alsa_data.draining) { alsa_data.draining_done = TRUE; return; } else if (x == 0 || x == -EAGAIN) return; else if (x == -EPIPE) { puts(_("")); alsa_data.overrun_count ++; snd_pcm_prepare(alsa_data.rhand); } else { printf("snd_pcm_readi: %s\n",snd_strerror(x)); snd_pcm_prepare(alsa_data.rhand); return; } } mainloop_io_group_enable(alsa_data.iogroup,TRUE); } int alsa_input_overrun_count(void) { return alsa_data.overrun_count; } mhwaveedit-1.4.24/src/sound-artsc.c000066400000000000000000000137561334022513400171450ustar00rootroot00000000000000/* * Copyright (C) 2005, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ /* aRts driver using the simpler plain C API */ #include #include static int mharts_init_status; static arts_stream_t mharts_play_stream=NULL,mharts_record_stream=NULL; static Dataformat mharts_format; static gboolean mharts_check_init_status(void) { gchar *c; if (mharts_init_status != 0) { c = g_strdup_printf(_("Unable to connect to aRts server: %s"), arts_error_text(mharts_init_status)); user_error(c); g_free(c); return TRUE; } return FALSE; } static gboolean mharts_init(gboolean silent) { mharts_init_status = arts_init(); if (!silent) mharts_check_init_status(); return (mharts_init_status == 0); } static void mharts_quit(void) { if (mharts_init_status == 0) arts_free(); } static void mharts_perror(gchar *msg, int errcode) { gchar *c; c = g_strdup_printf("aRts: %s: %s",msg,arts_error_text(errcode)); console_message(c); g_free(c); } static void mharts_set_nonblock(arts_stream_t stream) { int i; i = arts_stream_set(stream,ARTS_P_BLOCKING,0); if (i < 0) mharts_perror(_("Failed to set non-blocking mode"),i); else if (i != 0) console_message(_("Warning: aRts refuses to set non-blocking mode")); } static gint mharts_output_select_format(Dataformat *format, gboolean silent) { if (format->type != DATAFORMAT_PCM || format->samplesize > 2 || format->channels > 2) return -1; mharts_play_stream = arts_play_stream(format->samplerate, format->samplesize*8, format->channels, "mhwaveedit"); if (mharts_play_stream == NULL) { if (!silent) { user_error(_("Failed to start playback")); return 1; } else return -1; } mharts_set_nonblock(mharts_play_stream); memcpy(&mharts_format,format,sizeof(Dataformat)); return 0; } static gint mharts_input_select_format(Dataformat *format, gboolean silent) { if (format->type != DATAFORMAT_PCM || format->samplesize > 2 || format->channels > 2) return -1; mharts_record_stream = arts_record_stream(format->samplerate, format->samplesize*8, format->channels, "mhwaveedit_rec"); if (mharts_record_stream == NULL) { if (!silent) { user_error(_("Failed to start recording")); return 1; } else return -1; } mharts_set_nonblock(mharts_record_stream); memcpy(&mharts_format,format,sizeof(Dataformat)); return 0; } static gboolean mharts_output_suggest_format(Dataformat *format, Dataformat *result) { if (format->channels > 2) return FALSE; memcpy(result,format,sizeof(Dataformat)); if (format->type != DATAFORMAT_PCM || format->samplesize > 2) { result->type = DATAFORMAT_PCM; result->samplesize = 2; return TRUE; } else if (format->samplerate != 44100) { result->samplerate = 44100; return TRUE; } else return FALSE; } static gint mharts_buffer_size(void) { int i; i = arts_stream_get(mharts_play_stream,ARTS_P_BUFFER_SIZE); if (i<0) { mharts_perror(_("Failed to get buffer size"),i); return 65536; } return i; } static gint mharts_buffer_space(void) { int i; i = arts_stream_get(mharts_play_stream,ARTS_P_BUFFER_SPACE); if (i<0) { mharts_perror(_("Failed to get buffer space"),i); return mharts_buffer_size(); } return i; } static gboolean mharts_output_stop(gboolean must_flush) { int i,j,k; float f; if (mharts_play_stream == NULL) return TRUE; if (must_flush) { /* Flush buffers */ k = mharts_buffer_size(); i = mharts_buffer_space(); while (i < k) { f = (float)(k-i) / (float)mharts_format.samplerate; usleep((unsigned int)(f*1000000.0)); j = i; i = mharts_buffer_space(); /* To avoid eternal loops in case of buggy behaviour */ if (j == i) break; } } arts_close_stream(mharts_play_stream); return must_flush; } static gboolean mharts_output_want_data(void) { return (mharts_buffer_size()>0); } static guint mharts_output_play(gchar *buffer, guint bufsize) { gint i,j; i = mharts_buffer_space(); if (bufsize == 0) { j = mharts_buffer_size() - i; if (j<0) return 0; else return j; } if (i == 0) return 0; if (bufsize > i) bufsize = i; j = arts_write(mharts_play_stream, buffer, bufsize); if (j<0) { mharts_perror(_("write failed"),j); return 0; } else return j; } static void mharts_output_clear_buffers(void) { arts_stream_t s; Dataformat f; int i; s = mharts_play_stream; memcpy(&f,&mharts_format,sizeof(f)); i = mharts_output_select_format(&f,TRUE); if (i == 0) { arts_close_stream(s); } else { mharts_play_stream = s; } } static void mharts_input_stop(void) { arts_close_stream(mharts_record_stream); mharts_record_stream = NULL; } static void mharts_input_store(Ringbuf *buffer) { gchar buf[4096]; int i,j; j = ringbuf_freespace(buffer); if (j > sizeof(buf)) j = sizeof(buf); j -= j % mharts_format.samplebytes; i = arts_read(mharts_record_stream, buf, j); if (i < 0) mharts_perror(_("read failed"),i); } mhwaveedit-1.4.24/src/sound-dummy.c000066400000000000000000000104011334022513400171440ustar00rootroot00000000000000/* * Copyright (C) 2002 2003 2009 2010, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ /* This is the "dummy" sound driver. It pretends to output and input data but * does nothing. It it used if no supported sound libraries were found. It also * has some debugging code built into it to check that the program does not call * the sound driver in a wrong way. (e.g. not calling sound_init first). */ #ifdef HAVE_SYS_TIME_H #include #endif #ifdef HAVE_TIME_H #include #endif #include "sound.h" static struct { gint state; int lasttime; Dataformat format; gint input_bytes_available; gint output_bytes_buffered; } dummy_data = {1}; static gboolean dummy_init(gboolean silent) { g_assert(dummy_data.state == 1); dummy_data.state = 2; return TRUE; } static void dummy_quit(void) { g_assert(dummy_data.state == 2); dummy_data.state = 5; } static gint dummy_output_select_format(Dataformat *format, gboolean silent, GVoidFunc ready_func) { g_assert(dummy_data.state == 2); dummy_data.state = 3; memcpy(&dummy_data.format,format,sizeof(Dataformat)); dummy_data.output_bytes_buffered = 0; return 0; } static gboolean dummy_output_stop(gboolean must_flush) { g_assert(dummy_data.state == 2 || dummy_data.state == 3); dummy_data.state = 2; return TRUE; } static void dummy_output_checkbuf(void) { time_t t; t = time(0); if (t != dummy_data.lasttime) { dummy_data.output_bytes_buffered -= dummy_data.format.samplerate*dummy_data.format.samplebytes; if (dummy_data.output_bytes_buffered < 0 || t > dummy_data.lasttime+1) dummy_data.output_bytes_buffered = 0; dummy_data.lasttime = t; } } static gboolean dummy_output_want_data(void) { g_assert(dummy_data.state == 3); dummy_output_checkbuf(); return (dummy_data.output_bytes_buffered < 2 * dummy_data.format.samplerate * dummy_data.format.samplebytes); } static guint dummy_output_play(gchar *buffer, guint bufsize) { gint i; g_assert(dummy_data.state == 3); dummy_output_checkbuf(); i = 2*dummy_data.format.samplerate*dummy_data.format.samplebytes; i -= dummy_data.output_bytes_buffered; if (i > bufsize) i = bufsize; dummy_data.output_bytes_buffered += i; return i; } static void dummy_output_clear_buffers(void) { g_assert(dummy_data.state == 3); dummy_data.output_bytes_buffered = 0; } static GList *dummy_input_supported_formats(gboolean *complete) { g_assert(dummy_data.state == 2); *complete = FALSE; return NULL; } static gint dummy_input_select_format(Dataformat *format, gboolean silent, GVoidFunc ready_func) { g_assert(dummy_data.state == 2); /* if (format->samplerate < 100000 && format->samplerate > 0) return -1; */ memcpy(&dummy_data.format,format,sizeof(Dataformat)); dummy_data.input_bytes_available = 0; dummy_data.state = 4; return 0; } static void dummy_input_stop(void) { g_assert(dummy_data.state == 4 || dummy_data.state == 2); dummy_data.state = 2; } static void dummy_input_store(Ringbuf *buffer) { guint32 i; time_t t; g_assert(dummy_data.state == 4); t = time(0); if (t != dummy_data.lasttime) { dummy_data.input_bytes_available += dummy_data.format.samplerate * dummy_data.format.samplebytes; dummy_data.lasttime = t; } i = MIN(ringbuf_freespace(buffer),dummy_data.input_bytes_available); dummy_data.input_bytes_available -= ringbuf_enqueue_zeroes(buffer,i); } mhwaveedit-1.4.24/src/sound-esound.c000066400000000000000000000216771334022513400173270ustar00rootroot00000000000000/* * Copyright (C) 2004 2005, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ /* This module was re-written completely from scratch in Sep 2004. * Thanks to Erica Andrews for contributing the original esound * driver. */ #include #include #include #include "float_box.h" #include "gettext.h" #define ESOUND_CLEARDELAY "EsoundClearDelay" #define ESOUND_CLEARDELAY_DEFAULT 0.4 /* Playback/Recording connections (<= 0 if not connected) */ static int esound_play_fd = -1; static int esound_record_fd = -1; static Dataformat esound_play_format; static float esound_clear_delay; static GTimeVal esound_noflush_stop_time = {}; static void esound_prefs_init(void) { esound_clear_delay = inifile_get_gfloat(ESOUND_CLEARDELAY, ESOUND_CLEARDELAY_DEFAULT); } static gboolean esound_init(gboolean silent) { /* Just try once here so the user gets a clear error message if ESD * isn't available */ int fd; gchar *c; esound_prefs_init(); if (getenv("ESD_NO_SPAWN") == NULL) putenv("ESD_NO_SPAWN=y"); fd = esd_open_sound(NULL); if (fd < 0) { if (!silent) { c = g_strdup_printf(_("Couldn't connect to ESD daemon: %s"), strerror(errno)); user_error(c); g_free(c); } return FALSE; } esd_close(fd); return TRUE; } static void esound_quit(void) { } static void esound_select_format(Dataformat *format, int *fdp, gboolean recording) { int fmt = ESD_STREAM; g_assert(*fdp < 0); if (recording) fmt |= ESD_RECORD; else fmt |= ESD_PLAY; if (format->samplesize == 1) fmt |= ESD_BITS8; else if (format->samplesize == 2) fmt |= ESD_BITS16; else return; if (format->channels == 1) fmt |= ESD_MONO; else if (format->channels == 2) fmt |= ESD_STEREO; else return; if (recording) *fdp = esd_record_stream(fmt,format->samplerate, NULL,"mhWaveEdit"); else *fdp = esd_play_stream(fmt,format->samplerate,NULL, "mhWaveEdit"); } static gint esound_output_select_format(Dataformat *format, gboolean silent, GVoidFunc ready_func) { GTimeVal tv,r; int i; unsigned long j,k; if (format->type == DATAFORMAT_FLOAT) return -1; g_get_current_time(&tv); i = timeval_subtract(&r,&tv,&esound_noflush_stop_time); if (i == 0) { j = r.tv_sec * 1000000 + r.tv_usec; /* It seems we need a much shorter delay here than when jumping. * Fixing it to 0.1 seconds for now */ k = 100000; if (r.tv_sec < 4 && jtype == DATAFORMAT_FLOAT) return -1; esound_select_format(format,&esound_record_fd,TRUE); if (esound_record_fd < 0) { if (!silent) user_perror(_("EsounD: Unable to open recording stream")); return -1; } return 0; } static gboolean esound_output_want_data(void) { fd_set wfds; int i; struct timeval t = { 0.0, 0.0 }; FD_ZERO(&wfds); FD_SET(esound_play_fd,&wfds); i = select(esound_play_fd+1, NULL, &wfds, NULL, &t); if (i == -1) { console_perror(_("EsounD driver: select")); return TRUE; } return (i>0); } static guint esound_output_play(gchar *buf, guint len) { ssize_t sst; if (buf == NULL || len == 0) return 0; sst = write(esound_play_fd, buf, len); if (sst < 0) { console_perror(_("EsounD driver: write")); return 0; } /* FIXME: It's theoretically possible that just part of a sample was * written if the socket buffer size isn't a multiple of 4. */ return (guint) sst; } /* Both esound_output_stop and esound_output_clear_buffers * should wait for all data in the pipeline to be played, but I don't know * how to find out how long time that should be. Use a configurable setting * for now. */ static void esound_output_clear_buffers(void) { if (esound_clear_delay > 0) usleep((unsigned long)(esound_clear_delay * 1000000.0)); return; } static gboolean esound_output_stop(gboolean must_flush) { if (esound_play_fd >= 0) { /* If we want to guarantee all data to be sent, we must wait a * while. Otherwise, set the first_play variable so we don't restart * immediately. */ if (must_flush) esound_output_clear_buffers(); /* Just waits... */ else g_get_current_time(&esound_noflush_stop_time); esd_close(esound_play_fd); } esound_play_fd = -1; return must_flush; } static void esound_input_stop(void) { if (esound_record_fd >= 0) esd_close(esound_record_fd); esound_record_fd = -1; } static void esound_input_store(Ringbuf *buffer) { gchar buf[4096]; int i; fd_set set; struct timeval tv = { 0, 0 }; int sz; if (esound_record_fd < 0) return; while (1) { sz = ringbuf_freespace(buffer); if (sz > sizeof(buf)) sz = sizeof(buf); if (sz == 0) return; FD_ZERO(&set); FD_SET(esound_record_fd, &set); i = select(esound_record_fd+1, &set, NULL, NULL, &tv); if (i<0) console_perror(_("EsounD driver: select")); if (i == 0) return; i = read(esound_record_fd,buf,sz); if (i == 0) { user_error(_("Esound connection closed by server")); esound_record_fd = -1; return; } if (i<0) { if (errno == EAGAIN || errno == EINTR) continue; console_perror(_("EsounD driver: read")); return; } ringbuf_enqueue(buffer,buf,i); } } struct esound_prefdlg { GtkWindow *wnd; Floatbox *jd; }; static void esound_preferences_ok(GtkButton *button, struct esound_prefdlg *pd) { if (floatbox_check_limit(pd->jd,0.0,4.0,_("jump delay"))) return; esound_clear_delay = pd->jd->val; inifile_set_gfloat(ESOUND_CLEARDELAY,esound_clear_delay); gtk_widget_destroy(GTK_WIDGET(pd->wnd)); } static void esound_preferences(void) { GtkWidget *a,*b,*c,*d; struct esound_prefdlg *pd; esound_prefs_init(); pd = g_malloc(sizeof(*pd)); a = gtk_window_new(GTK_WINDOW_DIALOG); gtk_window_set_modal(GTK_WINDOW(a),TRUE); gtk_window_set_title(GTK_WINDOW(a),_("ESD preferences")); gtk_window_set_position(GTK_WINDOW(a),GTK_WIN_POS_CENTER); gtk_container_set_border_width(GTK_CONTAINER(a),5); gtk_signal_connect_object(GTK_OBJECT(a),"destroy",GTK_SIGNAL_FUNC(g_free), (GtkObject *)pd); pd->wnd = GTK_WINDOW(a); b = gtk_vbox_new(FALSE,5); gtk_container_add(GTK_CONTAINER(a),b); c = gtk_label_new(_("If the cursor starts running too early when jumping, " "this delay should be increased.")); gtk_label_set_line_wrap(GTK_LABEL(c),TRUE); gtk_container_add(GTK_CONTAINER(b),c); c = gtk_hbox_new(FALSE,3); gtk_container_add(GTK_CONTAINER(b),c); d = gtk_label_new(_("Jump delay:")); gtk_box_pack_start(GTK_BOX(c),d,FALSE,FALSE,0); d = floatbox_new(esound_clear_delay); gtk_box_pack_start(GTK_BOX(c),d,TRUE,TRUE,0); pd->jd = FLOATBOX(d); d = gtk_label_new(_("seconds")); gtk_box_pack_end(GTK_BOX(c),d,FALSE,FALSE,0); c = gtk_hseparator_new(); gtk_container_add(GTK_CONTAINER(b),c); c = gtk_label_new(_("Selecting the ESD host to connect to is done through " "the ESPEAKER environment variable.")); gtk_label_set_line_wrap(GTK_LABEL(c),TRUE); gtk_container_add(GTK_CONTAINER(b),c); c = gtk_hseparator_new(); gtk_container_add(GTK_CONTAINER(b),c); c = gtk_hbutton_box_new(); gtk_container_add(GTK_CONTAINER(b),c); d = gtk_button_new_with_label(_("OK")); gtk_signal_connect(GTK_OBJECT(d),"clicked", GTK_SIGNAL_FUNC(esound_preferences_ok),pd); gtk_container_add(GTK_CONTAINER(c),d); d = gtk_button_new_with_label(_("Close")); gtk_signal_connect_object(GTK_OBJECT(d),"clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy), GTK_OBJECT(a)); gtk_container_add(GTK_CONTAINER(c),d); gtk_widget_show_all(a); } mhwaveedit-1.4.24/src/sound-jack.c000066400000000000000000000652021334022513400167320ustar00rootroot00000000000000/* * Copyright (C) 2004 2005 2006 2008 2009 2011 2012, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ /* JACK sound driver */ #include #include #include "int_box.h" #include "gettext.h" /* All variables/functions prefixed with mhjack_ since the jack library * already uses the jack_ prefix */ #define MHJACK_PLAY 0x80000000 #define MHJACK_STOP 0x40000000 #define MHJACK_REC 0x20000000 #define MHJACK_SKIPREQ(x) (((x) >> 24) & 15) #define MHJACK_SKIPPOS(x) ((x) & 0xFFFFFF) #define MHJACK_NEWSKIP(x,p) (((x) & 0xF0000000) | (((x) + 0x01000000) & 0x0F000000) | (p)) static struct { gchar *client_name; jack_client_t *myself; gboolean is_activated,autoconnect_input,autoconnect_output; guint maxoutports, maxinports; gchar *inportnames[8],*outportnames[8]; jack_port_t *inports[8],*outports[8]; volatile guint32 procctrl; volatile unsigned int xrun_count; volatile off_t played_bytes; int cb_skipcount; Dataformat current_format; size_t buffer_size; jack_ringbuffer_t *buffers[8]; gboolean refill; guint refillframes, refillpos; } mhjack = { 0 }; struct mhjack_prefdlg { GtkWindow *wnd; GtkEntry *client_name; struct { Intbox *maxports; GtkEntry *portnames[8]; GtkToggleButton *autoconnect; } ports[2]; }; /* static int dumpfile; */ static void mhjack_register_ports(void); static void mhjack_read_config(void) { guint i; gchar *c,*d; if (mhjack.client_name != NULL) return; /* Read config from inifile */ mhjack.client_name = g_strdup(inifile_get("jackClientName","mhwe")); mhjack.maxoutports = (guint)inifile_get_guint32("jackMaxportsOut",2); if (mhjack.maxoutports < 0 || mhjack.maxoutports > 8) mhjack.maxoutports = 2; mhjack.maxinports = (guint)inifile_get_guint32("jackMaxportsIn",2); if (mhjack.maxinports < 0 || mhjack.maxinports > 8) mhjack.maxinports = 2; for (i=0; i<8; i++) { c = g_strdup_printf("jackOutport%d",i+1); d = inifile_get(c,NULL); if (d != NULL) d = g_strdup(d); else d = g_strdup_printf("out%c",channel_char(i)); mhjack.outportnames[i] = d; g_free(c); c = g_strdup_printf("jackInport%d",i+1); d = inifile_get(c,NULL); if (d != NULL) d = g_strdup(d); else d = g_strdup_printf("in%c",channel_char(i)); mhjack.inportnames[i] = d; g_free(c); } mhjack.autoconnect_input = inifile_get_gboolean("jackAutoconnectInput", TRUE); mhjack.autoconnect_output = inifile_get_gboolean("jackAutoconnectOutput", TRUE); } static void mhjack_preferences_ok(GtkButton *button, gpointer user_data) { struct mhjack_prefdlg *dlg = (struct mhjack_prefdlg *)user_data; const gchar *c; guint i; gchar buf[32]; /* Validate input */ if (intbox_check(dlg->ports[0].maxports) || intbox_check(dlg->ports[1].maxports)) return; if (dlg->ports[0].maxports->val > 8 || dlg->ports[0].maxports->val < 0) { user_error(_("Invalid number of input ports.")); return; } if (dlg->ports[1].maxports->val > 8 || dlg->ports[1].maxports->val < 0) { user_error(_("Invalid number of output ports.")); return; } /* Apply settings */ c = gtk_entry_get_text(dlg->client_name); if (mhjack.myself != NULL && strcmp(c, mhjack.client_name)) { g_free(mhjack.client_name); mhjack.client_name = g_strdup(c); inifile_set("jackClientName",(gchar *)c); user_info(_("The client name change won't take effect until you " "restart the program.")); } mhjack.maxinports = (guint)dlg->ports[0].maxports->val; inifile_set_guint32("jackMaxportsIn",mhjack.maxinports); mhjack.maxoutports = (guint)dlg->ports[1].maxports->val; inifile_set_guint32("jackMaxportsOut",mhjack.maxoutports); for (i=0; i<8; i++) { g_free(mhjack.inportnames[i]); mhjack.inportnames[i] = g_strdup(gtk_entry_get_text(dlg->ports[0].portnames[i])); g_snprintf(buf,sizeof(buf),"jackInport%d",i+1); inifile_set(buf,mhjack.inportnames[i]); if (mhjack.myself != NULL && mhjack.inports[i] != NULL) { if (iports[1].portnames[i])); g_snprintf(buf,sizeof(buf),"jackOutport%d",i+1); inifile_set(buf,mhjack.outportnames[i]); if (mhjack.myself != NULL && mhjack.outports[i] != NULL) { if (iports[0].autoconnect); mhjack.autoconnect_output = gtk_toggle_button_get_active(dlg->ports[1].autoconnect); inifile_set_gboolean("jackAutoconnectInput",mhjack.autoconnect_input); inifile_set_gboolean("jackAutoconnectOutput",mhjack.autoconnect_output); if (mhjack.myself != NULL) mhjack_register_ports(); gtk_widget_destroy(GTK_WIDGET(dlg->wnd)); } static void mhjack_preferences(void) { GtkWidget *a,*b,*c,*d,*e,*f,*g; struct mhjack_prefdlg *dlg; gchar *titles[2] = { N_(" Input ports "), N_(" Output ports "), }; guint i,j; gchar buf[16]; mhjack_read_config(); dlg = g_malloc(sizeof(*dlg)); a = gtk_window_new(GTK_WINDOW_DIALOG); dlg->wnd = GTK_WINDOW(a); gtk_window_set_modal(GTK_WINDOW(a),TRUE); gtk_window_set_title(GTK_WINDOW(a),_("Jack Preferences")); gtk_window_set_position(GTK_WINDOW(a),GTK_WIN_POS_CENTER); gtk_container_set_border_width(GTK_CONTAINER(a),8); gtk_signal_connect_object(GTK_OBJECT(a),"destroy",GTK_SIGNAL_FUNC(g_free), (GtkObject *)dlg); b = gtk_vbox_new(FALSE,5); gtk_container_add(GTK_CONTAINER(a),b); c = gtk_hbox_new(FALSE,3); gtk_box_pack_start(GTK_BOX(b),c,FALSE,FALSE,0); d = gtk_label_new(_("Client name: ")); gtk_box_pack_start(GTK_BOX(c),d,FALSE,FALSE,0); d = gtk_entry_new(); gtk_box_pack_start(GTK_BOX(c),d,FALSE,FALSE,0); dlg->client_name = GTK_ENTRY(d); gtk_entry_set_max_length(dlg->client_name, jack_client_name_size()); gtk_entry_set_text(dlg->client_name, mhjack.client_name); c = gtk_hbox_new(TRUE,12); gtk_box_pack_start(GTK_BOX(b),c,TRUE,TRUE,0); for (i=0; i<2; i++) { d = gtk_frame_new(_(titles[i])); gtk_box_pack_start(GTK_BOX(c),d,TRUE,TRUE,0); e = gtk_vbox_new(FALSE,4); gtk_container_add(GTK_CONTAINER(d),e); gtk_container_set_border_width(GTK_CONTAINER(e),6); f = gtk_hbox_new(FALSE,0); gtk_box_pack_start(GTK_BOX(e),f,TRUE,TRUE,0); g = gtk_label_new(_("Number of ports (0-8): ")); gtk_box_pack_start(GTK_BOX(f),g,FALSE,FALSE,0); g = intbox_new(i>0 ? mhjack.maxoutports : mhjack.maxinports); gtk_box_pack_start(GTK_BOX(f),g,FALSE,FALSE,0); dlg->ports[i].maxports = INTBOX(g); f = gtk_table_new(8,2,FALSE); gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0); for (j=0; j<8; j++) { g_snprintf(buf,sizeof(buf),_("Port #%d"),j+1); attach_label(buf,f,j,0); g = gtk_entry_new(); gtk_table_attach(GTK_TABLE(f),g,1,2,j,j+1,GTK_EXPAND|GTK_FILL,0, 0,0); dlg->ports[i].portnames[j] = GTK_ENTRY(g); gtk_entry_set_max_length(GTK_ENTRY(g),jack_port_name_size()); gtk_entry_set_text(GTK_ENTRY(g),i>0 ? mhjack.outportnames[j] : mhjack.inportnames[j]); } gtk_table_set_row_spacings(GTK_TABLE(f),2); gtk_table_set_col_spacings(GTK_TABLE(f),2); } c = gtk_check_button_new_with_label(_("Automatically connect input " "ports on startup")); dlg->ports[0].autoconnect = GTK_TOGGLE_BUTTON(c); gtk_toggle_button_set_active(dlg->ports[0].autoconnect, mhjack.autoconnect_input); gtk_box_pack_start(GTK_BOX(b),c,FALSE,FALSE,0); c = gtk_check_button_new_with_label(_("Automatically connect output " "ports on startup")); dlg->ports[1].autoconnect = GTK_TOGGLE_BUTTON(c); gtk_toggle_button_set_active(dlg->ports[1].autoconnect, mhjack.autoconnect_output); gtk_box_pack_start(GTK_BOX(b),c,FALSE,FALSE,0); c = gtk_hbutton_box_new(); gtk_box_pack_end(GTK_BOX(b),c,FALSE,FALSE,0); d = gtk_button_new_with_label(_("OK")); gtk_signal_connect(GTK_OBJECT(d),"clicked", GTK_SIGNAL_FUNC(mhjack_preferences_ok),dlg); gtk_container_add(GTK_CONTAINER(c),d); d = gtk_button_new_with_label(_("Close")); gtk_signal_connect_object(GTK_OBJECT(d),"clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy), GTK_OBJECT(a)); gtk_container_add(GTK_CONTAINER(c),d); gtk_widget_show_all(a); } static void mhjack_register_ports(void) { guint i; /* If jack_port_register fails, the NULL value will be stored in * mhjack.in/outports, so we can check for this or re-register later. */ for (i=0; i < mhjack.maxinports; i++) if (mhjack.inports[i] == NULL) mhjack.inports[i] = jack_port_register(mhjack.myself, mhjack.inportnames[i], JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput|JackPortIsTerminal, 0); for (i=0; i< mhjack.maxoutports; i++) if (mhjack.outports[i] == NULL) mhjack.outports[i] = jack_port_register(mhjack.myself, mhjack.outportnames[i], JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput|JackPortIsTerminal, 0); } /* Makes sure the ring buffers are allocated and at least 4x the JACK buffer * size and at least one second long. */ static int mhjack_setup_buffers(void) { jack_nframes_t nframes; size_t sz; guint i; nframes = jack_get_buffer_size(mhjack.myself); sz = 4 * nframes * sizeof(float); if (sz < jack_get_sample_rate(mhjack.myself)*sizeof(float)) sz=jack_get_sample_rate(mhjack.myself)*sizeof(float); for (i=0; i mhjack.buffer_size) { jack_ringbuffer_free(mhjack.buffers[i]); mhjack.buffers[i] = NULL; } /* Create new buffer if no-one exists */ if (mhjack.buffers[i] == NULL) mhjack.buffers[i] = jack_ringbuffer_create(sz); /* Reset the buffer */ if (mhjack.buffers[i] != NULL) jack_ringbuffer_reset(mhjack.buffers[i]); } mhjack.buffer_size = sz; return 0; } static int mhjack_xrun_callback(void *arg) { mhjack.xrun_count ++; return 0; } /* Move read pointer ahead to position pos, but only if pos is within the * readable part of the buffer */ static void mhjack_jrb_skipto(jack_ringbuffer_t *rb, size_t pos) { size_t w,r; w = rb->write_ptr; r = rb->read_ptr; if (w >= r) { if (pos > r && pos <= w) rb->read_ptr = pos; } else { if (pos > r || pos <= w) rb->read_ptr = pos; } } static int mhjack_process_callback(jack_nframes_t nframes, void *arg) { guint i,first_silent_port=0,skippos; gboolean xrun = FALSE, first = TRUE, do_skip=FALSE; size_t sz = nframes * sizeof(float), sz2; gchar *p; int pctrl; pctrl = mhjack.procctrl; if ((pctrl & MHJACK_PLAY) != 0) { i = MHJACK_SKIPREQ(pctrl); if (i != mhjack.cb_skipcount) { mhjack.cb_skipcount = i; do_skip = TRUE; skippos = MHJACK_SKIPPOS(pctrl); } for (i=0; i= mhjack.maxoutports) break; p1=jack_port_name(ports[i]); p2=c[i]; } else { if (i >= mhjack.maxinports) break; p1=c[i]; p2=jack_port_name(ports[i]); } j = jack_connect(mhjack.myself,p1,p2); if (j<0 && !silent) { d = g_strdup_printf(_("Connection from %s to %s failed: %s"), p1,p2,strerror(j)); user_error(d); g_free(d); } } g_free(c); } static void silent_error_callback(const char *msg) { } static void normal_error_callback(const char *msg) { fprintf(stderr,"%s\n",msg); } static void mhjack_connect(gboolean silent) { gchar *c; jack_status_t s; if (mhjack.myself == NULL) { if (silent) jack_set_error_function(silent_error_callback); /* Connect to the JACK server */ mhjack.myself = jack_client_open(mhjack.client_name, JackNoStartServer|JackUseExactName, &s); /* All versions of Jack don't seem to set JackNameNotUnique properly. * Testing with Jack 1.9.4 gave JackServerError|JackFailure even * though JackUseExactName was the cause of the error */ if (mhjack.myself == NULL /* && (s & JackNameNotUnique) != 0 */ ) { c = g_strdup_printf("%s%d",mhjack.client_name,getpid()); if (!silent) fprintf(stderr,"Retrying with Jack client name %s\n",c); mhjack.myself = jack_client_open(c,JackNoStartServer,&s); g_free(c); } if (silent) jack_set_error_function(normal_error_callback); if (mhjack.myself == NULL) { if (!silent) user_error(_("Could not connect to the JACK server.")); return; } jack_set_xrun_callback(mhjack.myself,mhjack_xrun_callback,NULL); jack_set_process_callback(mhjack.myself,mhjack_process_callback, NULL); mhjack_register_ports(); } if (!mhjack.is_activated) { if (jack_activate(mhjack.myself)) { if (!silent) user_error(_("Activation failed!")); return; } mhjack.is_activated = TRUE; if (mhjack.autoconnect_input) mhjack_autoconnect(mhjack.inports,JackPortIsOutput,silent); if (mhjack.autoconnect_output) mhjack_autoconnect(mhjack.outports,JackPortIsInput,silent); } } static guint mhjack_ringbuffer_space(gboolean input, gboolean readspace) { guint i,j; guint w = 1024*1024; /* Just a very high number */ for (i=0; i j) w=j; } return w; } static gboolean mhjack_init(gboolean silent) { mhjack_read_config(); mhjack_connect(silent); /* dumpfile = open("jackdump.dat",O_WRONLY|O_CREAT); */ return (mhjack.myself != NULL); } static void mhjack_quit(void) { if (mhjack.myself != NULL) jack_client_close(mhjack.myself); } /* Output */ static gint mhjack_output_select_format(Dataformat *format, gboolean silent, GVoidFunc ready_func) { /* Make sure we're connected before we check the format. This is * to make sure that the error message is displayed. Note that * mhjack_connect call is cheap when we're already connected */ mhjack_connect(silent); if (!mhjack.is_activated) return silent ? -1 : +1; if (format->type != DATAFORMAT_FLOAT || format->samplesize != sizeof(float) || XOR(format->bigendian,ieee_be_compatible)) return -1; if (format->samplerate != jack_get_sample_rate(mhjack.myself)) return -1; memcpy(&(mhjack.current_format),format,sizeof(Dataformat)); mhjack.xrun_count = 0; mhjack.played_bytes = 0; mhjack_setup_buffers(); mhjack.refill = TRUE; mhjack.refillpos = 0; mhjack.refillframes = 0; return 0; } static gboolean mhjack_output_suggest_format(Dataformat *format, Dataformat *result) { mhjack_connect(TRUE); if (!mhjack.is_activated) return FALSE; memcpy(result,format,sizeof(Dataformat)); result->type = DATAFORMAT_FLOAT; result->samplesize = sizeof(float); result->bigendian = ieee_be_compatible; result->samplebytes = result->samplesize * result->channels; result->samplerate = jack_get_sample_rate(mhjack.myself); result->packing = 0; return TRUE; } /* We have two different buffer modes during playback: * Normal mode: * Keep the buffer filled to capacity minus 1/2 second * Refill mode: * Write 1/2 second of data into the buffer and then switch into * normal mode. When switching over, playback is started if it * was stopped, and a skip request (for dropping data) can be sent. * * The mode only matters to the user side, the playback thread plays what's * in the ring buffer. * * Playback skipping without gaps or underruns is implemented as follows: * - When output_clear_buffers is called, we switch to refill mode but the * callback thread keeps playing from the >0.5 s of old sound currently in * the ring buffers. * - When enough new data has been written into the ring buffers, a skip * request is sent to the callback thread with the new data's starting * position in the ring buffer. * - The next time the player thread wakes up it sees the skip request and * jumps the read position ahead to the new data. If it has already * played past that point, it ignores the skip request. */ static guint mhjack_writable(void) { int writable,i,s; writable = s = mhjack_ringbuffer_space(FALSE,FALSE) / sizeof(float); i = (mhjack.buffer_size / 2) / sizeof(float); if (mhjack.refill) { /* Return remaining part of refill before switching to normal */ if (i > mhjack.refillframes) i-=mhjack.refillframes; else i=0; if (writable > i) writable=i; } else { /* Leave half the buffer for refilling later */ if (writable > i) writable-=i; else writable=0; } /* if (writable > 0) printf("writable: s=%d refill=%d refillframes=%d -> %d\n",s, mhjack.refill,mhjack.refillframes,writable); */ return writable; } static guint mhjack_output_play(gchar *buffer, guint bufsize) { guint writable,frames,i,j; float fbuf[1024],fbuf2[512]; int pctrl = mhjack.procctrl; if (bufsize == 0) { if ((pctrl&MHJACK_PLAY) == 0 && mhjack_ringbuffer_space(FALSE,TRUE)==0) return 0; /* The caller wants to drain the buffers, therefore set the * is_stopping flag so underrun messages aren't displayed. */ pctrl |= (MHJACK_PLAY | MHJACK_STOP); mhjack.procctrl = pctrl; return mhjack_ringbuffer_space(FALSE,TRUE); } /* write(dumpfile, buffer, bufsize); */ /* Calculate room in the ring buffers */ writable = mhjack_writable(); /* Calculate how many frames we can write out */ frames = bufsize / mhjack.current_format.samplebytes; if (frames > ARRAY_LENGTH(fbuf2)) frames=ARRAY_LENGTH(fbuf2); if (frames > writable) frames = writable; if (frames == 0) return 0; /* Convert data to floats */ convert_array(buffer,&(mhjack.current_format),fbuf,&dataformat_single, frames*mhjack.current_format.channels,DITHER_NONE,NULL); /* De-interleave and write data to the different ring buffers. */ if (mhjack.current_format.channels == 1) { /* Special case - mono output */ if (mhjack.outports[0] != NULL) jack_ringbuffer_write(mhjack.buffers[0],(char *)fbuf, frames*sizeof(float)); } else { for (i=0; iwrite_ptr; } static gboolean mhjack_output_stop(gboolean must_flush) { int pctrl = mhjack.procctrl,w; if ((pctrl&MHJACK_PLAY)==0) { if (mhjack_ringbuffer_space(FALSE,TRUE) == 0) return TRUE; } if (!must_flush) { w = mhjack.buffers[0]->write_ptr; pctrl = MHJACK_NEWSKIP(pctrl, w); } pctrl |= (MHJACK_STOP | MHJACK_PLAY); mhjack.procctrl = pctrl; while (mhjack_ringbuffer_space(FALSE,TRUE) > 0) do_yield(FALSE); pctrl &= ~MHJACK_PLAY; mhjack.procctrl = pctrl; return must_flush; } static gboolean mhjack_output_want_data(void) { return (mhjack_writable() > 0); } /* Input */ static void mhjack_input_store(Ringbuf *buffer) { guint readable,frames,i,j; float fbuf[512],fbuf2[1024]; gchar sbuf[4096]; size_t s; readable = mhjack_ringbuffer_space(TRUE,TRUE) / sizeof(float); if (readable == 0) return; frames = ringbuf_freespace(buffer) / mhjack.current_format.samplebytes; if (frames > readable) frames = readable; if (frames > ARRAY_LENGTH(fbuf2)/mhjack.current_format.channels) frames = ARRAY_LENGTH(fbuf2)/mhjack.current_format.channels; /* Read data, then interleave it. */ if (mhjack.current_format.channels == 1) { /* Special case - one channel */ if (mhjack.inports[0] != NULL) { s = jack_ringbuffer_read(mhjack.buffers[0],(char *)fbuf2, frames*sizeof(float)); g_assert(s == frames*sizeof(float)); } else memset(fbuf2,0,frames*sizeof(float)); } else { for (i=0; itype = DATAFORMAT_FLOAT; fmt->samplesize = sizeof(float); fmt->packing = 0; fmt->channels = i; fmt->samplebytes = fmt->samplesize * fmt->channels; fmt->samplerate = r; fmt->bigendian = ieee_be_compatible; l = g_list_append(l, fmt); } *complete = TRUE; return l; } static gint mhjack_input_select_format(Dataformat *format, gboolean silent, GVoidFunc ready_func) { gchar *c; mhjack_connect(silent); if (!mhjack.is_activated) return silent ? -1 : +1; if (format->samplerate != jack_get_sample_rate(mhjack.myself) || (mhjack_output_select_format(format,TRUE,ready_func))) { if (!silent) { c = g_strdup_printf(_("With JACK, the only supported recording " "format is " "Floating-point, single precision, %d Hz"), jack_get_sample_rate(mhjack.myself)); user_error(c); g_free(c); return 1; } else return -1; } mhjack.procctrl |= MHJACK_REC; return 0; } /* Also used as input_stop_hint */ static void mhjack_input_stop(void) { mhjack.procctrl &= ~MHJACK_REC; } mhwaveedit-1.4.24/src/sound-oss.c000066400000000000000000000350071334022513400166260ustar00rootroot00000000000000/* * Copyright (C) 2002 2003 2004 2005 2006 2008 2010, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #if defined(HAVE_SYS_SOUNDCARD_H) #include #elif defined(HAVE_SOUNDCARD_H) #include #else #warning "Header file not found for OSS driver!" #endif #include #include #include #include #include #include #include #include #include #include #include "ringbuf.h" #include "um.h" #include "main.h" #include "gettext.h" #include "mainloop.h" #define OSS_PCMFILE_PLAYBACK "OSSdevice" #define OSS_PCMFILE_RECORD "OSSRecDevice" #ifdef __OpenBSD__ #define OSS_PCMFILE_DEFAULT "/dev/audio" #else #define OSS_PCMFILE_DEFAULT "/dev/dsp" #endif #define OSS_NOSELECT "OSSAvoidSelect" #define OSS_NOSELECT_DEFAULT FALSE static Ringbuf *oss_output_buffer; static int oss_fd; static int oss_format; static int oss_samplesize; static int oss_samplerate; static int oss_channels; static int oss_samplebytes_in,oss_samplebytes_out; static gboolean oss_noselect = FALSE; static gpointer play_source; static int oss_output_flush(gpointer tsource, GTimeVal *tv, gpointer user_data); static gboolean oss_init(gboolean silent) { oss_output_buffer = ringbuf_new( inifile_get_guint32(INI_SETTING_SOUNDBUFSIZE, INI_SETTING_SOUNDBUFSIZE_DEFAULT)); oss_noselect = inifile_get_gboolean(OSS_NOSELECT,OSS_NOSELECT_DEFAULT); play_source = mainloop_time_source_add(NULL, oss_output_flush, NULL); /* When autodetecting, this is the last tested driver before the dummy, * so we might as well return TRUE */ return TRUE; } static void oss_quit(void) { mainloop_time_source_free(play_source); ringbuf_free(oss_output_buffer); } static int oss_errdlg_open(char *filename, int flags, gboolean silent) { int fd; gchar *c; fd = open(filename,flags); if (fd == -1 && !silent) { c = g_strdup_printf(_("Could not open '%s': %s"),filename,strerror(errno)); user_error(c); g_free(c); } return fd; } static int oss_errdlg_ioctl(int filedes, int cmd, void *arg, gboolean silent) { int i; gchar *c; i = ioctl(filedes,cmd,arg); if (i == -1 && errno != EPIPE && !silent) { c = g_strdup_printf(_("Error in sound driver: ioctl failed: %s"),strerror(errno)); user_error(c); g_free(c); } return i; } static gint oss_try_format(Dataformat *format, gboolean input, gboolean silent) { gchar *fname; int i,j; /* For now, we just refuse floating-point format. We should probably * use a fallback format instead */ if (format->type == DATAFORMAT_FLOAT) return -1; /* Determine the right format */ oss_samplesize = format->samplesize; switch (oss_samplesize) { case 1: oss_format = (format->sign) ? AFMT_S8 : AFMT_U8; break; case 2: if (!format->bigendian) oss_format = (format->sign) ? AFMT_S16_LE : AFMT_U16_LE; else oss_format = (format->sign) ? AFMT_S16_BE : AFMT_U16_BE; break; case 3: case 4: if (!format->sign) return -1; if (format->packing == 2) return -1; /* This is really hairy, but the AFMT_S32-constants don't seem to be * defined in all soundcard.h files */ if (format->bigendian) { #ifdef AFMT_S32_BE oss_format = AFMT_S32_BE; #else return -1; #endif } else { #ifdef AFMT_S32_LE oss_format = AFMT_S32_LE; #else return -1; #endif } break; default: g_assert_not_reached(); } /* Open the file */ fname = inifile_get(OSS_PCMFILE_PLAYBACK,OSS_PCMFILE_DEFAULT); if (input) fname = inifile_get(OSS_PCMFILE_RECORD, fname); oss_fd = oss_errdlg_open(fname, input ? O_RDONLY : O_WRONLY, silent); if (oss_fd == -1) return silent?-1:+1; /* Try to set the format */ j = oss_format; i = oss_errdlg_ioctl(oss_fd, SNDCTL_DSP_SETFMT, &j, silent); if (i == -1 || j != oss_format) { close(oss_fd); oss_fd=-1; return (i != -1 || silent)?-1:+1; } /* Try to set the number of channels */ j = oss_channels = format->channels; i = oss_errdlg_ioctl(oss_fd, SNDCTL_DSP_CHANNELS, &j, silent); if (i==-1 || j != oss_channels) { close(oss_fd); oss_fd=-1; return (i != -1 || silent)?-1:+1; } /* Try to set the sample rate */ j = oss_samplerate = format->samplerate; i = oss_errdlg_ioctl(oss_fd, SNDCTL_DSP_SPEED, &j, silent); /* FIXME: Variable tolerance (esp. for input) */ /* Currently tolerates 5% difference between requested/received samplerate */ if (i==-1 || abs(j-oss_samplerate) > oss_samplerate/20) { close(oss_fd); oss_fd=-1; return (i != -1 || silent)?-1:+1; } /* Everything went well! */ oss_samplebytes_in = oss_samplebytes_out = oss_channels * oss_samplesize; if (oss_samplesize == 3) oss_samplebytes_out += oss_channels; return 0; } static gint oss_output_select_format(Dataformat *format, gboolean silent, GVoidFunc ready_func) { return oss_try_format(format,FALSE,silent); } static gint oss_input_select_format(Dataformat *format, gboolean silent, GVoidFunc ready_func) { return oss_try_format(format,TRUE,silent); } static int oss_errdlg_write(int fd, gchar *buffer, size_t size) { ssize_t s; gchar *c; s = write(fd,buffer,size); if (s == -1) { c = g_strdup_printf(_("Error in sound driver: write failed: %s"),strerror(errno)); user_error(c); g_free(c); } return s; } static int oss_errdlg_read(int fd, gchar *buffer, size_t size) { ssize_t s; gchar *c; s = read(fd,buffer,size); if (s == -1) { c = g_strdup_printf(_("Error in sound driver: read failed: %s"),strerror(errno)); user_error(c); g_free(c); } return s; } static int oss_output_flush(gpointer ts, GTimeVal *tv, gpointer ud) { fd_set a; struct timeval t = { 0 }; int i; guint u; gchar *c; audio_buf_info info; /* printf("oss_output_flush: ringbuf_available: %d\n",ringbuf_available(oss_output_buffer)); */ /* Do we have anything to write at all? */ if (ringbuf_available(oss_output_buffer) == 0) return 0; /* Do a select call and see if it's ready for writing */ if (!oss_noselect) { FD_ZERO(&a); FD_SET(oss_fd, &a); i = select(FD_SETSIZE, NULL, &a, NULL, &t); if (i==-1) { c = g_strdup_printf(_("Error in sound driver: select failed: %s"),strerror(errno)); user_error(c); return 2000; } if (i==0) return 50; } #ifdef SNDCTL_DSP_GETOSPACE /* Now do an ioctl call to check the number of writable bytes */ i = oss_errdlg_ioctl(oss_fd, SNDCTL_DSP_GETOSPACE, &info, TRUE); if (i == -1 && errno == EPIPE) { /* This is a workaround for a bug in ALSA 0.9.6 OSS emulation, where * this call can return "broken pipe", especially after a * SNDCTL_DSP_RESET call. */ info.fragments = 1024; info.fragsize = 1*2*3*4; } else if (i == -1) return 0; #else /* Fill in dummy values */ info.fragments = 1024; info.fragsize = 1*2*3*4; #endif /* Calculate the number of bytes to write (into u) */ u = ringbuf_available(oss_output_buffer); if (u > info.fragsize) u -= u % info.fragsize; u = MIN(u, info.fragments*info.fragsize); if (u == 0) return 50; /* Write it out! */ c = g_malloc(u); ringbuf_dequeue(oss_output_buffer, c, u); i = oss_errdlg_write(oss_fd, c, u); g_free(c); return 10; } static gboolean oss_output_want_data(void) { /* oss_output_flush(); */ return (ringbuf_freespace(oss_output_buffer) >= oss_samplebytes_out); } static guint oss_output_play(gchar *buffer, guint bufsize) { guint u=0; GTimeVal t; guint bs0 = bufsize; /* 24-bit samples need padding */ if (oss_samplesize == 3) { while (bufsize >= 3 && ringbuf_freespace(oss_output_buffer)>=oss_samplebytes_out) { for (u=0; u bufsize) u = bufsize; /* Make sure we store whole samples */ u -= u%(oss_samplebytes_out); if (u>0) u = ringbuf_enqueue(oss_output_buffer, buffer, u); buffer += u; bufsize -= u; } if (ringbuf_freespace(oss_output_buffer) < oss_samplebytes_out && !mainloop_time_source_enabled(play_source)) { puts("Starting time source"); g_get_current_time(&t); mainloop_time_source_restart(play_source,&t); } g_assert(bufsize == 0 || bufsize >= oss_samplebytes_in); printf("oss_output_play, bs0: %d, u: %d\n",bs0,u); /* oss_output_flush(); */ return bs0 ? u : ringbuf_available(oss_output_buffer); } static void oss_output_clear_buffers(void) { #ifdef SNDCTL_DSP_RESET ioctl(oss_fd, SNDCTL_DSP_RESET); #endif ringbuf_drain(oss_output_buffer); } static gboolean oss_output_stop(gboolean must_flush) { if (oss_fd == -1) return TRUE; if (must_flush) while (ringbuf_available(oss_output_buffer)>0) { oss_output_flush(NULL,NULL,NULL); do_yield(TRUE); } else oss_output_clear_buffers(); close(oss_fd); oss_fd = -1; /* printf("oss_stop: oss_delay_time = %f\n",oss_delay_time); */ ringbuf_drain(oss_output_buffer); return must_flush; } static void oss_input_stop(void) { if (oss_fd >= 0) close(oss_fd); oss_fd = -1; } static void oss_input_store(Ringbuf *buffer) { fd_set a; struct timeval t = { 0 }; int i; guint u; gchar *c; audio_buf_info info; /* Do a select call to see if data is available */ if (!oss_noselect) { FD_ZERO(&a); FD_SET(oss_fd, &a); i = select(FD_SETSIZE, &a, NULL, NULL, &t); if (i==-1) { c = g_strdup_printf(_("Error in sound driver: select failed: %s"),strerror(errno)); user_error(c); return; } if (i==0) return; } /* Calculate the number of bytes to read (into buffer) */ /* If we don't know how much data is available, don't read more than 0.1 * seconds to avoid GUI latency... */ u = ringbuf_freespace(buffer); #ifdef SNDCTL_DSP_GETISPACE /* Now do an ioctl call to check the number of readable bytes */ /* Note: It seems as ALSA 0.9's OSS emulation returns 0 for this call... */ i = oss_errdlg_ioctl(oss_fd, SNDCTL_DSP_GETISPACE, &info, TRUE); if (i > 0 && i < u) u=i; else u = MIN(u,oss_samplesize*oss_channels*oss_samplerate/50); #else u = MIN(u,oss_samplesize*oss_channels*oss_samplerate/50); #endif if (u == 0) return; /* Read it! */ c = g_malloc(u); i = oss_errdlg_read(oss_fd, c, u); if (i != -1) ringbuf_enqueue(buffer, c, i); g_free(c); } struct oss_prefdlg { GtkWindow *wnd; GtkEntry *pcmdev_playback; GtkEntry *pcmdev_record; GtkToggleButton *noselect; }; static void oss_preferences_ok(GtkButton *button, struct oss_prefdlg *pd) { inifile_set(OSS_PCMFILE_PLAYBACK, (char *)gtk_entry_get_text(pd->pcmdev_playback)); inifile_set(OSS_PCMFILE_RECORD, (char *)gtk_entry_get_text(pd->pcmdev_record)); oss_noselect = gtk_toggle_button_get_active(pd->noselect); inifile_set_gboolean(OSS_NOSELECT,oss_noselect); gtk_widget_destroy(GTK_WIDGET(pd->wnd)); } static void oss_preferences(void) { GtkWidget *a,*b,*c,*d; struct oss_prefdlg *pd; gchar *q; pd = g_malloc(sizeof(struct oss_prefdlg)); a = gtk_window_new(GTK_WINDOW_DIALOG); gtk_window_set_modal(GTK_WINDOW(a),TRUE); gtk_window_set_title(GTK_WINDOW(a),_("OSS preferences")); gtk_window_set_position(GTK_WINDOW(a),GTK_WIN_POS_CENTER); gtk_container_set_border_width(GTK_CONTAINER(a),5); gtk_signal_connect_object(GTK_OBJECT(a),"destroy",GTK_SIGNAL_FUNC(g_free), (GtkObject *)pd); pd->wnd = GTK_WINDOW(a); b = gtk_vbox_new(FALSE,5); gtk_container_add(GTK_CONTAINER(a),b); c = gtk_hbox_new(FALSE,3); gtk_container_add(GTK_CONTAINER(b),c); d = gtk_label_new(_("Playback device file:")); gtk_container_add(GTK_CONTAINER(c),d); d = gtk_entry_new(); q = inifile_get(OSS_PCMFILE_PLAYBACK,OSS_PCMFILE_DEFAULT); gtk_entry_set_text(GTK_ENTRY(d),q); gtk_container_add(GTK_CONTAINER(c),d); pd->pcmdev_playback = GTK_ENTRY(d); c = gtk_hbox_new(FALSE,3); gtk_container_add(GTK_CONTAINER(b),c); d = gtk_label_new(_("Recording device file:")); gtk_container_add(GTK_CONTAINER(c),d); d = gtk_entry_new(); gtk_entry_set_text(GTK_ENTRY(d),inifile_get(OSS_PCMFILE_RECORD,q)); gtk_container_add(GTK_CONTAINER(c),d); pd->pcmdev_record = GTK_ENTRY(d); c = gtk_check_button_new_with_label(_("Avoid select calls (try this if " "recording locks up)")); gtk_container_add(GTK_CONTAINER(b),c); oss_noselect = inifile_get_gboolean(OSS_NOSELECT,OSS_NOSELECT_DEFAULT); pd->noselect = GTK_TOGGLE_BUTTON(c); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(c),oss_noselect); c = gtk_hseparator_new(); gtk_container_add(GTK_CONTAINER(b),c); c = gtk_hbutton_box_new(); gtk_container_add(GTK_CONTAINER(b),c); d = gtk_button_new_with_label(_("OK")); gtk_signal_connect(GTK_OBJECT(d),"clicked", GTK_SIGNAL_FUNC(oss_preferences_ok),pd); gtk_container_add(GTK_CONTAINER(c),d); d = gtk_button_new_with_label(_("Close")); gtk_signal_connect_object(GTK_OBJECT(d),"clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy), GTK_OBJECT(a)); gtk_container_add(GTK_CONTAINER(c),d); gtk_widget_show_all(a); } mhwaveedit-1.4.24/src/sound-portaudio.c000066400000000000000000000230371334022513400200300ustar00rootroot00000000000000/* * Copyright (C) 2002 2003 2004 2005 2009 2012, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include #include #include #include #include "ringbuf.h" #include "sound.h" #include "main.h" #include "gettext.h" static struct { gboolean delay_time_set; gfloat delay_time; off_t played_bytes; guint32 samplerate; gint samplesize; guint framesize; GTimeVal start_time; Ringbuf *output_buffer, *input_buffer; int input_overrun_count; PaDeviceID out, in; PortAudioStream *outstream, *instream; } portaudio_data = { 0 }; // Anropas innan ngra andra output_-anrop och fre gtk_init. static gboolean portaudio_init(gboolean silent) { Pa_Initialize(); portaudio_data.output_buffer = ringbuf_new( inifile_get_guint32(INI_SETTING_SOUNDBUFSIZE, INI_SETTING_SOUNDBUFSIZE_DEFAULT) ); portaudio_data.input_buffer = ringbuf_new(65536); portaudio_data.out = Pa_GetDefaultOutputDeviceID(); portaudio_data.in = Pa_GetDefaultInputDeviceID(); if (portaudio_data.out == paNoDevice) g_warning ( _("sound-portaudio: No output devices available!") ); if (portaudio_data.in == paNoDevice) g_warning ( _("sound-portaudio: No input devices available!") ); return TRUE; } // Anropas till sist static void portaudio_quit(void) { ringbuf_free(portaudio_data.output_buffer); Pa_Terminate(); } static gboolean portaudio_samplerate_supported(const PaDeviceInfo *i, guint32 samplerate) { int x; if (i->numSampleRates == -1) { return (samplerate >= i->sampleRates[0] && samplerate <= i->sampleRates[1]); } else { for (x=0; xnumSampleRates; x++) if (i->sampleRates[x] == samplerate) return TRUE; return FALSE; } } static PaSampleFormat portaudio_fmtparse(Dataformat *format) { if (format->type == DATAFORMAT_FLOAT) { if (format->samplesize == sizeof(float)) return paFloat32; else return 0; } if (XOR(format->bigendian,IS_BIGENDIAN)) return 0; switch (format->samplesize) { case 1: return format->sign ? paInt8 : paUInt8; case 2: return format->sign ? paInt16 : 0; case 3: return format->sign ? paPackedInt24 : 0; case 4: if (format->packing == 0) return format->sign ? paInt32 : 0; else if (format->packing == 1) return format->sign ? paInt24 : 0; else return 0; default: g_assert_not_reached(); return 0; } } static gboolean portaudio_samplesize_supported(const PaDeviceInfo *i, Dataformat *format) { return ((i->nativeSampleFormats & portaudio_fmtparse(format))!=0); } static gboolean portaudio_output_supports_format(Dataformat *format) { const PaDeviceInfo *i = NULL; if (portaudio_data.out != paNoDevice) i = Pa_GetDeviceInfo(portaudio_data.out); return (i && format->channels <= i->maxOutputChannels && portaudio_samplerate_supported(i,format->samplerate) && portaudio_samplesize_supported(i,format)); } static gboolean portaudio_output_stop(gboolean must_flush) { if (!portaudio_data.outstream) return TRUE; if (must_flush) { /* Note: We must check the ringbuffer after checking if the * stream is inactive to avoid races */ if (Pa_StreamActive(portaudio_data.outstream)==0 && !ringbuf_isempty(portaudio_data.output_buffer)) Pa_StartStream(portaudio_data.outstream); while (!ringbuf_isempty(portaudio_data.output_buffer)) do_yield(TRUE); } Pa_StopStream(portaudio_data.outstream); Pa_CloseStream(portaudio_data.outstream); portaudio_data.outstream = NULL; ringbuf_drain(portaudio_data.output_buffer); return must_flush; } static void portaudio_output_clear_buffers(void) { Pa_AbortStream(portaudio_data.outstream); ringbuf_drain(portaudio_data.output_buffer); } static gboolean portaudio_output_want_data(void) { return !ringbuf_isfull(portaudio_data.output_buffer); } static int portaudio_output_callback(void *inputBuffer, void *outputBuffer, unsigned long framesPerBuffer, PaTimestamp outTime, void *userData) { guint32 i,j; i = ringbuf_dequeue(portaudio_data.output_buffer,outputBuffer, framesPerBuffer*portaudio_data.framesize); j = framesPerBuffer * portaudio_data.framesize - i; if (j>0) memset(((gchar *)outputBuffer)+i, 0, j); portaudio_data.played_bytes += i; return 0; } // output_select_format anropas alltid innan output_play static gint portaudio_output_select_format(Dataformat *format, gboolean silent) { PaError err; if (!portaudio_output_supports_format(format)) return -1; portaudio_data.played_bytes = 0; err = Pa_OpenStream(&portaudio_data.outstream, paNoDevice, 0, 0, NULL, /* input */ portaudio_data.out, format->channels, portaudio_fmtparse(format), NULL,/*out*/ (double)format->samplerate, 256, 0, paClipOff|paDitherOff, portaudio_output_callback,NULL); if (err != 0) { printf(_("Pa_OpenStream failed: %s\n"),Pa_GetErrorText(err)); return -1; } portaudio_data.samplerate = format->samplerate; portaudio_data.samplesize = format->samplesize; portaudio_data.framesize = format->samplesize * format->channels; return 0; } static guint portaudio_output_play(gchar *buffer, guint bufsize) { guint32 i; GTimeVal nowtime,r; PaTimestamp p; if (!bufsize) return ringbuf_available(portaudio_data.output_buffer); i = ringbuf_enqueue(portaudio_data.output_buffer,buffer,bufsize); /* To avoid buffer underruns, wait until there is some data in the output * buffer... */ if (Pa_StreamActive(portaudio_data.outstream)==0 && ringbuf_available(portaudio_data.output_buffer)>4096) { Pa_StartStream(portaudio_data.outstream); g_get_current_time(&portaudio_data.start_time); portaudio_data.delay_time_set = FALSE; } if (!portaudio_data.delay_time_set) { p = Pa_StreamTime( portaudio_data.outstream ); if (p>0) { g_get_current_time(&nowtime); timeval_subtract(&r,&portaudio_data.start_time,&nowtime); portaudio_data.delay_time = (gfloat)r.tv_sec + (gfloat)r.tv_usec/1000000.0 - p / (gfloat)portaudio_data.samplerate; portaudio_data.delay_time_set = TRUE; } } return i; } static GList *portaudio_input_supported_formats(gboolean *complete) { *complete = (portaudio_data.in == paNoDevice); return NULL; } static gboolean portaudio_input_supports_format(Dataformat *format) { const PaDeviceInfo *i = NULL; i = Pa_GetDeviceInfo(portaudio_data.in); return (i && format->channels <= i->maxOutputChannels && portaudio_samplerate_supported(i,format->samplerate) && portaudio_samplesize_supported(i,format)); } static int portaudio_input_callback(void *inputBuffer, void *outputBuffer, unsigned long framesPerBuffer, PaTimestamp outTime, void *userData) { // puts("input_callback"); ringbuf_enqueue(portaudio_data.input_buffer,inputBuffer, framesPerBuffer*portaudio_data.framesize); if (ringbuf_isfull(portaudio_data.input_buffer)) { puts(_("Buffer overrun!")); portaudio_data.input_overrun_count ++; } memset(outputBuffer,0,framesPerBuffer*portaudio_data.framesize); /* hack */ return 0; } static gint portaudio_input_select_format(Dataformat *format, gboolean silent) { PaError err; /*printf("in = %d, numInputChannels = %d, inputSampleFormat = %d\n",in, format->channels,fmtparse(format->samplesize,format->sign)); */ if (!portaudio_input_supports_format(format)) return -1; portaudio_data.input_overrun_count = 0; /* PortAudio seems to act strangely when no output device is specified */ err = Pa_OpenStream( &portaudio_data.instream, portaudio_data.in, format->channels, portaudio_fmtparse(format), NULL, /*in*/ portaudio_data.out, format->channels, portaudio_fmtparse(format), NULL, /*out*/ (double)format->samplerate, 64, 0, paClipOff, portaudio_input_callback, NULL); if (err != 0) { printf(_("Pa_OpenStream failed: %s\n"),Pa_GetErrorText(err)); return -1; } portaudio_data.samplerate = format->samplerate; portaudio_data.framesize = format->samplesize * format->channels; Pa_StartStream(portaudio_data.instream); return 0; } static void portaudio_input_stop(void) { if (!portaudio_data.instream) return; Pa_AbortStream(portaudio_data.instream); Pa_CloseStream(portaudio_data.instream); portaudio_data.instream = NULL; ringbuf_drain(portaudio_data.input_buffer); } static void portaudio_input_store(Ringbuf *buffer) { ringbuf_transfer(portaudio_data.input_buffer,buffer); } static int portaudio_input_overrun_count(void) { return portaudio_data.input_overrun_count; } mhwaveedit-1.4.24/src/sound-pulse.c000066400000000000000000000773161334022513400171630ustar00rootroot00000000000000/* * Copyright (C) 2008 2009 2011 2012, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include #include #ifndef PA_CHECK_VERSION #define PA_CHECK_VERSION(a,b,c) (0) #endif #undef MLDEBUG /* ----------------------- */ /* Mainloop API */ struct pulse_api_io_event { gpointer iosource; int fd; pa_io_event_flags_t events; gpointer userdata; pa_io_event_cb_t cb; pa_io_event_destroy_cb_t destroy_cb; }; struct pulse_api_time_event { gpointer timesource; pa_time_event_cb_t cb; pa_time_event_destroy_cb_t destroy_cb; void *userdata; }; struct pulse_api_defer_event { gpointer constsource; pa_defer_event_cb_t cb; pa_defer_event_destroy_cb_t destroy_cb; void *userdata; }; struct pulse_api_userdata { gpointer *sources; int sources_cap; int sources_len; }; static pa_mainloop_api *pulse_api(void); #ifdef MLDEBUG static void pulse_api_list_sources(struct pulse_api_userdata *ud) { int i; printf("sources: "); for (i=0; isources_len; i++) printf("%p ",ud->sources[i]); puts(""); } #endif static void pulse_api_source_added(gpointer src, struct pa_mainloop_api *api) { struct pulse_api_userdata *ud = (struct pulse_api_userdata *)api->userdata; #ifdef MLDEBUG printf("pulse_api_source_added: %p\n",src); #endif if (ud->sources_cap == ud->sources_len) { if (ud->sources_cap == 0) ud->sources_cap = 1; else ud->sources_cap *= 2; ud->sources = g_realloc(ud->sources, ud->sources_cap*sizeof(ud->sources[0])); } ud->sources[ud->sources_len++] = src; #ifdef MLDEBUG pulse_api_list_sources(ud); #endif } static void pulse_api_source_removed(gpointer src, struct pa_mainloop_api *api) { struct pulse_api_userdata *ud = (struct pulse_api_userdata *)api->userdata; int i; #ifdef MLDEBUG printf("pulse_api_source_removed: %p\n",src); #endif for (i=0; isources_len; i++) if (ud->sources[i] == src) break; for (; i+1sources_len; i++) ud->sources[i] = ud->sources[i+1]; ud->sources_len--; #ifdef MLDEBUG pulse_api_list_sources(ud); #endif } static int pa_to_poll(pa_io_event_flags_t events) { int i = 0; if (events & PA_IO_EVENT_INPUT) i |= POLLIN; if (events & PA_IO_EVENT_OUTPUT) i |= POLLOUT; if (events & PA_IO_EVENT_HANGUP) i |= POLLHUP; if (events & PA_IO_EVENT_ERROR) i |= POLLERR; return i; } static pa_io_event_flags_t poll_to_pa(int events) { pa_io_event_flags_t e = PA_IO_EVENT_NULL; if (events & POLLIN) e |= PA_IO_EVENT_INPUT; if (events & POLLOUT) e |= PA_IO_EVENT_OUTPUT; if (events & POLLHUP) e |= PA_IO_EVENT_HANGUP; if (events & PA_IO_EVENT_ERROR) e |= POLLERR; return e; } static void pulse_api_io_cb(gpointer iosource, int fd, gushort revents, gpointer user_data) { struct pulse_api_io_event *e = user_data; /* puts("I/O event triggered"); */ e->cb(pulse_api(),(pa_io_event *)e,fd,poll_to_pa(revents),e->userdata); } static pa_io_event *pulse_api_io_new(pa_mainloop_api *a, int fd, pa_io_event_flags_t events, pa_io_event_cb_t cb, void *userdata) { struct pulse_api_io_event *e; #ifdef MLDEBUG printf("Adding I/O event, fd=%d, events=%d\n",fd,events); #endif e = g_malloc(sizeof(*e)); e->userdata = userdata; e->fd = fd; e->events = events; e->cb = cb; e->destroy_cb = NULL; e->iosource = mainloop_io_source_add(fd, pa_to_poll(events), pulse_api_io_cb, e); pulse_api_source_added(e->iosource,a); return (pa_io_event *)e; } static void pulse_api_io_enable(pa_io_event *e, pa_io_event_flags_t events) { struct pulse_api_io_event *es = (struct pulse_api_io_event *)e; #ifdef MLDEBUG printf("IO event set enable, fd=%d ,events=%d, es->events=%d\n", es->fd,events,es->events); #endif mainloop_io_source_set_events(es->iosource,pa_to_poll(events)); } static void pulse_api_io_free(pa_io_event *e) { struct pulse_api_io_event *es = (struct pulse_api_io_event *)e; #ifdef MLDEBUG printf("Removing IO event (fd %d)\n",es->fd); #endif mainloop_io_source_free(es->iosource); pulse_api_source_removed(es->iosource, pulse_api()); if (es->destroy_cb) es->destroy_cb(pulse_api(),e,es->userdata); g_free(es); } static void pulse_api_io_set_destroy(pa_io_event *e, pa_io_event_destroy_cb_t cb) { struct pulse_api_io_event *es = (struct pulse_api_io_event *)e; es->destroy_cb = cb; } static gint pa_api_time_new_cb(gpointer timesource, GTimeVal *current_time, gpointer user_data) { struct pulse_api_time_event *es = (struct pulse_api_time_event *)user_data; struct timeval tv; /* puts("Time event triggered"); */ tv.tv_sec = current_time->tv_sec; tv.tv_usec = current_time->tv_usec; es->cb(pulse_api(),(pa_time_event *)es,&tv,es->userdata); return 0; } static pa_time_event *pulse_api_time_new(pa_mainloop_api *a, const struct timeval *tv, pa_time_event_cb_t cb, void *userdata) { struct pulse_api_time_event *es; GTimeVal gtv; #ifdef MLDEBUG GTimeVal temp_tv; g_get_current_time(&temp_tv); printf("Adding time event, triggers in %d s %d us\n", tv->tv_sec-temp_tv.tv_sec, tv->tv_usec-temp_tv.tv_usec); #endif es = g_malloc(sizeof(*es)); es->cb = cb; es->destroy_cb = NULL; es->userdata = userdata; gtv.tv_sec = tv->tv_sec; gtv.tv_usec = tv->tv_usec; es->timesource = mainloop_time_source_add(>v,pa_api_time_new_cb,es); pulse_api_source_added(es->timesource, a); return (pa_time_event *)es; } static void pulse_api_time_restart(pa_time_event *e, const struct timeval *tv) { struct pulse_api_time_event *es = (struct pulse_api_time_event *)e; GTimeVal gtv; /* GTimeVal temp_tv; g_get_current_time(&temp_tv); printf("Restarting time event, triggers in %d s %d us\n", tv->tv_sec-temp_tv.tv_sec, tv->tv_usec-temp_tv.tv_usec); */ gtv.tv_sec = tv->tv_sec; gtv.tv_usec = tv->tv_usec; mainloop_time_source_restart(es->timesource,>v); } static void pulse_api_time_free(pa_time_event *e) { struct pulse_api_time_event *es = (struct pulse_api_time_event *)e; #ifdef MLDEBUG puts("Removing time event"); #endif mainloop_time_source_free(es->timesource); if (es->destroy_cb) es->destroy_cb(pulse_api(),e,es->userdata); pulse_api_source_removed(es->timesource, pulse_api()); g_free(es); } static void pulse_api_time_set_destroy(pa_time_event *e, pa_time_event_destroy_cb_t cb) { struct pulse_api_time_event *es = (struct pulse_api_time_event *)e; es->destroy_cb = cb; } static int pulse_api_defer_new_cb(gpointer csource, gpointer user_data) { struct pulse_api_defer_event *es = user_data; #ifdef MLDEBUG puts("Defer event triggered"); #endif es->cb(pulse_api(),(pa_defer_event *)es,es->userdata); return 0; } static pa_defer_event *pulse_api_defer_new(pa_mainloop_api *a, pa_defer_event_cb_t cb, void *userdata) { struct pulse_api_defer_event *es; #ifdef MLDEBUG puts("Adding defer event"); #endif es = g_malloc(sizeof(*es)); es->cb = cb; es->destroy_cb = NULL; es->userdata = userdata; es->constsource = mainloop_constant_source_add(pulse_api_defer_new_cb, es, FALSE); pulse_api_source_added(es->constsource,a); return (pa_defer_event *)es; } static void pulse_api_defer_enable(pa_defer_event *e, int b) { struct pulse_api_defer_event *es = (struct pulse_api_defer_event *)e; #ifdef MLDEBUG printf("Defer event set enabled=%d\n",b); #endif mainloop_constant_source_enable(es->constsource, b); } static void pulse_api_defer_free(pa_defer_event *e) { struct pulse_api_defer_event *es = (struct pulse_api_defer_event *)e; #ifdef MLDEBUG puts("Removing defer event"); #endif mainloop_constant_source_free(es->constsource); if (es->destroy_cb) es->destroy_cb(pulse_api(),e,es->userdata); pulse_api_source_removed(es->constsource,pulse_api()); g_free(es); } static void pulse_api_defer_set_destroy(pa_defer_event *e, pa_defer_event_destroy_cb_t cb) { struct pulse_api_defer_event *es = (struct pulse_api_defer_event *)e; es->destroy_cb = cb; } static void pulse_api_quit(pa_mainloop_api *a, int retval) { } static pa_mainloop_api *pulse_api(void) { static gboolean api_setup = FALSE; static struct pa_mainloop_api api; struct pulse_api_userdata *ud; if (!api_setup) { api.io_new = pulse_api_io_new; api.io_enable = pulse_api_io_enable; api.io_free = pulse_api_io_free; api.io_set_destroy = pulse_api_io_set_destroy; api.time_new = pulse_api_time_new; api.time_restart = pulse_api_time_restart; api.time_free = pulse_api_time_free; api.time_set_destroy = pulse_api_time_set_destroy; api.defer_new = pulse_api_defer_new; api.defer_enable = pulse_api_defer_enable; api.defer_free = pulse_api_defer_free; api.defer_set_destroy = pulse_api_defer_set_destroy; api.quit = pulse_api_quit; ud = g_malloc0(sizeof(*ud)); api.userdata = ud; api_setup = TRUE; } return &api; } static void pulse_api_block(void) { gpointer *srcp; struct pulse_api_userdata *ud = (struct pulse_api_userdata *)(pulse_api()->userdata); #ifdef MLDEBUG puts("pulse_api_block"); pulse_api_list_sources(ud); #endif srcp = g_malloc(ud->sources_len * sizeof(ud->sources[0])); memcpy(srcp,ud->sources,ud->sources_len*sizeof(ud->sources[0])); mainloop_recurse_on(srcp, ud->sources_len); g_free(srcp); } /* -------------------------------- * Driver core */ static struct { pa_context *ctx; pa_context_state_t ctx_state; int ctx_errno; pa_stream *stream; pa_stream_state_t stream_state; pa_sample_spec stream_sspec; pa_buffer_attr stream_attr; pa_stream_flags_t stream_flags; gboolean record_flag; const char *record_data; size_t record_bytes,record_pos; gint overflow_count,overflow_report_count; gboolean flush_state; /* 0 = no flush requested yet, 1 = waiting, 2 = done */ gboolean recursing_mainloop; gpointer ready_constsource; GVoidFunc ready_func; gboolean stopping; } pulse_data = { 0 }; static void pulse_context_state_cb(pa_context *c, void *userdata) { g_assert(pulse_data.ctx == c); pulse_data.ctx_state = pa_context_get_state(c); /* printf("Context state change to: %d\n",pulse_data.ctx_state); */ if (pulse_data.ctx_state == PA_CONTEXT_FAILED || pulse_data.ctx_state == PA_CONTEXT_TERMINATED) { pulse_data.ctx_errno = pa_context_errno(pulse_data.ctx); pa_context_unref(pulse_data.ctx); pulse_data.ctx = NULL; } } static gboolean pulse_connect(gboolean autospawn, gboolean silent) { gchar *c; int i; if (pulse_data.ctx != NULL) return TRUE; pulse_data.ctx = pa_context_new(pulse_api(),"mhwaveedit"); g_assert(pulse_data.ctx != NULL); pulse_data.ctx_state = PA_CONTEXT_UNCONNECTED; pa_context_set_state_callback(pulse_data.ctx,pulse_context_state_cb, NULL); i = pa_context_connect(pulse_data.ctx, NULL, autospawn?0:PA_CONTEXT_NOAUTOSPAWN, NULL); g_assert(i == 0 || pulse_data.ctx == NULL); while (pulse_data.ctx_state != PA_CONTEXT_READY && pulse_data.ctx_state != PA_CONTEXT_FAILED && pulse_data.ctx_state != PA_CONTEXT_TERMINATED) pulse_api_block(); if (!silent && pulse_data.ctx_state != PA_CONTEXT_READY) { c = g_strdup_printf(_("Connection to PulseAudio server failed: %s"), pa_strerror(pulse_data.ctx_errno)); user_error(c); g_free(c); } return (pulse_data.ctx != NULL); } static gboolean pulse_init(gboolean silent) { return pulse_connect(FALSE,silent); } static void pulse_quit(void) { if (pulse_data.ctx != NULL) { pa_context_disconnect(pulse_data.ctx); /* Should be unref:d and set to NULL by the state callback */ g_assert(pulse_data.ctx == NULL); } } #if PA_CHECK_VERSION(0,9,15) #define HAS24 #endif static gboolean format_to_pulse(Dataformat *format, pa_sample_spec *ss_out) { pa_sample_format_t sf; if (format->type == DATAFORMAT_PCM) { if (format->samplesize == 1 && !format->sign) sf = PA_SAMPLE_U8; else if (format->samplesize == 2 && format->sign) sf = (format->bigendian)?PA_SAMPLE_S16BE:PA_SAMPLE_S16LE; #ifdef HAS24 else if (format->samplesize == 3 && format->sign) sf = (format->bigendian)?PA_SAMPLE_S24BE:PA_SAMPLE_S24LE; #endif else if (format->samplesize == 4 && format->sign) { if (format->packing == 0 || format->packing == 1) sf = (format->bigendian)?PA_SAMPLE_S32BE:PA_SAMPLE_S32LE; #ifdef HAS24 else sf = (format->bigendian)?PA_SAMPLE_S24_32LE:PA_SAMPLE_S24_32BE; #endif } else return TRUE; } else if (format->type == DATAFORMAT_FLOAT && format->samplesize == 4) { if (!ieee_le_compatible && !ieee_be_compatible) return TRUE; else if (format->bigendian) sf = PA_SAMPLE_FLOAT32BE; else sf = PA_SAMPLE_FLOAT32LE; } else return TRUE; ss_out->format = sf; ss_out->rate = format->samplerate; ss_out->channels = format->channels; return FALSE; } static gboolean pa_format_from_pulse(pa_sample_spec *ss, Dataformat *format_out) { Dataformat f; int i = ss->format; switch (i) { case PA_SAMPLE_U8: case PA_SAMPLE_S16LE: case PA_SAMPLE_S16BE: #ifdef HAS24 case PA_SAMPLE_S24LE: case PA_SAMPLE_S24BE: case PA_SAMPLE_S24_32LE: case PA_SAMPLE_S24_32BE: #endif case PA_SAMPLE_S32LE: case PA_SAMPLE_S32BE: f.type = DATAFORMAT_PCM; f.packing = 0; if (i == PA_SAMPLE_U8) f.samplesize = 1; else if (i == PA_SAMPLE_S16LE || i == PA_SAMPLE_S16BE) { f.samplesize = 2; #ifdef HAS24 } else if (i == PA_SAMPLE_S24LE || i == PA_SAMPLE_S24BE) f.samplesize = 3; else if (i == PA_SAMPLE_S24_32LE || i == PA_SAMPLE_S24_32LE) { f.samplesize = 4; f.packing = 2; #endif } else f.samplesize = 4; f.sign = !(i == PA_SAMPLE_U8); if (i == PA_SAMPLE_S16BE || i == PA_SAMPLE_S32BE #ifdef HAS24 || i == PA_SAMPLE_S24BE || i == PA_SAMPLE_S24_32BE #endif ) f.bigendian = TRUE; else f.bigendian = FALSE; break; case PA_SAMPLE_FLOAT32LE: if (!ieee_le_compatible && !ieee_be_compatible) return TRUE; f.type = DATAFORMAT_FLOAT; f.samplesize = 4; f.bigendian = FALSE; break; case PA_SAMPLE_FLOAT32BE: if (!ieee_le_compatible && !ieee_be_compatible) return TRUE; f.type = DATAFORMAT_FLOAT; f.samplesize = 4; f.bigendian = TRUE; break; default: return TRUE; } f.channels = ss->channels; f.samplebytes = f.samplesize * f.channels; f.samplerate = ss->rate; memcpy(format_out,&f,sizeof(Dataformat)); return FALSE; } static void pulse_stream_state_cb(pa_stream *p, void *userdata) { g_assert(pulse_data.stream == p); pulse_data.stream_state = pa_stream_get_state(p); /* printf("Stream state change to: %d\n",pulse_data.stream_state); */ if (pulse_data.stream_state == PA_STREAM_FAILED || pulse_data.stream_state == PA_STREAM_TERMINATED) { pa_stream_unref(pulse_data.stream); pulse_data.stream = NULL; } } static void pulse_overflow_func(pa_stream *p, void *userdata) { pulse_data.overflow_count ++; } static int pulse_wait_connect(int silent) { gchar *c; pulse_data.recursing_mainloop = TRUE; while (pulse_data.stream_state != PA_STREAM_READY && pulse_data.stream_state != PA_STREAM_FAILED && pulse_data.stream_state != PA_STREAM_TERMINATED) pulse_api_block(); pulse_data.recursing_mainloop = FALSE; if (!silent && pulse_data.stream_state != PA_STREAM_READY) { c = g_strdup_printf(_("Connection to PulseAudio server failed: %s"), pa_strerror(pa_context_errno(pulse_data.ctx))); user_error(c); g_free(c); return 1; } return 0; } static gint pulse_select_format_main(Dataformat *format, gboolean record, gboolean silent, pa_stream_request_cb_t ready_func, gpointer rf_userdata) { pa_sample_spec ss; int i; guint32 u; /* printf("pulse_output_select_format, silent==%d\n",silent); */ if (format_to_pulse(format,&ss)) return -1; if (!pulse_connect(TRUE,silent)) return silent?-1:+1; g_assert(pulse_data.stream == NULL); pulse_data.record_flag = record; pulse_data.record_data = NULL; pulse_data.stream_state = PA_STREAM_UNCONNECTED; pulse_data.stream = pa_stream_new(pulse_data.ctx, "p", &ss, NULL); g_assert(pulse_data.stream != NULL); memcpy(&pulse_data.stream_sspec, &ss, sizeof(pa_sample_spec)); pa_stream_set_state_callback(pulse_data.stream, pulse_stream_state_cb, NULL); if (record) { pa_stream_set_read_callback(pulse_data.stream,ready_func,rf_userdata); pulse_data.overflow_count = pulse_data.overflow_report_count = 0; pa_stream_set_overflow_callback(pulse_data.stream, pulse_overflow_func,NULL); } else pa_stream_set_write_callback(pulse_data.stream,ready_func, rf_userdata); memset(&pulse_data.stream_attr, 0xFF, sizeof(pulse_data.stream_attr)); pulse_data.stream_flags = 0; if (record) { pulse_data.stream_flags |= PA_STREAM_ADJUST_LATENCY; pulse_data.stream_attr.fragsize = (format->samplerate * format->samplebytes) / 10; } else { u = inifile_get_guint32("pulseLatency", 0); if (u != 0) { pulse_data.stream_flags |= PA_STREAM_ADJUST_LATENCY; pulse_data.stream_attr.tlength = (u * format->samplerate * format->samplebytes) / 1000; } } if (record) i = pa_stream_connect_record(pulse_data.stream,NULL, &pulse_data.stream_attr, pulse_data.stream_flags); else i = pa_stream_connect_playback(pulse_data.stream,NULL, &pulse_data.stream_attr, pulse_data.stream_flags,NULL, NULL); g_assert(i == 0 || pulse_data.stream == NULL); if (pulse_wait_connect(silent)) return 1; if (pulse_data.stream_state != PA_STREAM_READY) return -1; return 0; } static int ready_constsource_cb(gpointer csource, gpointer user_data) { g_assert(pulse_data.stream != NULL); mainloop_constant_source_enable(csource, FALSE); pulse_data.ready_func(); return 0; } static void pulse_ready_func(pa_stream *p, size_t bytes, void *userdata) { if (!pulse_data.stopping) mainloop_constant_source_enable(pulse_data.ready_constsource, TRUE); } static void ready_constsource_setup(void) { if (pulse_data.ready_constsource == NULL) pulse_data.ready_constsource = mainloop_constant_source_add(ready_constsource_cb,NULL,FALSE); mainloop_constant_source_enable(pulse_data.ready_constsource, FALSE); } static gint pulse_output_select_format(Dataformat *format, gboolean silent, GVoidFunc ready_func) { ready_constsource_setup(); pulse_data.ready_func = ready_func; return pulse_select_format_main(format,FALSE,silent, pulse_ready_func,NULL); } static gint pulse_input_select_format(Dataformat *format, gboolean silent, GVoidFunc ready_func) { ready_constsource_setup(); pulse_data.ready_func = ready_func; return pulse_select_format_main(format,TRUE,silent, pulse_ready_func,NULL); } static gboolean pulse_output_want_data(void) { size_t s; if (pulse_data.stream == NULL) return FALSE; s = pa_stream_writable_size(pulse_data.stream); return (s > 0); } static void pulse_flush_success_cb(pa_stream *s, int success, void *userdata) { gchar *c; if (!success) { c = g_strdup_printf(_("Failed to drain stream: %s"), pa_strerror(pa_context_errno(pulse_data.ctx))); user_error(c); g_free(c); } /* puts("pulse_flush_success_cb"); */ pulse_data.flush_state = 2; } static void pulse_flush_start(void) { pa_operation *o; /* puts("pulse_flush_start"); */ if (pulse_data.flush_state != 0) return; pulse_data.flush_state = 1; o = pa_stream_drain(pulse_data.stream, pulse_flush_success_cb, NULL); g_assert(o != NULL); pa_operation_unref(o); } static gboolean pulse_flush_done(void) { return (pulse_data.flush_state == 2); } static gboolean pulse_flush_in_progress(void) { return (pulse_data.flush_state == 1); } static guint pulse_output_play(gchar *buffer, guint bufsize) { int i; size_t s; if (pulse_data.stream == NULL) return 0; if (buffer == NULL) { g_assert(bufsize == 0); pulse_flush_start(); return pulse_flush_done()?0:1; } s = pa_stream_writable_size(pulse_data.stream); if (bufsize > s) bufsize = s; i = pa_stream_write(pulse_data.stream, buffer, bufsize, NULL, 0, PA_SEEK_RELATIVE); g_assert(i == 0); if (pulse_data.flush_state == 2) pulse_data.flush_state = 0; if (bufsize < s) mainloop_constant_source_enable(pulse_data.ready_constsource,TRUE); return bufsize; } static void pulse_output_clear_buffers(void) { pa_operation *p; int i; if (pulse_data.stream == NULL) return; if (inifile_get_gboolean("pulseReconnect",TRUE)) { pa_stream_set_write_callback(pulse_data.stream, NULL, NULL); pa_stream_set_state_callback(pulse_data.stream, NULL, NULL); pa_stream_disconnect(pulse_data.stream); pa_stream_unref(pulse_data.stream); pulse_data.stream_state = PA_STREAM_UNCONNECTED; pulse_data.stream = pa_stream_new(pulse_data.ctx, "p", &pulse_data.stream_sspec, NULL); pa_stream_set_state_callback(pulse_data.stream, pulse_stream_state_cb, NULL); pa_stream_set_write_callback(pulse_data.stream,pulse_ready_func, NULL); i = pa_stream_connect_playback(pulse_data.stream,NULL, &pulse_data.stream_attr, pulse_data.stream_flags,NULL, NULL); g_assert(i==0 && pulse_data.stream!=NULL); i = pulse_wait_connect(0); g_assert(pulse_data.stream_state == PA_STREAM_READY || (i != 0 && pulse_data.stream==NULL) ); } else { p = pa_stream_flush(pulse_data.stream, NULL, NULL); pa_operation_unref(p); } } static gboolean pulse_output_stop(gboolean must_flush) { /* puts("pulse_output_stop"); */ if (pulse_data.ready_constsource != NULL) mainloop_constant_source_enable(pulse_data.ready_constsource,FALSE); pulse_data.stopping = 1; if (pulse_data.stream != NULL) { if (must_flush || pulse_flush_in_progress()) { pulse_flush_start(); pulse_data.recursing_mainloop = TRUE; while (!pulse_flush_done()) pulse_api_block(); pulse_data.recursing_mainloop = FALSE; } pulse_data.flush_state = 0; pa_stream_disconnect(pulse_data.stream); pulse_data.recursing_mainloop = TRUE; while (pulse_data.stream != NULL) pulse_api_block(); pulse_data.recursing_mainloop = FALSE; } pulse_data.stopping = 0; return FALSE; } static gboolean pulse_needs_polling(void) { return FALSE; } struct pulse_scb_data { pa_sample_spec ss; gboolean is_set; }; static void pulse_source_info_cb(pa_context *c, const pa_source_info *i, int eol, gpointer userdata) { struct pulse_scb_data *dp = (struct pulse_scb_data *)userdata; if (eol) return; memcpy(&(dp->ss),&(i->sample_spec),sizeof(pa_sample_spec)); dp->is_set = TRUE; } /* PA 0.9.12-? has a bug where passing @DEFAULT_SOURCE@ doesn't work * Perform a quite messy workaround, ifdef:d with the * DEFUALT_SOURCE_BROKEN macro */ /* Becuase PA didn't introduce PA_MAJOR/MINOR/MICRO macros until 0.9.15, * this will have to be done for the older versions as well... */ #define DEFAULT_SOURCE_BROKEN #ifdef DEFAULT_SOURCE_BROKEN static void pulse_output_info_cb(pa_context *c, const pa_source_output_info *i, int eol, void *userdata) { int *idxp = (int *)userdata; if (eol || *idxp >= 0) return; *idxp = i->source; } static int pulse_get_default_source_index(pa_context *c) { pa_stream *str; pa_sample_spec ss; int i; pa_stream_state_t state; pa_operation *oper; pa_operation_state_t oper_state; int idx; int srcidx; ss.format = PA_SAMPLE_S16LE; ss.rate = 44100; ss.channels = 2; str = pa_stream_new(c,"in_fmt_probe",&ss,NULL); g_assert(str != NULL); i = pa_stream_connect_record(str,NULL,NULL,0); g_assert(i == 0); while (1) { state = pa_stream_get_state(str); if (state != PA_STREAM_CREATING) break; pulse_api_block(); } if (state != PA_STREAM_READY) { printf("pa_stream_connect_record: %s\n", pa_strerror(pa_context_errno(c))); pa_stream_unref(str); return -1; } idx = pa_stream_get_index(str); /*printf("Calling get_source_output_info_by_index with index %d\n",idx);*/ srcidx = -1; oper = pa_context_get_source_output_info(c,idx, pulse_output_info_cb, &srcidx); while (1) { oper_state = pa_operation_get_state(oper); if (oper_state != PA_OPERATION_RUNNING) break; pulse_api_block(); } if (srcidx < 0) printf("pa_context_get_output_info_by_name: %s\n", pa_strerror(pa_context_errno(c))); pa_operation_unref(oper); pa_stream_disconnect(str); pa_stream_unref(str); return srcidx; } #endif static pa_operation *pulse_get_default_source_info(pa_context *c, pa_source_info_cb_t cb, void *userdata) { #ifdef DEFAULT_SOURCE_BROKEN int i; i = pulse_get_default_source_index(c); if (i < 0) return NULL; return pa_context_get_source_info_by_index(c,i,cb,userdata); #else return pa_context_get_source_info_by_name(c,"@DEFAULT_SOURCE@",cb, userdata); #endif } static GList *pulse_input_supported_formats(gboolean *complete) { pa_operation *p; struct pulse_scb_data d; Dataformat f,*pf; if (!pulse_connect(TRUE,TRUE)) { *complete = TRUE; return NULL; } d.is_set = FALSE; p = pulse_get_default_source_info(pulse_data.ctx, pulse_source_info_cb,&d); while (p != NULL && pa_operation_get_state(p) == PA_OPERATION_RUNNING) pulse_api_block(); if (p != NULL) pa_operation_unref(p); if (!d.is_set) { /* if (p != NULL) puts("Unexpected p!=NULL"); */ printf("get_default_source_info: %s\n", pa_strerror(pa_context_errno(pulse_data.ctx))); *complete = TRUE; return NULL; } if (pa_format_from_pulse(&d.ss,&f)) { printf("Unsupported input format: %s\n", pa_sample_format_to_string(d.ss.format)); *complete = TRUE; return NULL; } pf = g_malloc(sizeof(*pf)); memcpy(pf,&f,sizeof(Dataformat)); *complete = TRUE; return g_list_append(NULL,pf); } static void pulse_input_store(Ringbuf *buf) { int i; size_t b; if (pulse_data.overflow_report_count < pulse_data.overflow_count) { console_message("Overrun occured!"); pulse_data.overflow_report_count = pulse_data.overflow_count; } if (pulse_data.record_data == NULL) { i = pa_stream_peek(pulse_data.stream, (const void **)&pulse_data.record_data, &pulse_data.record_bytes); if (i != 0) { fprintf(stderr,"mhWaveEdit: pa_stream_peek: %s\n", pa_strerror(pa_context_errno(pulse_data.ctx))); return; } /* printf("pa_stream_peek: i=%d,data=%p,bytes=%d\n",i, pulse_data.record_data,pulse_data.record_bytes); */ pulse_data.record_pos = 0; } if (pulse_data.record_data == NULL) return; b = ringbuf_enqueue(buf, (gpointer)pulse_data.record_data+pulse_data.record_pos, pulse_data.record_bytes-pulse_data.record_pos); pulse_data.record_pos += b; if (pulse_data.record_pos >= pulse_data.record_bytes) { g_assert(pulse_data.record_pos == pulse_data.record_bytes); pa_stream_drop(pulse_data.stream); pulse_data.record_data = NULL; } else { mainloop_constant_source_enable(pulse_data.ready_constsource,TRUE); } } static void pulse_input_stop(void) { pulse_data.stopping = TRUE; if (pulse_data.ready_constsource != NULL) mainloop_constant_source_enable(pulse_data.ready_constsource,FALSE); if (pulse_data.stream != NULL) { g_assert(pulse_data.record_flag); pa_stream_disconnect(pulse_data.stream); pulse_data.recursing_mainloop = TRUE; while (pulse_data.stream != NULL) pulse_api_block(); pulse_data.recursing_mainloop = FALSE; } pulse_data.stopping = FALSE; } static int pulse_input_overrun_count(void) { /* Pulse does not report internal overruns in the source, * therefore just using the overflow_count could give a false * impression */ return -1; } /* -------------------------------- * Preferences UI */ struct pulse_prefs_ui { GtkWidget *wnd; GtkToggleButton *reconn; Intbox *pblat; }; static void pulse_prefs_ok(GtkButton *button, gpointer user_data) { struct pulse_prefs_ui *up = (struct pulse_prefs_ui *)user_data; if (intbox_check_limit(up->pblat,0,10000,_("playback latency"))) return; inifile_set_guint32("pulseLatency",up->pblat->val); inifile_set_gboolean("pulseReconnect", gtk_toggle_button_get_active(up->reconn)); gtk_widget_destroy(up->wnd); } static void pulse_preferences(void) { GtkWidget *a,*b,*c,*d; struct pulse_prefs_ui *up; up = g_malloc(sizeof(*up)); a = gtk_window_new(GTK_WINDOW_DIALOG); up->wnd = a; gtk_window_set_title(GTK_WINDOW(a),_("PulseAudio Preferences")); gtk_window_set_modal(GTK_WINDOW(a),TRUE); gtk_window_set_position(GTK_WINDOW(a),GTK_WIN_POS_MOUSE); gtk_container_set_border_width(GTK_CONTAINER(a),5); gtk_signal_connect_object(GTK_OBJECT(a),"destroy", GTK_SIGNAL_FUNC(g_free),(GtkObject *)up); b = gtk_vbox_new(FALSE,5); gtk_container_add(GTK_CONTAINER(a),b); c = gtk_hbox_new(FALSE,3); gtk_box_pack_start(GTK_BOX(b),c,FALSE,FALSE,0); d = gtk_label_new(_("Playback latency: ")); gtk_box_pack_start(GTK_BOX(c),d,FALSE,FALSE,0); d = intbox_new(inifile_get_guint32("pulseLatency",0)); up->pblat = INTBOX(d); gtk_box_pack_start(GTK_BOX(c),d,TRUE,TRUE,0); d = gtk_label_new(_("ms (0 for maximum)")); gtk_box_pack_start(GTK_BOX(c),d,FALSE,FALSE,0); c = gtk_check_button_new_with_label(_("Reconnect when moving playback")); up->reconn = GTK_TOGGLE_BUTTON(c); gtk_toggle_button_set_active(up->reconn,inifile_get_gboolean("pulseReconnect",TRUE)); gtk_box_pack_start(GTK_BOX(b),c,FALSE,FALSE,0); c = gtk_hseparator_new(); gtk_box_pack_end(GTK_BOX(b),c,FALSE,FALSE,0); c = gtk_hbutton_box_new(); gtk_box_pack_end(GTK_BOX(b),c,FALSE,FALSE,0); d = gtk_button_new_with_label(_("OK")); gtk_signal_connect(GTK_OBJECT(d),"clicked",GTK_SIGNAL_FUNC(pulse_prefs_ok), up); gtk_container_add(GTK_CONTAINER(c),d); d = gtk_button_new_with_label(_("Cancel")); gtk_signal_connect_object(GTK_OBJECT(d),"clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy), GTK_OBJECT(a)); gtk_container_add(GTK_CONTAINER(c),d); gtk_widget_show_all(a); } mhwaveedit-1.4.24/src/sound-sdl.c000066400000000000000000000074441334022513400166100ustar00rootroot00000000000000/* * Copyright (C) 2002 2003 2005, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include #include #include #include "SDL.h" #include "sound.h" #include "ringbuf.h" #include "gettext.h" static struct { Ringbuf *output_buffer; } sdl_data; static gboolean sdl_init(gboolean silent) { gchar *c; if (SDL_Init(SDL_INIT_AUDIO) == -1) { c = g_strdup_printf(_("Could not initialize SDL: %s"), SDL_GetError()); console_message(c); g_free(c); exit(1); } sdl_data.output_buffer = ringbuf_new ( inifile_get_guint32(INI_SETTING_SOUNDBUFSIZE, INI_SETTING_SOUNDBUFSIZE_DEFAULT) ); return TRUE; } static void sdl_quit(void) { SDL_Quit(); } static void sdl_output_callback(void *userdata, Uint8 *stream, int len) { guint32 ui; ui = ringbuf_dequeue ( sdl_data.output_buffer, stream, len ); if (ui < len) memset(stream+ui, 0, len-ui); } static gint sdl_output_select_format(Dataformat *format, gboolean silent, GVoidFunc ready_func) { gchar *c; SDL_AudioSpec desired; if (format->type == DATAFORMAT_FLOAT || format->samplesize > 2 || format->channels > 2) return -1; desired.freq = format->samplerate; if (format->sign) { if (format->samplesize == 1) desired.format = AUDIO_S8; else if (format->bigendian) desired.format = AUDIO_S16MSB; else desired.format = AUDIO_S16LSB; } else { if (format->samplesize == 1) desired.format = AUDIO_U8; else if (format->bigendian) desired.format = AUDIO_U16MSB; else desired.format = AUDIO_U16LSB; } desired.channels = format->channels; desired.samples = 512; desired.callback = sdl_output_callback; if (SDL_OpenAudio(&desired,NULL) < 0) { c = g_strdup_printf(_("SDL: Couldn't open audio: %s"), SDL_GetError()); console_message(c); g_free(c); return -1; } return 0; } static gboolean sdl_output_stop(gboolean must_flush) { if (must_flush) while (ringbuf_available(sdl_data.output_buffer) > 0) do_yield(TRUE); if (SDL_GetAudioStatus() != SDL_AUDIO_STOPPED) SDL_CloseAudio(); ringbuf_drain(sdl_data.output_buffer); return must_flush; } static void sdl_output_clear_buffers(void) { SDL_PauseAudio(1); ringbuf_drain(sdl_data.output_buffer); } static guint sdl_output_play(gchar *buffer, guint bufsize) { guint i; if (!bufsize) return ringbuf_available(sdl_data.output_buffer); SDL_LockAudio(); /* printf("output_play: before: %d,%d\n",ringbuf_available( sdl_data.output_buffer),ringbuf_freespace(sdl_data.output_buffer)); */ i = (guint)ringbuf_enqueue( sdl_data.output_buffer, buffer, bufsize ); /* printf("output_play: after: %d,%d\n", ringbuf_available(sdl_data.output_buffer), ringbuf_freespace(sdl_data.output_buffer)); */ SDL_UnlockAudio(); if (SDL_GetAudioStatus() == SDL_AUDIO_PAUSED) SDL_PauseAudio(0); return i; } static gboolean sdl_output_want_data(void) { return !ringbuf_isfull(sdl_data.output_buffer); } mhwaveedit-1.4.24/src/sound-sun.c000066400000000000000000000155031334022513400166260ustar00rootroot00000000000000/* * Copyright (C) 2004 2005, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include #include #include #include #include #include #include #include #include #include "gettext.h" /* Constant for output endian-ness */ /* IS_BIGENDIAN = same as CPU, TRUE = Always big endian, * FALSE = Always little endian */ #define SUNAUD_OUTPUT_ENDIAN IS_BIGENDIAN static gchar *sunaud_dev; static int sunaud_fd = -1; static Ringbuf *sunaud_output_buffer; static gboolean sunaud_output_drained; static Dataformat sunaud_format; static int sunaud_input_overruns; static void sunaud_output_flush(void); static gboolean sunaud_init(gboolean silent) { sunaud_dev = getenv("AUDIODEV"); if (!sunaud_dev) sunaud_dev = "/dev/audio"; sunaud_output_buffer = ringbuf_new( inifile_get_guint32(INI_SETTING_SOUNDBUFSIZE, INI_SETTING_SOUNDBUFSIZE_DEFAULT)); return TRUE; } static void sunaud_quit(void) { ringbuf_free(sunaud_output_buffer); } static gboolean sunaud_select_format(gboolean rec, Dataformat *format, gboolean silent) { audio_info_t info; audio_prinfo_t *prinfo; gchar *c; g_assert(sunaud_fd == -1); if (format->type == DATAFORMAT_FLOAT || !format->sign || XOR(format->bigendian,SUNAUD_OUTPUT_ENDIAN)) return TRUE; sunaud_fd = open(sunaud_dev,rec?O_RDONLY:O_WRONLY,O_NONBLOCK); if (sunaud_fd == -1) { c = g_strdup_printf(_("SunAudio: Couldn't open %s"),sunaud_dev); user_perror(c); g_free(c); return TRUE; } AUDIO_INITINFO(&info); if (rec) prinfo = &(info.record); else prinfo = &(info.play); prinfo->sample_rate = format->samplerate; prinfo->channels = format->channels; prinfo->precision = format->samplesize * 8; prinfo->encoding = AUDIO_ENCODING_LINEAR; if (ioctl(sunaud_fd, AUDIO_SETINFO, &info) < 0) { close(sunaud_fd); sunaud_fd = -1; return TRUE; } memcpy(&sunaud_format,format,sizeof(Dataformat)); if (!rec) { ringbuf_drain(sunaud_output_buffer); sunaud_output_drained = TRUE; } else sunaud_input_overruns = 0; return FALSE; } static gint sunaud_output_select_format(Dataformat *format, gboolean silent) { return sunaud_select_format(FALSE,format,silent) ? -1 : 0; } static gboolean sunaud_output_suggest_format(Dataformat *format, Dataformat *result) { if (format->type == DATAFORMAT_FLOAT) return FALSE; memcpy(result,format,sizeof(Dataformat)); result->sign = TRUE; result->bigendian = SUNAUD_OUTPUT_ENDIAN; return TRUE; } static gint sunaud_input_select_format(Dataformat *format, gboolean silent) { return sunaud_select_format(TRUE,format,silent) ? -1 : 0; } static gboolean sunaud_output_stop(gboolean must_flush) { if (must_flush) while (sunaud_fd >= 0 && !ringbuf_isempty(sunaud_output_buffer)) { sunaud_output_flush(); do_yield(TRUE); } if (sunaud_fd > 0) close(sunaud_fd); sunaud_fd = -1; return must_flush; } static gboolean sunaud_output_want_data(void) { static int call_count = 0; call_count++; if ((call_count & 4) == 0) sunaud_output_flush(); return !ringbuf_isfull(sunaud_output_buffer); } static void sunaud_output_flush(void) { static gchar buf[512]; static int bufsize=0,bufpos=0; int loopcount = 0; ssize_t sst; if (sunaud_output_drained) { bufsize = bufpos = 0; sunaud_output_drained = FALSE; } for (; loopcount < 5; loopcount++) { if (bufpos == bufsize) { bufsize = ringbuf_dequeue(sunaud_output_buffer,buf,sizeof(buf)); bufpos = 0; } if (bufsize == 0 || sunaud_fd < 0) return; sst = write(sunaud_fd,buf+bufpos,bufsize-bufpos); if (sst == 0) return; if (sst < 0) { if (errno == EAGAIN || errno == EBUSY || errno == EWOULDBLOCK) return; console_perror(_("SunAudio: Error writing to sound device")); close(sunaud_fd); sunaud_fd = -1; return; } bufpos += sst; } } static guint sunaud_output_play(gchar *buffer, guint bufsize) { guint32 ui,r; if (ringbuf_freespace(sunaud_output_buffer) < bufsize) { sunaud_output_flush(); ui = ringbuf_freespace(sunaud_output_buffer); if (ui > bufsize) ui = bufsize; ui -= ui % sunaud_format.samplebytes; } else ui = bufsize; r = ringbuf_enqueue(sunaud_output_buffer,buffer,ui); g_assert(r == ui); sunaud_output_flush(); return r; } static gfloat sunaud_output_play_min_delay_time(void) { return 0.0; } static guint32 sunaud_output_passive_buffer(void) { return ringbuf_available(sunaud_output_buffer); } static void sunaud_output_clear_buffers(void) { ringbuf_drain(sunaud_output_buffer); sunaud_output_drained = TRUE; ioctl(sunaud_fd,AUDIO_DRAIN,NULL); } static void sunaud_input_stop(void) { if (sunaud_fd >= 0) { close(sunaud_fd); sunaud_fd = -1; } } static void sunaud_input_overrun_check(void) { static gboolean last_state = FALSE; audio_info_t info; int i; gboolean b; if (ioctl(sunaud_fd,AUDIO_GETINFO,&info) < 0) { console_perror("ioctl"); return; } b = info.record.error != 0; if (!last_state && b) sunaud_input_overruns ++; last_state = b; } static void sunaud_input_store(Ringbuf *buffer) { gchar b[4096]; guint ui; ssize_t sst; gchar *c; guint32 r; sunaud_input_overrun_check(); ui = ringbuf_freespace(buffer); if (ui > sizeof(b)) ui = sizeof(b); ui -= ui % sunaud_format.samplebytes; if (ui == 0) return; if (sunaud_fd >= 0) { sst = read(sunaud_fd,b,ui); if (sst == -1 && (errno == EBUSY || errno == EAGAIN || errno == EWOULDBLOCK)) return; if (sst == -1) { user_perror(_("SunAudio: Error reading from sound device")); user_error(c); g_free(c); close(sunaud_fd); sunaud_fd = -1; return; } r = ringbuf_enqueue(buffer,b,sst); g_assert(r == sst); } } static int sunaud_input_overrun_count(void) { return sunaud_input_overruns; } mhwaveedit-1.4.24/src/sound.c000066400000000000000000000364301334022513400160250ustar00rootroot00000000000000/* * Copyright (C) 2002 2003 2004 2005 2008 2009 2010, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include #include "sound.h" #include "inifile.h" #include "main.h" #include "um.h" #include "gettext.h" #include "mainloop.h" gboolean output_byteswap_flag; static gchar *output_byteswap_buffer=NULL; static guint output_byteswap_bufsize=0; gboolean sound_lock_driver; static gboolean sound_delayed_quit=FALSE; static Dataformat playing_format; gboolean output_stereo_flag; static GVoidFunc output_ready_func=NULL,input_ready_func=NULL; static char zerobuf[1024]; static int output_play_count; static gboolean output_want_data_cached; #ifdef HAVE_ALSALIB #include "sound-alsalib.c" #endif #ifdef HAVE_OSS #include "sound-oss.c" #endif #ifdef HAVE_JACK #include "sound-jack.c" #endif #ifdef HAVE_SUN #include "sound-sun.c" #endif #if defined (HAVE_PORTAUDIO) #include "sound-portaudio.c" #endif #if defined (HAVE_SDL) #include "sound-sdl.c" #endif #ifdef HAVE_ESOUND #include "sound-esound.c" #endif #ifdef HAVE_ARTSC #include "sound-artsc.c" #endif #ifdef HAVE_PULSEAUDIO #include "sound-pulse.c" #endif #include "sound-dummy.c" static GList *input_supported_true(gboolean *complete) { *complete = FALSE; return NULL; } struct sound_driver { gchar *name, *id; void (*preferences)(void); gboolean (*init)(gboolean silent); void (*quit)(void); gint (*output_select_format)(Dataformat *format, gboolean silent, GVoidFunc ready_func); gboolean (*output_want_data)(void); guint (*output_play)(gchar *buffer, guint bufsize); gboolean (*output_stop)(gboolean); void (*output_clear_buffers)(void); gboolean (*output_suggest_format)(Dataformat *format, Dataformat *result); gboolean (*driver_needs_polling)(void); GList *(*input_supported_formats)(gboolean *complete); gint (*input_select_format)(Dataformat *format, gboolean silent, GVoidFunc ready_func); void (*input_store)(Ringbuf *buffer); void (*input_stop)(void); void (*input_stop_hint)(void); int (*input_overrun_count)(void); }; static struct sound_driver drivers[] = { #ifdef HAVE_OSS { "Open Sound System", "oss", oss_preferences, oss_init, oss_quit, oss_output_select_format, oss_output_want_data, oss_output_play, oss_output_stop, oss_output_clear_buffers,NULL,NULL, input_supported_true, oss_input_select_format, oss_input_store, oss_input_stop }, #endif #ifdef HAVE_ALSALIB { "ALSA", "alsa", alsa_show_preferences, alsa_init, alsa_quit, alsa_output_select_format, alsa_output_want_data, alsa_output_play, alsa_output_stop, alsa_output_clear_buffers,NULL,alsa_needs_polling, input_supported_true, alsa_input_select_format, alsa_input_store, alsa_input_stop, alsa_input_stop_hint,alsa_input_overrun_count }, #endif #ifdef HAVE_JACK { "JACK", "jack", mhjack_preferences, mhjack_init, mhjack_quit, mhjack_output_select_format, mhjack_output_want_data, mhjack_output_play, mhjack_output_stop, mhjack_clear_buffers, mhjack_output_suggest_format,NULL, mhjack_input_supported_formats, mhjack_input_select_format, mhjack_input_store, mhjack_input_stop, mhjack_input_stop, mhjack_get_xrun_count }, #endif #ifdef HAVE_SUN { "Sun audio", "sun", NULL, sunaud_init, sunaud_quit, sunaud_output_select_format, sunaud_output_want_data, sunaud_output_play, sunaud_output_stop, sunaud_output_clear_buffers, sunaud_output_suggest_format, NULL, input_supported_true,sunaud_input_select_format,sunaud_input_store, sunaud_input_stop,NULL,sunaud_input_overrun_count }, #endif #if defined (HAVE_PORTAUDIO) { "PortAudio", "pa", NULL, portaudio_init, portaudio_quit, portaudio_output_select_format, portaudio_output_want_data, portaudio_output_play, portaudio_output_stop, portaudio_output_clear_buffers, NULL, NULL, portaudio_input_supported_formats, portaudio_input_select_format, portaudio_input_store, portaudio_input_stop, NULL, portaudio_input_overrun_count }, #endif #if defined (HAVE_SDL) { N_("SDL (output only)"), "sdl", NULL, sdl_init, sdl_quit, sdl_output_select_format, sdl_output_want_data, sdl_output_play, sdl_output_stop, sdl_output_clear_buffers, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, #endif #ifdef HAVE_ESOUND { "ESound", "esound", esound_preferences, esound_init, esound_quit, esound_output_select_format, esound_output_want_data, esound_output_play, esound_output_stop, esound_output_clear_buffers, NULL, NULL, input_supported_true, esound_input_select_format, esound_input_store, esound_input_stop }, #endif #ifdef HAVE_ARTSC { "aRts", "arts", NULL, mharts_init, mharts_quit, mharts_output_select_format, mharts_output_want_data, mharts_output_play, mharts_output_stop, mharts_output_clear_buffers, mharts_output_suggest_format, NULL, input_supported_true, mharts_input_select_format, mharts_input_store, mharts_input_stop }, #endif #ifdef HAVE_PULSEAUDIO { "PulseAudio", "pulse", pulse_preferences, pulse_init, pulse_quit, pulse_output_select_format, pulse_output_want_data, pulse_output_play, pulse_output_stop, pulse_output_clear_buffers, NULL, pulse_needs_polling, pulse_input_supported_formats, pulse_input_select_format,pulse_input_store,pulse_input_stop,NULL, pulse_input_overrun_count }, #endif { N_("Dummy (no sound)"), "dummy", NULL, dummy_init, dummy_quit, dummy_output_select_format, dummy_output_want_data, dummy_output_play, dummy_output_stop, dummy_output_clear_buffers, NULL, NULL, dummy_input_supported_formats, dummy_input_select_format, dummy_input_store, dummy_input_stop } }; static guint current_driver = 0; /* Auto-detection order. */ static gchar *autodetect_order[] = { /* Sound servers. These must auto-detect properly */ "jack", "pulse", "esound", "arts", /* "Direct" API:s that don't auto-detect properly. * If compiled in they probably work. */ "alsa", "sun", /* "Direct" API:s that may or may not work and doesn't autodetect * properly */ "oss", /* Drivers that shouldn't be used unless everything else fails */ "pa", "sdl", "dummy", }; gchar *sound_driver_name(void) { return _(drivers[current_driver].name); } gchar *sound_driver_id(void) { return drivers[current_driver].id; } int sound_driver_index(void) { return current_driver; } GList *sound_driver_valid_names(void) { GList *l = NULL; int i; for (i=0; ichannels==1) return -1; if (sound_delayed_quit) { if (dataformat_equal(format,&playing_format)) { sound_delayed_quit = FALSE; output_ready_func = ready_func; return FALSE; } else delayed_output_stop(); } /* We "guard" using this flag to protect against recursive calls * to sound_poll (happens if driver calls user_error, for example) */ sound_select_in_progress = TRUE; /* Set up the variables before calling output_select_format, in * case the ready callback is called immediately */ memcpy(&playing_format,format,sizeof(Dataformat)); output_ready_func = ready_func; i = drivers[current_driver].output_select_format(format,silent, sound_output_ready_func); if (i != 0) output_ready_func = NULL; sound_select_in_progress = FALSE; output_play_count++; return i; } GList *input_supported_formats(gboolean *complete) { if (drivers[current_driver].input_supported_formats != NULL) return drivers[current_driver].input_supported_formats(complete); else { *complete = TRUE; return NULL; } } gboolean input_supported(void) { gboolean b; GList *l; l = input_supported_formats(&b); if (l != NULL) { g_list_foreach(l,(GFunc)g_free,NULL); g_list_free(l); return TRUE; } else return !b; } gint input_select_format(Dataformat *format, gboolean silent, GVoidFunc ready_func) { gint i; if (sound_delayed_quit) delayed_output_stop(); i = drivers[current_driver].input_select_format(format,silent,ready_func); if (i == 0) input_ready_func = ready_func; return i; } gboolean output_stop(gboolean must_flush) { output_ready_func = NULL; if (sound_lock_driver) { if (must_flush) while (output_play(NULL,0) > 0) { } else output_clear_buffers(); sound_delayed_quit=TRUE; return must_flush; } else { return drivers[current_driver].output_stop(must_flush); } } gboolean output_want_data(void) { if (!output_want_data_cached) output_want_data_cached = drivers[current_driver].output_want_data(); return output_want_data_cached; } guint output_play(gchar *buffer, guint bufsize) { if (bufsize > 0) output_want_data_cached = FALSE; if (output_byteswap_flag) { if (output_byteswap_bufsize < bufsize) { g_free(output_byteswap_buffer); output_byteswap_buffer = g_malloc(bufsize); output_byteswap_bufsize = bufsize; } memcpy(output_byteswap_buffer,buffer,bufsize); byteswap(output_byteswap_buffer,playing_format.samplesize,bufsize); buffer = output_byteswap_buffer; } if (bufsize > 0) output_play_count++; return drivers[current_driver].output_play(buffer,bufsize); } gboolean output_suggest_format(Dataformat *format, Dataformat *result) { if (output_stereo_flag && format->channels==1) { memcpy(result,format,sizeof(Dataformat)); result->channels = 2; return TRUE; } if (drivers[current_driver].output_suggest_format) return drivers[current_driver].output_suggest_format(format,result); else return FALSE; } void input_stop(void) { if (!sound_delayed_quit) drivers[current_driver].input_stop(); input_ready_func = NULL; } void input_store(Ringbuf *buffer) { drivers[current_driver].input_store(buffer); } void output_clear_buffers(void) { drivers[current_driver].output_clear_buffers(); } void input_stop_hint(void) { if (drivers[current_driver].input_stop_hint) drivers[current_driver].input_stop_hint(); } int input_overrun_count(void) { if (drivers[current_driver].input_overrun_count) return drivers[current_driver].input_overrun_count(); else return -1; } mhwaveedit-1.4.24/src/sound.h000066400000000000000000000165471334022513400160410ustar00rootroot00000000000000/* * Copyright (C) 2002 2003 2004 2005 2008 2009 2010, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #ifndef OUTPUT_H_INCLUDED #define OUTPUT_H_INCLUDED #include #include "main.h" #include "dataformat.h" #include "ringbuf.h" /* Possible states for sound driver: 1. Uninitialized (starting state) 2. Idle 3. Playing (or waiting for output) 4. Recording 5. Quitted (ending state) */ /* Global variable for selecting whether the sound driver should "lock" itself * onto the device. */ extern gboolean sound_lock_driver; /* Flag that decides whether output data should be byte-swapped. */ extern gboolean output_byteswap_flag; /* Flag that will refuse to play mono files and suggest stereo instead */ extern gboolean output_stereo_flag; /* --------------------------------- Functions available in all states --------------------------------- */ /* Returns the name of the current output driver. The string should not be * freed or modified. */ gchar *sound_driver_name(void); /* Returns the ID of the current output driver. The string should not be * freed or modified. */ gchar *sound_driver_id(void); /* Returns the index of the current output driver. */ int sound_driver_index(void); /* Returns a list of valid soundDriver names */ GList *sound_driver_valid_names(void); /* Translates a soundDriver name into an id. Returns NULL if name is not a * valid name. */ gchar *sound_driver_id_from_name(gchar *name); gchar *sound_driver_id_from_index(int index); /* Translates a soundDriver id into a name. Returns NULL if id is not a valid * driver ID. */ gchar *sound_driver_name_from_id(gchar *id); /* Returns whether a sound driver has a preferences dialog. If id==NULL the * current driver is used. */ gboolean sound_driver_has_preferences(gchar *id); /* Show the preferences dialog for a sound driver (if it exists). If id==NULL * the current driver is used. */ void sound_driver_show_preferences(gchar *id); /* ---------------------------------------------- * Functions available in state 1 (Uninitialized) * ---------------------------------------------- */ /* Sound module initialization. * Called before gtk_init. * Changes state to state 2 (Idle). */ void sound_init(void); /* ------------------------------------- * Functions available in state 2 (Idle) * ------------------------------------- */ /* For sound drivers that need periodic polling, this function checks for * readiness and calls the appropriate callbacks * Returns -1 if polling again periodically is not needed, * 0 if no work was done * +1 if work was done. */ gint sound_poll(void); /* Sound module cleanup. * Changes state to state 5 (Quitted) */ void sound_quit(void); /* Select which format to play and setup playing. * If the format isn't supported by the driver, the function does nothing and * returns <0 if no message displayed or >0 if message was displayed. * Changes state to state 3 (Playing) and returns FALSE if successful * * ready_func will be called whenever new data can be written. * ready_func is "edge-triggered", that is it is only called once and will not * be called again until you have called output_play with bufsize>0 */ gint output_select_format(Dataformat *format, gboolean silent, GVoidFunc ready_func); /* Suggest a format to use for playing back data of the input format. * Returns FALSE if no suggestion is available */ gboolean output_suggest_format(Dataformat *format, Dataformat *result); /* output_stop() - does nothing in this state */ /* Returns TRUE if input is supported by the driver. * The other input_*-routines will not be called if this function returns FALSE */ gboolean input_supported(void); /* Returns a list of supported input formats. *complete is set to true if * these are the only formats supported. */ GList *input_supported_formats(gboolean *complete); /* Select which format to record and setup recording. * If the format isn't supported by the driver, the function does nothing and * returns <0 if no message displayed or >0 if message was displayed. * Changes state to state 4 (Recording) and returns FALSE if successful. * ready_func will be called when there is new data available. * * On some drivers, ready_func may not be called until one call to input_store * has been made. Therefore, you should make sure to call input_store * once after this call succeeded. */ gint input_select_format(Dataformat *format, gboolean silent, GVoidFunc ready_func); /* input_stop() - does nothing in this state */ /* ---------------------------------------- * Functions available in state 3 (Playing) * ---------------------------------------- */ /* Stops playback. * Changes state to state 2 (Idle). * Can also be called in state 2, but should do nothing in that case. * * If must_flush is true the call will output all currently buffered * data before stopping. If must_flush is false it can still do so if * the driver's buffers are small. * * Returns true if all buffered output was sent. */ gboolean output_stop(gboolean must_flush); /* Returns TRUE iff it's possible to output more data (with output_play) */ gboolean output_want_data(void); /* Wait for output_want_data to return TRUE or a timeout expires. This call is * not supported on all drivers. It returns FALSE immediately if the call is not * supported */ gboolean output_wait(guint timeout); /* Send as much data as possible to the output device. * Return the amount of data sent. * * If bufsize=0 and buffer=NULL, the driver will go into "drain * mode". Each time it is called again with bufsize=0 and buffer=NULL, * some drivers will return the amount of data left in the buffers, * some return non-zero if drain is incomplete, and zero for complete * some return always zero * Calling output_play with data cancels the drain process. */ guint output_play(gchar *buffer, guint bufsize); /* Skips currently buffered data so we can start playing new data as quickly as * possible. */ void output_clear_buffers(void); /* ------------------------------------------ * Functions available in state 4 (Recording) * ------------------------------------------ */ /* Stops recording. * Changes state to state 2 (Idle). * Can also be called in state 2, but should do nothing in that case. */ void input_stop(void); /* Hints to the sound driver that we're about to stop and we really don't want * to gather any new data. */ void input_stop_hint(void); /* Stores recorded data into the buffer parameter. */ void input_store(Ringbuf *buffer); /* Returns number of input overruns since recording started or -1 if unknown. */ int input_overrun_count(void); #endif mhwaveedit-1.4.24/src/soxdialog.c000066400000000000000000000727471334022513400167010ustar00rootroot00000000000000/* * Copyright (C) 2003 2004 2005 2006 2007 2009 2012, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include #include #include #include #include #include #include #include "main.h" #include "soxdialog.h" #include "pipedialog.h" #include "effectbrowser.h" #include "inifile.h" #include "um.h" #include "gettext.h" static GtkObjectClass *parent_class; static gchar *supported_effects[] = { "echo","echos","reverb","chorus","flanger","phaser", "compand","pitch","stretch", "dcshift","mask","reverse","earwax","vibro", "lowp","highp","band", "lowpass","highpass","bandpass","bandreject","filter",NULL }; static gboolean sox_support_map[22] = { FALSE }; static gboolean v13_mode = FALSE; static gboolean v14_mode = FALSE; static gchar *supported_effect_names[] = { N_("Echo"), N_("Echo sequence"), N_("Reverb"), N_("Chorus"), N_("Flanger"), N_("Phaser"), N_("Compress/Expand"), N_("Pitch adjust"), N_("Time stretch"), N_("DC Shift"), N_("Masking noise"), N_("Reverse"), N_("Earwax"), N_("Vibro"), N_("Lowpass filter (single-pole)"), N_("Highpass filter (single-pole)"), N_("Bandpass filter"), N_("Butterworth lowpass filter"), N_("Butterworth highpass filter"), N_("Butterworth bandpass filter"), N_("Butterworth bandreject filter"), N_("Sinc-windowed filter"), NULL }; static gchar *samplesize_switch[] = { NULL,"-b","-w",NULL,"-l" }; static gchar *samplesize_switch_v13[] = { NULL,"-1","-2","-3","-4" }; #define COMPAND_LINES 6 void sox_dialog_format_string(gchar *buf, guint bufsize, Dataformat *fmt) { g_assert(fmt->type == DATAFORMAT_PCM && fmt->samplesize != 3 && fmt->packing == 0); if (v14_mode) g_snprintf(buf,bufsize,"-t raw -r %d -e %s -b %d -c %d",fmt->samplerate, fmt->sign?"signed":"unsigned",(8 * fmt->samplesize), fmt->channels); else if (v13_mode) g_snprintf(buf,bufsize,"-t raw -r %d %s %s -c %d",fmt->samplerate, fmt->sign?"-s":"-u",samplesize_switch_v13[fmt->samplesize], fmt->channels); else g_snprintf(buf,bufsize,"-t raw -r %d %s %s -c %d",fmt->samplerate, fmt->sign?"-s":"-u",samplesize_switch[fmt->samplesize], fmt->channels); } static Chunk *sox_dialog_apply_proc_main(Chunk *chunk, StatusBar *bar, gpointer user_data) { SoxDialog *sd = SOX_DIALOG(user_data); EffectDialog *ed = &(sd->ed); gchar fmt_buf[45]; gchar cmd_buf[512],*c; gchar *t1,*t2; gfloat f; guint i,j; gint idx; gboolean b; off_t clipcount = 0; Chunk *r; sox_dialog_format_string(fmt_buf,sizeof(fmt_buf),&(chunk->format)); g_snprintf(cmd_buf,sizeof(cmd_buf),"sox %s - %s - ",fmt_buf,fmt_buf); c=strchr(cmd_buf,0); if (!strcmp(ed->effect_name,"echo") || !strcmp(ed->effect_name,"echos") || !strcmp(ed->effect_name,"reverb") || !strcmp(ed->effect_name,"chorus") || !strcmp(ed->effect_name,"flanger") || !strcmp(ed->effect_name,"phaser")) { g_snprintf(fmt_buf,sizeof(fmt_buf),"sox_%s_gain",ed->effect_name); inifile_set_gfloat(fmt_buf,sd->fb1->val); if (!strcmp(ed->effect_name,"reverb")) { f = sd->fb2->val; inifile_set_gfloat("sox_reverb_rtime",f); } else f = 1.0; g_snprintf(c,sizeof(cmd_buf)-(c-cmd_buf),"%s %f %f",ed->effect_name, sd->fb1->val,f); for (i=0; ii1; i++) { if (sd->fba[0][i]->val > 0.0) { for (j=0; j<4; j++) if (sd->fba[j] != NULL) { c = strchr(c,0); g_snprintf(c,sizeof(cmd_buf)-(c-cmd_buf)," %f", sd->fba[j][i]->val); } if (sd->ca != NULL) { c = strchr(c,0); idx = combo_selected_index(sd->ca[i]); if (idx == 0) strcpy(c," -s"); else strcpy(c," -t"); } } } } else if (!strcmp(ed->effect_name,"lowp") || !strcmp(ed->effect_name,"highp") || !strcmp(ed->effect_name,"highp") || !strcmp(ed->effect_name,"band") || !strcmp(ed->effect_name,"lowpass") || !strcmp(ed->effect_name,"highpass") || !strcmp(ed->effect_name,"bandpass") || !strcmp(ed->effect_name,"bandreject")) { g_snprintf(fmt_buf,sizeof(fmt_buf),"sox_%s_freq",ed->effect_name); inifile_set_gfloat(fmt_buf,sd->fb1->val); if (sd->fb2 != NULL) { g_snprintf(fmt_buf,sizeof(fmt_buf),"sox_%s_width", ed->effect_name); inifile_set_gfloat(fmt_buf,sd->fb2->val); } if (sd->tb1 != NULL) inifile_set_gboolean("sox_band_noisemode", gtk_toggle_button_get_active(sd->tb1)); g_snprintf(c,sizeof(cmd_buf)-(c-cmd_buf),"%s %s %f", ed->effect_name, (sd->tb1!=NULL && gtk_toggle_button_get_active(sd->tb1))? "-n":"",sd->fb1->val); if (sd->fb2 != NULL) { c = strchr(c,0); g_snprintf(c,sizeof(cmd_buf)-(c-cmd_buf)," %f",sd->fb2->val); } } else if (!strcmp(ed->effect_name,"filter")) { inifile_set_guint32("sox_filter_type",sd->i1); inifile_set_guint32("sox_filter_low",sd->ib1->val); inifile_set_guint32("sox_filter_high",sd->ib2->val); inifile_set_guint32("sox_filter_length",sd->ib3->val); inifile_set_gfloat("sox_filter_beta",sd->fb1->val); if (sd->i1 == 0) g_snprintf(fmt_buf,sizeof(fmt_buf),"-%d",(int)sd->ib2->val); else if (sd->i1 == 1) g_snprintf(fmt_buf,sizeof(fmt_buf),"%d-",(int)sd->ib1->val); else g_snprintf(fmt_buf,sizeof(fmt_buf),"%d-%d",(int)sd->ib1->val, (int)sd->ib2->val); g_snprintf(c,sizeof(cmd_buf)-(c-cmd_buf),"filter %s %d %f",fmt_buf, (int)sd->ib3->val,sd->fb1->val); } else if (!strcmp(ed->effect_name,"compand")) { inifile_set_gfloat("sox_compand_attack",sd->fb1->val); inifile_set_gfloat("sox_compand_decay",sd->fb2->val); inifile_set_gfloat("sox_compand_gain",sd->fb3->val); inifile_set_gfloat("sox_compand_startvol",sd->fb4->val); inifile_set_gfloat("sox_compand_delay",sd->fb5->val); g_snprintf(c,sizeof(cmd_buf)-(c-cmd_buf),"compand %f,%f ", sd->fb1->val,sd->fb2->val); for (i=0; i0)?",%f,%f":"%f,%f", sd->fba[0][i]->val,sd->fba[1][i]->val); if (sd->fba[0][i]->val >= 0.0) break; } c = strchr(c,0); g_snprintf(c,sizeof(cmd_buf)-(c-cmd_buf)," %f %f %f",sd->fb3->val, sd->fb4->val,sd->fb5->val); } else if (!strcmp(ed->effect_name,"dcshift")) { b = gtk_toggle_button_get_active(sd->tb1); inifile_set_gfloat("sox_dcshift_amount",sd->fb1->val); inifile_set_gboolean("sox_dcshift_limiter",b); if (b) inifile_set_gfloat("sox_dcshift_gain",sd->fb2->val); if (b) g_snprintf(c,sizeof(cmd_buf)-(c-cmd_buf),"dcshift %f %f", sd->fb1->val,sd->fb2->val); else g_snprintf(c,sizeof(cmd_buf)-(c-cmd_buf),"dcshift %f", sd->fb1->val); } else if (!strcmp(ed->effect_name,"pitch")) { inifile_set_gfloat("sox_pitch_amount",sd->fb1->val); inifile_set_gfloat("sox_pitch_width",sd->fb2->val); t1 = combo_selected_string(sd->c1); t2 = combo_selected_string(sd->c2); g_snprintf(c,sizeof(cmd_buf)-(c-cmd_buf),"pitch %f %f %s %s", sd->fb1->val,sd->fb2->val,t1,t2); g_free(t1); g_free(t2); g_strdown(c); } else if (!strcmp(ed->effect_name,"stretch")) { inifile_set_gfloat("sox_stretch_factor",sd->fb1->val); inifile_set_gfloat("sox_stretch_window",sd->fb2->val); g_snprintf(c,sizeof(cmd_buf)-(c-cmd_buf),"stretch %f %f", sd->fb1->val,sd->fb2->val); } else if (!strcmp(ed->effect_name,"vibro")) { inifile_set_gfloat("sox_vibro_speed",sd->fb1->val); inifile_set_gfloat("sox_vibro_depth",sd->fb2->val); g_snprintf(c,sizeof(cmd_buf)-(c-cmd_buf),"vibro %f %f", sd->fb1->val,sd->fb2->val); } else if (!strcmp(ed->effect_name,"mask") || !strcmp(ed->effect_name,"earwax") || !strcmp(ed->effect_name,"reverse")) { strcpy(c,ed->effect_name); } else { g_assert_not_reached(); } r = pipe_dialog_pipe_chunk(chunk,cmd_buf,FALSE,dither_editing,bar, &clipcount); if (r != NULL && clipwarn(clipcount,TRUE)) { gtk_object_sink(GTK_OBJECT(r)); return NULL; } return r; } static Chunk *sox_dialog_apply_proc(Chunk *chunk, StatusBar *bar, gpointer user_data) { Chunk *c,*d,*r; Dataformat stype = { DATAFORMAT_PCM, 44100, 4, 1, 4, TRUE, IS_BIGENDIAN }; if ((chunk->format.type == DATAFORMAT_FLOAT) || (chunk->format.type == DATAFORMAT_PCM && (chunk->format.samplesize == 3 || chunk->format.packing!=0))) { c = chunk_convert_sampletype(chunk,&stype); d = sox_dialog_apply_proc_main(c,bar,user_data); gtk_object_sink(GTK_OBJECT(c)); r = chunk_convert_sampletype(d,&(chunk->format)); gtk_object_sink(GTK_OBJECT(d)); return r; } else return sox_dialog_apply_proc_main(chunk,bar,user_data); } static gboolean sox_dialog_apply(EffectDialog *ed) { SoxDialog *sd = SOX_DIALOG(ed); Document *d = EFFECT_BROWSER(ed->eb)->dl->selected; /* Chunk *chunk = d->chunk; */ guint i,j; /* if (chunk->format.samplesize != 1 && chunk->format.samplesize != 2 && chunk->format.samplesize != 4) { user_info(_("SoX only supports 8, 16 and 32-bit sample sizes")); return TRUE; } */ if ((sd->fb1!=NULL && floatbox_check(sd->fb1)) || (sd->fb2!=NULL && floatbox_check(sd->fb2)) || (sd->fb3!=NULL && floatbox_check(sd->fb3)) || (sd->fb4!=NULL && floatbox_check(sd->fb4)) || (sd->fb5!=NULL && floatbox_check(sd->fb5)) || (sd->ib1!=NULL && intbox_check(sd->ib1)) || (sd->ib2!=NULL && intbox_check(sd->ib2)) || (sd->ib3!=NULL && intbox_check(sd->ib3))) return TRUE; for (i=0; ifba); i++) if (sd->fba[i] != NULL) for (j=0; ji1; j++) if (floatbox_check(sd->fba[i][j])) return TRUE; return document_apply_cb(d,sox_dialog_apply_proc,TRUE,ed); } static void setup_filter(EffectDialog *ed, gchar *bw_name, gboolean nm) { SoxDialog *sd = SOX_DIALOG(ed); GtkWidget *a,*b; gchar c[64]; a = gtk_table_new(3,3,FALSE); gtk_container_add(GTK_CONTAINER(ed->input_area),a); attach_label(_("Frequency: "),a,0,0); g_snprintf(c,sizeof(c),"sox_%s_freq",ed->effect_name); b = floatbox_new(inifile_get_gfloat(c,440.0)); gtk_table_attach(GTK_TABLE(a),b,1,2,0,1,0,0,0,0); sd->fb1 = FLOATBOX(b); attach_label(_("Hz"),a,0,2); if (bw_name != NULL) { attach_label(bw_name,a,1,0); g_snprintf(c,sizeof(c),"sox_%s_width",ed->effect_name); b = floatbox_new(inifile_get_gfloat(c,50.0)); gtk_table_attach(GTK_TABLE(a),b,1,2,1,2,0,0,0,0); sd->fb2 = FLOATBOX(b); attach_label(_("Hz"),a,1,2); } if (nm) { b = gtk_check_button_new_with_label(_("Noise mode")); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(b), inifile_get_gboolean("sox_band_noisemode",FALSE)); gtk_table_attach(GTK_TABLE(a),b,0,3,2,3,0,0,0,0); sd->tb1 = GTK_TOGGLE_BUTTON(b); } gtk_widget_show_all(a); } static void sox_filter_type_changed(Combo *combo, gpointer user_data) { SoxDialog *sd = SOX_DIALOG(user_data); guint i; i = combo_selected_index(combo); sd->i1 = i; gtk_widget_set_sensitive(GTK_WIDGET(sd->ib1),(i==1 || i==2)); gtk_widget_set_sensitive(GTK_WIDGET(sd->ib2),(i==0 || i==2)); } #define ECHOS_MAX 7 static void setup_echo_column(SoxDialog *sd, GtkTable *t, guint col, gint lines) { guint i; GtkWidget *w; sd->fba[col] = g_malloc(lines*sizeof(EffectDialog *)); for (i=0; ifba[col][i] = FLOATBOX(w); gtk_table_attach(t,w,col,col+1,i+1,i+2,GTK_FILL,0,0,0); } } static void setup_echos(EffectDialog *ed, gchar *gain_name, gint lines, gboolean show_decay, gboolean show_speed, gboolean show_depth, gboolean show_mtype) { SoxDialog *sd = SOX_DIALOG(ed); GtkWidget *a,*b,*c; gchar buf[64]; guint i; GList *l; GtkRequisition req; sd->i1 = lines; a = gtk_vbox_new(FALSE,8); gtk_container_add(GTK_CONTAINER(ed->input_area),a); b = gtk_hbox_new(FALSE,2); gtk_box_pack_start(GTK_BOX(a),b,FALSE,FALSE,0); c = gtk_label_new(gain_name); gtk_box_pack_start(GTK_BOX(b),c,FALSE,FALSE,0); g_snprintf(buf,sizeof(buf),"sox_%s_gain",ed->effect_name); c = floatbox_new(inifile_get_gfloat(buf,1.0)); gtk_box_pack_start(GTK_BOX(b),c,FALSE,FALSE,0); sd->fb1 = FLOATBOX(c); if (!strcmp(ed->effect_name,"reverb")) { b = gtk_hbox_new(FALSE,2); gtk_box_pack_start(GTK_BOX(a),b,FALSE,FALSE,0); c = gtk_label_new(_("Reverb time: ")); gtk_box_pack_start(GTK_BOX(b),c,FALSE,FALSE,0); c = floatbox_new(inifile_get_gfloat("sox_reverb_rtime",500.0)); gtk_box_pack_start(GTK_BOX(b),c,FALSE,FALSE,0); sd->fb2 = FLOATBOX(c); c = gtk_label_new(_("ms")); gtk_box_pack_start(GTK_BOX(b),c,FALSE,FALSE,0); } b = gtk_table_new(lines+1,5,FALSE); gtk_box_pack_start(GTK_BOX(a),b,FALSE,FALSE,0); attach_label(_("Delay (ms) "),b,0,0); setup_echo_column(sd,GTK_TABLE(b),0,lines); if (show_decay) { attach_label(_("Decay "),b,0,1); setup_echo_column(sd,GTK_TABLE(b),1,lines); } if (show_speed) { attach_label(_("Speed (Hz) "),b,0,2); setup_echo_column(sd,GTK_TABLE(b),2,lines); } if (show_depth) { attach_label(_("Depth (ms) "),b,0,3); setup_echo_column(sd,GTK_TABLE(b),3,lines); } if (show_mtype) { attach_label(_("Modulation "),b,0,4); sd->ca = g_malloc(lines*sizeof(GtkCombo *)); l = NULL; l = g_list_append(l,translate_strip(N_("Modulation|Sinusoidal"))); l = g_list_append(l,translate_strip(N_("Modulation|Triangular"))); for (i=0; ica[i] = COMBO(c); combo_set_items(COMBO(c),l,0); gtk_table_attach(GTK_TABLE(b),c,4,5,i+1,i+2,GTK_FILL,0,0,0); } g_list_free(l); } b = gtk_label_new(_("(Lines with delay=0 will be ignored.)")); gtk_box_pack_start(GTK_BOX(a),b,FALSE,FALSE,0); gtk_widget_show_all(a); } static void toggle_sensitive(GtkToggleButton *togglebutton, gpointer user_data) { gtk_widget_set_sensitive(GTK_WIDGET(user_data), gtk_toggle_button_get_active(togglebutton)); } static void sox_dialog_browser_setup(EffectDialog *ed) { SoxDialog *sd = SOX_DIALOG(ed); GtkWidget *a,*b,*c,*w1; GList *l=NULL; guint i; if (!strcmp(ed->effect_name,"echo")) { setup_echos(ed,_("Input gain: "),ECHOS_MAX,TRUE,FALSE,FALSE,FALSE); } else if (!strcmp(ed->effect_name,"echos")) { setup_echos(ed,_("Input gain: "),ECHOS_MAX,TRUE,FALSE,FALSE,FALSE); } else if (!strcmp(ed->effect_name,"reverb")) { setup_echos(ed,_("Output gain: "),ECHOS_MAX,FALSE,FALSE,FALSE,FALSE); } else if (!strcmp(ed->effect_name,"chorus")) { setup_echos(ed,_("Input gain: "),ECHOS_MAX,TRUE,TRUE,TRUE,TRUE); } else if (!strcmp(ed->effect_name,"flanger")) { setup_echos(ed,_("Input gain: "),1,TRUE,TRUE,FALSE,TRUE); } else if (!strcmp(ed->effect_name,"phaser")) { setup_echos(ed,_("Input gain: "),1,TRUE,TRUE,FALSE,TRUE); } else if (!strcmp(ed->effect_name,"lowp")) { setup_filter(ed,NULL,FALSE); } else if (!strcmp(ed->effect_name,"highp")) { setup_filter(ed,NULL,FALSE); } else if (!strcmp(ed->effect_name,"band")) { setup_filter(ed,_("Width: "),TRUE); } else if (!strcmp(ed->effect_name,"lowpass")) { setup_filter(ed,NULL,FALSE); } else if (!strcmp(ed->effect_name,"highpass")) { setup_filter(ed,NULL,FALSE); } else if (!strcmp(ed->effect_name,"bandpass")) { setup_filter(ed,_("Bandwidth: "),FALSE); } else if (!strcmp(ed->effect_name,"bandreject")) { setup_filter(ed,_("Bandwidth: "),FALSE); } else if (!strcmp(ed->effect_name,"filter")) { sd->i1 = inifile_get_guint32("sox_filter_type",0); if (sd->i1 < 0 || sd->i1 > 2) sd->i1=0; a = gtk_table_new(6,3,FALSE); gtk_container_add(GTK_CONTAINER(ed->input_area),a); attach_label(_("Filter type: "),a,0,0); attach_label(_("Low 6dB corner: "),a,1,0); attach_label(_("Hz"),a,1,2); attach_label(_("High 6db corner: "),a,2,0); attach_label(_("Hz"),a,2,2); attach_label(_("Window length: "),a,4,0); attach_label(_("samples"),a,4,2); attach_label(_("Beta"),a,5,0); w1 = b = combo_new(); l = g_list_append(l,_("Lowpass")); l = g_list_append(l,_("Highpass")); l = g_list_append(l,_("Bandpass")); combo_set_items(COMBO(b),l,2); g_list_free(l); gtk_table_attach(GTK_TABLE(a),b,1,3,0,1,0,0,0,7); b = intbox_new(inifile_get_guint32("sox_filter_low",100)); sd->ib1 = INTBOX(b); gtk_table_attach(GTK_TABLE(a),b,1,2,1,2,GTK_FILL,0,0,0); b = intbox_new(inifile_get_gfloat("sox_filter_high",400)); sd->ib2 = INTBOX(b); gtk_table_attach(GTK_TABLE(a),b,1,2,2,3,GTK_FILL,0,0,0); b = gtk_fixed_new(); gtk_table_attach(GTK_TABLE(a),b,0,3,3,4,GTK_FILL,0,0,4); b = intbox_new(inifile_get_guint32("sox_filter_length",128)); sd->ib3 = INTBOX(b); gtk_table_attach(GTK_TABLE(a),b,1,2,4,5,GTK_FILL,0,0,0); b = floatbox_new(inifile_get_gfloat("sox_filter_beta",16.0)); sd->fb1 = FLOATBOX(b); gtk_table_attach(GTK_TABLE(a),b,1,2,5,6,GTK_FILL,0,0,0); gtk_signal_connect(GTK_OBJECT(w1),"selection_changed", GTK_SIGNAL_FUNC(sox_filter_type_changed),sd); combo_set_selection(COMBO(w1),sd->i1); gtk_widget_show_all(a); } else if (!strcmp(ed->effect_name,"compand")) { a = gtk_vbox_new(FALSE,8); gtk_container_add(GTK_CONTAINER(ed->input_area),a); b = gtk_table_new(2,3,FALSE); gtk_box_pack_start(GTK_BOX(a),b,FALSE,FALSE,0); attach_label(_("Attack integration time: "),b,0,0); c = floatbox_new(inifile_get_gfloat("sox_compand_attack",0.3)); gtk_table_attach(GTK_TABLE(b),c,1,2,0,1,0,0,0,0); sd->fb1 = FLOATBOX(c); attach_label(_(" seconds"),b,0,2); attach_label(_("Decay integration time: "),b,1,0); c = floatbox_new(inifile_get_gfloat("sox_compand_decay",1.0)); gtk_table_attach(GTK_TABLE(b),c,1,2,1,2,0,0,0,0); sd->fb2 = FLOATBOX(c); attach_label(_(" seconds"),b,1,2); b = gtk_table_new(2,COMPAND_LINES+1,FALSE); gtk_box_pack_start(GTK_BOX(a),b,FALSE,FALSE,0); attach_label(_("Input level (dB)"),b,0,0); attach_label(_("Output level (dB)"),b,1,0); sd->fba[0] = g_malloc(COMPAND_LINES*sizeof(Floatbox *)); sd->fba[1] = g_malloc(COMPAND_LINES*sizeof(Floatbox *)); for (i=0; ifba[0][i] = FLOATBOX(c); gtk_table_attach(GTK_TABLE(b),c,i+1,i+2,0,1,0,0,0,0); c = floatbox_new(0.0); sd->fba[1][i] = FLOATBOX(c); gtk_table_attach(GTK_TABLE(b),c,i+1,i+2,1,2,0,0,0,0); } b = gtk_table_new(3,3,FALSE); gtk_box_pack_start(GTK_BOX(a),b,FALSE,FALSE,0); attach_label(_("Post-processing gain: "),b,0,0); c = floatbox_new(inifile_get_gfloat("sox_compand_gain",0.0)); gtk_table_attach(GTK_TABLE(b),c,1,2,0,1,0,0,0,0); sd->fb3 = FLOATBOX(c); attach_label(_(" dB"),b,0,2); attach_label(_("Initial volume: "),b,1,0); c = floatbox_new(inifile_get_gfloat("sox_compand_startvol",0.0)); gtk_table_attach(GTK_TABLE(b),c,1,2,1,2,0,0,0,0); sd->fb4 = FLOATBOX(c); attach_label(_("Delay time: "),b,2,0); c = floatbox_new(inifile_get_gfloat("sox_compand_delay",0.0)); gtk_table_attach(GTK_TABLE(b),c,1,2,2,3,0,0,0,0); sd->fb5 = FLOATBOX(c); attach_label(_(" seconds"),b,2,2); gtk_widget_show_all(a); } else if (!strcmp(ed->effect_name,"dcshift")) { a = gtk_table_new(3,2,FALSE); gtk_container_add(GTK_CONTAINER(ed->input_area),a); attach_label(_("Shift amount: "),a,0,0); b = floatbox_new(inifile_get_gfloat("sox_dcshift_amount",0.0)); gtk_table_attach(GTK_TABLE(a),b,1,2,0,1,0,0,0,0); sd->fb1 = FLOATBOX(b); b = w1 = gtk_check_button_new_with_label(_("Peak limiter")); gtk_table_attach(GTK_TABLE(a),b,0,2,1,2,GTK_FILL,0,0,0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(b),TRUE); sd->tb1 = GTK_TOGGLE_BUTTON(b); attach_label(_("Limiter gain: "),a,2,0); b = floatbox_new(inifile_get_gfloat("sox_dcshift_gain",0.05)); gtk_table_attach(GTK_TABLE(a),b,1,2,2,3,0,0,0,0); sd->fb2 = FLOATBOX(b); gtk_signal_connect(GTK_OBJECT(w1),"toggled", GTK_SIGNAL_FUNC(toggle_sensitive),sd->fb2); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(w1), inifile_get_gboolean("sox_dcshift_limiter",FALSE)); gtk_widget_show_all(a); } else if (!strcmp(ed->effect_name,"pitch")) { a = gtk_table_new(4,3,FALSE); gtk_container_add(GTK_CONTAINER(ed->input_area),a); attach_label(_("Amount: "),a,0,0); attach_label(_(" cents"),a,0,2); attach_label(_("Window width: "),a,1,0); attach_label(_(" ms"),a,1,2); attach_label(_("Interpolation: "),a,2,0); attach_label(_("Fade: "),a,3,0); b = floatbox_new(inifile_get_gfloat("sox_pitch_amount",0.0)); gtk_table_attach(GTK_TABLE(a),b,1,2,0,1,GTK_FILL,0,0,0); sd->fb1 = FLOATBOX(b); b = floatbox_new(inifile_get_gfloat("sox_pitch_width",20.0)); gtk_table_attach(GTK_TABLE(a),b,1,2,1,2,GTK_FILL,0,0,0); sd->fb2 = FLOATBOX(b); b = combo_new(); gtk_table_attach(GTK_TABLE(a),b,1,3,2,3,0,0,0,0); l = g_list_append(NULL,translate_strip(N_("Interpolation|Cubic"))); l = g_list_append(l,translate_strip(N_("Interpolation|Linear"))); combo_set_items(COMBO(b),l,0); g_list_free(l); sd->c1 = COMBO(b); b = combo_new(); gtk_table_attach(GTK_TABLE(a),b,1,3,3,4,0,0,0,0); l = g_list_append(NULL,translate_strip(N_("Fade|Cos"))); l = g_list_append(l,translate_strip(N_("Fade|Hamming"))); l = g_list_append(l,translate_strip(N_("Fade|Linear"))); l = g_list_append(l,translate_strip(N_("Fade|Trapezoid"))); combo_set_items(COMBO(b),l,0); g_list_free(l); sd->c2 = COMBO(b); gtk_widget_show_all(a); } else if (!strcmp(ed->effect_name,"stretch")) { a = gtk_table_new(2,3,FALSE); gtk_container_add(GTK_CONTAINER(ed->input_area),a); attach_label(_("Factor: "),a,0,0); attach_label(_("Window size: "),a,1,0); attach_label(_(" ms"),a,1,2); b = floatbox_new(inifile_get_gfloat("sox_stretch_factor",1.0)); gtk_table_attach(GTK_TABLE(a),b,1,2,0,1,GTK_FILL,0,0,0); sd->fb1 = FLOATBOX(b); b = floatbox_new(inifile_get_gfloat("sox_stretch_window",20.0)); gtk_table_attach(GTK_TABLE(a),b,1,2,1,2,GTK_FILL,0,0,0); sd->fb2 = FLOATBOX(b); gtk_widget_show_all(a); } else if (!strcmp(ed->effect_name,"vibro")) { a = gtk_table_new(2,3,FALSE); gtk_container_add(GTK_CONTAINER(ed->input_area),a); attach_label(_("Speed: "),a,0,0); attach_label(_(" Hz"),a,0,2); attach_label(_("Depth: "),a,1,0); b = floatbox_new(inifile_get_gfloat("sox_vibro_speed",5.0)); gtk_table_attach(GTK_TABLE(a),b,1,2,0,1,GTK_FILL,0,0,0); sd->fb1 = FLOATBOX(b); b = floatbox_new(inifile_get_gfloat("sox_vibro_depth",0.5)); gtk_table_attach(GTK_TABLE(a),b,1,2,1,2,GTK_FILL,0,0,0); sd->fb2 = FLOATBOX(b); gtk_widget_show_all(a); } else if (!strcmp(ed->effect_name,"mask") || !strcmp(ed->effect_name,"earwax") || !strcmp(ed->effect_name,"reverse")) { a = gtk_label_new(_("This effect has no options.")); gtk_container_add(GTK_CONTAINER(ed->input_area),a); gtk_widget_show(a); } else { /* The effect name doesn't match any of the known ones. This shouldn't happen. */ g_assert_not_reached(); } } static void sox_dialog_destroy(GtkObject *obj) { SoxDialog *sd = SOX_DIALOG(obj); g_free(sd->fba[0]); g_free(sd->fba[1]); g_free(sd->fba[2]); g_free(sd->fba[3]); memset(sd->fba,0,sizeof(sd->fba)); g_free(sd->ca); parent_class->destroy(obj); } static void sox_dialog_class_init(GtkObjectClass *klass) { parent_class = gtk_type_class(effect_dialog_get_type()); EFFECT_DIALOG_CLASS(klass)->apply = sox_dialog_apply; EFFECT_DIALOG_CLASS(klass)->setup = sox_dialog_browser_setup; klass->destroy = sox_dialog_destroy; } static void sox_dialog_init(GtkObject *obj) { SoxDialog *sd = SOX_DIALOG(obj); sd->fb1 = sd->fb2 = sd->fb3 = sd->fb4 = sd->fb5 = NULL; sd->tb1 = NULL; sd->ib1 = sd->ib2 = sd->ib3 = NULL; memset(sd->fba,0,sizeof(sd->fba)); sd->ca = NULL; /* We wait with proper initialization until we know * which effect we represent (in sox_dialog_mainwindow_set). */ } GtkType sox_dialog_get_type(void) { static GtkType id = 0; if (!id) { GtkTypeInfo info = { "SoxDialog", sizeof(SoxDialog), sizeof(SoxDialogClass), (GtkClassInitFunc)sox_dialog_class_init, (GtkObjectInitFunc)sox_dialog_init }; id = gtk_type_unique(effect_dialog_get_type(),&info); } return id; } gboolean sox_dialog_register_main(gchar source_tag) { int fd[2],fd2[2],i,j,lb_pos=0; pid_t p; gchar *c,*d,**s,**sn; gchar linebuf[8192]; gboolean *map; int sox_maj=0; if (!program_exists("sox")) return FALSE; /* Run the command 'sox -h' and try to see which effects it * supports. */ i = pipe(fd); j = pipe(fd2); if (i == -1 || j == -1) { console_perror(_("Error creating pipe")); if (i == 0) { close(fd[0]); close(fd[1]); } if (j == 0) { close(fd2[0]); close(fd2[1]); } return TRUE; } p = fork(); if (p == -1) { console_perror(_("Couldn't fork")); close(fd[0]); close(fd[1]); close(fd2[0]); close(fd2[1]); return TRUE; } if (p == 0) { /* Child process - run 'sox -h' and catch stdout/stderr output */ /* Put stdout descriptor in fd[0] */ fd[0] = fd2[1]; close_all_files_except(fd,2); if (dup2(fd[0],1)==-1 || dup2(fd[1],2)==-1 || execlp("sox","sox","-h",NULL)==-1) printf(_("Error running 'sox -h': %s\n"),strerror(errno)); else puts(_("Should not reach this point")); _exit(1); } else { /* Parent process - read data */ close(fd[1]); close(fd2[1]); /* Put stdout descriptor in fd array */ fd[1] = fd2[0]; /* Read input */ j = 0; while (lb_pos < sizeof(linebuf)-1 && j<2) { i = read(fd[j],linebuf+lb_pos,sizeof(linebuf)-lb_pos-1); if (i == 0) j++; /* Read from other descriptor */ if (i < 0) { if (errno == EINTR) continue; console_perror(_("Error reading sox output")); return TRUE; } lb_pos += i; } linebuf[lb_pos] = 0; if (lb_pos == 0) return TRUE; /* printf("Sox output: %s\n",linebuf); */ /* Look at first line to see if it's SoX version >= 13 */ c = strchr(linebuf,'\n'); *c = 0; d = strstr(linebuf,"SoX Version "); if (d != NULL) sox_maj = strtol(d+12,NULL,10); d = strstr(linebuf,"SoX v"); if (d != NULL && sox_maj==0) sox_maj = strtol(d+5,NULL,10); if (sox_maj > 13) { /* printf("SoX version %d detected\n",sox_maj); */ v14_mode = TRUE; } else if (sox_maj > 12) { /* printf("SoX version %d detected\n",sox_maj); */ v13_mode = TRUE; } *c = '\n'; /* Scan for available effects */ c = strstr(linebuf,"effect: "); if (c == NULL) { c = strstr(linebuf,"effects: "); if (c == NULL) { c = strstr(linebuf,"SUPPORTED EFFECTS: "); if (c == NULL) { c = strstr(linebuf,"\nEFFECTS: "); if (c == NULL) { console_message(_("Unable to detect supported " "SoX effects")); return TRUE; } c += 10; } else c += 19; } else c += 9; } else c += 8; d = strchr(c,'\n'); if (d) *d=0; for (d=strtok(c," "); d!=NULL; d=strtok(NULL," ")) { /* printf("SoX supports effect '%s'\n",d); */ for (s=supported_effects, map=sox_support_map; *s!=NULL && strcmp(*s,d); s++,map++) { /*Empty for loop*/ } if (*s != NULL) *map = TRUE; } /* Finished.. */ close(fd[0]); wait(NULL); /* Register the effects we found */ for (s=supported_effects,sn=supported_effect_names, map=sox_support_map; *s!=NULL; s++,sn++,map++) if (*map) effect_register_add_effect(source_tag,*s,_(*sn), "Chris Bagwell",""); return FALSE; } return FALSE; } void sox_dialog_rebuild_func(gchar source_tag, gpointer user_data) { if (sox_dialog_register_main(source_tag)) console_message(_("Sox support couldn't be initialized")); } EffectDialog *sox_dialog_get_func(gchar *name, gchar source_tag, gpointer user_data) { char **c; gboolean *b; for (c=supported_effects,b=sox_support_map; *c!=NULL; c++,b++) { if (*b && !strcmp(*c,name)) return gtk_type_new(sox_dialog_get_type()); } return NULL; } void sox_dialog_register(void) { effect_register_add_source("SoX",'S',sox_dialog_rebuild_func,NULL, sox_dialog_get_func,NULL); } gchar *sox_dialog_first_effect(void) { gboolean *map; gchar **s; s = supported_effects; map = sox_support_map; while (*map == FALSE && *s != NULL) { map++; s++; } return *s; } mhwaveedit-1.4.24/src/soxdialog.h000066400000000000000000000032261334022513400166700ustar00rootroot00000000000000/* * Copyright (C) 2003 2004 2006, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #ifndef SOXDIALOG_H_INCLUDED #define SOXDIALOG_H_INCLUDED #include "effectdialog.h" #include "float_box.h" #include "int_box.h" #include "combo.h" #define SOX_DIALOG(obj) GTK_CHECK_CAST(obj,sox_dialog_get_type(),SoxDialog) #define SOX_DIALOG_CLASS(klass) GTK_CHECK_CLASS_CAST(klass,sox_dialog_get_type(),SoxDialogClass) #define IS_SOX_DIALOG(obj) GTK_CHECK_TYPE(obj,sox_dialog_get_type()) typedef struct { EffectDialog ed; gint i1; Floatbox *fb1,*fb2,*fb3,*fb4,*fb5; Floatbox **fba[4]; Combo **ca,*c1,*c2; Intbox *ib1,*ib2,*ib3; GtkToggleButton *tb1; } SoxDialog; typedef struct { EffectDialogClass ed_class; } SoxDialogClass; GtkType sox_dialog_get_type(void); void sox_dialog_register(void); gchar *sox_dialog_first_effect(void); void sox_dialog_format_string(gchar *buf, guint bufsize, Dataformat *fmt); #endif mhwaveedit-1.4.24/src/speed.xbm000066400000000000000000000007161334022513400163370ustar00rootroot00000000000000#define speed_width 20 #define speed_height 20 static unsigned char speed_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x66, 0x00, 0x00, 0xee, 0x00, 0xfc, 0xff, 0x01, 0xfc, 0xff, 0x03, 0xfc, 0xff, 0x01, 0x00, 0xee, 0x00, 0x00, 0x66, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; mhwaveedit-1.4.24/src/speeddialog.c000066400000000000000000000047751334022513400171640ustar00rootroot00000000000000/* * Copyright (C) 2002 2003 2004, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include #include #include #include "mainwindow.h" #include "effectdialog.h" #include "effectbrowser.h" #include "speeddialog.h" #include "float_box.h" #include "gettext.h" static Chunk *apply_proc(Chunk *chunk, StatusBar *bar, gpointer user_data) { SpeedDialog *s = SPEED_DIALOG(user_data); return chunk_convert_speed(chunk, s->speed->val / 100.0, dither_editing, bar); } static gboolean apply(EffectDialog *ed) { SpeedDialog *s = SPEED_DIALOG(ed); if (floatbox_check(s->speed) || s->speed->val<=0.0) return TRUE; if (s->speed->val==100.0) return FALSE; return document_apply_cb(EFFECT_BROWSER(EFFECT_DIALOG(s)->eb)-> dl->selected, apply_proc,TRUE,s); } static void speed_dialog_class_init(EffectDialogClass *klass) { klass->apply = apply; } static void speed_dialog_init(SpeedDialog *v) { EffectDialog *ed = EFFECT_DIALOG(v); GtkWidget *c; c = gtk_label_new (_("Speed:")); gtk_box_pack_start( GTK_BOX(ed->input_area), c, FALSE, FALSE, 0 ); gtk_widget_show(c); c = floatbox_new(100.0); v->speed = FLOATBOX(c); gtk_box_pack_start( GTK_BOX(ed->input_area), c, FALSE, FALSE, 0 ); gtk_widget_show(c); c = gtk_label_new("%"); gtk_box_pack_start( GTK_BOX(ed->input_area), c, FALSE, FALSE, 0 ); gtk_widget_show(c); } GtkType speed_dialog_get_type(void) { static GtkType id = 0; if (!id) { GtkTypeInfo info = { "SpeedDialog", sizeof(SpeedDialog), sizeof(SpeedDialogClass), (GtkClassInitFunc) speed_dialog_class_init, (GtkObjectInitFunc) speed_dialog_init }; id = gtk_type_unique(effect_dialog_get_type(),&info); } return id; } mhwaveedit-1.4.24/src/speeddialog.h000066400000000000000000000026671334022513400171670ustar00rootroot00000000000000/* * Copyright (C) 2002 2003 2004, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #ifndef SPEED_DIALOG_H_INCLUDED #define SPEED_DIALOG_H_INCLUDED #include #include "mainwindow.h" #include "float_box.h" #include "effectdialog.h" #define SPEED_DIALOG(obj) GTK_CHECK_CAST(obj,speed_dialog_get_type(),SpeedDialog) #define SPEED_DIALOG_CLASS(klass) GTK_CHECK_CLASS_CAST(klass,speed_dialog_get_type(),SpeedDialogClass) #define IS_SPEED_DIALOG(obj) GTK_CHECK_TYPE(obj,speed_dialog_get_type()) typedef struct _SpeedDialog { EffectDialog ed; Floatbox *speed; } SpeedDialog; typedef struct _SpeedDialogClass { EffectDialogClass ed_class; } SpeedDialogClass; GtkType speed_dialog_get_type(void); #endif mhwaveedit-1.4.24/src/statusbar.c000066400000000000000000000251621334022513400167050ustar00rootroot00000000000000/* * Copyright (C) 2004 2005 2008 2010, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include #include #include #include "statusbar.h" #include "mainloop.h" #include "gettext.h" #define LEFT_MARGIN 4 gboolean status_bar_roll_cursor; static GtkWidgetClass *parent_class; static int progress_count = 0; enum { PROGRESS_BEGIN_SIGNAL, PROGRESS_END_SIGNAL, LAST_SIGNAL }; static guint status_bar_signals[LAST_SIGNAL] = { 0 }; static void status_bar_expose(GtkWidget *widget, GdkEventExpose *event, gpointer user_data) { StatusBar *bar = STATUSBAR(user_data); GdkGC *gc; if (bar->mode == 1) { gc = get_gc(PROGRESS,widget); gdk_gc_set_clip_rectangle(gc,&(event->area)); gdk_draw_rectangle(widget->window, gc, TRUE, widget->allocation.x,event->area.y, bar->bar_width,event->area.height); gdk_gc_set_clip_mask(gc,NULL); } } static void status_bar_init(GtkObject *obj) { StatusBar *sb = STATUSBAR(obj); GtkContainer *cont = GTK_CONTAINER(obj); GtkFixed *fix = GTK_FIXED(obj); GtkWidget *da; da = gtk_label_new(""); sb->da = da; gtk_signal_connect(GTK_OBJECT(da),"expose_event", GTK_SIGNAL_FUNC(status_bar_expose),obj); gtk_fixed_put(fix,da,0,0); sb->mode = 2; sb->rate = 0; sb->fresh_label = GTK_LABEL(gtk_label_new(_("(no file loaded)"))); sb->progress_label = GTK_LABEL(gtk_label_new("")); sb->cursor = GTK_LABEL(gtk_label_new("")); sb->view = GTK_LABEL(gtk_label_new("")); sb->sel = GTK_LABEL(gtk_label_new("")); gtk_fixed_put(fix,GTK_WIDGET(sb->fresh_label),LEFT_MARGIN,2); gtk_fixed_put(fix,GTK_WIDGET(sb->progress_label),LEFT_MARGIN,2); gtk_fixed_put(fix,GTK_WIDGET(sb->cursor),LEFT_MARGIN,2); gtk_container_add(cont,GTK_WIDGET(sb->view)); gtk_container_add(cont,GTK_WIDGET(sb->sel)); gtk_widget_show(GTK_WIDGET(sb->fresh_label)); } static void status_bar_size_allocate(GtkWidget *widget, GtkAllocation *allocation) { StatusBar *sb = STATUSBAR(widget); GtkWidget *daw = GTK_WIDGET(sb->da); if (daw->allocation.height != allocation->height || daw->allocation.width != allocation->width) { gtk_widget_set_usize(daw,allocation->width,allocation->height); } parent_class->size_allocate(widget,allocation); } static void status_bar_size_request(GtkWidget *widget, GtkRequisition *requisition) { parent_class->size_request(widget,requisition); requisition->width = 10; } static void status_bar_class_init(GtkObjectClass *klass) { parent_class = GTK_WIDGET_CLASS(gtk_type_class(gtk_fixed_get_type())); GTK_WIDGET_CLASS(klass)->size_allocate = status_bar_size_allocate; GTK_WIDGET_CLASS(klass)->size_request = status_bar_size_request; STATUSBAR_CLASS(klass)->progress_begin = NULL; STATUSBAR_CLASS(klass)->progress_end = NULL; status_bar_signals[PROGRESS_BEGIN_SIGNAL] = gtk_signal_new("progress-begin", GTK_RUN_FIRST,GTK_CLASS_TYPE(klass), GTK_SIGNAL_OFFSET(StatusBarClass,progress_begin), gtk_marshal_NONE__NONE, GTK_TYPE_NONE, 0); status_bar_signals[PROGRESS_END_SIGNAL] = gtk_signal_new("progress-end", GTK_RUN_FIRST, GTK_CLASS_TYPE(klass), GTK_SIGNAL_OFFSET(StatusBarClass,progress_end), gtk_marshal_NONE__NONE, GTK_TYPE_NONE, 0); gtk_object_class_add_signals(klass,status_bar_signals,LAST_SIGNAL); } GtkType status_bar_get_type(void) { static GtkType id = 0; if (!id) { GtkTypeInfo info = { "StatusBar", sizeof(StatusBar), sizeof(StatusBarClass), (GtkClassInitFunc)status_bar_class_init, (GtkObjectInitFunc)status_bar_init }; id = gtk_type_unique(gtk_fixed_get_type(),&info); } return id; } GtkWidget *status_bar_new(void) { return GTK_WIDGET(gtk_type_new(status_bar_get_type())); } static void status_bar_set_mode(StatusBar *sb, gint mode) { gint old_mode; if (mode == sb->mode) return; old_mode = sb->mode; switch (sb->mode) { case 0: gtk_widget_hide(GTK_WIDGET(sb->cursor)); gtk_widget_hide(GTK_WIDGET(sb->view)); gtk_widget_hide(GTK_WIDGET(sb->sel)); break; case 1: gtk_widget_hide(GTK_WIDGET(sb->progress_label)); progress_count --; break; case 2: gtk_widget_hide(GTK_WIDGET(sb->fresh_label)); break; } switch (mode) { case 0: /* The labels aren't shown here since they may need to be * laid out one by one. Instead, that is handled in * status_bar_set_info. */ break; case 1: gtk_widget_show(GTK_WIDGET(sb->progress_label)); sb->progress_cur = 0; sb->progress_max = 1; sb->bar_width = 0; progress_count ++; sb->progress_break = FALSE; break; case 2: gtk_widget_show(GTK_WIDGET(sb->fresh_label)); break; } sb->mode = mode; if (old_mode == 1) gtk_signal_emit(GTK_OBJECT(sb), status_bar_signals[PROGRESS_END_SIGNAL]); if (mode == 1) gtk_signal_emit(GTK_OBJECT(sb), status_bar_signals[PROGRESS_BEGIN_SIGNAL]); gtk_widget_queue_draw(GTK_WIDGET(sb)); } void status_bar_reset(StatusBar *sb) { status_bar_set_mode(sb,2); } void status_bar_set_info(StatusBar *sb, off_t cursorpos, gboolean is_rolling, off_t viewstart, off_t viewend, off_t selstart, off_t selend, off_t samplerate, off_t maxvalue) { gchar buf[256]; gboolean cdif=FALSE,vdif=FALSE,sdif=FALSE,mdif; guint p; GtkRequisition req; sb->rate = samplerate; /* What needs to be updated? */ if (sb->mode != 0) { mdif = TRUE; } else { if (XOR(is_rolling,sb->rolling)) cdif = TRUE; else if (is_rolling && status_bar_roll_cursor) cdif = (cursorpos < sb->cur) || (cursorpos > sb->cur+samplerate/20); else cdif = (!is_rolling && sb->cur != cursorpos); vdif = (sb->vs != viewstart) || (sb->ve != viewend); if (selstart == selend) sdif = (sb->ss != sb->se); else sdif = (sb->ss != selstart) || (sb->se != selend); if (maxvalue > sb->max) { mdif = TRUE; } else mdif = FALSE; } /* Hide other labels */ status_bar_set_mode(sb,0); p = LEFT_MARGIN; /* Update cursor info */ if (cdif || mdif) { if (is_rolling && !status_bar_roll_cursor) strcpy(buf,_("Cursor: running")); else { strcpy(buf,_("Cursor: ")); get_time(samplerate,cursorpos,maxvalue,buf+strlen(buf), default_time_mode); } gtk_label_set_text(sb->cursor,buf); sb->cur = cursorpos; sb->rolling = is_rolling; } if (mdif) { /* gtk_fixed_move(sb->fixed,GTK_WIDGET(sb->cursor),p,2); */ gtk_widget_show(GTK_WIDGET(sb->cursor)); gtk_widget_size_request(GTK_WIDGET(sb->cursor),&req); /* add some extra margin to be able to handle * larger values and a LOT of extra margin if using * 'Samples' display mode (slightly hackish I admit) */ if (default_time_mode != 2) p = p + req.width + req.width/4; else p = p + req.width + req.width/2; } /* Update view info */ if (vdif || mdif) { g_snprintf(buf,150,_("View: [ %s - %s ]"), get_time(samplerate,viewstart,maxvalue,buf+150, default_time_mode), get_time(samplerate,viewend,maxvalue,buf+200, default_time_mode)); gtk_label_set_text(sb->view,buf); sb->vs = viewstart; sb->ve = viewend; } if (mdif) { gtk_fixed_move(GTK_FIXED(sb),GTK_WIDGET(sb->view),p,2); gtk_widget_show(GTK_WIDGET(sb->view)); gtk_widget_size_request(GTK_WIDGET(sb->view),&req); if (default_time_mode != 2) p = p + req.width + 10; else p = p + req.width + req.width/4; } /* Update selection info */ if (sdif || mdif) { if (selstart != selend) { g_snprintf(buf,150,_("Selection: %s+%s"), get_time(samplerate,selstart,maxvalue,buf+150, default_time_mode), get_time(samplerate,selend-selstart,maxvalue, buf+200,default_time_mode)); gtk_label_set_text(sb->sel,buf); } else gtk_label_set_text(sb->sel,""); sb->ss = selstart; sb->se = selend; } if (mdif) { gtk_fixed_move(GTK_FIXED(sb),GTK_WIDGET(sb->sel),p,2); gtk_widget_show(GTK_WIDGET(sb->sel)); } /* Update the max value */ sb->max = maxvalue; } void status_bar_begin_progress(StatusBar *sb, off_t progress_length, gchar *description) { gchar *c; if (description == NULL && sb->mode != 1) description=_("Processing data"); if (description != NULL) { c = g_strdup_printf(_("%s... (Press ESC to cancel)"),description); gtk_label_set_text(sb->progress_label,c); g_free(c); } status_bar_set_mode(sb,1); sb->progress_max = progress_length; sb->progress_cur = 0; } void status_bar_end_progress(StatusBar *sb) { if (sb != NULL) { if (sb->rate != 0) status_bar_set_info(sb,sb->cur,sb->rolling,sb->vs,sb->ve,sb->ss,sb->se, sb->rate,sb->max); else status_bar_reset(sb); } } gboolean status_bar_progress(StatusBar *sb, off_t progress) { guint bw,obw; gfloat f; sb->progress_cur += progress; f = ((gfloat)sb->progress_cur)/((gfloat)sb->progress_max); if (f > 1.0) f = 1.0; f *= (gfloat)(GTK_WIDGET(sb)->allocation.width); bw = (guint)f; /* Usually, bw should be larger than sb->bar_width since we've done * progress, but it can be smaller if we just shrunk the window. */ if (bw > sb->bar_width) { obw = sb->bar_width; gtk_widget_queue_draw_area(GTK_WIDGET(sb),sb->da->allocation.x+obw, sb->da->allocation.y,bw-obw, sb->da->allocation.height); } else if (bw < sb->bar_width) { gtk_widget_queue_draw(GTK_WIDGET(sb)); } sb->bar_width = bw; idle_work_flag = FALSE; while (!idle_work_flag) mainloop(); return sb->progress_break; } void status_bar_break_progress(StatusBar *sb) { sb->progress_break = TRUE; } int status_bar_progress_count(void) { return progress_count; } mhwaveedit-1.4.24/src/statusbar.h000066400000000000000000000072221334022513400167070ustar00rootroot00000000000000/* * Copyright (C) 2004, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ /* This is the status bar that is at the bottom of each * Mainwindow. During normal editing, it displays cursor position, view * start and endpoint and selection start/end. It can be switch into * progress mode, then it displays a progress bar with a string over * it. It's built as a GtkFixed with labels inside it. */ #ifndef STATUSBAR_H_INCLUDED #define STATUSBAR_H_INCLUDED #include #include "main.h" #define STATUSBAR(obj) GTK_CHECK_CAST(obj,status_bar_get_type(),StatusBar) #define STATUSBAR_CLASS(klass) GTK_CHECK_CLASS_CAST(klass,status_bar_get_type(),StatusBarClass) #define IS_STATUSBAR(obj) GTK_CHECK_TYPE(obj,status_bar_get_type()) typedef struct { GtkFixed fixed; GtkWidget *da; /* This flag decides whether we're in regular mode (0), progress * mode (1), or newly started (2). */ gint mode; /* Used in newly started mode: */ GtkLabel *fresh_label; /* These are used in progress mode: */ GtkLabel *progress_label; /* Also used when newly started. */ off_t progress_cur,progress_max; guint bar_width; /* Progress bar width in pixels. */ gboolean progress_break; /* These are used in regular mode: */ GtkLabel *cursor,*view,*sel; off_t cur,vs,ve,ss,se,rate,max; gboolean rolling; } StatusBar; typedef struct { GtkFixedClass fixed_class; void (*progress_begin)(StatusBar *bar); void (*progress_end)(StatusBar *bar); } StatusBarClass; /* Global variable that decides whether the cursor position text * should update while playing. */ extern gboolean status_bar_roll_cursor; GtkType status_bar_get_type(void); GtkWidget *status_bar_new(void); /* Reset the status bar to the original condition ("no file loaded") */ void status_bar_reset(StatusBar *sb); /* Set the information shown during regular editing. This will switch the status bar into regular mode. */ void status_bar_set_info(StatusBar *sb, off_t cursorpos, gboolean is_rolling, off_t viewstart, off_t viewend, off_t selstart, off_t selend, off_t samplerate, off_t maxvalue); /* Go into progress mode. If called when already in progress mode, description may be NULL. In that case, the old description is kept. */ void status_bar_begin_progress(StatusBar *sb, off_t progress_length, gchar *description); /* When in progress mode, switches the status bar back into regular mode. * Otherwise, does nothing. */ void status_bar_end_progress(StatusBar *sb); /* Update progress indicator. The status bar must be in progress mode * when this is called. Returns TRUE if someone called * status_bar_break_progress */ gboolean status_bar_progress(StatusBar *sb, off_t progress); /* Causes future calls to status_bar_progress to return TRUE */ void status_bar_break_progress(StatusBar *sb); /* Returns the number of status bars in progress mode */ int status_bar_progress_count(void); #endif mhwaveedit-1.4.24/src/tempfile.c000066400000000000000000000305551334022513400165040ustar00rootroot00000000000000/* * Copyright (C) 2002 2003 2004 2005 2006, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include #include #include #include #include "tempfile.h" #include "ringbuf.h" #include "inifile.h" #include "session.h" #define MAX_REAL_SIZE inifile_get_guint32(INI_SETTING_REALMAX,INI_SETTING_REALMAX_DEFAULT) static int tempfile_count = 0; static guint8 *copyle16(guint8 *buf, guint16 n) { buf[0] = n&0xFF; n >>= 8; buf[1] = n&0xFF; return buf+2; } static guint8 *copybe16(guint8 *buf, guint16 n) { buf[1] = n&0xFF; n >>= 8; buf[0] = n&0xFF; return buf+2; } static guint8 *copyle32(guint8 *buf, guint32 n) { buf[0] = n&0xFF; n >>= 8; buf[1] = n&0xFF; n >>= 8; buf[2] = n&0xFF; n >>= 8; buf[3] = n&0xFF; return buf+4; } static guint8 *copybe32(guint8 *buf, guint32 n) { buf[3] = n&0xFF; n >>= 8; buf[2] = n&0xFF; n >>= 8; buf[1] = n&0xFF; n >>= 8; buf[0] = n&0xFF; return buf+4; } /* PCM wav: 'RIFF' 4 #size+36 4 'wav ' 4 'fmt ' 4 #16 4 #1 2 #channels 2 #srate 4 #bytespersec 4 #bytesperframe 2 #bitspersmp 2 'data' 4 #size 4 ----- total 44 bytes IEEE wav: 'RIFF' 4 #size+50 4 'wav ' 4 'fmt ' 4 #18 4 #3 2 #channels 2 #srate 4 #bytespersec 4 #bytesperframe 2 #bitspersmp 2 #0 2 'fact' 4 #4 4 #samples 4 'data' 4 #size 4 ------ total 58 bytes */ guint get_wav_header(Dataformat *format, off_t datasize, void *buffer) { gboolean bigendian=FALSE; guint32 l, Bps=format->samplerate*format->channels*format->samplesize; guint16 Bpsmp=format->channels*format->samplesize; guint16 samplebits=(format->samplesize)<<3; guint8 *c = buffer; if (format->type == DATAFORMAT_PCM) { bigendian = format->bigendian; l = datasize + 36; } else { bigendian = FALSE; l = datasize + 50; } if (((off_t)l) < datasize) l = 0xFFFFFFFF; if (bigendian) memcpy(c,"RIFX",4); else memcpy(c,"RIFF",4); c += 4; c = bigendian?copybe32(c,l):copyle32(c,l); if (format->type == DATAFORMAT_PCM) { if (bigendian) memcpy(c,"WAVEfmt \0\0\0\20\0\1",14); else memcpy(c,"WAVEfmt \20\0\0\0\1\0",14); } else memcpy(c,"WAVEfmt \22\0\0\0\3\0",14); c += 14; if (bigendian) { c = copybe16(c,format->channels); c = copybe32(c,format->samplerate); c = copybe32(c,Bps); c = copybe16(c,Bpsmp); c = copybe16(c,samplebits); } else { c = copyle16(c,format->channels); c = copyle32(c,format->samplerate); c = copyle32(c,Bps); c = copyle16(c,Bpsmp); c = copyle16(c,samplebits); } if (format->type == DATAFORMAT_FLOAT) { memcpy(c,"\0\0fact\4\0\0\0",10); c += 10; l = datasize / format->samplebytes; if (((off_t)l) < datasize/format->samplebytes) l = 0xFFFFFFFF; c = copyle32(c,l); } memcpy(c,"data",4); c += 4; l = (guint32) datasize; if (((off_t)l) < datasize) l = 0xFFFFFFFF; c = bigendian?copybe32(c,l):copyle32(c,l); return (guint)((c-(guint8 *)buffer)); } gboolean write_wav_header(EFILE *f, Dataformat *format, off_t datasize) { gchar c[58]; guint i; i = get_wav_header(format,datasize,c); return e_fwrite(c,i,f); } static gchar *try_tempdir(gchar *dir) { gchar *c; FILE *f; if (!dir || dir[0]==0) return 0; c = g_strjoin("/",dir,".mhwaveedit_temp_test",NULL); f = fopen(c,"w"); if (f) { fclose(f); unlink(c); } g_free(c); return f?dir:NULL; } static GList *tempdirs = NULL; void set_temp_directories(GList *l) { guint i; gchar *c,*d; g_list_foreach(tempdirs,(GFunc)g_free,NULL); g_list_free(tempdirs); tempdirs = NULL; i = 1; while (l != NULL) { c = (gchar *)l->data; d = g_strdup_printf("tempDir%d",i); inifile_set(d,c); g_free(d); tempdirs = g_list_append(tempdirs,g_strdup(l->data)); l = l->next; i++; } while (1) { d = g_strdup_printf("tempDir%d",i); if (inifile_get(d,NULL) == NULL) break; inifile_set(d,NULL); g_free(d); i++; } } gchar *get_temp_directory(guint num) { gchar *c,*d; gint i=1; if (!tempdirs) { c = inifile_get("tempDir1",NULL); if (!c) { c = getenv("TEMP"); if (c==NULL) c=getenv("TMP"); if (try_tempdir(c)) tempdirs = g_list_append(tempdirs,g_strdup(c)); c = g_strjoin("/",get_home_directory(),".mhwaveedit",NULL); mkdir(c,CONFDIR_PERMISSION); if (try_tempdir(c)) tempdirs = g_list_append(tempdirs,g_strdup(c)); } else { do { if (try_tempdir(c)) tempdirs = g_list_append(tempdirs,g_strdup(c)); i++; d = g_strdup_printf("tempDir%d",i); c = inifile_get(d,NULL); g_free(d); } while (c!=NULL); } } return (gchar *)g_list_nth_data(tempdirs,num); } G_LOCK_DEFINE_STATIC(tempfile); gchar *get_temp_filename_d(gchar *dir) { gchar *c; /* printf("%s\n",d); */ G_LOCK(tempfile); if (dir != NULL) c = g_strdup_printf("%s/mhwaveedit-temp-%d-%04d-%d",dir, (int)getpid(),++tempfile_count, session_get_id()); else c = NULL; G_UNLOCK(tempfile); return c; } gchar *get_temp_filename(guint dirnum) { return get_temp_filename_d(get_temp_directory(dirnum)); } struct temp { guint dirs; EFILE **handles; off_t *written_bytes; guint current; gboolean realtime; Ringbuf *start_buf; Dataformat format; /* These two are only used when we're writing out partial frames. */ gchar sample_buf[64]; guint sample_buf_pos; }; static void tempfile_open_dir(struct temp *t, guint dirnum, gboolean df) { gboolean b; gchar *c; b = report_write_errors; report_write_errors = df; c = get_temp_filename(dirnum); t->handles[dirnum] = e_fopen(c,EFILE_WRITE); g_free(c); if (t->handles[dirnum] != NULL && write_wav_header(t->handles[dirnum],&(t->format),0x7FFFFFFF)) { e_fclose_remove(t->handles[dirnum]); t->handles[dirnum] = NULL; } report_write_errors = b; } TempFile tempfile_init(Dataformat *format, gboolean realtime) { guint i; struct temp *t; t = g_malloc(sizeof(*t)); t->current = 0; t->realtime = realtime; memcpy(&(t->format),format,sizeof(Dataformat)); if (!tempdirs) get_temp_directory(0); g_assert(tempdirs != NULL); t->dirs = g_list_length(tempdirs); t->handles = g_malloc0(t->dirs*sizeof(EFILE *)); if (realtime) for (i=0; idirs; i++) tempfile_open_dir(t,i,FALSE); t->written_bytes = g_malloc0(t->dirs*sizeof(off_t)); if (!realtime) { t->start_buf = ringbuf_new(MAX_REAL_SIZE); g_assert(ringbuf_available(t->start_buf) == 0); } else t->start_buf = NULL; t->sample_buf_pos = 0; return t; } static gboolean tempfile_write_main(struct temp *t, gchar *data, guint length) { gboolean b,r; guint i; /* Handle partial frame writes */ if (t->sample_buf_pos > 0) { i = MIN(length, t->format.samplebytes - t->sample_buf_pos); memcpy(t->sample_buf + t->sample_buf_pos, data, i); t->sample_buf_pos += i; if (t->sample_buf_pos < t->format.samplebytes) return FALSE; t->sample_buf_pos = 0; if (tempfile_write_main(t,t->sample_buf,t->format.samplebytes)) return TRUE; data += i; length -= i; } if (length % t->format.samplebytes != 0) { i = length % t->format.samplebytes; memcpy(t->sample_buf,data+length-i,i); t->sample_buf_pos = i; length -= i; } if (length == 0) return FALSE; while (1) { /* Make sure we have an opened file in the currently used directory*/ while (t->handles[t->current] == NULL && t->current < t->dirs) { if (!t->realtime) tempfile_open_dir(t,t->current,FALSE); if (t->handles[t->current] == NULL) t->current ++; } if (t->current >= t->dirs) { /* Try again to make sure the user sees at least one error * message. */ t->current = t->dirs-1; tempfile_open_dir(t,t->current,TRUE); if (t->handles[t->current] == NULL) return TRUE; } /* Write data */ b = report_write_errors; report_write_errors = (t->current == t->dirs-1); r = e_fwrite(data,length,t->handles[t->current]); report_write_errors = b; if (!r || (t->current == t->dirs-1)) { t->written_bytes[t->current] += length; return r; } t->current ++; /* Loop around */ } } gboolean tempfile_write(TempFile handle, gpointer data, guint length) { struct temp *t = (struct temp *)handle; gchar *buf,*c=data; guint32 u; /* Just add to start buffer */ if (t->start_buf != NULL) { u = ringbuf_enqueue(t->start_buf, c, length); if (u == length) return FALSE; /* Send buffer to file*/ c = c+u; length = length - u; buf = g_malloc(4096); while (1) { u = ringbuf_dequeue(t->start_buf, buf, 4096); if (u == 0) break; if (tempfile_write_main(t,buf,u)) return TRUE; } ringbuf_free(t->start_buf); t->start_buf = NULL; } /* Send data to file */ return tempfile_write_main(t,c,length); } void tempfile_abort(TempFile handle) { struct temp *t = (struct temp *)handle; guint i; for (i=0; idirs; i++) { if (t->handles[i] != NULL) e_fclose_remove(t->handles[i]); } g_free(t->handles); g_free(t->written_bytes); if (t->start_buf != NULL) ringbuf_free(t->start_buf); g_free(t); } /* The error reporting in this function could be improved, but the user gets * warned and it shouldn't leak so it's not that important. */ Chunk *tempfile_finished(TempFile handle) { struct temp *t = (struct temp *)handle; guint32 u; Datasource *ds; Chunk *r=NULL,*c,*d; off_t l,o; guint i; if (t->start_buf != NULL) { ds = gtk_type_new(datasource_get_type()); ds->type = DATASOURCE_REAL; memcpy(&(ds->format),&(t->format),sizeof(Dataformat)); u = ringbuf_available(t->start_buf); ds->data.real = g_malloc(u); ringbuf_dequeue(t->start_buf,ds->data.real,u); ds->bytes = (off_t)u; ds->length = (off_t)(u / ds->format.samplebytes); tempfile_abort(t); return chunk_new_from_datasource(ds); } for (i=0; idirs; i++) { if (t->handles[i] == NULL) continue; l = t->written_bytes[i]; if (l == 0) { e_fclose_remove(t->handles[i]); t->handles[i] = NULL; continue; } if (e_fseek(t->handles[i],0,SEEK_SET) || write_wav_header(t->handles[i], &(t->format),l)) { e_fclose_remove(t->handles[i]); t->handles[i] = NULL; continue; } o = e_ftell(t->handles[i]); if (o < 0) { e_fclose_remove(t->handles[i]); t->handles[i] = NULL; continue; } ds = gtk_type_new(datasource_get_type()); ds->type = DATASOURCE_TEMPFILE; memcpy(&(ds->format),&(t->format),sizeof(Dataformat)); ds->length = l/(t->format.samplebytes); ds->bytes = ds->length * ds->format.samplebytes; ds->data.virtual.filename = g_strdup(t->handles[i]->filename); ds->data.virtual.offset = o; e_fclose(t->handles[i]); t->handles[i] = NULL; c = chunk_new_from_datasource(ds); if (r == NULL) r = c; else { d = r; r = chunk_append(d,c); gtk_object_sink(GTK_OBJECT(d)); gtk_object_sink(GTK_OBJECT(c)); } } tempfile_abort((TempFile)t); return r; } mhwaveedit-1.4.24/src/tempfile.h000066400000000000000000000053401334022513400165030ustar00rootroot00000000000000/* * Copyright (C) 2002 2003 2004 2005, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #ifndef TEMPFILE_H_INCLUDED #define TEMPFILE_H_INCLUDED #include #include "chunk.h" #include "datasource.h" /* This type identifies the temporary file during creation */ typedef gpointer TempFile; /* Start creating a temporary file. Returns a handle to the temporary file or * NULL on failure. The handle must later be destroyed using either * tempfile_finished or tempfile_abort. * * The realtime argument should be used when recording or performing * other timing-sensitive tasks. Files in each temporary directory will * then be opened right away to avoid delays later. Also, memory * buffering is disabled and data goes directly to file. */ TempFile tempfile_init(Dataformat *format, gboolean realtime); /* Write data into the temporary file. * * temp - Handle to the temporary file. * data - The data to output * length - Length of the data * * return value - TRUE on failure, FALSE on success */ gboolean tempfile_write(TempFile temp, gpointer data, guint length); /* Abort creating the temporary file. * temp - Handle to the temporary file. */ void tempfile_abort(TempFile temp); /* End the temporary file. * temp - Handle to the temporary file. * format - The PCM format the written data was in. * fake_pcm - If the written data was really raw sample_t values * return value - A Chunk containing the temporary data or NULL on * failure. */ Chunk *tempfile_finished(TempFile temp); void set_temp_directories(GList *dirs); gchar *get_temp_directory(guint num); gchar *get_temp_filename(guint dirnum); gchar *get_temp_filename_d(gchar *dir); /* Creates a wav file header for the specified sample format and size and * puts it in the supplied buffer. * Returns size of the header, always 44 or 58 bytes. */ guint get_wav_header(Dataformat *format, off_t datasize, void *buffer); gboolean write_wav_header(EFILE *f, Dataformat *format, off_t datasize); #endif mhwaveedit-1.4.24/src/um.c000066400000000000000000000354621334022513400153220ustar00rootroot00000000000000/* * Copyright (C) 2002 2003 2004 2005 2006 2008 2011 2012, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include #include #include #include #include #include #include "um.h" #include "main.h" #include "mainloop.h" #include "gettext.h" gboolean um_use_gtk = FALSE; int user_message_flag=0; static int modal_result; static const int mr_yes=MR_YES,mr_no=MR_NO,mr_cancel=MR_CANCEL,mr_ok=MR_OK; static void modal_callback(GtkWidget *widget, gpointer data) { modal_result=*((int *)data); } /* Output each line of msg with "mhWaveEdit: " in front of it. */ void console_message(const char *msg) { char *b,*c,*d; b = c = g_strdup(msg); while (1) { fputs(_("mhWaveEdit: "),stderr); d = strchr(c,'\n'); if (d != NULL) *d = 0; fputs(c,stderr); fputs("\n",stderr); if (d != NULL) c = d+1; else break; } g_free(b); } void console_perror(const char *msg) { fprintf(stderr,_("mhWaveEdit: %s: %s\n"),msg,strerror(errno)); } void user_perror(const char *msg){ char *d; d = g_strdup_printf("%s: %s",msg,strerror(errno)); user_error(d); g_free(d); } #if GTK_MAJOR_VERSION == 1 static GtkWidget *wnd = NULL; static void window_destroy(GtkWidget *widget, gpointer user_data) { wnd = NULL; // puts("window_destroy!"); } int do_user_message(char *msg, int type, gboolean block) { GtkWidget *l,*b; /* If we're called recursively with UM_OK it's probably some kind of error * message so spit it out to stderr... */ if (!um_use_gtk || (user_message_flag && type==UM_OK)) { g_assert(type == UM_OK); console_message(msg); return MR_OK; } g_assert(!user_message_flag); g_assert(block || type==UM_OK); wnd=gtk_dialog_new(); gtk_window_set_title(GTK_WINDOW(wnd),_("Message")); gtk_window_set_modal(GTK_WINDOW(wnd),TRUE); gtk_window_set_position(GTK_WINDOW(wnd),GTK_WIN_POS_CENTER); /*gtk_container_set_border_width(GTK_CONTAINER(GTK_DIALOG(wnd)->vbox),10);*/ gtk_container_set_border_width(GTK_CONTAINER(wnd),10); if (block) gtk_signal_connect(GTK_OBJECT(wnd),"destroy",GTK_SIGNAL_FUNC(window_destroy),NULL); l = gtk_label_new(msg); gtk_label_set_line_wrap(GTK_LABEL(l),TRUE); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(wnd)->vbox),l,TRUE,FALSE,8); gtk_widget_show(l); switch (type) { case UM_OK: b=gtk_button_new_with_label(_("OK")); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(wnd)->action_area),b,FALSE,FALSE,0); if (block) gtk_signal_connect(GTK_OBJECT(b),"clicked",GTK_SIGNAL_FUNC(modal_callback),(gpointer)&mr_ok); gtk_signal_connect_object(GTK_OBJECT(b),"clicked",GTK_SIGNAL_FUNC(gtk_widget_destroy),GTK_OBJECT(wnd)); gtk_widget_show(b); modal_result=MR_OK; break; case UM_YESNOCANCEL: b=gtk_button_new_with_label(_("Yes")); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(wnd)->action_area),b, FALSE,FALSE,0); gtk_signal_connect(GTK_OBJECT(b),"clicked", GTK_SIGNAL_FUNC(modal_callback), (gpointer)&mr_yes); gtk_signal_connect_object(GTK_OBJECT(b),"clicked",GTK_SIGNAL_FUNC(gtk_widget_destroy),GTK_OBJECT(wnd)); gtk_widget_show(b); b=gtk_button_new_with_label(_("No")); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(wnd)->action_area),b, FALSE,FALSE,0); gtk_signal_connect(GTK_OBJECT(b),"clicked", GTK_SIGNAL_FUNC(modal_callback), (gpointer)&mr_no); gtk_signal_connect_object(GTK_OBJECT(b),"clicked",GTK_SIGNAL_FUNC(gtk_widget_destroy),GTK_OBJECT(wnd)); gtk_widget_show(b); b=gtk_button_new_with_label(_("Cancel")); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(wnd)->action_area),b, FALSE,FALSE,0); gtk_signal_connect(GTK_OBJECT(b),"clicked",GTK_SIGNAL_FUNC(modal_callback),(gpointer)&mr_cancel); gtk_signal_connect_object(GTK_OBJECT(b),"clicked",GTK_SIGNAL_FUNC(gtk_widget_destroy),GTK_OBJECT(wnd)); gtk_widget_show(b); modal_result=MR_CANCEL; break; case UM_OKCANCEL: b=gtk_button_new_with_label(_("OK")); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(wnd)->action_area),b, FALSE,FALSE,0); gtk_signal_connect(GTK_OBJECT(b),"clicked", GTK_SIGNAL_FUNC(modal_callback), (gpointer)&mr_ok); gtk_signal_connect_object(GTK_OBJECT(b),"clicked",GTK_SIGNAL_FUNC(gtk_widget_destroy),GTK_OBJECT(wnd)); gtk_widget_show(b); b=gtk_button_new_with_label(_("Cancel")); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(wnd)->action_area),b, FALSE,FALSE,0); gtk_signal_connect(GTK_OBJECT(b),"clicked",GTK_SIGNAL_FUNC(modal_callback),(gpointer)&mr_cancel); gtk_signal_connect_object(GTK_OBJECT(b),"clicked",GTK_SIGNAL_FUNC(gtk_widget_destroy),GTK_OBJECT(wnd)); gtk_widget_show(b); modal_result=MR_CANCEL; break; } gtk_widget_show(wnd); if (block) { user_message_flag++; while (wnd) mainloop(); user_message_flag--; // puts("Out!"); return modal_result; } else return MR_OK; } int user_message(char *msg, int type) { return do_user_message(msg,type,TRUE); } void user_info(char *msg) { user_message(msg,UM_OK); } void user_error(char *msg) { user_message(msg,UM_OK); } void popup_error(char *msg) { do_user_message(msg,UM_OK,FALSE); } void user_warning(char *msg) { user_message(msg,UM_OK); } #else static gboolean responded = FALSE; static gint r; static void response(GtkDialog *dialog, gint arg1, gpointer user_data) { responded = TRUE; r = arg1; } static void nonblock_response(GtkDialog *dialog, gint arg1, gpointer user_data) { if (arg1 != GTK_RESPONSE_DELETE_EVENT) gtk_widget_destroy(GTK_WIDGET(dialog)); } static int showdlg(GtkMessageType mt, GtkButtonsType bt, char *msg, gboolean block) { GtkWidget *w; g_assert(block || bt == GTK_BUTTONS_OK); if (!um_use_gtk) { g_assert(bt == GTK_BUTTONS_OK); console_message(msg); return MR_OK; } w = gtk_message_dialog_new(NULL,GTK_DIALOG_MODAL,mt,bt,"%s",msg); if (bt == GTK_BUTTONS_NONE) gtk_dialog_add_buttons(GTK_DIALOG(w),GTK_STOCK_YES,GTK_RESPONSE_YES, GTK_STOCK_NO,GTK_RESPONSE_NO,GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,NULL); if (block) { gtk_signal_connect(GTK_OBJECT(w),"response", GTK_SIGNAL_FUNC(response),NULL); responded = FALSE; } else gtk_signal_connect(GTK_OBJECT(w),"response", GTK_SIGNAL_FUNC(nonblock_response),NULL); gtk_window_set_position(GTK_WINDOW(w),GTK_WIN_POS_CENTER); gtk_widget_show(w); if (block) while (!responded) mainloop(); else return MR_OK; if (r != GTK_RESPONSE_DELETE_EVENT) gtk_widget_destroy(w); if (r == GTK_RESPONSE_OK) return MR_OK; if (r == GTK_RESPONSE_CANCEL) return MR_CANCEL; if (r == GTK_RESPONSE_YES) return MR_YES; if (r == GTK_RESPONSE_NO) return MR_NO; if (bt == GTK_BUTTONS_OK) return MR_OK; return MR_CANCEL; } int user_message(char *msg, int type) { if (type == UM_YESNOCANCEL) return showdlg(GTK_MESSAGE_QUESTION,GTK_BUTTONS_NONE,msg,TRUE); if (type == UM_OKCANCEL) return showdlg(GTK_MESSAGE_WARNING,GTK_BUTTONS_OK_CANCEL,msg,TRUE); return showdlg(GTK_MESSAGE_INFO,GTK_BUTTONS_OK,msg,TRUE); } void user_info(char *msg) { showdlg(GTK_MESSAGE_INFO,GTK_BUTTONS_OK,msg,TRUE); } void user_error(char *msg) { showdlg(GTK_MESSAGE_ERROR,GTK_BUTTONS_OK,msg,TRUE); } void popup_error(char *msg) { showdlg(GTK_MESSAGE_ERROR,GTK_BUTTONS_OK,msg,FALSE); } void user_warning(char *msg) { showdlg(GTK_MESSAGE_WARNING,GTK_BUTTONS_OK,msg,TRUE); } #endif struct user_input_data { gboolean (*validator)(gchar *c); GtkWidget *entry,*window; gchar *result; }; static gboolean user_input_quitflag; static void user_input_destroy(void) { user_input_quitflag=TRUE; } static void user_input_ok(GtkButton *button, gpointer user_data) { gchar *c; struct user_input_data *uid = user_data; c = (gchar *)gtk_entry_get_text(GTK_ENTRY(uid->entry)); if (uid->validator(c)) { uid->result = g_strdup(c); modal_result = MR_OK; gtk_widget_destroy(uid->window); } } gchar *user_input(gchar *label, gchar *title, gchar *defvalue, gboolean (*validator)(gchar *c), GtkWindow *below) { GtkWidget *a,*b,*c,*d,*ent; struct user_input_data uid; a = gtk_window_new(GTK_WINDOW_DIALOG); if (below != NULL) { gtk_window_set_transient_for(GTK_WINDOW(a),below); gtk_window_set_position(GTK_WINDOW(a),GTK_WIN_POS_CENTER_ON_PARENT); } else gtk_window_set_position(GTK_WINDOW(a),GTK_WIN_POS_CENTER); gtk_window_set_title(GTK_WINDOW(a),title?title:_("Input")); gtk_window_set_modal(GTK_WINDOW(a),TRUE); gtk_container_set_border_width(GTK_CONTAINER(a),5); gtk_signal_connect(GTK_OBJECT(a),"destroy", GTK_SIGNAL_FUNC(user_input_destroy),NULL); b = gtk_vbox_new(FALSE,3); gtk_container_add(GTK_CONTAINER(a),b); c = gtk_hbox_new(FALSE,2); gtk_box_pack_start(GTK_BOX(b),c,FALSE,FALSE,0); if (label) { d = gtk_label_new(label); gtk_box_pack_start(GTK_BOX(c),d,FALSE,FALSE,0); } ent = gtk_entry_new(); gtk_entry_set_text(GTK_ENTRY(ent),defvalue); #if GTK_MAJOR_VERSION > 1 gtk_entry_set_activates_default(GTK_ENTRY(ent),TRUE); #endif gtk_box_pack_start(GTK_BOX(b),ent,FALSE,FALSE,0); c = gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(b),c,FALSE,FALSE,3); c = gtk_hbutton_box_new(); gtk_box_pack_start(GTK_BOX(b),c,FALSE,FALSE,0); d = gtk_button_new_with_label(_("OK")); gtk_signal_connect(GTK_OBJECT(d),"clicked", GTK_SIGNAL_FUNC(user_input_ok),&uid); gtk_container_add(GTK_CONTAINER(c),d); GTK_WIDGET_SET_FLAGS(d,GTK_CAN_DEFAULT); gtk_widget_grab_default(d); d = gtk_button_new_with_label(_("Cancel")); gtk_signal_connect(GTK_OBJECT(d),"clicked",GTK_SIGNAL_FUNC(modal_callback), (gpointer)&mr_cancel); gtk_signal_connect_object(GTK_OBJECT(d),"clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy), GTK_OBJECT(a)); gtk_container_add(GTK_CONTAINER(c),d); gtk_widget_show_all(a); uid.window = a; uid.validator = validator; uid.entry = ent; modal_result = MR_CANCEL; user_input_quitflag = FALSE; while (!user_input_quitflag) mainloop(); if (modal_result == MR_CANCEL) return NULL; else return uid.result; } static gboolean user_input_float_validator(gchar *c) { gchar *d; errno = 0; strtod(c,&d); return (errno == 0 && *d == 0); } gboolean user_input_float(gchar *label, gchar *title, gfloat defvalue, GtkWindow *below, gfloat *result) { gchar *c,d[128],*e; format_float(defvalue, d, sizeof(d)); c = user_input(label,title,d,user_input_float_validator,below); if (!c) return TRUE; *result = (gfloat)strtod(c,&e); g_assert(*e == 0); g_free(c); return FALSE; } static gpointer user_choice_choice; static gboolean echo_func(GtkWidget *widget, GdkEvent *event, gpointer user_data) { return *((int *)user_data) == MR_OK; } static void user_choice_select_child(GtkList *list, GtkWidget *widget, gpointer user_data) { user_choice_choice = gtk_object_get_data(GTK_OBJECT(widget),"choice"); } gint user_choice(gchar **choices, guint def, gchar *windowtitle, gchar *windowtext, gboolean allow_cancel) { GtkWidget *a,*b,*c,*d,*list=NULL,*w; guint i; a = gtk_window_new(GTK_WINDOW_DIALOG); gtk_window_set_modal(GTK_WINDOW(a),TRUE); gtk_window_set_title(GTK_WINDOW(a), windowtitle?windowtitle:_("Choice")); gtk_container_set_border_width(GTK_CONTAINER(a),5); if (allow_cancel) gtk_signal_connect(GTK_OBJECT(a),"delete_event", GTK_SIGNAL_FUNC(echo_func),(gpointer)&mr_cancel); else gtk_signal_connect(GTK_OBJECT(a),"delete_event", GTK_SIGNAL_FUNC(echo_func),(gpointer)&mr_ok); gtk_signal_connect(GTK_OBJECT(a),"destroy", GTK_SIGNAL_FUNC(user_input_destroy),NULL); b = gtk_vbox_new(FALSE,5); gtk_container_add(GTK_CONTAINER(a),b); if (windowtext) { c = gtk_label_new(windowtext); gtk_label_set_line_wrap(GTK_LABEL(c),TRUE); gtk_box_pack_start(GTK_BOX(b),c,FALSE,FALSE,0); c = gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(b),c,FALSE,FALSE,0); } c = gtk_scrolled_window_new(NULL,NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(c), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); gtk_widget_set_usize(GTK_WIDGET(c),-1,300); gtk_box_pack_start(GTK_BOX(b),c,TRUE,TRUE,0); d = list = gtk_list_new(); gtk_list_set_selection_mode(GTK_LIST(list),GTK_SELECTION_SINGLE); for (i=0; choices[i]!=NULL; i++) { w = gtk_list_item_new_with_label(choices[i]); gtk_object_set_data(GTK_OBJECT(w),"choice",choices+i); gtk_container_add(GTK_CONTAINER(list),w); if (i == def) gtk_list_select_child(GTK_LIST(list),w); } gtk_signal_connect(GTK_OBJECT(list),"select_child", (GtkSignalFunc)user_choice_select_child,NULL); gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(c),d); c = gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(b),c,FALSE,FALSE,0); c = gtk_hbutton_box_new(); gtk_box_pack_start(GTK_BOX(b),c,FALSE,FALSE,0); d = gtk_button_new_with_label(_("OK")); gtk_signal_connect(GTK_OBJECT(d),"clicked",GTK_SIGNAL_FUNC(modal_callback), (gpointer)&mr_ok); gtk_signal_connect_object(GTK_OBJECT(d),"clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy), GTK_OBJECT(a)); gtk_container_add(GTK_CONTAINER(c),d); if (allow_cancel) { d = gtk_button_new_with_label(_("Cancel")); gtk_signal_connect(GTK_OBJECT(d),"clicked", GTK_SIGNAL_FUNC(modal_callback), (gpointer)&mr_cancel); gtk_signal_connect_object(GTK_OBJECT(d),"clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy), GTK_OBJECT(a)); gtk_container_add(GTK_CONTAINER(c),d); } user_choice_choice = choices+def; modal_result = MR_CANCEL; gtk_widget_show_all(a); user_input_quitflag = FALSE; while (!user_input_quitflag) mainloop(); g_assert(modal_result==MR_OK || allow_cancel); if (modal_result==MR_CANCEL) return -1; else return (guint) (((gchar **)user_choice_choice)-choices); } mhwaveedit-1.4.24/src/um.h000066400000000000000000000033401334022513400153150ustar00rootroot00000000000000/* * Copyright (C) 2002 2003 2004 2005 2006, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #ifndef UM_H_INCLUDED #define UM_H_INCLUDED #include #define UM_OK 0 #define UM_YESNOCANCEL 1 #define UM_OKCANCEL 2 #define MR_OK 0 #define MR_YES 1 #define MR_NO 2 #define MR_CANCEL 3 extern gboolean um_use_gtk; void console_message(const char *msg); void console_perror(const char *msg); void user_perror(const char *msg); int user_message(char *msg, int type); void user_info(char *msg); void user_error(char *msg); /* Same as user_error but returns immediately */ void popup_error(char *msg); void user_warning(char *msg); extern int user_message_flag; gchar *user_input(gchar *label, gchar *title, gchar *defvalue, gboolean (*validator)(gchar *c), GtkWindow *below); gboolean user_input_float(gchar *label, gchar *title, gfloat defvalue, GtkWindow *below, gfloat *result); gint user_choice(gchar **choices, guint def, gchar *windowtitle, gchar *windowtext, gboolean allow_cancel); #endif mhwaveedit-1.4.24/src/viewcache.c000066400000000000000000000412001334022513400166220ustar00rootroot00000000000000/* * Copyright (C) 2002 2003 2004 2005 2007 2009, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include #include #include #include "viewcache.h" #include "inifile.h" #include "main.h" /* How many columns to update (max) for each call to view_cache_update */ #define PIXELS_PER_UPDATE 10 #define GUINT32(x) ((guint32)x) #define FLOAT(x) ((float)x) #define DOUBLE(x) ((double)x) /* These constants define the different possible values in the calced array */ #define CALC_UNKNOWN 0 /* No value */ #define CALC_DIRTY 1 /* Approximate value after zooming */ #define CALC_LOWQ 2 /* Low quality */ #define CALC_DONE 3 /* High quality */ ViewCache *view_cache_new(void) { ViewCache *vc; vc = g_malloc(sizeof(*vc)); vc->chunk = NULL; vc->handle = NULL; vc->values = NULL; vc->offsets = NULL; vc->calced = NULL; return vc; } static void view_cache_clear(ViewCache *vc) { if (vc->chunk) { if (vc->handle) chunk_close(vc->handle); vc->handle = NULL; gtk_object_unref(GTK_OBJECT(vc->chunk)); } g_free(vc->values); vc->values = NULL; g_free(vc->offsets); vc->offsets = NULL; g_free(vc->calced); vc->calced = NULL; } void view_cache_free(ViewCache *vc) { view_cache_clear(vc); g_free(vc); } gboolean view_cache_update(ViewCache *cache, Chunk *chunk, off_t start_samp, off_t end_samp, gint xres, gint *low_updated, gint *high_updated) { static sample_t *sbuf=NULL; static guint sbufsize=0; static gboolean readflag = FALSE; sample_t *new_values; off_t *new_offsets, o; gchar *new_calced; gboolean chunk_change; gboolean range_change; gdouble d; gdouble real_spp; gint lowq_spp,highq_spp; gint dirty_code = CALC_DIRTY; sample_t f,g,h; guint i,j,k,l,m,n,new_spp; gchar *c; guint channels = chunk?chunk->format.channels:0; sample_t x; guint impr = 0; /* if (xres > end_samp-start_samp) xres=end_samp-start_samp; */ if (readflag) return FALSE; /* Special case - empty file */ if (end_samp == start_samp) { if (cache->xres != xres) { g_free(cache->calced); cache->calced = g_malloc0(xres); cache->xres = xres; } if (low_updated) { *low_updated = 0; *high_updated = xres-1; } return FALSE; } chunk_change = (cache->chunk != chunk); range_change = (chunk != NULL) && (chunk_change || cache->start != start_samp || cache->end != end_samp || cache->xres != xres); /* Reading from the inifile takes a bit of time so we check if we can * exit here. */ if (!chunk_change && !range_change && cache->handle==NULL) return FALSE; real_spp = ((gdouble)(end_samp - start_samp)) / ((gdouble)xres); lowq_spp = inifile_get_guint32(INI_SETTING_VIEW_QUALITY, INI_SETTING_VIEW_QUALITY_DEFAULT); if (lowq_spp >= real_spp) lowq_spp = 0; highq_spp = inifile_get_guint32(INI_SETTING_VIEW_QUALITY_HIGH, INI_SETTING_VIEW_QUALITY_HIGH_DEFAULT); if (highq_spp >= real_spp) highq_spp = 0; if (!inifile_get_gboolean("drawImprove",TRUE)) { highq_spp=lowq_spp; dirty_code = CALC_DONE; } /* Handle changed chunk */ if (chunk_change) { view_cache_clear(cache); cache->chunk = chunk; if (chunk != NULL) gtk_object_ref(GTK_OBJECT(chunk)); cache->chunk_error = FALSE; } if (cache->chunk_error) return FALSE; /* Handle changed range */ if (range_change) { if (cache->handle == NULL) /* Failure here is handled a bit later */ cache->handle = chunk_open(chunk); /* Create new buffers */ new_values = g_malloc(xres * channels * 2 * sizeof(*new_values)); /* Make one extra entry in offsets with end point. (used below) */ new_offsets = g_malloc((xres+1) * sizeof(*new_offsets)); new_calced = g_malloc0(xres); /* Calculate new_offsets */ new_offsets[0] = start_samp; new_offsets[xres] = end_samp; d = (double)start_samp + real_spp; for (i=1; i= real_spp) lowq_spp = 0; highq_spp=inifile_get_guint32(INI_SETTING_VIEW_QUALITY_HIGH, INI_SETTING_VIEW_QUALITY_HIGH_DEFAULT); if (highq_spp >= real_spp) highq_spp = 0; if (!inifile_get_gboolean("drawImprove",TRUE)) highq_spp=lowq_spp; /* Three cases - scrolling, zooming and no overlap at all */ if (chunk_change || end_samp <= cache->start || start_samp >= cache->end) { /* No overlap - don't do anything more */ } else if (xres == cache->xres && end_samp-start_samp == cache->end-cache->start) { /* Scrolling */ /* Set j=old location, i=new location, k=# of values to copy */ j=0; i=0; if (cache->offsets[0] < new_offsets[0]) j = GUINT32(DOUBLE(new_offsets[0] - cache->offsets[0]) / real_spp); else i = GUINT32(DOUBLE(cache->offsets[0] - new_offsets[0]) / real_spp); k = xres - MAX(i,j); /* printf("%d -> %d, (%d)\n",j,i,k); */ memcpy(new_values+(2*i*channels), cache->values+(2*j*channels), k*channels*2*sizeof(sample_t)); o = cache->offsets[j] - new_offsets[i]; for (l=0; l<=xres; l++) new_offsets[l] += o; /* When real_spp < 1.0, we may get errors due to offset rounding * therefore, set the cache status to DIRTY */ if (real_spp >= 1.0) memcpy(new_calced+i, cache->calced+j, k); else memset(new_calced+i, CALC_DIRTY, k); } else if (end_samp-start_samp > cache->end-cache->start) { /* Zoom out */ /* i: index to copy from in old cache. * j: index to copy to in new cache. */ i=0; j=0; while (1) { while (ixres && (!cache->calced[i] || cache->offsets[i+1]xres) break; while (cache->offsets[i]>new_offsets[j] && j %d\n",(int)i,(int)j); */ new_calced[j] = dirty_code; memcpy(new_values + j*2*channels, cache->values + 2*i*channels, 2*channels*sizeof(new_values[0])); j++; } } else { /* Zoom in */ /* i: index to copy from in old cache. * j: first index to copy to in new cache. * k: last index to copy to in new cache. */ i=0; j=0; while (1) { /* Set i to the next calculated value large enough in old cache */ while (ixres && (!cache->calced[i] || cache->offsets[i+1]xres) break; /* Setup j */ while (new_offsets[j] < cache->offsets[i] && joffsets[i+1] && k+1 %d-%d\n",(int)i,(int)j,(int)k); */ new_calced[j] = dirty_code; /* memset(new_calced+j, CALC_DIRTY, 1+k-j); */ memcpy(new_values + j*2*channels, cache->values + i*2*channels, 2*channels*sizeof(new_values[0])); j = k+1; i++; } } if (cache->handle == NULL) { memset(new_values,0,xres*channels*2*sizeof(*new_values)); memset(new_calced,CALC_DONE,xres); cache->chunk_error = TRUE; } /* Update cache vars */ cache->start = start_samp; cache->end = end_samp; cache->xres = xres; g_free(cache->values); cache->values = new_values; g_free(cache->offsets); cache->offsets = new_offsets; g_free(cache->calced); cache->calced = new_calced; if (low_updated != NULL) { *low_updated = 0; *high_updated = xres-1; } return TRUE; } /* Regular update */ if (chunk==NULL || cache->handle==NULL || cache->chunk_error) return FALSE; /* Special case - zoomed in very far */ if (real_spp < 1.0) { /* Due to rounding, the offsets array can differ from * start_samp/end_samp by 1 sample. */ k = cache->offsets[xres-1] - cache->offsets[0] + 1; m = k * channels * sizeof(sample_t); if (m > sbufsize) { g_free(sbuf); sbufsize = m; sbuf = g_malloc(m); } readflag = TRUE; m = chunk_read_array_fp(cache->handle, cache->offsets[0], k, sbuf, DITHER_NONE, NULL); readflag = FALSE; for (n=0; nvalues[(n*channels+l)*2] = cache->values[(n*channels+l)*2+1] = sbuf[(cache->offsets[n] - cache->offsets[0])*channels + l]; } } memset(cache->calced, CALC_DONE, xres); chunk_close(cache->handle); cache->handle = NULL; if (low_updated) { *low_updated = 0; *high_updated = xres-1; } return TRUE; } /* Scan for uncalculated data */ c = memchr(cache->calced, CALC_UNKNOWN, xres); if (c == NULL) c = memchr(cache->calced, CALC_DIRTY, xres); if (c == NULL) { impr=lowq_spp; c = memchr(cache->calced, CALC_LOWQ, xres); } if (c == NULL) { /* All cache entries are perfect, close handle. */ chunk_close(cache->handle); cache->handle = NULL; if (low_updated) *low_updated = *high_updated = 0; return TRUE; } i = c - cache->calced; /* Scan for end of uncalculated data */ j = i+1; if (impr == 0) while (jcalced[j] 0) { new_spp = lowq_spp; memset(cache->calced+i, CALC_LOWQ, j-i); } else { new_spp = highq_spp; memset(cache->calced+i, CALC_DONE, j-i); } if (low_updated) { *low_updated = i; *high_updated = j; } if (new_spp == 0 && impr == 0) { /* CONSECUTIVE MODE */ k = cache->offsets[j]-cache->offsets[i]; /* # of samples to read */ if (k < 1) k = 1; /* Read data */ m = k * channels * sizeof(sample_t); /* # of converted bytes */ if (m>sbufsize) { g_free(sbuf); sbufsize = m; sbuf = g_malloc(sbufsize); } readflag = TRUE; m=chunk_read_array_fp(cache->handle,cache->offsets[i],k,sbuf, DITHER_NONE, NULL); readflag = FALSE; g_assert(m==0 || m==k); if (m == 0) { /* Fill in all data as read so we don't get flooded with error * messages */ memset(cache->calced, CALC_DONE, xres); return TRUE; } /* Calculate max/min */ m = 0; /* Current full sample in sbuf */ n = i; /* Current pos in calced */ while (nvalues[(n*channels+l)*2] = 1.0; /* Min */ cache->values[(n*channels+l)*2+1] = -1.0; /* Max */ } /* Go through all necessary samples */ while (m+cache->offsets[i] < cache->offsets[n+1]) { for (l=0; lvalues[(n*channels+l)*2]) cache->values[(n*channels+l)*2] = x; if (x > cache->values[(n*channels+l)*2+1]) cache->values[(n*channels+l)*2+1] = x; } m++; } n++; } } else if (new_spp == 0) { /* Improvement to perfect */ for (; ioffsets[i+1]-cache->offsets[i]-impr; g_assert ( ((gint)k) >= 0 ); l = k * channels * sizeof(sample_t); if (sbufsize < l) { g_free(sbuf); sbufsize = l; sbuf = g_malloc(sbufsize); } readflag = TRUE; m = chunk_read_array_fp(cache->handle, cache->offsets[i]+impr, k, sbuf,DITHER_NONE,NULL); readflag = FALSE; if (m == 0) { memset(cache->calced, CALC_DONE, xres); return TRUE; } for (m=0; mvalues[(i*channels + m)*2]; h = cache->values[(i*channels + m)*2 + 1]; for (n=0; nh) h=f; } cache->values[(i*channels + m)*2] = g; cache->values[(i*channels + m)*2 + 1] = h; } } } else { /* REGULAR MODE */ while (ihandle, cache->offsets[i]+impr, new_spp-impr, sbuf, DITHER_NONE,NULL); readflag = FALSE; g_assert(l==new_spp-impr || l==0); if (l == 0) { memset(cache->calced, CALC_DONE, xres); return TRUE; } for (k=0; kvalues[(i*channels+k)*2]; h = cache->values[(i*channels+k)*2+1]; } for (l=0; lh) h=f; } cache->values[(i*channels+k)*2] = g; cache->values[(i*channels+k)*2+1] = h; } i++; } } return TRUE; } gboolean view_cache_uptodate(ViewCache *cache) { return (cache->handle == NULL); } void view_cache_draw(ViewCache *cache, GdkDrawable *d, gint yres, GtkWidget *wid, gfloat scale) { view_cache_draw_part(cache,d,0,cache->xres-1,yres,wid,scale); } void view_cache_draw_part(ViewCache *cache, GdkDrawable *d, gint xs, gint xe, gint yres, GtkWidget *wid, gfloat scale) { gint i,j,min,max,lmin=0,lmax=0,segc1=0,segc2=0,segc; gint *segcp; gboolean haslast; float mid,size,f,g; sample_t q,w; /* GdkGC *gc; */ gchar *c,*b; guint channels = (cache->chunk)?cache->chunk->format.channels:0; GdkSegment *seg1,*seg2,*seg; if (cache->calced == NULL) return; /* if (xs >= cache->chunk->length) return; if (xe >= cache->chunk->length) xe = cache->chunk->length-1; */ size = yres/(2*channels) - 5; seg1 = g_malloc(((channels+1)/2) * (1+xe-xs) * sizeof(GdkSegment)); if (channels > 1) seg2 = g_malloc((channels/2) * (1+xe-xs) * sizeof(GdkSegment)); else seg2 = NULL; for (j=0; jcalced[i] == 0) { c = memchr(cache->calced+i, 1, 1+xe-i); b = memchr(cache->calced+i, 2, 1+xe-i); if (c == NULL || (b != NULL && bcalced+i, 3, 1+xe-i); if (c == NULL || (b != NULL && bcalced; haslast = FALSE; } q = cache->values[(i*channels+j)*2] * scale; w = cache->values[(i*channels+j)*2+1] * scale; if (q < -1.0) q = -1.0; else if (q > 1.0) q = 1.0; if (w < -1.0) w = -1.0; else if (w > 1.0) w = 1.0; f = -q*size+mid; g = -w*size+mid; min = (gint) g; max = (gint) f; if (haslast) { if (min > lmax) min = lmax+1; else if (max < lmin) max = lmin-1; } /* gdk_draw_line(d,gc,i,max,i,min); */ seg[segc].x1 = seg[segc].x2 = i; seg[segc].y1 = max; seg[segc].y2 = min; segc++; lmin = min; lmax = max; haslast = TRUE; } *segcp = segc; } gdk_draw_segments(d,get_gc(WAVE1,wid),seg1,segc1); if (seg2 != NULL) gdk_draw_segments(d,get_gc(WAVE2,wid),seg2,segc2); g_free(seg1); g_free(seg2); } mhwaveedit-1.4.24/src/viewcache.h000066400000000000000000000037441334022513400166420ustar00rootroot00000000000000/* * Copyright (C) 2003 2004, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #ifndef VIEWCACHE_H_INCLUDED #define VIEWCACHE_H_INCLUDED #include "chunk.h" typedef struct { Chunk *chunk; ChunkHandle *handle; gboolean chunk_error; off_t start,end; gint xres; sample_t *values; off_t *offsets; gchar *calced; } ViewCache; ViewCache *view_cache_new(void); void view_cache_free(ViewCache *vc); /* Updates the cache. * chunk : The chunk we're viewing * start_samp,end_samp : The part of the chunk we're viewing * xres : Width of view in pixels * low_updated,high_updated : Set to left and right endpoint of * updated region. If nothing was updated, both are set to 0. The * pointers may be NULL. Not modified if function returns FALSE. * Returns TRUE if any work was done. */ gboolean view_cache_update(ViewCache *cache, Chunk *chunk, off_t start_samp, off_t end_samp, gint xres, gint *low_updated, gint *high_updated); gboolean view_cache_uptodate(ViewCache *cache); void view_cache_draw(ViewCache *cache, GdkDrawable *d, gint yres, GtkWidget *wid, gfloat scale); void view_cache_draw_part(ViewCache *cache, GdkDrawable *d, gint xs, gint xe, gint yres, GtkWidget *wid, gfloat scale); #endif mhwaveedit-1.4.24/src/volumedialog.c000066400000000000000000000104731334022513400173630ustar00rootroot00000000000000/* * Copyright (C) 2002 2003 2004, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include #include #include #include "mainwindow.h" #include "effectdialog.h" #include "effectbrowser.h" #include "volumedialog.h" #include "float_box.h" #include "gettext.h" static Chunk *volume_dialog_apply_proc(Chunk *chunk, StatusBar *bar, gpointer user_data) { VolumeDialog *v = VOLUME_DIALOG(user_data); return chunk_volume_ramp(chunk,v->start_percent->val / 100.0, v->end_percent->val / 100.0,dither_editing,bar); } static gboolean volume_dialog_apply(EffectDialog *ed) { sample_t sv,ev; VolumeDialog *v = VOLUME_DIALOG(ed); if (floatbox_check(v->start_percent) || floatbox_check(v->end_percent)) return TRUE; sv = v->start_percent->val / 100.0; ev = v->end_percent->val / 100.0; if (sv == ev && sv == 1.0) return FALSE; return document_apply_cb(EFFECT_BROWSER(ed->eb)->dl->selected, volume_dialog_apply_proc,TRUE,v); } static sample_t peak; static gboolean findtop_proc(void *sample, gint sample_size, Chunk *chunk) { sample_t d; d = fabs(* ((sample_t *)sample)); if (d>peak) peak = d; return (d>=1.0); } static void findtop(VolumeDialog *v) { gfloat f; Document *d = EFFECT_BROWSER(EFFECT_DIALOG(v)->eb)->dl->selected; peak = 0.0; if (d == NULL) return; document_parse(d,findtop_proc,FALSE,TRUE,_("Calculating peak volume...")); gdk_window_raise(GTK_WIDGET(EFFECT_DIALOG(v)->eb)->window); f = 100.0 * maximum_float_value(&(d->chunk->format)) / peak; if (f < 100.0) f = 100.0; floatbox_set(v->start_percent,f); floatbox_set(v->end_percent,f); } static void volume_dialog_init(VolumeDialog *v) { GtkWidget *a,*b,*c; a = gtk_hbox_new(FALSE,3); gtk_box_pack_start(GTK_BOX(EFFECT_DIALOG(v)->input_area),a,FALSE,FALSE,0); b = gtk_table_new(2,3,FALSE); gtk_box_pack_start(GTK_BOX(a),b,FALSE,FALSE,0); c = gtk_label_new (_("Start:")); gtk_label_set_justify(GTK_LABEL(c),GTK_JUSTIFY_RIGHT); gtk_table_attach(GTK_TABLE(b),c,0,1,0,1,0,0,0,0); c = gtk_label_new (_("End:")); gtk_label_set_justify(GTK_LABEL(c),GTK_JUSTIFY_RIGHT); gtk_table_attach(GTK_TABLE(b),c,0,1,1,2,0,0,0,0); c = floatbox_new(100.0); v->start_percent = FLOATBOX(c); gtk_table_attach(GTK_TABLE(b),c,1,2,0,1, GTK_EXPAND|GTK_SHRINK|GTK_FILL,0,3,0); gtk_widget_show(c); c = floatbox_new(100.0); v->end_percent = FLOATBOX(c); gtk_table_attach(GTK_TABLE(b), c, 1, 2, 1, 2, GTK_EXPAND|GTK_SHRINK|GTK_FILL,0,3,0); gtk_widget_show(c); c = gtk_label_new("%"); gtk_table_attach(GTK_TABLE(b),c,2,3,0,1,0,0,0,0); c = gtk_label_new("%"); gtk_table_attach(GTK_TABLE(b),c,2,3,1,2,0,0,0,0); b = gtk_alignment_new(0,1,0,0); gtk_box_pack_start(GTK_BOX(a),b,FALSE,FALSE,0); c = gtk_button_new_with_label(_("Find top volume")); gtk_signal_connect_object(GTK_OBJECT(c),"clicked", GTK_SIGNAL_FUNC(findtop),GTK_OBJECT(v)); gtk_container_add(GTK_CONTAINER(b),c); gtk_widget_show_all(a); } static void volume_dialog_class_init(EffectDialogClass *klass) { klass->apply = volume_dialog_apply; } GtkType volume_dialog_get_type(void) { static GtkType id = 0; if (!id) { GtkTypeInfo info = { "VolumeDialog", sizeof(VolumeDialog), sizeof(VolumeDialogClass), (GtkClassInitFunc) volume_dialog_class_init, (GtkObjectInitFunc) volume_dialog_init }; id = gtk_type_unique(effect_dialog_get_type(),&info); } return id; } mhwaveedit-1.4.24/src/volumedialog.h000066400000000000000000000027341334022513400173710ustar00rootroot00000000000000/* * Copyright (C) 2002 2003 2004, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #ifndef VOLUME_DIALOG_H_INCLUDED #define VOLUME_DIALOG_H_INCLUDED #include #include "mainwindow.h" #include "effectdialog.h" #include "float_box.h" #define VOLUME_DIALOG(obj) GTK_CHECK_CAST(obj,volume_dialog_get_type(),VolumeDialog) #define VOLUME_DIALOG_CLASS(klass) GTK_CHECK_CLASS_CAST(klass,volume_dialog_get_type(),VolumeDialogClass) #define IS_VOLUME_DIALOG(obj) GTK_CHECK_TYPE(obj,volume_dialog_get_type()) typedef struct _VolumeDialog { EffectDialog ed; Floatbox *start_percent, *end_percent; } VolumeDialog; typedef struct _VolumeDialogClass { EffectDialogClass ed_class; } VolumeDialogClass; GtkType volume_dialog_get_type(void); #endif mhwaveedit-1.4.24/src/vu_meter.c000066400000000000000000000101001334022513400165050ustar00rootroot00000000000000/* * Copyright (C) 2002 2003 2004, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include #include #include "main.h" #include "vu_meter.h" static void vu_meter_size_request(GtkWidget *widget, GtkRequisition *req) { req->width = 80; req->height = 60; } static void draw_meter_line(VuMeter *v, GdkGC *gc) { guint w,h; gfloat ang = (0.75-0.5*v->value)*3.1415; gfloat len; w = GTK_WIDGET(v)->allocation.width; h = GTK_WIDGET(v)->allocation.height; len = ((gfloat)h)*0.8; gdk_draw_line(GTK_WIDGET(v)->window,gc,w/2,h, w/2+(gint)(len*cos(ang)),h-(gint)(len*sin(ang))); } static void draw_black_arc(VuMeter *v) { GtkWidget *widget = GTK_WIDGET(v); gdk_draw_arc(widget->window,widget->style->black_gc,1, widget->allocation.width/2-15, widget->allocation.height-15,30,30,0,180*64); } static gint vu_meter_expose(GtkWidget *widget, GdkEventExpose *event) { VuMeter *vu = VU_METER(widget); guint w,h; gfloat len; w = widget->allocation.width; h = widget->allocation.height; len = ((gfloat)h)*0.8; gdk_draw_rectangle(widget->window,widget->style->black_gc,0,0,0,w,h); gdk_draw_rectangle(widget->window,widget->style->black_gc,0,1,1,w-2,h-2); gdk_draw_rectangle(widget->window,widget->style->black_gc,0,2,2,w-4,h-4); /* gdk_draw_rectangle(widget->window,widget->style->bg_gc[0],1,3,3,w-6,h-6); */ gdk_draw_arc(widget->window,widget->style->white_gc,1,w/2-len,h-len, len*2,len*2,45*64,90*64); draw_black_arc(vu); draw_meter_line(vu,widget->style->black_gc); return TRUE; } static void vu_meter_class_init(GtkWidgetClass *klass) { klass->size_request = vu_meter_size_request; klass->expose_event = vu_meter_expose; } static void vu_meter_init(VuMeter *v) { v->value = 0.0; v->goal = 0.0; } GtkType vu_meter_get_type(void) { static GtkType id = 0; if (!id) { GtkTypeInfo info = { "VuMeter", sizeof(VuMeter), sizeof(VuMeterClass), (GtkClassInitFunc) vu_meter_class_init, (GtkObjectInitFunc) vu_meter_init }; id = gtk_type_unique(gtk_drawing_area_get_type(),&info); } return id; } GtkWidget *vu_meter_new(gfloat value) { VuMeter *v; v = gtk_type_new(vu_meter_get_type()); v->value = value; v->goal = value; g_get_current_time(&(v->valuetime)); return GTK_WIDGET(v); } static void vu_meter_update_value_real(VuMeter *v, GTimeVal *tv) { GTimeVal diff; float f; timeval_subtract(&diff,tv,&(v->valuetime)); f = ((float)diff.tv_usec) / 1000000.0 + ((float)diff.tv_sec); v->value = v->value + (v->goal - v->value)*(1-exp(-f*10.0)); memcpy(&(v->valuetime),tv,sizeof(GTimeVal)); } static void undraw_value(VuMeter *v) { draw_meter_line(v,GTK_WIDGET(v)->style->white_gc); draw_black_arc(v); } static void draw_value(VuMeter *v) { draw_meter_line(v,GTK_WIDGET(v)->style->black_gc); } void vu_meter_update(VuMeter *v) { GTimeVal tv; undraw_value(v); g_get_current_time(&tv); vu_meter_update_value_real(v,&tv); draw_value(v); } void vu_meter_set_value(VuMeter *v, gfloat value) { GTimeVal tv; undraw_value(v); g_get_current_time(&tv); vu_meter_update_value_real(v,&tv); v->goal = value; if (value > v->value) v->value = value; draw_value(v); } mhwaveedit-1.4.24/src/vu_meter.h000066400000000000000000000027241334022513400165270ustar00rootroot00000000000000/* * Copyright (C) 2002 2003 2004, Magnus Hjorth * * This file is part of mhWaveEdit. * * mhWaveEdit 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. * * mhWaveEdit 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 mhWaveEdit; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #ifndef VU_METER_H_INCLUDED #define VU_METER_H_INCLUDED #include #define VU_METER(obj) GTK_CHECK_CAST(obj,vu_meter_get_type(),VuMeter) #define VU_METER_CLASS(klass) GTK_CHECK_CLASS_CAST(klass,vu_meter_get_type(),VuMeterClass) #define IS_VU_METER(obj) GTK_CHECK_TYPE(obj,vu_meter_get_type()) typedef struct { GtkDrawingArea da; gfloat value; /* Between 0 and 1 */ gfloat goal; GTimeVal valuetime; } VuMeter; typedef struct { GtkDrawingAreaClass dac; } VuMeterClass; GtkType vu_meter_get_type(void); GtkWidget *vu_meter_new(gfloat value); void vu_meter_set_value(VuMeter *v, gfloat value); void vu_meter_update(VuMeter *v); #endif mhwaveedit-1.4.24/src/vzoom.xbm000066400000000000000000000007161334022513400164110ustar00rootroot00000000000000#define vzoom_width 20 #define vzoom_height 20 static unsigned char vzoom_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x80, 0x0f, 0x00, 0xc0, 0x1f, 0x00, 0xe0, 0x3f, 0x00, 0x00, 0x07, 0x00, 0x00, 0x07, 0x00, 0x00, 0x07, 0x00, 0x00, 0x07, 0x00, 0x00, 0x07, 0x00, 0x00, 0x07, 0x00, 0x00, 0x07, 0x00, 0x00, 0x07, 0x00, 0xe0, 0x3f, 0x00, 0xc0, 0x1f, 0x00, 0x80, 0x0f, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00 };